EXPLORANDO GOLANG
EM AMBIENTE EMBARCADO
Alvaro Viebrantz
aviebrantz.com
@alvaroviebrantz
Alvaro Viebrantz
@alvaroviebrantz
aviebrantz.com
Google Developer Expert for IoT
Product Engineer @ Leverege
Organizador do GDG Cuiabá e DevMT
WEB SYSTEM LEVEL
& CONTAINERS
DATABASES &
MONITORING
MACHINE LEARNING
& DATA SCIENCE
MOBILE NATIVE WEB (?)SERVER
Use Cases
EMBARCADOS!
MICRO CONTROLADOR (MCU)
VS
SINGLE BOARD COMPUTER (SBC)
EMGO - Bare metal Go
Golang infelizmente não tem um bom suporte para micro controladores
github.com/ziutek/emgo
Embedded Rust
O Ecossistema Rust está mais maduro nisso
VS
github.com/rust-embedded
VAMOS FOCAR EM LINUX E 

SINGLE BOARD COMPUTERS
VANTAGENS
FOOTPRINT BAIXO (CPU/MEM)
DEPLOY COM UM ÚNICO BINÁRIO
MORE ON: GITHUB.COM/RAKYLL/GO-HARDWARE
PERIPH.IO GOBOT.IO
GOBOT.IO
MAIS FÁCIL DE INICIAR
FOCO EM CONECTIVIDADE E NÃO O ACESSO AO HARDWARE
FOCO NO ACESSO AO HARDWARE E SUPORTE A MÚLTIPLAS PLACAS
MAIS BAIXO NÍVEL
PERIPH.IO
“AMBIENTE DE DESENVOLVIMENTO”
E CROSS COMPILE
$ go build main.go
$ GOOS=? GOARCH=? go build main.go
$ GOOS=? GOARCH=? go build main.go
• GOOS - linux, darwin, windows, android,
dragonfly, freebsd, netbsd, openbsd, plan9,
solaris.
• GOARCH - amd64, 386, arm, arm64, ppc64le, ppc64,
mips64le, mips64, mipsle, mips and s390x.
$ GOOS=? GOARCH=? go build main.go
• GOOS - linux
• GOARCH - arm (32-bit ARM), arm64 (64-bit ARM),
mips64le (MIPS 64-bit, little-endian), mips64 (MIPS
64-bit, big-endian), mipsle (MIPS 32-bit, little-
endian), mips (MIPS 32-bit, big-endian).
$ GOOS=? GOARCH=? go build main.go
• GOOS - linux
• GOARCH - arm and mips
-ldflags="-s -w"
Quick tip:
to strip debugging info
build:
    GOOS=linux GOARCH=arm go build -ldflags="-s -w" -o robot-arm main.go
    
copy:
    rsync -P -a robot-arm pi@orangepizero.local:/home/pi/go
$ make build copy
PLAQUINHAS, PLAQUINHAS,
PLAQUINHAS
Raspberry Pi 3 👑
+ Ecossistema gigante
+ Wifi e Bluetooth embutido
+ Muito material na internet
+ CPU ARMv8 e 1Gb de ram
Orange Pi Zero 🍊
- Documentação ruim
+ Wifi e Bluetooth embutido
+ Muito barato
+ CPU ARMv6 e 512mb de ram
Onion Omega2
+ Low Profile
+ Larga escala
+ Wifi embutido
+ CPU MIPS e 64mb de ram
BeagleBone 🐶
Orange Pi Plus 2🍊
Raspberry Pi Zero 👑
Banana Pi M3 🍌
COMO É FEITA A COMUNICAÇÃO
COM O HARDWARE ?
CPU REGISTERS VS SYSFS
@ IOmemory.s
@ Opens the /dev/gpiomem device and maps GPIO memory
@ into program virtual address space.
@ 2017-09-29: Bob Plantz
@ Define my Raspberry Pi
.cpu cortex-a53
.fpu neon-fp-armv8
.syntax unified @ modern syntax
@ Constants for assembler
@ The following are defined in /usr/include/asm-generic/fcntl.h:
@ Note that the values are specified in octal.
.equ O_RDWR,00000002 @ open for read/write
.equ O_DSYNC,00010000 @ synchronize virtual memory
.equ #__O_SYNC,04000000 @ programming changes with
.equ O_SYNC,#__O_SYNC|O_DSYNC @ I/O memory
@ The following are defined in /usr/include/asm-generic/mman-common.h:
.equ PROT_READ,0x1 @ page can be read
.equ PROT_WRITE,0x2 @ page can be written
.equ MAP_SHARED,0x01 @ share changes
@ The following are defined by me:
.equ PERIPH,0x3f000000 @ RPi 2 & 3 peripherals
@ .equ PERIPH,0x20000000 @ RPi zero & 1 peripherals
.equ GPIO_OFFSET,0x200000 @ start of GPIO device
.equ O_FLAGS,O_RDWR|O_SYNC @ open file flags
.equ PROT_RDWR,PROT_READ|PROT_WRITE
.equ NO_PREF,0
.equ PAGE_SIZE,4096 @ Raspbian memory page
.equ FILE_DESCRP_ARG,0 @ file descriptor
.equ DEVICE_ARG,4 @ device address
.equ STACK_ARGS,8 @ sp already 8-byte aligned
@ Constant program data
.section .rodata
.align 2
CPU Register #-> /dev/gpiomem
CPU REGISTERS VS SYSFS
____ _ ____
/ #__ ___ (_)#__ ___ / #__ #__ _ ___ ___ ____ _
/ /_/ / _ / / _ / _  / /_/ / ' / -_) _ `/ _ `/
____/_#//_/_/___/_#//_/ ____/_/_/_/#__/_, /_,_/
W H A T W I L L Y O U I N V E N T ? /___/
-----------------------------------------------------
Ω-ware: 0.1.10 b160
-----------------------------------------------------
root@Omega-5D69:~# ls /sys/class/
bdi firmware i2c-dev mem net ppp
scsi_host tty
block gpio input misc pci_bus pwm
sound video4linux
bluetooth hidraw leds mmc_host phy scsi_device
spi_master watchdog
dma i2c-adapter mdio_bus mtd power_supply scsi_disk
spidev
root@Omega-5D69:~# ls /sys/class/gpio/
export gpio11 gpio16 gpio17 gpiochip0 gpiochip32 gpiochip64
unexport
base device/ label ngpio subsystem/ uevent
sysFS
root@Omega-5D69:~# echo out > /sys/class/gpio/gpio11/direction
root@Omega-5D69:~# echo 1 > /sys/class/gpio/gpio11/value
root@Omega-5D69:~# echo 0 > /sys/class/gpio/gpio11/value
Blink a LED with sysFS
TEM SUPORTE PARA SYSFS E CPU REGISTERS
ESCOLHE A MELHOR IMPLEMENTAÇÃO DISPONÍVEL
PERIPH.IO
MÃO NA MASSA
VAMOS MONTAR UMA
ESTAÇÃO METEOROLÓGICA
github.com/alvarowolfx/golang-iot-weather-station
!33
34
Onion Omega2
BMP280
Sensor de Temperatura
e Pressão
TM1637
Driver display 4 digitos
VAMOS PROGRAMAR!
INICIALIZAÇÃO
GPIO

GENERAL PURPOSE
INPUT/OUTPUT
38
ATENÇÃO!!! CADA PLACA TEM UM ESQUEMA DE NOMES PARA GPIO
DIGITAL
GPIO - SAÍDA
GPIO - LEITURA
SENSORES

DIGITAIS E ANALÓGICOS
COMUNICAÇÃO SERIAL
44
Comunicação Serial
Padrões mais conhecidos e utilizados
• I2C (Síncrono e padrão Master/Slave) - Tipicamente utilizado por sensores
digitais.
• SPI (Síncrono e alta taxa de transmissão) - Tipicamente usado em Display
gráficos e numéricos.
• UART (Assíncrono) - Tipicamente usado em módulos de Radio, GPS,
Displays LCD, Debug Serial, etc.
Sensor de Temperatura e Pressão - BMP280
SPI e I²C
I²C - Acesso ao barramento
BMxx80 - Acesso ao sensor
Display de 4 Digitos - tm1637
Protocolo próprio
TM1637 - Mostrando digitos
O QUE FAZER COM ISSO ?
INFINITAS POSSIBILIDADES COM GOLANG
Abstração
package http
HTTP Server
HTTP Server
HTTP Server
OpenCensus: A Stats Collection and Distributed
Tracing Framework
opencensus.io
OpenCensus
Armazenamento e sincronização em tempo real
• Coletar métricas
• Trace da aplicação
• Vendor Agnostic
• Diversas linguagens
• Go, Java, Node, C++, Python, etc
• Diversos Exporters
• Stackdriver, Datadog, Prometheus, Zipkin,
Jaeger
Metrics
Metrics views
Metrics views
DEMO TIME

MAY THE DEMO GODS BE WITH US
SEGUNDO PROJETO

GOPHER ROBOTIC ARM
github.com/alvarowolfx/golang-voice-iot
65
PCA9685
Module de 16 Canais PWM
Orange Pi Zero 🍊
4x Micro Servo Motores
MeArm
Garra robotica Open Source
COMUNICAÇÃO SERIAL
PWM - PULSE WIDTH MODULATION
68
PCA9685
Module de 16 Canais PWM
PERIPH.IO
+ = (?)
69
YOU CAN PORT AN EXISTING DRIVER
FROM ANOTHER ECOSYSTEM
ARDUINO, ANDROID THINGS, PYTHON
INFINITAS POSSIBILIDADES COM GOLANG
[2]
Abstrações
Goroutines FTW
Cloud IoT Core MQTT
Move Arm
DEMO TIME [2]

MAY THE DEMO GODS BE WITH US - AGAIN
PROXIMOS PASSOS
83
Próximos passos
Explorar ainda mais Golang em Ambiente embarcado
• Cgo + cross compile - Ainda não é tão fácil de fazer
• Updates Over the air (OTA) - Atualizar um device apenas com um binário
novo.
• Cenário de Gateway IoT - Alta performance na ponta coletando dados,
armazenando e sincronizando com a nuvem
• IA/ML na ponta - Usar Golang + ML em embarcado na ponta.
• Cameras e Microfones - Também são sensores
GOSTEI DE IOT
E AGORA ?
Blog posts
Dois tutoriais com arquitetura completa de IoT e Google Cloud
""www.iotforall.com
OBRIGADO
Alvaro Viebrantz
aviebrantz.com
@alvaroviebrantz

Explorando Go em Ambiente Embarcado