Sadržaj:

Korištenje Arduino Uno za XYZ pozicioniranje 6 DOF robotske ruke: 4 koraka
Korištenje Arduino Uno za XYZ pozicioniranje 6 DOF robotske ruke: 4 koraka

Video: Korištenje Arduino Uno za XYZ pozicioniranje 6 DOF robotske ruke: 4 koraka

Video: Korištenje Arduino Uno za XYZ pozicioniranje 6 DOF robotske ruke: 4 koraka
Video: [Audio Fixed] Robojax Arduino Course: What is Arduino? Lesson 00 2024, Studeni
Anonim
Image
Image

Ovaj projekt govori o implementaciji kratke i relativno jednostavne Arduino skice za pružanje XYZ inverznog kinematičkog pozicioniranja. Izgradio sam 6 servo robotsku ruku, ali što se tiče pronalaženja softvera za njeno pokretanje, nije bilo puno toga osim prilagođenih programa koji se izvode na prilagođenim servo štitovima poput SSC-32 (U) ili drugih programa i aplikacija koji su bili komplicirano za instalaciju i komunikaciju s rukom. Zatim sam pronašao najizvrsniju "Inverznu kinematiku robotske ruke na Arduinu" Olega Mazurova gdje je implementirao inverznu kinematiku u jednostavnu Arduino skicu.

Napravio sam dvije izmjene kako bih prilagodio njegov kod:

1. Koristio sam VarSpeedServo knjižnicu umjesto njegove prilagođene knjižnice servo štita jer sam tada mogao kontrolirati brzinu servomotora i ne bih morao koristiti servo štit koji je on koristio. Za sve koji razmišljaju o pokretanju ovdje navedenog koda, preporučujem da koristite ovu knjižnicu VarSpeedServo, a ne knjižnicu servo.h, tako da možete usporiti kretanje robotske ruke tijekom razvoja ili ćete otkriti da će vas ruka neočekivano ubosti u lice ili još gore jer će se kretati punom servo brzinom.

2. Koristim jednostavan senzor/servo štit za spajanje servosistema na Arduino Uno, ali ne zahtijeva nikakvu posebnu servo knjižnicu jer koristi samo Arduino pinove. Košta samo nekoliko dolara, ali nije potrebno. Omogućuje lijepu čistu vezu servosistema s Arduinom. I nikad se više neću vratiti na ožičene servo pogone na Arduino Uno. Ako koristite ovaj senzor/servo štit, morate napraviti jednu manju izmjenu koju ću dolje opisati.

Kod odlično funkcionira i omogućuje vam rukovanje rukom pomoću jedne funkcije u kojoj prosljeđujete parametre x, y, x i brzinu. Na primjer:

set_arm (0, 240, 100, 0, 20); // parametri su (x, y, z, kut hvataljke, brzina servo)

kašnjenje (3000); // potrebno je kašnjenje kako bi se vrijeme uključivanja moglo pomaknuti na ovo mjesto

Ne može biti jednostavnije. Skicu ću uključiti u nastavku.

Olegov video zapis je ovdje: Upravljanje robotskom rukom pomoću Arduina i USB miša

Olegov izvorni program, opisi i izvori: Olegova inverzna kinematika za Arduino Uno

Ne razumijem svu matematiku koja stoji iza rutine, ali lijepo je to što ne morate koristiti kôd. Nadam se da ćete pokušati.

Korak 1: Izmjene hardvera

Promjene hardvera
Promjene hardvera

1. Jedino što je potrebno je da se vaš servo okreće u očekivanim smjerovima što bi moglo zahtijevati da fizički obrnete montažu servomotora. Idite na ovu stranicu da biste vidjeli očekivani smjer servo servera za bazu, ramena, lakat i zglob:

2. Ako koristite štitnik senzora koji ja koristim, morate učiniti jednu stvar: savijte pin koji povezuje 5V od štita s Arduino Uno tako da se ne poveže s Uno pločom. Želite koristiti vanjski napon na štitu za napajanje samo vaših servo -a, a ne Arduino Uno ili bi mogao uništiti Uno, znam jer sam spalio dvije Uno ploče kada je moj vanjski napon bio 6 volti, a ne 5. To vam omogućuje koristiti više od 5v za napajanje vaših servo -a, ali ako je vaš vanjski napon veći od 5 volti, nemojte spajati nikakve 5 -voltne senzore na štit ili će biti prženi.

Korak 2: Preuzmite knjižnicu VarSpeedServo

Morate koristiti ovu knjižnicu koja zamjenjuje standardnu arduino servo knjižnicu jer vam omogućuje da prenesete brzinu servo u izraz servo zapisa. Knjižnica se nalazi ovdje:

Knjižnica VarSpeedServo

Možete jednostavno upotrijebiti zip gumb, preuzeti zip datoteku, a zatim je instalirati s Arduino IDE -om. Jednom instalirana naredba u vašem programu izgledat će ovako: servo.write (100, 20);

Prvi parametar je kut, a drugi brzina servo od 0 do 255 (puna brzina).

Korak 3: Pokrenite ovu skicu

Evo programa natjecanja. Morate izmijeniti nekoliko parametara za dimenzije svoje robotske ruke:

1. BASE_HGT, HUMERUS, ULNA, GRIPPER duljine u milimetrima.

2. Unesite svoje brojeve servo pinova

3. Unesite servo min i max u naredbe za dodavanje.

4. Zatim isprobajte jednostavnu naredbu set_arm (), a zatim funkcije zero_x (), line () i circle () za testiranje. Prilikom prvog pokretanja ovih funkcija provjerite je li vaša servo brzina mala kako biste spriječili oštećenje ruke i vlastite ruke.

Sretno.

#include VarSpeedServo.h

/ * Servo upravljanje za AL5D ruku */

/ * Dimenzije ruke (mm) */

#define BASE_HGT 90 // osnovna visina

#define HUMERUS 100 // "kost" od ramena do lakta

#define ULNA 135 // "kost" od zgloba do lakta

#define GRIPPER 200 // hvataljka (uključujući mehanizam za rotiranje zgloba za teške uvjete) duljina"

#define ftl (x) ((x)> = 0? (long) ((x) +0,5):(long) ((x) -0,5)) // pretvorba u float u long

/ * Servo nazivi/brojevi *

* Osnovni servo HS-485HB */

#define BAS_SERVO 4

/ * Servo za ramena HS-5745-MG */

#define SHL_SERVO 5

/ * Servo za koljena HS-5745-MG */

#define ELB_SERVO 6

/ * Servo za zglob HS-645MG */

#define WRI_SERVO 7

/ * Servo okretnog zgloba HS-485HB */

#define WRO_SERVO 8

/ * Servo hvataljke HS-422 */

#define GRI_SERVO 9

/ * predračuni */

plutati hum_sq = HUMERUS*HUMERUS;

plovak uln_sq = ULNA*ULNA;

int servoSPeed = 10;

// ServoShield servo upravljači; // Objekt ServoShield

VarSpeedServo servo1, servo2, servo3, servo4, servo5, servo6;

int loopCounter = 0;

int pulseWidth = 6,6;

int mikrosekundeToDegrees;

void setup ()

{

servo1.priključak (BAS_SERVO, 544, 2400);

servo2.priključak (SHL_SERVO, 544, 2400);

servo3.priključak (ELB_SERVO, 544, 2400);

servo4.priključak (WRI_SERVO, 544, 2400);

servo5.priključak (WRO_SERVO, 544, 2400);

servo6.priključak (GRI_SERVO, 544, 2400);

kašnjenje (5500);

//servos.start (); // Pokretanje servo štita

servo_park ();

kašnjenje (4000);

Serial.begin (9600);

Serial.println ("Start");

}

void loop ()

{

loopCounter += 1;

// set_arm (-300, 0, 100, 0, 10); //

// kašnjenje (7000);

// nula_x ();

//crta();

//krug();

kašnjenje (4000);

if (loopCounter> 1) {

servo_park ();

// set_arm (0, 0, 0, 0, 10); // park

kašnjenje (5000);

izlaz (0); } // pauziranje programa - za nastavak pritisnite reset

// izlaz (0);

}

/ * rutina pozicioniranja ruke koja koristi inverznu kinematiku */

/* z je visina, y je udaljenost od središta baze prema van, x je strana na stranu. y, z može biti samo pozitivno */

// void set_arm (uint16_t x, uint16_t y, uint16_t z, uint16_t grip_angle)

void set_arm (float x, float y, float z, float grip_angle_d, int servoSpeed)

{

plovak grip_angle_r = radijani (grip_angle_d); // kut zahvata u radijanima za uporabu u proračunima

/ * Osnovni kut i radijalna udaljenost od x, y koordinata */

float bas_angle_r = atan2 (x, y);

float rdist = sqrt ((x * x) + (y * y));

/ * rdist je y koordinata za ruku */

y = rdist;

/ * Pomak gripa izračunat na temelju kuta prianjanja */

plovak grip_off_z = (sin (grip_angle_r)) * GRIPPER;

plovak grip_off_y = (cos (grip_angle_r)) * GRIPPER;

/ * Položaj zapešća */

float wrist_z = (z - grip_off_z) - BASE_HGT;

float wrist_y = y - grip_off_y;

/ * Udaljenost od ramena do zgloba (AKA sw) */

plutati s_w = (wrist_z * wrist_z) + (wrist_y * wrist_y);

float s_w_sqrt = sqrt (s_w);

/ * s_w kut prema tlu */

float a1 = atan2 (wrist_z, wrist_y);

/ * kut s_w prema humerusu */

float a2 = acos (((hum_sq - uln_sq) + s_w) / (2 * HUMERUS * s_w_sqrt));

/ * kut ramena */

plutati shl_angle_r = a1 + a2;

plutati shl_angle_d = stupnjevi (shl_angle_r);

/ * kut lakta */

plutati elb_angle_r = acos ((hum_sq + uln_sq - s_w) / (2 * HUMERUS * ULNA));

plutati elb_angle_d = stupnjevi (elb_angle_r);

plutaj elb_angle_dn = - (180.0 - elb_angle_d);

/ * kut zgloba */

plutati wri_angle_d = (grip_angle_d - elb_angle_dn) - shl_angle_d;

/ * Servo impulsi */

float bas_servopulse = 1500.0 - ((stupnjevi (bas_angle_r)) * pulseWidth);

float shl_servopulse = 1500.0 + ((shl_angle_d - 90.0) * pulseWidth);

float elb_servopulse = 1500.0 - ((elb_angle_d - 90.0) * pulseWidth);

// plutamo wri_servopulse = 1500 + (wri_angle_d * pulseWidth);

// plutamo wri_servopulse = 1500 + (wri_angle_d * pulseWidth);

float wri_servopulse = 1500 - (wri_angle_d * pulseWidth); // ažurirao 2018-11-11 od jimrd - Promijenio sam plus na minus - nisam siguran kako je ovaj kod prije radio za bilo koga. Moguće je da je servo koljena montiran s 0 stupnjeva prema dolje, a ne prema gore.

/ * Postavite servomotore */

//servos.postavka(BAS_SERVO, ftl (bas_servopulse));

mikrosekundeToDegrees = karta (ftl (bas_servopulse), 544, 2400, 0, 180);

servo1.write (mikrosekunde do stupnjeva, servoSpeed); // koristite ovu funkciju kako biste mogli postaviti brzinu serva //

//servos.postavka(SHL_SERVO, ftl (shl_servopulse));

mikrosekundeToDegrees = karta (ftl (shl_servopulse), 544, 2400, 0, 180);

servo2.write (mikrosekunde do stupnjeva, servoSpeed);

//servos.postavka(ELB_SERVO, ftl (elb_servopulse));

mikrosekundeToDegrees = karta (ftl (elb_servopulse), 544, 2400, 0, 180);

servo3.write (mikrosekunde do stupnjeva, servoSpeed);

//servos.postavka(WRI_SERVO, ftl (wri_servopulse));

mikrosekundeToDegrees = karta (ftl (wri_servopulse), 544, 2400, 0, 180);

servo4.write (mikrosekunde do stupnjeva, servo brzina);

}

/ * premjestite servo u položaj za parkiranje */

void servo_park ()

{

//servos.postavka(BAS_SERVO, 1500);

servo1.pisati (90, 10);

//servos.postavka(SHL_SERVO, 2100);

servo2.write (90, 10);

//servos.postavka(ELB_SERVO, 2100);

servo3.pisati (90, 10);

//servos.postavka(WRI_SERVO, 1800);

servo4.write (90, 10);

//servos.postavka(WRO_SERVO, 600);

servo5.pisati (90, 10);

//servos.postavka(GRI_SERVO, 900);

servo6.write (80, 10);

povratak;

}

void zero_x ()

{

za (dvostruki osi = 250,0; osi <400,0; osi += 1) {

Serial.print ("yaxis =:"); Serial.println (yaxis);

set_arm (0, yaxis, 200.0, 0, 10);

kašnjenje (10);

}

za (dvostruki osi = 400,0; osi> 250,0; osi -= 1) {

set_arm (0, yaxis, 200.0, 0, 10);

kašnjenje (10);

}

}

/ * pomiče ruku u ravnoj liniji */

linija void ()

{

za (dvostruki osi = -100,0; osi <100,0; osi += 0,5) {

set_arm (xaxis, 250, 120, 0, 10);

kašnjenje (10);

}

za (osi s plovkom = 100,0; osi> -100,0; osi -= 0,5) {

set_arm (xaxis, 250, 120, 0, 10);

kašnjenje (10);

}

}

praznina krug ()

{

#definirajte RADIUS 50.0

// kut plutanja = 0;

plutati zaxis, yaxis;

za (kut plutanja = 0,0; kut <360,0; kut += 1,0) {

yaxis = RADIUS * sin (radijani (kut)) + 300;

zaxis = RADIUS * cos (radijani (kut)) + 200;

set_arm (0, yaxis, zaxis, 0, 50);

kašnjenje (10);

}

}

Korak 4: Činjenice, pitanja i slično…

Činjenice, problemi i slično …
Činjenice, problemi i slično …

1. Kad pokrenem podrutinu circle () moj robot se više kreće u eliptičnom obliku nego u krug. Mislim da je to zato što moji servo upravljači nisu kalibrirani. Testirao sam jednu od njih i 1500 mikrosekundi nije bilo isto što i 90 stupnjeva. Radit će na tome kako bi pokušao pronaći rješenje. Ne vjerujte da nešto nije u redu s algoritmom, već s mojim postavkama. Ažuriranje 2018/2/11 - upravo je otkriveno da je to zbog pogreške u izvornom kodu. Ne vidim kako je njegov program radio. Ispravljeni kod pomoću ovoga: float wri_servopulse = 1500 - (wri_angle_d * pulseWidth); (dodavao se izvorni kod)

2. Gdje mogu pronaći više informacija o tome kako funkcionira funkcija set_arm (): web stranica Olega Mazurova objašnjava sve ili nudi veze za više informacija:

3. Postoji li provjera graničnih uvjeta? Ne. Kad mojoj robotskoj ruci prođe neispravna xyz koordinata, ona izvodi ovu smiješnu vrstu lukavog pokreta poput mačke koja se rasteže. Vjerujem da Oleg provjerava svoj najnoviji program koji koristi USB za programiranje pokreta ruku. Pogledajte njegov video i povežite se s njegovim posljednjim kodom.

4. Kôd je potrebno očistiti i mikrosekundni kôd se može ukloniti.

Preporučeni: