Spisu treści:

Ramię robota grające w płytki fortepianowe: 5 kroków
Ramię robota grające w płytki fortepianowe: 5 kroków

Wideo: Ramię robota grające w płytki fortepianowe: 5 kroków

Wideo: Ramię robota grające w płytki fortepianowe: 5 kroków
Wideo: Oceniam SINIAKI po WALCE🤪 2024, Lipiec
Anonim
Ramię robota grające w płytki fortepianowe
Ramię robota grające w płytki fortepianowe

Grupa składa się z 2 inżynierów automatyzacji z UCN, którzy wpadli na genialny pomysł, do którego realizacji i rozwoju jesteśmy zmotywowani. Pomysł opiera się na płytce Arduino sterującej ramieniem robota. Płytka Arduino jest mózgiem operacji, a następnie siłownik operacji, ramię robota, zrobi to, czego potrzebuje. Bardziej szczegółowe wyjaśnienie pojawi się później.

Krok 1: Sprzęt

Ekwipunek
Ekwipunek

Ramię robota:

Zestaw ramienia robota Phantomx Pincher Maek II (https://learn.trossenrobotics.com/38-interbotix-ro…)

Oprogramowanie dla robota- https://www.arduino.cc/en/Main/OldSoftwareRelease… Kamera do wykrywania kolorów:

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

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

Krok 2: Konfiguracja Arduino

Konfiguracja Arduino
Konfiguracja Arduino

Tutaj możesz zobaczyć konfigurację na tablicy, co jest bardzo łatwe.

Po lewej stronie znajduje się zasilacz.

Środkowy jest dla pierwszego serwa, który później jest połączony z innymi serwomechanizmami, serwo po serwo.

Na dole sterujemy płytką z komputera PC lub laptopa, który z drugiej strony ma wejście USB.

Krok 3: Program końcowy

||| PROGRAM |||

#włączać

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

#define POSECOUNT 5

BioloidController bioloid = BioloidController(1000000);

const int SERVOCOUNT = 5; int id; poz; logiczne IDCheck; wartość logiczna RunCheck;

void setup(){ pinMode(0, WYJŚCIE); ax12SetRegister2(1, 32, 50);//ustaw rejestr złącza nr 1 na prędkość 50. ax12SetRegister2(2, 32, 50);//ustaw rejestr złącza nr 2 na prędkość 50. ax12SetRegister2(3, 32, 50);//ustaw rejestr złącza nr 3 32 na prędkość 50. ax12SetRegister2(4, 32, 50);//ustaw rejestr złącza nr 4 32 na prędkość 50. ax12SetRegister2(5, 32, 100);//ustaw rejestr złącza nr 5 32 do prędkości 100. //zainicjuj zmienne id = 1; poz = 0; IDCheck = 1; UruchomSprawdź = 0; //otwórz port szeregowy Serial.begin(9600); opóźnienie (500); Serial.println("###########################"); Serial.println("Komunikacja szeregowa nawiązana.");

//Sprawdź napięcie akumulatora Lipo Sprawdź napięcie();

//Skanuj serwa, pozycja powrotu MoveTest(); PrzenieśDom(); Opcje menu(); UruchomSprawdź = 1; }

void loop(){ // odczytaj czujnik: int inByte = Serial.read();

przełącznik (w bajtach) {

przypadek '1': MovePose1(); przerwa;

przypadek '2': MovePose2(); przerwa; przypadek '3': MovePose3(); przerwa;

przypadek '4': MovePose4(); przerwa;

przypadek '5': MoveHome(); przerwa; przypadek '6': Grab(); przerwa;

przypadek '7': LEDTest(); przerwa;

przypadek '8': RelaxServos(); przerwa; } }

void CheckVoltage(){ // czekaj, a następnie sprawdź napięcie (bezpieczeństwo LiPO) float voltage = (ax12GetRegister (1, AX_PRESENT_VOLTAGE, 1)) / 10.0; Serial.println("###########################"); Serial.print („Napięcie systemu:”); Serial.print (napięcie); Serial.println (" V."); if (napięcie 10.0){ Serial.println("Napięcia nominalne."); } if (RunCheck == 1){ MenuOptions(); } Serial.println("###########################"); }

void MoveHome(){ delay(100); // zalecana pauza bioloid.loadPose(Home); // załaduj pozę z FLASH do bufora nextPose bioloid.readPose(); // odczytaj aktualne pozycje serwa do bufora curPose Serial.println("############################"); Serial.println("Przenoszenie serw do pozycji wyjściowej"); Serial.println("###########################"); opóźnienie (1000); bioloid.interpolateSetup(1000); // konfiguracja interpolacji od bieżącej->następnej przez 1/2 sekundy while(bioloid.interpolating > 0){ // zrób to, dopóki nie osiągnęliśmy naszej nowej pozycji bioloid.interpolateStep(); // przesuń serwa, jeśli to konieczne. opóźnienie(3); } if (RunCheck == 1){ MenuOptions(); } }

void MovePose1(){ delay(100); // zalecana pauza bioloid.loadPose(Pose1); // załaduj pozę z FLASH do bufora nextPose bioloid.readPose(); // odczytaj aktualne pozycje serwa do bufora curPose Serial.println("############################"); Serial.println("Przenoszenie serw na 1. pozycję"); Serial.println("###########################"); opóźnienie (1000); bioloid.interpolateSetup(1000); // konfiguracja interpolacji od bieżącej->następnej przez 1/2 sekundy while(bioloid.interpolating > 0){ // zrób to, dopóki nie osiągnęliśmy naszej nowej pozycji bioloid.interpolateStep(); // przesuń serwa, jeśli to konieczne. opóźnienie(3); } Ustaw pozycję(3, 291); //ustaw pozycję przegubu 3 na '0' delay (100);//czekaj na ruch przegubu if (RunCheck == 1){ MenuOptions(); } }

void PrzenieśPozycję2(){ delay(100); // zalecana pauza bioloid.loadPose(Pose2); // załaduj pozę z FLASH do bufora nextPose bioloid.readPose(); // odczytaj aktualne pozycje serwa do bufora curPose Serial.println("############################"); Serial.println("Przenoszenie serw na 2. pozycję"); Serial.println("###########################"); opóźnienie (1000); bioloid.interpolateSetup(1000); // konfiguracja interpolacji od bieżącej->następnej przez 1/2 sekundy while(bioloid.interpolating > 0){ // zrób to, dopóki nie osiągnęliśmy naszej nowej pozycji bioloid.interpolateStep(); // przesuń serwa, jeśli to konieczne. opóźnienie(3); } Ustaw pozycję(3, 291); //ustaw pozycję przegubu 3 na '0' delay (100);//czekaj na ruch przegubu if (RunCheck == 1){ MenuOptions(); } } void MovePose3(){ delay(100); // zalecana pauza bioloid.loadPose(Pose3); // załaduj pozę z FLASH do bufora nextPose bioloid.readPose(); // odczytaj aktualne pozycje serwa do bufora curPose Serial.println("############################"); Serial.println("Przenoszenie serw na 3. pozycję"); Serial.println("###########################"); opóźnienie (1000); bioloid.interpolateSetup(1000); // konfiguracja interpolacji od bieżącej->następnej przez 1/2 sekundy while(bioloid.interpolating > 0){ // zrób to, dopóki nie osiągnęliśmy naszej nowej pozycji bioloid.interpolateStep(); // przesuń serwa, jeśli to konieczne. opóźnienie(3); } Ustaw pozycję(3, 291); //ustaw pozycję przegubu 3 na '0' delay (100);//czekaj na ruch przegubu if (RunCheck == 1){ MenuOptions(); } }

void MovePose4(){ delay(100); // zalecana pauza bioloid.loadPose(Pose4); // załaduj pozę z FLASH do bufora nextPose bioloid.readPose(); // odczytaj aktualne pozycje serwa do bufora curPose Serial.println("############################"); Serial.println("Przenoszenie serw na 4 pozycję"); Serial.println("###########################"); opóźnienie (1000); bioloid.interpolateSetup(1000); // konfiguracja interpolacji od bieżącej->następnej przez 1/2 sekundy while(bioloid.interpolating > 0){ // zrób to, dopóki nie osiągnęliśmy naszej nowej pozycji bioloid.interpolateStep(); // przesuń serwa, jeśli to konieczne. opóźnienie(3); } Ustaw pozycję(3, 291); //ustaw pozycję przegubu 3 na '0' delay (100);//czekaj na ruch przegubu if (RunCheck == 1){ MenuOptions(); } }

void MoveTest(){ Serial.println("############################"); Serial.println("Inicjowanie testu znaku ruchu"); Serial.println("###########################"); opóźnienie (500); id = 1; poz = 512; while(id <= SERVOCOUNT){ Serial.print("Przenoszenie identyfikatora serwomechanizmu: "); Serial.println(id);

while(poz >= 312){ UstawPozycję(id, poz); poz = poz--; opóźnienie(10); }

while(poz <= 512){ UstawPozycję(id, poz); poz = poz++; opóźnienie(10); }

//iteruj do następnego identyfikatora serwa id = id++;

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

void MenuOptions(){ Serial.println("############################"); Serial.println("Proszę wprowadzić opcję 1-5, aby ponownie uruchomić poszczególne testy."); Serial.println("1) 1. pozycja"); Serial.println("2) 2. pozycja"); Serial.println("3) Trzecia pozycja"); Serial.println("4) 4. pozycja"); Serial.println("5) Pozycja wyjściowa"); Serial.println("6) Sprawdź napięcie systemu"); Serial.println("7) Wykonaj test LED"); Serial.println("8) Zrelaksuj serwa"); Serial.println("###########################"); }

void RelaxServos(){ id = 1; Serial.println("###########################"); Serial.println("Relaksujące serwa."); Serial.println("###########################"); while(id <= SERVOCOUNT){ Relaks(id); id = (id++)%SERVOCOUNT; opóźnienie(50); } if (RunCheck == 1){ MenuOptions(); } }

nieważny LEDTest(){ id = 1; Serial.println("############################"); Serial.println("Uruchomienie testu LED"); Serial.println("############################"); while(id <= SERVOCOUNT){ ax12SetRegister(id, 25, 1); Serial.print("LED ON - Identyfikator serwo: "); Serial.println(id); opóźnienie(3000); ax12SetRegister(id, 25, 0); Serial.print("LED WYŁĄCZONY - Identyfikator serwo: "); Serial.println(id); opóźnienie(3000); identyfikator = identyfikator++; } if (RunCheck == 1){ MenuOptions(); } }

void Grab(){ SetPosition(5, 800); //ustaw pozycję stawu 1 na '0' delay (100);//czekaj na ruch stawu

}

Nasz program oparliśmy na programie PincherTest producenta, z kilkoma poważnymi poprawkami w przypadku pozycjonowania. Użyliśmy pos.h, aby robot miał pozycje w pamięci. Najpierw staraliśmy się, aby nasze ramię do grania z Pixycam było automatyczne, ale z powodu problemów z oświetleniem i małym ekranem nie mogło się to wydarzyć. Robot ma podstawową pozycję wyjściową, po wgraniu programu przetestuje wszystkie serwa znajdujące się w robocie. Ustawiliśmy pozy dla przycisków 1-4, dzięki czemu będzie łatwe do zapamiętania. Zapraszam do korzystania z programu.

Krok 4: Przewodnik wideo

Krok 5: Wniosek

Podsumowując, robot jest dla nas zabawnym małym projektem i zabawnym thingiem do zabawy i eksperymentowania. Zachęcam do wypróbowania i dostosowania go również.

Zalecana: