Bruke Ruby til Program Arduino

Gjennom denne artikkelen lærer du hvordan vi kan fortsette å bygge et prosjekt hvor lysdioden lyser rødt hvis noen tweets med et :-( (trist ansikt) og ordet regn, og det blir GRØNNT når tweeten inneholder en :-) ( glad ansikt) og ordet regn!

Fysisk databehandling refererer til ideen om programmering av ting rundt deg. I motsetning til typisk programmering for filer, data eller Internett, er dette programmering for ting du finner i den fysiske verden. Ved å bruke Arduino kan vi lese de fysiske inngangene og modifisere dem basert på logikk og svare på det ved hjelp av motorer.

Hva er Arduino?

Arduino er en enkelt prosess mikrokontroller som betyr at den kan kjøre ett program av gangen, og det kan kjøre det på ubestemt tid til du fjerner strømmen eller erstatter den med et annet program.

Basert på varierende evner er et stort utvalg av Arduino-plater tilgjengelige, og de kommer også i forskjellige former og størrelser. For eksempel er en Arduino Mini nesten størrelsen på tommelen, en Arduino Mega er større og har mange flere sensorstyringer. Lilypad kan bli vevd i stoff og er også vanntett!

La oss se på en Arduino Uno, som er den mest brukte.

Den leveres med en USB-port som tillater oss å koble til en bærbar datamaskin og skrive kode for den. Det er også strøminngangen, som kan brukes når du vil bruke brettet som frittstående og ikke festet til datamaskinen.

Den har 14 digitale inngangs- / utgangsspinner og seks analoge pinner. De digitale pinnene kan slås på og slås av basert på mikrokontrollens logikk. De kan også brukes til å lese i verdiene i binær form. De analoge pinnene kan brukes til å utføre en rekke verdier og ikke bare på eller av, så de kan brukes til å plugge sensorer som temperatur- eller lyssensorer. Det er også noen pulsbreddemoduleringsnåler som er gitt for å gjøre en rekke verdier ved hjelp av de digitale pinnene. (Pins nummerert 11, 10, 6, 5, 3 vil referere til det.)

Hvorfor bruke en Arduino?

For det første er det billig, kryssplattform, har en god IDE, og all programvare og maskinvare er åpen kildekode. Når du henviser til åpen kildekode, her er hvordan alle komponentene er lisensiert:

maskinvare CC-SA-BY
programvare GPL
Dokumenter CC-SA-BY
Merke TM

Videre, i tillegg til disse punktene, er hele Arduino-styret sammen med samfunnet så levende og kreativt at det er vanskelig å savne. Arduino er den viktigste Lego-blokken i hele puslespillet av raske prototyper for reklamer.

Hvordan Arduino kommuniserer

Siden hovedformålet med denne artikkelen er å undersøke hvordan du bruker Ruby for å samhandle med Arduino, la oss undersøke hvordan kommunikasjonen fungerer fra en programvare side.

Alle Arduino boards har minst en seriell port (også kjent som UART) som kan brukes til kommunikasjon mellom bord og datamaskin. Det spiller ingen rolle hvilket programmeringsspråk som er på den andre enheten, så lenge det kan grensesnitt via seriell. Alternativt kan vi også bruke kabelbasert LAN og WiFi-grensesnitt ved hjelp av skjold.

Ruby Arduino Solutions

Siden Arduino kan kommunisere via sin serielle port, ville den mest grunnleggende tilnærmingen til å kontrollere Arduino bruke serienummeret Ruby.

Serial Port Gem

Serial Port-perle er en implementering av RS232 serielle porter med flere lavnivåfunksjoner for å styre signaler på linjen.

# https://github.com/hparra/ruby-serialport krever "serialport" #params for seriell port port_str = "/ dev / ttyUSB0" # kan være annerledes for deg baud_rate = 9600 data_bits = 8 stop_bits = 1 paritet = SerialPort: : NONE sp = SerialPort.new (port_str, baud_rate, data_bits, stop_bits, paritet) #just les for alltid mens sant gjør mens (i = sp.gets.chomp) legger jeg ende ende sp.close

Å bestemme din port_str På Linux kan du åpne IRB og utføre 'ls /dev'.split ("\ n"). grep (/ usb | ACM / i) .kart | d | "/ Dev / # d"

Et annet alternativ til å bruke Ruby med Arduino ville åpenbart være en abstraksjon av å skjule disse interne detaljene og jobbe mer på objektnivå. Det er den nøyaktige tilnærmingen som RAD, eller Ruby Arduino Development, valgte å bruke. Dessverre blir prosjektet ikke lenger vedlikeholdt.

Dino Gem

Denne perlen tar en mer løst koblet og sterkt sammenhengende tilnærming til problemet med å bruke Ruby med Arduino. Dermed mener jeg at det bruker et generisk bibliotek på Arduino, som dynamisk reagerer på forespørsler fra datamaskinen over seriell forbindelse. 

Dette gir også mye mer abstraksjon for å håndtere de involverte komponentene. Dino perlen selv har en avhengighet av seriell port perlen som forklarer at den bruker den samme perlen for seriell kommunikasjon samtidig som programmereren gir nyttige abstractions.

Etter installering av dino perle, løpe dino generere skisse seriell fra terminalen din. Dette vil generere en .ino skisse. Last opp denne skissen til Arduino ved hjelp av Arduino IDE, og kjør deretter koden nedenfor fra datamaskinen som er koblet til Arduino.

# dino_sample.rb krever 'dino' bord = Dino :: Board.new (Dino :: TxRx.new) led = Dino :: Komponenter :: Led.new (pin: 13, brett: brett) [: på, av ] .cycle do | switch | led.send (bryter) søvn 0.5 ende

Du kan kjøre denne filen fra datamaskinen ved å kjøre rubin dino_sample.rb Dette burde blinke LED-lampen på pin 13 av Arduino. Vi styrer nå maskinvare med Ruby!

La oss justere denne koden ovenfor for å gjøre bruk av Twitter API og få enheten til å blinke basert på bestemte signaler.

Utløsende LED med en Tweet

Koble til henholdsvis pin 13 og 12, rød LED og grønn LED. Koble deretter Arduino til datamaskinen og last opp standard Dino seriell skiss som ble generert i forrige trinn.

Nå bruker vi tweetstream-perlen til Twitter-integrasjon. For å kunne bruke den med hell, må du opprette en Twitter-app, og bruk forbrukernøklene og oAuth-tokens for prøven og legg dem i en fil twitter_api_config.yml.

La oss se på koden for å få lysdiodene til å blinke basert på informasjon som kommer fra Twitter.

# twitter_leds.rb krever 'yaml' krever 'tweetstream' krever 'dino' auth = YAML :: load_file ("twitter_api_config.yml") TweetStream.configure do | config | config.consumer_key = auth ["consumer_key"] config.consumer_secret = auth ["consumer_secret"] config.oauth_token = auth ["oauth_token"] config.oauth_token_secret = auth ["oauth_token_secret"] endebord = Dino :: Board.new Dino :: TxRx :: Serial.new) redled = Dino :: Komponenter :: Led.new (pin: 13, brett: brett) greenled = Dino :: Komponenter :: Led.new (pin: 12, brett: brett) kjempebra =, 'veldig bra', 'glad', 'hyggelig', ':-)', ':)', 'super', 'crazy', 'good', 'fun' ] awful = ['ikke bra', 'dårlig', 'trist', 'ikke glad', 'ikke som', 'misliker', 'ikke bra', ':(', ':-(', 'ikke morsomt ',' ikke bra ',' ikke hyggelig ',' hater ',' ikke morsomt '] TweetStream :: Client.new.track ("rain") do | status | setter status.text # skriver tweet til skjerm. twit = status.text hvis awful.any? | w | twit.include? w legger '** trist tweet **' redled.send (: on) sleep 3 redled.send (: av) søvn 1 elsif awesome.any ? | w | twit.include? w setter '- glad tweet--' greenled.send (: on) sleep 3 greenled.send (: av) søvn 1 ende ende

Referansene vil bli lagret i en annen fil som heter twitter_api_config.yml som Nedenfor.

# twitter_api_config.yml # Sett XYZ-verdier for programmet opprettet på apps.twitter.com consumer_key: XYZ consumer_secret: XYZ oauth_token: XYZ oauth_token_secret: XYZ

Ovennevnte kode, når du kjører, vil du få lysdiodene til å blinke basert på Tweet-innholdet! Hva vi har gjort, er koblet Arduino til en datamaskin, lastet opp Dino-serienummeret til Arduino, og kjører deretter koden ovenfor på vår maskin ved å si rubin twitter_leds.rb

Over koden er tilgjengelig på dette github-depotet.

I  twitter_leds.rb Vi oppretter først en forbindelse til Arduino-bordet ved hjelp av Dino. Så fortsetter vi å skape redled og greenled til henholdsvis tappene 13 og 12. Deretter lager vi skikkelser av glade og triste ord, for å holde ting enkelt. Deretter fortsetter vi å lete etter forekomsten av ordet regn i noen tweet, og fortsett deretter for å sjekke om det er et trist ord, og i så fall sette uttrekkeren den røde lysdioden i stedet for den grønne lysdioden.

Du har nå LED som utløses av tilfeldige tweets over hele verden. Fantastisk, er det ikke?

referanser

  • Arduino Serial
  • Arduino - Grensesnitt med S / W
  • Arduino Ruby Twitter Code