●Arduinoでシリアル通信

ArduinoにはRS232cシリアルポートが見当たりませんが、基板上にUSBシリアル変換チップが組み込まれていて、
それによりパソコンとのシリアル通信を行い、作成したプログラムなどを書き込んでいます。
安価な互換Arduinoを購入すると、USBシリアル変換チップがマイナーでドライバが標準でインストールされて無いため
チップの製造元から探してインストールする羽目になるのはそのためです。

シリアル通信を利用することによりArduinoとパソコンでデータの送受信をしたり、Arduino同士での通信などができます。


■開発環境からの送受信

Arduino IDEのツール→シリアルモニタ
シリアルモニタを開くと接続されているArduinoとのシリアル通信の確認ができます。


▼送信準備

最初の一度だけSerialライブラリを初期化します。
1番目の引数に転送速度を入れます。
デフォルトは,8ビット,パリティなし,1ストップビットです。
基本的にこれだけで用は足りますが、もしパリティとストップビットの設定をしたい場合には2番目の引数で設定でできます。

Serial.begin(9600);


▼文字の送信

C言語の考え方のprintlnは改行付き出力、printは改行なし出力の基本的な操作は同じです。
print構文は数字を出力しても、アスキーコードに変換され文字として出力します。

Serial.println(10,DEC);
これは、数字10を10進数(DEC)で文字として表示、後ろに改行を付けるを表します。

第二引数には表示する進数を入れます。
通常は、BIN OCT DEC HEXとマクロで指定されている定数を入れますが、
聞いたことのない17進数で101を表示したいとなったら、

Serial.println(101,17);
とすると、5G というこれまた見たことのない17進数の結果が表示されます。

文字列を出力するには、文字列を""で囲んで渡します。

Serial.print("Hello\n");
これは文字列Hello(改行)を出力します。

次の文はprintに渡す変数の型が違いますが、型が違うと、その型に合わせて表示されます。
char型なら一文字として表示されまが、int型だと値として表示されます。

int i = 'a';
Serial.println(i);
char c = 'a';
Serial.println(c);
数字の97とaが出力されます。

数字を出力するにはwriteを使います。

Serial.write(0x41);
0x41はアスキーコードの'A'であり、Aが表示されます。

▼文字を出力するサンプルプログラム。
void setup () {
  Serial.begin(9600);
}

void loop () {
  Serial.println(10,DEC);
  Serial.print("Hello\n");

  int i = 'a';
  Serial.println(i);

  char c = 'a';
  Serial.println(c);

  Serial.write(0x41);
  while(1);
}

出力結果

10
Hello
97
a
A

シリアルモニタを開くとこのように結果が表示されます。



▼文字の受信

char c = Serial.read();
バッファに受信データが無い場合には -1 を返します。
ノンブロッキングですので受信するまでプログラムが止まる事はありません。
シリアルモニタで文字を送信するとArduinoが受信します。

このプログラムでは受信した文字をそのまま送信します。
void setup () {
  Serial.begin(9600);
}

void loop () {
 char c;
 c = Serial.read();
 if(-1==c) return ;
 Serial.print(c);
}


▼バッファのフラッシュ

Serial.flush();

シリアルデータの送信が完了するまで待ちます。
パソコンなどのようにデータを送信完了するのではなく、送信完了までプログラムが止まる仕組みです。


■RS232c通信を行う

ArduinoのUSBにはシリアル変換チップが入っており、パソコンとシリアル通信を行っています。
それを使ってパソコンで自作アプリを作成してもシリアル通信ができます。
しかし、それでは面白くないのでArduinoにRS232c端子を付けてみたいと思います。

まずは、Arduinoの基板上にRX TXの文字がありましたので、やってはいけないのですが直接RS232cに接続してみました。
何らかの文字は送受信できるのですが、文字コードが変わっておかしい状態でした。
そもそも、RS232c側の電圧が高すぎて、Arduinoが壊れるそうです。
何かがおかしいと思い調べてみると、

Arduino側のRX TXはUARTと言うらしく、0Vと5Vでビットを表現しており、0Vが0、5Vが1だそうです。
RS232cでは、±15Vの電圧がかかり、-3V以下が1、+3V以上が0を表すそうです。

そのため、直接接続する事は出来ないため、変換する部品が必要になってきます。
RS232c TTL変換コンバーターなどがあればそれを接続すると通信が出来ますが、そんなものは持ってないため自作します。

手元にRS232cとマイコンを接続するために使うMAX3232があったため、それで作成します。
まず、データシートを検索して使い方を調べます。


データシートから見た回路図を実際の回路図に近い形で書き直しました。
使わないTTL側の入力は、正しいかどうか不明ですがフリーは良くないですのでGNDに接続しました。


RS232c端子のピンの位置、2番がRX、3番がTX、5番がGNDになります。

もう少し詳しい説明はこちら、RS232c

手元にあった適当な部品を集めて作成します。
セラミックコンデンサはすべて0.1μFです。


実際に作成した所


ArduinoのRXとTXとGNDと3.3Vを作成した基盤に接続してパソコンとのRS232c通信ができました。



▲トップページ > マイコンなど