embd is a hardware abstraction layer (HAL) for embedded systems.
It allows you to start your hardware hack on easily available hobby boards (like the Raspberry Pi, BeagleBone Black, etc.) by giving you staight forward access to the board's capabilities as well as a plethora of sensors (like accelerometers, gyroscopes, thermometers, etc.) and controllers (PWM generators, digital-to-analog convertors) for which we have written drivers. And when things get serious, you dont have to throw away the code. You carry forward the effort onto more custom designed boards where the HAL abstraction of EMBD will save you precious time.
Development supported and sponsored by ThoughtWorks
Also, you might be interested in: Why Golang?
After installing Go* and setting up your GOPATH, create your first .go file. We'll call it simpleblinker.go
.
package main
import (
"time"
"github.com/kidoman/embd"
_ "github.com/kidoman/embd/host/rpi" // This loads the RPi driver
)
func main() {
for {
embd.LEDToggle("LED0")
time.Sleep(250 * time.Millisecond)
}
}
Then install the EMBD package (go1.2 and greater is required):
$ go get github.com/kidoman/embd
Build the binary*:
$ export GOOS=linux
$ export GOARCH=arm
$ go build simpleblinker.go
Copy the cross-compiled binary to your RaspberryPi*:
$ scp simpleblinker pi@192.168.2.2:~
Then run the program with sudo
*:
$ sudo ./simpleblinker
You will now see the green LED (next to the always on power LED) blink every 1/4 sec.
* Notes
- Please install the cross compilers. Mac users:
brew install go --cross-compile-common
. goxc can be a big help as well - We are instructing the
go
compiler to create a binary which will run on the RaspberryPi processor - Assuming your RaspberryPi has an IP address of
192.168.2.2
. Substitute as necessary sudo
(root) permission is required as we are controlling the hardware by writing to special files- This sample program is optimized for brevity and does not clean up after itself. Click here to see the full version
Join the mailing list
- RaspberryPi
- BeagleBone Black
- Intel Galileo coming soon
- Radxa coming soon
- Cubietruck coming soon
- Bring Your Own coming soon
go get github.com/kidoman/embd/embd
will install a command line utility embd
which will allow you to quickly get started with prototyping. The binary should be available in your $GOPATH/bin
. However, to be able to run this on a ARM based device, you will need to build it with GOOS=linux
and GOARCH=arm
environment variables set.
But, since I am feeling so generous, a prebuilt/tested version is available for direct download and deployment here.
For example, if you run embd detect
on a BeagleBone Black:
root@beaglebone:~# embd detect
detected host BeagleBone Black (rev 0)
Run embd
without any arguments to discover the various commands supported by the utility.
Package embd provides a hardware abstraction layer for doing embedded programming on supported platforms like the Raspberry Pi and BeagleBone Black. Most of the examples below will work without change (i.e. the same binary) on all supported platforms. How cool is that?
Although samples are all present in the samples folder, we will show a few choice examples here.
Use the LED driver to toggle LEDs on the BBB:
import "github.com/kidoman/embd"
...
embd.InitLED()
defer embd.CloseLED()
...
led, err := embd.NewLED(3)
...
led.Toggle()
Even shorter when quickly trying things out:
import "github.com/kidoman/embd"
...
embd.InitLED()
defer embd.CloseLED()
...
embd.ToggleLED(3)
3 is the same as USR3 for all intents and purposes. The driver is smart enough to figure all this out.
BBB + PWM:
import "github.com/kidoman/embd"
...
embd.InitGPIO()
defer embd.CloseGPIO()
...
pwm, _ := embd.NewPWMPin("P9_14")
defer pwm.Close()
...
pwm.SetDuty(1000)
Control GPIO pins on the RaspberryPi / BeagleBone Black:
import "github.com/kidoman/embd"
...
embd.InitGPIO()
defer embd.CloseGPIO()
...
embd.SetDirection(10, embd.Out)
embd.DigitalWrite(10, embd.High)
Could also do:
import "github.com/kidoman/embd"
...
embd.InitGPIO()
defer embd.CloseGPIO()
...
pin, err := embd.NewDigitalPin(10)
...
pin.SetDirection(embd.Out)
pin.Write(embd.High)
Or read data from the Bosch BMP085 barometric sensor:
import "github.com/kidoman/embd"
import "github.com/kidoman/embd/sensor/bmp085"
...
bus := embd.NewI2CBus(1)
...
baro := bmp085.New(bus)
...
temp, err := baro.Temperature()
altitude, err := baro.Altitude()
Even find out the heading from the LSM303 magnetometer:
import "github.com/kidoman/embd"
import "github.com/kidoman/embd/sensor/lsm303"
...
bus := embd.NewI2CBus(1)
...
mag := lsm303.New(bus)
...
heading, err := mag.Heading()
The above two examples depend on I2C and therefore will work without change on almost all platforms.
- Digital GPIO Documentation
- Analog GPIO Documentation
- PWM Documentation
- I2C Documentation
- LED Documentation
-
TMP006 Thermopile sensor Documentation, Datasheet, Userguide
-
BMP085 Barometric pressure sensor Documentation, Datasheet
-
BMP180 Barometric pressure sensor Documentation, Datasheet
-
LSM303 Accelerometer and magnetometer Documentation, Datasheet
-
L3GD20 Gyroscope Documentation, Datasheet
-
US020 Ultrasonic proximity sensor Documentation, Product Page
-
BH1750FVI Luminosity sensor Documentation, Datasheet
- Keypad(4x3) Product Page
-
PCA9685 16-channel, 12-bit PWM Controller with I2C protocol Documentation, Datasheet, Product Page
-
MCP4725 12-bit DAC Documentation, Datasheet, Product Page
-
ServoBlaster RPi PWM/PCM based PWM controller Documentation, Product Page
We look forward to your pull requests, but contributions which abide by the guidelines will get a free beer!
File an issue, open a pull request. We are waiting.
EMBD is affectionately designed/developed by Karan Misra (kidoman), Kunal Powar (kunalpowar) and FRIENDS.