Inhoudsopgave:
- Stap 1: Materialen
- Stap 2: 3D print de robotarm
- Stap 3: Elektronische montage
- Stap 4: Smartphone-applicatie
- Stap 5: De Arduino-code
- Stap 6: Dat is het
Video: Robotarmspel - Smartphone-controller - Ajarnpa
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:16
Hallo !
Hier een leuk zomerspel: de robotarm bestuurd door smartphone !!
Zoals je op de video kunt zien, kun je de arm bedienen met enkele joysticks op je smartphone.
U kunt ook een patroon opslaan, dat de robot in een lus zal reproduceren, om bijvoorbeeld repetitieve taken uit te voeren. Maar dit patroon is naar wens aanpasbaar !!!!
Wees creatief !
Stap 1: Materialen
Hier ziet u het materiaal dat u nodig heeft.
Het kost je ongeveer € 50 om deze robotarm te bouwen. De software en tools kunnen worden vervangen, maar die heb ik voor dit project gebruikt.
Stap 2: 3D print de robotarm
De robotarm is 3D geprint (met onze prusa i3).
Dankzij de website "HowtoMechatronics.com" zijn zijn STL-bestanden geweldig om een 3D-arm te bouwen.
Het duurt ongeveer 20 uur om alle stukken te printen.
Stap 3: Elektronische montage
De montage is gescheiden in 2 delen:
Een elektronisch onderdeel, waarbij de arduino is verbonden met de servo's door de digitale pinnen en met het Bluetooth-apparaat (Rx, Tx).
Een Power-gedeelte, waarbij de servo's worden gevoed met 2 telefoonopladers (5V, 2A max).
Stap 4: Smartphone-applicatie
De applicatie is gemaakt op App-uitvinder 2. We gebruiken 2 joysticks om 4 servo's te bedienen en nog 2 knoppen om de laatste grip te bedienen.
We verbinden Arm en Smartphone met elkaar door middel van een Bluetooth-module (HC-06).
Ten slotte kan de gebruiker in een spaarmodus tot 9 posities voor de arm opslaan.
De arm gaat dan in een automatische modus, waar hij de opgeslagen posities reproduceert.
Stap 5: De Arduino-code
// 08/19 - Robotarm Smartphone bestuurd
#include #define TRUE true #define FALSE false //******************** VERKLARINGEN***************** **********
woord rep; // mot envoyé du module Arduino op smartphone
int chiffre_final = 0; int cmd=3; // variabele commande du servo moteur (troisième fil (oranje, jaune)) int cmd1=5; // servo1 int cmd2=9; // servo2 int cmd3=10; // servo3 //int cmd4=10; //servo4 int cmd5=11; // pince int active_saving = 0; Servomotor; //op definit notre servomoteur Servo moteur1; servomotor2; Servomotor3; //Servomotor4; Servomotor5; int step_angle_mini = 4; int stap_hoek = 3; int hoek, hoek1, hoek3, hoek5, hoek2;//hoek int pas; int r, rl, r2, r3; int inschrijver; booleaanse fin = ONWAAR; boolean fin1 = ONWAAR; boolean fin2 = ONWAAR; boolean fin3 = ONWAAR; boolean fin4 = ONWAAR; woord w; // variabele envoyé du smartphone au module Arduino int sauvegarde_positions1[5]; int sauvegarde_positions2[5]; int sauvegarde_positions3[5]; int sauvegarde_positions4[5]; int sauvegarde_positions5[5]; int sauvegarde_positions6[5]; int sauvegarde_positions7[5]; int sauvegarde_positions8[5]; int sauvegarde_positions9[5];
//int hoek; // hoek de rotatie (0 a 180)
//********************OPSTELLING*************************** ******** void setup() {sauvegarde_positions1[0] = sauvegarde_positions1[1] = sauvegarde_positions1[2] = sauvegarde_positions1[3] = sauvegarde_positions1[4] = 0; sauvegarde_positions2[0] = sauvegarde_positions2[1] = sauvegarde_positions2[2] = sauvegarde_positions2[3] = sauvegarde_positions2[4] = 0; sauvegarde_positions3[0] = sauvegarde_positions3[1] = sauvegarde_positions3[2] = sauvegarde_positions3[3] = sauvegarde_positions3[4] = 0; sauvegarde_positions4[0] = sauvegarde_positions4[1] = sauvegarde_positions4[2] = sauvegarde_positions4[3] = sauvegarde_positions4[4] = 0; sauvegarde_positions5[0] = sauvegarde_positions5[1] = sauvegarde_positions5[2] = sauvegarde_positions5[3] = sauvegarde_positions5[4] = 0; sauvegarde_positions6[0] = sauvegarde_positions6[1] = sauvegarde_positions6[2] = sauvegarde_positions6[3] = sauvegarde_positions6[4] = 0; sauvegarde_positions7[0] = sauvegarde_positions7[1] = sauvegarde_positions7[2] = sauvegarde_positions7[3] = sauvegarde_positions7[4] = 0; sauvegarde_positions8[0] = sauvegarde_positions8[1] = sauvegarde_positions8[2] = sauvegarde_positions8[3] = sauvegarde_positions8[4] = 0; sauvegarde_positions9[0] = sauvegarde_positions9[1] = sauvegarde_positions9[2] = sauvegarde_positions9[3] = sauvegarde_positions9[4] = 0; moteur.attach(cmd); // op vertrouwen op de opdracht moteur1.attach (cmd1); moteur2.attach(cmd2); moteur3.attach(cmd3); // moteur4.attach (cmd4); moteur5.attach(cmd5); motief.schrijven(6); hoek = 6; moteur1.write(100); hoek1 = 100; moteur2.write(90); moteur3.write(90); //moteur4.write (12); moteur5.write(90); hoek=6; hoek1=100; hoek2= 90; hoek3=90; hoek5=90; Serieel.begin(9600); // permettra de communiquer au module Bluetooth } //********************BOUCLE******************** **************** ongeldige lus() {
// Serial.print ("hoek");
//Serial.print(hoek);Serial.print ("\t");Serial.print(angle1);Serial.print ("\t");Serial.print(angle2);Serial.print ("\t ");Serial.print(hoek3);Serial.print ("\t");Serial.print(hoek5);Serial.print ("\n");
//Serial.print ("hoek");
int ik; w=ontvanger(); // on va recevoir une information du smartphone, la variable w switch (w) { case 1: TouchDown_Release();break; geval 2: TouchDown_Grab();break; geval 3: Base_Rotation();break; geval 4: Base_AntiRotation();break; geval 5: Waist_Rotation();pauze; geval 6: Waist_AntiRotation();break; geval 7: Third_Arm_Rotation();break; geval 8: Third_Arm_AntiRotation();break; geval 9: Fourth_Arm_Rotation();break; geval 10: Fourth_Arm_AntiRotation();break; // geval 11: Fifth_Arm_Rotation();break; // geval 12: Fifth_Arm_AntiRotation();break; case 21: Serial.print("case button 1");chiffre_final = 1;sauvegarde_positions1[0] =angle;sauvegarde_positions1[1] =angle1;sauvegarde_positions1[2] =angle2;sauvegarde_positions1[3] =angle4_positions =angle5;Serial.println(sauvegarde_positions1[1]);Serial.println(sauvegarde_positions1[2]);Serial.println(sauvegarde_positions1[3]);Serial.println(sauvegarde_positions1[4]); pauze; geval 22: chiffre_final = 2;sauvegarde_positions2[0] =hoek;sauvegarde_positions2[1] =hoek1;sauvegarde_positions2[2] =hoek2;sauvegarde_positions2[3] =hoek3;sauvegarde_positions2[4] =hoek5; pauze; geval 23: chiffre_final = 3;sauvegarde_positions3[0] =hoek;sauvegarde_positions3[1] =hoek1;sauvegarde_positions3[2] =hoek2;sauvegarde_positions3[3] =hoek3;sauvegarde_positions3[4] =hoek5 geval 24: chiffre_final = 4;sauvegarde_positions4[0] =hoek;sauvegarde_positions4[1] =hoek1;sauvegarde_positions4[2] =hoek2;sauvegarde_positions4[3] =hoek3;sauvegarde_positions4[4] =hoek5; pauze; geval 25: chiffre_final = 5;sauvegarde_positions5[0] =hoek;sauvegarde_positions5[1] =hoek1;sauvegarde_positions5[2] =hoek2;sauvegarde_positions5[3] =hoek3;sauvegarde_positions5[4] =hoek5 [4] =hoek pauze; geval 26: chiffre_final = 6;sauvegarde_positions6[0] =hoek;sauvegarde_positions6[1] =hoek1;sauvegarde_positions6[2] =hoek2;sauvegarde_positions6[3] =hoek3;sauvegarde_positions6[4] =hoek5; pauze; geval 27: chiffre_final = 7;sauvegarde_positions7[0] =hoek;sauvegarde_positions7[1] =hoek1;sauvegarde_positions7[2] =hoek2;sauvegarde_positions7[3] =hoek3;sauvegarde_positions7[4] =hoek5; pauze; geval 28: chiffre_final = 8;sauvegarde_positions8[0] =hoek;sauvegarde_positions8[1] =hoek1;sauvegarde_positions8[2] =hoek2;sauvegarde_positions8[3] =hoek3;sauvegarde_positions8[4] =hoek5; pauze; geval 29: chiffre_final = 9;sauvegarde_positions9[0] =hoek;sauvegarde_positions9[1] =hoek1;sauvegarde_positions9[2] =hoek2;sauvegarde_positions9[3] =hoek3;sauvegarde_positions9[4] =hoek5; pauze;
geval 31: Serial.print("31");activate_saving = 1;chiffre_final = 0; pauze;// BEGIN
geval 33: Serial.print("33");activate_saving = 0; pauze;// KNOP OPSLAAN standaard: pauze; } if(w == 32) { Serial.print("\nReproduceren\nChiffre final: "); Serial.print(chiffre_final); Serial.print("\n Sauvegarde positie 1: \n"); for(i=0;i<5;i++){ Serial.print(sauvegarde_positions1);Serial.print("\t");} Serial.print("\n Sauvegarde position 2: \n"); for(i=0;i<5;i++){ Serial.print(sauvegarde_positions2);Serial.print("\t");} Serial.print("\n Sauvegarde position 3: \n"); for(i=0;i<5;i++){ Serial.print(sauvegarde_positions3);Serial.print("\t");} for (i = 1;i<=chiffre_final;i++) { Serial. print(" \n\n BEGIN \nLoop: "); Serial.print(i);Serial.print("\n"); switch(i) {geval 1: goto_moteur(*(sauvegarde_positions1));delay(200); goto_moteur1(*(sauvegarde_positions1+1)); vertraging (200); goto_moteur2(*(sauvegarde_positions1+2));vertraging(200); goto_moteur3(*(sauvegarde_positions1+3)); vertraging (200); goto_moteur5(*(sauvegarde_positions1+4));vertraging(200); pauze; geval 2: goto_moteur(*(sauvegarde_positions2));delay(200); goto_moteur1(*(sauvegarde_positions2+1)); vertraging (200); goto_moteur2(*(sauvegarde_positions2+2));vertraging(200); goto_moteur3(*(sauvegarde_positions2+3)); vertraging (200); goto_moteur5(*(sauvegarde_positions2+4));vertraging(200); pauze; geval 3: goto_moteur(*(sauvegarde_positions3));delay(200); goto_moteur1(*(sauvegarde_positions3+1)); vertraging (200); goto_moteur2(*(sauvegarde_positions3+2));vertraging(200); goto_moteur3(*(sauvegarde_positions3+3)); vertraging (200); goto_moteur5(*(sauvegarde_positions3+4));vertraging(200); pauze; geval 4: goto_moteur(*(sauvegarde_positions4));delay(200); goto_moteur1(*(sauvegarde_positions4+1)); vertraging (200); goto_moteur2(*(sauvegarde_positions4+2));vertraging(200); goto_moteur3(*(sauvegarde_positions4+3)); vertraging (200); goto_moteur5(*(sauvegarde_positions4+4));vertraging(200); pauze; geval 5: goto_moteur(*(sauvegarde_positions5));delay(200); goto_moteur1(*(sauvegarde_positions5+1)); vertraging (200); goto_moteur2(*(sauvegarde_positions5+2));vertraging(200); goto_moteur3(*(sauvegarde_positions5+3)); vertraging (200); goto_moteur5(*(sauvegarde_positions5+4));vertraging(200); pauze; geval 6: goto_moteur(*(sauvegarde_positions6));delay(200); goto_moteur1(*(sauvegarde_positions6+1)); vertraging (200); goto_moteur2(*(sauvegarde_positions6+2));vertraging(200); goto_moteur3(*(sauvegarde_positions6+3)); vertraging (200); goto_moteur5(*(sauvegarde_positions6+4));vertraging(200); pauze; geval 7: goto_moteur(*(sauvegarde_positions7));delay(200); goto_moteur1(*(sauvegarde_positions7+1)); vertraging (200); goto_moteur2(*(sauvegarde_positions7+2));vertraging(200); goto_moteur3(*(sauvegarde_positions7+3)); vertraging (200); goto_moteur5(*(sauvegarde_positions7+4));vertraging(200); pauze; geval 8: goto_moteur(*(sauvegarde_positions8));delay(200); goto_moteur1(*(sauvegarde_positions8+1)); vertraging (200); goto_moteur2(*(sauvegarde_positions8+2));vertraging(200); goto_moteur3(*(sauvegarde_positions8+3)); vertraging (200); goto_moteur5(*(sauvegarde_positions8+4));vertraging(200); pauze; geval 9: goto_moteur(*(sauvegarde_positions9));delay(200); goto_moteur1(*(sauvegarde_positions9+1)); vertraging (200); goto_moteur2(*(sauvegarde_positions9+2));vertraging(200); goto_moteur3(*(sauvegarde_positions9+3)); vertraging (200); goto_moteur5(*(sauvegarde_positions9+4));vertraging(200); pauze; } Serial.print("\n********************* FIN REPRODUCEREN **************** \N "); vertraging (500); } } /*Serial.print (" debuut\n"); Serial.print(sauvegarde_positions1[0]);Serial.print (" \t");Serial.print(sauvegarde_positions1[1]);Serial.print (" \t");Serial.print(sauvegarde_positions1[2]); Serial.print (" \t");Serial.print(sauvegarde_positions1[3]);Serial.print (" \t");Serial.print(sauvegarde_positions1[4]);Serial.print (" \n"); Serial.print(sauvegarde_positions2[0]);Serial.print (" \t");Serial.print(sauvegarde_positions2[1]);Serial.print (" \t");Serial.print(sauvegarde_positions2[2]); Serial.print (" \t");Serial.print(sauvegarde_positions2[3]);Serial.print (" \t");Serial.print(sauvegarde_positions2[4]);Serial.print (" \n"); Serial.print(sauvegarde_positions3[0]);Serial.print (" \t");Serial.print(sauvegarde_positions3[1]);Serial.print (" \t");Serial.print(sauvegarde_positions3[2]); Serial.print (" \t");Serial.print(sauvegarde_positions3[3]);Serial.print (" \t");Serial.print(sauvegarde_positions3[4]);Serial.print (" \n"); Serial.print(sauvegarde_positions4[0]);Serial.print (" \t");Serial.print(sauvegarde_positions4[1]);Serial.print (" \t");Serial.print(sauvegarde_positions4[2]); Serial.print (" \t");Serial.print(sauvegarde_positions4[3]);Serial.print (" \t");Serial.print(sauvegarde_positions4[4]);Serial.print (" \n");
Serial.print("\nfin\n");*/
vertraging (100); } //****************************** FUNCTIES******************** ****************
woord recevoir() { // fonction permettant de recevoir l'information du smartphone
if (Serial.available()) { w = Serial.read();
Serieel.flush();
terug w; }}
void goto_moteur(int angle_destination)
{ while (angle_destination angle+step_angle) { Serial.print(" \n --------------* * * * * *-------------- ----\N"); Serial.print("angle_destination = \t "); Serial.print (hoek_bestemming); Serial.print("\n hoek1 = \t ");Serial.print(hoek); if (hoekbestemmingshoek + staphoek) {hoek = hoek + staphoek; moteur.write (hoek);} vertraging (100); } moteur.write(hoek_bestemming); } void goto_moteur1(int angle_destination) { while (angle_destination angle1+step_angle) { Serial.print(" \n --------------* * * * * *------- -----------\N"); Serial.print("angle_destination = \t "); Serial.print (hoek_bestemming); Serial.print("\n hoek2 = \t ");Serial.print(hoek1); if(hoek_bestemmingshoek1 +stap_hoek){hoek1 += stap_hoek; moteur1.write(hoek1);;} vertraging(100); } moteur1.write(hoek_bestemming); } void goto_moteur2(int angle_destination) {
while (hoek_bestemmingshoek2+stap_hoek)
{ Serial.print(" \n --------------* * * * * *------------------\n"); Serial.print("angle_destination = \t "); Serial.print (hoek_bestemming); Serial.print("\n hoek3 = \t ");Serial.print(hoek2); if(hoek_bestemmingshoek2 +staphoek){hoek2+=staphoek; moteur2.write(hoek2);} vertraging(100); } moteur2.write(hoek_bestemming); } void goto_moteur3(int angle_destination) {
while (hoek_bestemmingshoek3+stap_hoek)
{ Serial.print(" \n --------------* * * * * *------------------\n"); Serial.print("angle_destination = \t "); Serial.print (hoek_bestemming); Serial.print("\n hoek4 = \t ");Serial.print(hoek3); if(hoek_bestemmingshoek3 +stap_hoek){angle3+=stap_hoek; moteur3.write(hoek3);} vertraging(100); } moteur3.write(hoek_bestemming); } void goto_moteur5(int angle_destination) {
while (hoek_bestemmingshoek5+stap_hoek)
{ Serial.print(" \n --------------* * * * * *------------------\n"); Serial.print("angle_destination = \t "); Serial.print (hoek_bestemming); Serial.print("\n hoek5 = \t ");Serial.print(hoek5); if(hoek_bestemmingshoek5 +staphoek){hoek5+=staphoek; moteur5.write(hoek5);} vertraging(100); } moteur5.write(hoek_bestemming); }
void TouchDown_Release() // TouchDown-knop loslaten
{ if (angle5 < 180) { angle5 = angle5+step_angle_mini; } moteur5.write(hoek5); }
void TouchDown_Grab() // TouchDown-knop grijpen
{ if (angle5 > 0) { angle5 = angle5-step_angle_mini; } moteur5.write(hoek5); } void Base_Rotation() { if (hoek 0) { angle = angle-step_angle; } anders hoek =0; moteur.write(hoek); } void Waist_Rotation() { if (angle1 20) { angle1 = angle1-step_angle; } anders hoek1 = 20; moteur1.schrijven(hoek1); } void Third_Arm_Rotation() { if (angle2 0) { angle2 = angle2-step_angle; } moteur2.write(hoek2); } void Fourth_Arm_Rotation() { if (angle3 = 0) { angle3 = angle3-step_angle_mini; } moteur3.write(hoek3); }
Stap 6: Dat is het
Bedankt voor het kijken, ik hoop dat je het op prijs stelde!
Als je deze Instructable leuk vond, kun je ons zeker bezoeken voor meer! =)