Hemgjord robotarm med hjälp av standarddelar använder Arduino och en bearbetning GUI (15 / 17 steg)
Steg 15: Arduino kod
Låt oss titta på några av element av Arduino skiss innan du börjar försöka använda det för att flytta armen.
Först är hur vi berätta skissen parametrarna för servon, eftersom vi använder mini Maestro biblioteket. Jag gjorde detta genom att ställa in en mängd strukturer, ställa in parametrarna för arm servo (linjerna 31-43 av skiss
struct maestro_parameters {
servo_channel, namn, min, max, hem, hastighet, accel och neutral kommer
direkt från min-maestro kanal fliken Inställningar så det är en bra
idé att ta en skärmdump och skriva ut den.
int servo_channel;
char servo_name [20].
int servo_min;
int servo_max;
int servo_home;
int servo_speed;
int servo_accel;
int servo_neutral;
De nästa två variablerna som krävs för Arduino kartläggning funktionen. Vi kommer att mappning av grader till
mikrosekunder. fromLow motsvarar till servo_min och och fromHigh motsvarar
servo_max.
Om vi använder axeln som exempel om din servo_min värde är 672 mikrosekunder,
som skulle motsvara +180 grader och din servo_max värde är 2248 mikrosekunder
som motsvarar-180 grader värdena fromLow och fromHigh skulle vara +180
och-180 grader respektive
int servo_fromLow;
int servo_fromHigh;
De nästa två variablerna används till att ställa de servo begränsningarna. I, annat
ord max tillåtna resa för varje servon
int servo_constLow;
int servo_constHigh;
} servo [6].
Särskilda värden för servon ställs vid linjer 66-71. För min arm skulle detta vara:
servo [0] = (maestro_parameters) {0, "Base", 1064, 1663, 1366, 0, 0, 1504, -90, 90,-80, 80};
servo [1] = (maestro_parameters) {1, "axeln", 672, 2248, 2040, 40, 0, 2040,-180, 180, -10, 180};
servo [2] = (maestro_parameters) {2, "armbågar", 928, 1872, 1738, 10, 0, 1505, 180,-180,-160, 45};
servo [3] = (maestro_parameters) {3, "Wrist_Pitch", 928, 2128, 928, 10, 0, 1500, 0, 0, 180 180};
servo [4] = (maestro_parameters) {6, "Wrist_Rotate", 608, 2448, 1500, 40, 0, 1500, 90, -90, -90, 90};
servo [5] = (maestro_parameters) {7, "Gripper", 1312, 1792, 1358, 7, 0, 1500, 10-0, 0, 10};
Låt oss tala om kartläggning funktionen i några sekunder. I allmänhet är kartfunktioner av följande form:
servoPosMs = 4 * karta (servoPosDeg, servo [servoNum] .servo_fromLow, servo [servoNum] .servo_fromHigh,
servo [servoNum] .servo_min, servo[servoNum].servo_max);
För referens måste vi multiplicera resultatvärdet mappning med 4 eftersom mini Maestro biblioteket fungerar förväntar sig värden i steg om 1/4 mikrosekund. Vad jag fann var att kartläggning funktionen var felaktiga för axel och armbåge servo växellådor, var det iväg med ett par grader vilket orsakade felaktigheter i positionering servo armen. Vad sår jag upp gör är att skapa min egen linjär regression kurvor för dessa servon och bädda in dem i kurvan. Detta gjordes i skisser moveServo() funktion.
Låt oss ta en titt på denna funktion:
void moveServo() {
Begränsa funktionen gränserna servo rörelse så du inte överväxel arm in i placerar du
vill inte
servoPosDeg = begränsa (servoPosDeg, servo [servoNum] .servo_constLow, servo[servoNum].servo_constHigh);
Mini Maestro värdena i 1/4 ms så du måste multiplicera med 4.
IF(servoNum == 1) {
servoPosMs = 4*(4.4406*servoPosDeg+1491.1);
} annat if(servoNum == 2) {
servoPosMs = 4*(-2.4208*servoPosDeg+1436.2);
} annat {
servoPosMs = 4 * karta (servoPosDeg, servo [servoNum] .servo_fromLow, servo [servoNum] .servo_fromHigh,
servo [servoNum] .servo_min, servo[servoNum].servo_max);
}
Serial.println(servoPosDeg);
setSpeed berättar hur snabbt du vill att flytta, servo servo
Ange mål berättar servo var att flytta
maestro.setSpeed((uint8_t) servo [servoNum] .servo_channel, (uint16_t) servo[servoNum].servo_speed);
maestro.setTarget((uint8_t) servo [servoNum] .servo_channel, (uint16_t) servoPosMs);
While loopen är här för att berätta skissen vänta tills servo har flyttat innan
sänder ett klart budskap
While(Maestro.getMovingState() == 1) {
Serial.println ("rörlig Servo").
};
Serial.Print ("Position är:");
Serial.println (maestro.getPosition(servo[servoNum].servo_channel));
Serial.println ("gjort");
{} < p > Serial.println ("gjort"); < /p >< p >} < /p >
I bokförda skissen har jag kommenterat ut raderna för linjär regression. Du kommer att behöva kontrollera om du behöver det eller inte. I grund och botten säga servo att flytta till de + 90 eller -90 (beroende på servo) och se om det verkligen är i 90 grader. Om du känner dig som om detta inte är tillfredsställande använda Maestro Control center för att flytta servo till 0, 90 180 grader (se figur), kopiera mikrosekund värdena och använda MS Excel för att göra en linjär trendlinje (se till att du säger det att Visa ekvationen.
För att testa skissen, läsa skiss till Arduino. När du är klar laddar öppen seriella kommando fönster och skicka kommandon till arm i följande form:
servoNum, mål grader
Exempel,
0, 25 då slå returtangenten
Detta flyttar bas servo till vänster med 25 grader.
Som Sammanfattning:
Servo Num | Servo |
---|---|
0 | Base |
1 | axel |
2 | armbåge |
3 | handleden Pitch |
4 | handled rotera |
6 | gripdon |