USB シリアル (Arduino)


20140301usb_cdc_sample

Android から USB シリアルで通信します。
USB シリアル機器には、 Arduino Uno を使います。

ソースコードは Github に置いています。

Arduino Uno の USB インタフェースは下記のとおりです。

VendorId  : 9025
ProductId  : 67
Interface 0
  Class : CDC ( Communication Devices Class ) Interface
  Subclass : ACM ( Abstract Control Model )
  Protocol : AT Commands: V.250
Endpoint 0
  Direction : IN device to host
  Transfer Type : Interrupt
Interface 1
  Class : CDC ( Communication Devices Class ) Data
  Subclass : Data Interface
Endpoint 0
  Direction : OUT host to device
  Transfer Type : Bulk  
Endpoint 1
  Direction : IN device to host
  Transfer Type : Bulk

ソースコードの簡単な説明
(1) 送信
送信 UsbEndpoint を取得して、bulkTransfer で送信する
(2) 受信
受信 UsbEndpoint を取得して、bulkTransfer で受信する
受信はいつ来るのは分からないので、Thread でエンドレスループにする。
UIスレッドからは実行できないので、メッセージ・ハンドラーを介して、受け取る。
(3) ボーレートの設定
controlTransfer で設定する。
Request Code は SET_LINE_CODING ( 20h ) です。
Line Coding Format は7バイト構成です。
 0-3 バイト : ボーレート
 4 バイト : ストップビット長
 5 バイト : パリティ種別
 6 バイト : データ長

参考
Class definitions for Communication Devices
IMPLEMENTING USB COMMUNICATION DEVICE CLASS (CDC) ON SiM3U1XX MCUS
USB ホスト
Android USB Host + Arduino: How to communicate without rooting your Android Tablet or Phone
usb-serial-for-android
PhysicaloidLibrary


USB シリアル (Arduino)” への2件のコメント

  1. 大学一年生のヤスと言います。Androidアプリ開発の授業を取っていて、最終課題として自作アプリを作るというプロジェクトを課されたので、どうせならある程度経験のあるArduinoと組み合わせて何かできないかな…と思ってデバイス間でシリアル通信する方法をいろいろ探していたところ、Ohwadaさんのコードがあったので組み込ませていただきました。(シリアル通信用のライブラリなども見つけたのですがどういうわけかちゃんと動かなかったんですね…)結果的に、スマホのアプリと呼んでいいのかよく分からないものができましたが(笑)受講生には結構ウケて、人気投票で2位を獲得することができました。
    https://www.youtube.com/watch?v=0iuH44IqzT0
    (この動画を作った後、「じゃんけんぽん、あっち向いてホイ」でデバイス全体の向く向きを変えるという機能も実装しました笑)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です