ゴール
- UART がどんなものか何となくわかるようになる
- UART を使ってマイコンと PC で送受信ができるようになる
- UART を Go で使用して Windows から扱えるようになる
背景
マイコンボードで遊ぶにあたって、センサなど周辺モジュールは SPI や I2C のインターフェースとなっている事が多いです。
なので、今まで UART は知っていても使ったことがありませんでした。
今回は簡単な試作品を作成して、UART をマイコンで扱えるようにしてみようと思います。
UART とは
UART は、自分の認識では一般的に Serial 通信を行うための I/F としてよく用いられると思っています。
Wikipedia による概要は以下です。
UART (Universal Asynchronous Receiver/Transmitter, ユーアート) は、
調歩同期方式によるシリアル信号をパラレル信号に変換したり、その逆方向の変換を行うための集積回路である。
本機能のみがパッケージングされたICで供給されるものと、マイクロプロセッサのペリフェラルの一部として内蔵されるものとがある。
マキシムのMAX232のような、RS-232C規格に準拠する信号レベルに変換するICと組み合わせて、外部機器とのインタフェースとして利用されるのが一般的である。
UART - Wikipedia
今回やりたいこと
マイコンボードから送信した UART で送信したデータを、PC で受信して表示する。
実際に動かすと、以下のように受信したデータをターミナルへ表示することができました。
$ go build && uart_test.exe
[252]
[253]
[254]
[255]
[0]
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
[10]
[11]
・
・
・
ハードウェアのセットアップ
今回は以下のハードウェアを使用します。
- Arduino Nano
- https://www.switch-science.com/catalog/2554/
- Arduino Nano 互換のマイコンであればなんでもよい
- というか Arduino である必要もない
- USB - Serial 変換 IC の入った USB ケーブル
- https://akizukidenshi.com/catalog/g/gM-05840/
- FT232R の入った変換モジュールであればなんでもよい
以下のように配線をします。
Arduino と変換モジュールのロジックレベルが異なるので、ロジックレベル変換モジュールを挟んでいます。
ソフトウェアのセットアップ
以下のようにそれぞれ送信側(マイコンボード)と受信側のソースコード(PC)を作成します。
送信側
# include <SoftwareSerial.h>
SoftwareSerial mySerial(0, 1);
byte sendData = 0;
// the setup function runs once when you press reset or power the board
void setup() {
mySerial.begin(115200);
}
// the loop function runs over and over again forever
void loop() {
mySerial.write(sendData);
sendData++;
delay(100);
}
- 公式にある SoftwareSerial ライブラリを使用
- 100ms ごとに送信データをインクリメントしながら送信する
受信側
package main
import (
"fmt"
"log"
"github.com/tarm/serial"
)
func main() {
c := &serial.Config{Name: "COM4", Baud: 115200, Parity: serial.ParityNone, StopBits: serial.Stop1}
s, err := serial.OpenPort(c)
if err != nil {
log.Fatal(err)
}
buf := make([]byte, 32)
for {
n, err := s.Read(buf)
if err != nil {
log.Fatal(err)
}
fmt.Println(buf[:n])
}
}
- サードパーティのライブラリ tarm/serial を使用
- ブロッキング処理にて受信したデータを読み出して表示する
実際に動かしてみて気が付いたこと
- 通信速度が低い (9600bps とか) と、データが一定割合化けることがあった
- 115200bps に設定したら、化けることはなくなった
- どこかのセッティングが悪いと考えられるが、今回はわからなかった
- マイコンボードから速めの速度 (10ms 以下) で送信をすると受信側でデータを取りこぼす
- これもどこのレイヤで発生しているか追及していないので、今回はわからなかった
まとめ
- ハードウェアは手元にあるようなもので揃うことが多いので、試すハードルが低い
- USB Serial 変換ケーブルがあると、簡単に PC とも通信ができて、試すハードルが低い
- ソフトウェアのライブラリも、一般的な Serial 通信用のライブラリが使用できるので、試すハードルが低い
- Windows 側の Go のライブラリも、シリアルポートが COM ポートで指定出来て楽だった
- 他のマイコンボードで使用するシリアル通信と比べると、データが化けたり取りこぼしたりするケースが多いと感じた
- そのあたりはもう少し知識を掘り下げる必要がありそう