Klavírní dlaždice hrající robotické rameno: 5 kroků
Klavírní dlaždice hrající robotické rameno: 5 kroků
Anonim
Klavírní dlaždice hrající robotické rameno
Klavírní dlaždice hrající robotické rameno

Skupinu tvoří 2 automatizační inženýři z UCN, kteří přišli s geniálním nápadem, který jsme motivováni dělat a rozvíjet. Tato myšlenka je založena na desce Arduino ovládající robotickou ruku. Deska Arduino je mozkem operace a poté pohon operace, robotická ruka, udělá, co potřebuje. Hlubší vysvětlení přijde později.

Krok 1: Zařízení

Zařízení
Zařízení

Rameno robota:

Sada robotických ramen Phantomx Pincher Maek II (https://learn.trossenrobotics.com/38-interbotix-ro…)

Software pro robota- https://www.arduino.cc/en/Main/OldSoftwareRelease… Kamera pro detekci barev:

Fotoaparát CMUcam5 Pixy - (https://charmedlabs.com/default/pixy-cmucam5/)

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

Krok 2: Nastavení Arduina

Nastavení Arduina
Nastavení Arduina

Zde můžete vidět nastavení na desce, což je velmi snadné.

Vlevo je napájecí zdroj.

Prostřední je pro první servo, které je později připojeno k ostatním servům, servo za servem.

Ve spodní části ovládáme desku z počítače nebo notebooku, která má na druhém konci vstup USB.

Krok 3: Konečný program

||| PROGRAM |||

#zahrnout

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

#define POSECOUNT 5

BioloidController bioloid = BioloidController (10 000 000);

const int SERVOCOUNT = 5; int id; int pos; booleovský IDCheck; booleovský RunCheck;

neplatné nastavení () {pinMode (0, VÝSTUP); ax12SetRegister2 (1, 32, 50); // nastavení čísla spoje 1 registr 32 na rychlost 50. ax12SetRegister2 (2, 32, 50); // nastavení čísla spoje 2 registr 32 na rychlost 50. ax12SetRegister2 (3, 32, 50); // nastavení čísla spoje 3 registr 32 na rychlost 50. ax12SetRegister2 (4, 32, 50); // nastavení čísla spoje 4 registr 32 na rychlost 50. ax12SetRegister2 (5, 32, 100); // nastavení čísla spoje 5 registr 32 na rychlost 100. // inicializace proměnných id = 1; pos = 0; IDCheck = 1; RunCheck = 0; // otevřený sériový port Serial.begin (9600); zpoždění (500); Serial.println ("################################"); Serial.println ("Sériová komunikace navázána.");

// Kontrola napětí baterie Lipo CheckVoltage ();

// Scan serv, návrat pozice MoveTest (); MoveHome (); Možnosti nabídky (); RunCheck = 1; }

void loop () {// přečtěte si senzor: int inByte = Serial.read ();

switch (inByte) {

případ '1': MovePose1 (); přestávka;

případ '2': MovePose2 (); přestávka; případ '3': MovePose3 (); přestávka;

případ '4': MovePose4 (); přestávka;

případ '5': MoveHome (); přestávka; případ '6': Grab (); přestávka;

případ '7': LEDTest (); přestávka;

případ '8': RelaxServos (); přestávka; }}

void CheckVoltage () {// počkejte, pak zkontrolujte napětí (bezpečnost LiPO) float napětí = (ax12GetRegister (1, AX_PRESENT_VOLTAGE, 1)) / 10,0; Serial.println ("###############################"); Serial.print ("Napětí systému:"); Serial.print (napětí); Serial.println ("volty."); if (napětí 10,0) {Serial.println ("Úrovně napětí nominální."); } if (RunCheck == 1) {MenuOptions (); } Serial.println ("################################"); }

neplatné MoveHome () {zpoždění (100); // doporučená pauza bioloid.loadPose (Home); // načtěte pózu z FLASH, do bufferu nextPose bioloid.readPose (); // čtení v aktuálních pozicích serv do vyrovnávací paměti curPose Serial.println ("##############################"); Serial.println ("Přesun serv do výchozí polohy"); Serial.println ("###############################"); zpoždění (1000); bioloid.interpolateSetup (1000); // nastavení pro interpolaci z proudu-> další více než 1/2 sekundy, zatímco (bioloid.interpolation> 0) {// proveďte to, dokud jsme nedosáhli naší nové pozice bioloid.interpolateStep (); // v případě potřeby přesuňte serva. zpoždění (3); } if (RunCheck == 1) {MenuOptions (); }}

neplatné MovePose1 () {zpoždění (100); // doporučená pauza bioloid.loadPose (Pose1); // načtěte pózu z FLASH, do bufferu nextPose bioloid.readPose (); // čtení v aktuálních pozicích serva do vyrovnávací paměti curPose Serial.println ("##############################"); Serial.println ("Přesun serv na 1. pozici"); Serial.println ("###############################"); zpoždění (1000); bioloid.interpolateSetup (1000); // nastavení pro interpolaci z proudu-> další více než 1/2 sekundy, zatímco (bioloid.interpolation> 0) {// proveďte to, dokud jsme nedosáhli naší nové pozice bioloid.interpolateStep (); // v případě potřeby přesuňte serva. zpoždění (3); } NastavitPozici (3, 291); // nastavte polohu spoje 3 na zpoždění '0' (100); // počkejte, až se kloub pohne, pokud (RunCheck == 1) {MenuOptions (); }}

neplatné MovePose2 () {zpoždění (100); // doporučená pauza bioloid.loadPose (Pose2); // načtěte pózu z FLASH, do bufferu nextPose bioloid.readPose (); // čtení v aktuálních pozicích serv do vyrovnávací paměti curPose Serial.println ("##############################"); Serial.println ("Přesun serv na 2. pozici"); Serial.println ("###############################"); zpoždění (1000); bioloid.interpolateSetup (1000); // nastavení pro interpolaci z proudu-> další více než 1/2 sekundy, zatímco (bioloid.interpolation> 0) {// proveďte to, dokud jsme nedosáhli naší nové pozice bioloid.interpolateStep (); // v případě potřeby přesuňte serva. zpoždění (3); } SetPosition (3, 291); // nastavte polohu spoje 3 na zpoždění '0' (100); // počkejte, až se kloub pohne, pokud (RunCheck == 1) {MenuOptions (); }} neplatné MovePose3 () {zpoždění (100); // doporučená pauza bioloid.loadPose (Pose3); // načtěte pózu z FLASH, do bufferu nextPose bioloid.readPose (); // čtení v aktuálních pozicích serv do vyrovnávací paměti curPose Serial.println ("##############################"); Serial.println ("Přesun serv na 3. pozici"); Serial.println ("###############################"); zpoždění (1000); bioloid.interpolateSetup (1000); // nastavení pro interpolaci z proudu-> další více než 1/2 sekundy, zatímco (bioloid.interpolation> 0) {// proveďte to, dokud jsme nedosáhli naší nové pozice bioloid.interpolateStep (); // v případě potřeby přesuňte serva. zpoždění (3); } NastavitPozici (3, 291); // nastavte polohu spoje 3 na zpoždění '0' (100); // počkejte, až se kloub pohne, pokud (RunCheck == 1) {MenuOptions (); }}

neplatné MovePose4 () {zpoždění (100); // doporučená pauza bioloid.loadPose (Pose4); // načtěte pózu z FLASH, do bufferu nextPose bioloid.readPose (); // čtení v aktuálních pozicích serv do vyrovnávací paměti curPose Serial.println ("##############################"); Serial.println ("Přesun serv na 4. pozici"); Serial.println ("###############################"); zpoždění (1000); bioloid.interpolateSetup (1000); // nastavení pro interpolaci z proudu-> další více než 1/2 sekundy, zatímco (bioloid.interpolation> 0) {// proveďte to, dokud jsme nedosáhli naší nové pozice bioloid.interpolateStep (); // v případě potřeby přesuňte serva. zpoždění (3); } SetPosition (3, 291); // nastavte polohu spoje 3 na zpoždění '0' (100); // počkejte, až se kloub pohne, pokud (RunCheck == 1) {MenuOptions (); }}

neplatné MoveTest () {Serial.println ("##############################"); Serial.println ("Test inicializace pohybového znamení"); Serial.println ("###############################"); zpoždění (500); id = 1; pos = 512; while (id <= SERVOCOUNT) {Serial.print ("Moving Servo ID:"); Serial.println (id);

while (pos> = 312) {SetPosition (id, pos); pos = pos--; zpoždění (10); }

while (pos <= 512) {SetPosition (id, pos); pos = pos ++; zpoždění (10); }

// iterovat na další servo ID id = id ++;

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

neplatné MenuOptions () {Serial.println ("##############################"); Serial.println („Chcete-li jednotlivé testy spustit znovu, zadejte prosím možnost 1-5.“); Serial.println ("1) 1. pozice"); Serial.println ("2) 2. pozice"); Serial.println ("3) 3. pozice"); Serial.println ("4) 4. pozice"); Serial.println („5) Výchozí pozice“); Serial.println ("6) Zkontrolujte napětí systému"); Serial.println ("7) Proveďte test LED"); Serial.println ("8) Relax Servos"); Serial.println ("###############################"); }

neplatné RelaxServos () {id = 1; Serial.println ("###############################"); Serial.println („Relaxační serva“); Serial.println ("###############################"); while (id <= SERVOCOUNT) {Relax (id); id = (id ++)%SERVOCOUNT; zpoždění (50); } if (RunCheck == 1) {MenuOptions (); }}

neplatné LEDTest () {id = 1; Serial.println ("###############################"); Serial.println ("Test spuštěné LED"); Serial.println ("###############################"); while (id <= SERVOCOUNT) {ax12SetRegister (id, 25, 1); Serial.print ("LED svítí - ID serva:"); Serial.println (id); zpoždění (3000); ax12SetRegister (id, 25, 0); Serial.print ("LED VYPNUTO - ID serva:"); Serial.println (id); zpoždění (3000); id = id ++; } if (RunCheck == 1) {MenuOptions (); }}

void Grab () {SetPosition (5, 800); // nastavte polohu spoje 1 na zpoždění '0' (100); // počkejte, až se kloub pohne

}

Náš program jsme založili na programu výrobců PincherTest s několika zásadními vylepšeními v případě polohování. Použili jsme pózy.h, aby robot měl pozice v paměti. Nejprve jsme se snažili, aby naše hrací rameno s Pixycam bylo automatické, ale kvůli problémům se světlem a malou obrazovkou se to nemohlo stát. Robot má základní výchozí polohu, po nahrání programu otestuje všechna serva nalezená v robotu. Nastavili jsme pozice pro tlačítka 1-4, takže si ji snadno zapamatujete. Neváhejte program použít.

Krok 4: Průvodce videem

Krok 5: Závěr

Na závěr je robot pro nás zábavný malý projekt a zábavné hraní a experimentování. Doporučuji vám to vyzkoušet a také přizpůsobit.

Doporučuje: