Inhoudsopgave:

Pianotegels die robotarm spelen - Ajarnpa
Pianotegels die robotarm spelen - Ajarnpa

Video: Pianotegels die robotarm spelen - Ajarnpa

Video: Pianotegels die robotarm spelen - Ajarnpa
Video: Extravagant Abandoned Castle of Colors in Portugal - A Visionary's Dream! 2024, November
Anonim
Pianotegels die robotarm spelen
Pianotegels die robotarm spelen

De groep bestaat uit 2 Automation Engineers van UCN, die met een briljant idee kwamen waar we gemotiveerd voor zijn om te doen en te ontwikkelen. Het idee is gebaseerd op een Arduino-bord dat een robotarm bestuurt. Het Arduino-bord is het brein van de operatie en dan zal de actuator van de operatie, de robotarm, doen wat hij moet doen. De uitgebreidere uitleg komt later.

Stap 1: Apparatuur

Apparatuur
Apparatuur

Robotarm:

Phantomx Pincher Robotarm Kit Maek II (https://learn.trossenrobotics.com/38-interbotix-ro…)

Software voor de robot- https://www.arduino.cc/en/Main/OldSoftwareRelease… Kleurdetectiecamera:

CMUcam5 Pixy-camera - (https://charmedlabs.com/default/pixy-cmucam5/)

Software - PixyMon (https://cmucam.org/projects/cmucam5/wiki/Install_PixyMon_on_Windows_Vista_7_8)

Stap 2: Arduino-installatie

Arduino-configuratie
Arduino-configuratie

Je kunt de opstelling hier op het bord zien, wat heel eenvoudig is.

Aan de linkerkant is de voeding.

De middelste is voor de eerste servo, die later servo voor servo met de andere servo's wordt verbonden.

De onderste is waar we het bord bedienen vanaf een pc of laptop, die aan de andere kant een USB-ingang heeft.

Stap 3: Eindprogramma

||| PROGRAMMA |||

#erbij betrekken

#include #include "poses.h" #include //Pixy Library #include

#define POSECOUNT 5

BioloidController bioloid = BioloidController (1000000);

const int SERVOCOUNT = 5; int-ID; int. pos; booleaanse IDCheck; booleaanse RunCheck;

void setup(){ pinMode(0, OUTPUT); ax12SetRegister2(1, 32, 50);//stel verbindingsnummer 1 register 32 in op snelheid 50. ax12SetRegister2(2, 32, 50);//stel verbindingsnummer 2 register 32 in op snelheid 50. ax12SetRegister2(3, 32, 50);//set joint nummer 3 register 32 op snelheid 50. ax12SetRegister2(4, 32, 50);//set joint nummer 4 register 32 op snelheid 50. ax12SetRegister2(5, 32, 100);//set joint nummer 5 register 32 tot snelheid 100. // initialiseer variabelen id = 1; pos = 0; IDCheck = 1; RunCheck = 0; //open seriële poort Serial.begin (9600); vertraging (500); Serial.println("###########################"); Serial.println("Seriële communicatie tot stand gebracht.");

//Controleer Lipo-batterijspanning CheckVoltage ();

//Scan Servo's, terugkeerpositie MoveTest(); Verplaats Huis(); Menu opties(); RunCheck = 1; }

void loop () {// lees de sensor: int inByte = Serial.read ();

schakelaar (inByte) {

geval '1': MovePose1(); pauze;

geval '2': MovePose2(); pauze; geval '3': MovePose3(); pauze;

geval '4': MovePose4(); pauze;

geval '5': MoveHome(); pauze; geval '6': Grab(); pauze;

geval '7': LEDTest(); pauze;

geval '8': RelaxServos(); pauze; } }

void CheckVoltage () {// wacht, controleer dan de spanning (LiPO-veiligheid) float-spanning = (ax12GetRegister (1, AX_PRESENT_VOLTAGE, 1)) / 10.0; Serial.println("###########################"); Serial.print ("Systeemspanning: "); Serieafdruk (spanning); Serial.println ("volt."); if (voltage 10.0){ Serial.println("Spanningsniveaus nominaal."); } if (RunCheck == 1){ MenuOptions(); } Serial.println("###########################"); }

ongeldig MoveHome(){ vertraging(100); // aanbevolen pauze bioloid.loadPose (Home); // laad de pose van FLASH in de nextPose-buffer bioloid.readPose(); // lees de huidige servoposities in naar de curPose-buffer Serial.println ("###########################"); Serial.println ("Servo's naar startpositie verplaatsen"); Serial.println("###########################"); vertraging (1000); bioloid.interpolateSetup(1000); // setup voor interpolatie van stroom-> volgende meer dan 1/2 seconde while(bioloid.interpolating> 0){ // doe dit terwijl we onze nieuwe pose bioloid.interpolateStep(); // verplaats servo's, indien nodig. vertraging (3); } if (RunCheck == 1){ MenuOptions(); } }

ongeldig MovePose1(){ vertraging(100); // aanbevolen pauze bioloid.loadPose (Pose1); // laad de pose van FLASH in de nextPose-buffer bioloid.readPose(); // lees de huidige servoposities in naar de curPose-buffer Serial.println ("###########################"); Serial.println ("Servo's naar 1e positie verplaatsen"); Serial.println("###########################"); vertraging (1000); bioloid.interpolateSetup(1000); // setup voor interpolatie van huidige-> volgende meer dan 1/2 seconde while(bioloid.interpolating> 0){ // doe dit terwijl we onze nieuwe pose bioloid.interpolateStep(); // verplaats servo's, indien nodig. vertraging (3); } Positie instellen (3, 291); // stel de positie van gewricht 3 in op '0' vertraging (100);// wacht tot gewricht beweegt als (RunCheck == 1) { MenuOptions (); } }

ongeldig MovePose2(){ vertraging(100); // aanbevolen pauze bioloid.loadPose (Pose2); // laad de pose van FLASH in de nextPose-buffer bioloid.readPose(); // lees de huidige servoposities in naar de curPose-buffer Serial.println ("###########################"); Serial.println ("Servos naar 2e positie verplaatsen"); Serial.println("###########################"); vertraging (1000); bioloid.interpolateSetup(1000); // setup voor interpolatie van stroom-> volgende meer dan 1/2 seconde while(bioloid.interpolating> 0){ // doe dit terwijl we onze nieuwe pose bioloid.interpolateStep(); // verplaats servo's, indien nodig. vertraging (3); } Positie instellen (3, 291); // stel de positie van gewricht 3 in op '0' vertraging (100);// wacht tot gewricht beweegt als (RunCheck == 1) { MenuOptions (); } } ongeldig MovePose3(){ delay(100); // aanbevolen pauze bioloid.loadPose (Pose3); // laad de pose van FLASH in de nextPose-buffer bioloid.readPose(); // lees de huidige servoposities in naar de curPose-buffer Serial.println ("###########################"); Serial.println ("Servos naar 3e positie verplaatsen"); Serial.println("###########################"); vertraging (1000); bioloid.interpolateSetup(1000); // setup voor interpolatie van stroom-> volgende meer dan 1/2 seconde while(bioloid.interpolating> 0){ // doe dit terwijl we onze nieuwe pose bioloid.interpolateStep(); // verplaats servo's, indien nodig. vertraging (3); } Positie instellen (3, 291); // stel de positie van gewricht 3 in op '0' vertraging (100);// wacht tot gewricht beweegt als (RunCheck == 1) { MenuOptions (); } }

ongeldig MovePose4(){ vertraging(100); // aanbevolen pauze bioloid.loadPose (Pose4); // laad de pose van FLASH in de nextPose-buffer bioloid.readPose(); // lees de huidige servoposities in naar de curPose-buffer Serial.println ("###########################"); Serial.println ("Servos naar 4e positie verplaatsen"); Serial.println("###########################"); vertraging (1000); bioloid.interpolateSetup(1000); // setup voor interpolatie van stroom-> volgende meer dan 1/2 seconde while(bioloid.interpolating> 0){ // doe dit terwijl we onze nieuwe pose bioloid.interpolateStep(); // verplaats servo's, indien nodig. vertraging (3); } Positie instellen (3, 291); // stel de positie van gewricht 3 in op '0' vertraging (100);// wacht tot gewricht beweegt als (RunCheck == 1) { MenuOptions (); } }

void MoveTest(){ Serial.println("###########################"); Serial.println("Initialiseren van bewegingstekentest"); Serial.println("###########################"); vertraging (500); id = 1; pos = 512; while(id <= SERVOCOUNT){ Serial.print("Bewegende servo-ID: "); Serieel.println(id);

while(pos>= 312){ SetPosition(id, pos); pos = pos--; vertraging(10); }

while(pos <= 512){ SetPosition(id, pos); pos = pos++; vertraging(10); }

// herhaal naar de volgende servo-ID id = id ++;

} if (RunCheck == 1){ MenuOptions(); } }

void MenuOptions(){ Serial.println("###########################"); Serial.println("Voer optie 1-5 in om individuele tests opnieuw uit te voeren."); Serial.println("1) 1e positie"); Serial.println("2) 2e positie"); Serial.println("3) 3e positie"); Serial.println("4) 4e positie"); Serial.println("5) Thuispositie"); Serial.println ("6) Controleer systeemspanning"); Serial.println("7) LED-test uitvoeren"); Serial.println("8) Relax servo's"); Serial.println("###########################"); }

void RelaxServos(){ id = 1; Serial.println("###########################"); Serial.println("Ontspannende servo's."); Serial.println("###########################"); while(id <= SERVOCOUNT){ Relax(id); id = (id++)%SERVOCOUNT; vertraging (50); } if (RunCheck == 1){ MenuOptions(); } }

ongeldig LEDTest(){ id = 1; Serial.println("###########################"); Serial.println ("Lopende LED-test"); Serial.println("###########################"); while(id <= SERVOCOUNT){ ax12SetRegister(id, 25, 1); Serial.print ("LED AAN - Servo-ID: "); Serieel.println(id); vertraging (3000); ax12SetRegister(id, 25, 0); Serial.print ("LED UIT - Servo-ID: "); Serieel.println(id); vertraging (3000); id = id++; } if (RunCheck == 1){ MenuOptions(); } }

void Grab(){ SetPosition(5, 800); // stel de positie van gewricht 1 in op '0' vertraging (100);//wacht tot gewricht beweegt

}

We hebben ons programma gebaseerd op het PincherTest-programma van de fabrikant met enkele belangrijke aanpassingen in het geval van positionering. We gebruikten de poses.h voor de robot om de posities in het geheugen te hebben. Ten eerste hebben we geprobeerd om onze speelarm met Pixycam automatisch te maken, maar vanwege licht- en kleine schermproblemen kon dat niet gebeuren. De robot heeft een standaard startpositie, na het uploaden van het programma zal hij alle servo's in de robot testen. We hebben de poses voor de 1-4 knoppen ingesteld, zodat het gemakkelijk te onthouden is. Voel je vrij om het programma te gebruiken.

Stap 4: Videogids

Stap 5: Conclusie

Kortom, de robot is een leuk klein project voor ons en een leuk ding om mee te spelen en mee te experimenteren. Ik moedig je aan om het te proberen en het ook aan te passen.

Aanbevolen: