シリアル通信をもう少し(Arduino詳解)

Arduino詳解その17です。前回の記事はこちらです。
hirocom777.hatenadiary.org

ちょっと寄り道

 前回までで、キッチンタイマーの大体の機能を作りました。今回は、ちょっと寄り道して今まで連載した中で細かく解説してこなかったシリアル通信機能について、もう少し掘り下げていこうと思います。キッチンタイマーが気になる方は、少し我慢してください。今回の記事は読み飛ばしてしまっても構いません。

ArduinoUNOではシリアル通信が使用されていることは以下の記事で取り上げました。

hirocom777.hatenadiary.org

実を言うとシリアル通信にもいろいろな形があるのですが、Arduino全般で使用されているシリアル通信は正式には調歩同期式と呼ばれているもので、機器間の通信などに広く使われている形式です。この記事では調歩同期式について説明します。

通信の決め事

 通信を行う場合、送信ー受信の双方で通信方法に関する取り決めをしなければいけません。具体的には以下の項目になります。

通信速度
 これは前回も説明しました。単位はbps(ビット/秒)です。
データビット数
 一回に送信するデータのビット数です。5~8を設定します。
パリティービット
 データビットを送信した後に答え合わせをするビットです。偶数パリティー、奇数パリティー、パリティーなしを選択します。
ストップビット長
 通信完了を知らせるビットの長さです。1または2を設定します。

ArduinoUNOでは、通信速度9600bps、データビット数8ビット、パリティーなし、ストップビット長1がデフォルトです。

 上記の設定を合わせると、通信ができるようになります。どんな手順で通信するのでしょうか?

どんな手順でやり取りしているか

 1バイトのデータを通信する場合で見てみましょう。TX(送信)とRX(受信)は一対一で信号線で接続されています。信号線は、何も通信していない状態ではデジタル通信の0/1の1の状態で固定されています。通信条件は、ArduinoUNOのデフォルトとします。
 上記の状態で、スケッチで1バイトの文字データ"A"を送信したとします。"A"の文字コードは65(2進数では01000001)になります。データはシリアル通信(調歩同期式)で送信できるように変換され、以下の順番で信号線に出力されます。

①スタートビット送信
 まず、信号線が1ビット分の時間だけ0になります。1ビット分の時間は、1/通信速度(秒)です。通信速度が9600のときは、1/9600秒となります。これがデータ送信開始の合図となります。

②データ送信
 次にデータの送信です。上記と同じく1ビット分の時間経過ごとに信号線がデータビットの状態(0/1)になります。データは下位ビットから上位ビットの順に送信されます。

パリティービット送信
 次はパリティービットの送信ですが、今回の条件ではパリティーなしの設定なので、この項目はありません。偶数パリティーの場合、送信したデータの1の数が奇数だと1。偶数ならば0となります。つまり、データとパリティーの1の数が常に偶数となります。奇数パリティーは、この逆です。データとパリティーの1の数が常に奇数になります。

④ストップビット送信
 最後にストップビットを送信します。指定されたストップビット長の時間だけ信号線が1になります。その後は次のスタートビットが来るまで信号線は1を維持します。

以上の①〜④を繰り返してデータを送信します。受信側は逆の要領でスタートビットを受信したら以降の信号線の状態からデータを読み取り、変換します。このやり取りを図にすると、以下のような感じになります。

f:id:HiroCom777:20200720211553j:plain

実際のスケッチでの設定方法なのですが、Serial.begin()で行います。今までのスケッチではSerial.begin(9600)としていましたが、実際には通信速度以外の設定が省略されています。Serial.begin(9600,SERIAL_8N1)の様に記述することによってデータビット数、パリティービット、ストップビット長の設定が出来ます。"SERIAL_" + データビット数 + パリティービット(E:偶数、O:奇数、N:なし) + ストップビット長です。

ArduinoUNO(や、その他の多くの機器)ではデータの変換、スタート、ストップビットの付与、パリティービットの計算、送受信データのバッファなどは専用のハードウェアで実現しています。シリアル通信を実行している間もCPUのリソースが取られることはありません。通信しながらでも他の処理を実行できます。このハードウェアを用意しなければならないのがシリアル通信の欠点なのですが、現在では半導体技術の発達でワンチップマイコンの中にコンパクトに収められています。

続きはまた今度!!

 以上が実際のシリアル通信で実行されている内容です。
 ところで、Arduinoにはもう一つシリアル通信を実行する方法があるんですが、それはまた別の機会に紹介します。次回はキッチンタイマーの機能を拡張していきます。お楽しみに!!
hirocom777.hatenadiary.org

Arduino Uno R3、GROVEシステム購入はこちらからどうぞ!!
・スイッチサイエンス
https://www.switch-science.com/
・マルツオンライン
https://www.marutsu.co.jp/


Arduino UNO入門の連載記事はコチラからどうぞ!!