Stap 18: Programma de arm.
U vindt de schets die de robotarm in de github repository onder DynamixShield/schetsen/RobotArm regelt. Ik zal kort uitleg over de belangrijkste onderdelen van de schets.
1. eerst moet u de klasse DynamixSerial opnemen. Deze klasse is wat u zal gebruiken om te communiceren met de Dynamixel servo's.
#include
2. vervolgens hebben we enkele variabelen toe te wijzen van de pinnen voor de joystick en druk sensoren en voor het bijhouden van de servo-bewegingen.
#define SERVO_COUNT 5
#define AXIS_COUNT 4
Deze constanten niet gewijzigd. Ze gebruikt om namen te geven
op de pinnen gebruikt:
Const int x1Pin = A0;
Const int y1Pin = a1 worden verkregen;
Const int x2Pin = A2;
Const int y2Pin = A3;
Const int pressurePin = A11;
Index van de AxisPos matrix die bepaalt in grijper openen/sluiten
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. vervolgens declareren we de DynamixelSerial klasse. Deze klasse wordt ervan uitgegaan dat het gebruik van Serial1 voor mededelingen aan de Dynamixel servo's. Echter, als u in een hardware seriële poort en hier doorgeven kunt u het overschrijven. Dit is dus de software kan worden gebruikt op aangepaste projecten die geen van de DynamixShield gebruikmaken.
DynamixelSerial Dynamixel;
4. de volgende meest belangrijke deel is de setup. We starten onze debug seriële verbinding en vervolgens beginnen met de DynamixelSerial klasse. Wordt standaard een 1 Mbaud communicatie tarief en de pin die het gebruikt om controle van de half-duplex van het Dynamixel-protocol is ingesteld op basis van het bord dat u gebruikt. Dus op een pin 22 is Due, maar op de nul is pin 2. U hebt echter ook de optie voor het opgeven van deze parameters in de aanroep van de methode van het begin te negeren wat wordt gebruikt voor aangepaste projecten.
#ifdef ENABLE_DEBUG
Serial.begin(57600);
terwijl (!. Serieel);
Serial.println ('setup starten');
#endif
Dynamixel.begin (); of Dynamixel.begin (1000000, 22);
5. setup heeft dan wat code alle de servo's instellen op hun standaardpositie om het te krijgen klaar voor beweging. Het herstelt ook alle variabelen op hun standaardstatus.
6. de belangrijkste verwerking lus is vrij eenvoudig. Het roept enkel processJoysticks() en vervolgens vertragingen voor 20 milliseconden.
void loop () {}
processJoysticks();
vertraging (20);
}
7. de methode van de joystick proces heeft een lus dat gaat door elke joystick as en leest de analoge waarde van de joystick.
ongeldig processJoysticks() {}
ServoPosReport koord = "", servoAddReport = "", axisReport = "";
Lees de analoge waarde:
for (int i = 0; i
axisPos [i] = analogRead(axisID[i]);
8. het vervolgens schalen de waarde van de joystick die ligt tussen 255 en 755 in een waarde tussen -5 en 5. Als de waarde groter dan de 1020 is dan betekent wij zijn te drukken op down op de joystick om te sluiten van de kaken van de grijper, zodat zullen wij het proces grijper methode daarmee omgaan.
Als het groter dan 1020 is wordt vervolgens de knop ingedrukt.
Als (axisPos [i] < 1020) {}
servoAdd [i] = kaart (axisPos [i], 255, 755, -5, 5);
}
else {}
servoAdd [i] = 0;
}
9. dan we de waarde van de beweging naar de positie van de servo's voegen.
Als ((servoPos [i] + servoAdd[i]) > = 0 & & (servoPos [i] + servoAdd [i] < 1024)) {}
servoPos [i] += (servoDir [i] * servoAdd[i]);
}
10. dan als we verkeer op deze as hadden zetten we de nieuwe positie van de servo.
Als (servoAdd [i]! = 0) {}
Dynamixel.moveSpeed (i + 1, servoPos [i], 150); delay(10);
}
11. ten slotte noemt het processGripper. Dat begint methoden door het lezen van het analoge signaal voor de druksensor.
VOID processGripper (String & servoPosReport, String & servoAddReport) {}
gripPressure = analogRead(pressurePin);
12. omlaag drukken op de juiste joystick sluit de girpper, op de linker joystick omlaag te duwen, terwijl wordt geopend. De methode controleert dit door het zien als de positie van de as van de dicht of open grijper positie gelijk aan 1023 is. Dit is de waarde van de joystick leest wanneer u worden te drukken op down daarop. Als het niet actief is, dan zetten we de servo toevoegen om plus of minus 10. Anders, het voegt nul.
Als (axisPos [gripperCloseIdx] == 1023) {}
Als (gripPressure < 850) {}
servoAdd [gripperIdx] = -10;
}
}
anders als (axisPos [gripperOpenIdx] == 1023) {}
servoAdd [gripperIdx] = 10;
}
else {}
servoAdd [gripperIdx] = 0;
}
13. dan we de positie van de servo zetten zolang het blijft binnen 0 en 512. De gripper verplaatsen niet meer.
Als ((servoPos [gripperIdx] + servoAdd[gripperIdx]) > = 0
& & (servoPos [gripperIdx] + servoAdd [gripperIdx] < = 512)) {}
servoPos [gripperIdx] += (servoDir [gripperIdx] * servoAdd[gripperIdx]);
}
14. ten slotte, als we toegevoegd aan de positie vervolgens moeten we naar de nieuwe positie van de servo van de grijper instellen.
Als (servoAdd [gripperIdx]! = 0) {}
Dynamixel.moveSpeed (gripperIdx + 1, servoPos [gripperIdx], 150);
}
En thats it. Er zijn een aantal andere dingen in de schets die ik deed hier niet bespreken, maar dat is vooral voor foutopsporing. U kunt inschakelen door de //#define ENABLE_DEBUG 1 lijn bij de bovenkant te debuggen. Dit zal printen wat als u de schets uitvoert gebeurt er. Gebruik van de Arduino IDE u de schets om in te programmeren uw microcontroller en vervolgens laat uitvoeren voor onze nieuwe robotarm!