30
Goと電子工作とロボット たけいひでゆき @HideyukiTakei Jun. 21, 2015 / Go Conference

Golang, make and robotics #gocon

Embed Size (px)

Citation preview

Page 1: Golang, make and robotics #gocon

Goと電子工作とロボットたけいひでゆき @HideyukiTakei

Jun. 21, 2015 / Go Conference

Page 2: Golang, make and robotics #gocon

自己紹介

• H/W: 回路設計、マイコン、外装設計、中国 • SW: フロントエンドJS、Android、AWS • かわいいロボットが好き

Page 3: Golang, make and robotics #gocon

自己紹介

Page 4: Golang, make and robotics #gocon

アジェンダ• いま趣味で作っているロボットのご紹介 • Goでメジャーな電子工作のツールGobot • Arduino と Firmata • 意外と面倒なシリアル通信でのデータやりとり • RPCの必要性とgRPC • 動くデモ! • コードの説明

Page 5: Golang, make and robotics #gocon

趣味のロボットづくり

• 盆栽ロボットを作りたい • 亀+植物 • かわいく動かしたい • ゆくゆくは野に放ちたい • 野良ロボット

Page 6: Golang, make and robotics #gocon

ServoMotor RS304MD Front-Right

ServoMotor RS304MD Front-Left

ServoMotor RS304MD Back-Right

ServoMotor RS304MD Back-Left

ServoMotor RS304MD Yaw

ServoMotor RS304MD Tail

USART

Eye LED * 2Solar Cell

I2C

AVR ATXMEGA32D4 PWM

Pressure Sensor

Temperature & Humidity Sensor

9 Axis Sensors (3Acc, 3Gyro,

GPS LS20031 3.0-4.2V

Energy Harvesting

構成

USART

Page 7: Golang, make and robotics #gocon

だいたい試作はできた

Page 8: Golang, make and robotics #gocon

• eagle: プリント基板設計ソフトウェア

• elecrow, fusion pcb: プリント基板製造サービス

• Inventor: 3DCAD

• Shapeways: 3Dプリントサービス

• AVR & GCC: 8bitマイコン(C言語で開発)

試作でよく使うもの

Page 9: Golang, make and robotics #gocon

• ロボットを外部からコントロールしたい

• せっかくなのでGoを使おう

なにで制御しよう

Page 10: Golang, make and robotics #gocon

Goで電子回路の定番?

Page 11: Golang, make and robotics #gocon

いろいろ対応

Page 12: Golang, make and robotics #gocon

Gobot & RaspberryPiGoのコード with Gobot

Raspbian

GPIO, I2C

• RaspberryPi上でGoのコードが動く • 直接GPIOやI2Cを叩くことができる!

Page 13: Golang, make and robotics #gocon

Gobot & Arduino

Goのコード with Gobot Firmata

USB-Serial

• PCからArduinoを操作する • Arduino上にプログラムを転送しない

Page 14: Golang, make and robotics #gocon

ArudinoとFirmata

都度ファームウェアを USB経由で書き込む

• Arduinoの場合 • 書き込んだ後はケーブル外してOK • 電源断してもファームウェアは保存されてる

Page 15: Golang, make and robotics #gocon

ArudinoとFirmata外部から制御するためのファームウェアを あらかじめ書き込む

• Firmataの場合 • 主体はPC • PCがないと動かない • プログラムはArduinoに保存されない

Page 16: Golang, make and robotics #gocon

FirmataのGood/Bad• Good • 通信とかコマンドとかメッセージとか 意識する必要がない

• 様々な言語から叩ける • Bad • 基本的にはプリミティブな命令しかないので、リアルタイム性が高いものには 不向き

• 単独では動かない

Page 17: Golang, make and robotics #gocon

カスタムプロトコルの道• UART?BLE?Bluetooth? • だいたいはUARTでOKか

• マイコン側/PC側のプログラムも必要 • UARTが1つ埋まる • printfデバッグがしにくくなる

• プロトコル決めないと •めんどくさい

Page 18: Golang, make and robotics #gocon

そこでRPC• マイコン側の関数をコールする • 複雑な操作を1つの関数にまとめる • 16x16のLEDマトリックスに「あ」と描く • コマンドサーボ複数個の同時位置指定

• 通信経路はUART • BluetoothのSPPやUSB-Serialが使える

• なにか良いRPCないか…

Page 19: Golang, make and robotics #gocon

ロボット PC

そこで!gRPC!• シリアライズは Protocol Buffers • IDLでメッセージやRPCの構造を定義 • protocでソースコードも生成される

• 正確にはgRPC-USBSerialゲートウェイ • よし、このゲートウェイをGoで書こう! • データ形式はAVRまでProtocol Bufferで!

AVR (マイコン) gRPCサーバ(Go)

Serial

gRPC クライアント

USB

Page 20: Golang, make and robotics #gocon

歩行デモ

5(Go)個のサーボモータを

制御しながら

5(Go)歩 あるきます

Page 21: Golang, make and robotics #gocon
Page 22: Golang, make and robotics #gocon

歩行のデモ

盆栽を3月頃に調達しました

5月に枯れてしまいました…

元気だった頃の盆栽

Page 23: Golang, make and robotics #gocon

ロボット

Protocol BuffersをAVRで

• nanopb • http://koti.kapsi.fi/jpa/nanopb/

• 組み込み向けProtocolBufferのC実装 • 最低限の機能のみ実装 • 2-10 kB ROM, <1 kB RAMがターゲット • 今回のマイコンは32kB ROM、4kB RAM

AVR (マイコン) gRPCサーバ(Go)

Serial

gRPC クライアント

USB moveServos

moveServos

PC

Page 24: Golang, make and robotics #gocon

robot.proto(IDL)syntax = "proto3";

package robot;

service Soth { rpc moveServos (MoveServosRequest) returns (MoveServosResponse) {} }

message MoveServosRequest { int32 servo_front_right_position = 1; int32 servo_front_left_position = 2; int32 servo_back_right_position = 3; int32 servo_back_left_position = 4; int32 servo_yaw_position = 5; }

message MoveServosResponse { }

Page 25: Golang, make and robotics #gocon

ロボット PC

IDLのコンパイル$ protoc --go_out=. robot.proto $ prptpc --nanopb_out=. robot.proto

これで、goとcのコードが出てくる

AVR (マイコン) gRPCサーバ(Go)

Serial

gRPC クライアント

USB

robot.pb.go

moveServos

moveServos

robot.pb.h robot.pb.c

Page 26: Golang, make and robotics #gocon

gRPCサーバtype server struct{ s *serial.Port m sync.Mutex }

func (srv *server) MoveServos(ctx context.Context, in *pb.MoveServosRequest) (*pb.MoveServosResponse, error) { srv.m.Lock() defer srv.m.Unlock() writeRobotSerial(srv.s, in) return &pb.MoveServosResponse{}, nil }

シリアル通信ライブラリは github.com/tarm/serial

Page 27: Golang, make and robotics #gocon

gRPCサーバfunc main() { c := &serial.Config{ Name: “/dev/tty.usbserial-DJ004Q2V”, Baud: 115200} serial, err := serial.OpenPort(c)

if err != nil { log.Fatal(err) }

lis, err := net.Listen("tcp", port) if err != nil { log.Fatalf("failed to listen: %v", err) } s := grpc.NewServer() pb.RegisterSothServer(s, &server{s: serial}) s.Serve(lis) }

シリアル通信用初期化

gRPCサーバ起動

Page 28: Golang, make and robotics #gocon

gRPCクライアントc := pb.NewSothClient(conn)

r, err := c.MoveServos(context.Background(), &pb.MoveServosRequest{ ServoFrontRightPosition: 700, ServoFrontLeftPosition: 900, ServoBackRightPosition: 900, ServoBackLeftPosition: 700, ServoYawPosition: 900 })

Page 29: Golang, make and robotics #gocon

Goで楽しいロボットを創りましょう!

Page 30: Golang, make and robotics #gocon

codelunch.fmというポッドキャストにも 出演しました。聴いてみてください!

宣伝

Android、Ruby/Node.jsが 得意なエンジニア大募集! (もちろんGoも)