Innehållsförteckning:

Robotarm: Jensen: 4 steg
Robotarm: Jensen: 4 steg

Video: Robotarm: Jensen: 4 steg

Video: Robotarm: Jensen: 4 steg
Video: 4 enkla steg för att installera din Smartvatten-enhet 2024, November
Anonim
Robotarm: Jensen
Robotarm: Jensen

Jensen är en robotarm byggd på Arduino -plattformen med fokus på intuitiv rörelseplanering, gjord som ett 1 -kredit oberoende projekt under mentorskap av Charles B. Malloch, doktorand. Den kan replikera en serie rörelser programmerade genom att manuellt flytta armen. Jag fick inspirationen att bygga den genom att se andra robotarmar byggda i UMass Amherst M5 -tillverkarutrymmet. Dessutom ville jag lära mig att använda CAD -programvara och jag ville göra ett avancerat Arduino -projekt. Jag såg detta som ett tillfälle att göra alla dessa saker.

Steg 1: Original design och omfattning

Original design och omfattning
Original design och omfattning

CAD-programvaran jag valde att lära mig för detta projekt var OnShape, och det första jag modellerade var en HiTec HS-422 analog servo. Jag valde servon eftersom den var tillgänglig för mig lokalt och det var ett rimligt pris. Det fungerade också som god praxis för att lära mig OnShape innan jag började med att designa mina egna delar. Vid denna tidiga punkt i projektet hade jag en allmän uppfattning om vad jag ville att armen skulle kunna. Jag ville att den skulle ha en bra rörelseomfång och en gripare för att plocka upp saker. Dessa allmänna specifikationer informerade designen när jag fortsatte att modellera den i CAD. En annan designbegränsning jag hade vid denna tidpunkt var storleken på skrivbädden på min 3D -skrivare. Det är därför basen du ser på bilden ovan är en relativt primitiv kvadrat.

Under detta skede av projektet brainstormade jag också hur jag ville kontrollera armen. En robotarm jag hade inspirerats av i makerpace använde en marionettarm för kontroll. En annan använde en intuitiv sökvägsprogrammeringsmetod där armen flyttades till olika positioner av användaren. Armen skulle sedan cykla tillbaka genom dessa positioner.

Min ursprungliga plan var att avsluta konstruktionen av armen och sedan genomföra båda dessa kontrollmetoder. Jag ville också göra ett datorprogram för att styra det någon gång efter det. Som ni säkert kan se slutade jag med att minska omfattningen av denna aspekt av projektet. När jag började arbeta med de två första kontrollmetoderna fann jag snabbt att den intuitiva sökvägsprogrammeringen var mer komplicerad än jag trodde att den skulle vara. Det var då jag bestämde mig för att fokusera det och lägga de andra kontrollmetoderna på obestämd tid.

Steg 2: Kontroll

Kontrollera
Kontrollera

Kontrollmetoden som jag valde fungerar så här: du flyttar armen med händerna till olika positioner och "sparar" de positionerna. Varje position har information om vinkeln mellan varje armlänk. När du är klar med att spara positioner trycker du på en uppspelningsknapp och armen återgår till var och en av dessa positioner i följd.

I denna kontrollmetod fanns det många saker att ta reda på. För att varje servo skulle återgå till en sparad vinkel, var jag tvungen att på något sätt "spara" dessa vinklar i första hand. Detta krävde att Arduino Uno I använde mig för att kunna ta emot den aktuella vinkeln för varje servo. Min vän Jeremy Paradie, som tillverkade en robotarm som använder denna kontrollmetod, ledde mig till att använda den inre potentiometern för varje hobbyservo. Detta är potentiometern som servon använder för att koda sin vinkel. Jag valde en testservo, lödde en tråd till mittstiftet på den inre potentiometern och borrade ett hål i höljet för att mata tråden utanför.

Jag kunde nu ta emot den aktuella vinkeln genom att läsa spänningen på potentiometerns mittstift. Det var dock två nya problem. För det första var det buller i form av spänningspikar på signalen som kom från mittstiftet. Detta problem blev en verklig fråga senare. För det andra var värdena för att skicka en vinkel och ta emot en vinkel olika.

Att berätta för hobbyservomotorerna att röra sig till en vinkel mellan 0 och 180 grader innebär att den skickar en PWM -signal med en hög tid som motsvarar vinkeln. Om du däremot använder ett analogt ingångsstift på Arduino för att läsa av spänningen på potentiometerns mittstift medan du flyttar servohornet mellan 0 och 180 grader returneras ett separat värdeintervall. Därför behövdes viss matematik för att översätta ett sparat ingångsvärde till motsvarande PWM -utgångsvärde som behövs för att återföra servon till samma vinkel.

Min första tanke var att använda en enkel avståndskarta för att hitta motsvarande utdata PWM för varje sparad vinkel. Detta fungerade, men det var inte särskilt exakt. I fallet med mitt projekt var intervallet för PWM -högtidsvärden som motsvarar ett vinkelområde på 180 grader mycket större än intervallet för analoga ingångsvärden. Dessutom var båda dessa intervall inte kontinuerliga och bestod endast av heltal. Därför förlorade jag precision när jag mappade ett sparat ingångsvärde till ett utgångsvärde. Det var vid denna tidpunkt jag tänkte att jag behövde en kontrollslinga för att få mina servon där de behövde vara.

Jag skrev kod för en PID -styrslinga där ingången var mittstiftets spänning och utgången var PWM -utgången, men upptäckte snabbt att jag bara behövde integrerad kontroll. I detta scenario representerade både utdata och ingång vinklar, så att lägga till proportionell och derivatkontroll tenderade att göra det överskridande eller ha oönskat beteende. Efter att ha justerat den integrerade kontrollen fanns det fortfarande två problem. För det första, om det första felet mellan ström och önskad vinkel var stort, skulle servon accelerera för snabbt. Jag kunde minska konstanten för den integrerade kontrollen, men det gjorde den övergripande rörelsen för långsam. För det andra var motionen orolig. Detta var ett resultat av bruset på den analoga insignalen. Styrslingan läste kontinuerligt denna signal, så spänningspikarna orsakade röriga rörelser. (Vid denna tidpunkt flyttade jag också från min enda testservo till enheten ovan på bilden. Jag gjorde också ett kontrollslingobjekt för varje servo i programvaran.)

Jag löste problemet med alltför snabb acceleration genom att sätta ett exponentiellt viktat rörligt medelvärde (EWMA) filter på utgången. Genom att medelvärdet för utgången minskades de stora spikarna i rörelse (inklusive jitter från bruset). Bruset på insignalen var dock fortfarande ett problem, så nästa steg i mitt projekt försökte lösa det.

Steg 3: Buller

Ljud
Ljud

Bilden ovan

I rött: original ingångssignal

I blått: insignal efter bearbetning

Det första steget för att minska bruset på insignalen var att förstå dess orsak. Att undersöka signalen på ett oscilloskop avslöjade att spänningspikarna skedde med en hastighet av 50Hz. Jag råkade veta att PWM -signalen som skickades till servon också var med en hastighet på 50Hz, så jag gissade att spänningspikarna hade något att göra med det. Jag antog att servos rörelse på något sätt orsakade spänningstoppar på potentiometrarnas V+ -stift, vilket i sin tur förstörde avläsningen på mittstiftet.

Här gjorde jag mitt första försök att minska bullret. Jag öppnade varje servo igen och lade till en tråd som kom från V+ -stiftet på potentiometern. Jag behövde fler analoga ingångar för att läsa dem än Arduino Uno hade, så jag flyttade också till en Arduino Mega vid denna tidpunkt. I min kod ändrade jag vinkelinmatningen från att vara en analog avläsning av spänningen på mittstiftet till ett förhållande mellan spänningen på mittstiftet till spänningen på V+ stiftet. Min förhoppning var att om det fanns en spänningspik på stiften, skulle det avbryta i förhållandet.

Jag satte ihop allt igen och testade det, men spikarna hände fortfarande. Vad jag borde ha gjort vid denna tidpunkt var att undersöka min mark. Istället var min nästa idé att sätta potentiometrarna på en separat strömförsörjning helt. Jag kopplade bort V+ -trådarna från de analoga ingångarna på Arduino och kopplade dem till en separat strömförsörjning. Jag hade undersökt stiften tidigare så jag visste vilken spänning jag skulle driva dem på. Jag klippte också av anslutningen mellan kontrollkortet och V+ stift i varje servo. Jag satte ihop allt igen, återställde vinkelinmatningskoden till hur den var innan och testade den sedan. Som förväntat fanns det inga fler spänningspikar på ingångsstiften. Det var dock ett nytt problem - att sätta potentiometrarna på en separat strömförsörjning hade förstört servots interna slingor. Även om V+ -pinnarna fick samma spänning som tidigare, var rörelserna i servon oregelbunden och instabil.

Jag förstod inte varför detta hände, så jag undersökte slutligen min jordanslutning i servona. Det var ett genomsnittligt spänningsfall på cirka 0,3 volt över marken, och det steg ännu högre när servon drog ström. Det var klart för mig då att dessa stift inte längre kunde betraktas som "mark", och bättre kunde beskrivas som "referens" -nålar. Styrkorten i servona måste ha mätt spänningen på potentiometerns mittstift i förhållande till både spänningen på V+ och referensstift. Att driva potentiometrarna förstörde separat den relativa mätningen eftersom det nu bara hände på referensstiftet istället för att en spänningspik inträffade på alla stiften.

Min mentor, Dr Malloch, hjälpte mig att felsöka allt detta och föreslog att jag också skulle mäta spänningen på mittstiftet i förhållande till de andra stiften. Det är vad jag gjorde för mitt tredje och sista försök att minska bruset från vinkelinmatningen. Jag öppnade varje servo, kopplade tillbaka tråden som jag hade klippt till och lade till en tredje tråd från referensstiftet på potentiometern. I min kod gjorde jag vinkelinmatningen motsvarande följande uttryck: (mittstift - referensstift) / (V+stift - referensstift). Jag testade det och det minskade framgångsrikt effekterna av spänningspikarna. Dessutom satte jag också ett EWMA -filter på denna ingång. Denna bearbetade signal och den ursprungliga signalen är avbildade ovan.

Steg 4: Slå in saker

Slå ihop saker
Slå ihop saker

Med bullerproblemet löst efter bästa förmåga började jag fixa och göra de sista delarna av designen. Armen tog för mycket vikt på servon i basen, så jag gjorde en ny bas som stöder armens vikt med ett stort lager. Jag skrev också ut griparen och slipade lite på den för att få den att fungera.

Jag är mycket nöjd med det slutliga resultatet. Den intuitiva rörelseplaneringen fungerar konsekvent och rörelsen är smidig och exakt, med tanke på allt. Om någon annan ville göra det här projektet skulle jag först starkt uppmuntra dem att göra en enklare version av det. I efterhand var det väldigt naivt att göra något sådant här med hobby servomotorer, och svårigheten jag hade att få det att fungera visar det. Jag anser att det är ett mirakel att armen fungerar lika bra som den gör. Jag vill fortfarande göra en robotarm som kan gränssnitt med en dator, köra mer komplexa program och flytta med större precision, så för mitt nästa projekt ska jag göra det. Jag kommer att använda digitala robotikserver av hög kvalitet, och förhoppningsvis kommer det att låta mig undvika många av de problem jag stötte på i detta projekt.

CAD -dokument:

cad.onshape.com/documents/818ea878dda7ca2f…

Rekommenderad: