Education‎ > ‎Arduino for adults‎ > ‎

Arduino for Adults 3: ソフトウェア編

買い物編ハードウェア編に続いて,ソフトウェア編です.ここまででMacからリレーをON/OFFするという初期の目標は達成です.

お手元のMacに Developer Tools は入っていますよね?まだの方は Apple Developer Connection に入会して(無料),最新版を取ってきて下さい.時間がない方は Mac OS X 10.6 のインストーラディスクに入っているものでも結構です.Developer Tools が古くてもこれから使うRubyに影響はありません.ていうか,最新版を取ってきてもRubyは若干古いのが入っています.

まず Arduino Uno をパッケージから出して,USBケーブルでMacに繋ぎましょう.モデムとして認識されるかもしれませんが,無視しましょう.前回作成したシールド(基板)はまだつけないでください.

このままでは何も出来ません.Arduino公式サイトから開発環境 Arduino.app を取ってきましょう.取ってきたら早速起動です.Fileメニューの下にExamplesというメニューがあります.これは助かります.まず Arduino Uno に搭載されている唯一プログラマブルに点灯できるLEDを点灯させてみましょう.

FileメニューからExamples→Basics→Blinkを選んでください.Arduino.app がベースにしているProcessingに倣って,Arduinoプログラムのことはスケッチと言いますよ.このスケッチをコンパイルして Arduino Uno のメモリへ書き込みます.といってもボタン一発です.ROMライタはいりません.Arduino Uno のブートローダが勝手に送られてきたバイトコードをメモリに書き込んでくれます.

おいどないなっとるんや,そもそもブートローダはいつ立ち上がるんや.

それでこそジジイです.長年の経験がうさんくささをかぎつけます.これから Arduino Uno と通信しようというのに,回路の変更もなく同じラインからプログラムが書き込める?どう考えても矛盾です.

Arduino Uno はこんな巧妙な仕掛けを利用しています.シリアル通信が開始されると,ああ,RS-232を思い出してください,RS-232で言うところの Data Terminal Ready (DTR) が真になると,キャパシタを使ってCPUのリセットピン(Arduinoが使うAVRマイコンの場合は負論理)へトリガーをかけるのです.

そうです,近頃の若者はコンピュータに電源を投入したら自動的に立ち上がるのが当たり前と思っています.もちろん,電源に連動した自動CPUリセット回路のおかげです.Arduino Uno はこの自動CPUリセット回路をシリアル通信開始信号に付けているのです.

ブートローダは10秒間(たぶん)ホストからのプログラム送信を待ちます.もしその間にプログラムが送られてこなければ,ユーザプログラムへ制御を移します.もし10秒以内にプログラムが送られてくれば,ユーザ領域へプログラムを書き込み,自分自身をリセットします.(で,また10秒待ちます.)

では最初のブートローダはいつ書き込まれるのかというと,これは工場出荷時です.なーんて親切なんでしょう.
ちなみにBlinkのプログラムはこんな感じです.

/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.

  This example code is in the public domain.
*/

void setup() { 
  // initialize the digital pin as an output.
  // Pin 13 has an LED connected on most Arduino boards:
  pinMode(13, OUTPUT); 
}

void loop() {
  digitalWrite(13, HIGH); // set the LED on
  delay(1000); // wait for a second
  digitalWrite(13, LOW); // set the LED off
  delay(1000); // wait for a second
}

驚くほど簡単ですね.Arduino.app はこれをCプログラムに変換してgccでコンパイルしてシリアルへ流します.

Arduino Uno でサンプルを動かしたら,次は Arduino Uno におとなしくMacの言いなりになってもらいます.それにはFirmataというファームウェアを Arduino Uno にぶち込みます.これもExamplesにあります.FileメニューからExamples→Firmata→Standard Firmataを開き,Arduino Uno に書き込みましょう.

この状態で Arduino Uno とおしゃべりをすれば言うことを聞いてくれますが,より自由度の高いプログラミングのために,プロセス間通信を使った仲介役をかませます.Funnelというソフトウェアを使います.Funnel公式サイトからダウンロードしましょう.そして,起動します.

Funnel.app のウィンドウのドロップダウンメニューで,どのシリアルポートに繋ぐか選べます.usb(という文字列が入っているシリアルデバイス)を選んでください.

Funnelにはいろいろなサンプルプログラムが入っています.サンプルプログラムは ActionScript (Flash), Processing, Ruby バージョンがあります.ここはひとつRubyと洒落込みましょう.

Rubyを使ったことはありますかな?ジジイには少々なじみの薄い言語ではありますね.ほろ苦いC言語にお砂糖をまぶしたのがPythonだとすると,酸味のきいたLISPを蜂蜜に漬け込んだものがRubyです.

Arduino Uno に前回制作した基板(シールド)を乗っけてください.LEDは点灯しましたか?ON/OFFどちらでも構いません.ホットプラグしていいんです.大丈夫,壊れません.

Funnelのパッケージの中のruby_basic_01.rb というプログラムを見つけてください.ここでSpotlightを使えばMac信者,findコマンドを使えばBSD原理主義者です.ruby_basic_01.rb をエディタで開き,変数the_pinの値をリレーに繋いだピン番号にしてください.例えば,こんな感じです.

require 'funnel'
include Funnel

the_pin = 2

config = Arduino.FIRMATA
config.set_digital_pin_mode(2, OUT)
aio = Arduino.new :config => config

10.times do
  aio.digital_pin(the_pin).value = 1
  sleep(5)
  aio.digital_pin(the_pin).value = 0
  sleep(5)
end

コマンドラインから,
$ ruby ruby_basic_01.rb
とすると,自作シールドのリレーがON/OFFします.

これで,任意のリレーをRubyプログラムからON/OFF出来るようになりました.めでたしめでたし...ではつまらないので,ちょっとは楽しげな事をしましょう.

一例として,TwitterのMentionが飛んできたらファンを回すという装置を組んでみましょう.Rubyには Twitter API を扱うライブラリ Ruby Twitter Gem があります.

が!

このライブラリは,Mac OS X 10.6.6 の状態ではバージョンが不整合なんですな.Rubyのほうはいいのですが,Rubyのライブラリを管理しているGemsというパッケージが古すぎるぶーぶーと言われます.アップデートには当然管理者権限が必要なのでsudoさんにお願いします.
$ sudo gem update --system
無事Gemがアップデートされたら
$ sudo gem install twitter
で Ruby Twitter Gem をインストールします.

あとは適当〜にプログラムを書けばよろしです.Twitterのメンションを拾ってくるには,例えばこんな風にします.

require "rubygems"
require "twitter"

search = Twitter::Search.new

search.containing("おはよう").to("kanaya").result_type("recent").each do |r|
  puts "#{r.from_user}: #{r.text}"
end

search.clear

これと先ほどのリレー制御を混ぜると,Twitterからそよ風を受けられます.

で,実際に動いたコードをお見せしたいのはやまやまなのですが...展示に使ったMacにしかコードが入っていなくて(ええそうです現場でコードを書いたんです今は深く反省していますこれからはもっと早くコードを書きます),手元にないのでお見せできません.Twitter API のたたき具合に微妙な調整がいるのですが,基本は上のコードふたつを混ぜれば動きます.
Comments