ラベル Arduino の投稿を表示しています。 すべての投稿を表示
ラベル Arduino の投稿を表示しています。 すべての投稿を表示

2012年8月5日日曜日

Arduino+USBホストシールドでBluetoothドングルを使う

Circuits@Homeで公開されているUSBホストのライブラリに、BTドングル使ってSPP通信をするためのライブラリが追加されたぜ的なことがあったので試してみました。

必要なもの

  • Arduino本体
  • USBホストシールド(Sparkfun製は要改造)
  • Arduino IDE 1.0.1
  • ライブラリ

出来上がったもの

BTの子機側はAndroidのBluetoothChatのサンプルを使いました。

Sparkfunのシールドは使えない!?

どんだけ頑張っても「OSC did not start」となってしまいUSBの初期化ができない。
なぜかと思って調べてみるとUSBホストシールド2.0からリセット信号の回路上での取り回しが変わっている(D7からRSTへ)
そのため、ライブラリ2.0はSparkfun製のシールドでは使えないとのことです。
しかし、ここでも記載がありますが、配線を変えることでSparkfun製のシールドでも使えます。
D7から伸びる信号線をカットし、RSTから信号を取り回す改造をすることで無事初期化ができることを確認しました。





DTR信号でハマる

ArduinoはUSBシリアルから受け取ったデータをBTのSPPで送信しています。
ちょっとハマったところで、Arduinoはシリアル通信のDTR信号を利用してリセットを行なっていることです。
問題になるのは以下の様なシーケンスで動作した場合です。
  1. シリアルオープン
  2. データ送信
  3. シリアルクローズ
  4. 1へ戻る

1のシリアルオープンのたびにリセットがかかってしまいBTの接続が切れてしまいます。
なので、PythonのコードではTCPのリクエストハンドラ内でシリアル接続を保持して、
TCP経由でデータを送るようなことをしてます。


Pro miniへの対応

pro mini用のUSBホストシールドでも使ってみたのですが、
こちらはシリアル経由の3.3Vでは電圧が低くてUSBドングルが動作しませんでした。
しかし、冒頭のリセットしない問題は起きていないのでもしかしたらRAWピンに5V入れて、USBに5Vまわす改造をしておけば動くかも

まとめ

むちゃくちゃ簡単にSPP通信が使えるようになりました。


#以下アフィリエイト用の広告です

2012年5月20日日曜日

さくらのVPS上のJenkinsでArduinoのプログラムをビルド

忘れそうなのでφ(..)メモメモ。

Jenkinsでビルドするにはコマンドでビルドができるようにする必要がある
さくらのVPS上でJenkinsを動かすには以前やったので割愛

ビルドに必要なパッケージを入れる
yum install uisp avr-libc avr-gcc-c++ rxtx avrdude
次にここからMakefileの元と、ツールをダウンロード

wget http://mjo.tc/atelier/2009/02/acli/arduino-mk_0.8.tar.gz
tar zxvf arduino-mk_0.8.tar.gz 
sudo cp arduino-mk-0.8/ard-parse-boards /usr/local/bin

# Arduino.mkをどこか固定の場所に置く
# 自分はスケッチの保存ディレクトリ直下にする
cp arduino-mk-0.8/Arduino.mk /


そしたら、適当にサンプルを作る


cd 
mkdir sample
cd sample
vi sample.ino

コードはこんなので十分

/*******************************************************************************
 *
 * @brief テスト用
 *
 ******************************************************************************/

#define LED_PIN       (2)   //!< @brief LEDの接続ピン
#define DELAY_TIME    (500) //!< @brief PWM待ち時間

/******************************************************************************
 * @brief  setup
 * @param  なし
 * @retval なし
 *****************************************************************************/
void setup()
{
    pinMode(LED_PIN, OUTPUT);
}

/******************************************************************************
 * @brief  loop
 * @param  なし
 * @retval なし
 *****************************************************************************/
void loop()
{
    digitalWrite(LED_PIN, HIGH);
    delay(500);
    digitalWrite(LED_PIN, LOW);
    delay(500);
}

お次にMakefileを作る
ARDUINO_DIR    = /usr/local/lib/arduino-1.0
ARDMK_DIR      = /usr/local
AVR_TOOLS_PATH = /usr/bin
BOARD_TAG      = uno

AVRDUDE_CONF = $(ARDUINO_DIR)/hardware/tools/avrdude.conf
AVRDUDE_ARD_PROGRAMMER = arduino

MCU            = atmega328p
VARIANT        = standard

include ../Arduino.mk
これでmakeするとYAMLがどーたらこーたらとエラーがでるので、perl-YAML-Libを入れる sudo yum install perl-YAML 入れればmakeが通るようになるはず


#以下アフィリエイト用の広告です

2012年5月18日金曜日

Android ADKの本を出します

2012/5/12にソシム社からAndroid ADKの本を出版します。
東京+神戸のAndroider達でArduinoの入門〜ADK+応用な網羅的な内容を書きました。
自分はブログに書いていることなどなどを書きました。
なかなか貴重な体験です。ご協力いただいたみなさまありがとうございました。

Amazon調べでは日本語で書かれたArduinoでのADK用の専門書としては日本初ではないでしょうかね。
もし、みなさん興味ありましたら買ってください。

Android ADK プログラミング&電子工作バイブル (smart phone programming bible)
Amazonで¥ 3,129です。


俺、この本が売れたら新しいmacを買うんだ!

#以下アフィリエイト用の広告です

2012年5月2日水曜日

[memo]FedoraでArduinoのスケッチをコンパイルする

Ubuntu12.04をインストールしたら不調になったので、Fedoraへ乗り換えた。
そこで、Arduinoの環境を構築した際のメモ


yumでインストールする場合

普通はこのやり方で問題なし
sudo yum install -y arduino


バイナリを公式から落としてきて使う場合

ちょっと込み入った使い方をしたいのでこっちで構築した
sudo yum install -y java
sudo yum install uisp avr-libc avr-gcc-c++ rxtx avrdude
wget http://arduino.googlecode.com/files/arduino-1.0-linux64.tgz
tar zxvf arduino-1.0-linux64.tgz
cd arduino-1.0
./arduino        ←起動確認
rm -R __MACOSX/  ←arduinoチームはmacで開発しているようだ。不要なので削除
./arduino        ←年のため削除しても問題ないか起動確認

普通に起動すると以下のエラーが出た。どうやら/var/lockにロックファイルが作れていないようだ。(スーパーユーザーで起動していないから無理な話なのだが。。。)
./arduino 
Experimental:  JNI_OnLoad called.
Stable Library
=========================================
Native lib Version = RXTX-2.1-7
Java lib Version   = RXTX-2.1-7
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
check_group_uucp(): error testing lock file creation Error details:許可がありませんcheck_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL

やはり、sudoで起動するとエラーは出なかった。

sudo ./arduino 
[sudo] password for naoki: 
Experimental:  JNI_OnLoad called.
Stable Library
=========================================
Native lib Version = RXTX-2.1-7
Java lib Version   = RXTX-2.1-7


で、ユーザーで起動した場合と、スーパーユーザーで起動した場合の違いとしては、
シリアルでArduinoを認識できるかどうかだけのようだった。
ビルドするだけであればユーザー権限で起動しても問題はなさそうだった。
とりあえず、自分の用途ではビルドさえ出来れば問題無いので、このままにしておく。


#以下アフィリエイト用の広告です

2011年12月6日火曜日

【追記あり】DotsduinoをAndroidから操作してみた



Make: Tokyo Meeting 07に3日行ってきました。
そこで、以前からお世話になってるブログ(なんでも作っちゃう、かも。)の方が出展しており、 DotsduinotというArduino互換のオリジナル製品を売っていたので買っちゃいました。
それで、折角なのでAndroidからDotsduinoを制御できるようにしてみました。
正確に言うと、シリアル通信で、命令をDotsduinoが受け取り表示するといった流れなので、 そのままPCからも制御できちゃいます。

【追記】
動画をアップロードしました


  • Dotsduino側のソース

#include 

Dots myDots = Dots();

void setup()
{
  Serial.begin(9600);
  Serial.println("Start");
  myDots.begin();
}


void loop()
{ 
  int msg[4] = {0};
  int i    = 0;
  int flag = 0;
  
  // 3バイトを超えてバッファされないと処理しないようにする
  if (Serial.available() > 3) {
    i = 0;
    
    while(i < 4) {
      msg[i] = Serial.read();
      if (msg[i] < 0) {
        break;
      }
      i++;
    }

    // 念のためのデータチェック用
    if (msg[0] == '@') {
      myDots.write(msg[1], msg[2], msg[3]);
    }
  }
}

とりあえずこれだけで、PCからでも"@111"や"@250"といった形のデータを送れば付けたり消したり出来ます。
ただ、msg[1]〜msg[3]は数値である必要があるのでASCIIコードで送ると、49とか50といったデータが送られてくるので、次のように変更するといいかもしれません。
      myDots.write(msg[1] - '0', msg[2] - '0', msg[3] - '0');
ただ、これはPCからASCIIコードで送る場合の処置です
数値として送る場合には不要です。

Android側のソースは後日綺麗にしたらGithub上に上げておきます。
https://github.com/iwata-n



#以下アフィリエイト用の広告です

2011年11月6日日曜日

AndroidのUSB Host APIを使ってチョロQを動かす




前回前々回に紹介したAndroidのUSBホストAPI。
これを使っていつものごとく日本が世界の誇るタカラトミー社製のチョロQ ハイブリッド を遠隔操作しました。
今回はそれのまとめ記事です。
ソースはGithub上でライブラリ化したものとサンプルソースで公開してます。

使用方法は、これまでに紹介したとおりAndroid 3.1以上が必要です。
自分はOptimus Padでのみテストしてますが、おそらく他のタブレットでもいけると信じてます。

ライブラリの方はまだ詰めが甘いのでUSBのパーミッション取得用のBroadcastReceiverを正しく開放できていない状態です。
また、シリアル通信のボーレートの計算方法がいまいちわかっていないので今の所9600で固定値になっています。
APIにはsetBaudrate()は実装しているのですが、中身は見てもらってもわかるとおり空っぽです。

ライブラリの使い方はgithub上のUSB_Lib_sampleがわかりやすいかと思ってます。
UsbSerialManagerを使ってUSBシリアル通信ができるデバイスの一覧をgetList()を使って取得します。
取得してデバイスの一番最初のデバイスの使用許可を要求します。
要求すると、要求ダイアログがでます。



    public void onStart() {
        super.onStart();
        Log.d(TAG, "onStart");
        manager = new UsbSerialManager(this);
        if (serial == null) {
            List list = manager.getList();
            if (list.size() > 0) {
                Log.d(TAG, "Device count=" + String.valueOf(list.size()));
                UsbDevice dev = list.get(0);
                manager.requestPermission(dev, listener);
            } else {
                Log.e(TAG, "USB Serial Device not found");
            }
        } else {
            Log.e(TAG, "USB Serial Device has already got instance.");
        }
    }

要求が承認されるとコールバックが呼ばれるので、あとは、UsbDeviceからUsbSerialを生成して、オープンしてあげます。
この辺はちょっと苦肉の策を使っています。
    /** USBシリアル通信デバイスを使用するパーミッションを取得した際のコールバックリスナー */
    UsbSerialManager.OnGetPermissionListener listener = new UsbSerialManager.OnGetPermissionListener() {
        @Override
        public void onGetPermission(UsbSerial device) {
            Log.d(TAG, "onGetPermission");
            UsbDevice dev = device.getDevice();
            Log.d(TAG, "DeviceName=" + dev.getDeviceName());
            Log.d(TAG, "id=" + String.valueOf(dev.getDeviceId()));
            serial = device;

            try {
                serial.open();
            } catch (IOException e) {
                e.printStackTrace();
            }
            threadStart();
        }
    };

オープンすれば、あとはread()、write()で読み書きができます。
本当はストリームで実装しようと思ったのですが、ちょっとオーバーヘッドが大きかったので、手抜きしました。

今後はボーレートの計算とか調べようかと思います。

#以下アフィリエイト用の広告です

2011年10月31日月曜日

AndroidのUSBホストを使ってArduinoとシリアル通信

Androidの会のメーリングリストを見ていると気になる投稿があったので、早速試してみた。



Android USBを用いてシリアル通信を行う方法

https://groups.google.com/forum/?hl=ja#!topic/android-group-japan/eox6wGtMOSY

投稿の中で紹介されていたサイト
http://android.serverbox.ch/?p=370

上記のサイトを読む感じだとハニコムのUSB Host APIを使ってFTDIのチップと通信してるみたい。
とりあえずデスマが近いのでさくっとした動作確認だけしました。

追記
アプリ側は紹介されているサイトのままなので、シリアルからカウントアップした値を常に出し続ける。Arduino側は受信したデータを2で割ってあまりが1ならLEDをオンにするスケッチを書き込んだ。



Android
Optimus Pad(L-06C) 3.1

Arduino
・Arduino Duemilanove
・Arduino Pro Mini 328 3.3V 8MHz + FT232RL搭載小型USB-シリアルアダプタ 3.3V

Arduino UNOはUSB-シリアル変換のチップがFTDI製のものからATmega8U2
に変わっているのでそのままでは認識しない様子。
この辺ももしかしたらどこかに仕様が落ちてるかも。


#以下アフィリエイト用の広告です


2011年9月6日火曜日

Ubuntu11.04にArduinoの開発環境を作る

ちょっとデスクトップの環境をWin7からUbuntuに変更したのでその際のメモがわり。

Winやmacと同じようにArduinoを公式から環境を落としてきたらコンパイルができなかった。
おそらくコンパイラの設定を特にしていない状態だからまずいようだ。
なので、
 sudo apt-get install arduino
 sudo apt-get install arduino-core
と実行したが、これだとランチャーにショートカットをおいても起動できなかった。
なので、Ubuntuソフトウェアセンターからダウンロードしてくると、
コンパイルもできるし、ランチャーにショートカットをおいても起動できた。
ただ、微妙にアイコンが標準と違う気がするけど、気にしない。


追記
ライブラリとかを置くフォルダは
/usr/share/arduino
の下にある。

さらに追記
なぜか標準のリポジトリからダウンロードできるIDE(22)でUnoが使えない。
しかたがないので、ダウンロードして解凍したのを使う

#以下アフィリエイト用の広告です

2011年7月15日金曜日

MicroBridgeでADKのアプリインストール動作を真似る

ADKでは対応するアプリがインストールされていなかったら
自動でマーケットへ飛ばしてくれるらしいです。
ADKを使える端末を持っていないのであくまでらしいです。

神戸支部のMLで日曜エレクトロニクス(日エレ)の管理人の石井さんの投稿を見て
そんな機能をMicroBridgeでも作れないかとインスパイアさせて頂きました。

やり方は至って簡単で、adb shellのamコマンドを使って起動したいアプリをintentを使って
起動しようとします。
もし、アプリが起動したらバンザイ。それでおしまい。そのままお好きに通信開始。
アプリが起動出来ないと、amコマンドが色々とエラーを吐いてきてくれます。
エラーが出てたら、そのままamコマンドでマーケットへ飛ばしてあげるだけです。
小さいapkファイルだったらそのまま書き込みをしてみてもいいかもしれないです。

これで、ABCや、マイスマではチョロQ展示用の端末を自前で用意しなくても
来場者の端末を使って操縦できそうです。

最後に動作している動画です。


#以下アフィリエイト用の広告です

2011年7月10日日曜日

MicroBridgeを使ったスケッチのテンプレート

MicroBridgeを使ったスケッチのテンプレート。


#include <spi.h>
#include <adb.h>

// ADB接続
Connection *connection;

// ADB接続のイベントハンドラ
void adbEventHandler(Connection *connection, adb_eventType event, uint16_t length, uint8_t *data) {

  if (event == ADB_CONNECTION_RECEIVE) {

  }
}


void setup(){

  // ADBの初期化 
  ADB::init();

  // ADB接続の開始
  connection = ADB::addConnection("tcp:4567", true, adbEventHandler);  

}

void loop() {
  // ADB接続のポーリング
  ADB::poll();
}



Arduino pro miniでADK互換ボードを構成する

どうもArduino UNOだと大きいのでArduino pro miniを使って小さく構成してみました。

といっても市販品?で構成できるので簡単でした。

構成部品

  1. Arduino pro mini
  2. FT232RL搭載小型USB-シリアルアダプタ 3.3V
  3. USB Host Shield for Arduino Pro Mini


Arduino pro miniはスイッチサイエンスで購入。
注意点として3.3V版を購入すること。

FT232RL搭載小型USB-シリアルアダプタ 3.3Vはスケッチの書き込みで使います。
間違って5V版を買わないこと!

USB Host Shield for Arduino Pro MiniはCircuits@Homeで購入。
何故か国内で取り扱っている店が無いので、海外から購入。
海外からの発送なので1週間ほど時間がかかります。
ちなみに自分はFlat Rateで発送してもらいました。
Paypalで購入したら荷物番号みたいなのを送ってきてくれたのですが
USPSで追跡はできなかったです。
Expressだともっと早いし追跡できるのかな?

上から

横から

組み合わせてみるとこんなくらいのサイズ。
ジャンパが基板表面上にあるみたいで、どう影響するかいまいちわからなかったので
コネクタを使ってArduinoとシールドを外せれるようにしておいた。
でもそのまま使えたので、2セット目はそのまま直結してもよさそう。

これでテストでLogcatのサンプルを書きこんでみたら
そのまま動いた。

とっても簡単でした。

2011年7月2日土曜日

ADKリファレンスボードでMicroBridgeを使う

神戸支部の吉田さんからGalileo 7 ADK Main BoardでMicroBridgeが使えないか?と頼まれたので
いろいろと調べてみました。

Galileo 7 ADK Main BoardはADK互換ボードでサイズはUNOを少し大きくした感じです。
詳しくはこちら

肝心のMicroBridgeを使う方法ですが、拍子抜けするくらい簡単でした。

まずArduinoのライブラリフォルダにMicroBridgeのライブラリを追加します。
追加方法は過去記事を参考にしてください。

過去記事の「Arduinoのライブラリをインストール」が終わったら、
ARDUINO/librarys/Adk/max3421e.h
を編集します。

max3421e.hをひらいて、


#include "max3421e_constants.h"
#include "pins_arduino.h"





#include "max3421e_constants.h"
#include "pins_arduino.h"
#define ADK_REF_BOARD

としてください。
あとは、過去記事と同じようにlogcatのデモを実行すればAndroidのログが見れます。



おそらく

PIN_MAX_SS、PIN_MAX_INT、PIN_MAX_GPX、PIN_MAX_RESET
でピン配置を決定しているのだとわかるのですが、SPIの端子はどこで設定しているのか
よくわかりませんでした。そのあたりがわかればもう少し自由が効くようになりそうなのですが・・・



2011年6月20日月曜日

AndroidからAndroidの乗ったロボを操縦する


ABC2011sへ持ってく予定の新作です。
端末がいっぱいあったので、タブレットからAndroid携帯とBluetoothで通信して、
Android携帯からはMicroBridgeを使ってArduinoと通信するといった構成で
遠隔操縦ロボつくりました。

詳細は続きから

2011年6月10日金曜日

Amazonで買えるArduino関連商品

Amazonで買えるArduino関連商品をまとめた

・本体
Arduino Uno
¥2,995
言わずもがな、一番大切な本体。一番最初に買うなら一番オススメ。Unoからドライバを入れないとWinで認識してくれない。Macは何故かモデムとして認識する。

Arduino Fio
¥2,495
Zigbeeとかバッテリーが必要だとかで追加で買う物があったはず。

Netduino
¥3,495
.Net環境で開発ができる変わり種。一番最初に買うのはあまりオススメしないかな。
でもVC#で開発ができて、ステップ実行とかできるのでデバッグがすごく遣り易いらしい。

Seeeduino328

¥3,200
Arduino 互換らしいけど詳しくはしらないな。

Arduinoをはじめようキット
本当はこのキットがオススメなのだが、最近ずっと売り切れになってる。
ブレッドボードやLED等があってすぐに遊べるキットになってる。


・シールド
LCDシールドキット
¥1,980
ちょっと興味があるかな。まんまLCDを表示するためのシールド。

Arduino用ユニバーサル基板 UB-ARD01
¥704
自分で作った回路を載せるための基板

Arduinoイーサネットシールド(microSDスロット付)
在庫切れ
便利。Arduino に有線LANをつなぐ事ができる。ただノイズに弱いのか電源が貧弱なのかモータードライバと一緒にして動かすとリセットがかかってしまい使えない。
サーボ、LEDなら大丈夫だった。
PLANEX 手のひらサイズ 300Mbps ハイパワー無線LANルータ/アクセスポイント/コンバータ FFP-PKR01と組み合わせれば、無線LAN化してArduino とAndroidを繋げられる。

・その他
RBT-001 Bluetooth evaluation kit
Bluetoothをシリアル通信化してくれるキット。技適もとってるから安心。

Prototyping Lab Kit Vol.1
Prototyping Lab Kit Vol.2
正直バラで買ったほうがオススメ。






2011年6月2日木曜日

2011年5月27日金曜日

AndroidとArduinoを使ってチョロQを操縦する ソース公開編



AndroidとArduinoをUSBホストシールドを使って通信するMicroBridgeを利用して
チョロQを操縦するアプリのソースを公開しました。
先人の知恵をお借りすることで簡単に操縦が出来ました。

http://code.google.com/p/iwatan-lab/downloads/list

ArduinoにMicroBridgeのライブラリを追加する方法は
AndroidとArduinoをUSBホストシールドでつなぐ(非ADK編)
を参照してください。


Google Codeで公開しているのはAndroid側のアプリのソースです。
Arduino側のソースはここを参考にさせて頂いているので改変部分のみ公開します。

以下のソースに参考元からコピペで追加してください。

  • void setch(byte bb)
  • void setbit(byte bb)
  • void execpwm()
  • void setpwm(int pwm)
  • void runpwm()
  • void sendpwm()

#include <spi.h>
#include <adb.h>

#define LED 2


// Adb connection.
Connection * connection;

int data[15];
int g = 0;
byte b = B001111;

// Event handler for the shell connection. 
void adbEventHandler(Connection * connection, adb_eventType event, uint16_t length, uint8_t * data) {
  
  // Data packets contain two bytes, one for each servo, in the range of [0..180]
  if (event == ADB_CONNECTION_RECEIVE) {
    char ch = data[0];
    Serial.println(ch, DEC);
    if (ch < 0x20) {
        setbit(ch);
    } else {
        setch(ch - 0x20);
    }
  }
}


void setup(){
  Serial.begin(57600);
  Serial.println("Ready"); 
  pinMode(LED , OUTPUT);
 
  // Initialise the ADB subsystem.  
  ADB::init();

  // Open an ADB stream to the phone's shell. Auto-reconnect
  connection = ADB::addConnection("tcp:4567", true, adbEventHandler);  
 
}

void loop(){
  
  // Poll the ADB subsystem.
  ADB::poll();
}

ここまでやっておいてなんですが、やはり標準のコントローラーの方が操縦しやすいです。

2011年5月26日木曜日

AndroidとArduinoを使ってチョロQを操縦する その2

AndroidとArduinoを使ってチョロQを操縦する
AndroidとArduinoをつなぐライブラリMicroBridgeのデモアプリを動かす
AndroidとArduinoをUSBホストシールドでつなぐ(非ADK編)

上の続きです。

!追記
この記事のソース公開編

TVの音入っちゃってるけど気にしない。




配線を少し綺麗にしました(前のでは切れちゃったから)
アプリ側では複数チャンネルに対応して、チャンネルを切り替えることで
複数台のQステアを操縦することができるようにしました。
また、トグルボタンでターボのオン/オフも切り替えができるようにしました。
これで、Qステアへの充電以外の機能はすべて実装しました。

Qステアも少しドレスアップしちゃいました。


ボディを開けて、LEDを仕込みました。




2011年5月23日月曜日

AndroidとArduinoを使ってチョロQを操縦する

AndroidとArduinoをUSBホストシールドでつなぐ(非ADK編)
AndroidとArduinoをつなぐライブラリMicroBridgeのデモアプリを動かす

土日試した上の記事をもとにAndroid(IS01)を使ってQSteerを動かしてみました。
IS01には赤外線通信機能がついてはいますが、独自の信号を出すことが出来ないので諦めていましたが、ここに来て思いが再燃してきました。
わざわざIS01を使ったのは1.6でも動くことの確認とIS01だって未来へ行くことができることの証明です!



用意するもの
・日本が世界に誇るHENTAI端末 IS01
Arduino
・Arduino USBホストシールド
Qステア

Arduinoが約3000円、ホストシールドが約2500円、Qステアが約1500円なので、合計7000円ほどです。あと動画だとモバブー使ってますが、普通にPCのUSB電源からでも動きます。
ただ、このUSBホストシールドはここを参考にして電源周りをすこし修正しています。
半田をすこし触ったことがある方ならそんなに難しくはないと思います。
自信がない方はArduino用に外部電源を用意する必要があります。

Qステアとは赤外線で操縦するチョロQの事です。通信規格もいろいろな方が解析しているようで、公開されています。
参考にしたのはここです。
あと、Arduinoのスケッチの実装はここを参考にさせて頂きました。

コードはまだ完成していないので今回は載せませんが、比較的簡単に実装できてます。
先人の方々の知恵があるおかげで簡単にQステアが動かせました。
動作のイメージとしては

  1. AndroidのonKeyDownメソッドで上下左右のキー入力を受け付ける
  2. MicroBridgeを使用してArduinoへ押されたキーの情報を送信
  3. Arduinoが受信したキー情報に対応する情報を赤外線で送信
  4. Qステアが勝手に動く

といった流れです。
ただ、onKeyDownメソッドを使用しているので、長押しを検出するまで時間がかかり、
少し動いたと思ったら止まってしまい、しばらくしたら動き続けるといった少し怪しい動きになってしまっています。

2011年5月22日日曜日

AndroidとArduinoをつなぐライブラリMicroBridgeのデモアプリを動かす

Arduino側は File -> Example -> Adb -> Demoのスケッチをそのまま使用します。

Android側のアプリには少し手を加えました。
フォーマッタもmicrobridgeのArduinoに近いフォーマットからAndroidのフォーマットへ変更

MicroBridge.java
初期化方法の変更
元のソースだとコンストラクタを使ってArduinoとの通信を行うServerを初期化してたのですが、
それをonCreate()へ移動した。理由はなんとなく。

シークバー周りでの変更
シークバーの最大値を制限するあたりがスマートじゃなかったので、
SeekBar#setMax()で最大値をきって、Arduinoへの信号の送信もString#format()から変更
(String#format()は処理が遅いから)

seekBar.setMax(180);

seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
    publicvoid onStopTrackingTouch(SeekBar arg0) {
    }

    publicvoid onStartTrackingTouch(SeekBar arg0) {
    }

    publicvoid onProgressChanged(SeekBar v, int progress, boolean flag) {
        try {
            byte[] data = {
                (byte) progress, (byte) progress
            };
            server.send(new String(data));

        } catch (IOException e) {<
             Log.e("SEEK", e.toString());
        }
    }
});

Server.java ・Server#addListener()でのエラーに対処 理由は良く解らんが、なぜかMicroBridge.javaで、Server#addListener()を呼ぶと ClassCastExceptionがでたので、とりあえずの対処。 元ソースだとTreeSetを使ってリスナーの管理をしているのだが、 多分Listでも動くだろうと思って変更。 TreeSetを使ったことがないのでなんでClassCastExceptionがでたのか理解は出来なかったけど、 Listにしても問題なかったのでいいのかな?
// private TreeSet<serverlistener> listeners = new TreeSet<serverlistener>();
private List<serverlistener> listeners = new ArrayList<serverlistener>();
とりあえずこれだけAndroid側のアプリには変更を加えて実行。



動作確認した動画


2011年5月21日土曜日

AndroidとArduinoをUSBホストシールドでつなぐ(非ADK編)

巷はにわかにADK(Android Open Accessory Development Kit)で盛り上がっている中、
自分はN1やNSを持っていない為このBIG WAVEに乗りきれていません。
悔しいのでADKを使わなくてもAndroidとArduinoをつないでBIG WAVEにあやかろうと思います。


準備するもの(ハードウェア編)
  1. Android(できればDesire HD
  2. Arduino UnoかDeicimila。Megaとかでも動くみたい
  3. USBホストシールド(スイッチサイエンス千石電商
  4. USBホストシールドをArduino本体とつなぐ連結用のピン
これだけです。USBホストシールドは千石電商の店頭で購入しましたが、
連結用のピンが実装されていなかったので、これは個人でやらないといけなさそうです。



準備するもの(ソフトウェア編)
  1. Arduinoの開発環境
  2. MicroBridgeのライブラリ
今回はArduinoでAndroidのlogcatを表示しようと思うので、特にAndroid側のソフトはつくりません。


Arduinoのライブラリをインストール
MicroBridgeのダウンロードのページ(http://code.google.com/p/microbridge/downloads/list)からMicroBridge-Arduino.zipをダウンロードしてきます。
解凍したらARDUINO/librariesの下にAdbというフォルダ名でソースを配置します。


logcatサンプルの実行
Arduino IDEを起動して File -> Example -> AdbからLogcatを選択して、サンプルを開きます。
開けたらコンパイルして、Arduinoへ書きこむ。


logcatを見る
ターミナルやシリアルモニターを起動して、通信レートを57600に設定する。
そしたら、AndroidとUSBホストシールドとをつなぐとLogCatが出力されてくる。



動作確認した端末の結果
Desire HD 正常に動作した
Optimus Pad デバッグ接続まで行ったが、logcatのメッセージが出力されなかった
Xperia mini pro うんともすんとも言わない



まとめ
非常に簡単にArduinoとAndroidがつながりました。
USBホストシールドはADKでも使うので、もしDesire HDに2.3.4が降ってくるなんて
奇跡が起きたとしても今後使えるので購入しても良いかと思っていた程度でしたが、
意外とこのままでも使い物になるんじゃないかと期待ができそうです。