Stap 15: Arduino Code
Laten we kijken naar enkele van de elementen van de Arduino schets voordat u probeert te gebruiken voor het verplaatsen van de arm.
De eerste is hoe wij vertellen de schets van de parameters voor de servo's, omdat we de mini Maestro-bibliotheek gebruikt. Ik deed dit door het opzetten van een array van structuren, elke instelling van de parameters voor de servo arm (lijnen 31-43 van de schets
struct maestro_parameters { // servo_channel, name, min, max, home, speed, accel, and neutral come // directly from the min-maestro channel settings tab so it is a good // idea to take a screen shot and print it out. 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; // The next two variables are required for Arduino mapping function. We will be mapping degrees to // microseconds. fromLow corresponds to the servo_min and and fromHigh corresponds to // servo_max. // If we use the shoulder as an example if your servo_min value is 672 microseconds, // which would correspond to +180 degrees and your servo_max value is 2248 microseconds // which corresponds to -180 degrees the fromLow and fromHigh values would be +180 // and -180 degrees respectively int servo_fromLow; int servo_fromHigh; // The next two variables are used to set the servo constraints. In, other //words the max allowable travel for each of servos int servo_constLow; int servo_constHigh; } servo[6];
Specifieke waarden voor de servo's zijn ingesteld op lijnen 66-71. Voor mijn arm zou dit zijn:
servo[0] = (maestro_parameters) {0, "Base", 1064, 1663, 1366, 0, 0, 1504, -90, 90, -80, 80}; servo[1] = (maestro_parameters) {1, "Shoulder", 672, 2248, 2040, 40, 0, 2040, -180, 180, -10, 180}; servo[2] = (maestro_parameters) {2, "Elbow", 928, 1872, 1738, 10, 0, 1505, 180, -180, -160, 45}; servo[3] = (maestro_parameters) {3, "Wrist_Pitch", 928, 2128, 928, 10, 0, 1500, 0, 180, 0, 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, 0, 10, 0, 10};
Let's talk about de functie van de toewijzing voor een paar seconden. In het algemeen is de toewijzing van functies van de volgende vorm:
servoPosMs = 4*map(servoPosDeg, servo[servoNum].servo_fromLow, servo[servoNum].servo_fromHigh, servo[servoNum].servo_min, servo[servoNum].servo_max);
Ter referentie, die we de resultaatwaarde van de toewijzing door 4 vermenigvuldigen moeten aangezien de mini Maestro bibliotheek werkt verwacht waarden in stappen van 1/4 microseconde. Wat ik vond was dat de toewijzing functie was onjuist voor de schouder en elleboog servo-versnellingsbakken, het was uitgeschakeld door een paar graden waardoor onnauwkeurigheden in de positionering van de servo arm. Wat ik geliquideerd doen is het creëren van mijn eigen curven van de lineaire regressie voor deze servo's en hen te embedding in de curve. Dit werd gedaan in schetsen moveServo() functie.
Neem een blik bij deze functie:
VOID moveServo() {/ / de grenzen van de functie beperken de servo beweging zodat u doen niet de arm in overdrive positioneert u / / wil niet servoPosDeg = beperken (servoPosDeg, servo [servoNum] .servo_constLow, servo[servoNum].servo_constHigh); //Mini Maestro waarden in de 1/4 ms dus je moet vermenigvuldigen met 4. if(servoNum == 1) {servoPosMs = 4*(4.4406*servoPosDeg+1491.1);} anders if(servoNum == 2) {servoPosMs = 4*(-2.4208*servoPosDeg+1436.2);} else {} void moveServo() { // The Constrain function limits the servo movement so you do not overdrive the arm into positions you // do not want servoPosDeg = constrain(servoPosDeg, servo[servoNum].servo_constLow, servo[servoNum].servo_constHigh); //Mini Maestro values given in 1/4 ms so you have to multiply by 4. if(servoNum == 1) { servoPosMs = 4*(4.4406*servoPosDeg+1491.1); } else if(servoNum == 2) { servoPosMs = 4*(-2.4208*servoPosDeg+1436.2); } else { servoPosMs = 4*map(servoPosDeg, servo[servoNum].servo_fromLow, servo[servoNum].servo_fromHigh, servo[servoNum].servo_min, servo[servoNum].servo_max); } //Serial.println(servoPosDeg); // setSpeed tells the servo how fast you want the servo to move, // set Target tells the servo where to move 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); // The while loop is here to tell the sketch to wait till the servo has finished moving before // sending a done message while(maestro.getMovingState() == 1) { //Serial.println("Moving Servo"); }; //Serial.print ("Position is: "); //Serial.println (maestro.getPosition(servo[servoNum].servo_channel)); Serial.println ("Done"); }<p> Serial.println ("Done");</p><p>}</p>
In de geboekte schets heb ik gereageerd op de regels voor lineaire regressie. U moet bepalen of u dit of niet moet. In feite vertellen de servo verplaatsen naar de + 90 of-90 (afhankelijk van de servo) en zien of het echt op 90 graden is. Als je het gevoel alsof dit nog niet bevredigend met het Maestro Control center kunt u de servo naar 0, 90 180 graden (zie figuur), de microseconde waarden kopiëren en gebruiken van MS Excel om te doen een lineaire trendlijn (zorg ervoor u vertellen om te laten zien van de vergelijking.
Om te testen de schets, laden de schets in de Arduino. Wanneer open laden omhoog gebeëindigd het seriële commando venster en verzendt u opdrachten te bewapenen in de volgende vorm:
servoNum, Target graden
In het volgende voorbeeld,
0, 25 dan hit return-toets
Dit verplaatst de base servo naar links door 25 graden.
Bij wijze van samenvatting:
Servo Num | Servo |
---|---|
0 | Base |
1 | schouder |
2 | -elleboog |
3 | pols Pitch |
4 | pols draaien |
6 | gripper |