USB Native portでPCと通信してみます
〔arduino Zero の使い方に戻る〕
このページでは"Arduino Zero Pro"のUSB2(Native port)を使ってパソコンと通信をしてみます。
・CDCクラスでのシリアル通信
・HIDクラスでのマウスとキーボードのエミュレーション
又このNative portは周辺機器用のUSBホスト(OTG)として動作もしますが、この記事は後日追記します。
《シリアル通信(CDC)》
@ "Native port"とPCをUSBマイクロBコネクターケーブルで繋ぎます。
A ArduinoIDEを起動させ、ボードとポート設定を"Arduino Zero Pro(Native USB port)"に設定します。
B IDEに下記のスケッチプログラムをコピーペーストして貼り付けて下さい。
---------------------------------------------------------------------
void setup()
{
// USBでCDCクラスの初期化を行う
SerialUSB.begin(9600); // シリアル通信の速度は9600bps
while (!SerialUSB) {
; // シリアルポートが接続するのを待ちます(ネイティブUSBポートにのみ必要)
}
}
void loop()
{
char inChar;
if (SerialUSB.available() > 0) {
// データが受信されたら1バイト読み込む
while( -1 == (inChar = SerialUSB.read()));
// 読み込んだ"データ+1"で返す
SerialUSB.println((char)(inChar+1));
}
delay(10);
}
---------------------------------------------------------------------
C スケッチをコンパイルして書き込みます。
("Native port"で書き込む事になります)
D "Tera Term"等のターミナルツール等で操作しても良いのですが、ここは簡単にIDEのシリアルモニタを
使いましょう。
E シリアルモニタを表示させ、送信ボックスに"a"を入れて[ENTER]を押して見て下さい。
"b"が返されて表示されると思います。(送信データ+1の内容で返されます)
何とも簡単に出来てしまいました、流石Arduinoと言った所ですね、PICで苦労したのは何だったのでしょう。
しかぁ〜しぃ、
PCからデータを数バイト送信した場合、最初の1バイトしか受信しない、なぁ〜ぜぇ?、バグっぽ〜い。
因みに、"Arduino Zero"からPCへは数バイトの送信OKです。
SerialUSBライブラリのの使い方説明
SerialUSB.begin(speed)
USBでCDCクラスによるシリアル通信の初期化を行います。
uint32_t speed:通信する速度を指定します
SerialUSB(又はSerial)
指定されたシリアルポートの準備ができているかどうかを調べます。
ネイティブUSBを搭載したボードでは、if(Serial)(又はDue/Zero(SerialUSB)は、
USB CDCシリアル接続が開いているかどうかを示します。
他の全てのボード、及びUSB以外のCDCポートでは、これは常にtrueを返します。
bool Returns:指定されたシリアルポートが使用可能な場合はtrueを返します
例)
SerialUSB.begin(9600) ;
while(!SerialUSB) ; // USBポートが開くまで待つ、それ以外は常にtrueを返す
SerialUSB.end( )
シリアル通信の終了を行います、再度シリアル通信を有効にしたい時は、
SerialUSB.begin( )をコールして下さい。
終了した場合はボードがリセットされないと新しいプログラムをアップロードする事が出来ません。
ans = SerialUSB.available( )
シリアルポートに何バイトのデータが到着しているかを返します、バッファは64byteまでです。
int ans:シリアルバッファに有るデータのバイト数を返します
SerialUSB.accept( )
データを受信するまで待ちます、データはSerialUSB.read( )で取り出します。
ans = SerialUSB.peek( )
受信データを1バイト読み込みますが、バッファ中の読み取り位置は変更しません。
つまり、peek()は同じ文字を繰り返し読み取ります。
int ans:読込み可能なデータの最初の1バイトを返します、-1の場合は、データが存在しません
ans = SerialUSB.read( )
受信データを読み込みます。
int ans:読み込み可能なデータの最初の1バイトを返します、-1の場合は、データが存在しません
ans = SerialUSB.readBytes(char *buffer, size_t count)
指定した数(count)の分だけ受信データを読み込むまで待ちますが、1秒でタイムアウトです。
uint8_t *buffer :受信したデータを格納する場所を指定します
size_t count :受信するデータのバイト数を指定します
size_t ans :実際に受信したバイト数を返します
SerialUSB.flush( )
これは受信データのバッファクリアではなく、ポートに対する何らかの操作の様です。
ans = SerialUSB.write(uint8_t c)
ans = SerialUSB.write(const uint8_t *buffer, size_t size)
シリアルポートにバイナリデータを出力します。
1バイトずつ、あるいは複数バイトの送信が可能です。
uint8_t c :送信する1バイトのデータを指定します
uint8_t *buffer:送信するデータを格納した場所を指定します
size_t size :送信するデータのバイト数を指定します
size_t ans :実際に送信したバイト数を返します
SerialUSB.print( )
SerialUSB.println( )
データの送信ですが、使い方は、Serial.print( )と同じです。
以下の記事は動作させられなかったので記事は中断したままです。m(_ _)m
《キーボード(HID)》
詳しくは、本家の"Mouse and Keyboard libraries"リファレンスマニュアルを参照しましょう。
@ IDEに下記のスケッチプログラムをコピーペーストして貼り付けて下さい。
---------------------------------------------------------------------
const int buttonPin = 2 ; // input pin for pushbutton
int previousButtonState = HIGH ; // for checking the state of a pushButton
int counter = 0; // button push counter
void setup()
{
// キーボードスイッチの代わり
pinMode(buttonPin, INPUT) ;
// USBでHIDクラスのキーボードで初期化を行う
Keyboard.begin() ;
}
void loop()
{
int buttonState ;
// read the pushbutton:
buttonState = digitalRead(buttonPin);
// if the button state has changed, and it's currently pressed:
if ((buttonState != previousButtonState) && (buttonState == HIGH))
{
// increment the button counter
counter++;
// type out a message
Keyboard.print("You pressed the button ");
Keyboard.print(counter);
Keyboard.println(" times.");
}
// save the current button state for comparison next time:
previousButtonState = buttonState;
}
---------------------------------------------------------------------
C スケッチをコンパイルして書き込みます。
《マウス(HID)》
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.