Spisu treści:
2025 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2025-01-23 15:03
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
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
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:
Ramię robota z chwytakiem: 9 kroków (ze zdjęciami)
Ramię robota z chwytakiem: Zbieranie drzewek cytrynowych jest uważane za ciężką pracę ze względu na duże rozmiary drzew, a także ze względu na gorący klimat regionów, w których sadzone są drzewa cytrynowe. Dlatego potrzebujemy czegoś innego, aby pomóc robotnikom rolnym w łatwiejszym wykonywaniu ich pracy
Ramię robota 3D z silnikami krokowymi sterowanymi przez Bluetooth: 12 kroków
Ramię robota 3D z silnikami krokowymi sterowanymi przez Bluetooth: W tym samouczku zobaczymy, jak wykonać ramię robota 3D z silnikami krokowymi 28byj-48, serwomotorem i częściami drukowanymi w 3D. Płytka drukowana, kod źródłowy, schemat elektryczny, kod źródłowy i wiele informacji znajdują się na mojej stronie internetowej
RAMIĘ ROBOTYCZNE Xbox 360 [ARDUINO]: RAMIĘ AXIOM: 4 kroki
RAMIĘ ROBOTYCZNE Xbox 360 [ARDUINO]: RAMIĘ AXIOM:
Ramię robota ROS MoveIt, część 2: Kontroler robota: 6 kroków
Ramię robota ROS MoveIt Część 2: Kontroler robota: https://github.com/AIWintermuteAI/ros-moveit-arm.gitW poprzedniej części artykułu stworzyliśmy pliki URDF i XACRO dla naszego ramienia robota i uruchomiliśmy RVIZ, aby kontrolować nasze ramię robota w symulowanym środowisku.Tym razem zrobimy to z p
JAK ZŁOŻYĆ IMPONUJĄCE DREWNIANE RAMIĘ ROBOTA (CZĘŚĆ 3: RAMIĘ ROBOTA) -- W OPARCIU O MIKRO: WĘDZIK: 8 kroków
JAK ZŁOŻYĆ IMPONUJĄCE DREWNIANE RAMIĘ ROBOTA (CZĘŚĆ 3: RAMIĘ ROBOTA) -- W OPARCIU O MIKRO: BITN: Kolejny proces instalacji opiera się na zakończeniu trybu omijania przeszkód. Proces instalacji w poprzedniej sekcji jest taki sam, jak proces instalacji w trybie śledzenia linii. Następnie spójrzmy na ostateczną formę A