Indholdsfortegnelse:

Robotarm: Jensen: 4 trin
Robotarm: Jensen: 4 trin

Video: Robotarm: Jensen: 4 trin

Video: Robotarm: Jensen: 4 trin
Video: Richard Ayoade's Gadget Man MARATHON: ALL EPISODES - Series 4 2024, November
Anonim
Robotarm: Jensen
Robotarm: Jensen

Jensen er en robotarm bygget på Arduino -platformen med fokus på intuitiv bevægelsesplanlægning, udført som et 1 kredit uafhængigt projekt under mentorskab fra Charles B. Malloch, ph.d. Det kan replikere en række bevægelser programmeret ved manuelt at bevæge armen. Jeg fik inspirationen til at bygge den ved at se andre robotarme bygget i UMass Amherst M5 -makerrummet. Desuden ville jeg lære at bruge CAD -software, og jeg ville lave et avanceret Arduino -projekt. Jeg så dette som en mulighed for at gøre alle disse ting.

Trin 1: Originalt design og omfang

Originalt design og omfang
Originalt design og omfang

CAD-softwaren, jeg valgte at lære til dette projekt, var OnShape, og det første, jeg modellerede, var en HiTec HS-422 analog servo. Jeg valgte servoen, fordi den var tilgængelig for mig lokalt, og det var en rimelig pris. Det fungerede også som god praksis for at lære OnShape, inden jeg gik videre til at designe mine egne dele. På dette tidlige tidspunkt i projektet havde jeg en generel idé om, hvad jeg ville have armen til at kunne. Jeg ville have, at den havde et anstændigt bevægelsesområde og en griber til at samle ting op. Disse generelle specifikationer informerede designet, da jeg fortsatte med at modellere det i CAD. En anden designbegrænsning, jeg havde på dette tidspunkt, var størrelsen på printsengen på min 3D -printer. Derfor er basen, du ser på billedet ovenfor, en relativt primitiv firkant.

I denne fase af projektet brainstormede jeg også, hvordan jeg ville kontrollere armen. En robotarm, jeg var blevet inspireret af i makerrummet, brugte en marionetarm til kontrol. En anden brugte en intuitiv sti -programmeringsmetode, hvor armen blev flyttet til forskellige positioner af brugeren. Armen ville derefter cykle tilbage gennem disse positioner.

Min oprindelige plan var at afslutte konstruktionen af armen og derefter implementere begge disse kontrolmetoder. Jeg ville også lave et computerprogram til styring af det på et tidspunkt efter det. Som du sikkert kan se, endte jeg med at reducere omfanget af dette aspekt af projektet. Da jeg begyndte at arbejde med de to første kontrolmetoder, fandt jeg hurtigt ud af, at den intuitive sti -programmering var mere kompliceret, end jeg troede, det ville være. Det var da jeg besluttede at gøre det til mit fokus og sætte de andre kontrolmetoder på ubestemt tid.

Trin 2: Kontrol

Styring
Styring

Kontrolmetoden, som jeg valgte, fungerer som denne: Du flytter armen med dine hænder i forskellige positioner og "gemmer" disse positioner. Hver position har information om vinklen mellem hvert led i armen. Når du er færdig med at gemme positioner, trykker du på en afspilningsknap, og armen vender tilbage til hver af disse positioner i rækkefølge.

I denne kontrolmetode var der mange ting at finde ud af. For at hver servo kunne vende tilbage til en gemt vinkel, måtte jeg på en eller anden måde "gemme" disse vinkler i første omgang. Dette krævede, at Arduino Uno I brugte for at kunne modtage den aktuelle vinkel på hver servo. Min ven Jeremy Paradie, der lavede en robotarm, der bruger denne kontrolmetode, led mig til at bruge det interne potentiometer i hver hobbyservo. Dette er potentiometeret, som servoen selv bruger til at kode dens vinkel. Jeg valgte en testservo, loddet en ledning til det midterste ben på det interne potentiometer og borede et hul i kabinettet for at føre ledningen udenfor.

Jeg kunne nu modtage den aktuelle vinkel ved at aflæse spændingen på potentiometerets midterstift. Der var imidlertid to nye problemer. For det første var der støj i form af spændingsspidser på signalet fra den midterste pin. Dette problem blev et reelt problem senere. For det andet var værdiområdet for at sende en vinkel og modtage en vinkel anderledes.

At fortælle hobby servomotorer at bevæge sig i en vinkel mellem 0 og 180 grader indebærer at sende det et PWM -signal med en høj tid svarende til vinklen. Modsat returnerer et separat værdiområde ved hjælp af en analog indgangsstift på Arduino til at aflæse spændingen på potentiometerets midterste ben, mens servohornet flyttes mellem 0 og 180 grader. Derfor var der brug for noget matematik for at oversætte en gemt inputværdi til den tilsvarende PWM -outputværdi, der er nødvendig for at returnere servoen til den samme vinkel.

Min første tanke var at bruge et simpelt områdekort til at finde det tilsvarende output PWM for hver gemt vinkel. Dette virkede, men det var ikke særlig præcist. I tilfælde af mit projekt var rækkevidden af PWM -høje tidsværdier svarende til et vinkelområde på 180 grader meget større end området for analoge inputværdier. Derudover var begge disse intervaller ikke kontinuerlige og kun sammensat af heltal. Derfor, da jeg kortlagde en gemt inputværdi til en outputværdi, gik præcisionen tabt. Det var på dette tidspunkt, jeg regnede med, at jeg havde brug for en kontrolsløjfe for at få mine servoer, hvor de skulle være.

Jeg skrev kode til en PID -kontrolsløjfe, hvor indgangen var den midterste pin -spænding, og udgangen var PWM -udgangen, men opdagede hurtigt, at jeg kun havde brug for integreret kontrol. I dette scenario repræsenterede output og input begge vinkler, så tilføjelse af proportional og afledt kontrol havde en tendens til at få det til at overskride eller have uønsket adfærd. Efter indstilling af den integrerede kontrol var der stadig to problemer. For det første, hvis den indledende fejl mellem den nuværende og den ønskede vinkel var stor, ville servoen accelerere for hurtigt. Jeg kunne reducere konstanten for den integrerede kontrol, men det gjorde den samlede bevægelse for langsom. For det andet var forslaget irriteret. Dette var et resultat af støjen på det analoge indgangssignal. Kontrolsløjfen læste kontinuerligt dette signal, så spændingsspidserne forårsagede nervøs bevægelse. (På dette tidspunkt flyttede jeg også fra min ene testservo til forsamlingen på billedet ovenfor. Jeg lavede også et kontrolsløjfeobjekt for hver servo i softwaren.)

Jeg løste problemet med alt for hurtig acceleration ved at sætte et eksponentielt vægtet glidende gennemsnit (EWMA) filter på output. Ved at beregne et gennemsnit af output blev de store pigge i bevægelse reduceret (inklusive rystelser fra støjen). Støjen på indgangssignalet var dog stadig et problem, så det næste trin i mit projekt forsøgte at løse det.

Trin 3: Støj

Støj
Støj

Billedet ovenfor

I rødt: originalt indgangssignal

I blåt: indgangssignal efter behandling

Det første trin i at reducere støj på indgangssignalet var at forstå årsagen. Undersøgelse af signalet på et oscilloskop afslørede, at spændingsspidserne skete med en hastighed på 50Hz. Jeg vidste tilfældigt, at PWM -signalet, der blev sendt til servoerne, også var med en hastighed på 50Hz, så jeg gættede på, at spændingsspidserne havde noget at gøre med det. Jeg antog, at servoenes bevægelse på en eller anden måde forårsagede spændingsspidser på potentiometrenes V+ pin, hvilket igen ødelagde aflæsningen på den midterste pin.

Her gjorde jeg mit første forsøg på at reducere støjen. Jeg åbnede hver servo igen og tilføjede en ledning fra V+ stiften på potentiometeret. Jeg havde brug for flere analoge indgange for at læse dem, end Arduino Uno havde, så jeg flyttede også til en Arduino Mega på dette tidspunkt. I min kode ændrede jeg vinkelindgangen fra at være en analog aflæsning af spændingen på den midterste pin til et forhold mellem spændingen på den midterste pin til spændingen på V+ pin. Mit håb var, at hvis der var en spændingspike på stifterne, ville det annullere i forholdet.

Jeg satte alt sammen igen og testede det, men piggene skete stadig. Hvad jeg skulle have gjort på dette tidspunkt var at undersøge min grund. I stedet var min næste idé at sætte potentiometrene helt på en separat strømforsyning. Jeg koblede V+ -trådene fra de analoge indgange på Arduino og tilsluttede dem en separat strømforsyning. Jeg havde undersøgt stifterne før, så jeg vidste, hvilken spænding jeg skulle drive dem til. Jeg skar også forbindelsen mellem kontrolkortet og V+ pin i hver servo. Jeg satte alt sammen igen, vendte vinkelindgangskoden tilbage til, hvordan den var før, og testede den derefter. Som forventet var der ikke flere spændingsspidser på indgangsstiften. Der var imidlertid et nyt problem - at sætte potentiometrene på en separat strømforsyning havde fuldstændig ødelagt de interne kontrolløkker på servoerne. Selvom V+ benene modtog den samme spænding som før, var servoenes bevægelse uregelmæssig og ustabil.

Jeg forstod ikke, hvorfor dette skete, så jeg undersøgte endelig min jordforbindelse i servoerne. Der var et gennemsnitligt spændingsfald på omkring 0,3 volt over jorden, og det steg endnu højere, da servoerne trak strøm. Det var klart for mig dengang, at disse stifter ikke længere kunne betragtes som "formalet" og bedre kunne beskrives som "reference" stifter. Kontrolkortene i servoerne skal have målet spændingen på potentiometerets midterste pin i forhold til både spændingen på V+ og referencebenene. Ved at drive potentiometrene separat ødelagde den relative måling, for nu skete det kun i stedet for en spændingspike på alle stifterne på referencestiften.

Min mentor, Dr. Malloch, hjalp mig med at fejlsøge alt dette og foreslog, at jeg også måler spændingen på den midterste pin i forhold til de andre ben. Det er, hvad jeg gjorde for mit tredje og sidste forsøg på at reducere støj fra vinkelindgangen. Jeg åbnede hver servo, fastgjorde den ledning, jeg havde klippet, og tilføjede en tredje ledning, der kom fra referencestiften på potentiometeret. I min kode lavede jeg vinkelindgangen svarende til følgende udtryk: (midterste pin - referencestift) / (V+pin - referencestift). Jeg testede det, og det reducerede med succes virkningerne af spændingsspidserne. Derudover satte jeg også et EWMA -filter på dette input. Dette behandlede signal og det originale signal er afbildet ovenfor.

Trin 4: Indpakning af ting

Indpakning af ting
Indpakning af ting

Da støjproblemet var løst efter bedste evne, gik jeg i gang med at reparere og lave de sidste dele af designet. Armen lagde for meget vægt på servoen i basen, så jeg lavede en ny base, der understøtter armens vægt ved hjælp af et stort leje. Jeg printede også griberen og slibede lidt på den for at få den til at fungere.

Jeg er meget tilfreds med det endelige resultat. Den intuitive bevægelsesplanlægning fungerer konsekvent, og bevægelsen er jævn og præcis under hensyntagen til alt. Hvis en anden ville lave dette projekt, vil jeg først kraftigt opfordre dem til at lave en enklere version af det. Set i bakspejlet var det meget naivt at lave sådan noget ved hjælp af hobby servomotorer, og det har jeg svært ved at få det til at fungere. Jeg betragter det som et mirakel, at armen fungerer så godt, som den gør. Jeg vil stadig lave en robotarm, der kan interface med en computer, køre mere komplekse programmer og flytte med større præcision, så til mit næste projekt gør jeg det. Jeg vil bruge digitale robotikserver af høj kvalitet, og forhåbentlig vil det lade mig undgå mange af de problemer, jeg stødte på i dette projekt.

CAD -dokument:

cad.onshape.com/documents/818ea878dda7ca2f…

Anbefalede: