SoftwareSerial a IR či BT

Ming
Příspěvky: 6
Registrován: 17 čer 2020, 19:44
Reputation: 0

SoftwareSerial a IR či BT

Příspěvek od Ming » 20 čer 2020, 20:03

Zdravím

Jsem naivní začátečník :D . Řeším jednosměrnou komunikaci do 20cm mezi dvěma Arduino Nano, v poli (byte msg[3]) chci přenášet nějaké svoje hodnoty (mezi RC kamionem a návěsy).

Kód: Vybrat vše

//Vysílač
#include <SoftwareSerial.h>
const byte alphaPin = 10;
const byte betaPin = 11;

SoftwareSerial sender(3,2);
byte msg[3];

void setup() {
sender.begin(9600);
}

void loop() {
  msg[0] =....;//hodnoty vyčtu třeba z RC příjmače
   msg[1] = map(pulseIn(alphaPin, HIGH), 990, 1990, 5, 250);
  msg[2]  = map(pulseIn(betaPin, HIGH), 990, 1990, 5, 250);
  sender.write(msg,3); /a posílám
 delay(2000); 
}

//příjmač
#include <SoftwareSerial.h>
SoftwareSerial rcv(2,3);
byte msg[3];

void setup() {
rcv.begin(9600);
}

void loop() {
    if(rcv.available() > 0){
    msg[0] = rcv.read(); 
    msg[1] = rcv.read();
    msg[2] = rcv.read();//vyčtu a dále zpracuji
  }
 delay(200); 
}
Po drátu mi to chodí dle představ. Ale jak pravil Jára Cimrman "zkuste to bez drátů", koupil jsem https://www.laskarduino.cz/ir-infracerv ... khz-modul/ a https://www.laskarduino.cz/robotdyn-ir- ... -ovladani/ (obojí má u sebe v popisu psáno 38kHz) v možná naivní přestavě, že Tx a Rx zapojím a ono to nějak bude chodit. Ale ouha. Ani nepoznám jestli vysílač nevysílá, příjmač nepříjmá či oboje. Je tohle cesta (možná se musí více laborovat s baudrate u serial, zkoušel jsem 4800, 2400 i 1200, větší ne), nebo na to jdu špatně? U IRremote knihovny jsem se "zacyklil" u sendRaw, kde nevím jak mu vnutit svoje vlastní byte hodnoty.
Nebo bude řešením se znovu plácnout přes kapsu a koupit BT? Přijde mi, že IR na tohle stačí.

Díky za nakopnutí

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: SoftwareSerial a IR či BT

Příspěvek od AstroMiK » 21 čer 2020, 07:53

Myslím, že ten vysílač je jen obyčejná infraLED, takže nestačí, aby se přepínala pomocí logické "0" a "1", které lezou ze sérového portu.
Při logické "1" je nutné tu LED ještě modulovat frekvencí 38kHz.

Nějak takhle:
infra.gif

Existují i vysílací moduly, které už v sobě mají ten 38kHz generátor (NE555). Například tady:
https://www.ebay.com/itm/143033571774



Přijímač se používá spíš pro zachytávání signálů z běžného dálkového ovladače (například od televize).

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: SoftwareSerial a IR či BT

Příspěvek od AstroMiK » 21 čer 2020, 09:09

Zkusil jsem napsat jednoduchý program pro vysilání a přijímání několika bajtů přes infra.

Je to jen takový nástřel, ale zdá se, že funguje.
Pro ostré použití by asi bylo dobré dodělat ještě nějaké kontroly přenosu (alespoň kontroní paritní bit)

Vysílač:

Kód: Vybrat vše


#define pinVysilac   5


void setup(void)
  {
    pinMode(pinVysilac,OUTPUT);
  }

void loop(void)
  {
    posli(3);                                              // odeslani jednoho cisla
    posli(50);                                             // odeslani jednoho cisla
    posli(200);                                            // odeslani jednoho cisla
    posli(255);                                            // odeslani jednoho cisla

    delay(1000);                                           // sekundova pauza pred opakovanim bloku cisel
  }


//------------------------------------------------------------------
//  odeslani jednoho bajtu
//     na zacatku je 20ms dlouhy signal (38kHz), ktery prijimaci rika, ze se budou odesilat data
//     pak to pokracuje 20ms dlouhou pauzou, kdy by se mel prijimac synchronizovat na prijem prvniho bitu
//     nasleduje 8 bitu signalu, nebo mezer - kazdy bit je dlouhy 10ms (zacina se od MSB a konci se v LSB)

void posli(byte cislo)
  {

    for (int  c = 0; c < 760 ; c++)                        // "leader" (20 ms generovani signalu)
      {                                                    // pocet 38kHz period = 20ms / 26us = 760 period (zhruba)
        digitalWrite(pinVysilac,HIGH);
        delayMicroseconds(11);
        digitalWrite(pinVysilac,LOW);
        delayMicroseconds(11);
      }
      
    delay(20);                                             // 20 ms pauza pred vysilanim dat
  
    for (byte i = 8; i > 0 ; i--)
      {
        if (bitRead(cislo,i-1) == LOW)                     // nulovy bit ma delku 10ms a LED je po tu dobu zhasnuta
          {
            digitalWrite(pinVysilac,LOW);
            delay(10);
          }
        else                                               // jednickovy bit ma delku take 10ms a LED blika frekvenci asi 38kHz
          {
            for (int  c = 0; c < 380 ; c++)                // pocet 38kHz period = 10ms / 26us = 380 period (zhruba, nejake zpozdeni ma samotna smycka)
              {                                            // 38kHz = perioda 26us
                digitalWrite(pinVysilac,HIGH);
                delayMicroseconds(11);
                digitalWrite(pinVysilac,LOW);
                delayMicroseconds(11);
              }
          }
      }
    delay(50);                                             // kratka pauza po vyslani kazdeho bajtu
  }



Přijímač:

Kód: Vybrat vše

#define pinPrijimac   5    // pin pro prijimac

byte prijato;              // sem se uklada prijaty bajt 


void setup(void)
  {
    pinMode(pinPrijimac,INPUT_PULLUP);
    Serial.begin(9600);
  }



void loop(void)
  {
    if (digitalRead(pinPrijimac) == LOW)              // objevil se leader (20ms)
      {
        while (digitalRead(pinPrijimac) == LOW)       // ceka se, nez se leader ukonci
          {}
          
        delay(25);                                    // 20ms ma vysilac pauzu mezi leaderem a zacatkem vysilani, takze po 25ms by mel byt bezpecne synchronizovany prvni bit
        prijato = 0;
        for (byte i = 8; i > 0 ; i--)
          {
            if (digitalRead(pinPrijimac) == LOW)  bitSet(prijato , i-1); 
            delay(10);                                                  // kazdy bit se vysila s periodou 10ms, proto ma i prijem sejne pauzy mezi bity
          }
        Serial.println(prijato);
      }

  
  }



Ukázkové video:
https://youtu.be/dk8Vrl72NcY

Ming
Příspěvky: 6
Registrován: 17 čer 2020, 19:44
Reputation: 0

Re: SoftwareSerial a IR či BT

Příspěvek od Ming » 21 čer 2020, 10:13

Děkuji za nakopnutí. Teď už chápu, že IR LEDka musí ve stavu log1 "pomrkávat" těmi 38 kHz. Jdu se s tím prát dál (nechci to sprostě opsat) :D

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: SoftwareSerial a IR či BT

Příspěvek od pavel1tu » 21 čer 2020, 14:22

Nevím proč IR, které může být ovlivňováno denním světlem, musí být relativně dobře namířeno na přijímač - vůbec ty moduly z číny.

Co nFR24 ? Asi nejjednodušší co jsem jako ne zrovna dobrý programátor potkal.
To samé BT, je to stejně jednoduché.
Jebo i moduly na 433MHz nebo 868MHz ale pozor, jen ty s FM modulací, ty s AM stojí zaprd.

Na výběr je toho hodně ;)
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: SoftwareSerial a IR či BT

Příspěvek od pavel1tu » 21 čer 2020, 17:54

Našel jsem tento odkaz, je tam příklad jak s klasickou IR LED a modulací tak bez modulace
https://www.electronicwings.com/arduino ... rduino-uno
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: SoftwareSerial a IR či BT

Příspěvek od AstroMiK » 21 čer 2020, 18:46

pavel1tu píše:
21 čer 2020, 14:22
Nevím proč IR, které může být ovlivňováno denním světlem, musí být relativně dobře namířeno na přijímač - vůbec ty moduly z číny.
S tím bych nesouhlasil.

Právě těch 38kHz dělá infra komunikaci hodně odolnou proti rušení.
Jednorázové osvícení přijímač nedokáže aktivovat.
A k té nutnosti přesného zamíření - běžně ovládám televizi odrazem přes strop.


Jinak s tou funkcí tone() a tranzistorem, který je spínaný přes sériovou linku - to je moc chytrý a jednoduchý řešení. To mě vůbec nenapadlo.

Ming
Příspěvky: 6
Registrován: 17 čer 2020, 19:44
Reputation: 0

Re: SoftwareSerial a IR či BT

Příspěvek od Ming » 21 čer 2020, 20:12

Děkuji za odpovědi pánové.
Celé dopoledne jsem se s tím drbal, i mi to chvíli chodilo jak chci, ale jak jsem začal do masteru i do slave přidávat další funkcionalitu a různě jsem to zapínal a vypínal, začalo se mi rozcházet časování. Vysílač asi pořád vysílal co potřebuji, ale příjmač "hlásil" nesmysly (velká chybovost). Nakonec jsem vyměkl a objednal Bluetooth moduly a poženu to přes zmiňované SoftwareSerial. Tam si slibuji, že to bude OK (ale možná se tu pak ještě ukážu). :D
Každopádně děkuji za nápady, třeba to někomu dalšímu pomůže.

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: SoftwareSerial a IR či BT

Příspěvek od pavel1tu » 21 čer 2020, 20:23

AstroMiK píše:
21 čer 2020, 18:46
S tím bych nesouhlasil.

Právě těch 38kHz dělá infra komunikaci hodně odolnou proti rušení.
Jednorázové osvícení přijímač nedokáže aktivovat.
A k té nutnosti přesného zamíření - běžně ovládám televizi odrazem přes strop.


Jinak s tou funkcí tone() a tranzistorem, který je spínaný přes sériovou linku - to je moc chytrý a jednoduchý řešení. To mě vůbec nenapadlo.
Já tam tu modulaci nepostřehl a ani mne to nenapadlo, na jakou vzdálenost to může fungovat ?
Možná by to bylo na meteostanici na zahradě také řešení, ale ta nRF24 je zatím TOP co jsem vyzkoušel.

No a ten článek jsem měl uložený už několik let, jen mne nenapadalo žádné využití. Jen to nechce dávat na RX/TX co je v článku ale na piny od SoftwareSerial
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: SoftwareSerial a IR či BT

Příspěvek od ondraN » 21 čer 2020, 22:01

Vzdálenost záleží na čidlu a diodě. Snímače mají cca 20-40m. Ale pro bateriové aplikace nic moc, protože ta LED se krmí dost brutálním proudem (400mA). Dá se to trochu vyspravit s diodou s úzkým rozptylem (dělá se i 5stupňů) a pak ti stačí proud okolo 100mA. Ale je to citlivé na nasměrování a třeba sklo to dost rozhodí.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 19 hostů