2 arduino közötti kommunikáció
2 arduino közötti kommunikáció
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.
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.
Re: 2 arduino közötti kommunikáció
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
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
Re: 2 arduino közötti kommunikáció
Arduino-t használok.
Akkor konkretizálom:
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?
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);
}
Ez így működni fog?
Re: 2 arduino közötti kommunikáció
Igen, működik.
Fontos! SW frissítéskor legyen az összeköttetés lehúzva...
Fontos! SW frissítéskor legyen az összeköttetés lehúzva...
Re: 2 arduino közötti kommunikáció
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?
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?
Re: 2 arduino közötti kommunikáció
Kód: Egész kijelölése
if (Serial.available()) {
adat = Serial.read();
digitalWrite(13, HIGH);
delay(adat*1000);
}
digitalWrite(13, LOW);
}
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);
}
}
Re: 2 arduino közötti kommunikáció
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);)
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);)
Re: 2 arduino közötti kommunikáció
a, Nem jó a programlogikád
b, a tx/rx kommunikációba az USB illesztőd is bezavarkat....
b, a tx/rx kommunikációba az USB illesztőd is bezavarkat....
Re: 2 arduino közötti kommunikáció
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.
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.
Re: 2 arduino közötti kommunikáció
HW-es itt a sorosport!
Az simán megy magasabbon is....
Az simán megy magasabbon is....
Re: 2 arduino közötti kommunikáció
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?
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?
Re: 2 arduino közötti kommunikáció
I2c:
wire.begin() - master
wire.begin(12) - slave
wire.begin() - master
wire.begin(12) - slave
Re: 2 arduino közötti kommunikáció
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.
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.
Re: 2 arduino közötti kommunikáció
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 .
- 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 .
Re: 2 arduino közötti kommunikáció
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.
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