ITTT Robot arm arkadspel (11 / 11 steg)
Steg 11: Arduino kod
#include
Servo armServo; Servo baseServo;
deklarera variabler för motor pins int motorPin1 = 8; I 1 int motorPin2 = 9. I 2 int motorPin3 = 10; I 3 int motorPin4 = 11. I 4
int motorSpeed = 6000; variabel att ställa stepper hastighet / / experimentera med detta. för liten kommer inte att fungera. int count = 0; antalet steg gjorde int countsperrev = 68. antal steg per varv för denna motor
int sökning [8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
int motorPos = 0; Används för att hålla reda på motorn
deklarera variabler för rotationsencoder int encPins [] = {2, 3, 7, 4, 12, 13};
flyktiga int lastEncoded [] = {0, 0, 0}; flyktiga lång encoderValue [] = {90, 180, 0};
void setup() {baseServo.attach(6); armServo.attach(5); //declare motorn stift som utgångar pinMode (motorPin1, produktionen), pinMode (motorPin2, produktionen), pinMode (motorPin3, produktionen); pinMode (motorPin4, produktionen); Serial.BEGIN(9600);
att förklara rotationsencoder stift för (int jag = 0; jag < 6; i ++) {pinMode (encPins [i], ingång), digitalWrite (encPins [i], hög); //turn pullup motstånd på};
samtal updateEncoder() när någon hög/låg ändras sett //on avbrott 0 (pin 3), avbryta 1 (pin 2) eller avbryta 4 (PIN-kod 7) attachInterrupt (1, update1, förändring). attachInterrupt (0, update2, förändring); attachInterrupt (4, update3, förändring).
}
void loop() {//check första rotationsencoder och uppdatering bas servo. om (encoderValue [0] < 0) encoderValue [0] = 0; om (encoderValue [0] > 180) encoderValue [0] = 180; baseServo.write(encoderValue[0]);
kontrollera andra rotationsencoder och uppdatera arm servo. om (encoderValue [1] < 90) encoderValue [1] = 90. om (encoderValue [1] > 270) encoderValue [1] = 270; armServo.write(int(encoderValue[1]/2));
Kolla senaste rotationsencoder och justera motor position om dess lägre än den rotationsencoder positionen. Detta sätt kommer det bara gå ett steg varje slinga. om (motorPos < int(encoderValue[2]/4)) {motorPos ++; clockwise();} else om (motorPos > int(encoderValue[2]/4)) {motorPos--; anticlockwise();} //Delay om förseningen av steppermotor inte används. annat {delay(15);}
}
//Set stift till ULN2003 hög i sekvens från 1 till 4 //delay "motorSpeed" mellan varje pin (att avgöra hastighet) / / / void anticlockwise() {för (int jag = 0; jag < 8; i ++) {setOutput(i); delayMicroseconds(motorSpeed);}}
void clockwise() {för (int jag = 7; jag > = 0; i--) {setOutput(i); delayMicroseconds(motorSpeed);}}
void setOutput(int out) {digitalWrite (motorPin1, bitRead (uppslag [ut], 0)), digitalWrite (motorPin2, bitRead (uppslag [ut], 1)), digitalWrite (motorPin3, bitRead (uppslag [ut], 2)), digitalWrite (motorPin4, bitRead (uppslag [ut], 3));}
//Rotary encoder avbryta funktioner / / /
void update1() {updateEncoder(0);}
void update2() {updateEncoder(1);}
void update3() {updateEncoder(2);}
void updateEncoder (int p) {int MSB = digitalRead(encPins[p]); //MSB = mest betydande bit int LSB = digitalRead(encPins[p+3]); //LSB = minst signifikanta biten
IF(MSB == lsb) {encoderValue [p] ++;} annat {encoderValue [p]--;}
}