-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathservo.go
74 lines (67 loc) · 1.58 KB
/
servo.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package main
import (
"gobot.io/x/gobot/drivers/i2c"
"gobot.io/x/gobot/platforms/raspi"
"log"
)
/*
・PWMサイクル:20mS
・制御パルス:0.5ms~2.4ms
・制御角:±約90°(180°)
・配線:茶=GND、赤=電源[+]、橙=制御信号 [JRタイプ]
・トルク:2.5kgf・cm
・動作速度:0.1秒/60度
・動作電圧:4.8V
・温度範囲:0℃~55℃
・外形寸法:23x12.2x27mm
・重量:9g
*/
const (
freq = 50.0 // 50 Hz
ms = 1000.0 / freq // 20 ms
min = 0.5 / ms * 4096
max = 2.4 / ms * 4096
zero = (min + max) / 2 // zero point
unit = float64(max-min) / 180.0 // 1 degree
)
func initializeDriver() *i2c.PCA9685Driver {
log.Println("initialize")
adaptor := raspi.NewAdaptor()
dri := i2c.NewPCA9685Driver(adaptor)
log.Println("initialized")
err := dri.Start()
if err != nil {
panic(err)
}
log.Println("freq", freq)
err = dri.SetPWMFreq(freq)
if err != nil {
panic(err)
}
return dri
}
func NewServo(
driver *i2c.PCA9685Driver,
number int,
) *Servo {
return &Servo{
driver: driver,
number: number,
current: 0,
}
}
type Servo struct {
driver *i2c.PCA9685Driver
number int
current uint16
}
func (s *Servo) setDegree(deg float64) {
off := zero + (unit * deg)
if s.current > 0 && s.current == uint16(off) {
return
}
log.Printf("servo(%d) : degree = %f, off = %d\n", s.number, deg, uint16(off))
s.current = uint16(off)
s.driver.SetPWM(s.number, uint16(0), uint16(off))
return
}