├── README.md ├── main.go └── tank └── tank.go /README.md: -------------------------------------------------------------------------------- 1 | # dartbot 2 | 3 | A sometimes live demo: http://goo.gl/g9SsnZ 4 | 5 | # Current Iteration 6 | 7 | https://www.youtube.com/watch?v=i0gdi_lxjr0 8 | ![img_20151107_220513](https://cloud.githubusercontent.com/assets/1245807/11038556/30cd4df0-86c9-11e5-823b-ddf708bcfbda.jpg) 9 | 10 | # Previous Iterations 11 | 12 | https://www.youtube.com/watch?v=s8YkBwED6qY 13 | ![image](https://cloud.githubusercontent.com/assets/1245807/10918428/361212fc-822b-11e5-9784-cd49ed61f69a.png) 14 | 15 | https://www.youtube.com/watch?v=--rxGZQCRIQ 16 | ![img_20150816_112756](https://cloud.githubusercontent.com/assets/1245807/9294543/044ffd22-4416-11e5-92cb-2b28e3e0b21c.jpg) 17 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "flag" 5 | "log" 6 | "time" 7 | 8 | "github.com/hybridgroup/gobot" 9 | "github.com/hybridgroup/gobot/platforms/gpio" 10 | "github.com/hybridgroup/gobot/platforms/intel-iot/edison" 11 | "github.com/mbrumlow/dartbot/tank" 12 | "github.com/mbrumlow/webbot/webbot" 13 | ) 14 | 15 | var host = flag.String("host", "ws://localhost:8080/robot", "Robot Web Control (rwc) host.") 16 | var video = flag.String("video", "/dev/video0", "Path to video device.") 17 | var pass = flag.String("pass", "", "Password to rwc host") 18 | 19 | var maxspeed = flag.Int("maxspeed", 255, "max speed") 20 | var maxrotate = flag.Int("maxrotate", 255, "max rotate") 21 | 22 | func main() { 23 | 24 | flag.Parse() 25 | 26 | gbot := gobot.NewGobot() 27 | 28 | e := edison.NewEdisonAdaptor("edison") 29 | 30 | pwmA := gpio.NewDirectPinDriver(e, "pwmA", "3") 31 | breakA := gpio.NewDirectPinDriver(e, "breakA", "9") 32 | dirA := gpio.NewDirectPinDriver(e, "dirA", "12") 33 | 34 | pwmB := gpio.NewDirectPinDriver(e, "pwmB", "5") 35 | breakB := gpio.NewDirectPinDriver(e, "breakB", "8") 36 | dirB := gpio.NewDirectPinDriver(e, "dirB", "13") 37 | 38 | work := func() { 39 | tank := tank.NewTank(pwmA, breakA, dirA, pwmB, breakB, dirB, *maxspeed, *maxrotate) 40 | 41 | go func() { 42 | 43 | wb := webbot.New(*host, *video, *pass, tank) 44 | 45 | for { 46 | if err := wb.Run(); err != nil { 47 | log.Printf("RUN ERROR: %v\n", err.Error()) 48 | } 49 | time.Sleep(1 * time.Second) 50 | } 51 | 52 | }() 53 | 54 | } 55 | 56 | robot := gobot.NewRobot("dartBot", 57 | []gobot.Connection{e}, 58 | []gobot.Device{pwmA}, 59 | []gobot.Device{breakA}, 60 | []gobot.Device{dirA}, 61 | []gobot.Device{pwmB}, 62 | []gobot.Device{dirB}, 63 | []gobot.Device{breakB}, 64 | work, 65 | ) 66 | 67 | gbot.AddRobot(robot) 68 | gbot.Start() 69 | 70 | } 71 | -------------------------------------------------------------------------------- /tank/tank.go: -------------------------------------------------------------------------------- 1 | package tank 2 | 3 | import ( 4 | "log" 5 | "sync" 6 | 7 | "github.com/hybridgroup/gobot/platforms/gpio" 8 | ) 9 | 10 | type Tank struct { 11 | mu sync.Mutex 12 | pwmA *gpio.DirectPinDriver 13 | breakA *gpio.DirectPinDriver 14 | dirA *gpio.DirectPinDriver 15 | pwmB *gpio.DirectPinDriver 16 | breakB *gpio.DirectPinDriver 17 | dirB *gpio.DirectPinDriver 18 | 19 | maxspeed int 20 | maxrotate int 21 | } 22 | 23 | func NewTank(pwmA, breakA, dirA, pwmB, breakB, dirB *gpio.DirectPinDriver, 24 | maxspeed int, maxrotate int) *Tank { 25 | 26 | t := &Tank{ 27 | pwmA: pwmA, 28 | breakA: breakA, 29 | dirA: dirA, 30 | pwmB: pwmB, 31 | breakB: breakB, 32 | dirB: dirB, 33 | maxspeed: maxspeed, 34 | maxrotate: maxrotate} 35 | 36 | t.Stop() 37 | 38 | return t 39 | } 40 | 41 | func (t *Tank) Stop() error { 42 | 43 | t.mu.Lock() 44 | defer t.mu.Unlock() 45 | 46 | log.Printf("Stop.\n") 47 | 48 | t.breakA.DigitalWrite(1) 49 | t.breakB.DigitalWrite(1) 50 | 51 | t.pwmA.PwmWrite(0) 52 | t.pwmB.PwmWrite(0) 53 | 54 | return nil 55 | } 56 | 57 | func (t *Tank) Right() error { 58 | 59 | t.mu.Lock() 60 | defer t.mu.Unlock() 61 | 62 | log.Printf("Right.\n") 63 | 64 | t.breakA.DigitalWrite(0) 65 | t.breakB.DigitalWrite(0) 66 | 67 | t.dirB.DigitalWrite(0) 68 | t.dirA.DigitalWrite(0) 69 | 70 | t.pwmA.PwmWrite(uint8(t.maxrotate)) 71 | t.pwmB.PwmWrite(uint8(t.maxrotate)) 72 | 73 | return nil 74 | } 75 | 76 | func (t *Tank) Left() error { 77 | 78 | t.mu.Lock() 79 | defer t.mu.Unlock() 80 | 81 | log.Printf("Left.\n") 82 | 83 | t.breakA.DigitalWrite(0) 84 | t.breakB.DigitalWrite(0) 85 | 86 | t.dirB.DigitalWrite(1) 87 | t.dirA.DigitalWrite(1) 88 | 89 | t.pwmA.PwmWrite(uint8(t.maxrotate)) 90 | t.pwmB.PwmWrite(uint8(t.maxrotate)) 91 | 92 | return nil 93 | } 94 | 95 | func (t *Tank) Forward() error { 96 | 97 | t.mu.Lock() 98 | defer t.mu.Unlock() 99 | 100 | log.Printf("Forward.\n") 101 | 102 | t.breakA.DigitalWrite(0) 103 | t.breakB.DigitalWrite(0) 104 | 105 | t.dirB.DigitalWrite(0) 106 | t.dirA.DigitalWrite(1) 107 | 108 | t.pwmA.PwmWrite(uint8(t.maxspeed)) 109 | t.pwmB.PwmWrite(uint8(t.maxspeed)) 110 | 111 | return nil 112 | } 113 | 114 | func (t *Tank) Backward() error { 115 | 116 | t.mu.Lock() 117 | defer t.mu.Unlock() 118 | 119 | log.Printf("Backward.\n") 120 | 121 | t.breakA.DigitalWrite(0) 122 | t.breakB.DigitalWrite(0) 123 | 124 | t.dirB.DigitalWrite(1) 125 | t.dirA.DigitalWrite(0) 126 | 127 | t.pwmA.PwmWrite(uint8(t.maxspeed)) 128 | t.pwmB.PwmWrite(uint8(t.maxspeed)) 129 | 130 | return nil 131 | } 132 | --------------------------------------------------------------------------------