summaryrefslogtreecommitdiff
path: root/Arduino/libraries/AccelStepper/examples/MotorShield
diff options
context:
space:
mode:
Diffstat (limited to 'Arduino/libraries/AccelStepper/examples/MotorShield')
-rw-r--r--Arduino/libraries/AccelStepper/examples/MotorShield/MotorShield.pde103
1 files changed, 103 insertions, 0 deletions
diff --git a/Arduino/libraries/AccelStepper/examples/MotorShield/MotorShield.pde b/Arduino/libraries/AccelStepper/examples/MotorShield/MotorShield.pde
new file mode 100644
index 0000000..8018ed1
--- /dev/null
+++ b/Arduino/libraries/AccelStepper/examples/MotorShield/MotorShield.pde
@@ -0,0 +1,103 @@
+// AFMotor_ConstantSpeed.pde
+// -*- mode: C++ -*-
+//
+// Shows how to use AccelStepper to control a 3-phase motor, such as a HDD spindle motor
+// using the Adafruit Motor Shield
+// http://www.ladyada.net/make/mshield/index.html.
+// Create a subclass of AccelStepper which controls the motor pins via the
+// Motor Shield serial-to-parallel interface
+
+#include <AccelStepper.h>
+
+// Arduino pin names for interface to 74HCT595 latch
+// on Adafruit Motor Shield
+#define MOTORLATCH 12
+#define MOTORCLK 4
+#define MOTORENABLE 7
+#define MOTORDATA 8
+
+// PWM pins, also used to enable motor outputs
+#define PWM0A 5
+#define PWM0B 6
+#define PWM1A 9
+#define PWM1B 10
+#define PWM2A 11
+#define PWM2B 3
+
+
+// The main purpose of this class is to override setOutputPins to work with Adafruit Motor Shield
+class AFMotorShield : public AccelStepper
+{
+ public:
+ AFMotorShield(uint8_t interface = AccelStepper::FULL4WIRE, uint8_t pin1 = 2, uint8_t pin2 = 3, uint8_t pin3 = 4, uint8_t pin4 = 5);
+
+ virtual void setOutputPins(uint8_t mask);
+};
+
+
+AFMotorShield::AFMotorShield(uint8_t interface, uint8_t pin1, uint8_t pin2, uint8_t pin3, uint8_t pin4)
+ : AccelStepper(interface, pin1, pin2, pin3, pin4)
+{
+ // Enable motor control serial to parallel latch
+ pinMode(MOTORLATCH, OUTPUT);
+ pinMode(MOTORENABLE, OUTPUT);
+ pinMode(MOTORDATA, OUTPUT);
+ pinMode(MOTORCLK, OUTPUT);
+ digitalWrite(MOTORENABLE, LOW);
+
+ // enable both H bridges on motor 1
+ pinMode(PWM2A, OUTPUT);
+ pinMode(PWM2B, OUTPUT);
+ pinMode(PWM0A, OUTPUT);
+ pinMode(PWM0B, OUTPUT);
+ digitalWrite(PWM2A, HIGH);
+ digitalWrite(PWM2B, HIGH);
+ digitalWrite(PWM0A, HIGH);
+ digitalWrite(PWM0B, HIGH);
+
+ setOutputPins(0); // Reset
+};
+
+// Use the AF Motor Shield serial-to-parallel to set the state of the motor pins
+// Caution: the mapping of AccelStepper pins to AF motor outputs is not
+// obvious:
+// AccelStepper Motor Shield output
+// pin1 M4A
+// pin2 M1A
+// pin3 M2A
+// pin4 M3A
+// Caution this is pretty slow and limits the max speed of the motor to about 500/3 rpm
+void AFMotorShield::setOutputPins(uint8_t mask)
+{
+ uint8_t i;
+
+ digitalWrite(MOTORLATCH, LOW);
+ digitalWrite(MOTORDATA, LOW);
+
+ for (i=0; i<8; i++)
+ {
+ digitalWrite(MOTORCLK, LOW);
+
+ if (mask & _BV(7-i))
+ digitalWrite(MOTORDATA, HIGH);
+ else
+ digitalWrite(MOTORDATA, LOW);
+
+ digitalWrite(MOTORCLK, HIGH);
+ }
+ digitalWrite(MOTORLATCH, HIGH);
+}
+
+AFMotorShield stepper(AccelStepper::HALF3WIRE, 0, 0, 0, 0); // 3 phase HDD spindle drive
+
+void setup()
+{
+ stepper.setMaxSpeed(500); // divide by 3 to get rpm
+ stepper.setAcceleration(80);
+ stepper.moveTo(10000000);
+}
+
+void loop()
+{
+ stepper.run();
+}