Sommario:

Braccio robotico: Jensen: 4 passaggi
Braccio robotico: Jensen: 4 passaggi

Video: Braccio robotico: Jensen: 4 passaggi

Video: Braccio robotico: Jensen: 4 passaggi
Video: КАКИМ БУДЕТ PORTAL 3 2024, Dicembre
Anonim
Braccio robotico: Jensen
Braccio robotico: Jensen

Jensen è un braccio robotico costruito sulla piattaforma Arduino con un focus sulla pianificazione del movimento intuitiva, svolto come progetto indipendente da 1 credito sotto la guida di Charles B. Malloch, PhD. Può replicare una serie di movimenti programmati spostando manualmente il braccio. Ho avuto l'ispirazione per costruirlo vedendo altri bracci robotici costruiti nello spazio di produzione UMass Amherst M5. Inoltre, volevo imparare a usare il software CAD e volevo realizzare un progetto Arduino avanzato. L'ho vista come un'opportunità per fare tutte queste cose.

Passaggio 1: design e ambito originali

Design e ambito originali
Design e ambito originali

Il software CAD che ho scelto di imparare per questo progetto è stato OnShape e la prima cosa che ho modellato è stato un servo analogico HiTec HS-422. Ho scelto il servo perché era disponibile localmente ed era un prezzo ragionevole. È stata anche una buona pratica per imparare OnShape prima di passare alla progettazione delle mie parti. A questo punto iniziale del progetto, avevo un'idea generale di cosa volevo che il braccio fosse capace. Volevo che avesse una gamma di movimento decente e una pinza per raccogliere le cose. Queste specifiche generali hanno informato il progetto mentre continuavo a modellarlo in CAD. Un altro vincolo di progettazione che avevo a questo punto era la dimensione del piano di stampa sulla mia stampante 3D. Ecco perché la base che vedi nella foto sopra è un quadrato relativamente primitivo.

Durante questa fase del progetto, stavo anche pensando a come volevo controllare il braccio. Un braccio robotico da cui ero stato ispirato nel makerspace usava un braccio fantoccio per il controllo. Un altro utilizzava un metodo di programmazione del percorso intuitivo in cui il braccio veniva spostato in varie posizioni dall'utente. Il braccio quindi tornerà indietro attraverso quelle posizioni.

Il mio piano originale era finire la costruzione del braccio e poi implementare entrambi questi metodi di controllo. Volevo anche creare un'applicazione per computer per controllarlo ad un certo punto dopo. Come probabilmente puoi dire, ho finito per ridurre la portata di questo aspetto del progetto. Quando ho iniziato a lavorare su quei primi due metodi di controllo, ho scoperto rapidamente che quello intuitivo di programmazione del percorso era più complicato di quanto pensassi. È stato allora che ho deciso di concentrarmi su questo e di mettere gli altri metodi di controllo in attesa a tempo indeterminato.

Passaggio 2: controllo

Controllo
Controllo

Il metodo di controllo che ho scelto funziona così: muovi il braccio con le mani in varie posizioni e "salvi" quelle posizioni. Ogni posizione ha informazioni sull'angolo tra ogni collegamento del braccio. Dopo aver salvato le posizioni, premi un pulsante di riproduzione e il braccio torna in ciascuna di quelle posizioni in sequenza.

In questo metodo di controllo, c'erano molte cose da capire. Affinché ogni servo torni a un angolo salvato, ho dovuto in qualche modo "salvare" quegli angoli in primo luogo. Ciò richiedeva l'Arduino Uno che stavo usando per essere in grado di ricevere l'angolo corrente di ciascun servo. Il mio amico Jeremy Paradie, che ha realizzato un braccio robotico che utilizza questo metodo di controllo, mi ha suggerito di utilizzare il potenziometro interno di ogni servo per hobby. Questo è il potenziometro che il servo stesso usa per codificare il suo angolo. Ho scelto un servo di prova, ho saldato un filo al pin centrale del potenziometro interno e ho praticato un foro nella custodia per alimentare il filo all'esterno.

Ora potrei ricevere l'angolo corrente leggendo la tensione sul pin centrale del potenziometro. Tuttavia, c'erano due nuovi problemi. In primo luogo, c'era rumore sotto forma di picchi di tensione sul segnale proveniente dal pin centrale. Questo problema è diventato un vero problema in seguito. In secondo luogo, l'intervallo di valori per l'invio di un angolo e per la ricezione di un angolo era diverso.

Dire ai servomotori dell'hobby di spostarsi di un angolo compreso tra 0 e 180 gradi comporta l'invio di un segnale PWM con un tempo alto corrispondente all'angolo. Al contrario, l'utilizzo di un pin di ingresso analogico dell'Arduino per leggere la tensione sul pin centrale del potenziometro mentre si sposta la squadretta del servo tra 0 e 180 gradi restituisce un intervallo di valori separato. Pertanto, era necessario un po' di matematica per tradurre un valore di input salvato nel corrispondente valore di output PWM necessario per riportare il servo allo stesso angolo.

Il mio primo pensiero è stato quello di utilizzare una semplice mappa di intervallo per trovare l'output PWM corrispondente per ogni angolo salvato. Funzionava, ma non era molto preciso. Nel caso del mio progetto, l'intervallo di valori temporali PWM elevati corrispondenti a un intervallo di angoli di 180 gradi era molto più ampio dell'intervallo di valori di ingresso analogico. Inoltre, entrambi questi intervalli non erano continui e composti solo da numeri interi. Pertanto, quando ho mappato un valore di input salvato su un valore di output, la precisione è stata persa. È stato a questo punto che ho pensato di aver bisogno di un circuito di controllo per portare i miei servi dove dovevano essere.

Ho scritto il codice per un circuito di controllo PID in cui l'ingresso era la tensione del pin centrale e l'uscita era l'uscita PWM, ma ho scoperto rapidamente che avevo solo bisogno del controllo integrale. In questo scenario, l'uscita e l'ingresso rappresentavano entrambi angoli, quindi l'aggiunta di controllo proporzionale e derivativo tendeva a farla superare o ad avere un comportamento indesiderato. Dopo aver messo a punto il controllo integrale, c'erano ancora due problemi. In primo luogo, se l'errore iniziale tra l'angolo attuale e quello desiderato fosse elevato, il servo accelererebbe troppo rapidamente. Potevo ridurre la costante per il controllo integrale, ma ciò rendeva il movimento generale troppo lento. In secondo luogo, il movimento era nervoso. Questo era il risultato del rumore sul segnale di ingresso analogico. Il circuito di controllo leggeva continuamente questo segnale, quindi i picchi di tensione causavano movimenti nervosi. (A questo punto sono passato anche dal mio servo di prova all'assieme nella foto sopra. Ho anche creato un oggetto loop di controllo per ogni servo nel software.)

Ho risolto il problema dell'accelerazione troppo rapida inserendo un filtro di media mobile ponderata esponenzialmente (EWMA) sull'output. Mediante l'uscita, i grandi picchi in movimento sono stati ridotti (incluso il jitter dal rumore). Tuttavia, il rumore sul segnale di ingresso era ancora un problema, quindi la fase successiva del mio progetto stava cercando di risolverlo.

Passaggio 3: rumore

Rumore
Rumore

Nella foto sopra

In rosso: segnale di ingresso originale

In blu: segnale di ingresso dopo l'elaborazione

Il primo passo per ridurre il rumore sul segnale in ingresso è stato comprenderne la causa. L'analisi del segnale su un oscilloscopio ha rivelato che i picchi di tensione si verificavano a una frequenza di 50 Hz. Mi è capitato di sapere che anche il segnale PWM inviato ai servi era a una frequenza di 50 Hz, quindi ho immaginato che i picchi di tensione avessero qualcosa a che fare con questo. Ho ipotizzato che il movimento dei servi stesse in qualche modo causando picchi di tensione sul pin V+ dei potenziometri, che a sua volta rovinava la lettura sul pin centrale.

Qui è dove ho fatto il mio primo tentativo di ridurre il rumore. Ho aperto di nuovo ogni servo e ho aggiunto un filo proveniente dal pin V+ sul potenziometro. Avevo bisogno di più ingressi analogici per leggerli rispetto all'Arduino Uno, quindi a questo punto sono passato anche a un Arduino Mega. Nel mio codice, ho cambiato l'ingresso angolare da una lettura analogica della tensione sul pin centrale a un rapporto tra la tensione sul pin centrale e la tensione sul pin V+. La mia speranza era che se ci fosse stato un picco di tensione sui pin, si sarebbe annullato nel rapporto.

Ho rimontato tutto e l'ho testato, ma i picchi stavano ancora accadendo. Quello che avrei dovuto fare a questo punto era sondare il mio terreno. Invece, la mia prossima idea era di mettere i potenziometri su un alimentatore completamente separato. Ho scollegato i cavi V+ dagli ingressi analogici dell'Arduino e li ho collegati a un alimentatore separato. Avevo già sondato i pin, quindi sapevo a quale voltaggio alimentarli. Ho anche tagliato la connessione tra la scheda di controllo e il pin V+ in ogni servo. Ho rimontato tutto, ho riportato il codice di input dell'angolo a come era prima e poi l'ho testato. Come previsto, non c'erano più picchi di tensione sul pin di ingresso. Tuttavia, c'era un nuovo problema: mettere i potenziometri su un'alimentazione separata aveva completamente incasinato i circuiti di controllo interni dei servi. Anche se i pin V+ ricevevano la stessa tensione di prima, il movimento dei servi era irregolare e instabile.

Non capivo perché questo stesse accadendo, quindi alla fine ho sondato la mia connessione a terra nei servi. C'è stata una caduta di tensione media di circa 0,3 Volt attraverso la terra, e ha raggiunto un picco ancora più alto quando i servi hanno assorbito corrente. Mi era chiaro allora che quei pin non potevano più essere considerati "massa" e potevano essere meglio descritti come pin "di riferimento". Le schede di controllo nei servo devono aver misurato la tensione sul pin centrale del potenziometro rispetto sia alla tensione sul V+ che sui pin di riferimento. Alimentare i potenziometri separatamente ha incasinato quella misurazione relativa perché ora invece di un picco di tensione che si verifica su tutti i pin, è successo solo sul pin di riferimento.

Il mio mentore, il dottor Malloch, mi ha aiutato a eseguire il debug di tutto questo e mi ha suggerito di misurare anche la tensione sul pin centrale rispetto agli altri pin. Questo è quello che ho fatto per il mio terzo e ultimo tentativo di ridurre il rumore dell'input angolare. Ho aperto ogni servo, ricollegato il filo che avevo tagliato e aggiunto un terzo filo proveniente dal pin di riferimento sul potenziometro. Nel mio codice, ho reso l'input dell'angolo equivalente alla seguente espressione: (pin centrale - pin di riferimento) / (V+pin - pin di riferimento). L'ho testato e ha ridotto con successo gli effetti dei picchi di tensione. Inoltre, ho anche messo un filtro EWMA su questo ingresso. Questo segnale elaborato e il segnale originale sono illustrati sopra.

Passaggio 4: concludere le cose

Concludere le cose
Concludere le cose

Con il problema del rumore risolto al meglio delle mie capacità, ho iniziato a sistemare e realizzare le parti finali del progetto. Il braccio appesantiva troppo il servo nella base, quindi ho realizzato una nuova base che supporta il peso del braccio utilizzando un cuscinetto di grandi dimensioni. Ho anche stampato la pinza e ho fatto un po' di carteggiatura per farlo funzionare.

Sono molto soddisfatto del risultato finale. La pianificazione intuitiva del movimento funziona in modo coerente e il movimento è fluido e preciso, considerando tutto. Se qualcun altro volesse realizzare questo progetto, lo incoraggerei caldamente a realizzarne una versione più semplice. Col senno di poi, realizzare qualcosa del genere utilizzando servomotori per hobby è stato molto ingenuo, e la difficoltà che ho avuto a farlo funzionare lo dimostra. Considero un miracolo che il braccio funzioni bene come funziona. Voglio ancora creare un braccio robotico che possa interfacciarsi con un computer, eseguire programmi più complessi e muoversi con maggiore precisione, quindi per il mio prossimo progetto lo farò. Userò servi robotici digitali di alta qualità e, si spera, ciò mi consentirà di evitare molti dei problemi che ho riscontrato in questo progetto.

Documento CAD:

cad.onshape.com/documents/818ea878dda7ca2f…

Consigliato: