2011年5月26日木曜日

XBee を使ったWireless MIDI 送信

以前、XBee のAT コマンドによる設定で、通信速度を任意の値に設定できることを紹介しました。
MIDI の速度(31.25kbps) にセットすれば、原理的にはMIDI も飛ばせるはずです。
タイミングがずれたり、データの取りこぼしがあると演奏が台無しなので、実用にはならないかも知れませんが、実験してみます。
(MIDI は NOTE OFF が取れなくて音が鳴りっぱなし、ということが良く有ります。)

まずは XBee (series 1) のATコマンドの要点を復習します。

・+++ を送り、1秒経過後に AT コマンドモードに入る
・ATCN を送るか、最後のコマンドから 10秒たつとATコマンドモードを抜ける
・ATBD で通信速度を変更した場合、AT コマンドモード終了時から、新しい通信速度になる
・ATWR で設定保存をしない場合、電源OFF で元の値に戻る

ここで重要なのは、「31.25kbps」という値が一般的なものではない、という事です。
Arduino IDE や CoolTerm では31.25kbps の通信ができないため、一度設定すると接続できません。※Arduino を使って戻す方法を後述します。
XBee の設定値は ATBD に続けて16進数で入力します。(31.25kは 31250、16進数では 0x7A12です。)

今回のコマンド入力の流れ

+++ :1秒まつ
ATBD7A12:通信速度の設定コマンド(7A12 は 31250 bps)
ATWR:設定保存コマンド
ATCN:コマンド終了


これを、送信側・受信側、2台のXBee に行います。


構成はこのようになります。




Fio は電源として使っているだけなので、プログラムは不要です。
(受信側は純粋なXBee モジュールだけで OK です。)

Arduino Uno のプログラムはこの回と全く同じです。
実際に音を鳴らしているのは、iOS App のbs-16i です。詳細はこの回を参照して下さい。





追記:Arduino によるXBee の通信速度設定です。31.25kbps を選択できるシリアルターミナルはないと思うので、元の設定に戻すときにこれを使いました。(Serial.begin の値が現在の値、ATBD が変更後の値です。)

//
// XBee baud rate settings using AT Command by Arduino.
// This sample set baud rate from 31.25kbps to 57.6kbps.
//

void setup() {
pinMode(13, OUTPUT);
digitalWrite(13, HIGH); // LED on

// Set MIDI baud rate:
Serial.begin(31250); // XBee's current baud rate.

delay(1000);
Serial.write("+++"); // Enter AT command mode.
delay(2000);


Serial.write("ATBD6"); // Select baud rate for XBee.
Serial.write(0x0D); // Send Carriage Return code.

// ATBD3 :9600
// ATBD4 :19200
// ATBD5 :38400
// ATBD6 :57600 ... for Firmata, for Fio wireless programming
// ATBD7 :115200
// ATBD7A12 :31250 ... for MIDI


delay(2000);
Serial.write("ATWR"); // Save settings.
Serial.write(0x0D);
delay(2000);
Serial.write("ATCN"); // Exit AT Command mode.
Serial.write(0x0D);
delay(100);

}

void loop() {
digitalWrite(13, HIGH); // LED on
delay(1000);
digitalWrite(13, LOW); // LED off
delay(1000);
}


2011年5月25日水曜日

USB Host Shield (ボードテスト篇)*訂正*

前回、やっとのことでUSB ホストシールドを動かしました。
次は USB Bluetooth やUSB MIDI をやってみたいのですが、とても難しそうです。
ここで、USB Host Shield がうまく動かないときのための、確認ツールを紹介します。

ライブラリ付属のExamples にboard_test.pde というスケッチがあります。
これをArduino IDE でコンパイル -> アップロードします。

Serial 通信をするので、115,200 bps で接続します。

一連の流れはこのような感じです。



途中2回、Press any key to continue ... で停止するので、何かキーを押します。
(Arduino IDE のシリアルモニタで接続している場合は、キーを押した後 Enter が必要です。)

最後に、USB 機器の接続テストで、Waiting for device connection ...
となったら、何かUSB 機器を接続します。

上記は上手くいった例です。
途中、GPIO のテストでfailed になっていますが、このテストは、GPIN0 とGPOUT0, GPIN1 とGPOUT1, ..., GPIN7 とGPOUT7 を接続した状態で行います。GPIO の機能はUSB とは関係ないおまけ機能なので、テストしなくても良いのですが、こんな感じでテストしてみました。(ちょっと大げさですが、、、)


GPIO テストOK の場合。


接続するUSB 機器によっては、全く応答がなかったり、ひたすら
USB state machine reached error state

というエラーが出る、といった状態になりました。


使いたかった KORG の nano KEY は、応答が無かったので無理そうです。(nano KONTROL, nano PAD も同様)


どなたか使えている方、いませんか?


*訂正と追記*
すみません、別の記事で書いていた、電圧の問題だったようです。

AC アダプタ(12V) をつなぐ事で、KORG nano KEY をはじめ、エラーになったと書いた USB 機器もすべて、認識できました。
上記のようなエラーになる場合は、USB 出力の電源が+5V 出ている事を確認してください。
(Arduino の電源がUSB バスパワーの場合、5V 未満です。)

USB Host Shield (HID キーボード篇)


USB ホストシールドは、Arduino に各種USB デバイスを接続することができるシールドです。
今月行われた Google I/O 2011 にて発表された Android Open Accessory Development Kit (ADK) のリファレンスボードが、Arduino + USB Host Shield と同等の構成だったことから、注目度が急上昇しています。
(ADK 対応デバイス (Android 3.1 or 2.3.4以上) を持っていないので、そちらの話題は当面扱いません。)

Sparkfun 製の同等品が、日本でも簡単に入手できます。(→千石電商SwitchScience
私は大分前に買ったのですが、、、そのまま手つかずにしていました。
USB のクラスライブリに相当するものが整っておらず、使い方が分からなかったためです。

Sparkfun のUSB ホストシールドは、古いもの(DEV-09628)と新しいもの(DEV-09947)で、配線が異なっています。
複数のサイトを参考にする場合は要注意です。
新しいものは、開発者のサイトのライブラリがそのまま使えます。
(#define MAX_GPX 7、#define MAX_RESET 8 に変更する、とある場合は古い版です。 7, 8 ピンが入れ替わっているだけなので、私は基板の配線を新しい方に合わせて修正しました。)


新旧USB ホストシールド。Arduino と連結するピンヘッダは別売りです。

ここ (GitHuB)からライブラリのダウンロード
(私がダウンロードしたのは felis-USB_Host_Shield-a59ba5b.zip という名前でした。)

解凍して、フォルダ丸ごと ~/Documents/Arduino/libraries へコピー
(そのままの名前だと記号を含むためエラーになるので、フォルダ名をUSBHost にしました。)


Arduino IDE を再起動して、インストール完了


darran さんのUSB Keyboard Passthrough をやってみます。

USB ホストとして、キーボードの入力を受け取り、前回紹介した atmega8u2を HID キーボード化したArduino Uno を使って、USB キーボードとしてPC に送り出します。

kbd_usb_passthrough.pde をArduino IDE で開きます。

コンパイルするとError になりました。

'EP_RECORD' does not name a type
など、いろいろ言われる場合 ('MAX3421E' does not name a type, 'USB' dose not name a type) は、上記ライブラリがインストールできていません。
ライブラリの場所(Arduino フォルダの libraries の中)、名前(記号を含まない) を確認してください。ライブラリの読み込みには Arduino IDE の再起動が必要です。

kbd_usb_passthrough.cpp:2:17: error: Spi.h: No such file or directory
#include <spi.h> でerror になる場合は、この行をコメントアウトします。
(現在のライブラリで、この記述は不要です。→根拠はこちら


コンパイルができればあとは通常通り、Arduino Uno に Upload をします。
その後、前回同様、DFU モードでatmega 8u2 にArduino-keyboard-0.3.hex を書き込みます。

後はUSB ホストシールドを載せて、USB キーボードを接続、Arduino Uno をキーボードとしてPC に接続すれば、完了です。
(キーボードの実験をするときは、事前にテキストエディタなどを開いておいた方がよいでしょう。暴走して勝手に入力されると困るので。)

これで完成、、、と思ったのですが、私はうまく行きませんでした。
いろいろ試したのですが、「キーボードが悪い」という結論に達しました。


使っていたキーボードは USB ハブを内蔵していたため、複合デバイスになっているのだと思います。このプログラムでは、プレーンなUSB HID キーボードしか認識できません。
他のキーボードもトラックパッド内蔵だったりしたため、押し入れを引っくり返してようやく普通のキーボードを発見。動作確認ができました。

それでも上手く行かない場合は Examples に入っている board_test.pde を実行してみましょう。何かわかるかもしれません。(こちらに手順を書きました)
私の場合、Uno では動作しましたが、クロックの精度が必要なためか、eJackino (セラロック仕様) ではNG でした。(こちら にClock を確認するように、とあります。)

また、Arduino をUSB バスパワーで動作させていると、シールドへ給電する Vin の電圧が低くなり、結果的にUSB Host シールド上のUSB ポートから出力される電圧(Vbas) が低くなってしまいます。
今回の実験では問題なかったのですが、接続する機器によっては動作に影響があるかもしれません。AC アダプタ (7〜12Vが適正) から給電するか、こちらのサイトの方法が参考になると思います。


2011年5月21日土曜日

Arduino Uno DFU プログラミング

***(9/28)追記:Arduino Uno R2 というバージョンが出たので、こちらも参考にしてください。
***


Arduino Uno とそれ以前のArduino シリーズでは、USB シリアル変換部が異なります。以前は FT232RL という専用IC でしたが、Uno は atmega8u2 という、AVR マイコンを使用しています。

これまで、特に意識せずに使って来ましたが、このマイコン自体もプログラミング可能です。USB HID (キーボード、マウス、ジョイスティック)やUSB-MIDI などのデバイスも作成可能とされています。

もともと、そこに興味があってUno を購入したのですが、Arduino IDE とは別にAVR の開発環境が必要だったり、書き込みのためのプログラムが必要だったりと、不明な点が多々有り、手を出せずにいました。
最近、制作例やドキュメントがWeb 上にあがってきたので、挑戦してみます。

参考にしたのは以下のサイトです。

Arduino.cc - Updating the Atmega8U2 on an Uno or Mega2560 using DFU

darran さんのArduino Hacking

Arduino.cc - MIDI Note Player using the MIDI firmware for the 8U2 (Uno and Mega2560 only)


言葉の整理
通常のArduino 開発で使わない用語が出てくるので、解説します。

DFU (Device Firmware Upgrade) モード:atmega8u2 のプログラムを書き込むモード。
Arduino Uno の atmega8u2 には「DFU ブートローダ」が書き込み済みで、AVR ライタなどがなくても、通常のUSB 接続でプログラムを転送することができます。

LUFA (Lightweight USB Framework for AVRs) :AVR 用の様々なUSB デバイスクラスのライブラリを公開しているプロジェクト。

dfu-programmer:Mac でDFU モードのAVR デバイスにプログラムを転送するためのソフト(コマンド)。
MacPorts のdfu-programmer は0.5.2 で、このバージョンではNG かと思ったのですが、このバージョンでの実行例がArduino.cc にありました。

HEX ファイル:コンパイル後のプログラム、AVR に転送する。

atmega8u2 を書き換えてしまうと、メインのatmega328p にプログラムの転送ができなくなります。
ICSP などの手段が無い場合は、メインプログラムの更新時に再度 DFU モードでUSB シリアル変換のプログラムを書き込みます。

・Arduino-Uno オリジナルの USB-Serial 変換用HEX (Arduino-usbserial-uno.hex)
 Arduino IDE のバンドル(Arduino.app)の中にもあります。

・darran さんのキーボード用 HEX Arduino UNO Keyboard HID version 0.3 (Arduino-keyboard-0.3.hex)

・morecat_lab さんの MocoLUFA (MIDI.hex)

書き込み手順
1) Arduino のメインプログラムをatmega 328p に書き込む
2) atmega8u2 をDFU モードにする (→参考:http://arduino.cc/en/Hacking/DFUProgramming8U2
3) atmega8u2 にプログラムを転送する

Arduino プログラム更新手順
1) atmega8u2 をDFU モードにする
2) atmega8u2 にUSBシリアル変換のプログラムを転送する
3) Arduino のメインプログラムをatmega 328p に書き込む
4) atmega8u2 をDFU モードにする
5) atmega8u2 にプログラムを転送する


非常に面倒なので、本格的にデバッグすることを考えると、別の書き込み手段が欲しくなりますね。


iPad Camera Connection Kitで iPad に、USB Keyboard やUSB MIDI として認識させることができました。

残念ながら、このアダプタはiPhone/iPod Touch では使用できません。また、あまり大きな電流を取ることができません。

2011年5月20日金曜日

Puredata で早押し判定

別サイトの企画で、「アタック25」風の描画を作ったので、こちらでは早押し判定機を作ってみます。
精度を考えるとArduino で判定した方が良いですが、練習をかねてPuredata で作成しました。
Bang の到来が速いものを判定します。

あれこれ組み合わせて、こんな形になりました。

中央のBang (キーボードのSpace に反応) でスタートし、左上の4つのBang (キーボード(A, S, D, F) に反応) のうち、1番早いものを表示します。
右半分はおまけの時間計測です。

上の図は複雑なので、こちらで仕組みを説明します。
[spigot] は第2インレットが0 でないとき、第1インレットを通過させる、弁のようなものです。
スタートで弁を開放し、最初のメッセージが通過したときに弁が閉じるようになっています。
(分かり易いようにToggle をつけていますが、なくても動きます。)

1位だけの判定で、2位以下の判定はしていません。(「アタック25」を想定しているので、、、)

追記:順位判定も作ってみました。

[moses] は、通常は第1アウトレットから出力、指定した値以上のときは、第2アウトレットから出力します。[spigot] のように止めるのではなく、2番目以降を次の処理に回しています。

Pduino や Quartz Composer と組み合わせたり、Puredata で音を鳴らしたり、拡張して使ってみて下さい。

Download:hayaoshi.zip


末筆ですが、児玉清さんのご冥福をお祈りいたします。



2011年5月19日木曜日

Arduino に LED をたくさんつけたい


前回のスイッチの応用で、LED も18個までなら簡単に繋げる事が出来ます。
しかし、LED はスイッチに比べて電流を喰います。
Arduino のドライブ能力はどの程度でしょうか?

ATMega シリーズの仕様書によると、

29. Electrical Characteristics
29.1 Absolute Maximum Ratings
DC Current per I/O Pin ................................................ 40.0mA
DC Current VCC and GND Pins................................. 200.0mA

となっています。つまり、I/O ピンあたり40 mA、全体で200 mA が限界。
LED 1つに10mA 使うとすると、18本同時点灯などは危険です。

今回は LED I/O 直結 18個 ではなく、8x8 の LED Matrix を使ってみます。LED 数は64個。
マトリックスLED は縦(ROW)、横(COLumn)を組にして、高速に切り替えながら点灯(ダイナミック点灯)します。

LED は秋月で購入した BU5004-R (スタンレー電気) を使用しました。
(廃盤なのか、Web 通販には載ってないようです。赤・緑タイプ BU5004-RG の赤のみ版)

COL (Anode) 8本、ROW (Cathode) 8本のピンが出ているのですが、順番はばらばらです、、、


プログラムは、Arduino IDE 付属のサンプルを使います。
FIle > Examples > 7.Display > RowColumnScanning

解説はこちら(→arduino.cc)。
このサンプルでは、Lumex LDM-24488NI というMatrix LED を使用しています。

本来はプログラムの修正が必要なのですが、、、よく見るとROW (Anode) とCOL (Cathode) を逆に接続すれば良いようです。

プログラム中で
// 2-dimensional array of row pin numbers:
const int row[8] = {
2,7,19,5,13,18,12,16 };

// 2-dimensional array of column pin numbers:
const int col[8] = {
6,11,10,3,17,4,8,9 };

となっていますが、row の 2,7,19,5,13,18,12,16 ピンを BU5004 のCOL 1...8 へ、col の6,11,10,3,17,4,8,9 ピンをBU5004 のROW 1...8 へ、それぞれ接続します。
(BU5004 のCOL 1...8, ROW 1...8 はピン番号ではないので注意)

サンプルではLED とI/O を直結しています。ダイナミック点灯なので、それほど電流が流れないためでしょう。
私は心配性なので、1列ごとに抵抗(120Ω) をつけました。

このサンプルは、a0, a1 にボリュームを接続し、X, Y の値として使用します。
ボリュームを動かすと、点灯箇所を移動させる事ができます。
(手直なボリュームがなかったので固定抵抗で代用)





ついでに、少し書き換えて任意のパターンを表示できるようにしてみました。
(冒頭の写真はテトラポッドのつもり、、、)
LCD カスタムキャラの時と同じような感じでビットマップデータを作成します。


const byte dots[8] ={
B00011000,
B00100100,
B00100100,
B00100100,
B01011010,
B10001001,
B10011001,
B01100110
};

void setPatterns(){
for (int x = 0; x < 8; x++) {
for (int y = 0; y < 8; y++) {
pixels[x][y] = !bitRead(dots[7-x],7-y);
}
}
}

loop() の中で、readSensors(); のかわりに、setPatterns(); を呼び出します。X, Y がねじれているので無理矢理な式になっていますが、本格的に使う場合は、配線なども考えて整理した方が良いでしょう。パターンを複数用意して順番に表示すれば、アニメーションも可能です。


ところでこのサンプルコード、LED のON/OFF 状態(1bit) 64個 を16bit の int 64個 で保持しているのが、いかにも Arduino 的ですね、、、

2011年5月18日水曜日

Arduino にスイッチをたくさんつけたい


Arduino Uno には、スイッチを何個繋げられるでしょうか?
少し前に、AppleStore のイベントで、「カスタネット30個をスイッチにして、Quartz Composer に送る」という事をやったのですが、そのときはMac との接続に Ethernet Shield を使っていた事もあり、スイッチ 30 個の読み取りに Arduino を 3台も使っていました。

その当時は気づいていなかったのですが、Analog ポートも普通のDigital ポート として使う事が出来ます。Arduino Uno のI/O は Digital Port が D0-D13 までの14 個、Analog Port がA0-A5 の計20個あります。D0,D1 は通信に使うので、残り18個にスイッチを繋いでみましょう。

今回も Pduino を使います。



Pduino は右上のスイッチパネルのような部分で、各ポートの設定を行うことができます。
A0-A5 は16-21 に対応しています。2-13(D2-D13), 16-21(A0-A5) をすべてインプットにします。

内蔵プルアップをON にします。
[digital N 1( というメッセージでポートN のプルアップをON にすることができます。

ここで、画像の中に [digital 13 1( が無いのには理由があります。
Arduino Uno のD13 はLED が繋がっています。このままプルアップしても、LED に電流が吸い取られてしまい、High になりません。
そこで、この LED をプルダウンとみなし、D13 だけ正論理にします。
(他のスイッチはGND に接続しますが、D13 だけ+5V に接続します。)

回路図、というほどのものではありませんが、典型的なマイコンのスイッチ接続と、今回(Arduino-Uno) の接続図。



Pduino に戻って、digital 値の取り出し口に [route] パッチを追加し、16-21 の値を取り出せば完成です。必要に応じて、D13 を反転させると良いでしょう。
(無理にD13 を使う必要もないですが、、、)

これ以上増やす場合は、PC のキーボードと同様の キーマトリックススキャン方式か、先述のイベントで使った Arduino 連結方式 などが考えられます。これらも今後紹介する予定です。

2011年5月17日火曜日

Puredata で簡易サンプラー その3

その1 で作った簡易サンプラーに音階をつけてみました。


もともと、再生速度を変えられるようにしていたので、それを使っています。
1オクターブ上の音は周波数が 2倍になるので、再生時間を2倍にします。
その中間の音は、平均率の場合、 n 半音上の音は 2^(n/12) 倍にします。(12半音=1オクターブ で2倍になる)

C とかD とか、音名が振ってありますが、録音した音を C とした、相対音階です。
(音程の調整はしていません。)

サンプラーの呼び出し部は、それぞれの音毎にあるので、外部サブパッチにまとめました。


鍵盤状にBang を並べて、MIDI 入力にも対応させました。

MIDI を使うときは、Pd-extended メニューの Preferences から、MIDI settings ... を設定します。

上手く行かないときは、Media メニューの Test Audio and MIDI もチェックしてください。



このMIDI はケロミンを想定しています。
ちょっと大掛かりですが、これでケロミンを自分の声で演奏することができました。



Puredata で簡易サンプラー その2

前回は Puredata(以下 Pd) で簡易サンプラーを作成しました。
今回はPduino を使って Arduino に接続したスイッチに反応させます。

Pd は配線が込み入ってくると、なんだか分からなくなってしまいます。
Pduino のサンプルは最初から凄いことになっているので、不要なところは消して行きましょう。

こんな感じになりました。


最初に IO ポートの設定をします。
StandardFirmata_2_2_forUNO_0_3 の場合、初期値は
・A0-A5 はアナログ入力
・D0,D1 は通信用のため使用不可
・D2-D13 はデジタル出力 (初期値:LOW)
になっています。

今回はD11 を入力(スイッチを接続)、D13 を出力(LEDを接続、またはボード上の[L]) にします。... (1)
input に指定しただけでは、内蔵プルアップが ON にならないようです。
そこで、(2) の [digital 11 1( というメッセージでプルアップを有効にします。

Arduino にスイッチ(SW) を接続してみましょう。
(スイッチが無くても、D11 とGND をショートすれば、スイッチの替わりになります。)


この状態で、(4) のトグルが、D11 に接続したスイッチに反応することが確認できます。
(反応しない場合は、Firmata との通信ができているか確認してください。)

(3) の [digital 13 $1( というメッセージは、上のトグルをON/OFF すると、
[digtal 13 1( と[digital 13 0( が交互に送られます。これにより、Arduino のボード上のLED (L) がON/OFF します。


次に、(4) のD11 と、(3) のD13 を接続します。... (5)
これで、スイッチのON/OFF で、LED のON/OFF ができます。
(論理は反転しています(スイッチON でLED OFF)。間に[== 0] をいれれば、再度反転してスイッチ ON で LED ON になります。)

次に、スイッチON のときに、Bang を送るようにします。トグルにそのままBang を接続すると、ON/OFF の両方でBang が出てしまうので、[sel 0] で、トグルがOFF (D11 のスイッチがON) になったときだけ、Bang を出すようにします。 ... (6)

これで、スイッチが押されたときに Bang が出るようになりました。
(D13 のLED は確認用なので、接続しなくても構いません。)

この後は、前回のサンプラーのBang (Play_1) と、今回のBang を接続すれば完了です。
どちらかをコピー&ペーストして、1つのファイルにしても良いのですが、別の方法もあります。Bang のProperties (右クリックして選択)を表示します。


Messages という欄に、send-symbol, receive-symbol という項目があります。
このsend - receive は、線でつないだときと同じように、指定したsymbol 同士を接続する機能です。
この接続は別ウインドウでもOK です。つまり、前回のファイルと、今回のファイルを同時に開いておき、今回のBang にsend-symbol を、前回のBang にreceive-symbol を指定する事で、ウインドウをまたいだ接続ができます。


ケロミンの声をサンプリングするデモ動画



Puredata で簡易サンプラー その1


Puredata (以下Pd)で簡単な音を出すパッチの紹介です。
「サンプラー」とは、マイクなどで録音(サンプリング)した音を、任意のタイミングで再生するものです。
Arduino (Pduino) と組み合わせて、外部のセンサーやボタンに反応して音を出す、といった使い方を想定しています。

Pd は一般的な音楽ソフトのように、「音楽ファイルを再生」といった機能がありません。
Array (配列) にサンプルデータを記憶し、音として再生する、といった手順をとります。

今回は、sample という名前の 88,200点(44.1kHz サンプリングで 2秒分)のArray を使っています。
Array へのデータ書き込みは [tabwrite~ sample] で行っています。
その上の [Sampling_from_Mic] をBang すると、[adc~] (A/D Converter)から88,200点(2秒)、サンプリングします。

単純に再生するだけであれば、緑の[Play_2] をBang します。
すると、[tabplay~ sample] を使って、Array のデータを44.1kHz で取り出します。

取り出したデータは [dac~] (D/A Converter) に入力することで、音として再生されます。
(その間にある [hip~ 5](High-Pass Filter) は直流カットのため、[*~ 0.5] は音量調整のために入れています。)

・[dac~] の入力は、この例では Lch, Rch の2系統ありますが、データがモノラルなので、同じデータを入れています。
・[soundfiler] の周りはファイルの読み書きです。
・[; pd dsp $1;( は Media メニューの audio ON, audio OFF と同等の動作です。


水色の[Play_1] の方はもう少し複雑な読み出しをしています。
事前に作り込んだオーディオファイルなら良いのですが、マイクからサンプリングすると、どうしてもマウスのクリック音や、発声までの無音が入ってしまいます。
それらを取りたかったので、[Slider_1] を付けてみました。
(このSlider はArray と連動しているわけではなく、単純にサイズを合わせただけのものです。)

Array の波形を見ながら、不要な部分を[Slider_1] で指示します。
この値を [vline~] に入力します。
[vline~] に入力しているのは、Array の開始点、終了点、再生時間 の3つのパラメータです。
[/ -44.1] という部分で、通常の再生スピードとなります。この値を他の数値にすると、再生ピッチが変わります。うまく調整することで、音階も作れます。

[vline~] の出力を [tabread4~ sample] に入力する事で、開始点と再生ピッチを指定した再生が可能になります。



Puredata ファイル(zip 圧縮) : Download


2011年5月12日木曜日

PureData から Growl 通知


Growl はMac の画面上にメッセージを通知するソフトです。
何を通知するかというと、対応アプリケーションのメッセージです。
メールやメッセンジャーサービスだけでなく、様々なソフトが処理の完了などの通知を行います。


この記事で知ったのですが、Terminal コマンド growlnotify によって、コマンドラインからもメッセージが送れるとのこと。(growlnotify はGrowl と一緒にダウンロードされますが、別途インストールする必要が有ります。)

ということは、前回同様、Puredata からshell パッチを使って送れるのです。





さらに、記事で紹介されている iOS アプリ「Boxcar」を使えば、iPhone にも通知できます。
Arduino に接続したセンサー の値を Pduino で読み取って Growl 経由でiPhone に通知!
なんてことも、プログラムなしで出来てしまうのです。


今回の図にある、"Hello" は送れましたが、"Hello, World" や"Hello World" は期待通りになりませんでした。
どうやら PureData のメッセージオブジェクトはスペースやカンマが区切り文字として扱われ、それらをエスケープする文字や手段(" クオートで囲むなど)がない(スペースを含んだメッセージが送れない)ようです。

何か回避方法は無いのでしょうか、、、?


2011年5月11日水曜日

OSC で iTunes をコントロールする


これまでに、Arduino や iPhone を使った OSC の送信を紹介してきました。
OSC 対応のソフトはPuredata やQuartz Composer などがありますが、他のソフトもコントロールできると便利です。
iTunes など Mac のソフトの多くは、AppleScript という、コマンドによる操作手段が用意されています。

そこで、OSC を受信して、AppleScript を飛ばすソフトを探してみました。
OSCulator というソフトでできるらしいのですが、 $39-... ちょっと高い。

AppleScript はTerminal コマンドの osascript でも実行可能です。
そこで、Puredata のshell パッチを使い、osascript コマンドによってAppleScript を実行してみます。
(以前に、Quartz Composer から同じようなことをやった気もしますが、、、)

本来なら、shell に osascript -e 'tell application "iTunes" to play' というメッセージを投げれば良いと思うのですが、これではエラーに。いろいろ試した結果、



1. AppleScript Editor でAppleScript を作成、保存する
2. 1で作成したスクリプトをフルパスで起動するコマンド文(Message Object)を作成
3. Shell Object に2 のMessage を送る

例えば、「~/Documents/itunes-play.scpt」に保存したAppleScript 起動する場合

osascript /Users/YOUR_USER_NAME/Documents/itunes-play.scpt

このようなメッセージをshell に送れば良いことが分かりました。


事前にPuredata とこのPatch を起動して準備する必要がありますが、反応は良好です。
スライダーなどで大量のOSC を送ると、処理が終わる前に次のOSC メッセージが来てしまうので、
ignor という、メッセージを制限するパッチを使ってみました。



iTunes のボタンに対応するAppleScript コマンドはそれぞれ
再生(停止):playpause
次の曲:next track
前の曲:previous track
ボリューム:set sound volume to 100 -- (0 ... 100)
です。


再生(停止)の場合は

tell application "iTunes"
playpause
end tell

だけでOK です。
ボリューム調整は引数が必要なので、

on run argv
tell application "iTunes"
set sound volume to argv
end tell
end run

このようなスクリプトにします。
このページをMac OS X で見ている場合、次のリンクから AppleScript Editor を起動できます。




2011年5月8日日曜日

Arduino XBee Shield Wireless プログラミング

前回、Arduino Fio のWireless プログラミングを行いました。
その最後に書いた通り、Arduino Uno + XBee Shield ではうまく行かなかったので、今回はそれを検証します。

エラーはこの通りです。

avrdude: stk500_recv(): programmer is not responding


今回はeJackino (この本の付録基板)という Duemilanove (Uno の1つ前のモデル) 相当のArduino 互換ボードを使ってみました。
すると、あっさり書き込みOKでした。


折角なので検証のため、直結をやめてケーブル接続にします。必要な配線は

電源 (+5V,Xbee Shield 上に3.3V のレギュレータが載っています。Xbee は3.3V 動作です)、GND、TX(D1)、RX(D0)、Reset の5本です。

線を外すことで、わざとエラーをおこします。



通信ができていないときのエラー(RX or TX を外したとき)

avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_recv(): programmer is not responding

リセットができていないときのエラー(Reset を外したとき)

avrdude: stk500_getsync(): not in sync: resp=0x30
avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51

となりました。

さらに、Arduino Uno とeJackino で使っているマイコンを入れ替えたり、このページを参考に、リセット回路の強化を試してみました。リセット信号直列のコンデンサは XBee Shield 上に載っていたので、追加したのはNPN トランジスタ(2sc1815) と抵抗10kΩのみ





結果

本体設定 (Tools > Board)マイコン
(ブートローダー)
リセット
回路強化
結果
eJackinoArduino Duemilanove
or Nano w/ ATmega328
Duemilanove相当なしOK
eJackinoArduino Duemilanove
or Nano w/ ATmega328
Duemilanove相当ありOK
Arduino
Uno
Arduino UnoArduino UnoなしError
Arduino
Uno
Arduino UnoArduino UnoありError
Arduino
Uno
Arduino Duemilanove
or Nano w/ ATmega328
Duemilanove相当なしError
Arduino
Uno
Arduino Duemilanove
or Nano w/ ATmega328
Duemilanove相当ありOK
Arduino
Uno
Arduino UnoDuemilanove相当なしError
Arduino
Uno
Arduino UnoDuemilanove相当ありError


Arduino Uno とDuemilanove は、ブートローダーが異なるため、そのあたりに原因がありそうです。
(5/15 追記:Uno のブートローダーが115kbps で書き込むらしいので、XBee の速度(ATBD) を115kbps にしてみましたが、やはりだめでした。)

結局、Uno のWireless プログラミングの方法は分かりませんでしたが、Duemilanove (相当) では問題なさそうです。
同じくDuemilanove 相当の「akizukino」こと、AE-ATmega 基板(秋月電子・150円) を購入したので、これを USBシリアルアダプタなしで作るのもありかなと思っています。

緑がAE-ATmega 基板、上の小さいのは eJackino mini と eJackino pico。

2011年5月7日土曜日

Arduino Fio (Wireless プログラミング篇)

Arduino Fio の XBee を使ったワイヤレスアップロードの紹介です。
前回は USB シリアルアダプタによる転送を行いました。

XBee (Series 1) を正しく設定すれば、USB シリアルアダプタは購入しなくても、Arduino IDE からプログラム転送する事が出来ます。
Fio の公式ページ (Arduino.cc) とFunnel のページ (funnel.cc) を読んだ上で、Mac OS X 上のArduino IDE (ver 0022) で使う場合に特化して説明します。

それぞれのページに、複数の方法が書いてありますが、XBee Config Tool というソフトを使うのが簡単です。
ハードウェアは2 台の XBee (Series 1) モジュール、1 台の Arduino Fio、1 台の XBee Explorer USB (USB アダプタ)を使っています。

[XBee モジュールの設定]
作業前に悩んだ以下の点を説明します。

1. AT コマンドによる設定は必須?

(結論) >> 不要です。XBee Config Tool を使うと、そのコマンド群のように設定されます。
 特別な理由がなければ XBeeConfig Tool を使うのが良いでしょう。

2. XBee ファームウェアのバージョンは?
>> http://funnel.cc/Hardware/FIO?userlang=ja
>> XBee無線モデムのファームウェアのバージョンを確認し、
>> 1.0.A.5または1.0.C.Dよりも古い場合にはX-CTUを使用してファームウェアを
>> アップデートする

(結論) >> XBee Config Tool で[Read] ボタンを押すと、表示されます。
 AT コマンド(ATVR) で調べることもできます。
 ファームウェアバージョンについては、最近購入したものであれば問題ないと思います。(Mac ではアップデートできなさそう)

3. XBeeConfig Tool は使えるの?Fio XbeeConfigTool とXBeeConfig Tool は何が違う?

>> http://arduino.cc/en/Main/ArduinoBoardFioProgramming
>> You can configure your radios using a terminal application,
>> or using X-CTU on Windows, or you can use the Fio XBee Config Tool.
>> This is a modified version of Shigeru Kobayashi's XBeeConfigTool.

(結論) >> この2つは同じものの様です。Funnelソフトウェアとして配布されているXBee Config Tool (のMac 版) は ver 1.0-r787 の場合、
funnel-1.0-r787/tools/XBeeConfigTerminal/application.macosx/XBeeConfigTerminal.app
にあります。付属のソースコード同士を比較しましたが、(空白や改行などの違いを除くと)Fio XBee Config Tool との違いは、ウインドウに表示される名称だけでした。
(Modify の結果が、Funnel の方にも取り込まれているようです。)

既に Funnel ソフトウェア をダウンロードしている場合は、あらためてFio XBee Config Tool をダウンロードする必要はありません。

4. XBee Config Tool の通信速度設定は?

(結論) >> 自動で設定されるようです。
XBee を57.6kbps にした場合と、9600bps にした場合と試しましたが、どちらでも大丈夫でした。

5. wireless bootloader が必要?

>> Wireless XBee/AVR Bootloading tutorial

(結論) >> 不要です。Arduino Fio を使う場合、この手順は読まなくて良いようです。


**********
実際の設定は

Mac で使うXBee モジュールの設定


Arduino Fio で使うXBee モジュールの設定

1. Serial Port を選択(XBee Explorer のポートを選択)
2. Mode を選択(Mac 側で使う方をProgramming radio に、Arduino で使う方をArduino Fio radio に)
3. Baud rate を選択(最近買ったものならATmega328 なので、57600 を選択)
4. PAN ID を設定(0000 からFFFF までの好きな値、2台とも同じ値にする)
5. MYID を設定 (0000, 0001 が自動でセットされるのでそのままでOK)
6. DLID を設定 (FFFF, 0000 が自動でセットされるのでそのままでOK)

選択・設定をしたら [Config] ボタンを押して書き込みます。
Arduino 側とMac 側と、別々の設定になるので、間違えないように印を付けた方がいいと思います。(MYID を書くと良いと思います。)

[ハードウェアの設定]


・Arduino Fio 側は、すでにジャンパがついていました。
・XBee Explorer 側は説明の通り、RTS とDIO3 をショートしました。

[Arduino IDE の設定]
・(Tools > Serial Port) XBee Explorer のポート(usbserial で始まる) を選択。
・(Tools > Board) Arduino Fio を選択。

あとは、Arduino Fio の電源をON にし、通常通りにアップロードすれば OKです。


いろいろと調べすぎてしまって大変でしたが、実際に必要な作業はとても簡単です。
同じ方法で、Arduino Uno + XBee Shield も試したのですが、こちらは上手く行きませんでした。(原因調査中)

2011年5月4日水曜日

Arduino Fio (導入篇)


Arduino Fio は「マイコンとXBee とリチウムポリマバッテリー(と adobe Flash)」の組み合わせを簡単にするために作られた、「Funnel I/O」というArduino 派生機種だったもので、現在は正式に Arduino ブランドとして販売されています。

細かい経緯はさておき、以前 XBee を買った際にこちらも買ってみました。
(予算がなくて追加の Xbee は買えなかったのですが、、、)

基本的な使い方は他の Arduino と同じですが、いくつか注意点があります。

1. Arduino には Arduino Uno などの5V 版と、Arduino Pro などの 3.3V 版があり、Fio は3.3V 仕様です。
2. USB 端子がありますが、電源(バッテリーの充電)専用です。通信機能はありません。


XBee 経由での書き込みはまたの機会にして、シリアルアダプタによる書き込みを行ってみました。


これは以前、別の要件で買った(そして使ってなかった)sparkfun のFTDI アダプタです。これを使ってみましょう。
FTDI アダプタも3.3V 仕様と5V 仕様があります。そして手持ちのこれは5V、、、

メーカーのサイトに説明がありますが、このアダプタはパターンカット&ジャンパ(ハンダでショートする)で 3.3V/5V 相互に変更可能です。
(もともと、FTDI のチップ(FT232RL) がそのような仕様になっています。)



しかし、また戻す事もあるかもしれないし、少し面倒、、、


ここで再検討。Arduino で使うATmega チップの電源仕様は1.8V 〜5.5V と広く、3.3V 版も5V 版も同じチップを使っています。じゃあ、5V で書き込んで良いんじゃないの?
ということで、パターン(→Schematic)を追ってみると、XBee モジュール(2.8 〜 3.4V)とバッテリー(3.7V) を外せば問題なさそう。

というわけで、5V で書き込み決行。


書き込みは、ヘッダピンを半田付けせず、押し当てる形で行いました。(これは公式ページにも書いてある由緒正しい方法です。)

試しにシリアルエコーバックのプログラムを書きこみ、そのままUSB 経由で通信を確認。
つづいて Firmata (StandardFirmataForFio) を書き込みました。
Fio 用のFirmata は先のFunnel のサイトからダウンロードできます。(Funnel は他にも便利なツールがあるので、別途紹介したいと思います。)

1.0-r787 の場合は、以下のファイルです。
funnel-1.0-r787/hardware/fio/firmware/StandardFirmataForFio/StandardFirmataForFio.pde

この回と同様、Pduino でXBee 経由の通信テストを行い、成功しました。


シリアルエコーバックプログラムの例
(シリアルの通信速度とXBee の通信速度を合わせます。Pduino 用に 57.6kbps にしているので、57600 になっています。)

//============================
void setup() {
Serial.begin(57600);
}
void loop() {
if (Serial.available()) {
Serial.print((char) Serial.read());
delay(10);
}
}
//============================