Spisu treści:
- Krok 1: Materiały
- Krok 2: Wydrukuj ramię robota w 3D
- Krok 3: Montaż elektroniczny
- Krok 4: Aplikacja na smartfona
- Krok 5: Kod Arduino
- Krok 6: To wszystko
Wideo: Gra z ramieniem robota - kontroler smartfona: 6 kroków
2024 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2024-01-30 11:29
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
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
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ż 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 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
// 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:
Sterowanie ramieniem robota za pomocą TLV493D, joysticka i Arduino: 3 kroki
Sterowanie ramieniem robota za pomocą TLV493D, Joystick And, Arduino: Alternatywny kontroler dla twojego robota z czujnikiem TLV493D, czujnikiem magnetycznym z 3 stopniami swobody (x,y,z), dzięki którym możesz sterować swoimi nowymi projektami z komunikacją I2C na swoim mikrokontrolery i płytka elektroniczna, które Bast P
Sterowanie ramieniem robota za pomocą Zio za pomocą kontrolera PS2: 4 kroki
Kontroluj ramię robota za pomocą Zio za pomocą kontrolera PS2: Ten wpis na blogu jest częścią serii Zio Robotics. Wprowadzenie To jest ostatnia część posta „Kontroluj ramię robota za pomocą Zio”. W tym samouczku dodamy kolejną część do naszego ramienia robota. Poprzednie samouczki nie zawierają podstawy do
Niedrogie rozwiązanie wizyjne z ramieniem robota oparte na Arduino: 19 kroków (ze zdjęciami)
Niedrogie rozwiązanie wizyjne z ramieniem robota oparte na Arduino: Kiedy mówimy o wizji maszynowej, zawsze wydaje nam się to nieosiągalne. Podczas gdy stworzyliśmy demo wizyjne o otwartym kodzie źródłowym, które byłoby bardzo łatwe do zrobienia dla wszystkich. W tym filmie, z kamerą OpenMV, bez względu na to, gdzie jest czerwona kostka, robot jest
Jak zbudować robota gąsienicowego z ramieniem chwytaka sterowanego za pomocą Arduino Nrf24l01: 3 kroki (ze zdjęciami)
Jak zbudować robota śledzonego z ramieniem chwytaka sterowanego za pomocą Arduino Nrf24l01: Instrukcja „Jak zbudować robota śledzonego z ramieniem chwytaka sterowanego za pomocą Arduino Nrf24l01” wyjaśni, jak zbudować ramię chwytaka o trzech stopniach swobody zainstalowane na wózku gąsienicowym napędzanym przez moduł L298N z napędem dwusilnikowym przy użyciu MEG
Gra Labirynt do sterowania za pomocą smartfona: 5 kroków (ze zdjęciami)
Gra labirynt do sterowania za pomocą smartfona: Gra labirynt do sterowania za pomocą smartfona. Labirynt porusza się zgodnie z nachyleniem smartfona. Przede wszystkim zobacz wideo. Obraz ruchu1. Raspberry Pi to serwer Websocket.2. Smartfon jest klientem Websocket.3. Smartfon wysyła ti