去年12月に発売したMicro買った http://arduino.cc/en/Main/ArduinoBoardMicro
Leonardと同じくATmega32U4のUSBシリアル機能(CDC/ACM)を使っているので、マウスやキーボードになれる
小さい
adafruitで買った。
3人で3枚買って送料シェアさせていただいたので1枚2400円ぐらいだった。3週間ぐらいで届いた気がする。
マウスやキーボードとしても認識されるぶん、Android版Firmataライブラリで使っているusb-serial-for-androidというライブラリでデータがreadできない。
digitalWrite, analogWriteは動くけどdigitalReadとanalogReadが動かない。
ちょっと調査してるけどむずかしい。
Ruby版Firmataはばっちり動いた。
昨日のこれ直した
Duemillanoveは一度使うと抜き差ししないと認識しなくなるバグが発覚した。あとで直す。
UNOは問題ない。
橋本商会 » Raspberry PiでRuby/Arduino/Twitter/webcam
Arduino Firmataのv0.1.6が既にrubygemsにリリースされています
gem install arduino_firmataでアップデートしてお楽しみください
バグ内容
色々試してたら、2回目以降はArduinoのリセットボタンを押せば認識する事に気づいた。firmataデバイスがちゃんと認識しているかを確認する手段としてデバイスから送られてくるバージョン番号を使っている。
バージョン番号はArduino起動時に送られるだけで、Macや俺の持ってるUbuntuネットブックではシリアルポート接続時にリセットがかかるので2回目も使えていたらしい。Arduino UNOの場合はMacでもRaspberry Piでも接続時にリセットかかるので動いていた。
Raspberry Piでは接続時にリセットがかからないので、シリアルポート開いた直後にバージョン番号をリクエストするだけでバージョン返してくれるようになった。
これならもしかしたら、以前挫折したMSP430 LaunchPadのFirmata化もできるかも
Raspberry PiでRuby/Arduino/Twitter/webcam
Raspberry Piが届いたのでセットアップしてArduinoでサーボモーター動かしたり、CdSで明るさ読んでTweetしたり、webcamでJPEGに撮影したりした。
raspbianというほぼdebianなOSを入れたのでかんたんだった。
購入
RSコンポーネンツをキャンセルしてModMyPiでケース付きのを買った。10日ぐらいで届いた。Makershedでも売ってる。
SDカードにRaspberry Piを書き込む
akiroom情報でRaspbian “wheezy”を使うことに。
Amazonで買った16GBのSDHCカードに入れた。4GBあれば足りると思うけど安かったので16GB。
売り上げランキング: 20
http://www.raspberrypi.org/downloadsからzipでダウンロードしてきて、
MacでUSBメモリにUbuntuのインストールディスク作ると同じ手順でSDカードに書き込んだ。
ただし今回はRaspberry Pi用にカスタムされたディスクイメージ(インストールディスクではない)をそのままいれる。
SDカードを抜いた状態と刺した状態でそれぞれ
mountで増えてるデバイスを見つける。/dev/disk3が増えていた。
zipでダウンロードしてきたディスクイメージをdmgに変換してSDカードに書き込む
unzip 2012-10-28-wheezy-raspbian.zip
hdiutil convert -format UDRW -o 2012-10-28-wheezy-raspbian.dmg 2012-10-28-wheezy-raspbian.img
sudo diskutil umountDisk /dev/disk3
sudo dd if=2012-10-28-wheezy-raspbian.dmg of=/dev/rdisk3 bs=1m
sudo diskutil eject /dev/disk3
Raspberry Pi起動
SDカード、LANケーブル、USBキーボード、そしてHDMIをモニタに刺して、最後にMicroUSBで電源を刺して起動。SSHを有効にするかとかlocaleとかの設定が出る。
基本的に全部ja-JP.UTF-8にしてSSHは有効のまま起動。
CUIでログインできた。
あとはもう普通のdebianなので、普通に設定する。
Raspberry Piの日本語化 – ナントカ嬢とかを参考に。
パスワード変える
誰でもpi:raspberry でログインできてしまうので、passwdで変える。
電源を切る
sudo halt
再度電源入れたらなかなか起動しなくてあせったが、なんかSDカードに書き込んでた。
2回目の起動からはGUIが立ち上がった。ふつーにpython gamesでオセロとかやってたら時間経ってた。
ユーザ名
いつも使ってる名前のユーザを追加してしばらく操作したけど、Pi以外だと音をだす時とシリアルポートを使う時にpermissionが無いと言われるので、Piのままの方がヨサゲ
SSHでログイン
Raspberry PiのIPアドレスを調べるsudo ifconfig192.168.1.109だった
キーボードが多いと邪魔なので、手元のMacからログインする。
ssh pi@192.168.1.109
手元のMacの~/.ssh/configに
Host piこういう設定を書いて、
HostName 192.168.1.109
port 22
User pi
ssh piで接続するようにした。
色々アップデート、日本語環境
ディスクが遅いのか、けっこう待つsudo apt-get update
sudo apt-get upgrade
sudo apt-get install console-data
sudo apt-get install language-pack-ja
sudo apt-get install ttf-takao-mincho ttf-takao
sudo apt-get install locales
sudo dpkg-reconfigure locales
環境を整える
sudo apt-get install emacs23-nox screen zsh git
他のlinuxでいつも使ってる設定ファイルを持ってきて快適化
https://github.com/shokai/linux-dotfiles
https://github.com/shokai/mac-dot-emacs
zshellを使う
which zsh
chsh
ネットワーク設定
USBにWiFi刺した。参考:WiFi/HowToUse – Debian Wiki
/etc/network/interfaces を設定する。
auto lo
iface lo inet loopback
iface eth0 inet dhcp
allow-hotplug wlan0
iface wlan0 inet static
wpa-ssid 自宅のSSID
wpa-psk WPAのパスワード
address 192.168.1.5
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 192.168.1.1
設定を有効に
sudo /etc/init.d/networking restart
これでしばらくは固定IPでWPA2なWiFiに接続できていたんだけど、理由はよくわからないが接続できなくなったのでeth0のほうを使うようにした。
あとで何とかする。
何とかした → Raspberry PiにWiFi付けた
Rubyをインストール
-fullパッケージができてインストール楽になりましたね
sudo apt-get install ruby1.8-full rubygems
ruby -vruby 1.8.7 (2012-02-08 patchlevel 358) と gem 1.8.24が入った。
gem -v
もう1.8は終わったので1.9以上にしたほうがいいです(2013年6月)
Twitterする
Twをインストールした
sudo gem install tw system_timer
tw # 認証する
tw raspberry piからtwでtwitterしてる
Arduinoを使う
Arduino Firmtaa gemでサーボやLEDやらを動かしてみた
sudo gem install arduino_firmata
Arduino IDEで [File] -> [Examples] -> [Firmata] -> [StandardFirmata]をArduinoの書き込んでおく。
デバイス名はDuemillanoveだとttyUSB0、UNOだとttyACM0らしい。
Duemillanoveは一度使うと抜き差ししないと認識しなくなるバグが発覚した。あとで直す。
UNOは問題ない。
直した → Raspberry Pi + Firmata + Arduino Duemillanoveのバグを直した
digital 11にLED、digital10にサーボを接続した
#!/usr/bin/evn ruby
require 'rubygems'
require 'arduino_firmata'
arduino = ArduinoFirmata.connect ARGV[0]
loop do
puts "0 -> 180"
arduino.digital_write 13, true
0.upto(180) do |i|
arduino.analog_write 11, i
arduino.servo_write 10, i
sleep 0.01
end
puts "180 -> 0"
arduino.digital_write 13, false
180.downto(0) do |i|
arduino.analog_write 11, i
arduino.servo_write 10, i
sleep 0.01
end
end
明るさをツイート
CdSをArduinoのAnalog 0に接続
ワンライナーでツイート
echo "Raspberry Piの明るさ `arduino_firmata --arduino=/dev/ttyACM0 analog_read 0`" | tw --pipe
これを使った → プログラムを一切書かずに、ネットワーク越しにArduinoを操作する
crontabに登録しておけば定期的にツイートできる。
USBカメラで撮影
CUIでUSBカメラキャプチャをやるlogicoolの古いwebcamがあったので使った。(上の写真のやつ)
古くてもう売ってないっぽい。
Raspbianなら、USB video class対応しているwebcamつまり最近のやつならどれでもドライバ無しで認識すると思う。
sudo apt-get install fswebcamカメラつなげて
fswebcam -d /dev/video0 -D 2 -r 400 --jpeg 95 capture.jpgこれで撮影できた。
sshdが起動しているサーバーにArduino Firmata on Rubyをインストールして、firmataをインストールしたArduinoを刺すだけでok
Arduinoの準備
Arduino IDEで [File] -> [Examples] -> [Firmata] -> [StandardFirmata] を書き込むサーバー側の準備
ArduinoをUSBポートに刺す。rubyのarduino_firmata gemをインストールする。
sudo gem install arduino_firmataarduino_firmata gemをインストールすると、arduino_firmataという実行コマンドが使えるようになる。
arduino_firmata --help
arduino_firmata analog_read 1これだけでanalog 1の値が読める。
arduino_firmata servo_write 11, 13511ピンに接続したサーボモータが135度に回転させる。
コマンドからarduinoの基本的な機能は全部使える。
手元のMacからサーバーのArduinoを動かす
sshコマンドプロキシでセンサー読めるssh user@example.com arduino_firmata analog_read 0sshは、「ssh 接続先 コマンド」でサーバーにコマンドを実行させて結果を得てすぐ切断する事ができる。
arduino_firmataコマンドと組み合わせれば、全くプログラム書かずにコマンド1行で家のサーバーに刺さってるArduinoのCdSで明るさが取得したり、サーボモーターを動かしたりできる。
その他の例
例えばtweetさせたりecho "明るさ `arduino_firmata analog_read 0`" | tw --pipeTwを使ってる
Ruby以外の言語からでもセンサーを読むぐらいならできるし、cronに組み込んだりもできるし、そこそこ便利なのでは
最近寒いんだけど、明らかに寒いというほどでもない。
夜中に3時間ぐらい座って作業しているとじわじわと冷えていて次第に手足が動かなくなり、キーボードが打てなくなってようやく寒さに気づく。
つまり、集中しているとじわじわとした寒さに気づかない。
計測してみるとだいたい室温19度で数時間経つと冷えきるっぽいので、20度未満の時に「お体に障りますよ」と警告するようにした。
20度以上でも、「現在の気温 21度です」とか読み上げるようになっている。
これを30分おきにcronで動かしているので最近はもう凍えないようになった。ヤバくなる前にスープとか作って飲む。
まず、気温とか明るさをtweetするようにしたで作ったプログラムをarduino_firmataで簡単にした。
→ https://github.com/shokai/tweet_env
これがJSONでtweetする。
次に、tweetをチェックして温度が20度以下だったら「お体に障りますよ」と警告するプログラムを作った
https://github.com/shokai/okaradani-sawarimasuyo
git clone git@github.com:shokai/okaradani-sawarimasuyo.git
cd okaradani-sawarimasuyo
gem install bundler
bundle install
ruby okaradani-sawarimasuyo.rb
crontabに登録、毎時20と50分にしゃべる
20,50 * * * * cd $HOME/src/ruby/okaradani-sawarimasuyo && ruby okaradani-sawarimasuyo.rb > /dev/null 2>&1
Macのsaykanaを使ってるけど、他にもいろいろあるので別の声にしたければどうぞ → Mac/Linuxに日本語を喋らせる