🕌

Go言語でPCとUSB接続のデバイス間でシリアル通信する

2021/01/23に公開

Arduinoにセンサーを刺して、結果をSerial.printすれば、温度とか照度とかの値をPCへ送る事ができます。この値をプログラム的に加工したり、Webサーバーへ上げたり出来たら、何か面白いことが出来るかもしれません。Go言語でgo.bug.st/serialを使えば、簡単に出来ます(WindowsとmacOSで動作確認しています)。VIDが2341でPIDが0043はArduino UNOの値になります。他のデバイスとのシリアル通信では、この値とBaudRateを変更する必要があります。

main.go
package main

import (
	"bufio"
	"errors"
	"fmt"
	"log"
	"os"

	"go.bug.st/serial"
	"go.bug.st/serial/enumerator"
)

func getPortName() (string, error) {
	ports, error := enumerator.GetDetailedPortsList()
	if error != nil {
		return "", error
	}
	for _, port := range ports {
		if port.IsUSB && port.VID == "2341" && port.PID == "0043" {
			return port.Name, nil
		}
	}
	return "", errors.New("Arduino UNO is not conntected")
}

func main() {
	portName, err := getPortName()
	if err != nil {
		log.Fatal(err)
		os.Exit(1)
	}
	mode := &serial.Mode{
		BaudRate: 9600,
	}
	port, err := serial.Open(portName, mode)
	if err != nil {
		log.Fatal(err)
		os.Exit(1)
	}
	scanner := bufio.NewScanner(port)
	for scanner.Scan() {
		fmt.Println(scanner.Text())
	}
}
count.ino
int i;
void setup() {
  Serial.begin(9600);
  i = 0;
}

void loop() {
 Serial.print("number = ");
 Serial.println(i++);
 delay(1000);
}
出力
number = 0
number = 1
number = 2
number = 3
number = 4

Discussion