Servo Arduino
Het aansturen / uitlezen van dc servo's en encoders met arduino's.
Het idee is om de servo's die ik heb aan te sturen met arduino's, of in ieder geval uit te vinden wat de rotate / positie of andere data is aan de hand van de encoders op servo's
Contents
Planning
Het plan is een loop() en een interrupt gebaseerde encoder uitlezer te ontwikkelen voor op arduino's. Daarnaast wil ik een PWM motor-aansturing voor dc motoren met richting en PID positie sturing ontwikkelen om zo van DC motoren redelijk preciese Servo achtige oplossingne gebouwt kunnen worden.
- Failbaitr – loop based encoder code
- Failbaitr – interrupt based encoder code
- Failbaitr – PWM motorsturing code met richting
- Failbaitr – PID control code
- Failbaitr – Serial position input code
Beschikbare servo's
- Parvex Rx320 ER5000
- 48V Dc motor
- 3000rpm max
- HEDS-5540 encoder
- Mavilor BT0559.99.0999.A2
HEDS-5540 encoder naar arduino
Pinout met de encoder van achter gezien. Pinnen naar beneden, pin 0 is de meest linker.
- 0, ground
- 1, Index, 90 graden hoog per rotatie
- 2, Channel A
- 3 5v
- 4, Channel B
Voor het aantal rotaties:
- 0 op ground van de arduino
- 4 op 5v van de arduino
- 1 op pin 10 van de arduino
Ik gebruik digitalWriteFast uit de library die je onderaan de pagina kunt vinden om de uitleessnelheid te verhogen.
#include <digitalWriteFast.h> const int indexPin = 10; // the number of the index pin const int rotationPinA = 9; // the number of the index pin A const int rotationPinB = 8; // the number of the index pin B const int ledPin = 13; // the number of the LED pin const int rotationPulses = 500; // the number of pulses per rotation on the rotationPin const float degrees = 360; // degrees in a full circle int indexCount = 0; int rotationCount = 0; boolean movement = false; int direction = 0; int rotated = 0; float pulseDegrees = 0; int pinAState = 0; int pinBState = 0; void setup() { Serial.begin(9600); pulseDegrees = degrees / rotationPulses; Serial.write("degrees per step:"); Serial.println(pulseDegrees); // initialize the LED pin as an output: pinMode(ledPin, OUTPUT); // initialize the index pin as an input: pinMode(indexPin, INPUT); pinMode(rotationPinA, INPUT); pinMode(rotationPinB, INPUT); } void loop(){ // check if the index is high. pinAState = digitalReadFast(rotationPinA); pinBState = digitalReadFast(rotationPinB); if (pinAState == HIGH && pinBState != HIGH && !movement && direction == 0) { movement = true; direction = 1; // we are moving left } if (pinAState != HIGH && pinBState == HIGH && !movement && direction == 0) { movement = true; direction = -1; // we are moving right } if (pinAState != HIGH && pinBState != HIGH && !movement) { movement = false; direction = 0; } if (pinBState == HIGH && pinBState == HIGH && movement) { // turn LED on: rotationCount = rotationCount + direction; if(rotationCount == rotationPulses && direction==1){ rotationCount = 0; rotated = 1; } if(rotationCount < 0 && direction==-1){ rotationCount = rotationPulses; rotated = -1; } if((rotationCount % 10 ) == 0){ Serial.println(rotationCount * pulseDegrees); } digitalWrite(ledPin, LOW); movement = false; } if (digitalReadFast(indexPin) == HIGH && rotated!=0) { // turn LED on: indexCount = indexCount + rotated; digitalWriteFast(ledPin, HIGH); if((indexCount % 10 ) == 0) { Serial.println(indexCount); } rotated = 0; } }