Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What is going on with this article?
@akif999

UART を使ってマイコンボード - PC (Go のプログラム) 間で通信する

ゴール

  • 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 と変換モジュールのロジックレベルが異なるので、ロジックレベル変換モジュールを挟んでいます。

uart.png

ソフトウェアのセットアップ

以下のようにそれぞれ送信側(マイコンボード)と受信側のソースコード(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);
}

受信側

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 ポートで指定出来て楽だった
  • 他のマイコンボードで使用するシリアル通信と比べると、データが化けたり取りこぼしたりするケースが多いと感じた
    • そのあたりはもう少し知識を掘り下げる必要がありそう
2
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
akif999
組込み系なソフト屋さん クローズな業界だけどOSS Poweredに生きています 自称テキストエディット科学者 Go, Perl, C

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
2
Help us understand the problem. What is going on with this article?