Sadržaj:
- Korak 1: Izmjene hardvera
- Korak 2: Preuzmite knjižnicu VarSpeedServo
- Korak 3: Pokrenite ovu skicu
- Korak 4: Činjenice, pitanja i slično…
Video: Korištenje Arduino Uno za XYZ pozicioniranje 6 DOF robotske ruke: 4 koraka
2024 Autor: John Day | [email protected]. Zadnja promjena: 2024-01-30 09:36
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
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…
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:
Dolazak inteligentne robotske ruke: 3 koraka
Dolazak inteligentne robotske ruke: Rukovanje s gostima, razgovor, jedenje i tako dalje, te obične stvari, jer zdravlje našeg života je u običnim stvarima, ali za neke posebne ljude to je san. Neki posebni ljudi koje sam spomenuo su osobe s invaliditetom koje su izgubile
Prijenosne Arduino robotske ruke: 6 koraka
Prijenosno Arduino robotsko oružje: Pozdrav svima! Danas ću vas korak po korak naučiti kako izgraditi Arduino robotsku ruku. Samo slijedite moje korake i sigurno ćete ga uspjeti napraviti
Kako kontrolirati 4dof velike snage robotske ruke velike veličine s Arduino i Ps2 daljinskim upravljačem?: 4 koraka
Kako kontrolirati 4dof velike snage robotske ruke velike veličine s Arduino i Ps2 daljinskim upravljačem?: Ovaj komplet koristi motor velike snage mg996, potrebna mu je velika struja, testirali smo puno ulazne energije. Samo će adapter 5v 6a raditi. I arduino rad na ploči na 6dof robotskoj ruci također.end: napiši kupi SINONING Trgovina za igračke uradi sam
Robot s 4 DOF mehaničke ruke kojim upravlja Arduino: 6 koraka
Robot s 4 DOF mehaničke ruke kojim upravlja Arduino: Nedavno sam kupio ovaj set na aliexpressu, ali nisam mogao pronaći upute koje odgovaraju ovom modelu. Na kraju će ga izgraditi gotovo dva puta i napraviti mnogo eksperimenata kako bi saznali prave kutove montaže servo servera
Servo pozicioniranje s tipkovnicom: 3 koraka
Servo pozicioniranje s tipkovnicom: U ovom uputstvu kreirat ćemo projekt koji će kontrolirati Micro-Servo s tipkovnicom koja radi s Arduino Uno. Korišteni materijali: Arduino UnoBreadboard4x4 KeypadMicro-Servo