Go 语言控制 pcDuino的 GPIO ,实现星星点灯

pc朵拉 发布于 2013/08/16 23:11
阅读 1K+
收藏 3
星星点灯啦! 让我们看看怎么用 Go 来点灯。

如果你更新过image,有些时候,GPIO, ADC, PWM这些驱动没有自动装载, 我们需要首先装载:
  1. $sudo modprobe gpio
  2. $sudo modprobe adc
  3. $sudo modprobe pwm
复制代码
主程序如下:
  1. package main

  2. import (
  3.         "fmt"
  4.         "./gpio"
  5.         "time"
  6. )

  7. func main() {

  8.         g, err := gpio.NewGPIOLine(7,gpio.OUT)
  9.         if err != nil {
  10.                 fmt.Printf("Error setting up GPIO %v: %v", 18, err)
  11.                 return
  12.         }

  13.       blink(g, 100)
  14.       g.Close()
  15. }

  16. func blink(g *gpio.GPIOLine, n uint) {
  17.         fmt.Printf("blinking %v time(s)\n", n)
  18.         for i := uint(0); i < n; i++ {
  19.                 g.SetState(true)
  20.                 time.Sleep(time.Duration(1000) * time.Millisecond)
  21.                 g.SetState(false)
  22.                 time.Sleep(time.Duration(1000) * time.Millisecond)
  23.         }
  24. }
复制代码
调用的包如下:
  1. package gpio

  2. import (
  3.         "fmt"
  4.         "os"
  5. )

  6. type GPIOLine struct {
  7.         Number uint
  8.         fd     *os.File
  9. }

  10. const (
  11.         IN = iota
  12.         OUT
  13. )

  14. func NewGPIOLine(number uint, direction int) (gpio *GPIOLine, err error) {
  15.         gpio = new(GPIOLine)
  16.         gpio.Number = number

  17.         err = gpio.SetDirection(direction)

  18.         gpio.fd, err = os.OpenFile(fmt.Sprintf("/sys/devices/virtual/misc/gpio/pin/gpio%d", gpio.Number), os.O_WRONLY|os.O_SYNC, 0666)
  19.         if err != nil {
  20.                 return nil, err
  21.         }
  22.         return gpio, nil
  23. }

  24. func (gpio *GPIOLine) SetDirection(direction int) error {
  25.         df, err := os.OpenFile(fmt.Sprintf("/sys/devices/virtual/misc/gpio/mode/gpio%d", gpio.Number), os.O_WRONLY|os.O_SYNC, 0666)
  26.         if err != nil {
  27.                 return err
  28.         }
  29.         fmt.Fprintln(df, "out")
  30.         df.Close()
  31.         return nil
  32. }

  33. func (gpio *GPIOLine) SetState(state bool) error {
  34.         v := "0"
  35.         if state {
  36.                 v = "1"
  37.         }
  38.         _, err := fmt.Fprintln(gpio.fd, v)
  39.         return err
  40. }

  41. func (gpio *GPIOLine) Close() {
  42.         gpio.fd.Close()
  43. }
复制代码
完整的代码可以在 这里 下载。 下载到pcDuino上面 目录 "$HOME/mygo"。 用下面的命令运行:
  1. $go run blink.go
复制代码







转自: http://www.pcduino.org/forum.php?mod=viewthread&tid=236
加载中
0
中山野鬼
中山野鬼
说句不算找喷的话,用汇编写这个工作,也没有这个复杂。真不知道为什么需要用go语言做。用c语言做成模块,给别的语言调用不就的了。
中山野鬼
中山野鬼
回复 @sol : 这种事情还是建议用c语言啦。大把资料。而且能真的学习到如何控制外部。否则就是直接调用插件或者包,类。不要考虑实际实现方法,各忙各的事情,不然,最终会发现自己什么也没忙起来。哈。
Risol
Risol
因为只会Go 开个玩笑啦
0
Vel
Vel
请问pcDuino支持VGA接口麽?
Vel
Vel
谢谢…
pc朵拉
pc朵拉
你好,支持 HDMI转VGA的
返回顶部
顶部