Robotarm Kontroll fra BeagleBone Black


I denne opplæringen vil vi lære å styre en robotarm fra BeagleBone Svart. Deretter vil vi gi prosjektet muligheten til å manipulere reelle objekter og utføre repeterende oppgaver for deg.

En robotarm bruker mange servomotorer for å slå armseksjoner, håndledd og flytte en gripper (fingre). Jo flere servoer som brukes, jo mer bevegelige ledd armen vil ha fører til større fleksibilitet. Flere servoer bringer også større kostnad og kontrollere kompleksiteten

Grunnmodellen av Lynxmotion AL5D robotarm bruker fem servoer.; en for rotasjon, en skulderleddet, en albue, en håndleddet og en griper for å holde ting (liksom som tommelen kommer sammen med alle fingrene)

. Den lille datamaskinen styret vises ved siden av robotarmen på Bildet over er serie Servo Controller (SSC-32). SSC-32 godtar kommandoer på en seriell port og lar deg kontrollere opptil 32 servoer.

Vi har allerede sett at BeagleBone Black er i stand til direkte styring servoer så du lurer kanskje på hvorfor SSC-32 kan være nyttig. De viktigste fordelene med SSC-32 er at den kan håndtere hastighetsbaserte servo bevegelse og batch flere servobevegelser sammen til en enkelt logisk handling. For eksempel kan du gi en enkel kommando for å flytte skulder, albue, håndledd og fingre til et bestemt sted i 2 sekunder og hver servo vil bevege seg med en hastighet som vil føre til at det å komme frem til din destinasjon på samme tid som de andre servoer. Med SSC-32 du ikke trenger å konsumere 5-6 pulsbreddemodulasjonen (PWM) utganger på BeagleBone Svart å kjøre robotarmen og tar SSC-32 vare på å gi de servomotorer de 6 Volts de trenger .

Montering av robotarmen

Robotarmen kommer i kit-format og monteringsanvisninger er tilgjengelig på nettet. Det er også en video som viser de viktigste punktene i monteringsprosessen. Jeg fant små forskjeller mellom de ovennevnte guider og fulgte instruksjonene på nettet når du er i tvil. Grunnleggende montering utført i et behagelig tempo tok meg rundt seks timer. Du bør definitivt bolt robotarmen basen til noe, selv om det bare er en halv meter kvadrat av MDF-plate. Ellers er du sannsynligvis oppdage som jeg gjorde at servomotorer som brukes av robotarmen kan lett velte den over hvis armen ikke er sikret.


I nederst til venstre på bildet er en RS-232-kabel som kan koples til DB-9-porten på SSC-32 for kontroll. SSC-32 er vist i en antistatisk pose i midten av den nedre del av bildet. Rett ved siden av RS-232 port på SSC-32 er noen TTL-kontakter som er av mye større interesse for styring av SSC-32 fra BeagleBone Svart. TTL seriell kommunikasjon opererer i en mindre spenningsområde og er enklere å jobbe med fra mikrokontrollere enn RS-232.

De to viktigste U form stykker mellom skulder og albue bruk friksjonsplatene til å ta noe av belastningen ut av servoer. Det er også en fjær som er tilpasning mellom servoer for å hjelpe til å bringe armen tilbake fra utvidede manøvrer. Håndleddet kan bevege seg opp og ned ca 90 grader. En håndleddet oppgradering alternativet er tilgjengelig for å tillate håndleddet til å rotere rundt sin egen akse i tillegg.

Feste Arm til BeagleBone Svart

De BeagleBone Svart digitale pins operere på 3,3 volt. En ganske illevarslende advarsel indikerer ikke å bruke noe over 3,3 V på noen pin av BealgeBone Svart. SSC-32 opererer med fem V. Sende data fra BeagleBone Svart til SSC-32 vil være fint som en 3,3 V "høy" vil fortsatt bli oppdaget som en "høy" signalnivå på SSC-32.

Seriell kommunikasjon fra SSC-32 til BeagleBone Svart krever ekstra oppmerksomhet og litt ekstra maskinvare for å gjøre spenningsnivå girer ned til 3,3 V eller lavere for å sende til BeagleBone Svart. Den 74HC4050 IC har støtte for nivået skifter for seks linjer og innsats pinnene er overspenning tolerant. Så kjører 74HC4050 på 3,3 V, kan en av inngangs pins skifte 5 V seriesignal fra SSC-32 til en 3,3 V signal som er innenfor spenningsområde for BeagleBone Svart.

BeagleBone svart har 4,5 universell asynkrone mottaker /sendere (UARTs). UART4 er mot strøm og jord slutten av P9 gjør det praktisk å koble ledninger fordi du ikke trenger å telle så langt langs noen spissen. Alle pinnene av interesse på BeagleBone svart er på utsiden av P9 starter med pin 1. Pinnene er bakken (1), 3,3 V (3), hopp over de neste 3 pins, og deretter RX (11), og TX (13).

De tre TTL serie pins av interesse på SSC-32 er rett ved siden av DB9 kontakten og males, rx, og tx. Disse pinnene er tydelig merket med bakken jo nærmere pinnen til kanten av brettet.

Fotografiet av 4050, ovenfor, viser en 3,3 V kraftlinje (rød) kommer til å feste en av 4050. Pin 8 av 4050 er bakken og de grønne ledningene går til jord på SSC-32 og jord (pin 1) på BeagleBone svart.

sendelinjen (pin 13) fra BeagleBone Svart bruker gul kabling og kan være koblet direkte til RX motta pinnen på SSC-32. Disse ledningene bare møtes på breadboard for bekvemmelighet, har de ikke koble til 4050 i det hele tatt. Nivå forskyvnings må utføres på signalene bundet for å motta RX (11) pin av BeagleBone svart. I brukte orange ledninger for signalet som går fra den TX pin av SSC-32 til 4050 nivåvenders (stift 3 i 4050). Nivået flyttet signal er hentet fra 4050 (pin 2, nær strøm) og sendes til RX (11) pin på BeagleBone svart.

Sett opp BeagleBone Svart

Bonescript bibliotek inkluderer støtte for serie IO. Oppsiden til samspill med serieporten med bonescript API er at enheten treet overlegg er satt opp for deg automatisk. Dessverre har jeg hatt noen problemer med å bruke det på bein-debian-7.5-2014-05-14 bilde så kunne ikke teste med serial API som leveres med Bonescript.

Et fall tilbake som fungerer godt på revisjon C Debian -basert og revisjon B Ångström Linux-baserte BeagleBone Svart styrene er å bruke serial node-modulen i stedet. Ulempen med å installere og bruke node-modulen er at du må sette opp UART enhetstreet overlegg selv, enten før du kjører programmet eller bruke oppstartsfilene å sette UART overlegg.

De nedenfor kommandoer vil aktivere manuelt UART4 på BeagleBone Svart

 root @ beaglebone. /lib /firmware # echo BB-UART4 > /sys/devices/bone_capemgr.*/slotsroot@beaglebone:/lib/firmware# søvn 1root @ beaglebone: /lib /firmware # chown debian /dev /ttyO4root @ beaglebone: /lib /firmware $ ls -l /dev /ttyO4crw- rw --- T en rot dialout 248, 4 mai 15 02:50 /dev /ttyO4 

Da serial nodejs modulen kan installeres for alle brukere med følgende kommando

 root @ beaglebone:. ~ # NPM installere -g serial 

For en rask tilregnelighet sjekk at ledningene fungerer som forventet, kan kommandoen skjermen brukes til å spørre den versjonen av SSC-32 bord som vist nedenfor. Legg merke til at på skjermen versjonsinformasjonen vil overskrive VER kommandoen når du trykker på enter. Det er ikke pen, men det viser at toveiskommunikasjon som skjer.

 skjerm /dev /ttyO4 115200VERSSC32-V2.03XE 

For referanse, var jeg bruker beinet-debian-7.5-2014-05-14- 2gb.img bilde fra og sdcard på en revisjon C BeagleBone svart for denne artikkelen.

Flytte arm

Hvis du koblet servokablene følgende monteringsanvisningen så servo 0 årsaker rotasjon i basen , servo 1 er skulderen, servo 2 er albuen, servo 3 er håndleddet og servo 4 styrer gripe (fingeren og tommelen).

under koden skal flytte gripper inn og ut en gang. Først blir seriell port for UART4 (/dev /ttyO4) åpnet. Rett etter den åpne som har skjedd på "ver" -kommandoen er utstedt til SSC-32 som en mental helse sjekk. Etter noen sekunder griperen vil flytte én måte, og etter noen sekunder så kommer det tilbake i den andre retningen. I de kommandoene som er skrevet for å bevege griperen i '# 4 "betyr at vi ønsker å kontrollere servo 4 og P1650 er hvilken posisjon for å flytte til servo. Hver servo vil ha ca 180 grader av bevegelse med den ene enden på rundt 1000 og den andre i 2000. Jeg har valgt å flytte gripe servo først for å unngå eventuelle ubehagelige overraskelser som plutselig rask innledende bevegelse arm kan presentere.

 #! /usr /bin /nodevar Serial = require ("serial") Serial;. Var serial = require ("serial"); Var sp = new Serial (" /dev /ttyO4 
", {baudrate : 115200, parser: serialport.parsers.readline ("\\ r")}); sp.on ("åpen", function () {console.log ('åpent'); sp.on ("data", funksjon ( data) {console.log ('data mottatt:' + data);}); sp.write (" ver \\ r
", funksjon (err, resultater) {console.log ('err' + err); console.log ('resultater' + resultater);}); setTimeout (function () {sp.write ( "# 4 P1050 \\ r"
);}, 2000); setTimeout (funksjon () {sp.write ("# 4 P2050 \\ r");}, 4000);});

Du kan styre alle servoer i en enkelt skrive kommandoen for å få flere servoer som beveger seg med en gang i en gruppe. Hastigheten (S) kommando og tid (T) alternativer tillate deg å bremse servo bevegelse. Tiden kommandoen opererer på alle bevegelser i gruppen, slik at de vil alle bevege seg like fort som trengs for å fullføre på en gitt tid du leverer.

Full Movements In Order

I koden ovenfor det var et gap mellom de to bevegelsene. Du kan flytte en gruppe med servoer i en kommando som blir avsluttet med vognreturtegn. Når du skriver en annen bevegelse kommando da Lynxmotion AL5D vil umiddelbart starte på den nye kommandoen. Det er kjedelig å måtte holde styr på hvor lenge en bevegelse kommando vil ta for ikke å tråkke på tærne før den er ferdig.

SSC-32 har en spørring kommando som vil returnere en enkelt karakter, en "+" for å indikere at den tidligere signalet fremdeles pågår og et '.' for å indikere at kommandoen er fullført.

Det kan være nyttig til å gi mange bevegelsene i serie for å ha Lynxmotion armen fullfører en sammensatt bevegelse. Dette vil kreve evne til å vente på den nåværende bevegelse for å fullføre før du sender neste bevegelse kommando. I enkelte programmering miljøer vil dette gjøres ved hjelp av en sove- eller forsinkelsesfunksjon for å gjøre noe for en periode av tid. I nodejs normal konvensjonen er å passere en tilbakeringingsfunksjon som vil bli utført når en handling er fullført. Den nedenfor waitForIdle gjør dette ved polling den Lynxmotion arm med søket kommando og gjennomføring av tilbakeringing når bevegelse er fullført.

waitForIdle tilbakestiller komplett flagg og tidsplaner den waitForIdle_func å utføre kort tid etter. Inne waitForIdle_func () hvis SSC-32 har indikert at bevegelsen er fullført deretter tilbakeringingsfunksjonen er utført, ellers den nåværende tilstand av bevegelse er spørres på nytt ved hjelp av "q" -kommandoen. En eneste '.' svar fra SSC-32 indikerer ferdigstillelse så på ("data") tilbakeringing er utvidet til å kommunisere det til waitForIdle_func funksjon

 Var waitForIdle_complete = 0;. Var waitForIdle_func = function (cb) {if (waitForIdle_complete) {cb (); } Else {sp.write ("q \\ r", funksjon (err) {if (err == udefinert) {console.log ('ERR' + err);!}}); setTimeout (function () {waitForIdle_func (cb);}, 200); }} Var waitForIdle = function (cb) {waitForIdle_complete = 0; setTimeout (function () {waitForIdle_func (cb);}, 200);} sp.on ("data", funksjon (data) {console.log ('data mottatt __' + data + '__'); if (data '.' ==) {console.log ('bevegelse komplett!'); waitForIdle_complete = 1;}}); 

Ved hjelp av en async.queue gjør kommandoene og venter på å bli oppført enkelt og avløp () tilbakeringing er henrettet når alle bevegelseskommandoene i køen er fullført. I dette tilfellet nodejs skriptet ganske enkelt går ut ved avslutningen av hele bevegelsen.

pushAndWait funksjonen er lagt inn i køen i seg selv for å tillate bare servo bevegelse kommandoen som skal legges, og en implisitt vente kommando er satt inn. Å se forskjellen at å legge pushAndWait gjør, se de fire siste push () metodekall som er nesten lik de to siste pushAndWait metodekall, en er planlagt å fullføre (T1500) bevege seg raskere enn den andre.

 Var async = require ("async"); ... Var q = async.queue (funksjon (oppgave, tilbakeringing) {console.log ('køen:' + task.name); if (task.cmd) {sp. skrive (task.cmd), tilbakeringing ();} else {waitForIdle (funksjon () {tilbakeringing ();});}}, 1); q.drain = function () {console.log ('køen: alle elementer har blitt behandlet '); process.exit ();} q.pushAndWait = function (navn, cmd) {this.push ({name: navn, cmd: cmd}); this.push ({name: "vente", vent: 1}); } q.push ({name: 'nær', cmd: "# 4 P1050 T2000 \\ r"}); q.push ({name: "vente", vent: 1}); q.push ({name: ' open ', cmd: "# 4 P1900 T2000 \\ r"}); q.push ({name: "vente", vent: 1}); q.pushAndWait ("close", "# 4 P1050 T1500 \\ r"); q.pushAndWait ("åpen", "# 4 P1900 T2000 \\ r"); 

Det samme køen teknikken er nyttig for å bruke andre seriestyreprotokollene fra nodejs, spesielt når kontrolleren svarer på hver kommando, og vil ikke akseptere en annen kommando før den forrige er ferdig.

Pek og Klikk Movement

Som med tre hjul robot base, kombinasjonen av Bootstrap, jQuery, og bootstrap-glidebryteren prosjekter tillate et webgrensesnitt å være raskt opprettet. Nettsiden består av seks glidere, fem til styre servo stillinger og én for å angi hvor lenge den nåværende bevegelsen bør ta. Denne siste glideren er svært viktig fordi det gir større bevegelser som skal utføres ved lavere hastigheter for å oppnå jevn bevegelse og å ikke sette ekstra stress på robotarmen.

Hele serveren er mindre enn 50 linjer med kode som vist nedenfor. Som servo glidere varierer fra 0 til 100 på moveServo () -funksjonen konverterer at verdien i en PWM innstilling (rundt år 1000 til 2000) at SSC-32 er ventet.

 Var b = krever ('bonescript'); Var Serial = require ("serial") Serial;. Var serial = require ("serial"); Var io = krever ('socket.io') lytter (8888);. Var ssc32 = new Serial ("/dev /ttyO4 ", {baudrate: 115200}); io.sockets.on ('tilkobling' funksjon (socket) {console.log (" har connection "); Var timeToCompleteMove = 1500; Var moveServo = function (servonum, perc) { if (typeof perc === «udefinert») tilbake; Var servoval = 1000 + 1000 * perc /100; ssc32.write ("#" + servonum + "P" + servoval + "T" + timeToCompleteMove + "\\ r" );} socket.on ("base", funksjon (v) {moveServo (0, v.value);}); socket.on ("skulder", funksjon (v) {moveServo (1, v.value); }); socket.on ("albue", funksjon (v) {moveServo (2, v.value);}); socket.on ("håndledd", funksjon (v) {moveServo (3, v.value); }); socket.on ('grabben', funksjon (v) {moveServo (4, v.value);}); socket.on ('tid', funksjon (v) {if (typeof v.value === «udefinert») tilbake; timeToCompleteMove = v.value;});}); 

Annet enn siden styling indeksen .html inneholder mange fragmenter som følgende som skaper en glidebryter og sender en melding til serveren når verdien av glideren endres

. < div class = "row" > < div class = "col-md-1" > < p class = "lede" > Grabber < /p > < /div > < div class = "col-md-8" > < innspill id = "grabber" data-slider-id = 'grabberSlider' type = "text" data-slider-min = "0" data-slider-max = "100" data-slider-trinn = "1" data-slider-value="50"/></div></div>...$('#grabber').slider({});$("#grabber").on('slide', funksjon (slideEvt) {socket.emit ('grabben', {verdi: slideEvt.value [0], '/end': 'of-melding'});}); 

Forutsatt at koden for å styre roboten arm er i /home /debian /bonescript /webinterface og at hoved nodejs serveren kalles lynxmotion-arm-server.js nedenfor kommandoer først gjøre webgrensesnittet tilgjengelig gjennom Cloud9 webserver som allerede kjører på BeagleBone svart og deretter tilrettelegge for nodejs serveren må startes automatisk.

 cd /var /lib /cloud9ln -s /home /debian /bonescript /webinterface armcd ./autorunln -s /home /debian /bonescript /webinterface /lynxmotion- arm-server.js 

Dette bør tillate deg å kontrollere armen med en nettleser ved å besøke http:. //bbb.ip.addr/arm/. Hele kildekoden for dette er opp på github.


Vi vil gjerne takke RobotShop for å levere robotarmen som brukes i denne artikkelen. Anmeldelser