Innholdsfortegnelse:

Robotarm: Jensen: 4 trinn
Robotarm: Jensen: 4 trinn

Video: Robotarm: Jensen: 4 trinn

Video: Robotarm: Jensen: 4 trinn
Video: Ускорение испытаний космических кораблей SpaceX, огромные изменения на Международной космической станции и многое другое 2024, Oktober
Anonim
Robotarm: Jensen
Robotarm: Jensen

Jensen er en robotarm bygget på Arduino -plattformen med fokus på intuitiv bevegelsesplanlegging, utført som et 1 studiepoeng uavhengig prosjekt under veiledning fra Charles B. Malloch, PhD. Den kan replikere en serie bevegelser programmert ved å bevege armen manuelt. Jeg fikk inspirasjonen til å bygge den fra å se andre robotarmer bygget i UMass Amherst M5 makerpace. Videre ønsket jeg å lære å bruke CAD -programvare, og jeg ønsket å lage et avansert Arduino -prosjekt. Jeg så på dette som en mulighet til å gjøre alle disse tingene.

Trinn 1: Originalt design og omfang

Originalt design og omfang
Originalt design og omfang

CAD-programvaren jeg valgte å lære for dette prosjektet var OnShape, og det første jeg modellerte var en HiTec HS-422 analog servo. Jeg valgte servoen fordi den var tilgjengelig for meg lokalt, og det var en rimelig pris. Det tjente også som god praksis for å lære OnShape før jeg fortsatte med å designe mine egne deler. På dette tidlige tidspunktet i prosjektet hadde jeg en generell ide om hva jeg ønsket at armen skulle være i stand til. Jeg ønsket at den skulle ha et anstendig bevegelsesområde og en gripe for å plukke opp ting. Disse generelle spesifikasjonene informerte designet da jeg fortsatte å modellere det i CAD. En annen designbegrensning jeg hadde på dette tidspunktet var størrelsen på skrivebordet på min 3D -skriver. Derfor er basen du ser på bildet ovenfor en relativt primitiv firkant.

I løpet av denne fasen av prosjektet tenkte jeg også på hvordan jeg ønsket å kontrollere armen. En robotarm jeg hadde blitt inspirert av i skaperen, brukte en marionettarm for kontroll. En annen brukte en intuitiv baneprogrammeringsmetode der armen ble flyttet til forskjellige posisjoner av brukeren. Armen vil deretter sykle tilbake gjennom disse posisjonene.

Min opprinnelige plan var å fullføre konstruksjonen av armen og deretter implementere begge disse kontrollmetodene. Jeg ønsket også å lage et dataprogram for å kontrollere det på et tidspunkt etter det. Som du sikkert kan fortelle, endte jeg opp med å redusere omfanget av dette aspektet av prosjektet. Da jeg begynte å jobbe med de to første kontrollmetodene, fant jeg raskt ut at den intuitive baneprogrammeringen var mer komplisert enn jeg trodde det ville være. Det var da jeg bestemte meg for å gjøre det til mitt fokus og sette de andre kontrollmetodene på ubestemt hold.

Trinn 2: Kontroll

Kontroll
Kontroll

Kontrollmetoden som jeg valgte fungerer slik: Du flytter armen med hendene til forskjellige posisjoner og "lagrer" disse posisjonene. Hver posisjon har informasjon om vinkelen mellom hver ledd i armen. Etter at du er ferdig med å lagre posisjoner, trykker du på en avspillingsknapp og armen går tilbake til hver av disse posisjonene i rekkefølge.

I denne kontrollmetoden var det mange ting å finne ut av. For at hver servo skulle gå tilbake til en lagret vinkel, måtte jeg på en eller annen måte "lagre" disse vinklene i utgangspunktet. Dette krevde Arduino Uno I som jeg brukte for å kunne motta gjeldende vinkel på hver servo. Min venn Jeremy Paradie, som laget en robotarm som bruker denne kontrollmetoden, klarte meg å bruke det interne potensiometeret til hver hobbyservo. Dette er potensiometeret som servoen bruker selv for å kode vinkelen. Jeg valgte en testservo, loddet en ledning til den midterste pinnen på det interne potensiometeret og boret et hull i kabinettet for å mate ledningen utenfor.

Jeg kunne nå motta gjeldende vinkel ved å lese spenningen på den midtre pinnen på potensiometeret. Det var imidlertid to nye problemer. For det første var det støy i form av spenningstopper på signalet som kom fra den midterste pinnen. Dette problemet ble et reelt problem senere. For det andre var verdiområdet for å sende en vinkel og motta en vinkel annerledes.

Å fortelle hobby servomotorer å bevege seg i en vinkel mellom 0 og 180 grader innebærer å sende det et PWM -signal med en høy tid som tilsvarer vinkelen. Omvendt, ved å bruke en analog inngangspinne på Arduino for å lese spenningen på midtstiften på potensiometeret mens du flytter servohornet mellom 0 og 180 grader, returneres et eget verdiområde. Derfor var det nødvendig med litt matematikk for å oversette en lagret inngangsverdi til den tilsvarende PWM -utgangsverdien som trengs for å returnere servoen til samme vinkel.

Min første tanke var å bruke et enkelt avstandskart for å finne tilsvarende PWM -utgang for hver lagrede vinkel. Dette fungerte, men det var ikke veldig presist. Når det gjelder prosjektet mitt, var rekkevidden av PWM høy tidsverdier som tilsvarer et vinkelområde på 180 grader mye større enn området for analoge inngangsverdier. I tillegg var ikke begge disse områdene kontinuerlige og bare sammensatt av heltall. Derfor, da jeg kartla en lagret inngangsverdi til en utgangsverdi, gikk presisjonen tapt. Det var på dette tidspunktet jeg skjønte at jeg trengte en kontrollsløyfe for å få servoene mine der de måtte være.

Jeg skrev kode for en PID -kontrollsløyfe der inngangen var den midterste pinnespenningen og utgangen var PWM -utgangen, men oppdaget raskt at jeg bare trengte integrert kontroll. I dette scenariet representerte både utdata og inngang vinkler, så å legge til proporsjonal og derivatkontroll hadde en tendens til å få det til å overskride eller ha uønsket oppførsel. Etter å ha justert den integrerte kontrollen, var det fortsatt to problemer. For det første, hvis den første feilen mellom nåværende og ønsket vinkel var stor, ville servoen akselerere for raskt. Jeg kunne redusere konstanten for den integrerte kontrollen, men det gjorde den totale bevegelsen for treg. For det andre var bevegelsen urolig. Dette var et resultat av støyen fra det analoge inngangssignalet. Kontrollløyfen leste kontinuerlig dette signalet, så spenningsspissene forårsaket urolig bevegelse. (På dette tidspunktet flyttet jeg også fra min ene testservo til enheten som er vist ovenfor. Jeg laget også et kontrollsløyfeobjekt for hver servo i programvaren.)

Jeg løste problemet med altfor rask akselerasjon ved å sette et eksponentielt vektet glidende gjennomsnitt (EWMA) filter på utgangen. Ved å beregne gjennomsnittet for produksjonen, ble de store piggene i bevegelse redusert (inkludert rystelsen fra støyen). Imidlertid var støyen på inngangssignalet fortsatt et problem, så neste trinn i prosjektet mitt prøvde å løse det.

Trinn 3: Støy

Bråk
Bråk

Avbildet ovenfor

I rødt: originalt inngangssignal

I blått: inngangssignal etter behandling

Det første trinnet i å redusere støyen på inngangssignalet var å forstå årsaken. Å undersøke signalet på et oscilloskop avslørte at spenningsspissene skjedde med en hastighet på 50Hz. Jeg visste tilfeldigvis at PWM -signalet som ble sendt til servoene også var med en frekvens på 50Hz, så jeg gjettet at spenningsspissene hadde noe å gjøre med det. Jeg antok at bevegelsen til servoene på en eller annen måte forårsaket spenningsspenninger på V+ pinnen til potensiometrene, noe som igjen ødela avlesningen på den midterste pinnen.

Her gjorde jeg mitt første forsøk på å redusere støyen. Jeg åpnet hver servo igjen og la til en ledning som kom fra V+ pinnen på potensiometeret. Jeg trengte flere analoge innganger for å lese dem enn Arduino Uno hadde, så jeg flyttet også til en Arduino Mega på dette tidspunktet. I koden min endret jeg vinkelinngangen fra å være en analog avlesning av spenningen på den midterste pinnen til et forhold mellom spenningen på den midterste pinnen til spenningen på V+ pinnen. Mitt håp var at hvis det var en spenningstopp på pinnene, ville det avbrytes i forholdet.

Jeg satte alt sammen igjen og testet det, men piggene skjedde fortsatt. Det jeg burde ha gjort på dette tidspunktet var å undersøke bakken min. I stedet var min neste idé å sette potensiometrene helt på en separat strømforsyning. Jeg koblet V+ -ledningene fra de analoge inngangene på Arduino, og koblet dem til en separat strømforsyning. Jeg hadde undersøkt pinnene før, så jeg visste hvilken spenning jeg skulle drive dem på. Jeg kuttet også forbindelsen mellom kontrollkortet og V+ pinnen i hver servo. Jeg satte alt sammen igjen, tilbakestilte vinkelinngangskoden til hvordan den var før, og testet den deretter. Som forventet var det ikke flere spenningstopper på inngangspinnen. Imidlertid var det et nytt problem - å sette potensiometrene på en separat strømforsyning hadde fullstendig ødelagt de interne kontrollløkkene til servoene. Selv om V+ -pinnene mottok samme spenning som før, var bevegelsen til servoen uregelmessig og ustabil.

Jeg forsto ikke hvorfor dette skjedde, så jeg undersøkte til slutt jordforbindelsen min i servoene. Det var et gjennomsnittlig spenningsfall på omtrent 0,3 volt over bakken, og det steg enda høyere da servoene trakk strøm. Det var klart for meg da at disse pinnene ikke lenger kunne betraktes som "bakken", og bedre kunne beskrives som "referanse" pinner. Kontrollkortene i servoene må ha målt spenningen på potensiometerets midtstift i forhold til både spenningen på V+ og referansepinnene. Ved å drive potensiometrene separat ødela den relative målingen, for nå skjedde det bare på referansestiften i stedet for at det skjer en spenningsspenning på alle pinnene.

Min mentor, Dr. Malloch, hjalp meg med å feilsøke alt dette og foreslo at jeg også måler spenningen på den midterste pinnen i forhold til de andre pinnene. Det var det jeg gjorde for mitt tredje og siste forsøk på å redusere støyen fra vinkelinngangen. Jeg åpnet hver servo, festet ledningen jeg hadde klippet igjen, og la til en tredje ledning som kom fra referansepinnen på potensiometeret. I koden min gjorde jeg vinkelinngangen tilsvarende det følgende uttrykket: (midtpinne - referansepinne) / (V+pinne - referansepinne). Jeg testet den, og den reduserte effekten av spenningsspissene. I tillegg satte jeg også et EWMA -filter på denne inngangen. Dette behandlede signalet og det originale signalet er avbildet ovenfor.

Trinn 4: Innpakning av ting

Innpakning av ting
Innpakning av ting

Med støyproblemet løst etter beste evne, begynte jeg med å fikse og lage de siste delene av designet. Armen la for mye vekt på servoen i basen, så jeg laget en ny base som støtter vekten av armen ved hjelp av et stort lager. Jeg skrev også ut griperen og pusset litt på den for å få den til å fungere.

Jeg er veldig fornøyd med det endelige resultatet. Den intuitive bevegelsesplanleggingen fungerer konsekvent og bevegelsen er jevn og nøyaktig, med tanke på alt. Hvis noen andre ville lage dette prosjektet, vil jeg først sterkt oppfordre dem til å lage en enklere versjon av det. I ettertid var det veldig naivt å lage noe slikt med hobby -servomotorer, og vanskeligheten jeg hadde med å få det til å fungere, viser det. Jeg anser det som et mirakel at armen fungerer så godt som den gjør. Jeg vil fortsatt lage en robotarm som kan grensesnittet med en datamaskin, kjøre mer komplekse programmer og bevege meg med større presisjon, så for mitt neste prosjekt gjør jeg det. Jeg vil bruke digitale robotikk -servoer av høy kvalitet, og forhåpentligvis vil det la meg unngå mange av problemene jeg møtte i dette prosjektet.

CAD -dokument:

cad.onshape.com/documents/818ea878dda7ca2f…

Anbefalt: