2011年7月4日月曜日

ADB で接続 (Android)

※Apple Desktop Bus の話ではありません。


最近 Android にも手を出し始めました。

Android とArduino を繋ぐ仕組みは、Android Open Accessory Development Kit (ADK) というGoogle オフィシャルなものがありますが、手持ちのXperia Arc (Android 2.3.2) は対応していません。

ADK 以前から、さまざまな有志の試みがありましたが、今回は いわたん さんのこの記事を参考に、Micro Bridge というものを使ってみました。
Micro Bridge はADB (Android Debug Brige) というプロトコルを使って、マイコン(Arduino) と通信する仕組みです。

・USB ホストの使えるマイコン (Arduino + USB Host Sheild) が必要。
・Android 端末はUSB 接続で、デバッグモードにする。

Micro Bridge はここからダウンロードします。

ServoControl.zip:Android のサンプルアプリ
MicroBridge-Arduino.zip:Arduino のライブラリ
usb_host_patched.zip:USB Host Shield のライブラリ(既にインストールしている場合は不要)

Arduino のライブラリの使い方はこの記事を、USB ホストシールドについてはこの記事を参考にしてください。
サンプルスケッチを使ってみます。

File > Examples >Adb

Demo、Logcat、Reboot、Shell、WriteFile

[Demo] は、Android 用のソフト Servo Control と通信するスケッチ。
サーボのコントロール (Android -> Arduino) と、アナログ値の読み取り (Arduino -> Android) が出来ます。
(サーボを持っていないので、A0 の入力電圧を可変させてみました。)

[Logcat] は Android のシステムログを表示する。
[Shell] は Android のShell にログインできる。
シリアルターミナルで57.6kbps で接続する (改行コードは LF)。

[Reboot] は動作できなかった。

Shell で
$ reboot
とすると、

reboot: Operation not permitted
(その操作は許可されていません)

と出るので、この端末では駄目なんだと思います。

[WriteFile] はSD カード上に hello という名前のファイル(中身はhello world) を作成する。

という、多彩なサンプルスケッチが収録されているので、何でも出来そうです。


2011年6月23日木曜日

小型WiFiルーター

先日の記事で紹介した、Planex MZK-RP150N
しばらく様子見、、と思ってましたが、うっかり買ってしまいました。


箱入りではなく、ブリスターの簡易パッケージですが、ボリューム感のある取扱説明書がついてきます。

今まで購入したルータの中で、最小かつ最安です。(約3,000円)


左から、Apple AirMac Express、Planex MZK-RP150N、Planex CQW-MRB

AirMac Express はプリントサーバーになったり、iTunes の音を飛ばすことができる変わり種ルーターです。出た当初は超コンパクト!と思ったものです。(USB 端子、光デジタルオーディオ出力付き、AC電源内蔵)
CQW-MRB はモバイルルーターで、バッテリーを内蔵。WAN 側は3G のUSB モデムを使用するこれまた変態機種。本体の半分近くがバッテリーなので、ルーター部は MZK-RP150N と良い勝負です。




Arduino & Ethernet Shield & eneloop と組み合わせて使う事を想定して購入しましたが、ここまで小さいとケーブルのボリュームが気になります。なんとかしなくては、、、


とりあえず、コンバータモード(Ethernet-WiFi ブリッジ)で家のLAN に参加させて動作確認。
Arduino のプログラムは Arduino IDE 付属のサンプルWeb サーバー (File > Examples > Ethernet > WebServer) です。

ルーターの設定はWeb ブラウザからできるので、特に難しくないと思いますが、電源投入後、完全に起動するまで少し待つ必要があります。(Arduino と組み合わせる場合、ルーター起動後にArduino をリセットすると繋がりやすいです。)

3,000円でこんな製品ができるなら、1万円くらいになっても良いので、http で操作できるGPIO (汎用入出力) が付くとうれしいです。

引き続き、XBee WiFI に期待しましょう。。

2011年6月21日火曜日

Bluetooth は素人でも扱えるのか?

Bluetooth は、元々PC と比べて非力な携帯電話用の規格だったことから、最近のリッチなマイコンでも扱うことが出来るようです。

しかしプロトコルスタックやらプロファイルやらで、単純なシリアル通信をするだけでも、とても大変です。ここは先人の成果を多いに利用させていただきましょう。

Arduino でBT というと、BT のプロトコル/プロファイル部を隠蔽して、ただの無線シリアルアダプタとして使えるようにしたBT シリアルモジュール(→例 Bluetooth mate ※注意:技的認証なし)を使うのが一般的です。

さらに、USB ホストシールドでUSB BT アダプタを使う例もありますが、Arduino には荷が重そうです。

別の手段を探ってみると、PICの24F シリーズという16bit のPIC マイコンに、USB ホスト機能を搭載したものがあり、それを使ったUSB BT モジュール用のプロトコルスタックがありました。


それを利用して、Android 端末からBluetooth でキャタピラ車をコントロールする、という内容をhrdakinori さんという方が公開していたので、やってみました。

ソースは何も変更せずにそのまま組んだだけですが、こんな感じになりました。



このプログラムは、2つのモータを制御するIC (Toshiba TB6612FNG) をコントロールしているので、各チャンネルに回転方向用の(CW/CCW)2つの信号と、1つのPWM 出力が出ています。
PIC用、Android 用のソースコードは、hrdakinori さんのサイト、または上記の動画にリンクがあります。
PIC のCPUボードは、オプティマイズの PIC24USB を購入しました。

ちなみに、BT のプロファイルは SPP (Serial Port Profile) を使っていますが、iOS のSDK ではSPP を使えないので、そのまま応用することはできません。

2011年6月15日水曜日

やっぱり無線?

某所にてテトラコントローラーポータブルを野外デモしてみました。
手に持っていれば注目はしてくれるのですが、テトラポッド自体を知らない人が多く、上手く説明できず、、、、

テトラコントローラーの次の計画は、外付けBOX との接続を無線化した、Wireless 仕様です。XBee がスイッチサイエンスさんで 1700円〜と大幅に値下がりしたので、1-Pod、1-XBee で、4つのつまみを独立させるのも面白いなと思っています。

iPhone に直結するには、WiFi で OSC (Open Sound Control)を使うか、Bluetooth HID (キーボード) 仕様にするのが候補です。(作れるかどうかは別問題)
WiFi といえば、XBee にWiFi タイプが加わるとのことで、6月末には製品が出るとのこと。


また、以前紹介したEthernet Shield + 無線ルーター構成に便利なルータがあったので紹介します。
(店頭でみかけただけで、購入はしませんでした)


バッテリーこそ搭載していませんが、USB バスパワー(5V/500mA) で動作させることを考えて設計されており、低消費電力を謳っています。
以前紹介した CQW-MRB2 よりも、小型で扱い易いのではないでしょうか?

XBee WiFi がどのような仕様なのか分かりませんが、WiFi Direct のような直結機能がなければ、外でデモする時は結局ポータブルルータが必要になりますね。



テトラコントローラー野外デモ、ケーブルが絡まって大変でした。
早く無線化しなくては、、、

2011年6月1日水曜日

USB Host Shield (PaSoRi篇)


PaSoRi はSONY 製の、USB FeliCa リーダーの商品名です。

FeliCa は、Suica や Edy に代表される国内の電子マネーの多くに採用されている非接触IC カードの規格です。
つまり、Suica のデータが読めるのです!

NeoCat さんが Arduino 用のライブラリを公開しています。
RC-S320 を持っていた事もあり、これがやりたくて USB Host Shield を購入したのに、すっかり忘れていました。

NeoCat さんのPaSoRi ライブラリと、USB HostShield のライブラリを Arduino のlibraries フォルダに入た状態で使用します。
USB HostShield のライブラリについては、この回を参照して下さい。

NeoCat さんのページで言及されている、Spi ライブラリは、USB HostShield ライブラリのアップデートにより、不要になりました。
Spi ライブラリのインストールは不要ですが、コンパイルエラーになるので、


サンプルコード(PaSoRi_Suica_Edy_Reader.pde、PaSoRi_WebTo.pde)および、PaSoRi.h の中にある、
#include <spi.h>
をコメントアウトします。

サンプルは、Suica (またはEdy) の残額を表示する物と、おサイフケータイにURL をPush するものです。
URL Push は面白い機能ですが、おサイフケータイが普及した途端に、非対応のスマートフォンが増えて来てしまいましたね。
IC 乗車券としてのSuica は当分なくならないと思いますが、Google (Android) は同様の規格として、FeliCa ではなくNFC を推しているので、今後の ケータイではどうなるでしょうか、、



au のケータイには、クーポンとしてURL が送られてきました。
もちろん、暗号化された部分は読めませんし、勝手にチャージを増やしたりすることはできません。

HID に変換して、iPad でスイカが読める、というのも有りだと思います。
ちなみに、Arduino がFeliCa 対応デバイスになれる、FeliCa Plug (→Switch Science)という製品もあります。
こちらと組み合わせて使うのも面白そうです。

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


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