SPRESENSE の USB CDC 機能を使ってシリアル通信してみた
はじめに
SPRESENSE の拡張ボード側の USB 端子を使って Serial 入出力を実現します。
SPRESENSE SDK でサポートしている USB CDC 機能をそのまま利用して Arduino から使用可能なライブラリ (USBSerial) を新規に作成しました。
USB CDC-ACM とは?
USB には、USB メモリなどで使用される MSC (マスストレージクラス) や、マウス・キーボードで使用される HID (Human Interface Devices) クラスなど、機能や用途ごとにいくつかのデバイスクラスに分かれてプロトコルが定義されています。この中に、ホストPC と通信するための CDC (Communication Device Class) というクラスドライバが用意されています。CDC デバイスクラスはいくつかのサブクラスに分かれており、RS-232C等のシリアル通信に対応した CDC-ACM (Abstract Control Model) や Ethernet 通信を実現する CDC-ECM (Ethernet Networking Control Model) 等があります。よくある FTDI などの USB シリアル変換チップにはこの CDC-ACM 機能が実装されています。
SPRESENSEボード開発環境構築
開発環境のセットアップ手順は Spresense Arduino スタートガイド に詳しく載ってます。Arduinoを使ったことがある人なら、
- ボードマネージャのURLにpackage_spresense_index.json を追加して
- ボードマネージャからインストールするだけ
USBSerial ライブラリ
実装したライブラリをGitHubにアップしました。
https://github.com/baggio63446333/USBSerial
- 使い方は簡単で、USBSerial ライブラリを libraries フォルダにインストールします。
- いつも使っている
Serial
の代わりにUSBSerial
に置き換えれば使用できます。
インストール方法は、GitHub から zip ファイルをダウンロードしてインストールしても良いのですが、git を使った手順を示します。(以下は Ubuntu 環境の例ですが、Windows 環境なら %USERPROFILES%\Documents\Arduino\libraries、macOS 環境なら ~/Documents/Arduino/libraries あたりに libraries フォルダがあるはずです、たぶん)
$ cd ~/Arduino/libraries
$ git clone https://github.com/baggio63446333/USBSerial
examples にある SerialCommunication.ino スケッチを起動します。
#include <USBSerial.h>
USBSerial USBSerial;
void setup()
{
// Use normal serial port on main board
Serial.begin(115200);
// Use USB serial port on extension board
USBSerial.begin(115200);
}
void loop()
{
// Send from USBSerial to Serial
while (USBSerial.available()) {
Serial.write(USBSerial.read());
}
// Send from Serial to USBSerial
while (Serial.available()) {
USBSerial.write(Serial.read());
}
}
Serial と USBSerial との間でシリアル通信しているだけの簡単なサンプルです。
TeraTerm 等のシリアルターミナルを 2 個立ち上げて、片方のターミナルに入力した文字列がもう片方のターミナルに出力されます。
さいごに
USB CDCを使えば高速なシリアル通信が可能なはず。
通信速度の計測などは一切確認してないのでぉぃぉぃやります。。
ちゃんと動かないとか、まともに動かないとか、動作がおかしい、とか何かあればコメントをお願いします。