Spisu treści:

Gra z ramieniem robota - kontroler smartfona: 6 kroków
Gra z ramieniem robota - kontroler smartfona: 6 kroków

Wideo: Gra z ramieniem robota - kontroler smartfona: 6 kroków

Wideo: Gra z ramieniem robota - kontroler smartfona: 6 kroków
Wideo: EMULACJA GIER: robimy konsolę z Androida 2024, Listopad
Anonim
Gra Robotic Arm - Kontroler do smartfona
Gra Robotic Arm - Kontroler do smartfona

Cześć !

Oto zabawna gra letnia: ramię robota kontrolowane przez smartfona !!

Jak widać na filmie, możesz sterować ramieniem za pomocą niektórych joysticków na smartfonie.

Możesz również zapisać wzór, który robot będzie odtwarzał w pętli, aby wykonać kilka powtarzalnych zadań jako przykład. Ale ten wzór można dowolnie modulować !!!!

Bądź kreatywny !

Krok 1: Materiały

Materiały
Materiały

Tutaj możesz zobaczyć materiał, którego potrzebujesz.

Zbudowanie tego ramienia robota będzie kosztować około 50 €. Oprogramowanie i narzędzia można wymienić, ale użyłem ich do tego projektu.

Krok 2: Wydrukuj ramię robota w 3D

Wydrukuj ramię robota w 3D
Wydrukuj ramię robota w 3D
Wydrukuj ramię robota w 3D
Wydrukuj ramię robota w 3D
Wydrukuj ramię robota w 3D
Wydrukuj ramię robota w 3D

Ramię robota zostało wydrukowane w 3D (za pomocą naszego Prusa i3).

Dzięki stronie internetowej "HowtoMechatronics.com", jego pliki STL są niesamowite do zbudowania ramienia 3D.

Wydrukowanie wszystkich elementów zajmie około 20 godzin.

Krok 3: Montaż elektroniczny

Montaż elektroniczny
Montaż elektroniczny

Montaż jest podzielony na 2 części:

Część elektroniczna, w której arduino jest połączone z serwami za pomocą pinów cyfrowych oraz z urządzeniem Bluetooth (Rx, Tx).

Część zasilająca, w której serwa zasilane są 2 ładowarkami do telefonu (5V, 2A max).

Krok 4: Aplikacja na smartfona

Aplikacja na smartfona
Aplikacja na smartfona

Aplikacja została stworzona na wynalazcy aplikacji 2. Używamy 2 joysticków do sterowania 4 serwomechanizmami i 2 dodatkowymi przyciskami do sterowania ostatecznym uchwytem.

Łączymy ramię i smartfon razem za pomocą modułu Bluetooth (HC-06).

Wreszcie, tryb zapisywania pozwala użytkownikowi zapisać do 9 pozycji dla uzbrojenia.

Ramię przejdzie wówczas w tryb automatyczny, w którym odtworzy zapisane pozycje.

Krok 5: Kod Arduino

Kod Arduino
Kod Arduino
Kod Arduino
Kod Arduino

// 19.08 – Sterowanie smartfonem z ramieniem robota

#include #define TRUE true #define FALSE false //********************DEKLARACJE****************** ***********

słowo rep; // mot envoyé du module Arduino au smartphone

int chiffre_final = 0; int cmd=3; // zmienna commande du servo moteur (troisième fil (pomarańczowy, jaune)) int cmd1=5; // servo1 int cmd2=9; // servo2 int cmd3=10; // serwo3 //int cmd4=10; //servo4 int cmd5=11; // pince int active_saving = 0; Serwomotor; //zdefiniuj notre servomoteur Servo moteur1; Serwo moteur2; Serwomotor3; //Moteur serwo4; Serwo moteur5; int step_angle_mini = 4; int kąt_kroku = 3; int angle, angle1, angle3, angle5, angle2;//angle int pas; intr, r1, r2, r3; int.rejestrator; płetwa logiczna = FAŁSZ; wartość logiczna fin1 = FAŁSZ; fin2 logiczna = FAŁSZ; fin3 logiczna = FAŁSZ; wartość logiczna fi4 = FAŁSZ; słowo w; // zmienna 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 kąt; // kąt obrotu (0 a 180)

//********************USTAWIAĆ*************************** ******** 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); // polegaj na l'objet au pin de commande moteur1.attach(cmd1); moteur2.attach(cmd2); moteur3.attach(cmd3); // moteur4.attach(cmd4); moteur5.attach(cmd5); moteur.zapis(6); kąt = 6; moteur1.zapis(100); kąt1 = 100; moteur2.write(90); moteur3.write(90); //moteur4.write(12); moteur5.write(90); kąt=6; kąt1=100; kąt2= 90; kąt3=90; kąt5=90; Serial.początek(9600); // permettra de communiquer au module Bluetooth } //********************BOUCLE******************** ***************** nieważna pętla() {

// Serial.print (" kąt");

//Serial.print(kąt);Serial.print (" \t");Serial.print(angle1);Serial.print (" \t");Serial.print(angle2);Serial.print (" \t ");Serial.print(angle3);Serial.print (" \t");Serial.print(angle5);Serial.print (" \n");

//Serial.print("kąt");

wew; w=odbiornik(); // na va recevoir une information du smartphone, la variable w switch (w) { case 1: TouchDown_Release();break; przypadek 2: TouchDown_Grab();przerwa; przypadek 3: Base_Rotation();przerwa; przypadek 4: Base_AntiRotation();przerwa; przypadek 5: Obrót_talii();przerwa; przypadek 6: Talia_AntiRotation();przerwa; przypadek 7: Third_Arm_Rotation();przerwa; przypadek 8: Third_Arm_AntiRotation();przerwa; przypadek 9: Czwarte_obrót_ramienia();przerwa; przypadek 10: Czwarte_Arm_AntiRotation();przerwa; //przypadek 11: Fifth_Arm_Rotation();break; //przypadek 12: Fifth_Arm_AntiRotation();break; case 21: Serial.print("przycisk sprawy 1 ");chiffre_final = 1;sauvegarde_positions1[0] =kąt;sauvegarde_positions1[1] =kąt1;sauvegarde_positions1[2] =kąt2;sauvegarde_positions1[3] =kąt3;sauvegarde_positions1[4] =angle5;Serial.println(sauvegarde_positions1[1]);Serial.println(sauvegarde_positions1[2]);Serial.println(sauvegarde_positions1[3]);Serial.println(sauvegarde_positions1[4]); przerwa; przypadek 22: chiffre_final = 2;sauvegarde_positions2[0] =kąt;sauvegarde_positions2[1] =kąt1;sauvegarde_positions2[2] =kąt2;sauvegarde_positions2[3] =kąt3;zauvegarde_positions2[4] =kąt5; przerwa; przypadek 23: chiffre_final = 3;sauvegarde_positions3[0] =kąt;sauvegarde_positions3[1] =kąt1;sauvegarde_positions3[2] =kąt2;sauvegarde_positions3[3] =kąt3;sauvegarde_positions3[4] =kąt5;przerwa; przypadek 24: chiffre_final = 4;sauvegarde_positions4[0] =kąt;sauvegarde_positions4[1] =kąt1;sauvegarde_positions4[2] =kąt2;sauvegarde_positions4[3] =kąt3;sauvegarde_positions4[4] =kąt5; przerwa; przypadek 25: chiffre_final = 5;sauvegarde_positions5[0] =kąt;sauvegarde_positions5[1] =kąt1;sauvegarde_positions5[2] =kąt2;sauvegarde_positions5[3] =kąt3;sauvegarde_positions5[4] =kąt5; przerwa; przypadek 26: chiffre_final = 6;sauvegarde_positions6[0] =kąt;sauvegarde_positions6[1] =kąt1;sauvegarde_positions6[2] =kąt2;sauvegarde_positions6[3] =kąt3;sauvegarde_positions6[4] =kąt5; przerwa; przypadek 27: chiffre_final = 7;sauvegarde_positions7[0] =kąt;sauvegarde_positions7[1] =kąt1;sauvegarde_positions7[2] =kąt2;sauvegarde_positions7[3] =kąt3;zauvegarde_positions7[4] =kąt5; przerwa; przypadek 28: chiffre_final = 8;sauvegarde_positions8[0] =kąt;sauvegarde_positions8[1] =kąt1;sauvegarde_positions8[2] =kąt2;sauvegarde_positions8[3] =kąt3;sauvegarde_positions8[4] =kąt5; przerwa; przypadek 29: chiffre_final = 9;sauvegarde_positions9[0] =kąt;sauvegarde_positions9[1] =kąt1;sauvegarde_positions9[2] =kąt2;sauvegarde_positions9[3] =kąt3;sauvegarde_positions9[4] =kąt5; przerwa;

przypadek 31: Serial.print("31");activate_saving = 1;chiffre_final = 0; przerwa;// POCZĄTEK

case 33: Serial.print("33");activate_saving = 0; break;// BUTTON SAVE default: break; } if(w == 32) { Serial.print("\nOdtwórz\nChiffre final: "); Serial.print(chiffre_final); Serial.print("\n Pozycja Sauvegarde 1: \n"); for(i=0;i<5;i++){ Serial.print(sauvegarde_positions1);Serial.print("\t");} Serial.print("\n Sauvegarde pozycja 2: \n"); for(i=0;i<5;i++){ Serial.print(sauvegarde_positions2);Serial.print("\t");} Serial.print("\n Sauvegarde pozycja 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 POCZĄTEK \nPętla: "); Serial.print(i);Serial.print("\n"); switch(i) { przypadek 1: goto_moteur(*(sauvegarde_positions1));delay(200); goto_moteur1(*(sauvegarde_positions1+1)); opóźnienie(200); goto_moteur2(*(sauvegarde_positions1+2));opóźnienie(200); goto_moteur3(*(sauvegarde_positions1+3)); opóźnienie(200); goto_moteur5(*(sauvegarde_positions1+4));opóźnienie(200); przerwa; przypadek 2: goto_moteur(*(sauvegarde_positions2));opóźnienie(200); goto_moteur1(*(sauvegarde_positions2+1)); opóźnienie(200); goto_moteur2(*(sauvegarde_positions2+2));opóźnienie(200); goto_moteur3(*(sauvegarde_positions2+3)); opóźnienie(200); goto_moteur5(*(sauvegarde_positions2+4));opóźnienie(200); przerwa; przypadek 3: goto_moteur(*(sauvegarde_positions3));opóźnienie(200); goto_moteur1(*(sauvegarde_positions3+1)); opóźnienie(200); goto_moteur2(*(sauvegarde_positions3+2));opóźnienie(200); goto_moteur3(*(sauvegarde_positions3+3)); opóźnienie(200); goto_moteur5(*(sauvegarde_positions3+4));opóźnienie(200); przerwa; przypadek 4: goto_moteur(*(sauvegarde_positions4));delay(200); goto_moteur1(*(sauvegarde_positions4+1)); opóźnienie(200); goto_moteur2(*(sauvegarde_positions4+2));opóźnienie(200); goto_moteur3(*(sauvegarde_positions4+3)); opóźnienie(200); goto_moteur5(*(sauvegarde_positions4+4));opóźnienie(200); przerwa; przypadek 5: goto_moteur(*(sauvegarde_positions5));opóźnienie(200); goto_moteur1(*(sauvegarde_positions5+1)); opóźnienie(200); goto_moteur2(*(sauvegarde_positions5+2));opóźnienie(200); goto_moteur3(*(sauvegarde_positions5+3)); opóźnienie(200); goto_moteur5(*(sauvegarde_positions5+4));opóźnienie(200); przerwa; przypadek 6: goto_moteur(*(sauvegarde_positions6));opóźnienie(200); goto_moteur1(*(sauvegarde_positions6+1)); opóźnienie(200); goto_moteur2(*(sauvegarde_positions6+2));opóźnienie(200); goto_moteur3(*(sauvegarde_positions6+3)); opóźnienie(200); goto_moteur5(*(sauvegarde_positions6+4));opóźnienie(200); przerwa; przypadek 7: goto_moteur(*(sauvegarde_positions7));delay(200); goto_moteur1(*(sauvegarde_positions7+1)); opóźnienie(200); goto_moteur2(*(sauvegarde_positions7+2));opóźnienie(200); goto_moteur3(*(sauvegarde_positions7+3)); opóźnienie(200); goto_moteur5(*(sauvegarde_positions7+4));opóźnienie(200); przerwa; przypadek 8: goto_moteur(*(sauvegarde_positions8));opóźnienie(200); goto_moteur1(*(sauvegarde_positions8+1)); opóźnienie(200); goto_moteur2(*(sauvegarde_positions8+2));opóźnienie(200); goto_moteur3(*(sauvegarde_positions8+3)); opóźnienie(200); goto_moteur5(*(sauvegarde_positions8+4));opóźnienie(200); przerwa; przypadek 9: goto_moteur(*(sauvegarde_positions9));delay(200); goto_moteur1(*(sauvegarde_positions9+1)); opóźnienie(200); goto_moteur2(*(sauvegarde_positions9+2));opóźnienie(200); goto_moteur3(*(sauvegarde_positions9+3)); opóźnienie(200); goto_moteur5(*(sauvegarde_positions9+4));opóźnienie(200); przerwa; } Serial.print("\n************************* ODTWARZANIE FIN ***************** \n "); opóźnienie (500); } } /*Serial.print ("debiut\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");*/

opóźnienie (100); } //******************************FUNKCJE****************** ******************

word recevoir() { // funkcja permettant de recevoir l'information du smartphone

if (Serial.available()) { w = Serial.read();

Serial.flush();

powrót w; }}

void goto_moteur(int angle_destination)

{ while (kąt_docelowy kąt+kąt_kroku) { Serial.print(" \n --------------* * * * * *-------------- ----\n"); Serial.print("kąt_docelowy = \t "); Serial.print(kąt_docelowy); Serial.print("\n angle1 = \t ");Serial.print(angle); if(kąt_docelowy kąt +kąt_kroku){ kąt = kąt + kąt_kroku;moteur.write(kąt);} opóźnienie (100); } moteur.write(kąt_docelowy); } void goto_moteur1(int kąt_docelowy) { while (kąt_docelowy kąt1+kąt_kroku) { Serial.print(" \n --------------* * * * * *------- -----------\n"); Serial.print("kąt_docelowy = \t "); Serial.print(kąt_docelowy); Serial.print("\n angle2 = \t ");Serial.print(angle1); if(kąt_docelowy kąt1 +kąt_kroku){kąt1 += kąt_kroku; moteur1.write(angle1);;} opóźnienie(100); } moteur1.write(kąt_docelowy); } void goto_moteur2(int angle_destination) {

while (kąt_docelowy kąt2+kąt_kroku)

{ Serial.print(" \n --------------* * * * * *------------------\n"); Serial.print("kąt_docelowy = \t "); Serial.print(kąt_docelowy); Serial.print("\n angle3 = \t ");Serial.print(angle2); if(kąt_docelowy kąt2 +kąt_kroku){kąt2+=kąt_kroku; moteur2.write(angle2);} opóźnienie (100); } moteur2.write(kąt_docelowy); } void goto_moteur3(int angle_destination) {

while (kąt_docelowy kąt3+kąt_kroku)

{ Serial.print(" \n --------------* * * * * *------------------\n"); Serial.print("kąt_docelowy = \t "); Serial.print(kąt_docelowy); Serial.print("\n angle4 = \t ");Serial.print(angle3); if(kąt_docelowy kąt3 +kąt_kroku){kąt3+=kąt_kroku; moteur3.write(angle3);} opóźnienie(100); } moteur3.write(kąt_docelowy); } void goto_moteur5(int angle_destination) {

while (kąt_docelowy kąt5+kąt_kroku)

{ Serial.print(" \n --------------* * * * * *------------------\n"); Serial.print("kąt_docelowy = \t "); Serial.print(kąt_docelowy); Serial.print("\n angle5 = \t ");Serial.print(angle5); if(kąt_docelowy kąt5 +krok_kąt){kąt5+=krok_kąt; moteur5.write(kąt5);} opóźnienie(100); } moteur5.write(kąt_docelowy); }

void TouchDown_Release() // Zwolnienie przycisku TouchDown

{jeśli (kąt5 <180) {kąt5 = kąt5+krok_kąt_mini; } moteur5.write(kąt5); }

void TouchDown_Grab() // TouchDown Button Grab

{ if (kąt5 > 0) { kąt5 = kąt5-krok_kąt_mini; } moteur5.write(kąt5); } void Base_Rotation() { if (kąt 0) { kąt = kąt-krok_kąt; } inny kąt =0; moteur.write(kąt); } void Obrót_Talia() { if (angle1 20) { angle1 = angle1-step_angle; } w przeciwnym razie kąt1 = 20; moteur1.write(kąt1); } void Obrót_trzeciego_ramienia() { if (angle2 0) { angle2 = angle2-step_angle; } moteur2.write(angle2); } void Obrót_czwartego_ramienia() { if (angle3 = 0) { angle3 = angle3-step_angle_mini; } moteur3.write(kąt3); }

Krok 6: To wszystko

Dzięki za oglądanie, mam nadzieję, że doceniłeś!

Jeśli podobał Ci się ten Instructable, możesz na pewno odwiedzić nas po więcej! =)

Zalecana: