Cuprins:

Braț robotizat: Jensen: 4 pași
Braț robotizat: Jensen: 4 pași

Video: Braț robotizat: Jensen: 4 pași

Video: Braț robotizat: Jensen: 4 pași
Video: Teletruck JCB - utilaje electrice pentru agricultură 2024, Octombrie
Anonim
Braț robotizat: Jensen
Braț robotizat: Jensen

Jensen este un braț robotizat construit pe platforma Arduino, cu accent pe planificarea intuitivă a mișcării, realizat ca un proiect independent de 1 credit sub mentorat de Charles B. Malloch, dr. Poate replica o serie de mișcări programate prin mișcarea manuală a brațului. Am primit inspirația pentru a-l construi de la a vedea alte brațe robotizate construite în spațiul de creație UMass Amherst M5. Mai mult, am vrut să învăț cum să folosesc software-ul CAD și am vrut să fac un proiect Arduino avansat. Am văzut acest lucru ca pe o oportunitate de a face toate acele lucruri.

Pasul 1: Designul original și domeniul de aplicare

Design și domeniu de aplicare original
Design și domeniu de aplicare original

Software-ul CAD pe care am ales să-l învăț pentru acest proiect a fost OnShape, iar primul lucru pe care l-am modelat a fost un servo analogic HiTec HS-422. Am ales servo-ul pentru că îmi era disponibil local și era un preț rezonabil. De asemenea, a servit ca o bună practică pentru învățarea OnShape înainte de a trece la proiectarea propriilor părți. În acest moment inițial al proiectului, am avut o idee generală despre ceea ce doresc să fie capabil brațul. Am vrut să aibă o gamă decentă de mișcare și o priză pentru ridicarea lucrurilor. Aceste specificații generale au informat proiectarea pe măsură ce am continuat să o modelez în CAD. O altă constrângere de proiectare pe care am avut-o în acest moment a fost dimensiunea patului de imprimare de pe imprimanta mea 3D. De aceea baza pe care o vedeți în fotografia de mai sus este un pătrat relativ primitiv.

În această etapă a proiectului, am făcut, de asemenea, o idee despre cum voiam să controlez brațul. Un braț robotizat de care fusesem inspirat în spațiul creator folosea un braț marionetă pentru control. Un altul a folosit o metodă intuitivă de programare a căii în care brațul a fost mutat în diferite poziții de către utilizator. Brațul avea să revină apoi prin acele poziții.

Planul meu inițial era să termin construcția brațului și apoi să pun în aplicare ambele metode de control. De asemenea, am vrut să creez o aplicație pentru computer pentru controlul ei la un moment dat după aceea. După cum probabil puteți spune, am ajuns să reduc sfera acestui aspect al proiectului. Când am început să lucrez la primele două metode de control, am descoperit rapid că cea intuitivă de programare a căilor era mai complicată decât credeam că va fi. Atunci am decis să mă concentrez și să pun celelalte metode de control pe o perioadă nedeterminată.

Pasul 2: Control

Control
Control

Metoda de control pe care am ales-o funcționează astfel: mutați brațul cu mâinile în diferite poziții și „salvați” acele poziții. Fiecare poziție are informații despre unghiul dintre fiecare verigă a brațului. După ce ați terminat salvarea pozițiilor, apăsați un buton de redare și brațul revine la fiecare dintre aceste poziții în ordine.

În această metodă de control, au fost multe lucruri de descoperit. Pentru ca fiecare servo să revină la un unghi salvat, a trebuit cumva să „salvez” acele unghiuri în primul rând. Acest lucru a necesitat Arduino Uno pe care îl foloseam pentru a putea primi unghiul curent al fiecărui servo. Prietenul meu Jeremy Paradie, care a realizat un braț robot care utilizează această metodă de control, m-a indicat să folosesc potențiometrul intern al fiecărui servo hobby. Acesta este potențiometrul pe care servo îl folosește pentru a-și codifica unghiul. Am ales un servo de testare, am lipit un fir la știftul din mijloc al potențiometrului intern și am forat o gaură în incintă pentru a alimenta firul în exterior.

Acum puteam primi unghiul curent citind tensiunea pe pinul din mijloc al potențiometrului. Cu toate acestea, au existat două probleme noi. În primul rând, a existat zgomot sub formă de vârfuri de tensiune pe semnalul provenit de la pinul din mijloc. Această problemă a devenit o problemă reală mai târziu. În al doilea rând, gama de valori pentru trimiterea unui unghi și primirea unui unghi au fost diferite.

Spunerea servomotorelor hobby să se deplaseze într-un unghi între 0 și 180 de grade implică trimiterea unui semnal PWM cu un timp ridicat corespunzător unghiului. Dimpotrivă, folosirea unui pin analogic de intrare al Arduino pentru a citi tensiunea pe pinul central al potențiometrului în timp ce mișcați claxonul servo între 0 și 180 de grade returnează un interval separat de valori. Prin urmare, a fost necesară o anumită matematică pentru a traduce o valoare de intrare salvată în valoarea de ieșire PWM corespunzătoare necesară pentru a readuce servo în același unghi.

Primul meu gând a fost să folosesc o hartă simplă pentru a găsi PWM de ieșire corespunzător pentru fiecare unghi salvat. Acest lucru a funcționat, dar nu a fost foarte precis. În cazul proiectului meu, gama de valori de timp ridicat PWM corespunzătoare cu un interval de unghi de 180 de grade a fost mult mai mare decât gama de valori de intrare analogică. În plus, ambele intervale nu erau continue și erau compuse din numere întregi. Prin urmare, când am mapat o valoare de intrare salvată la o valoare de ieșire, precizia s-a pierdut. În acest moment m-am gândit că aveam nevoie de o buclă de control pentru a-mi duce servo-urile acolo unde trebuiau să fie.

Am scris cod pentru o buclă de control PID în care intrarea era tensiunea pinului mediu și ieșirea era ieșirea PWM, dar am descoperit rapid că am nevoie doar de control integral. În acest scenariu, ieșirea și intrarea au reprezentat ambele unghiuri, astfel încât adăugarea controlului proporțional și derivat a avut tendința de a face depășirea sau de a avea un comportament nedorit. După reglarea controlului integral, au existat încă două probleme. În primul rând, dacă eroarea inițială dintre unghiul curent și cel dorit ar fi mare, servo ar accelera prea repede. Aș putea reduce constanta pentru controlul integral, dar asta a făcut mișcarea generală prea lentă. În al doilea rând, mișcarea a fost nervoasă. Acesta a fost un rezultat al zgomotului de pe semnalul de intrare analogic. Bucla de control citea continuu acest semnal, astfel încât vârfurile de tensiune au provocat mișcări nervoase. (În acest moment m-am mutat, de asemenea, de la un singur servo de testare la ansamblul din imaginea de mai sus. De asemenea, am realizat un obiect de buclă de control pentru fiecare servo din software.)

Am rezolvat problema accelerării excesiv de rapide punând un filtru de medie mobilă ponderată exponențial (EWMA) pe ieșire. Prin media de ieșire, vârfurile mari în mișcare au fost reduse (inclusiv jitterul din zgomot). Cu toate acestea, zgomotul de pe semnalul de intrare a fost încă o problemă, așa că următoarea etapă a proiectului meu a încercat să rezolve asta.

Pasul 3: Zgomot

Zgomot
Zgomot

În imaginea de mai sus

În roșu: semnal de intrare original

În albastru: semnal de intrare după procesare

Primul pas în reducerea zgomotului de pe semnalul de intrare a fost înțelegerea cauzei acestuia. Testarea semnalului pe un osciloscop a arătat că vârfurile de tensiune se petreceau la o rată de 50Hz. Știam întâmplător că semnalul PWM trimis către servo era, de asemenea, la o rată de 50Hz, așa că am ghicit că vârfurile de tensiune au legătură cu asta. Am emis ipoteza că mișcarea servo-urilor a cauzat cumva creșteri de tensiune pe pinul V + al potențiometrelor, care, la rândul său, încurcau citirea pe pinul din mijloc.

Aici am făcut prima mea încercare de a reduce zgomotul. Am deschis din nou fiecare servo și am adăugat un fir care venea de la pinul V + de pe potențiometru. Aveam nevoie de mai multe intrări analogice pentru a le citi decât avea Arduino Uno, așa că m-am mutat și la un Arduino Mega în acest moment. În codul meu, am schimbat unghiul de intrare din a fi o citire analogică a tensiunii de pe pinul mediu într-un raport între tensiunea de pe pinul de mijloc și tensiunea de pe pinul V +. Speranța mea a fost că, dacă ar exista un vârf de tensiune pe pini, s-ar anula în raport.

Am pus totul la loc și l-am testat, dar vârfurile se întâmplau încă. Ceea ce ar fi trebuit să fac în acest moment a fost să-mi cercetez terenul. În schimb, următoarea mea idee a fost să pun potențiometrele pe o sursă de alimentare separată. Am deconectat firele V + de la intrările analogice de pe Arduino și le-am conectat la o sursă de alimentare separată. Probasem pinii înainte, așa că știam la ce tensiune trebuie să-i alimentez. De asemenea, am decupat conexiunea dintre placa de control și pinul V + din fiecare servo. Am pus totul la loc, am readus codul de intrare unghiular la modul în care era înainte și apoi l-am testat. Așa cum era de așteptat, nu au mai existat vârfuri de tensiune pe pinul de intrare. Cu toate acestea, a existat o nouă problemă - punerea potențiometrelor pe o sursă de alimentare separată a deranjat complet buclele de control intern ale servomotoarelor. Chiar dacă pinii V + primeau aceeași tensiune ca înainte, mișcarea servoarelor era neregulată și instabilă.

Nu am înțeles de ce se întâmplă acest lucru, așa că, în cele din urmă, am cercetat conexiunea la sol în servo. A existat o cădere medie de tensiune de aproximativ 0,3 volți pe sol și a crescut chiar mai mult atunci când servomotoarele au atras curent. Mi-a fost clar atunci că acei știfturi nu mai pot fi considerate „sol” și mai bine pot fi descrise ca știfturi „de referință”. Plăcile de comandă din servome trebuie să fi măsurat tensiunea pe pinul central al potențiometrului în raport atât cu tensiunea de pe pinul V +, cât și cu pinii de referință. Alimentarea potențiometrelor separat a încurcat măsurarea relativă, deoarece acum, în loc să se întâmple un vârf de tensiune pe toți pinii, sa întâmplat doar pe pinul de referință.

Mentorul meu, dr. Malloch, m-a ajutat să depanez toate acestea și mi-a sugerat să măsoar și tensiunea pe pinul din mijloc față de ceilalți pin. Asta am făcut pentru a treia și ultima mea încercare de a reduce zgomotul intrării unghiului. Am deschis fiecare servo, am atașat din nou firul pe care l-am tăiat și am adăugat un al treilea fir care vine de la pinul de referință de pe potențiometru. În codul meu, am făcut unghiul de intrare echivalent cu următoarea expresie: (pin mediu - pin de referință) / (V + pin - pin de referință). L-am testat și a redus cu succes efectele vârfurilor de tensiune. În plus, am pus și un filtru EWMA pe această intrare. Acest semnal procesat și semnalul original sunt prezentate mai sus.

Pasul 4: Înfășurarea lucrurilor

Înfășurarea lucrurilor
Înfășurarea lucrurilor

Odată ce problema zgomotului a fost rezolvată la maximum de abilitățile mele, am început să repar și să realizez părțile finale ale designului. Brațul punea prea multă greutate pe servo în bază, așa că am făcut o bază nouă care să susțină greutatea brațului folosind un rulment mare. De asemenea, am imprimat prinderea și am făcut un pic de șlefuire pe ea pentru a o face să funcționeze.

Sunt foarte mulțumit de rezultatul final. Planificarea intuitivă a mișcării funcționează constant și mișcarea este lină și precisă, luând în considerare totul. Dacă altcineva ar dori să facă acest proiect, l-aș încuraja mai întâi să facă o versiune mai simplă a acestuia. În retrospectivă, a face ceva de genul asta folosind servomotorii hobby a fost foarte naiv, iar dificultatea pe care am avut-o să funcționeze este o dovadă a acestui fapt. Consider că este un miracol că brațul funcționează la fel de bine ca și el. Încă vreau să fac un braț robotizat care să poată interfața cu un computer, să ruleze programe mai complexe și să se miște cu o precizie mai mare, așa că pentru următorul meu proiect voi face asta. Voi folosi servere de robotică digitală de înaltă calitate și, sperăm, asta mă va permite să evit multe dintre problemele pe care le-am întâmpinat în acest proiect.

Document CAD:

cad.onshape.com/documents/818ea878dda7ca2f…

Recomandat: