Raspberry Pi Arduino Serial Communication-Everything You Need To Know
in this tutorial I ’ ll show you how to communication between a Raspberry Pi and an Arduino board via Serial communication.
ensin selitän nopeasti, mitä on Sarjaviestintä. Sitten näet miten setup laitteisto ja ohjelmisto, ja me sukeltaa Python koodi (CPP Arduino). Perusesimerkki aluksi, mikä täydellisempi sovellus käyttäen Vadelma Pi, Arduino, ja muut elektroniset laitteet.
tämä opetusohjelma toimii Raspberry Pi 4 (ja aiemmin: 3B, 3B+) – laudalla ja millä tahansa Arduino-laudalla. Käytän enimmäkseen Arduino Uno, mutta antaa lisätietoja eroja Arduino levyt, kun se tulee sarja viestintä.
elektronisten laitteiden kanssa työskenneltäessä viestintä on avainasemassa. Jokaisen laitteen – sen lisäksi, että se tekee hyvin sen, mitä sen pitäisi tehdä – on kyettävä selkeästi kommunikoimaan muiden laitteiden kanssa. Se on yksi tärkeimmistä asioista työskennellä, jotta voidaan siirtyä hyvin yksinkertainen sovellus monimutkaisempia.
Sisällysluettelo
mikä on Sarjaviestintä (UART: n kanssa)
Sarjaviestintä on yksinkertaisesti tapa siirtää tietoa. Tiedot lähetetään peräkkäin, bitti kerrallaan (1 tavu = 8 bittiä), toisin kuin rinnakkaisessa viestinnässä, jossa monta bittiä lähetetään samanaikaisesti.
UART-protokolla
tarkemmin sanottuna Arduino-ja Raspberry Pi-protokollia käytettäessä käytetään UART-protokollaa. UART tarkoittaa ”universaalia asynkronista vastaanottoa ja lähetystä”.
opetteletko Raspberry Pin käyttöä omien projektien rakentamisessa?
Tutustu Raspberry Piin aloittelijoille ja opi vaihe vaiheelta.
periaatteessa se on Sarjaliikenteeseen perustuva asynkroninen monimasteriprotokolla, jonka avulla voi kommunikoida 2 laudan välillä. Ole vakuuttunut, on olemassa kirjastoja, jotka käsittelevät kaikki matalat kerrokset puolestasi.
Multi-master tarkoittaa, että kaikki liitetyt laitteet voivat vapaasti lähettää dataa halutessaan. Tämä on yksi suurimmista eroista master-slaves-protokolliin, joissa vain master-laite voi aloittaa viestinnän. Yleensä käytät muita protokollia, kuten I2C: tä ja SPI: tä, kun tarvitset master-slaves-kokoonpanoja: esimerkiksi kun sinulla on yksi Arduino-lauta ja useita antureita tai toimilaitteita.
Arduino Uno-laudassa on yksi UART, jota voit käyttää joko USB-kaapelilla tai RX/TX-pinneillä (älä käytä molempia samanaikaisesti). Jotkut levyt ovat enemmän saatavilla UARTs. Esimerkiksi Arduino Mega on eri sarjoja (Serial, Serial1, Serial2, Serial3) ja Arduino Zero on native USB-portti vain (käytä SerialUSB sijaan Serial).
Raspberry Piin voi liittää useita Sarjalaitteita USB-portteihin. Jokaisella on eri laitteen nimi (Näemme, miten löytää ne myöhemmin tässä opetusohjelmassa). Voit myös käyttää GPIOs (RX0/TX0) ylimääräinen UART.
luultavasti osaat jo Sarjaviestinnän
olet varmasti käyttänyt Sarjaviestintää jo monta kertaa. Tiedät varmasti jo Arduinon Sarjakirjaston, jonka avulla voit kirjata mitä koodissasi tapahtuu ja saada käyttäjän syötettä. Kun käytät Sarjamonitoria, periaatteessa Arduino IDE käynnistää Sarjayhteyden Arduino-laitteeseesi. Voit vastaanottaa ja lähettää tietoja suoraan Sarjamonitorista.
mitä tässä tehdään, on lähes sama, paitsi että Arduino IDE: n sijaan Sarjaviestin toisella puolella on Raspberry Pi-levy. Meidän täytyy tehdä joitakin setup ja kirjoittaa joitakin koodia, jotta se toimii. Sitten sekä Vadelma Pi että Arduino voivat lähettää viestejä toisilleen.
katsotaan nyt, miten kaksi lautaa liitetään fyysisesti yhteen.
laitteistoasetukset Sarjaviestintään
on olemassa 2 tapaa liittää Raspberry Pi ja Arduino Sarjaviestintään.
sarja USB: n kautta
helpoin tapa on käyttää USB-kaapelia molempien levyjen välissä.
Raspberry Pi-puolella riittää yksinkertainen USB-liitin. Voit valita minkä tahansa 4 USB-porttia saatavilla aluksella.
Arduino, käytät USB-porttia, jota käytät koodin lataamiseen tietokoneelta (Arduino IDE: n kanssa) laudalle. Tässä USB-liitin riippuu siitä, mikä versio sinulla on. Levyt kuten Arduino Uno ja Mega, liitin on erilainen kuin Arduino Nano,ja Arduino Zero.
tässä esimerkissä olen käyttänyt Arduino Uno-taulua.
kuten näette, se on yksinkertaisin laitteisto yhteys voit tehdä välillä Vadelma Pi ja Arduino.
Huom.: sinun täytyy ensin liittää Arduino tietokoneeseen, jotta voit ladata koodin hallituksen. Sen jälkeen, liitä USB-kaapeli Vadelma Pi. Vadelma Pi valtaa Arduino tämän kaapelin kautta.
Serial via GPIOs
sarjaliitännän tekemiseen voi käyttää myös Raspberry Pi GPIOs-ja Arduino-nastojen välisiä tavallisia johtoja.
Arduino-laudasta riippuen saatat joutua käyttämään jännitetason vaihtajaa. Vadelma Pi toimii 3.3 V. Arduino levyt kuten Due, 101, se on hieno, koska ne käyttävät myös 3.3 V.
mutta monille Arduinoille, kuten Uno, Mega, Leonardo, Nano, ja monille muille, lauta toimii 5V: ssä. siksi tarvitset 3.3 V/5V-tason vaihtajan suojaamaan Raspberry Pi: tä, kun kytket Rx: n ja TX: n (lisätietoja Raspberry Pi: n pinneistä ja Arduino Uno: n pinneistä).
tämän opetusohjelman loppuosassa käytetään USB-kaapelilla varustettua asennusta. Tämä on helpompi hallita ja ellei sinulla ole hyvä syy ei liian, sinun pitäisi mieluummin käyttää USB-kaapeli sijasta tavallinen gpios Sarjaliikennettä.
Raspberry Pi Software setup
Arduinoon ei tarvita mitään erikoisasetuksia. Varmista vain, että olet ladannut ja asentanut Arduino IDE.
nyt Vadelmapiissä vaaditaan muutama asia, jotta kommunikaatio toimii.
Muodosta yhteys Raspberry Piin, joko ssh: n kautta tai liitännäisellä näyttö+hiiri+näppäimistö, ja avaa pääte. Jos et ole vielä asentanut käyttöjärjestelmää Pi: llesi, voit asentaa RASPBIANIN tai Ubuntun hyvin helposti SD-kortille.
tunnista Arduino-taulu
kun liität Arduinon USB-kaapelilla, sen tulee näkyä /dev/ttyACM0 tai /dev/ttyUSB0 (joskus numero voi olla eri, esimerkiksi /dev/ttyACM1).
yksinkertaisesti juokse ls /dev/tty*
ja sinun pitäisi nähdä se. Tässä vaiheessa jos et ole varma, mikä laite on Arduino-levy, irrota levy (poista USB-kaapeli) ja suorita ls /dev/tty*
uudelleen. Näin huomaat helposti Arduinon sarjalaitteen nimen.
Laitteistooikeudet sarjalle
voit myös lisätä käyttäjän dialout-ryhmään välttääksesi virheitä, kuten: serial.serialutil.Sarjataklaus: porttia / dev/ttyACM0 ei voitu avata: Lupa evätty: ”/dev/ttyACM0′
$ sudo adduser your_username dialout
tämä varmistaa, että sinulla on pääsy Sarjalaitteisiin (/dev/ttyACMx, /dev/ttyUSBx,…).
kun olet lisännyt itsesi dialout – ryhmään, sinun on käynnistettävä Pi (tai ainakin logout/login) uudelleen, jotta voit soveltaa muutosta-Lue lisää Raspberry Pi-laitteiston käyttöoikeuksista.
Install Python Serial library on Raspberry Pi
sinun täytyy asentaa kirjasto, jotta voit käyttää Sarjaliittymää Pythonin kanssa.
tähän opetusohjelmaan käytämme pyzerial Librarya (dokumentaatio Python 3: lle). Sen asentaminen:
python3 -m pip install pyserial
tämä Python-kirjasto on tunnettu ja sitä käytetään monissa sovelluksissa.
asennettaessa, jos saat virheen kuten ”/usr/bin/python3: no module named pip”, sinun täytyy asentaa pip ensin kanssa sudo apt install python3-pip
.
yksinkertainen Sarjaviestintä Arduinosta Raspberry Piin
aloitetaan hyvin yksinkertaisella ohjelmalla.
Arduino-koodi
lataa tämä koodi tietokoneeltasi Arduino-ohjelmaasi käyttäen Arduino-IDE: tä.
void setup() { Serial.begin(9600);}void loop() { Serial.println("Hello from Arduino!"); delay(1000);}
ensin alustetaan Sarjaviestintä ja valitaan baud-nopeus, tässä 9600. 9600 on yleisesti käytetty baud korko,ja myös melko alhainen. Tulevissa sovelluksissasi voit käyttää 57600: n tai jopa 115200: n baud-nopeutta ilman ongelmia. Tätä opetusohjelma jatkamme 9600.
joka sekunti saamme Arduinon lähettämään merkkijonon, jossa on sarja.println (). funktio println () lisää merkkijonon loppuun uuden rivimerkin ’\n’.
voit avata Sarjamonitorin nähdäksesi merkkijonon tietokoneessasi.
Raspberry Pi Python-koodi
#!/usr/bin/env python3import serialif __name__ == '__main__': ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1) ser.flush() while True: if ser.in_waiting > 0: line = ser.readline().decode('utf-8').rstrip() print(line)
niin, mitä tämä koodi tekee?
#!/usr/bin/env python3import serial
ensin tuomme aiemmin asentamamme sarjakirjaston.
if __name__ == '__main__': ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1)
Sarjaviestintä alustetaan kutsumalla sarjaksi.Serial () sekä muutamia parametreja:
- sarjalaite nimi Arduino: yleensä ”/dev/ttyACM0”, ”/dev / ttyUSB0 ” tai vastaava.
- Baud-arvo: tämä parametri on erittäin tärkeä. Sinun on käytettävä samaa baud-nopeutta kuin Arduinossa, tai muuten kaikki lukemasi ja kirjoittamasi on roskaa. Valitsemme 9600 kuten Arduino-sketsissä.
- aikalisä: tämä on lukuoperaatioiden aikalisä. Tässä asetamme sen 1 sekuntiin. Se tarkoittaa, että kun luemme Serialista, ohjelma ei jää jumiin ikuisiksi ajoiksi, jos dataa ei tule. 1 sekunnin tai lukemisen jälkeen, jos kaikkia tavuja ei saada, funktio palauttaa jo vastaanotetut tavut.
so, sarja.Serial () palauttaa objektin, jota voit käyttää kaikissa Sarjatoiminnoissasi. Tallennamme sen ser-muuttujaan.
ser.flush()
silloin käytetään flush () – funktiota. Tämä huuhtoo minkä tahansa Tulo-ja lähtöpuskurin, joten se välttää oudon/ei hyödyllisen/ei täydellisen tiedon vastaanottamisen viestinnän alussa.
while True: if ser.in_waiting > 0: line = ser.readline().decode('utf-8').rstrip() print(line)
äärettömässä silmukassa (ajattele Arduinon piirroksen loop () – funktiota) tarkistetaan, onko joitain tietoja saatavilla in_waiting-attribuutilla (älä laita sulkuja, tämä ei ole funktio). Jos kyllä, voimme lukea tiedot.
readline () – funktio lukee kaikki tavut, kunnes havaitaan Uusi rivimerkki.
jos vain painaisimme mitä saimme, näkisimme b ’ Hellon arduinosta!- kyllä. Saat tavuja, kun luet sarjoista, ja sinun täytyy muuntaa (purkaa) nämä tavut asianmukaiseksi tietotyypiksi. Niin, käytämme decode (’utf-8’) – Voit myös käyttää decode (’ascii’) – dekoodata vastaanotetut tiedot merkkijono.
lopuksi on strip () – funktio, jonka avulla voidaan poistaa kaikki perään merkityt merkit (newline, carriage return). Näin voimme poistaa ”\r ” ja ”\n ” ja saada oikea merkkijono.
Huom: tässä luetaan joka kerta kokonainen rivi. Jos haluat lukea tietyn määrän tavuja – yhden tai useamman – käytä read(size=1) – toimintoa.
Testing Serial communication
now, irrota Arduino-levysi tietokoneesta ja liitä se Raspberry Pi-levyysi.
Arduino-koodi on jo käynnissä, heti kun se on kytketty päälle.
Raspberry Pi: llä, tee Python-tiedosto suoritettavaksi ja käynnistä se.
$ chmod +x receive_serial_data_from_arduino.py$ ./receive_serial_data_from_arduino.py Hello from Arduino!Hello from Arduino!Hello from Arduino!
se toimii! Arduinon joka sekunti lähettämä merkkijono näkyy Raspberry Pi-päätteessä.
kaksisuuntainen Sarjaviestintä Raspberry Piin ja Arduinon välillä
tehdään asioista hieman mielenkiintoisempia. Olet nähnyt, miten lähettää tietoja Arduino Vadelma Pi. Tässä osassa näet, miten puhua Vadelma Pi Arduino. Näin sinulla on molemmat puolet viestinnän ja voit luoda ohjelmia, jotka odottavat toistensa panosta.
Arduino-koodi
void setup() { Serial.begin(9600);}void loop() { if (Serial.available() > 0) { String data = Serial.readStringUntil('\n'); Serial.print("You sent me: "); Serial.println(data); }}
tästä Tarkistamme, onko Arduino saanut tietoja sarjamuotoisesti.käytettävissä(). Tämä antaa sinulle jo saapuneiden ja vastaanotettuun puskuriin tallennettujen tavujen määrän.
jos tietoja on tullut, käytetään sarjamuotoista.readStringUntil (), jossa on uuden rivin merkki ”\n”, jotta saadaan seuraava rivi. Tämä muistuttaa readline () – funktiota. Kaikki ”\n ” asti vastaanotetut tavut muunnetaan ja lisätään automaattisesti Arduino-Merkkijonoobjektiin.
sitten vain tulostamme takaisin saamamme tiedot, lisäosan tekstillä.
Huomautus: Jos haluat lukea tavuja yksi kerrallaan, voit tehdä sen sarjalla.read () – funktio. Sitten sinun täytyy muuntaa tämä(ne) tavu (t) tarvittaessa: int, merkkijono, jne.
Raspberry Pi Python-koodi
#!/usr/bin/env python3import serialimport timeif __name__ == '__main__': ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1) ser.flush() while True: ser.write(b"Hello from Raspberry Pi!\n") line = ser.readline().decode('utf-8').rstrip() print(line) time.sleep(1)
käytä pyseriaalifunktion kirjoitusta() tietojen lähettämiseen Arduinolle. Täällä näet, että olen lisännyt ’ b ’ ennen merkkijono lähettää. Tämä koodaa merkkijonon tavuiksi, koska voit lähettää tavuja vain sarjojen kautta. Kaikki tiedot, jotka eivät ole tavuja tai tavuja, on muunnettava ennen lähettämistä. Jos vain yrittää lähettää merkkijono näin, saat tämän virheen ” TypeError: unicode merkkijonoja ei tueta, koodaa tavua: ’Hei Raspberry Pi!””
Huom: ser.write(b"Hello from Raspberry Pi!\n")
sijasta olisi voinut kirjoittaa ser.write("Hello from Raspberry Pi!\n".encode('utf-8'))
tai ser.write("Hello from Raspberry Pi!\n".encode('ascii'))
. Tämä tekee samoin. Koodaus () – funktio ottaa merkkijonon ja koodaa sen sarjamuotoiseksi.
lisätään myös uusi rivimerkki ”\n”, koska siihen Arduinon odotetaan päättävän lukunsa Sarjallisuudella.readStringUntil (”\n”).
sitten teemme saman kuin ennenkin: luemme rivin, puramme sen merkkijonoksi ja poistamme perään merkityt merkit. Emme käytä ser: ää.in_waiting täällä, koska tämä erityinen sovellus tiedämme, että Arduino lähettää takaisin joitakin tietoja heti, kun se on saanut merkkijono. Myös, meillä on 1 sekunnin aikalisä välttää juuttuminen tällä linjalla.
lopuksi tulostetaan vastaanotettu merkkijono ja odotellaan 1 sekunti ajan kanssa.sleep () ennen seuraavan merkkijonon lähettämistä sarjan päälle.
testaa kaksisuuntaista Sarjaviestintää
Raspberry Pi: llä, tee Python-tiedosto suoritettavaksi ja käynnistä se.
$ chmod +x bidirectional_serial_communication.py $ ./bidirectional_serial_communication.py You sent me: Hello from Raspberry Pi!You sent me: Hello from Raspberry Pi!You sent me: Hello from Raspberry Pi!
onnistui! Arduino sai merkkijonon ja lähetti sen takaisin muutamalla sanalla. Sitten Vadelma Pi sai ja painoi lopullinen merkkijono.
Raspberry Pi Arduino Serial communication: Application example
Now that you know how to setup your Arduino and Raspberry Pi for Serial communication, and write programs to talk between each board, let ’ s create a more complex application.
tässä sovelluksessa 4 LEDiä ja yksi painike liitetään Arduino-tauluun.
Raspberry Pi ja Arduino liitetään USB-kaapelilla ja käyttävät Sarjaviestintää puhuakseen keskenään.
tässä tulos, jonka haluamme saada:
- kun painiketta painetaan, Arduino lähettää ilmoituksen Raspberry Pi: lle (yksinkertainen tavu).
- Raspipi laskee tällöin satunnaisen kokonaisluvun väliltä 1-4 ja lähettää sen Arduinolle.
- Arduino kytkee virran tähän numeroon liittyvään LEDiin ja sammuttaa muut LEDit.
tämä saa harjoittelemaan Arduinon ja Raspberry Pi: n välisen tehtävien kommunikointia ja synkronointia.
jos saavuit tässä vaiheessa tutorial (congrats!) Kehotan sinua yrittää kirjoittaa koodin itse ennen kuin luet koodin olen antanut alla. Myös, ei ole vain yksi mahdollinen koodi täyttää nämä vaatimukset, joten koodi voi olla erilainen kuin minun, se on täysin OK. Voit saada apua Arduino Serial reference ja pySerial API reference.
kaaviot
jotta tämä piiri:
- Yhdistä 4 lediä pinneihin 9-12. Lisää 220 ohmin vastus kunkin LED välillä pidempi jalka ja digitaalinen tappi. Lyhyempi jalka on yhteydessä maahan.
- Lisää painike, jossa on maahan kytketty 10kohmin vastus (vetovastus). Toinen puoli painiketta on kytketty 5V, toinen digitaalinen pin 5 lukemista varten.
- älä unohda yhdistää kaikkia komponentteja: Arduino-lauta, 4 LEDiä ja painike. Älä lisää virtalähdettä, jos et ole edes kytkenyt kenttää oikein.
- Liitä Arduino ja Raspberry Pi USB-kaapelilla Sarjaliikennettä varten (USB-kaapeli hallitsee jo maadoitusliitäntää 2-levyjen välillä).
Arduino-koodi
#define LED_1_PIN 9#define LED_2_PIN 10#define LED_3_PIN 11#define LED_4_PIN 12#define BUTTON_PIN 5byte lastButtonState = LOW;byte currentButtonState = LOW;unsigned long lastButtonDebounceTime = 0;unsigned long buttonDebounceDelay = 20;void powerOffAllLEDs(){ digitalWrite(LED_1_PIN, LOW); digitalWrite(LED_2_PIN, LOW); digitalWrite(LED_3_PIN, LOW); digitalWrite(LED_4_PIN, LOW);}void setup(){ Serial.begin(9600); pinMode(LED_1_PIN, OUTPUT); pinMode(LED_2_PIN, OUTPUT); pinMode(LED_3_PIN, OUTPUT); pinMode(LED_4_PIN, OUTPUT); pinMode(BUTTON_PIN, INPUT); powerOffAllLEDs();}void loop(){ byte readValue = digitalRead(BUTTON_PIN); if (readValue != lastButtonState) { lastButtonDebounceTime = millis(); } if (millis() - lastButtonDebounceTime > buttonDebounceDelay) { if (readValue != currentButtonState) { currentButtonState = readValue; if (currentButtonState == HIGH) { Serial.write(18); } } } lastButtonState = readValue; if (Serial.available() > 0) { int ledNumber = Serial.read() - '0'; powerOffAllLEDs(); switch (ledNumber) { case 1: digitalWrite(LED_1_PIN, HIGH); break; case 2: digitalWrite(LED_2_PIN, HIGH); break; case 3: digitalWrite(LED_3_PIN, HIGH); break; case 4: digitalWrite(LED_4_PIN, HIGH); break; default: // wrong pin number, do nothing // all LEDs will be powered off break; } }}
asetukset () – funktiossa alustamme pin-tilat kaikille 4 ledille ja painikkeelle. Varmistamme myös, että kaikki LEDit on kytketty pois päältä.
sitten silmukassa() tehdään 2 asiaa: käsitellään painonappia ja hallitaan 4 lediä. Molemmat teot tehdään yksi kerrallaan, mutta ne hoidetaan hyvin nopeasti, joten on aivan kuin ne tapahtuisivat samaan aikaan. Siinä on kyse Arduino-ohjelman moniajamisesta.
ensimmäinen toimenpide: painonupin käsittely.
byte readValue = digitalRead(BUTTON_PIN);if (readValue != lastButtonState) { lastButtonDebounceTime = millis();}if (millis() - lastButtonDebounceTime > buttonDebounceDelay) { if (readValue != currentButtonState) { currentButtonState = readValue; if (currentButtonState == HIGH) { Serial.write(18); } }}lastButtonState = readValue;
meidän täytyy poistaa painike, jotta Vältämme ei-toivottuja arvoja. Kun saamme selville, että painiketta painetaan, voimme lähettää joitakin tietoja Vadelma Pi kautta Serial.
Tässä olen käyttänyt sarjanumeroa.write () – funktio: se lähettää tavun tai sarjan tavuja. Tämä on eri asia kuin sarjamuotoinen.tulosta (), jolloin tuloste on mukava nähdä Sarjamonitorilla. Koska puhumme toiselle koneelle emmekä ihmiselle, se ei ole ongelma.
lähettämämme Numero on 18. Tämä on vain satunnainen numero, että me liittää valtion ”painiketta on painettu”, joten kun Vadelma Pi saa numeron, se tarkistaa, jos se on yhtä kuin 18. Voisit kuvitella lähettäväsi erilaisia toimintoja tai viestejä sarjamuotoisesti käyttäen eri numeroita.
huomaa: yleensä voit myös käyttää Arduino-keskeytyksiä, jotta tiedät, milloin nappia on painettu. Jos teet niin, älä käytä Sarjakirjastoa keskeytyksessä. Jos sinun on ehdottomasti käytettävä keskeytyksiä, aseta keskeytyksen sisään lippu (yksinkertainen boolean-muuttuja) ja käytä sarjamuuttujaa loop () – toiminnon sisällä.
ja toinen toiminto: 4 ledin hallinta.
if (Serial.available() > 0) { int ledNumber = Serial.read() - '0'; powerOffAllLEDs(); switch (ledNumber) { case 1: digitalWrite(LED_1_PIN, HIGH); break; case 2: digitalWrite(LED_2_PIN, HIGH); break; case 3: digitalWrite(LED_3_PIN, HIGH); break; case 4: digitalWrite(LED_4_PIN, HIGH); break; default: // wrong pin number, do nothing // all LEDs will be powered off break; } }
ensin tarkistetaan, onko Arduino saanut Vadelmapiistä tietoja Sarjaviestinnän kautta.
jos kyllä, luetaan Seuraava tavu, jossa on sarja.lukea(). Tässä voit huomata pienen tempun, joka koostuu vähentämällä kanssa ”0”, joka muuntaa merkin numero se edustaa – tässä tapauksessa kokonaisluku.
sen jälkeen se on melko yksinkertaista. Sammutamme kaikki LEDit, ja sitten virta vain LED liittyy numero: 1, 2, 3 tai 4. Jos lähetetään väärä arvo, mikään LED ei ole päällä.
Raspberry Pi Python-koodi
#!/usr/bin/env python3import serialimport randomif __name__ == '__main__': ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1) ser.flush() while True: number = ser.read() if number != b'': if int.from_bytes(number, byteorder='big') == 18: led_number = random.randint(1,4) print("Button has been pressed.") print("Sending number " + str(led_number) + " to Arduino.") ser.write(str(led_number).encode('utf-8'))
ensin lisätään yksi tuontirivi: Python random library.
äärettömässä silmukassa (”vaikka totta”) luetaan ensin yksi tavu sarjallisuudesta. Aikalisä asetetaan 1 sekuntiin. Jos yhden sekunnin jälkeen ei saada mitään, read () – funktio palauttaa B”.
joten tarkistamme, onko se mitä saimme on yksinkertaisesti tyhjä (b”) vai oliko siellä todella jotain. Tässä jälkimmäisessä tapauksessa, me muuntaa saamamme tiedot kokonaisluku, jotta voimme käyttää koodia. Siihen käytämme funktiota int.from_bytes (), joka purkaa koodin b’0x12′ (heksadesimaaliesitys 18 on 0x12) arvoon 18.
kuten näette, tarkistamme, että Numero on 18 jatkaaksemme toimintaa. Jos sinulla on erilaisia komentoja käsiteltävänäsi, eri numeron käyttäminen jokaista komentoa varten on hyvä käytäntö.
valitsemme satunnaisluvun väliltä 1 ja 4 päättääksemme, mikä johti potenssiin. Sitten lähetämme sen kanssa pysserial kirjoittaa () funktio. Lähettää int kautta Serial, ensin muuntaa sen merkkijono str (), ja sitten koodata se koodata(’utf-8’).
sovelluksen testaaminen
nyt voit liittää Arduinon Raspberry Piin USB-kaapelilla. Vadelma Pi sitten toimittaa virtaa sekä Arduino ja 4 LED.
jos Arduinoon on kytketty monia asioita, kannattaa Arduinon virtalähteen liittimeen lisätä ulkoinen virtalähde. Esimerkiksi, Jos haluat käyttää askelmoottoria, Raspberry Pi ei koskaan ole tarpeeksi virtaa itselleen + Arduino + Moottori. Tässä tapauksessa, 4 LED, joka on OK.
Suorita Python-skripti ja paina painiketta. Näet loki ja yksi LED Arduino on kytketty päälle.
$ chmod +x arduino_raspberry_pi_leds_button.py$ ./arduino_raspberry_pi_leds_button.py Button has been pressed.Sending number 3 to Arduino.Button has been pressed.Sending number 2 to Arduino.Button has been pressed.Sending number 4 to Arduino.Button has been pressed.Sending number 1 to Arduino.Button has been pressed.Sending number 3 to Arduino.Button has been pressed.Sending number 3 to Arduino.
joka kerta kun painat nappia:
- Arduino tunnistaa sen ja lähettää 18 Vadelma Pi.
- Raspberry Pi saa jonkin verran tietoa Serialista. Se tarkistaa, onko numero yhtä kuin 18. Jos kyllä, valitaan satunnaisluku (väliltä 1-4). Vadelma Pi lähettää tämän numeron Arduino.
- Arduino saa tämän numeron ja voiman siihen liittyvästä ledistä.
Huomaa: Jos haluat tehdä tämän sovelluksen nopeammin ja vähemmällä koodilla, voit käyttää myös Firmata-protokollaa, esimerkiksi pyFirmata-kirjastoa Raspberry-palvelussa ja StandarfFirmata-kirjastoa Arduinossa. Tutustu nämä tutorials oppia lisää.
johtopäätös
tässä tutoriaalissa olet oppinut kommunikoimaan Raspberry Pi: n ja Arduino-laudan välillä sarjamuotoisesti.
onko tästä nyt tosielämässä hyötyä? Vastaus on kyllä, ja aika usein.
Raspberry Pi sopii mainiosti siihen, että sovellukseen on upotettu paljon laskentatehoa. Voit suorittaa kokonaisia ohjelmistoja monilla kielillä, web-palvelimilla, robotiikkasovelluksilla jne. Vadelma Pi varmasti on joitakin GPIOs joita voit käyttää, mutta ne eivät ole yhtä hyviä kuin Arduino niistä. Myös, sinulla on enemmän mahdollisuuksia polttaa Pi jos teet jotain vikaa laitteisto.
Arduino on sopivampi käsittelemään suoraan laitteistoantureita ja toimilaitteita: IMU -, servomoottorit, askelmoottorit, kaikki mikä vaatii enemmän tehoa jne. – lisätietoja siitä, milloin käyttää Arduino vs Vadelma Pi.
kaiken kaikkiaan 2 Laudat voivat toimia täydellisesti yhteen: Vadelma Pi sovelluksen ”aivoina” ja Arduino ”lihaksina”, joiden Sarjaviestintä saa heidät puhumaan toisilleen.