2 arduino közötti kommunikáció

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Avatar
Ecku01
DrótVégénSzéndarab
Hozzászólások: 47
Csatlakozott: 2011. szeptember 12. hétfő, 6:00

2 arduino közötti kommunikáció

Hozzászólás Szerző: Ecku01 »

Sziasztok!

Egész számokat szeretnék küldeni/fogadni 2db Atmega328-as AVR-rel arduino-n belül. Hogyan lehetséges ez?
Talán a legegyszerűbb módja ennek az RX TX lábakon történő kommunikáció ( ez a RS232-es soros kommunikáció?), hogyan lehet kivitelezni ezt?
Egy egyszerű mintaprogramot tudnátok írni/ linkelni? ( pl 1-10 közötti számot küld az egyik avr a másiknak, és a másik avr pedig annyi másodpercre felkapcsol egy ledet)
A segítségeteket előre is köszönöm.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 2 arduino közötti kommunikáció

Hozzászólás Szerző: Robert »

Nyelv?
Arduino/Bascom:
- SPI, I2C, Serial, 1wire


soros:
1.: serial.print()
2.: serial.read()

1-1byte átvitele simán.
A recept: http://hzias2.blogspot.hu/2012/04/sult-galamb.html
Avatar
Ecku01
DrótVégénSzéndarab
Hozzászólások: 47
Csatlakozott: 2011. szeptember 12. hétfő, 6:00

Re: 2 arduino közötti kommunikáció

Hozzászólás Szerző: Ecku01 »

Arduino-t használok.
Akkor konkretizálom:

Kód: Egész kijelölése

//Küldő
int adat;

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

void loop() {
adat=5;

Serial.println(adat, BYTE);
delay(20000);
}




// Fogadó
int adat;

void setup() {
Serial.begin(9600);
pinMode (13, OUTPUT);
}

void loop() {

if (Serial.available()) {
adat = Serial.read();
digitalWrite(13, HIGH);
delay(adat*1000);
}
digitalWrite(13, LOW);
}
A küldő AVR TX lábát a Fogadó RX lábára, a küldő RX lábát a fogadó TX lábára kötöm.
Ez így működni fog?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 2 arduino közötti kommunikáció

Hozzászólás Szerző: Robert »

Igen, működik.


Fontos! SW frissítéskor legyen az összeköttetés lehúzva...
Avatar
Ecku01
DrótVégénSzéndarab
Hozzászólások: 47
Csatlakozott: 2011. szeptember 12. hétfő, 6:00

Re: 2 arduino közötti kommunikáció

Hozzászólás Szerző: Ecku01 »

Nem működik teljesen jól.

A küldő elküldi az adat=5-öt
A fogadó amikor megkapja felkapcsolja a ledet, de ez után már nem kapcsolja le.
mi lehet a gond?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 2 arduino közötti kommunikáció

Hozzászólás Szerző: Robert »

Kód: Egész kijelölése

if (Serial.available()) {
adat = Serial.read();
digitalWrite(13, HIGH);
delay(adat*1000);
}
digitalWrite(13, LOW);
}
az 5 bekapcsolja, és az idő letelése után ki.
nem külön kód kell a lekapcsolásra?

Mondjuk a 60 nap alatt Arduino tanfolyam 6. leckéje :)
http://www.tavir.hu/60nap

Kód: Egész kijelölése

/*
  SerialLED
  Soros porton kapcsolgathato LED
  60 nap alatt arduino tanfolyam
  (c) TavIR http://www.tavir.hu
 */ 

int inByte = 0;                   // bejovo adat
int adatjott =0;                  //eddig hany adatot kaptam?
char be ='B';                     // Valtozo definilasa Bekapcsolashoz
char ki ='K';                     // Valtozo definialasa Kikapcsolashoz


void setup()
{
  Serial.begin(9600);             // start serial port 9600 bps
  pinMode(13, OUTPUT);            //A 13-as lab kimenet mert gyarilag ezen van LED 
  Serial.println("Start...");
  
}

void loop()
{
  if (Serial.available() > 0) {   // var adat feldolgozasra?
    inByte = Serial.read();       // 1 byte beolvasasa
    delay(100);                   // 100 ms szunet
    adatjott++;                   // szamlalo novelese
    if (inByte == be) {
      digitalWrite(13, HIGH);     // Ha B jon, bekapcsol
    }
    if (inByte == ki) {
      digitalWrite(13, LOW);      // Ha K jon, kikapcsol
    }
    
    Serial.print("Eddig jott: "); // Soroson visszairjuk mi is volt
    Serial.println(adatjott, DEC);
  }
}
Avatar
Ecku01
DrótVégénSzéndarab
Hozzászólások: 47
Csatlakozott: 2011. szeptember 12. hétfő, 6:00

Re: 2 arduino közötti kommunikáció

Hozzászólás Szerző: Ecku01 »

Rájöttem mi a gond...

A fogadónál így néz ki a lefutó program:

void loop() {

if (Serial.available()) {
adat = Serial.read();
digitalWrite(13, HIGH);
delay(adat*1000);
}
digitalWrite(13, LOW);
}

és ha átírtam a delay-t 100-ra akkor világít 4másodpercig majd elaszik és ez megy a végtelenségig.
Ez miért van? a küldőnél viszont a 20másodperc az tényleg 20 másodperc (delay(20000);)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 2 arduino közötti kommunikáció

Hozzászólás Szerző: Robert »

a, Nem jó a programlogikád
b, a tx/rx kommunikációba az USB illesztőd is bezavarkat....
Avatar
csabeszq
Bitfaragó
Hozzászólások: 678
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: 2 arduino közötti kommunikáció

Hozzászólás Szerző: csabeszq »

Lehet szoftveres soros kommunikációt is csinálni, de nem javaslom. Legalábbis 2400 baud fölé nem mennék vele.

A C64 1MHz-n szoftverből csinálta a legmagasabb interrupttal (NMI), ami képes volt az interruptot is megszakítani. Ott volt ez a határ.

Az I2C-t javaslom, ha 2m-en belül van minden egység.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 2 arduino közötti kommunikáció

Hozzászólás Szerző: Robert »

HW-es itt a sorosport!
Az simán megy magasabbon is....
Avatar
csabeszq
Bitfaragó
Hozzászólások: 678
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: 2 arduino közötti kommunikáció

Hozzászólás Szerző: csabeszq »

Róbert, az a számítógépes kommunikáció (feltéve, hogy használja).

Persze ugyanazt a vonalat több RS232-es egység is használhatja, de ez már messze nem triviális.

Mindig egynek lesz joga adni, azt valamilyen algoritmus szerint ki kell választani, a többi a TX lábát bemenetre rakja.

Hogyan lehet az Arduino USB kapcsolatot harmadik állapotba rakni?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 2 arduino közötti kommunikáció

Hozzászólás Szerző: Robert »

I2c:
wire.begin() - master
wire.begin(12) - slave
Avatar
csabeszq
Bitfaragó
Hozzászólások: 678
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: 2 arduino közötti kommunikáció

Hozzászólás Szerző: csabeszq »

Róbert, ahogy nézem a kapcsolási rajzaid, az RX és a TX elé beraksz egy-egy ellenállást: Uno 650R, Duemilanove 1k.

Ezzel választódik le az USB chip, tehát ha egy másik Arduino RS232-n adni kezd, akkor az AVR megkapja, a különbség pedig az FTDI előtti ellenálláson elfüstölődik.

Így lehet elvileg egyszerre USB-vel és egy másik Arduinoval is dumálni ugyanazon a vonalon, a lényeg, hogy a másik Arduino miután befejezte, tegye át a TX-et bemenetre.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 2 arduino közötti kommunikáció

Hozzászólás Szerző: Robert »

Igen, stimmel. Csak nem tudom, hogy az összekötésnél:
- leválasztó-ellenállás volt-e neki,
- hosszú kábel és pl. a GND sincs összekötve :)

A mintából valami zavarjelre tippelek, hogy állandóan az esik be neki... Ezért tippeltem az USBre. Sőt, lehet hogy valami clone ahol pl. ez kimaradt (pl. egyes soros változatok, vagy egyes esetekben nem 680R...1K van az USB után, hanem 68...270 ohm). Vagy egy LED a kommunikációhoz (sorosporti panelek egy része)...

De majd csak látunk megoldást :) .
Grega
Újonc
Újonc
Hozzászólások: 14
Csatlakozott: 2013. március 19. kedd, 17:11

Re: 2 arduino közötti kommunikáció

Hozzászólás Szerző: Grega »

Sziasztok!

Ebben a témában szeretnék kérdezni, mert elakadtam:

Van egy Arduino nano pro-m ami egy drotek ms5611 barométer szenzorhoz és egy rctimer 3dr radio - hoz kapcsolódik. Nagyon egyszerű feladatot szeretnék első körben megoldani:

szeretném hogy a barométer szenzor által adott adatok a fogadó oldalon a rádió termináljában megjelenjenek. Később majd a fogadó oldalra is veszek arduinó-t, jelenleg a rádió fogadó egysége egy usb elosztóba csatlakozik.
íme a rádió: http://www.rctimer.com/index.php?gOo=go ... oductname=

Amit eddig sikerült megoldanom:

Ha az arduinót usb-n csatlakoztatom, akkor a COM3 portra csatlakozik 115200bps-en és:
1. A szenzor serial.write és serial.writeln utasításokkal szuper prímán kiírja az adatokat a COM3 soros monitoron.

2. A rádió földi egysége usb-n a COM4-re csatlakozik, látja az arduinó-hoz kapcsolt társát, a tesztprogramjával kiírja a kapcsolódási adatokat stb. A rádiót a tesztprogrammal sikerült beállítanom 115200bps-re. (mindkét oldalon)

3. A Serial Event példaprogramot az arduinóba feltöltve a COM3 soros monitorban felül kézzel bevitt szöveg olvashatóan megjelenik a számítógéphez kapcsolt rádió terminálján. Tehát a link él és virul, adatok átmennek. Az idézett példaprogramban kézi bevitel után egy serial.println küldi ki az adatot át a másik rádiónak

De!

Amint feltöltöm a szenzorhoz való programot, akkor annak a serial.write és serial.writeln utasításai továbbra is csak a számítógép soros monitorjába mennek ki, és nem mennek át a másik rádió termináljába (a rádión nem is villog a küldés led).
Itt jön a svédcsavar: Ha kézzel beírok valamit a soros monitor tetejére miközben az adatok pörögnek a soros monitorban, a kézzel beírt adat átmegy a rádió termináljába.

Kérdés: miért megy át a soros monitoron kézzel megadott adat, és miért nem megy át az ugyanabban a monitorban pörgő adatsor?
Ha valamit kézzel megadok a monitorban felül, akkor nem ugyanaz a serial.write illetve serial.writeln vonatkozik mindkét esetre?

Szerintem valami nagyon egyszerű dolgot nézhetek be :)

Próbáltam az egészet usb csatlakozás nélkül is, de a kimenet akkor sem megy ki az RX TX lábakon.

Mit hagytam ki?

Maga a program ebből a szempontból egy egyszerű ciklus ami a szenzorból olvas és a soros portra ír.

Kód: Egész kijelölése




void setup() {
  Wire.begin();
  Serial.begin(115200);
  pinMode(ledPin, OUTPUT);    
  delay(1000);

  ... innen kivettem a barométer inicializálását

}


void loop() {

  digitalWrite(ledPin, HIGH);
  Serial.print(" temp: ");
  float temperature = baro.getTemperature(MS561101BA_OSR_4096);
  if(temperature) {
    temp = round(temperature);
  }
  Serial.print(temp);
  Serial.print(" degC pres: ");
  press = baro.getPressure(MS561101BA_OSR_4096);
  if(press!=NULL) {
    pushAvg(press);
  }
  press = getAvg(movavg_buff, MOVAVG_SIZE);
  Serial.print(press);
  Serial.print(" mbar altitude: ");
  altitude=getAltitude(press, temp);
  Serial.print(altitude);
  Serial.println(" m");
  digitalWrite(ledPin,LOW );
  
} //loop

Válasz küldése