In this post, we show how to use Go lang to control GPIO on pcDuino.
If you have updated the image, sometimes, GPIO is not loaded by default. We need to use commands to load GPIO:
$sudo modprobe gpio $sudo modprobe adc $sudo modprobe pwm
The main program is as follows:
package main
import (
"fmt"
"./gpio"
"time"
)
func main() {
g, err := gpio.NewGPIOLine(7,gpio.OUT)
if err != nil {
fmt.Printf("Error setting up GPIO %v: %v", 18, err)
return
}
blink(g, 100)
g.Close()
}
func blink(g *gpio.GPIOLine, n uint) {
fmt.Printf("blinking %v time(s)n", n)
for i := uint(0); i < n; i++ {
g.SetState(true)
time.Sleep(time.Duration(1000) * time.Millisecond)
g.SetState(false)
time.Sleep(time.Duration(1000) * time.Millisecond)
}
}
The package used is shown below:
package gpio
import (
"fmt"
"os"
)
type GPIOLine struct {
Number uint
fd *os.File
}
const (
IN = iota
OUT
)
func NewGPIOLine(number uint, direction int) (gpio *GPIOLine, err error) {
gpio = new(GPIOLine)
gpio.Number = number
err = gpio.SetDirection(direction)
gpio.fd, err = os.OpenFile(fmt.Sprintf("/sys/devices/virtual/misc/gpio/pin/gpio%d", gpio.Number), os.O_WRONLY|os.O_SYNC, 0666)
if err != nil {
return nil, err
}
return gpio, nil
}
func (gpio *GPIOLine) SetDirection(direction int) error {
df, err := os.OpenFile(fmt.Sprintf("/sys/devices/virtual/misc/gpio/mode/gpio%d", gpio.Number), os.O_WRONLY|os.O_SYNC, 0666)
if err != nil {
return err
}
fmt.Fprintln(df, "out")
df.Close()
return nil
}
func (gpio *GPIOLine) SetState(state bool) error {
v := "0"
if state {
v = "1"
}
_, err := fmt.Fprintln(gpio.fd, v)
return err
}
func (gpio *GPIOLine) Close() {
gpio.fd.Close()
}
The code can be downloaded from pcduinogo.tar
Please download the above code to “$HOME/mygo”. To run the code, we do “$go run blink.go”.


Leave a Reply
You must be logged in to post a comment.