Ruby gebruiken om Arduino te programmeren

Via dit artikel leer je hoe we door kunnen gaan met het bouwen van een project waarbij de LED ROOD wordt als iemand tweets met een :-( (droevig gezicht) en het woord regen, en het GROEN wordt als de tweet een :-) ( blij gezicht) en het woord regen!

Physical computing verwijst naar het idee om dingen om je heen te programmeren. In tegenstelling tot typische programmering voor bestanden, gegevens of internet, is dit programmeren voor dingen die je in de fysieke wereld tegenkomt. Met behulp van Arduino kunnen we de fysieke ingangen lezen en deze aanpassen op basis van logica en hierop reageren met behulp van motoren.

Wat is Arduino?

Arduino is een microcontroller met één proces, wat betekent dat het één programma tegelijk kan uitvoeren en het voor onbepaalde tijd kan uitvoeren totdat u de stroom verwijdert of het goed vervangt door een ander programma.

Op basis van verschillende mogelijkheden is een breed scala aan Arduino-platen beschikbaar en ze zijn er ook in verschillende soorten en maten. Een Arduino Mini is bijvoorbeeld bijna zo groot als een duim, een Arduino Mega is groter en heeft veel meer sensorbedieningen. Lilypad kan in weefsel worden geweven en is ook waterdicht!

Laten we eens kijken naar een Arduino Uno, die het meest wordt gebruikt.

Het wordt geleverd met een USB-poort waarmee we verbinding kunnen maken met een laptop en er code voor kunnen schrijven. Er is ook een voedingsingang, die kan worden gebruikt wanneer u het bord als standalone wilt gebruiken en niet aan uw computer vastzit.

Het heeft 14 digitale invoer / uitvoer pinnen en zes analoge pinnen. De digitale pinnen kunnen worden ingeschakeld en uitgeschakeld op basis van de logica van de microcontroller. Ze kunnen ook worden gebruikt om de waarden in binaire vorm in te lezen. De analoge pinnen kunnen worden gebruikt om een ​​bereik van waarden uit te voeren en niet alleen aan of uit, zodat ze kunnen worden gebruikt om sensoren zoals de temperatuur- of lichtsensoren aan te sluiten. Er zijn ook enkele pulsbreedtemodulatiepinnen aanwezig om een ​​bereik van waarden uit te voeren met behulp van de digitale pinnen. (Pinnen genummerd 11, 10, 6, 5, 3 zouden daarnaar verwijzen.)

Waarom een ​​Arduino gebruiken?

Ten eerste is het goedkoop, platformonafhankelijk, heeft het een goede IDE en zijn alle software en hardware open source. Wanneer u naar open source verwijst, vindt u hier hoe alle componenten onder licentie zijn:

Hardware CC-SA-BY
Software GPL
Docs CC-SA-BY
Merk TM

Bovendien is, naast deze punten, het hele Arduino-bord samen met zijn community zo levendig en creatief dat het moeilijk te missen is. Arduino is dat ene belangrijkste Legoblok in de hele puzzel van rapid prototyping voor creatieven.

Hoe Arduino communiceert

Aangezien het hoofddoel van dit artikel is om te verkennen hoe Ruby te gebruiken voor interactie met Arduino, laten we eens kijken hoe de communicatie werkt vanuit een software-kant.

Alle Arduino-kaarten hebben ten minste één seriële poort (ook bekend als UART) die kan worden gebruikt voor communicatie tussen het bord en een computer. Het maakt niet uit welke programmeertaal op het andere apparaat staat, zolang het maar via seriële interface kan communiceren. Als alternatief kunnen we ook bekabelde LAN- en WiFi-interfaces gebruiken met behulp van schermen.

Ruby Arduino-oplossingen

Omdat de Arduino kan communiceren via zijn seriële poort, zou de meest elementaire benadering om de Arduino te besturen de seriële Ruby-bibliotheek gebruiken.

Seriële poort Gem

Serial Port gem is een implementatie van RS232 seriële poorten met verschillende low-level functionaliteiten om signalen op de lijn te besturen.

# https://github.com/hparra/ruby-serialport vereisen "serialport" #params voor seriële poort port_str = "/ dev / ttyUSB0" #may anders kunnen zijn voor u baud_rate = 9600 data_bits = 8 stop_bits = 1 parity = SerialPort: : NONE sp = SerialPort.new (port_str, baud_rate, data_bits, stop_bits, parity) #just forever lezen terwijl true do while (i = sp.gets.chomp) do puts i end end sp.close

Om uw te bepalen port_str op Linux kun je openen irb en voer uit 'ls /dev'.split ("\ n"). grep (/ usb | ACM / i) .map | d | "/ Dev / # d"

Een andere optie om Ruby met Arduino te gebruiken, is natuurlijk slechts een abstractie van het verbergen van deze interne details en meer werken op objectniveau. Dat is de exacte aanpak die RAD, of Ruby Arduino Development, heeft gekozen om te gebruiken. Helaas wordt het project niet langer onderhouden.

Dino Gem

Dit juweeltje neemt een meer losjes gekoppelde en sterk samenhangende benadering van het probleem van het gebruik van Ruby met Arduino. Daarmee bedoel ik dat het een generieke bibliotheek op de Arduino gebruikt, die dynamisch reageert op de verzoeken van de computer via de seriële verbinding. 

Dit biedt ook veel meer abstractie om met de betrokken componenten om te gaan. Het Dino-juweel zelf heeft een afhankelijkheid van de edelsteen van de seriële poort en legt uit dat het hetzelfde juweel gebruikt voor seriële communicatie terwijl het de programmeur voorziet van nuttige abstracties.

Na het installeren van de dino edelsteen, ren dino genereren-schets serie vanaf uw terminal. Dit genereert een .ino schetsen. Upload deze schets naar Arduino met behulp van de Arduino IDE en voer vervolgens de onderstaande code uit vanaf de computer die is aangesloten op de Arduino.

# dino_sample.rb vereist 'dino' board = Dino :: board.new (Dino :: TxRx.new) led = Dino :: Components :: Led.new (pin: 13, board: board) [: on,: off ] .cycle do | switch | led.send (schakelaar) slaap 0,5 einde

U kunt dit bestand vanaf de computer uitvoeren door robijn uit te voeren dino_sample.rb Dit moet de LED op pin 13 van de Arduino laten knipperen. We controleren nu hardware met Ruby!

Laten we deze code hierboven aanpassen om gebruik te maken van de Twitter API en het apparaat laten knipperen op basis van bepaalde signalen.

De LED triggeren met een tweet

Verbind met respectievelijk pin 13 en 12, RODE LED en GROENE LED. Verbind vervolgens de Arduino met de computer en upload de standaard Dino-seriële schets die in de vorige stap werd gegenereerd.

Nu gebruiken we het tweetstream-juweel voor Twitter-integratie. Om het met succes te kunnen gebruiken, moet je een Twitter-app maken en de consumentensleutels en oAuth-tokens voor de steekproef gebruiken en in een bestand plaatsen twitter_api_config.yml.

Laten we naar de code kijken om de LED's te laten knipperen op basis van informatie afkomstig van Twitter.

# twitter_leds.rb vereisen 'yaml' vereisen 'tweetstream' vereisen '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"] end board = Dino :: board.new ( Dino :: TxRx :: Serial.new) redled = Dino :: Components :: Led.new (pin: 13, board: board) greenled = Dino :: Components :: Led.new (pin: 12, board: board) geweldig = ['geweldig', 'zeer goed', 'blij', 'leuk', ':-)', ':)', 'super', 'gek', 'goed', 'leuk', 'liefde' ] vreselijk = ['niet goed', 'slecht', 'verdrietig', 'niet blij', 'niet zoals', 'niet leuk', 'niet goed', ':(', ':-(', 'niet leuk ',' niet goed ',' niet leuk ',' haat ',' niet leuk '] TweetStream :: Client.new.track ("rain") do | status | puts status.text # print de tweet naar het scherm. = status.text if awful.any? | w | twit.include? w puts '** sad tweet **' redled.send (: on) sleep 3 redled.send (: off) sleep 1 elsif awesome.any ? | w | twit.include? w puts '- happy tweet--' greenled.send (: on) sleep 3 greenled.send (: off) sleep 1 end end

De inloggegevens worden opgeslagen in een ander bestand met de naam twitter_api_config.yml zoals hieronder.

# twitter_api_config.yml # Zet XYZ-waarden voor de toepassing gemaakt op apps.twitter.com consumer_key: XYZ consumer_secret: XYZ oauth_token: XYZ oauth_token_secret: XYZ

De bovenstaande code, tijdens het uitvoeren, zal je LED's knipperen op basis van de Tweet inhoud! Wat we hebben gedaan, is de Arduino met een computer verbonden, de Dino-seriële code naar de Arduino geüpload en vervolgens de bovenstaande code op onze machine uitvoeren door te zeggen ruby twitter_leds.rb

Bovenstaande code is beschikbaar in deze github-repository.

In  twitter_leds.rb we maken eerst een verbinding met het Arduino-bord met Dino. Dan gaan we door met creëren redled en greenled naar de pennen 13 en 12, respectievelijk. Daarna maken we arrays van vrolijke en droevige woorden om de dingen simpel te houden. Daarna blijven we zoeken naar het voorkomen van het woord regen in een tweet, en ga vervolgens controleren of het een triest woord is en, zo ja, zet de rode LED in plaats van de groene LED in werking.

Je hebt nu LED's die worden geactiveerd door willekeurige tweets over de hele wereld. Geweldig, is het niet?

Referenties

  • Arduino Serial
  • Arduino - Interfacing met S / W
  • Arduino Ruby Twitter Code