Bygga en 5-axlig robotarm med Arduino och DynamixShield (18 / 19 steg)
Steg 18: Program armen.
Du kan hitta den skiss som styr robotarm i github databasen under DynamixShield/skisser/RobotArm. Jag kommer att kortfattat förklara de viktigaste delarna av skiss.
1. först måste du inkludera klassen DynamixSerial. Denna klass är vad du använder för att kommunicera med Dynamixel servon.
#include
2. nästa har vi vissa variabler att tilldela stiften för joystick och tryck sensorer, och hålla koll på servo rörelser.
#define SERVO_COUNT 5
#define AXIS_COUNT 4
Dessa konstanter ändras inte. De är vana att ge namn
till stift används:
CONST int x1Pin = A0;
CONST int y1Pin = A1;
CONST int x2Pin = A2;
CONST int y2Pin = A3;
CONST int pressurePin = A11;
Index för AxisPos matrisen som styr gripdon öppna/stäng
CONST int gripperCloseIdx = 1;
CONST int gripperOpenIdx = 3;
CONST int gripperIdx = 4;
int servoPos [SERVO_COUNT];
int servoDir [SERVO_COUNT];
int servoAdd [SERVO_COUNT];
int axisID [AXIS_COUNT];
int axisPos [AXIS_COUNT];
int gripPressure = 0;
3. sedan deklarerar vi klassen DynamixelSerial. Denna klass förutsätter att det använder Serial1 för kommunikation till Dynamixel servon. Dock om du passerar i hårdvara seriella portar här kan du åsidosätta den. Detta är så att programvaran kan användas på egna projekt som inte använder DynamixShield.
DynamixelSerial Dynamixel;
4. nästa viktigaste del är setup. Vi startar vår felsöka seriell anslutning och sedan börja klassen DynamixelSerial. Standardinställningen är en 1 Mbaud kommunikation hastighet och PIN-koden som används för att styra den halv duplex Dynamixel protokollet anges baserat på tavlan du använder. Så på en vederbörlig det är stift 22, men noll är det stift 2. Dock har du också möjlighet att ange dessa parametrar i anropet till metoden begin att åsidosätta vad som används för egna projekt.
#ifdef ENABLE_DEBUG
Serial.BEGIN(57600);
tag (!. Seriell);
Serial.println ("starta installationsprogrammet");
#endif
Dynamixel.BEGIN (); eller Dynamixel.begin (1000000, 22);
5. installationsprogrammet har sedan lite kod för att återställa alla servon till deras standardposition redo för rörelse. Det återställer också alla variabler till sina standardtillstånd.
6. den huvudsakliga behandlingen loopen är ganska enkel. Det kräver bara processJoysticks() och sedan förseningar 20 millisekunder.
Ogiltig loop () {
processJoysticks();
fördröjning (20);
}
7. processmetod styrspaken har en loop som går igenom varje joystick axel och läser det analoga värdet från joysticken.
void processJoysticks() {
String servoPosReport = "", servoAddReport = "", axisReport = "";
Läs analogt värde:
för (int jag = 0; jag
axisPos [i] = analogRead(axisID[i]);
8. det skalar sedan värdet från joysticken mellan 255 och 755 till ett värde mellan -5 och 5. Om värdet är större än 1020 då innebär det att vi trycker ner på joysticken till nära gripdon käftar, så vi kommer att låta processen gripdon metoden hantera detta.
Om det är större än 1020 är knappen trycks.
om (axisPos [i] < 1020) {
servoAdd [i] = karta (axisPos [i], 255, 755, -5, 5);
}
annat {
servoAdd [i] = 0;
}
9. lägger vi rörelse värdet till servon position.
om ((servoPos [i] + servoAdd[i]) > = 0 & & (servoPos [i] + servoAdd [i] < 1024)) {
servoPos [i] += (servoDir [i] * servoAdd[i]);
}
10. om vi hade rörelsen på denna axel Ange vi den nya positionen för servo.
om (servoAdd [i]! = 0) {
Dynamixel.moveSpeed (jag + 1, servoPos [i], 150); Delay(10);
}
11. Slutligen appeller det processGripper. Att börjar metoder genom att läsa den analoga signalen för trycksensorn.
void processGripper (sträng & servoPosReport, sträng & servoAddReport) {
gripPressure = analogRead(pressurePin);
12. pressar på de högra joystick stänger girpper, samtidigt som du trycker på vänster styrspak öppnas den. Metoden som kontrollerar detta genom att se om axelpositionen för nära eller öppen gripare position är lika med 1023. Detta är värdet läsa från styrspaken när du trycker ner på den. Om det är ner då vi lägga till servo för att vara plus eller minus 10. Annars lägger det till noll.
om (axisPos [gripperCloseIdx] == 1023) {
om (gripPressure < 850) {
servoAdd [gripperIdx] = -10;
}
}
annars om (axisPos [gripperOpenIdx] == 1023) {
servoAdd [gripperIdx] = 10;
}
annat {
servoAdd [gripperIdx] = 0;
}
13. då vi sätta servo positionen så länge det är inom 0 och 512. Griparen flytta inte mer än detta.
om ((servoPos [gripperIdx] + servoAdd[gripperIdx]) > = 0
& & (servoPos [gripperIdx] + servoAdd [gripperIdx] < = 512)) {
servoPos [gripperIdx] += (servoDir [gripperIdx] * servoAdd[gripperIdx]);
}
14. Slutligen, om vi lagt till position måste vi ställa den servo placeringen av griparen.
om (servoAdd [gripperIdx]! = 0) {
Dynamixel.moveSpeed (gripperIdx + 1, servoPos [gripperIdx], 150);
}
Och det är det. Det finns vissa andra saker i skissen jag inte diskutera här, men det är främst för felsökning ändamål. Du kan aktivera felsökning av uncommenting //#define ENABLE_DEBUG 1 linje överst. Detta kommer att skriva ut vad som händer när du kör skissen. Använda Arduino IDE för att programmet du skissen till din microcontroller och sedan kan köra våra nya robotarm!