Pd (Pure Data) から USB ケーブル経由で Miyagino を遠隔制御します.Miyagino の各出力端子の状態(LED のオン・オフなど)を制御したり,各入力端子の状態(スイッチのオン・オフなど)を読み取ったりできます.Pd については「音・映像メディア」を参照してください.
Pduino というパッチをインストールすることで,Pd からは Miyagino(一般には Arduino)を [arduino] というオブジェクトとして扱えるようになります.
上記のウェブページから Pduino-0.5beta8.zip をダウンロードし,展開したフォルダを適当な場所に置き,Pd からのサーチパスを通しておいてください.サーチパスを設定するには,Windows 版・Linux 版では,File メニューから Path... を選び,Mac OS X 版では Pd-extended メニューから Preferences > Path... を選び,該当するフォルダを登録します.
つぎに,Miyagino に Standard Firmata というプログラム(C で書かれたもの)を焼き込みます.Standard Firmata は,Arduino 開発環境に標準で用意されています.(参考:Arduino 開発環境のインストール.) Arduino 開発環境を起動し,File / Open > Examples > Firmata > Standard Firmata を開きます.ソースプログラム(スケッチ)が表示されますが,書き換えないでください.
このプログラムをそのままコンパイルし,Miyagino に焼き込みます.そのためには,Miyagino を PC に USB 接続した状態で,Tools > Board からターゲットとなる Arduino の種類を設定します.Miyagino の場合,"Arduino Duemilianove or Nano w/ ATmega328" を選択すればよいでしょう.つぎに Tools > Serial Port から Miyagino に接続する通信ポートを選択します.(参考:通信ポート名の確認.)
いよいよコンパイルと焼き込みです.Upload アイコンをクリックしてください.Miyagino は自動的にリセットさせ,コンパイルされた Standard Firmata プログラムが,Miyagino の内蔵 Flash に焼き込まれます.焼き込み終了後,Miyagino は Standard Firmata プログラムを自動的に実行します.いちど焼き込んでしまえば,Miyagino の電源を切っても,プログラムは消えません.つぎに電源を入れた(PC と USB 接続した)とき,自動的に内蔵 Flash に焼き込まれたプログラム(つまり Standard Firmata)が実行されます.
Standard Firmata を実行している Miyagino は,Pduino をインストールした Pd から,[arduino] というオブジェクトとして扱うことができます.[arduino] に入力したメッセージは,Miyagino に送られ,その上で動作している Standard Firmata によって処理され,出力端子をオン・オフするなどのアクションが実行されます.また Miyagino の入力端子の状態変化は,やはり Standard Firmata によって PC に送られ,[arduino] からメッセージとして出力されます.
Miyagino を PC に USB 接続した状態で Pd を起動し,新しいキャンバスに [arduino] を配置してください.サーチパスが正しく設定されていれば,オブジェクトとして生成されるはずです.つぎに,[devices[ というメッセージボックスを生成し,それを [arduino] の入力端子に接続してください.
[devices[ を押すと(数秒後に)Pd ウィンドウのコンソールに,通信ポートとして使える候補がリストされます.この中から,Miyagino に接続されている通信ポート名を探し,対応する番号(たとえば 3 とか 4 など)を確認します.この番号が,Pduino からみた Miyagino のポート番号です.
error: [comport] opening serial port 0 failed!
[arduino]: version_0.5beta8
[comport]: available serial ports:
1 /dev/tty.Bluetooth-PDA-Sync
3 /dev/tty.usbserial-A400gCLq
comport number 0 out of range (1-99)
error: [comport] opening serial port 0 failed!
... you might be able to track this down from the Find menu.
[arduino]: version_0.5beta8
[comport]: available serial ports:
3 - COM3 (free)
黒字の部分には,[arduino] を生成したときにデフォルトの 0 番ポートをオープンしようとして失敗したことが表示されています.赤字の部分が [devices[ の応答部分です.この例では,3 番ポートに Miyagino 上の USB-シリアル変換モジュールが接続されています.(参考:通信ポート名の確認.)
ポート番号がわかったら,つぎのような簡単なパッチを作ってみてください.まず [arduino 3] のように,ポート番号を [arudino] の引数として与えます.これで [arduino] の生成時に,このポート番号に対応する通信ポートが自動的にオープンされます.つぎに [pinMode 13 output[ を押してから,[toggle] をオン・オフしてみてください.Miyagino の左側の LED が点灯・消灯すれば,Pduino と Firmata は正常に動作しています.
[arduino] への入力メッセージとその意味(動作)について解説します.より網羅的な解説は,http://www.evl.uic.edu/drew/courses/AD405/PduinoReference.htm を参照してください.
[arduino] と Miyagino との通信を接続・切断します.USB ケーブルで Miyagino を接続してから正しい通信ポートをオープンし,クローズしてから Miyagino を外すようにしてください.
-
{devices} : 利用可能な通信ポート名と対応するポート番号を,下図のように,Pd ウィンドウのコンソールに表示します.Pduino ではポート番号を使って通信ポートを区別しますので,ポート番号を確かめておいてください.
(Mac OS の場合)[comport]: available serial ports: 1 /dev/tty.Bluetooth-PDA-Sync 3 /dev/tty.usbserial-A400gCLq(Windows の場合)[comport]: available serial ports: 3 - COM3 (free) - {open PORT} : ポート番号 PORT に対応する通信ポートをオープンします.このメッセージを与える代りに,[arduino 3] のように引数としてポート番号を与えることで,正しい通信ポートを自動的にオープンすることもできます.一方,[arudino] を引数なしで生成した場合,デフォルトである 0 番ポートのオープンを試み(そして大抵は失敗し)ますので,改めて {open PORT} で正しい通信ポートをオープンするようにしてください.
- {close} : 現在 [arudino] で使用している通信ポートをクローズします.
通信ポートをオープンあるいはクローズすると,Miyagino は自動的にリセットされ,内蔵 Flash に焼き込まれたプログラムが再起動します.
下図中央にあるプロセッサの "2"〜"13" の端子がディジタル入出力ピンです.下図の青い丸印をつけた穴を信号の入出力に使うとよいでしょう.これら 12本のディジタル入出力ピンについて,個別にピンの機能を設定できます.利用できるピン機能は,ディジタル入力 (input),ディジタル出力 (output),PWM 出力 (pwm),サーボ制御出力 (servo) です.
それぞれのピンの機能(動作モード)を設定するために [arduino] に送るメッセージは以下のとおりです.
- {pinMode PIN output} : PIN (2〜13) 番のディジタル入出力ピンを「ディジタル出力」モードとします.LED などを接続する場合のモードです.
- {pinMode PIN input} : PIN (2〜13) 番のディジタル入出力ピンを「ディジタル入力」モードとします.スイッチなどを接続する場合のモードです.
- {pinMode PIN pwm} : PIN (3, 5, 6, 9, 10, 11) 番のディジタル入出力ピンを「PWM 出力」モードとします.LED の明るさに強弱をつける場合などのモードです.
- {pinMode PIN servo} : PIN (2〜13) 番のディジタル入出力ピンを「サーボ制御出力」モードとします.ラジコン用のサーボモータを接続する場合のモードです.
アナログ入力端子 a0〜a5 をディジタル入出力端子として使用することができます.その場合,これら端子のピン番号は PIN=14〜19 となります.使い方は通常のディジタル入出力端子と同じです.
あらかじめ {pinMode PIN ouput} によって「ディジタル出力」モードに設定したピン(2〜13番および 14〜19番)から,論理 1(オン)あるいは論理 0(オフ)を出力します.そのために [arduino] へ送るメッセージは以下のとおりです.
- {digital PIN 1} : PIN 番ピンの電圧を,プラス電源 (VCC) とほぼ同じ(約 5V)にします.(「ディジタル入力」モードのピンに対して {digital PIN 1} を設定すると,プルアップ抵抗(後述)が有効となります.)
- {digital PIN 0} : PIN 番ピンの電圧を,マイナス電源 (GND) とほぼ同じ(約 0V)にします.
たとえば LED を点灯させるには,つぎのような回路をブレッドボード上につくるとよいでしょう.左側の例では,{digital 10 1} によって 10番ピンを 5V にすると,抵抗器と LED を通ってマイナス電源(GND:逆三角横縞の記号)に流れ,LED が点灯します.{digital 10 0} によって 10番ピンを 0V にすれば,電位差がなくなり,電流の流れも止まるため,LED は消灯します.1kΩ の抵抗器は,LED を流れる電流を 5mA 程度に制限するためのものです.(抵抗器と LED の接続順序はどちらでも電気的には変わりません.)
一方,右側の例では,{digital 12 0} によって 12番ピンを 0V にすると,プラス電源(VCC:上向き矢印)から 12番ピン方向に電流が流れ込み,LED が点灯します.{digital 12 1} によって 12番ピンを 5V にすると,電位差がなくなり,電流の流れも止まるため,LED は消灯します.左側の例と比べると 0/1 の論理が逆転していることに注意してください.
LED には極性があり,ある方向の電流(数 mA 程度)が流れたときだけ点灯します.逆向きの電流は流れません.LED が点灯するときの電流の入口側をアノード(陽極)といい,出口側をカソード(陰極)といいます.回路図記号では,黒三角の底辺側がアノードです.実物の LED では,足の長い方がアノードです.
なお LED を(抵抗器を通さずに)直接電源に接続してはいけません.大きな電流が流れて LED が焼損します.ヤケドするかもしれません.かならず抵抗器(1kΩ 程度)と直列に接続するようにしてください.
ブレッドボード上に実装するなら,たとえば下図のような配線になります.パッチを作って LED の動作を確かめてみてください.
まぜるな危険:ディジタル出力ピンどうしを直接結線してはいけません.一方をオン(5V)にし,もう一方をオフ(0V)にしたとき,これら端子の間を大きな電流が流れ,発熱し,おそらくプロセッサが壊れるでしょう.
タコ足配線:ひとつのディジタル出力ピンで複数の LED を点灯させるには,下図のように,抵抗器を含めて並列に接続するとよいでしょう.(こうして接続できる LED は,およそ 10本が限度でしょう.)
ひとつのディジタル出力ピンから取り出せる(あるいは吸い込ませられる)電流は最大 40mA です.ただし,プロセッサ全体としては,同時に出力できる電流は最大 200mA です.これを超えないように使ってください.
あらかじめ {pinMode PIN input} によって「ディジタル入力」モードに設定したピン(2〜13番および 14〜19番)の電圧変化(オン・オフの変化)を読み取ります.PIN 番ピンの電圧がオフからオンに変化したとき,[arduino] から {digtal PIN 1} が出力され,逆にオンからオフに変化したときは,{digtal PIN 0} が出力されます.(ここで言う「オン」とは電源 GND から +0.6V 以上を,また「オフ」とは +0.3V 以下を意味します.多くの場合は,それぞれプラス電源 (VCC=5V)・マイナス電源 (GND=0V) でオン・オフを区別すればよいでしょう.)
ただし,「ディジタル入力」モードにしたピンはとても敏感(高インピーダンス状態)です.上図のように直接スイッチを付けただけでは,ピンがオープン状態(プラス電源にもマイナス電源にも接続されていない状態)のとき,オンとオフを目まぐるしく行き来することがあります.これを避けるには,プルアップ抵抗器(左下図)あるいはプルダウン抵抗器(右下図)を付加する必要があります.10kΩ 程度がよいでしょう.
Miyagino のプロセッサ(ATMega328P)には内蔵プルアップ抵抗器が含まれています.デフォルトでは無効になっていますが,「ディジタル入力」モードにしたピンごと有効にすることができます.PIN 番ピンの内蔵プルアップ抵抗器を有効にするには,{digital PIN 1} を [arduino] に送ってください.
ブレッドボード上に実装するなら,たとえば下図のような配線になります.パッチを作ってスイッチからの応答を確かめてみてください.
13番ピンを「ディジタル入力」モードで使うにはコツが必要です.すでに抵抗器(1kΩ)と LED が接続されているため,内蔵プルアップ抵抗器が十分に働きません.13番ピンから正しく信号を読み取るには,抵抗器や LED を外して,内蔵プルアップ抵抗を有効にするとよいでしょう.あるいは,外部に新しくプルダウン抵抗器(1kΩ 程度)を用意し,スイッチ等によってプラス電源に接続されるようにしてもよいでしょう.
あらかじめ {pinMode PIN pwm} によって「PWM 出力」モードに設定したピン(3, 5, 6, 9, 10, 11番)から,約 490Hz の矩形波(5V・0V)を出力します.そのデューティー比(5V が出力される時間の割合)を 0.0〜1.0 の間で変化させることで,出力電圧の時間平均を 0〜5V の間で連続的に変化させることができます.そのために [arduino] に送るメッセージは以下のとおりです.
- {pwm PIN 0〜1} : PIN 番ピンから出力される矩形波のデューティー比を 0.0〜1.0 に設定します.
たとえば下図のように,デューティー比 0.2 の矩形波(5V・0V)であれば,出力電圧の時間平均は 1V となり,0.5 であれば 2.5V,0.8 であれば 4V となります.このように連続的にコントロールできる電圧を使って,たとえば LED の明るさに強弱をつけることができます.LED の接続方法は「ディジタル出力」の場合と同じです.また,モータの回転速度を増減させるためにも使うことができます.
ブレッドボード上に LED と抵抗器を直列に実装し,下図のようなパッチ([hslider] の出力値は 0〜1)を作って,LED の明るさが変わる様子を確かめてみてください.ただし,出力される矩形波のデューティー比と実際に知覚される明るさは比例しないので,左側の [hslider] からの回路のように,数値を二乗してからデューティー比として与えるとよいでしょう.
あらかじめ {pinMode PIN servo} によって「サーボ制御出力」モードに設定したピン(2〜13番)から,ラジコン用サーボモータの回転角度を制御するための信号を出力します.[arduino] に送るメッセージは PWM 出力と同じ形式となります.(Miyagino では,いずれかのピンを「サーボ制御出力」モードにすると,9・10番ピンの PWM 出力が出来なくなります.)
- {pwm PIN 0〜1} : およぞ −90deg(メッセージ第3要素が 0.0 のとき)から +90deg(1.0 のとき)の回転位置に対応したサーボ制御信号を,PIN 番ピンから出力します.与えた 0.0〜1.0 の数値に対して,回転角度はおおむね線形に変化します.
一般にラジコン用のサーボモータは3本の電線によって電源とサーボ制御信号を与えます.3本の電線は,たとえば茶・赤・橙(JR)あるいは黒・赤・白(Futaba)のような色分けがされていて,この順にマイナス電源・プラス電源・サーボ制御信号に対応します.電源は 4〜6V 程度ですが,瞬間的に大きな電流が流れることがあるので,Miyagino とは別の電源(単三電池3本)によって供給します.このとき下図のように,Miyagino のマイナス電源 GND と電池のマイナス側を接続することで,サーボ制御信号を正しくサーボモータに受け渡すことができます.
サーボ制御信号は,50〜100Hz 程度の矩形波(5V・0V)です.5V 部分のパルス幅を 1.5ms を中心に およそ ±0.5ms 程度の変化を与えることで,サーボモータの出力軸が −90deg〜+90deg の位置に回転し,その位置を保持するようになります.
アナログ入力ピン(a0〜a5)に与えられた電圧を読み取ります.まず,{analogIns PIN 1} を [arduino] に送ることで,対応するアナログ入力ピンを有効します.PIN が 0 ならば a0 番のアナログ入力ピンが対応します.すると,[arduino] から {analog PIN 0〜1} が連続的に出力されるようになります.出力メッセージの第3要素(0.0〜1.0 の数値)は,0.0 がマイナス電源(0V),1.0 がプラス電源(5V)の間で,ほぼ線形に対応します.メッセージ出力を止めるには,{analogIns PIN 0} を [arduino] に送ります.
アナログ入力は,たとえばポテンシオメータ(回転型の可変抵抗器)の角度を読み取ることや,あるいは各種センサの出力(連続値)を読み取るために利用します.たとえば前者の場合,下図のような回路をつくるとよいでしょう.
ブレッドボード上に実装するなら,たとえば下図のような配線になります.パッチを作ってポテンシオメータの応答を確かめてみてください.