From ae26e1d7f02b5702585ae8669a193f902ecd1a6f Mon Sep 17 00:00:00 2001 From: Ben Schwartz Date: Sun, 29 Mar 2015 09:02:10 -0500 Subject: [PATCH 1/5] adding stepper motor example --- samples/28bjy-48.go | 111 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 samples/28bjy-48.go diff --git a/samples/28bjy-48.go b/samples/28bjy-48.go new file mode 100644 index 0000000..1e61d2a --- /dev/null +++ b/samples/28bjy-48.go @@ -0,0 +1,111 @@ +// +build ignore + +package main + +// Control a stepper motor (28BJY-48) +// +// Datasheet: +// http://www.raspberrypi-spy.co.uk/wp-content/uploads/2012/07/Stepper-Motor-28BJY-48-Datasheet.pdf +// +// this is a port of Matt Hawkins' example impl from +// http://www.raspberrypi-spy.co.uk/2012/07/stepper-motor-control-in-python/ +// (link privides additional instructions for wiring your pi) + +import ( + "flag" + "fmt" + "github.com/kidoman/embd" + _ "github.com/kidoman/embd/host/rpi" + "os" + "os/signal" + "time" +) + +func main() { + stepWait := flag.Int("step-delay", 10, "milliseconds between steps") + flag.Parse() + + if err := embd.InitGPIO(); err != nil { + panic(err) + } + defer embd.CloseGPIO() + + // Physical pins 11,15,16,18 + // GPIO17,GPIO22,GPIO23,GPIO24 + stepPinNums := []int{17, 22, 23, 24} + + stepPins := make([]embd.DigitalPin, 4) + + for i, pinNum := range stepPinNums { + pin, err := embd.NewDigitalPin(pinNum) + if err != nil { + panic(err) + } + defer pin.Close() + if err := pin.SetDirection(embd.Out); err != nil { + panic(err) + } + if err := pin.Write(embd.Low); err != nil { + panic(err) + } + defer func() { + if err := pin.SetDirection(embd.In); err != nil { + panic(err) + } + }() + + stepPins[i] = pin + } + + // Define advanced sequence + // as shown in manufacturers datasheet + seq := [][]int{ + []int{1, 0, 0, 0}, + []int{1, 1, 0, 0}, + []int{0, 1, 0, 0}, + []int{0, 1, 1, 0}, + []int{0, 0, 1, 0}, + []int{0, 0, 1, 1}, + []int{0, 0, 0, 1}, + []int{1, 0, 0, 1}, + } + + stepCount := len(seq) - 1 + stepDir := 2 // Set to 1 or 2 for clockwise, -1 or -2 for counter-clockwise + + // Start main loop + quit := make(chan os.Signal, 1) + signal.Notify(quit, os.Interrupt, os.Kill) + defer signal.Stop(quit) + + stepCounter := 0 + for { + select { + case <-time.After(time.Duration(*stepWait) * time.Millisecond): + for i, pin := range stepPins { + if seq[stepCounter][i] != 0 { + fmt.Printf("Enable pin %d, step %d\n", i, stepCounter) + if err := pin.Write(embd.High); err != nil { + panic(err) + } + } else { + if err := pin.Write(embd.Low); err != nil { + panic(err) + } + + } + } + stepCounter += stepDir + + // If we reach the end of the sequence start again + if stepCounter >= stepCount { + stepCounter = 0 + } else if stepCounter < 0 { + stepCounter = stepCount + } + case <-quit: + return + } + } + +} From 2e3e23a155c07a2486a9627a7d0bacba1a031484 Mon Sep 17 00:00:00 2001 From: Ben Schwartz Date: Mon, 30 Mar 2015 19:10:19 -0500 Subject: [PATCH 2/5] style updates and using ticker to time steps --- samples/28bjy-48.go | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/samples/28bjy-48.go b/samples/28bjy-48.go index 1e61d2a..f2dfbe6 100644 --- a/samples/28bjy-48.go +++ b/samples/28bjy-48.go @@ -14,15 +14,16 @@ package main import ( "flag" "fmt" - "github.com/kidoman/embd" - _ "github.com/kidoman/embd/host/rpi" "os" "os/signal" "time" + + "github.com/kidoman/embd" + _ "github.com/kidoman/embd/host/rpi" ) func main() { - stepWait := flag.Int("step-delay", 10, "milliseconds between steps") + stepDelay := flag.Int("step-delay", 10, "milliseconds between steps") flag.Parse() if err := embd.InitGPIO(); err != nil { @@ -30,7 +31,7 @@ func main() { } defer embd.CloseGPIO() - // Physical pins 11,15,16,18 + // Physical pins 11,15,16,18 on rasp pi // GPIO17,GPIO22,GPIO23,GPIO24 stepPinNums := []int{17, 22, 23, 24} @@ -57,8 +58,7 @@ func main() { stepPins[i] = pin } - // Define advanced sequence - // as shown in manufacturers datasheet + // Define sequence described in manufacturer's datasheet seq := [][]int{ []int{1, 0, 0, 0}, []int{1, 1, 0, 0}, @@ -73,15 +73,19 @@ func main() { stepCount := len(seq) - 1 stepDir := 2 // Set to 1 or 2 for clockwise, -1 or -2 for counter-clockwise - // Start main loop quit := make(chan os.Signal, 1) signal.Notify(quit, os.Interrupt, os.Kill) defer signal.Stop(quit) - stepCounter := 0 + // Start main loop + ticker := time.NewTicker(time.Duration(*stepDelay) * time.Millisecond) + + var stepCounter int for { select { - case <-time.After(time.Duration(*stepWait) * time.Millisecond): + case <-ticker.C: + + // set pins to appropriate values for given position in the sequence for i, pin := range stepPins { if seq[stepCounter][i] != 0 { fmt.Printf("Enable pin %d, step %d\n", i, stepCounter) @@ -103,9 +107,10 @@ func main() { } else if stepCounter < 0 { stepCounter = stepCount } + case <-quit: + ticker.Stop() return } } - } From 38897e416bd5c54049230542f2a09179ccae0ebd Mon Sep 17 00:00:00 2001 From: Ben Schwartz Date: Tue, 31 Mar 2015 18:16:02 -0500 Subject: [PATCH 3/5] style updates, removing error checking from defer, and closing timer channel --- samples/28bjy-48.go | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/samples/28bjy-48.go b/samples/28bjy-48.go index f2dfbe6..8eb8882 100644 --- a/samples/28bjy-48.go +++ b/samples/28bjy-48.go @@ -49,11 +49,7 @@ func main() { if err := pin.Write(embd.Low); err != nil { panic(err) } - defer func() { - if err := pin.SetDirection(embd.In); err != nil { - panic(err) - } - }() + defer pin.SetDirection(embd.In) stepPins[i] = pin } @@ -69,7 +65,6 @@ func main() { []int{0, 0, 0, 1}, []int{1, 0, 0, 1}, } - stepCount := len(seq) - 1 stepDir := 2 // Set to 1 or 2 for clockwise, -1 or -2 for counter-clockwise @@ -79,6 +74,7 @@ func main() { // Start main loop ticker := time.NewTicker(time.Duration(*stepDelay) * time.Millisecond) + defer timer.Close() var stepCounter int for { @@ -96,7 +92,6 @@ func main() { if err := pin.Write(embd.Low); err != nil { panic(err) } - } } stepCounter += stepDir From 333194b96ff94c99a8120170090476113ed46162 Mon Sep 17 00:00:00 2001 From: Ben Schwartz Date: Tue, 31 Mar 2015 20:16:06 -0500 Subject: [PATCH 4/5] style updates, removing time.Close --- samples/28bjy-48.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/samples/28bjy-48.go b/samples/28bjy-48.go index 8eb8882..955f2cb 100644 --- a/samples/28bjy-48.go +++ b/samples/28bjy-48.go @@ -74,13 +74,11 @@ func main() { // Start main loop ticker := time.NewTicker(time.Duration(*stepDelay) * time.Millisecond) - defer timer.Close() var stepCounter int for { select { case <-ticker.C: - // set pins to appropriate values for given position in the sequence for i, pin := range stepPins { if seq[stepCounter][i] != 0 { From 3574e65c8dd408825c723f9fa42831abff10ce06 Mon Sep 17 00:00:00 2001 From: Ben Schwartz Date: Tue, 31 Mar 2015 20:22:47 -0500 Subject: [PATCH 5/5] moving ticker.Stop to defer statement when creating ticker --- samples/28bjy-48.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/28bjy-48.go b/samples/28bjy-48.go index 955f2cb..456b7db 100644 --- a/samples/28bjy-48.go +++ b/samples/28bjy-48.go @@ -74,6 +74,7 @@ func main() { // Start main loop ticker := time.NewTicker(time.Duration(*stepDelay) * time.Millisecond) + defer ticker.Stop() var stepCounter int for { @@ -102,7 +103,6 @@ func main() { } case <-quit: - ticker.Stop() return } }