Go言語でPCとUSB接続のデバイス間でシリアル通信する
Arduinoにセンサーを刺して、結果をSerial.print
すれば、温度とか照度とかの値をPCへ送る事ができます。この値をプログラム的に加工したり、Webサーバーへ上げたり出来たら、何か面白いことが出来るかもしれません。Go言語でgo.bug.st/serialを使えば、簡単に出来ます(WindowsとmacOSで動作確認しています)。VIDが2341でPIDが0043はArduino UNOの値になります。他のデバイスとのシリアル通信では、この値とBaudRate
を変更する必要があります。
main.go
package main
import (
"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)
}
buff := make([]byte, 100)
for {
n, err := port.Read(buff)
if err != nil {
log.Fatal(err)
os.Exit(1)
}
if n == 0 {
fmt.Println("\nEOF")
break
}
fmt.Printf("%v", string(buff[:n]))
}
}
count.ino
int i;
void setup() {
Serial.begin(9600);
i = 0;
}
void loop() {
Serial.print("number = ");
Serial.println(i++);
delay(1000);
}
出力
numb
number = 6
number = 0
number = 1
number = 2
number = 3
number = 4