Raspberry Pi Arduino Seriell Kommunikasjon-Alt Du Trenger Å Vite

i denne opplæringen vil jeg vise deg hvordan du kommuniserer mellom En Raspberry Pi og En Arduino bord via Seriell kommunikasjon.

Først vil jeg raskt forklare Hva Som Er Seriell kommunikasjon. Deretter ser du hvordan du konfigurerer maskinvaren og programvaren, og vi dykker inn I Python-koden (Cpp For Arduino). Et grunnleggende eksempel først, som fører til en mer komplett søknad ved Hjelp Av En Raspberry Pi, En Arduino og andre elektroniske enheter.

denne opplæringen vil fungere med En Raspberry Pi 4 (og tidligere: 3B, 3B+) bord, og noen Arduino bord. Jeg vil bruke det meste Arduino Uno, men vil gi mer informasjon om forskjellene Mellom Arduino boards når Det gjelder Seriell kommunikasjon.

når du arbeider med elektroniske enheter, er kommunikasjon nøkkelen. Hver enhet – i tillegg til å gjøre det bra hva den skal gjøre-må kunne kommunisere tydelig med andre enheter. Det er en av de viktigste tingene å jobbe med for å bytte fra en veldig grunnleggende applikasjon til mer komplekse.

Innholdsfortegnelse

Hva Er Seriell kommunikasjon (MED UART)

Seriell kommunikasjon er bare en måte å overføre data på. Dataene sendes sekvensielt, en bit om gangen (1 byte = 8 biter), i motsetning til parallell kommunikasjon, hvor mange biter sendes samtidig.

UART-protokoll

Mer spesifikt, når Du bruker Serial med Arduino Og Raspberry Pi, bruker DU UART-protokollen. UART betyr «Universell Asynkron Mottak og Overføring».

du lærer hvordan du bruker Raspberry Pi til å bygge dine egne prosjekter?

Sjekk Ut Raspberry Pi for Nybegynnere og lær trinnvis.

I Utgangspunktet er Det en asynkron multi-master-protokoll basert På Seriell kommunikasjon, som lar deg kommunisere mellom de 2 brettene. Vær beroliget, det er biblioteker som håndterer alle de lave lagene for deg.

Multi-master betyr at alle tilkoblede enheter vil være fri til å sende data når de vil. Dette er en av hovedforskjellen med master-slaver protokoller, hvor bare master enheten kan starte en kommunikasjon. Vanligvis bruker du andre protokoller som I2C og SPI når du trenger master-slaver konfigurasjoner: for eksempel når Du har Ett Arduino-kort og flere sensorer eller aktuatorer.

Arduino Uno-kortet har en UART som du kan bruke enten med EN USB-kabel eller FRA rx / TX-pinnene (ikke bruk den med begge samtidig). Noen brett har flere tilgjengelige UARTs. For Eksempel Har Arduino Mega forskjellige Serier (Serial, Serial1, Serial2, Serial3) og Arduino Zero har bare en innfødt USB-port (Bruk SerialUSB i stedet For Serial).

På Raspberry Pi kan du koble mange Serielle enheter på USB-porter. Hver vil ha et annet enhetsnavn (vi ser hvordan du finner dem senere i denne opplæringen). Du kan ogsa bruke GPIOs (RX0/TX0) for en ekstra UART.

Du vet sikkert Allerede Seriell kommunikasjon

Du har sikkert allerede brukt Seriell kommunikasjon mange ganger. Jeg er sikker på at Du allerede kjenner Arduino Serial library, som lar deg logge hva som skjer i koden din og få brukerinngang. Når Du bruker Seriell skjerm, vi vil, utgangspunktet Din Arduino IDE starter En Seriell kommunikasjon Med Arduino. Du kan motta og sende data direkte fra Den Serielle skjermen.

det vi skal gjøre her er nesten det samme, bortsett fra at I stedet For Din Arduino IDE, vil Den Andre siden Av Seriell kommunikasjon være Et Raspberry Pi-kort. Vi må gjøre noe oppsett og skrive litt kode for å få det til å fungere. Deretter Vil Både Raspberry Pi Og Arduino kunne sende meldinger til hverandre.

La oss nå se hvordan du fysisk kobler de 2 brettene sammen.

Maskinvareoppsett For Seriell kommunikasjon

Det er 2 måter å koble Raspberry Pi Og Arduino Til Seriell kommunikasjon.

Seriell VIA USB

den enkleste måten er å bruke EN USB-kabel mellom begge kortene.

På Raspberry Pi-siden er en enkel USB-kontakt alt du trenger. Du kan velge noen av DE 4 USB-portene som er tilgjengelige på brettet.

For Arduino bruker DU USB-porten du bruker til å laste opp kode fra datamaskinen din (Med Arduino IDE) til brettet ditt. HER VIL USB-kontakten avhenge av hvilken versjon du har. For brett Som Arduino Uno Og Mega, vil kontakten være forskjellig Fra Arduino Nano, Og Fra Arduino Zero.

for dette eksemplet har jeg brukt Et Arduino Uno-brett.

Som du kan se, er det den enkleste maskinvareforbindelsen du kan lage mellom Raspberry Pi og Arduino.

Notat: Du må først koble Arduino til datamaskinen, slik at du kan laste opp koden til brettet. Deretter kobler DU USB-kabelen til Raspberry Pi. Raspberry Pi vil drive Arduino via denne kabelen.

Seriell Via GPIOs

For Å lage En Seriell tilkobling kan du også bruke vanlige ledninger mellom Raspberry Pi GPIOs og Arduino-pinnene.

Avhengig Av Arduino-kortet ditt, må du kanskje bruke en spenningsnivåskifter. Raspberry Pi opererer på 3.3 V. For Arduino-brett som Due, 101, vil det være bra fordi de også bruker 3.3 V.

men for Mange Arduino, Som Uno, Mega, Leonardo, Nano og mange flere, opererer styret PÅ 5V. Dermed trenger du en 3.3 V/5V nivåskifter for å beskytte Raspberry Pi når du kobler RX og TX(mer informasjon Om Raspberry Pi-pinner og Arduino Uno-pinner).

for resten av denne opplæringen bruker vi oppsettet MED USB-kabelen. Dette blir enklere å administrere, og med mindre du har en god grunn ikke også, bør du foretrekke Å bruke USB-kabelen i stedet for vanlig gpios For Seriell kommunikasjon.

Raspberry Pi Programvareoppsett

Du trenger ikke noe spesielt oppsett For Arduino. Bare vær sikker på at Du har lastet ned Og installert Arduino IDE.

nå, På Raspberry Pi, er det noen ting som kreves for å få kommunikasjonen til å fungere.

Koble Til Raspberry Pi, enten via ssh, eller ved plugin en skjerm + mus + tastatur, og åpne en terminal. Hvis Du ikke har installert ET OS på Pi ennå, kan du installere Raspbian eller Ubuntu veldig enkelt på ET SD-kort.

Oppdag arduino-kortet

når Du kobler Arduino med EN USB-kabel, bør du se at Den vises som /dev / ttyACM0 eller / dev / ttyUSB0 (noen ganger kan nummeret være annerledes, for eksempel /dev/ttyACM1).

bare kjør ls /dev/tty* og du bør se den. På dette punktet hvis Du ikke er sikker på hvilken enhet Som Er Arduino-kortet, må du bare koble fra brettet (fjern USB-kabelen) og kjøre ls /dev/tty* igjen. På denne måten vil du enkelt få øye på seriell enhet navnet På Arduino.

Maskinvaretillatelser For Seriell

du kan også legge til brukeren i oppringingsgruppen for å unngå feil som: seriell.serialutil.SerialException: kunne ikke åpne port / dev / ttyACM0: Tillatelse nektet: ‘/dev / ttyACM0’

$ sudo adduser your_username dialout

Dette vil sørge for at du har tilgang Til Serielle enheter (/dev /ttyACMx,/dev / ttyUSBx,…).

etter at du har lagt deg til dialout-gruppen, må Du starte Pi på Nytt (eller i det minste logg ut/logg inn) for å bruke endringen – lær mer om Raspberry Pi-maskinvaretillatelser.

Installer Python Serial library på Raspberry Pi

du må installere et bibliotek for å kunne bruke Serielt grensesnitt med Python.

for denne opplæringen vil vi bruke pyserial bibliotek (dokumentasjon For Python 3). For å installere det:

python3 -m pip install pyserial

Dette Python-biblioteket er kjent og brukt i mange applikasjoner.

når du installerer, hvis du får en feil som «/ usr / bin / python3: Ingen modul kalt pip», må du først installere pip med sudo apt install python3-pip.

Enkel Seriell kommunikasjon Fra Arduino Til Raspberry Pi

La oss starte med et veldig enkelt program.

Arduino kode

Last opp denne koden fra datamaskinen Til Arduino, ved Hjelp Av Arduino IDE.

void setup() { Serial.begin(9600);}void loop() { Serial.println("Hello from Arduino!"); delay(1000);}

først initialiserer Vi Seriell kommunikasjon, og velger en baudrate, her 9600. 9600 er en vanlig baud rate, og også en ganske lav en. I fremtidige programmer kan du bruke en overføringshastighet på 57600 eller selv 115200 uten problem. For denne opplæringen fortsetter vi med 9600.

hvert sekund gjør Vi Arduino sende en streng Med Seriell.println(). println () – funksjonen vil legge til et linjeskift ‘\n ‘ på slutten av strengen.

Du kan åpne Seriell skjerm for å se strengen på datamaskinen.

Raspberry Pi Python kode

#!/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)

Så, hva gjør denne koden?

#!/usr/bin/env python3import serial

først importerer vi seriebiblioteket som vi tidligere installerte.

if __name__ == '__main__': ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1)

Seriell kommunikasjon initialiseres ved å ringe seriell.Seriell () sammen med noen parametere:

  • Seriell enhet navn For Arduino: vanligvis ‘/dev / ttyACM0’, ‘/dev/ttyUSB0 ‘ eller lignende.
  • Overføringshastighet: denne parameteren er svært viktig. Du må bruke samme overføringshastighet som Den Du brukte På Arduino, ellers vil alt du leser og skriver bli søppel. Så, vi velger 9600 som vi gjorde I Arduino-skissen.
  • timeout: dette er en timeout for leseoperasjoner. Her setter vi det til 1 sekund. Det betyr at når vi leser Fra Serie, programmet vil ikke bli sittende fast for alltid hvis dataene ikke kommer. Etter 1 sekund eller lesing, hvis ikke alle byte er mottatt, returnerer funksjonen allerede mottatte byte.

Så, serie.Seriell () returnerer et objekt som du kan bruke til Alle Serielle operasjoner. Vi lagrer den i’ ser ‘ – variabelen.

 ser.flush()

da bruker vi flush () – funksjonen. Dette vil spyle inn-og utgangsbuffer, så det vil unngå å motta eller sende rare/ikke nyttige / ikke komplette data i begynnelsen av kommunikasjonen.

 while True: if ser.in_waiting > 0: line = ser.readline().decode('utf-8').rstrip() print(line)

i en uendelig sløyfe (tenk på loop () – funksjonen I Arduino-skissen), sjekker vi om noen data er tilgjengelige med in_waiting-attributtet (ikke sett parentes, dette er ikke en funksjon). Hvis ja, kan vi lese dataene.

readline () – funksjonen leser alle byte til et linjeskift er oppdaget.

hvis vi bare skrev ut det vi mottok, ville vi se b ‘ Hello fra Arduino!\r \ n’. Du mottar byte når du leser Fra Serie, og du må konvertere (dekode) disse byte til riktig datatype. Så, vi bruker dekode(‘utf-8’) – du kan også bruke dekode(‘ascii’) – for å dekode mottatte data til en streng.

Endelig er rstrip () – funksjonen spesifikk for strenger, det lar deg fjerne eventuelle etterfølgende tegn(ny linje, vognretur). På denne måten kan vi fjerne ‘\r ‘ og ‘\n ‘ og få en skikkelig streng.

Merk: her leser vi en komplett linje hver gang. Hvis du vil lese en viss mengde byte-en eller flere-bruk les (størrelse=1) – funksjonen.

Testing Seriell kommunikasjon

nå, koble Arduino styret Fra datamaskinen og koble Den Til Raspberry Pi styret.

Arduino-koden kjører allerede, så snart den er slått på.

på Raspberry Pi, gjør Python-filen kjørbar og start den.

$ chmod +x receive_serial_data_from_arduino.py$ ./receive_serial_data_from_arduino.py Hello from Arduino!Hello from Arduino!Hello from Arduino!

det fungerer! Strengen sendt Av Arduino hvert sekund vises på Raspberry Pi-terminalen.

Toveis Seriell kommunikasjon Mellom Raspberry Pi Og Arduino

La oss gjøre ting litt mer interessant. Du har sett hvordan du sender data Fra Arduino Til Raspberry Pi. I denne delen ser du hvordan du snakker Fra Raspberry Pi Til Arduino. Dermed har du begge sider av kommunikasjonen, og du vil kunne lage programmer som venter på hverandres innspill.

Arduino kode

void setup() { Serial.begin(9600);}void loop() { if (Serial.available() > 0) { String data = Serial.readStringUntil('\n'); Serial.print("You sent me: "); Serial.println(data); }}

her sjekker Vi Om Arduino har mottatt data Med Seriell.tilgjengelig(). Dette vil gi deg antall byte som allerede er ankommet og lagret i mottaksbufferen.

hvis noen data er ankommet, bruker Vi Seriell.readStringUntil () med et linjeskift ‘\n ‘ for å få neste linje. Dette ligner på readline () – funksjonen. Alle byte mottatt til ‘\n ‘ konverteres automatisk og legges til I Et Arduino-Strengobjekt.

deretter skriver vi bare ut dataene vi mottok, med et ekstra stykke tekst.

Merk: hvis du vil lese byte en etter en, kan Du gjøre Det Med Serienummeret.les () – funksjonen. Da må du konvertere denne (de) byte (e) om nødvendig: int, String, etc.

Raspberry Pi Python-kode

#!/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)

Bruk pyserial-funksjonen write() til å sende data Til Arduino. Her kan du se at jeg har lagt til en ‘ b ‘ før strengen skal sende. Dette vil kode strengen til byte, fordi du bare kan sende byte Gjennom Seriell. Alle data som ikke er en byte eller byte matrise må konverteres før de sendes. Hvis du bare prøver å sende strengen slik, får du denne feilen «TypeError: unicode-strenger støttes ikke, vennligst kode til byte:» Hei Fra Raspberry Pi!'»

Merk: i stedet for ser.write(b"Hello from Raspberry Pi!\n") kunne du ha skrevet ser.write("Hello from Raspberry Pi!\n".encode('utf-8')) eller ser.write("Hello from Raspberry Pi!\n".encode('ascii')). Dette vil gjøre det samme. Encode () – funksjonen vil ta strengen og kode den For Seriell.

vi legger også til et newline-tegn ‘\n ‘ fordi Det er Hva Arduino forventes å avslutte lesingen Med Seriell.readStringUntil (‘\n’).

da gjør Vi det samme som vi gjorde før: vi leser en linje, dekoder den til streng og fjerner eventuelle etterfølgende tegn. Vi bruker ikke ser.in_waiting her, fordi for denne spesifikke applikasjonen vet Vi At Arduino vil sende tilbake noen data like etter at den har mottatt strengen. Også, vi har en 1 andre timeout for å unngå å bli sittende fast på denne linjen.

Til Slutt skriver vi ut den mottatte strengen og venter på 1 sekund med tiden.sov () før du sender neste streng Over Seriell.

Testing toveis Seriell kommunikasjon

på Raspberry Pi, gjør Python-filen kjørbar og start den.

$ 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!

Suksess! Arduinoen mottok strengen, og sendte den tilbake med noen få ord. Deretter Mottok Raspberry Pi og trykte den endelige strengen.

Raspberry Pi Arduino Seriell kommunikasjon: Applikasjonseksempel

Nå som Du vet hvordan Du konfigurerer Arduino Og Raspberry Pi For Seriell kommunikasjon, og skriv programmer for å snakke mellom hvert brett, la oss lage et mer komplekst program.

i denne applikasjonen vil 4 Lysdioder og en trykknapp kobles Til Arduino-kortet.

Raspberry Pi Og Arduino vil bli koblet til EN USB-kabel og bruke Seriell kommunikasjon for å snakke med hverandre.

her er resultatet vi ønsker å få:

  • Når trykknappen trykkes, Sender Arduino et varsel Til Raspberry Pi (en enkel byte).
  • Raspberry Pi vil da beregne et tilfeldig heltall mellom 1 og 4, og sende Det Til Arduino.
  • Arduino vil slå PÅ LED relatert til dette nummeret, og slå av de andre Lysdiodene.

Dette vil gjøre deg øve på kommunikasjon og synkronisering av oppgaver Mellom Arduino Og Raspberry Pi.

hvis du kom til dette punktet i opplæringen (gratulerer!) Jeg oppfordrer deg til å prøve å skrive koden selv før du leser koden jeg har gitt nedenfor. Det er også ikke bare en mulig kode for å oppfylle disse kravene, så koden din kan være forskjellig fra min, det er helt OK. Du kan få hjelp Fra Arduino Seriell referanse og pyserial API referanse.

Skjemaer

for å gjøre denne kretsen:

  • Koble 4 Lysdioder til pinner 9-12. Legg til en 220 Ohm motstand for HVER LED mellom lengre ben og digital pin. Det kortere benet er koblet til bakken.
  • Legg til en trykknapp med en 10kohm motstand koblet til bakken(nedtrekksmotstand). Den ene siden av knappen er koblet TIL 5V, den andre til digital pin 5 for lesing.
  • ikke glem å lage en felles plattform mellom alle komponenter: Arduino-kortet, 4-Lysdiodene og trykknappen. Ikke legg til noen strømforsyning hvis du ikke i det minste har riktig tilkoblet begrunnelsen.
  • Koble Arduino Og Raspberry Pi via EN USB-kabel, For Seriell kommunikasjon (USB-kabelen styrer allerede jordforbindelsen mellom dine 2 brett).

Arduino-kode

#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; } }}

i setup () – funksjonen initialiserer vi pin-modusene for alle 4 Lysdioder og trykknappen. Vi sørger også for at Alle Lysdioder er slått av.

så i løkken() gjør vi 2 ting: håndtering av trykknappen og styring av 4 Lysdioder. Begge handlingene gjøres en etter en, men de håndteres veldig fort, så det er akkurat som om de skjedde samtidig. Det er et tilfelle av multitasking Et Arduino-program.

Første handling: håndtering av trykknappen.

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;

vi må debounce knappen for å unngå uønskede verdier. Når vi finner ut at knappen er trykket, kan vi sende noen data til Raspberry Pi Via Seriell.

Her har jeg brukt Serienummeret.skriv () funksjon: den sender en byte eller serie byte. Dette er forskjellig Fra Seriell.skriv ut () som vil gjøre utgangen hyggelig å se På Seriell skjerm. Som vi snakker med en annen maskin og ikke et menneske, ikke noe problem med det.

nummeret vi sender her er 18. Dette er bare et tilfeldig tall som vi vil knytte til staten «knappen har blitt presset», så når Raspberry Pi vil motta et nummer, vil det sjekke om det er lik 18. Du kan tenke deg å sende forskjellige handlinger eller meldinger Via Serie, ved hjelp av forskjellige tall.

Merk: vanligvis kan Du også bruke Arduino avbrudd for å vite når en knapp er trykket. Hvis du gjør det, må Du ikke bruke Seriebiblioteket i avbruddet. Hvis du absolutt må bruke avbrudd, sett deretter et flagg inne i interrupt (en enkel boolsk variabel), og bruk Seriell inne i loop () – funksjonen.

og den andre handlingen: administrere De 4 Lysdiodene.

 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; } }

først sjekker Vi Om Arduino har mottatt noen data fra Raspberry Pi over Seriell kommunikasjon.

hvis ja, leser vi neste byte Med Serie.lese(). Her kan du se et lite triks, bestående av å trekke med ‘0’, som vil konvertere tegnet til tallet det representerer – i dette tilfellet et heltall.

etter det er det ganske enkelt. Vi slår av Alle Lysdioder, og slår bare PÅ LYSDIODEN som er knyttet til nummeret: 1, 2, 3 eller 4. I tilfelle en feil verdi sendes, vil INGEN LED bli slått på.

Raspberry Pi Python kode

#!/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'))

først legger vi til en importlinje: Python random library.

i den uendelige sløyfen («Mens Sant») leser vi først en byte Fra Serie. Timeout er satt til 1 sekund. Hvis ingenting mottas etter ett sekund, vil les () – funksjonen returnere b».

så vi sjekker om det vi mottok bare er tomt (b») eller om det virkelig var noe. I dette sistnevnte tilfellet konverterer vi dataene vi mottok til et heltall, slik at vi kan bruke i koden. For det bruker vi funksjonen int.from_bytes(), som vil dekode b’0x12′ (den heksadesimale representasjonen av 18 er 0x12) til 18.

som du kan se, kontrollerer vi at tallet er 18 for å fortsette handlingen. Hvis du har forskjellige kommandoer å håndtere, er det en god praksis å bruke et annet nummer for hver kommando.

vi velger et tilfeldig tall mellom 1 og 4 for å bestemme hvilken SOM FØRTE til strøm på. Deretter sender vi den med pyserial write () – funksjonen. For å sende en int Via Seriell, konverterer vi den først som en streng med str (), og koder den deretter med kode(‘utf-8’).

Testing av programmet

nå kan Du koble Arduino Til Raspberry Pi ved HJELP AV USB-kabelen. Raspberry Pi vil da levere strømmen til Både Arduino og 4-Lysdiodene.

hvis Du har mange ting koblet Til Arduino, vil du kanskje legge til en ekstern strømforsyning på Arduino-strømforsyningskontakten. For eksempel, hvis du vil bruke en stepper motor, Vil Raspberry Pi aldri ha nok strøm for seg selv + Arduino + motoren. I dette tilfellet, med 4 Lysdioder SOM ER OK.

Kjør Python-skriptet ditt og trykk på trykknappen. Du vil se en logg og en AV LED På Arduino vil bli slått på.

$ 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.

Hver gang du trykker på knappen:

  • Arduino vil oppdage det og sende 18 Til Raspberry Pi.
  • Raspberry Pi vil motta noen data Fra Seriell. Det vil sjekke om tallet er lik 18. Hvis ja et tilfeldig tall (mellom 1-4) er valgt. Raspberry Pi vil sende dette nummeret Til Arduino.
  • Arduino vil motta dette nummeret og slå på den tilhørende LED.

Merk: for å gjøre dette programmet raskere og med mindre kode, kan du også velge Å bruke Firmata-protokollen, med for eksempel pyFirmata-biblioteket På Raspberry og StandarfFirmata-biblioteket På Arduino. Sjekk ut disse veiledningene for å lære mer.

Konklusjon

i denne opplæringen har du lært å kommunisere mellom Raspberry Pi og Arduino bord Via Serie.

nå, i virkeligheten, vil dette være nyttig for deg? Svaret er ja, og ganske ofte.

Raspberry Pi er flott for å ha mye beregningskraft innebygd i søknaden din. Du kan kjøre komplett programvare på mange språk, webservere, robotikk applikasjoner, etc. Raspberry Pi har sikkert Noen GPIOs som du kan bruke, men de er ikke så gode Som Arduino-ene. Du har også flere sjanser til å brenne Pi hvis du gjør noe galt med maskinvare.

Arduino er mer hensiktsmessig å direkte håndtere maskinvare sensorer og aktuatorer: IMU, servomotorer, stepper motorer, noe som krever mer kraft, etc. – mer informasjon Om Når Du skal bruke Arduino vs Raspberry Pi.

Alt i alt kan De 2 brettene fungere perfekt sammen: Raspberry Pi som «hjernen» av applikasjonen, Og Arduino som «musklene», Med En Seriell kommunikasjon for å få dem til å snakke med hverandre.