いろいろ雑記

ArduinoでLチカして、Rubyからこんにちわー!して遊んだ

GWだったので秋葉原で買ったArduinoエントリーキットで遊びました。
なんだかんだで半年ぐらい寝かしてたのかorz
もっと早くやれよ・・・

Ubuntuに環境つくるよ

Arduino IDEっていうEclipse的なものが必要なのでサイトからダウンロードしてくる。

Androidの開発環境のときにJavaはインストール済みだったのでコンパイラだけをインストール

sudo aptitude install gcc-avr avr-libc

解凍して実行すればおk
簡単,簡単

ハードなHello WorldといえばLチカらしい

ぼくはへっぽこプログラマーなので
一番最初にやることといえばHello Worldしか思いつかないのだけれど
電子工作やハードな人たちはLチカというらしい。
LEDチカチカの略?

というわけでやってみた。

f:id:nefo_mi:20120506214612j:image

プログラムはサンプルの
File -> Example -> Basics -> Blinkをそのまま
簡単,簡単と思いきや・・・

  • ブレッドボード触るの久しぶりすぎてアタフタw
  • 抵抗の色の読み方がわかんねーw
  • LEDの向きはナニがプラスで、どれがマイナスなのw

とかなんか無駄に時間がかかりましたw
だけどブレッドボードにジャンパーをポチポチ刺すの楽しいわー!

なんとかLチカが終わったのでいっぱい光らしてみる。

エントリーキットについてたLEDを全部光らせる。
プログラムはサンプルとか見ながら適当に書いた。
C言語っぽく書けるので簡単,簡単

f:id:nefo_mi:20120506214719j:image

void setup() {                
  for(int i = 2; i <= 8; i++){
    pinMode(i, OUTPUT);
  }  
  Serial.begin(9600);
  Serial.println("setupDone");  
}

void loop() {
  for(int i = 2; i <= 8; i++){
    digitalWrite(i, HIGH);   
    delay(150); 
    digitalWrite(i, LOW);
    delay(15);
  }
  for(int i = 8; i >= 2; i--){
    digitalWrite(i, HIGH);
    delay(150);
    digitalWrite(i, LOW);
    delay(15);
  }
}

なんか0番と1番端子に刺したらLED光っぱなしという悲しいことになったので2番から8番使ってます。
うーん、なんでだろう。

RubyからこんにちはArduino

グーグル先生に聞いてみたらなんかRubyから直接Arduinoとやりとりできるらしい。
なにそれすごい、ということで下記のサイトを参考に遊んでみる。

Funnelっていうニュータイプっぽいライブラリをつかえばいいらしいけど、WindowsとMac用っぽいので別の方法を探す。

そのまんまシリアル通信できるらしいのでgem install
なんかruby-serialportは失敗したのでserialportを入れる。

gem install ruby-serialport #=> 失敗
gem install serialport

Arduino側のプログラムは参考サイトのやつをコピッとなー

int incomingByte = 0;
int ledPin = 13;

void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  if (Serial.available() > 0) {
    incomingByte = Serial.read();
    Serial.print("I received: ");
    int ledBlinkTime = (incomingByte - 48) * 1000;
    Serial.println(ledBlinkTime);
    digitalWrite(ledPin, HIGH);
    delay(ledBlinkTime);
    digitalWrite(ledPin, LOW);
    delay(1000);
  }
}

んでおもむろにpryを起動して

[1] pry(main)> require 'serialport'=> true
[2] pry(main)> sp = SerialPort.new("/dev/ttyACM0", 9600, 8, 1, SerialPort::NONE)

=> #<SerialPort:fd 5>
[3] pry(main)> sp.putc '3'
=> "3" #=> LEDが3秒光る
[4] pry(main)> 

pryでインタラクティブにArduinoとお話できるとか凄すぎる!
電子工作敷居が高いなーって思ってたけれど
こんなにも簡単だなんて!

というわけでArduinoRubyからこんにちはー!

エントリーキットに入ってたLCDをブレッドボードにとりつける。
これで文字が出力できる。
Lチカも良いけどやっぱりHello Worldだよねということで
Rubyから送った文字をArduinoに表示させました。

f:id:nefo_mi:20120506214613j:image

Arduino側のプログラムはこれ

#include <LiquidCrystal.h>
int incomingByte;
char inByte;
String inMsg;
LiquidCrystal lcd(7,8,9,10,11,12,13);

void setup()
{
  lcd.begin(2, 16);
  lcd.clear();
  lcd.print("*Hello World*");

  lcd.setCursor(1, 1);
  lcd.print("homuhomu");
  Serial.begin(9600);
  Serial.println("setupDone"); 
}

void loop()
{
  if (Serial.available() > 0) {
    inByte = Serial.read();
    if((inByte >= 65 && inByte <= 90) || (inByte >= 97 && inByte <= 122) 
        || (inByte >= 48 && inByte <= 57) || (inByte == 43)
        || (inByte == 61) || (inByte == 63)){
      inMsg.concat(inByte);    
    }
  }
  if (inByte == 10 || inByte == 13){
    inByte = 0;
    lcd.clear();
    lcd.print(inMsg);
    inMsg = "";
  }
}

んでpryを起動してっと

[1] pry(main)> require 'serialport'                                   
=> true
[2] pry(main)> sp = SerialPort.new("/dev/ttyACM0", 9600, 8, 1, SerialPort::NONE)
=> #<SerialPort:fd 5>
[3] pry(main)> sp.puts "homuhomu"                                     
=> nil

f:id:nefo_mi:20120506214614j:image
ほむー!

Rubyとお話できるってことはTwitterのuserstreamを監視してメンションが来たらLEDをチカチカして
相手のIDを表示するとかすぐできちゃうわけだ!

逆にArduinoのセンサの値をRubyに渡せば・・・
うは、夢がひろがりんぐ

センサーとか色々電子部品が欲しくなっちまったぜw
Arduino楽しい!

たわごと

umitterのザオラルに失敗したというか、やる気がでないというか、部屋の掃除が捗るよね!
一気に変えないで少しずつやるかー