ArduinoでPCと通信する・その1

Arduino

今回は、USB ケーブルを通じて PC と Arduino の間でデータのやり取りをする方法を試してみます。通信ができるようになれば、

PC からの操作で Arduino に接続した機器を動かす
Arduino に接続されたセンサの値を PC で読み取る

などということができるようになります。

Arduino でシリアル通信

Arduino には、接続された機器( PC も含む)とシリアル通信を行う機能が備わっています。

シリアル通信とは

シリアル通信とは、広義には『データを1ビットずつ順次送信/受信する』通信方式のことです。1ビットずつ順番に送信していくので、接続する信号線が1本(送信/受信で信号線をわける場合は各1本)で済むという特徴があります。LANに使用するイーサネットや USB も、広義のシリアル通信の一種です。

※これに対して、複数のビットを同時に送信/受信するために信号線を複数、たとえばbyte単位で送受信するなら信号線8本(送信/受信で信号線をわける場合は各8本)を使用するものをパラレル通信と言います。

ここでいうシリアル通信とはもっと限定的な意味で、RS-232 という規格に準拠した通信方法のことです。数年前までは多くのデスクトップPCに標準でインターフェイス『シリアルポート』が装備されていた、広く普及している規格です。古い仕様で通信速度が遅いこともあって、最近はPCの世界ではあまり見かけなくなりました。しかしノイズに強いという特長があり、機械制御の分野ではまだまだ現役です。

ハードウェア構成

RS-232 は、最小限の構成では送信用の端子 TxD、受信用の端子 RxD、基準電位を表す端子 GND の3つの端子から成り立ちます。
つまり、A、Bの二つの機器を接続するとき、

機器 A の TxD と機器 B の RxD を接続
機器 A の RxD と機器 B のTxDを接続
機器 A と機器 B の GND 同士を接続

の3本の線を接続することで通信が可能になります。

※PCのシリアルポートでは、上記以外にいくつかの制御用の信号端子を追加して9ピンのインターフェイスとして実装されていました。

実験してみよう

シリアルモニタ

まず、PC 側の準備をします。USB ケーブルで PC と Arduino を接続し、Arduino IDE を起動して新規スケッチを作成して下さい。

Arduino IDE のメニューから『ツール』→『シリアルモニタ』を選択します。

Arduino IDE の下部にシリアルモニタが表示されます。

シリアルモニタの上の方にある一行入力欄に何か入力して Enter を押すと、入力された文字列がシリアル通信で送信されます。
受信した文字列はその下の広い領域に表示されます。
シリアルモニタの右上部分にある2つのドロップダウンリストは改行コードと通信速度です。このうち通信速度は送信側と受信側で一致していないと正常に通信することができません。とりあえずデフォルト値のとおり通信速度『9600』のままにしておきます。

※9600bpsは現在の感覚だと非常に遅いのですが、Arduinoに接続できるデバイスには最高速度が9600bpsのものが多くあります

プログラム

今回のソースコードは以下の通りです。

C++
void setup() {
  Serial.begin(9600);
}

void loop() {
  int i;
  for(i=1;i<=10;i++){
    Serial.println(i);
    delay(1000);
  }
}

プログラムの解説

Serial.begin() でシリアル通信の設定を行う
C++
void setup() {
  Serial.begin(9600);
}

Serial.begin() はシリアル通信の設定を行います。

void Serial.begin(int speed [ , int config ] );
引数
名前意味
speedint通信速度をbps単位で指定します。
値は 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200 のいずれかです。
configintデータ長、パリティ、ストップビットを指定します。省略可能です。

configの指定は以下の型式の定数で行います。

SERIAL_xyz

xyzの部分は以下のとおりです。

意味指定可能な値
xデータ長“6”, “7”, “8” のいずれか
yパリティ奇数パリティなら “O”(英字のオー)
偶数パリティなら ”E”
パリティなしなら “N”
zストップビット“1” または “2”

たとえば、データ長7ビット・奇数パリティ・ストップビット1ビットなら指定は『 SERIAL_7O1(数字のナナ、英字のオー、数字のイチ) 』となります。デフォルト値は『 SERIAL_8N1(データ長8ビット、パリティなし、ストップビット1ビット)』です。xyz各値のすべての組合せが定数として定義済です。

PC との通信の場合は、デフォルト値のままで大丈夫です。

返却値

なし

Serial.println() でデータを送信する
C++
void loop() {
  int i;
  for(i=1;i<=10;i++){
    Serial.println(i);
    delay(1000);
  }
}

シリアル通信でデータを送信する関数はいくつかありますが、今回は使い方がもっとも簡単な Serial.println() を利用します。Serial.println() の書式は以下の通りです。

void Serial.println(String value [ , int format ] );
引数
名前意味
valueString送信する値です。文字列型を与えた場合はそのまま、数値型を与えた場合は文字列化して送信します。
formatintvalueの型によって異なる(後述)

formatの意味は以下の通りです。

valueの型formatの意味指定可能な値
整数基数定数BIN(2進数)、OCT(8進数)、DEC(10進数)、EX (16進数)
または、基数の整数値(2,8,10,16以外も可能)
浮動小数点数小数点以下の桁数0以上の整数値
(負値でもエラーにはならないが表示がおかしくなる)
それ以外指定不可指定不可
返却値

なし

補足

Serial.println() は、value の後に改行コード『CR+LF』(C言語風に書くと “\r\n” )を送信します。改行コードを送りたくない場合は、Serial.println() の代わりに Serial.print() を使用します。

プログラムの動作

このプログラムでは、for ループで変数iの値を1から10まで1ずつ増加させながらシリアル通信で送信しています。ループ1回ごとに delay() で 1000 ms =1秒ずつ待つようにしています。

これをシリアルモニタで受信すると、1秒ごとに『 1(改行)』→『 2(改行)』→…→『 10(改行)』と順に表示されるはずです。

コンパイル&実行

それでは、Arduino IDE の『 』ボタンをクリックしてスケッチをコンパイル&実行してみましょう。

動画だとちょっと見にくいですが、画面下部のシリアルモニタに『 1 』『 2 』『 3 』…と1秒ごとに表示されていきます。

まとめ

  • ArudinoはPCとUSBケーブルを通じてシリアル通信を行うことができる
  • シリアル通信の初期化(速度等の設定)はSerial.begin()関数で行う
  • Arduinoからデータを送信するにはSerial.print()やSerial.println()関数を使用する

コメント

タイトルとURLをコピーしました