14
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SPRESENSE の USB CDC 機能を使ってシリアル通信してみた

Posted at

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を使ったことがある人なら、

  1. ボードマネージャのURLにpackage_spresense_index.json を追加して
  2. ボードマネージャからインストールするだけ

USBSerial ライブラリ

実装したライブラリをGitHubにアップしました。
https://github.com/baggio63446333/USBSerial

  1. 使い方は簡単で、USBSerial ライブラリを libraries フォルダにインストールします。
  2. いつも使っている 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 スケッチを起動します。

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 個立ち上げて、片方のターミナルに入力した文字列がもう片方のターミナルに出力されます。

image.png

さいごに

USB CDCを使えば高速なシリアル通信が可能なはず。
通信速度の計測などは一切確認してないのでぉぃぉぃやります。。
ちゃんと動かないとか、まともに動かないとか、動作がおかしい、とか何かあればコメントをお願いします。

14
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?