多摩美 – サウンド&ソフトウェアアート 2013
PdとArduinoの連携 1 – Pduinoをつかってみる
今日の内容
今回からいよいよ火曜日のワークショップでとり扱かってきたArduinoと、この月曜のワークショップでやってきたPdを接続します。PdとArduinoで相互に通信ができるようにすることで、例えば曲げセンサーや加速度センサーを「楽器」のコントローラーとして使用したり、逆にPdで作成したパターンをLEDへにフィードバックさせたりといった相互の連携が可能となります。
PdとArduinoを連携するには「Pduino」という外部オブジェクトをダウンロードして使用します。
今回はまず、このPduinoを利用するための環境設定と動作確認を確実に行います。設定が完了したら、Pduinoを使用した簡単なパッチを作成し、実際にArduinoとの相互の連携を試してみましょう。
必要となるハードウェアとソフトウェア
今回必要となる機材は、以下の通りです。接続の方法やセットアップの方法は、手順を追って解説していきます。
ハードウェア
- PC (Mac OS X、Windows、Linux) – このワークショップではMac OS Xでの使用を前提に解説します。
- Arduino、もしくはArduino互換の基盤
- LED
- 可変抵抗
- アナログセンサー – 照度センサー、温度センサーなど、まずは扱いが簡単なもので
- ArduinoとPCを接続するUSBドライブ
ソフトウェア
- Pd-extended
- Arduino IDE
- Firmata
- Pduino
Arduinoの設定確認
まずは、Arduinoの設定をします。Arduinoオフィシャルページの手順に従って、Arduinoの設定をしましょう。
この説明に従って、以下の順で進めていきます。
- Arduino基盤とUSBケーブルを用意する
- Arduino環境をダウンロード
- ソフトウェアのインストール
- 基盤を繋ぐ
- Arduinoのアプリケーションを起動
- 点滅のサンプルを開く
- 基盤の種類を選択
- シリアルポートを選択
- プログラムをアップロード
Arduino実験用プログラム
[code lang=”cpp”]
int ledPin = 13;
void setup(){
pinMode(ledPin, OUTPUT);
}
void loop(){
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}
[/code]
無
事に13番Pinに繋いだLEDが点滅すれば準備完了です!
Standard Firmataのインストール
ArduinoとPdの連携は以下のようにイメージしてください。
ここでは、ArduinoとPdが、2つの外部プログラムを通して相互に連携しています。
Pd側
- Pduinoオブジェクトを使用したパッチを作成する
- OSCというプロトコルを介して、Arduinoへメッセージを送信
Arduino側
- Firmataのプログラム(Standard Firmata)をArduino.appから基盤へアップロード
- Pduinoから送られてきたOSCを解釈
- ArduinoのAnalog IN、Digital ON/OFF をコントロール
Arduino側の準備 – Firmataのインストール
では、まずArduino側から準備を始めましょう。
ArduinoにはFirmataと呼ばれる、ArduinoなどのマイコンとPCとのコミュニケーションのための汎用のプロトコルを使用します。そのために、ArduinoにFirmataのためのプログラムをアップロードして使用します。今回はArduinoのサンプルの中に掲載されている「Standard Firmata」というプログラムを使用していきます。
Arduinoのメニューから以下のプログラムを開きます。
- File > Examples > Firmata > StandardFirmata
このプログラムを、Arduinoに転送しましょう。これでArduino側の準備は完了です。今後Arduinoのプログラムを修正したり入れ替える必要はありません。
Firmataの動作確認
Firmataの動作確認には、プロジェクトページから配布されているテストプログラムを使用します。
このページの「Firmata Test Program」の項目にある
- For Mac OS-X: http://www.pjrc.com/teensy/firmata_test/firmata_test.dmg
をダウンロードします。プログラムを展開し、FirmataをアップロードしたArduinoがUSBに接続されている状態で「firmata_test.app」を起動します。
プログラムのメニューバー「Port」メニューから接続しているポートを選択すると、下記のようなテスト画面になります。Pin 2 〜 Pin 21までの入出力をGUIで操作しながら試すことが可能です。
Pduinoダウンロードと動作確認
次にPd側の準備をしましょう。
PdにはPduinoという拡張機能を使用します。下記のPduinoのプロジェクトページからダウンロードします。
このページの中にある「Pduino-0.5.zip」をダウンロードします。Firmataは既に準備してあるので必要ありません。
まず手始めに、展開したフォルダの中にある「arduino-test.pd」を起動してみましょう。下記のように全てのオブジェクトが点線にならずに実体として表示されたら、きちんとPduinoが読み込まれています。
Pduinoの使用手順
Pduinoを使用して、PdとArduinoを連携するには、いくつかの手順をふむ必要があります。下記のパッチはPduinoでArduinoへメッセージへ送るまでの手順を簡単に示したものです。このパッチを操作しながらPduinoの使用手順をみていきましょう。
まず、連携のためのメインのオブジェクトとなる「arduino」オブジェクトを配置します。このarduinoオブジェクトにメッセージを送ることで連携のための設定をしていきます。
1. デバイスのシリアルポートの番号を調べる
arduinoオブジェクトに「device」というメッセージ入力します。すると、Pdのコンソールに使用可能なシリアルポートの一覧とその番号が表示されます。例えば、以下のような形式になります。
[code]
1 /dev/tty.Bluetooth-PDA-Sync
2 /dev/tty.usbserial-A900ceWs
[/code]
例えば、この場合は「/dev/tty.usbserial-A900ceWs」を使用するので、デバイス番号は「2」になります。
2. デバイス番号を指定してシリアルポートをオープン
次にこの取得したデバイス番号を利用して、シリアルポートをオープンします。「open 《番号》」というメッセージをarduinoオブジェクトに入力します。念のため、openする前に「close」メッセージを入力して確実にポートを閉じておくと良いでしょう。このパッチではcloseの入力とあわせて、openのポート番号を変更できるよう工夫しています。
3. Pin Modeの設定
Arduino IDEを使用する際と同様に、Arduinoの全ての入出力は、使用する前にPinModeを設定しなくてはいけません。arduinoに「pinMode 《ピンNo.》《モードNo.》」というメッセージを入力することで設定します。モード以下のように決められています。
※ 設定するピンNo.が10番だった場合
- pinMode 10 0 (pinMode 10 input) – Digital In : タクトスイッチなど
- pinMode 10 1 (pinMode 10 output) – Digital Out : LEDの点灯など
- pinMode 10 2 (pinMode 10 analog) – Analog In : 各種センサーの値の入力
- pinMode 10 3 (pinMode 10 pwm) – PWM : PWD(LEDの明度調整)
- pinMode 10 4 (pinMode 10 servo) – Servo : サーボモーターのコントロール
4. 値の送受信
シリアルポートとPinModeの設定が完了したら、いよいよ値を送受信します。このパートは送受信する内容(Digital/Analog)(Input/Output/PWM/Servo)によってやり方が異る部分ですので、以下のセクションで順番に解説していきます。
5. シリアルポートを閉じる
終了する際には、最後にシリアルポートを閉じて他のプログラムからも使えるようデバイスを開放します。「close」メッセージを入力すると、シリアルポートが閉じられます。
LEDを点滅させる
では、まず手始めに、設定の際にArduino IDEで作成したLEDを点滅させる簡単なプログラム(Blink)のPdバージョンを作成してみましょう。LEDを点滅させるのは、Digital Outなので、PinModeは「1」になります。LEDは、13番ピンに接続すると仮定します。まずPinModeの設定は以下のメッセージとなります。
- pinMode 13 1
次に、Digital OutのOn/Offを切り替えます。そのためには「digital」メッセージをarduinoオブジェクトに入力します。具体的なメッセージは以下の形式となります(13番ピンにLEDが接続されていると仮定しています)。
- digital 13 0 – LED消灯
- digital 13 1 – LED点灯
この点灯消灯のタイミングをmetroを使用して定期的に切り替わるようにしてみましょう。以下のようなパッチとなります。
PWMで、LEDの照度を調整
PWMとは、パルス幅変調(パルスはばへんちょう、pulse width modulation)を省略した名称です。高速に変化するパルス波の幅を調整することでLEDの明度をなめらかに変更したように錯覚させることが可能となります。Arduinoでは、PWMに対応したピン(例えば、Arduino UNOでは、3,5,6,9,10,11番)を活用してあらかじめPWMで制御する機能が付随しています。PWMにするためのPinModeの番号は「3」です。例えば11番ピンを使用すると仮定した場合は、以下のメッセージを入力します。
- pinMode 11 3
あとは、0.0〜1.0の範囲で明さを指定します。その際には「pwm 《ピン番号》《値》」というメッセージにする必要があります。例えば以下のようになります。(11番ピンの場合)
- pwm 11 0.0 – 完全に消灯
- pwm 11 0.2 – 1/5の明るさ
- pwm 11 0.5 – 半分の明るさ
- pwm 11 0.8 – 4/5の明るさ
- pwm 11 1.0 – 通常の明るさ
この仕組みを利用した、スライダーでLEDの明るさを調整するパッチを作成してみましょう。
さらに工夫を加えて、オシレータのSin波の波形を明るさに変換して、なめらかにフェードイン/フェードアウトするLEDを作成してみましょう。
可変抵抗の値をPdで受信
では次に、Analog Inを試してみましょう。まず初めに単純な回路から試してみたいと思います。可変抵抗(半固定抵抗)を1つ準備して、その出力をAnalog Pin 1に接続する回路をブレットボードで作成しましょう。
このアナログ入力を受けとるには以下のようなパッチを使用します。
アナログ入力のピンを有効にするには、「analogIns 《Pin番号》1」というメッセージをarduinoオブジェクトに入力してください。例えば、1番ピンをアナログ入力を使用したい場合には、以下のようなメッセージとなります。
- analogIns 1 1
Arduinoに入力されたアナログ値を取り出す際にも工夫が必要です。アナログの出力は以下のような形式のメッセージとして、arduinoオブジェクトの第1アウトレットから出力されます。
- analog 《ピン番号》《値》
例えば、アナログピンの1番に、0.25の値が入力された場合には以下のメッセージが出力されます。
- analog 1 0.25
このメッセージを分解して値だけをとりだすには、「route」オブジェクトを使用します。
これらの機能を統合すると以下のようなパッチとなるでしょう。
センサーを繋げてみる
では、可変抵抗ではなくセンサーをつないでその値が取得できるか試してみましょう。ここでは照度センサーを使用した例を示します。下記のようにブレッドボードで配線してください。Pd側のパッチは先程のままで値を取得できるはずです。
まとめ
今日の内容はここまでとします。ここまでで、PdとArduinoの連携の基礎は理解できたのではないでしょうか。次回はこの連携を使用して、Arduinoで取得したセンサーの情報をもとにPdで音響合成やサンプリングプレイバックを試していきます。