Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
120 lines (98 sloc) 3.69 KB
/*
Package embd provides a hardware abstraction layer for doing embedded programming
on supported platforms like the Raspberry Pi, BeagleBone Black and CHIP. Most of the examples below
will work without change (i.e. the same binary) on all supported platforms.
== Overall structure
It's best to think of the top-level embd package as a switchboard that doesn't implement anything
on its own but rather relies on sub-packages for hosts drivers and devices and stitches them
together. The exports in the top-level package serve a number of different purposes,
which can be confusing at first:
- it defines a number of driver interfaces, such as the GPIODriver, this is the interface that
the driver for each specific platform must implement and is not something of concern to the
typical user.
- it defines the main low-level hardware interface types: analog pins, digital pins,
interrupt pins, I2Cbuses, SPI buses, PWM pins and LEDs. Each type has a New function to
instantiate one of these pins or buses.
- it defines a number of InitXXX functions that initialize the various drivers, however, these
are called by the coresponding NewXXX functions, so can be ignored.
- it defines a number of top-level convenience functions, such as DigitalWrite, that can be
called as 1-liners instead of first instantiating a DigitalPin and then writing to it
To get started a host driver needs to be registered with the top-level embd package. This is
most easily accomplished by doing an "underscore import" on of the sub-packages of embd/host,
e.g., `import _ "github.com/kidoman/embd/host/chip"`. An `Init()` function in the host driver
registers all the individual drivers with embd.
After getting the host driver the next step might be to instantiate a GPIO pin using
`NewDigitalPin` or an I2CBus using `NewI2CBus`. Such a pin or bus can be used directly but
often it is passed into the initializer of a sensor, controller or other user-level driver
which provides a high-level interface to some device. For example, the New function
for the BMP180 type in the `embd/sensor/bmp180` package takes an I2CBus as argument, which
it will use to reach the sensor.
== Samples
This section shows a few choice samples, more are available in the samples folder.
Use the LED driver to toggle LEDs on the BBB:
import "github.com/kidoman/embd"
...
embd.InitLED()
defer embd.CloseLED()
...
led, err := embd.NewLED("USR3")
...
led.Toggle()
Even shorter while prototyping:
import "github.com/kidoman/embd"
...
embd.InitLED()
defer embd.CloseLED()
...
embd.ToggleLED(3)
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.
*/
package embd