イチからはじめる
   ADK
  日本Androidの会神戸支部
       吉田 研一


 第13回Android勉強会in札幌
    今回は電子工作祭り!
   2012年6月2日(土)
はじめに

自己紹介
今回のセミナーの経緯
書籍の紹介
イベントの紹介
自己紹介

•   よしだけんいち(45歳) @dietposter

    •   奈良在住

•   JAG神戸&神戸GTUGメンバー

•   ECCコンピュータ専門学校専任教員

    •   奈良高専卒、高校教諭免許(理科)有り
今回のセミナーの経緯
3/24(土) ABC 2012 SpringにてADK勉強会(東京)
の展示の際に、まいむぞうさんがコンタクト
          吉田はOSC愛媛に参加し、ABC 2012
          Springの「ロボットサミット」のハング
          アウト中継を行っていた
後日、ADK勉強会(東京)MLにて北海道支部勉強
会でADKの話をしてくれないかと依頼あり
ここで事情をはじめて知り吉田が喜んで手を挙げた
          吉田は秋葉原で行われるADK勉強会と
          ハングアウトで自宅をつないでオンラ
          イン参加していた
書籍(共著)の紹介
                       著者(五十音順)

                       (横浜支部ロボ部)
                         岩田 直樹
                        杉浦 登(部長)
                         原田 明憲

                        (神戸支部)
                       高木 基成(支部長)
「Android ADK プログラミング      吉田 研一
   &電子工作バイブル」
書籍(共著)の内容
第1章 ADKの概要とハードウェアの制御(高木さん)p.13
第2章 ADK ボードを動かそう(杉浦さん:RT-ADKボード)p.51
第3章 Arduino UnoとUSBホストシールドで手軽にADK p.131
   格安・簡単! LED, スイッチ, 光センサとのやりとりを行う
第4章 Androidで赤外線通信(岩田さん:Arduino)p.53
第5章 Androidで温度モニタリング(原田さん:PICマイコン)p.45
第6章 MicroBridgeの利用(岩田さん:Arduino)p.27
Appendix-1 ピンソケットのハンダ付け p.11
   Arduinoの拡張基板「シールド」のハンダ付け方法を丁寧に解説
(384ページ中141ページ担当しました)
イベントの紹介(本日ですが)
                                     横浜支部ロボ部
                                      杉浦さん
                                      原田さん

PICマイコンを使ったADKキットのハンダ付け講習会


                         基板のみで500 円(税込)
                         部品込みで2,980 円(税込)


  ●株式会社テクノロードWEB SHOP
  http://techno-road.com/shop.html
進行
アジェンダ (概論)
ADKとは?その歴史

AndroidとのUSB接続

 ADK, MicroBridge, USB Host API

ADKでつなぐマイコンの選択

 PIC, Arduino, mbed

開発手順とデバッグ、ログ
イチからつくってみる

ソースコード

https://github.com/yoshidaken1/GettingS
tartedADK

回路図(ブレッドボード実体配線図)

http://www.ospn.jp/press/20120404no22-
2-useit-oss.html
アジェンダ(コード概説)

外部インテント(Arduinoからのアプリ起動)

Androidから見た入出力ストリーム

Arduinoと電子部品のやりとり

コマンドデータ/データプロトコルの留意点
概論
ADKとは?
ADKとは?
ADKと記述した場合は、「Open Accessory
Development Kit」のことを指します。
ADKのAは、AndroidではなくAccessoryの頭文字
です。Android2.3.4とAndroid3.1以降に追加され
た周辺機器用のAPIを利用するためのソフトウェ
アやドキュメント、Accessory Demo Kitと呼ばれ
るハードウェアを合わせてADKと表現します。
ADKとは?~歴史1~
•   2011年5月 Google I/O (San Francisco)




 アールティ社が
ADKボードを提供

ブリリアントサービス社
(大阪)がLED植物工場
を展示。LEDは共立電子
(大阪日本橋)
              https://sites.google.com/site/bsfarmbox/
ADKとは?~歴史2~
   •   2011年11月 GDD Open Call (Tokyo)
                                         ADKを
                                         用いた
                                         作品の
                                          展示
                                        (12作品)




大和田さん(横浜支部長)「OpenCall における ADK の傾向」より
2012年1月~2月
•日本Androidの会定例会でアールティ社のプレゼン




•各支部などでADK関連の勉強会が行われる。
  •福岡支部、神戸支部、名古屋つ部、東京で独自に
  ADKハッカソンなど。
2012年3月
•   鳥人間@hisashinさんの世界最小ADK対応Arduino
             「Harpy nano」販売




                         回路図も公開
                       つくばFabLabで作成

           http://www.harpyhack.com/
2012年4月(1)
    itogさん CEREVO DASHにADKガジェット
             「FourBeat」出展


                                        クラウド・ファ
                                        ウンディングに
                                        よる支援

                                        興味をもたれた
                                        方は支援を!


http://camp-fire.jp/projects/view/254
2012年4月(2)
石田さんのQDen 広告提供型充電サービス が、
 日経BP社 A3 2012にてアイデア部門優秀賞


                    給電クレードル・
                     クラウド連携
                      サービス



ADK勉強会(東京)のLT大会”ADK BootCamp“資料
2012年5月
  •   ソシム社「Android ADKプログラミング
      &電子工作バイブル」発刊
       http://www.socym.co.jp/book/809

      •   日経Linux 5月号
特集1 ここまでできる“未来”の部屋
  Linuxで家電を自由に操る
    http://nkbp.jp/LKKH3C
でもイマイチ流行らない
•   Adnroidのバージョンに制限

    •   スマートフォン2.3.4以上

    •   タブレット3.1以上

•   マイコンや電子工作の知識が必要…興味はあ
    るけどなかなか手を出しづらい。

•   今年のGoogle I/OにはADKのプログラムは無
    い、らしい。…オワコンか
でもでも根強く続く技術
•Android開発には様々な文化の人が関わる
  •組込み屋さん          「Androidレイアウトの
  •Web屋さん        スタンダードアプローチ」
  •携帯アプリ屋さん                 住友さん
  •業務アプリ屋さん       http://slidesha.re/L547Ud

•ADKは様々な文化へのアプローチとなる技術で
はないか。様々なものをつなぐメタファーかな。
•あと、そろそろ4.0のAndroid携帯が増えそうな
んで、基本が分かれば使える技術になるハズ!
モノwith サービス=コト
 •   製品単体では受け入れられない時代が来ている

 •   モノと同時に付随するサービスを体験すること
     で受け入れられ浸透していく時代だと感じる

 •   モノとサービスが組み合わさりコト(事柄)と
     なってヒト(人)をつなぐように思ったり

 •ガジェットとスマートフォン-クラウドを結ぶ
  ADKはそういった「コト」をつくるアーキテク
  トになるかも??
                  ↓参考ブログ
組込み技術とモバイル技術(2)-人と技術のマッシュアップ
概論
AndroidとのUSB接続
AndroidとのUSB接続

•   USB Accessory API(Androidが電源をもらう側)

    •   AndroidがUSBデバイス(Type-Bコネクタ)

    •   これがいわゆるADK

•   USB Host API(Androidが電源供給側)

    •   AndroidがUSBホスト(Type-Aコネクタ)
USBアクセサリモード
     とUSBホストモード
           USBホスト                    USBデバイス
アクセサリ                     電力                    Androidが従
  モード      マイコンや
                     A           B    Android
           FPGAなど
   (ADK)                 データ転送




           USBデバイス                   USBホスト
  ホスト                     電力
           マイコンや                                Androidが主
  モード      FPGAなど    B           A    Android
                         データ転送
Androidとの接続




http://www.slideshare.net/KeisukeSuzuki1/osc-ftdriver
ADK, MicroBridge,
    USB Host APIまとめ
•   ADK( ver.2.3.4以上で対応機種のみ)

    •   マイコンから自動的にアプリを起動

•   MicroBridge(全機種対応)

    •   ADB接続 デバッグモードにする必要あり

•   USB Host API (ver.3.1以上で対応機種のみ)

    •   全マイコン対応可能 ラッパライブラリを利
        用すると使いやすい (FTDriver)
概論
ADKでつなぐマイコン
    の選択
ADKでつなぐマイコン
     Arduino
•プロトタイピング開発が容易(プログラミング言語
も簡単)
•最新のIDEに対応していない(Yaoadkで解決)
•USBホスト機能が必要




Arduino Uno+USB    Arduino   Harpy Nano
 ホストシールド          Mega ADK
ADKでつなぐマイコン
       PIC
•開発環境MPLAB, MPLAB X(C言語)
  •組込み開発らしいプログラミング
•PIC24FマイコンはUSBホスト機能を内蔵し多機能でか
つ簡便に実装できる(しかも低価格)
 •神戸支部、原子力部(NINJA)、横浜支部ロボ部など基板を作成
•ファームウェアの書き込みに(PICKit 3など)ライタ
が必要




               PIC ADK mini   Yokorobo
 RT ADK mini
                  Board       01-PIC24F
ADKでつなぐマイコン
     mbed
•CPUはARM Cortex-M3など
•開発環境はクラウド上にあり、ブラウザでプログ
ラミングする。
  •ユーザ同士で公開されたライブラリやアプリ
  ケーションを流用できる
  •組込み界のソーシャルコーディング!?
  •WebSocketを簡単にコーディングできたりする
実はまだ触っていませ
ん。是非チャレンジした
 いと思っています。
                 mbed NXP LPC1768
Arduino, PIC, mbed
         まとめ
•Arduino 携帯アプリ屋さん、業務アプリ屋さん向け?
  •入手しやすい。情報が多くノウハウも多い。
  •企業でのプロトタイピング開発も増加
  •組込み関連のノウハウが無い時のコスト(=投資コ
  スト・教育コスト・時間)圧縮にも向く
•PIC 組込み屋さん向け?
  •Cによるコーディングにある程度慣れている、なお
  かつマイコンをある程度触っている人は、様々なこ
  とが比較的容易にできる
•mbed Web屋さん向け?
  •個人利用としてはイチ押し(まだ触ってないけど)
 •神戸支部でもNXPの中の人を呼ぶ予定もあり(未定)
概論
開発手順とデバッグ、ログ
開発手順①
 ①Arduinoファームウェアの開発




USBケーブルでArduinoスケッチ
     をアップロード
開発手順②
②Androidアプリの開発




     adb
     接続



USBケーブルでapkを転送
adb接続でデバッグ&logcat
開発手順③
                     シリアルモニタ
adb接続が
できない!




         ③ADK接続&実行
開発手順④
                       シリアルモニタ
Wi-Fiによる
 adb接続



       Wi-Fiデバッグ

            ADK接続&実行
WiーFiデバッグ中
   シリアルモニタ




  ADK接続
   &実行
Wi-Fiによる
     adb接続手順(1)
《前提》 PCとAndroid端末は同一のWi-Fi LAN上
にあること。

(1)まずはじめにPCとAndroid端末をUSBケーブ
ルでつないでおいて、コマンドプロンプトより以
下の2つのコマンドを投入する                  Android端末の
>adb tcpip 5555                  IPアドレス
restarting TCP mode port:5555
>adb connect 192.168.1.101:5555
connected to 192.168.1.101:5555
Wi-Fiによる
    adb接続手順(2)
(2)Android端末からUSBケーブルを外して、
adb logcatコマンドを打ってみる
> adb logcat
…
logcatが表示されます!

•ちなみにadb logcatコマンドを投入しなくても
EclipseのLogcatビューでlogcat出力が始まりま
す。
•DDMSも使え、ASM(Android Screen Monitor)も
USBケーブル無しで表示されます。非常に便
利!!ADKに関係なく使ってみて下さい。
Wi-Fiデバッグの注意点
                        シリアルモニタ




   ADK接続を行うと
   必ずWi-Fiデバッグ
    が切断される!

   >adb connect 192.168.1.101:5555
   でWi-Fiデバッグが再接続します
wifi logcat
•Wi-FiデバッグはAndroid 3.1以上か4.0以上しか
使えません。
•Android 2.3.4の場合は、tomorrowkeyさんの
「wifi logcat」が使えます(ただしlogcatだけ)。




ブラウザからlogcatを見る(アップデートしました)
まとめ
•   Android 3.1以上か4.0以上ならWi-Fiデバッグ

    •   ADKに関係なくおススメ

•   Android 2.3.4ならwifi logcat

•   Arduino側は、シリアルモニタを使いprintデバッ
    グが可能

    •   スケッチ内にSerial.println()を入れる
イチからつくってみる
前準備(1)
OSPN記事(ブレッドボード実体配線図ほか全体の説
明)

http://www.ospn.jp/press/20120404no22-2-useit-
oss.html

ソースコードをダウンロードしておく

https://github.com/yoshidaken1/GettingStartedADK

Yaoadkライブラリをダウンロードしておく

Yet another open accessory development kit
(ADK/MicroBridgeのためのArduinoライブラリ集)
Google放置Play…
   •GoogleのADKサンプルソース「Demokit」はArduino
   IDE 0022対応のまま
   •Arduinoの開発環境は Arduino 1.0となり正式リリー
   スしたためライブラリが大きく変更
   •そのままGoogleのADKサンプルを使うと動かない
https://dl-ssl.google.com/android/adk/adk_release_0512.zip

                  これもまたオワコン要因のひとつ(汗)
Arduino 1.0対応
ADKライブラリ作りました
  Android ADK勉強会(東京)メンバーと
  協力して公開(Apache License v.2)



                     github初心者でもZIPを
                     ダウンロードするだけ!


https://github.com/ADKstudyGroupTokyo/Yaoadk
前準備(2)
    部品を通販で購入




秋月電子通商 【URL】 http://akizukidenshi.com/
なぜこの電子部品?
•   オライリーさんの書籍「Arduinoを
    はじめよう」で扱われるパーツに
    絞りました。

•   同書はデジタル入出力・アナログ
    入出力などが初心者にわかりやす
    く説明されてます。

•   スイッチサイエンスでは必要なパ
    ーツだけをそろえた「Arduinoをは
    じめようキット」が販売されてい
    ます。
大まかな手順
1. ブレッドボード上にパーツを配置する
2. Arduino 1.0でスケッチを作成し、Arduino Uno +
  USBホストシールドにアップロード
3. Arduino Uno + USBホストシールドにAndroidを接続
  し外部インテントが起動するかダイアログを確認
4. Androidプロジェクトを作成,Androidにアップロード
5. Arduino Uno + USBホストシールドとAndroidを接続
  し、動作確認
1.ブレッドボード上に
部品を配置      ①                                    ②
【ブレッドボード上の接続】
①黄色のジャンパーワイヤをa2と(+)へ          A0へ ④         ③
②光センサ( CdS セル)をe2とe4 へ
③抵抗10kΩをc4とc8へ                  ⑤               ⑥
④オレンジのジャンパーワイヤをa8と(-)へ
⑤黄色のジャンパーワイヤをa9と(+)へ
⑥タクトスイッチをe9, e11, f9, f11 へ   D4へ ⑧         ⑦
⑦抵抗10kΩをc11とc15へ
⑧オレンジのジャンパーワイヤをa15と(-)へ
                                                    ⑩
⑨オレンジのジャンパーワイヤをa16と(-)へ
⑩青色LEDの短い足(カソード)をe16へ               ⑨           ⑪
⑪青色LEDの長い足(アノード)をe18へ                   ⑫
⑫抵抗1kΩをc18とc22へ               D3へ
⑬オレンジのジャンパーワイヤをa23と(-)へ                             ⑭
⑭赤色LEDの短い足(カソード)をe23へ
⑮赤色LEDの長い足(アノード)をe25へ               ⑬           ⑮
⑯抵抗1kΩをc25とc29へ
                              D2へ       ⑯
Arudinoと配線
               ① 緑色のジャンパーコードをa4と
                 USBホストシールドのA0番へ
               ② 緑色のジャンパーコードをa11
                 とUSBホストシールドの4番へ
               ③ 黄色いジャンパーコードをa22
                 とUSBホストシールドの3番へ
               ④ 黄色いジャンパーコードをa29
                 とUSBホストシールドの2番へ
               ⑤ 黒いジャンパーコードを(-)
                 とUSBホストシールドのGND
                 ピンへ
               ⑥ 赤いジャンパーコードを(+)
                 とUSBホストシールドの+5Vピ
                 ンへ
ブレッドボードとジャンパーワイヤーの配線はやり直しが
   できるので、プロトタイピングには最適!
でも、そのまま置いておくと抜けてしまったり、たまに使
  うときに配線をし直したり…。面倒でもある。
ハンダ付けしてもヨシ
  ユニバーサル基板(ブレッド
  ボード配線パターンタイプ)
  (秋月電子:P-04303) 80円


   ブレッドボード用ワイヤ /
     SHW-S0.65mm-7
  (共立エレショップ: A1T141)
         605円

    あと、アルトイズの
    ミント缶 (楽天で
   400円ほど)があれば
どこでもフィジカル・
   コンピューティング
 原稿書いてる最中には常に持ち歩いていました

  これで
 あなたも
 Maker気分




ADKの動作リファレンスにひとつ作っておくと便利です
2.スケッチを作成し
     Arduinoにアップロード




https://github.com/yoshidaken1/GettingStartedADK/blob/ma
         ster/firm_Arduino0100/AdkDaio/AdkDaio.ino
3.ArduinoとAndroidを接続し外部
  インテントが起動するか確認




      ADK用Androidアプリを
      自動起動しようとするが
      見つからないとの
      ダイアログが表示される

        ADKの接続確認と機種対応の確認
4.Androidプロジェクトの作成
Androidプロジェクトを作成しAndroidにアップ
ロードするまでの作成手順は以下の通り
 4.1 AndroidManifest.xmlに要素を追加
 4.2 res/xml/accessory_filter.xmlの作成
 4.3 res/layout/main.xmlで画面レイアウト作成
4.4 javaプログラムを作成
https://github.com/yoshidaken1/GettingStartedADK
              /tree/master/AdkDaioProj
5.ArduinoとAndroidを
      接続し動作確認
ADK用Androidアプリを自動
起動してもいいか確認する
ダイアログが表示される
                    ADK接続&実行
コード概説
外部インテント(Arduinoか
  らのアプリ起動)
Arduinoスケッチ
Androidソース
    res/xml/accessory_filter.xml




   3つの文字列が一致していれ
   ば、外部インテントを受け取り
   アプリが起動する。
Androidプロジェクトは
   Google APIs 2.3.3




ターゲット名は「Google APIs」
プラットフォームは「2.3.3」APIレベル10
AndroidManifest.xmlに
 使用ライブラリを指定

             Google API 2.3.3に含まれるUSB
             アクセサリのライブラリを指定




USBアクセサリ接続が行われるとaccessory_filter.xml
 起動するか否かフィルター設定を参照するよう指定
AdkDaioProjActivity.java
ブロードキャストレシーバ




ブロードキャストレシーバでUSBからの外部インテン
トによるダイアログを判別する。OKならプライベー
 トなopenAccessory()メソッドを呼び出し接続を行
う。《ADKの定型的な処理=リファクタリング対象》
コード概説
Androidから見た入出力
     ストリーム
出力ストリーム
        (Android→Arduino)
イベントリスナー
からプライベート
なメソッド
sendCommand()が
呼び出されると…

FileOutputStream
クラスのwriteメ
ソッドでArduinoに
データを出力する
AdkDaioProjActivity.java

バイト配列
buffer[]にデ
ジタル/アナ
ログデータを
    格納
入力ストリーム
      (Android←Arduino)
スレッドを用い、
run()メソッド内で
FileIntputStream
クラスのreadメソ
ッドでArduinoか
らのデータを入力


受信したデータは
Messageクラスの
インスタンスとし
てハンドラで表示
処理
AdkDaioProjActivity.java
 Arduinoからの入力があるときだけスレッドが必要
           (出力だけなら不要)




あらかじめ大きめのバイト配列buffer[]を用意しておき、
    read()で入力ストリームから入力する
AdkDaioProjActivity.java




run()メソッド内でUI処理ができないため、Messageクラス
   のインスタンスをwhat識別子つきでハンドラへ送信
AdkDaioProjActivity.java
what識別子で判別しUIウィジェットへデータを表示
コード概説
  Arduinoと
電子部品のやりとり
基本的な入出力
汎用入出力(GPIO)      Arduinoの関数 RT-ADK&RT-SDK その他代表的なパー
                                のパーツ      ツ
デジタル出力                          リレー       LED(単色)
                 digitalWrite()
デジタルピンのOUT
アナログ出力                           RGB LED、サー   DCモータ
デジタルピンのPWM出力 analogWrite()       ボモータ

デジタル入力                           タクトスイッチ      磁気センサ、モーシ
デジタルピンのIN        digitalRead()                ョンセンサ
アナログ入力                           温度センサ、照度 加速度センサ、距離
アナログ入力ピン         analogRead()    センサ、タッチセ センサ
                                 ンサ


4つの基本パターンができると色んな
電子部品を制御できるようになります。
デジタル出力
(Arduino→電子部品)




digitalWrite(ピン番号, HIGHかLOWの値)
  HIGH:5V(LEDオン)LOW:0V(LEDオフ)
アナログ出力
(Arduino→電子部品)




 analogWrite(ピン番号,0から255の値)
0V~5Vの電圧を256段階に分けてPWM出力
Arduinoスケッチ
loop( )ブロック内
         Androidからread
デジタル入力
(Arduino←電子部品)




    digitalRead(ピン番号)
 戻り値はHIGHまたはLOWとなります。
Arduinoスケッチ
loop( )ブロック内


           Androidへwrite
アナログ入力
(Arduino←電子部品)




      analogRead(ピン番号)
0V~5Vを1024段階(10ビット)に分けて入力
Arduinoスケッチ
loop( )ブロック内




              Androidへwrite

10ビットのデータを2バイトに分けて
バイト配列に格納し送信する必要がある
完成です
コード概説
コマンドデータ/データ
 プロトコルの留意点
Javaはunsignedが無い
•C言語でいう所の unsigned char(8ビット符号
なし整数)が無い。
 •unsignedは符号なし整数型の修飾子
 •これが結構、始末が悪い(私見ですけど…。
 苦々しく思っている組込み屋さんも少なくな
 いと思う、多分。)
byte型
(符号付き8ビット整数)
•byte型は8ビットのうち最上位ビットが符号
に用いられる(-128~127)。
•Arduinoからのバイトデータをそのまま使え
ない事態が起きる。
【対処】0xFFと論理和を取って8ビットの値
を取り出す。
AdkDaioProjActivity.java




byte型の値をintの変数に代入する場合
0xFFと論理和を取って8ビットの値を取り出
す。
 でもど~して8ビット(=1バイト)ごとに分けて
      送る必要があるの??
Socket通信は
            バイトストリーム
    •   ネットワークバイトオーダー

        •   機種ごとのエンディアンの違いを吸収す
            るため1バイトづつ配列に並べてストリ
            ームとする

        •   Arduinoはリトルエンディアン

        •   Android端末はビッグエンディアン

Wokashi:[arduino][android]ADKでfloat型のデータを扱う
ByteBufferクラス
•   byte[] バイト配列よりもByteBufferクラス
    の方が効率よくストリームを利用できる、
    らしい。

•   StringとStringBuffer的な存在?

    [arduino][android][adk]構造体を送る
    ADK使ってAndroid端末側に構造体で
           データを送りつける。
Java(Android)と
   Arduinoのデータ型
   データ型          Java       Arduino

    byte         1byte      1byte

     int         4byte      2byte

    long         8byte      4byte

    float        4byte      4byte

   double        8byte      4byte

                  ArduinoはAtmel社のAVRマイコンの
データ型の”sizeof”を        アーキテクチャに依存する
意識する場面がある
という訳で何か出来たら
     一緒に展示しましょう!!
       2012年3月OSC愛媛とABC 2012
2012年5月オープンセミナー2012岡山とOSC名古屋
  ハングアウトでつないで講演・展示しました。




北海道と神戸で展示会場をハングアウトでつないだり
    都合が合えば是非お願いします(^-^)/
ご清聴
ありがとうござい
 ましたm(_ _)m

イチからはじめるADK北海道支部勉強会発表資料