pineapple blog

Blog of Ichi Kanaya / 金谷一朗のブログ

Search

Twitter feed

Flickr Feed

Loading Flickr...

    More - Flickr

    Find me on...

    ジジイのためのArduino入門・ソフトウェア実装編

    買い物編ハードウェア実装編に続いて,ソフトウェア実装編です.ここまでで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 のたたき具合に微妙な調整がいるのですが,基本は上のコードふたつを混ぜれば動きます. まとめサイトはこちらです.

    Notes

    1. pineappledesign posted this
    Blog comments powered by Disqus

    Loading posts...