Servo Arduino

From Frack - Hackerspace Friesland
Jump to navigationJump to search
Project: Servo Arduino
Arduino-servo-encoder.jpg
Status onderbroken
Betrokkenen
Afbeelding Anoniem.png Failbaitr
Failbaitr Rol: deelnemer Deskundig met: Arduino, CNC, CNC-Frezen, Canvas, Digitale Fabricatie, ENC28J60, Glasvezel lassen, HTML, Hydroponics, Javascript, LPD8806, Linux, Mercurial, Programmeren, Python, Robotica, Software, Stappenmotor Beginnend met: Elektronica Werkt aan: Geen projecten :(
Kennisgebied(en) Arduino, Motoren
ProjectoverzichtProject toevoegen

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

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.

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;
  }
}

Libraries

Externe informatie