Stap 11: P.3, Code: praten met meer servo's
Naast het verzenden van een hoek, sturen we ook een nummer om te selecteren welke servo (of grijper) om te schrijven. Merk op dat de code niet langer beoogt te ontvangen van een hoek en schrijven van die hoek naar de servo's, maar in plaats daarvan wordt gewijzigd om te lezen van een aantal in microseconden te schrijven aan die servo. Dit is gedaan omdat sommige servo's gebruik geen standaard 1000uS - 2000uS hoek codering, en het is gemakkelijker om te laten de computer-side-code dit uitzoeken en het doen van eventuele noodzakelijke berekeningen.
In code, we wachten op een paar meer bytes in Serial.available() dan vóór, en gebruik vervolgens een instructie switch om erachter te komen wat te doen zodra input heeft ontvangen:
schakelaar (servoSelect) {}
Case 0:
baseRotate.writeMicroseconds(uS);
breken;
Case 1:
bottomArm.writeMicroseconds(uS);
breken;
Case 2:
middleArm.writeMicroseconds(uS);
breken;
Case 3:
endArm.writeMicroseconds(uS);
breken;
Case 4:
if(US == 0) {digitalWrite (magnetPin, hoge);}
else {digitalWrite (magnetPin, laag);}
breken;
Case 5:
grip.writeMicroseconds(uS);
breken;
standaard:
breken;
}
Gevallen 0 - 3 zijn vrij eenvoudig - ze adresseren van elk van de hoek-positionering servo's in de arm. Zaak 4 is de elektromagneet, die is ingeschakeld alleen als de input van microseconden ongelijk aan nul is (de waarde naast het onderscheid is niet relevant), en geval 5 is de einde-gripper.
Hier is een voorbeeld video van de arm onder volledig handmatige opdracht aan te tonen dat elk van de servo's op input van de gebruiker in de GUI reageert. Aan het eind run ik een korte, voorgeprogrammeerde volgorde van coördinaten om te laten zien dat deze functionaliteit ook werkt. Merk op dat de arm oscilleert na het bereiken van elke bestemming omdat er nog steeds veel links via kinetische energie uit de beweging. Dit probleem is verholpen in de volgende stap.
YouTube video beschrijving:
"Het testen van de basisfunctionaliteit van onze software objective c met de robotarm minus grijper. De laptop communiceert met een Arduino Mega via USB en verzendt opdrachten tot 4 servo's en 1 aan/uitschakelaar MOSFET de wil bepalen de grijper. De expansiekaart zittend op de Arduino is een schild ontworpen en geëtst met een hoge huidige spanningsregelaar (opamp + pass transistor) en MOSFET met UCC37322 poort driver.
Wij werken momenteel aan een algoritme dat geleidelijk de servo's vertragen zal naarmate ze dichter bij hun doelen om te voorkomen dat ongewenste trillingen (het is als het verschil tussen een harmonische oscillator duwen tot nul met een lineaire beweging versus rottend exponentiële beweging, het niet willen blijven gaan in het laatste geval). "