Hvordan kontrollere et tre hjul robot fra en tablett med BeagleBone Black

Gi BeagleBone Svart egne hjul, helt untether noen kabler fra hele greia og styre roboten fra en tablett.

Den 3 Wheel Robot Settet inneholder alt byggematerialet som kreves for å skape en robot base. Til robotbasen du må legge to girmotorer, batterier og noen måte å kontrollere det. Leaving motorene ut av tre hjulsettet lar deg velge motor med et dreiemoment og RPM passer til ditt bruksområde.

I denne artikkelen vil vi bruke Web-serveren på BeagleBone Svart og noen Bonescript å tillate enkel robot kontroll fra hver tablett. Ingen "apps" som kreves. Bonescript er en nodejs miljø som følger med BeagleBone Svart.

Synlig i bildet til venstre er det tre hjul robot base med en ekstra pan og tilt mekanisme. Alle elementer over lang svart linje og alle batterier, elektronikk, kabling, og de to girmotorer var tilskuddene til basen. Når du kan styre basen bruker BeagleBone Svart, er relativt enkelt å legge til annen maskinvare.

Denne artikkelen bruker to 45 rpm Precision Gear Motors. Hjulene er 6 inches i diameter slik at roboten vil være speed-begrenset til ca 86 fot per minutt (26 meter /min). Disse motorene kan kjøres fra 6-12 volt og trekke maksimalt stall dagens trekning av en amp. Den store stall dagens trekning vil skje når motoren er i ferd med å snu, men er ikke i stand til. For eksempel, dersom roboten har kjørt inn i en vegg og dekkene ikke glir. Det er en god idé å oppdage tilfeller som trekker stall strøm og slå av strømmen for å unngå overoppheting og /eller skade på motoren.

I denne Linux.com serien på BeagleBone Svart vi har også sett hvordan du bruker Linux-grensesnittet tillater oss å få tilgang chips i løpet av SPI og motta avbrudd når spenningen på en PIN endringer, og hvordan man skal kjøre servomotorer.

Konstruere 3 Wheel Robot


Delene for tre hjul robot kit er vist ovenfor (med de to girmotorer i tillegg til rå kit). Du kan sette sammen roboten base i den rekkefølgen du ønsker. En god del av delene er brukt, sammen med hvilken motor du har valgt, for å montere de to drevet forhjulene. De to stykker av kanal er tilkoblet med navet avstandsstykket og svivelen navet brukes til å koble den korteste del av kanalen i en vinkel på baksiden av roboten. Jeg antar de to drivhjulene er på 'forsiden'. Jeg startet byggingen på de to drivhjulene som brukes opp en hub adapter, skru hub, og to motor mount stykker. Tar de deler ut av miksen igjen mindre rot for den påfølgende valg av stykker.

Slå Alt

I en tidligere artikkel jeg dekket hvordan BeagleBone Svart ønsket om 2,5 i den lave 3 watt strøm for å fungere. Kraft krav til BeagleBone Svart kan bli møtt på mange måter. Jeg valgte å bruke en enkelt 3,7-volts 18650 litium batteri og en 5 V steg opp bord. Den BeagleBone svart har en strømkontakten ventet 5 V. På et høyt CPU belastning på BeagleBone Svart kunne ta opp til 3,5 W effekt. Så batteriet og trappe opp omformer må være komfortabel forsyne en 5V /700mA strømforsyning. Batteriet er oppgitt til ca 3 amperetimer så BeagleBone Svart skal kunne kjøre i timevis på én lading.

De girmotorer for hjulene kan operere på 6 til 12 V. Jeg brukte et ekstra batteri kilde for motorene slik at de ikke ville forstyrre kraften i BeagleBone Svart. For motorene jeg brukte en blokk hvis 8 NiMH oppladbare AA-batterier. Dette bare tilbudt rundt 9,5 V så girmotorer vil ikke oppnå sitt maksimale ytelse, men det var en billig forsyning å komme i gang. Jeg har manuelt unngått å drøye enten motor i testing for ikke å forsøke å trekke for mye strøm fra AA-batterier. Noen stall beskyttelse for å kutte strøm til girmotorer og beskytte batteriene bør brukes eller en dyrere motor batteri kilde. For eksempel, å overvåke strømmen og å slå av motorene når de forsøker å trekke for mye.

Motorens strømforsyningen er koblet til H-broen bord. Making bakken terminalen på H-bro et passende sted for en felles jordforbindelse til BeagleBone Svart.

kommunisere uten ledninger

BeagleBone Svart ikke har om bord wifi. En måte å gi enkel kommunikasjon med BeagleBone Black er å blinke en TP-Link WR-703N med OpenWRT og bruke det til å gi en wifi-tilgangspunkt for tilgang til BeagleBone Svart. WR-703N er montert på roboten base og er koblet til Ethernet-porten på BeagleBone Svart. Tablettene og bærbare datamaskiner kan koble til tilgangspunktet som tilbys av onboard WR-703N.

Jeg fant det praktisk å sette opp WR-703N å være en DHCP server og å tildele samme IP-adresse til BeagleBone svart som det ville ha oppnådd når koblet til min kablet nettverk. På denne måten tabletten kan kommunisere med roboten både i et kablet prototyping oppsett og når roboten er oversiktlig.

Kontrollere girmotorer fra BeagleBone Svart

I motsetning servomotorer diskutert i forrige artikkel, girmotorer har ikke den samme pulsbreddemodulasjon (PWM) styreledning for å sette i en vinkel for å rotere på. Det er bare strøm og jord for å koble til. Hvis du kobler girmotoren direkte til en 12 V strømkilde det vil spinne opp for å slå så fort som mulig. Slik slår girmotoren litt tregere, sier 70 prosent av sin maksimale hastighet, må du levere strøm bare 70 prosent av tiden. Så vi ønsker å utføre PWM på strømforsyningen ledningen til giret. I motsetning til PWM brukes til å styre servo vi ikke har noen faste 20 millisekunders tidsluker tvunget på oss. Vi kan dele opp tid noen måte vi ønsker, for eksempel kjører full effekt i 0,7 sekunder da ingen makt for 0,3 s. Selv om en kortere stykke enn 1 s vil gi en jevnere bevegelse.

en H-bro-brikken er nyttig å være i stand til å bytte en høy spenning, høy strømledningen på og av fra en 3,3 V ledning som er koblet til BeagleBone Svart. En enkelt H-broen vil la deg kontrollere en giret. Noen chips som L298 inneholde to H-Bridges. Dette er fordi to H-Bridges er nyttig hvis du vil kontrollere noen stepper motorer. Et styre som inneholder en L298, heatsink og tilkoblingsklemmer kan kjøpes for så lite som $ 5 fra en Kina-baserte butikken, opp til mer enn $ 30 for et fullt befolket konfigurasjon gjort i Canada som inkluderer motstander slik at du kan overvåke strømmen som trekkes av hver motor.

L298 har to pinner for å kontrollere konfigurasjonen av H-broen og en frigivelse pin. Med de to kontroll pinnene kan du konfigurere H-broen til å flyte strøm gjennom motoren i begge retninger. Så du kan slå av motoren forover og bakover, avhengig av hvilken av de to kontroll pinnene er satt høyt. Når aktiverings pin er høy da kraften flyter fra motoren batteriene gjennom motoren i den retningen at H-broen er konfigurert for. Aktiverings pin er hvor du skal bruke PWM for å slå av motorene med en hastighet tregere enn sin toppfart.

De to styreledninger og aktiverer linjen lar deg kontrollere en H-broen og dermed en giret. Den L298 har et annet sett aktivere og kontrollinjer, slik at du kan styre en andre giret. Annet enn disse linjene den BeagleBone Svart har å koble bakken og 3,3 V til H-broen.

Når jeg først prøvde å kjøre roboten i en rett linje fant jeg ut at det gradvis slått venstre. Etter litt eksperimentering fant jeg ut at ved full effekt venstre motor roterte i et noe lavere turtall i forhold til den rette. Jeg er ikke sikker på hvor denne forskjellen ble innført, men etter å ha funnet det tidlig på testing av programvare er designet for å tillate slike Kalibrering utføres bak kulissene. Du velger 100 prosent fart rett fram og programvaren kjører riktig motor på bare 97 prosent strøm (eller hva Kalibrering justering er for tiden brukt)

For å tillate enkel kontroll av de to motorene jeg brukte to begreper:. Hastigheten (0-100) og overskriften (0-100). En overskrift på 50 betyr at roboten skal gå videre rett fram. Dette etterligner en bil grensesnitt der styring (posisjon) og hastighet er justert og roboten tar seg av detaljene.

Jeg har gjort hele kildekoden tilgjengelig på github. Legg merke til den grenen linux.com-artikkelen som er frosset i tid på det punktet av artikkelen. Hoved grenen inneholder noen nye godbiter og noen endringer i koden struktur, også.

Server

Fordi robotbasen var "T" formet, over tid det ble referert til som TerryTee . Den TerryTee nodejs klassen bruker bonescript å styre PWM for de to girmotorer.

Konstruktøren tar pinnen identifikator å bruke for venstre og høyre motor PWM signaler og en reduksjon skal gjelde for hver motor, med 1,0 blir ingen reduksjon og 0,95 er å kjøre motoren på bare 95 prosent spesifisert hastighet. Reduksjonen er det slik at du kan kompensere hvis en motor går litt tregere enn den andre

 funksjon TerryTee (leftPWMpin, rightPWMpin, leftReduction, rightReduction) {TerryTee.running = 1.; TerryTee.leftPWMpin = leftPWMpin; TerryTee.rightPWMpin = rightPWMpin; TerryTee.leftReduction = leftReduction; TerryTee.rightReduction = rightReduction; TerryTee.speed = 0; TerryTee.heading = 50;} 

setPWM () metoden vist nedenfor er det laveste nivå én i TerryTee, og andre metoder bruke den til å endre hastigheten på hver motor. Den PWMpin velger hvilken motor for å styre og 'perc' er prosentandelen av tiden som motor skal forsynes med strøm. Jeg har også gjort perc stand til å være fra 0-100 så vel som fra 0,0 -. 1.0 så webgrensesnittet kunne håndtere i hele tall

Når en nødstopp er aktiv, er falsk kjører så setPWM ikke vil endre strømsignal. Den setPWM gjelder også motorstyrke Kalibrering automatisk slik høyere nivå kode trenger ikke å være opptatt av det. Som analogWrite () Bonescript samtalen bruker den underliggende PWM maskinvare for å sende ut signal, ikke PWM trenger ikke å være konstant oppdateres fra programvare, når man setter 70 prosent da roboten motoren vil fortsette å forsøke å rotere med den hastighet inntil man si det ellers

 TerryTee.prototype.setPWM = function (PWMpin, perc) {if retur. (TerryTee.running!); if (PWMpin == TerryTee.leftPWMpin) {perc * = TerryTee.leftReduction; } Else {perc * = TerryTee.rightReduction; } If (perc > 1) perc /= 100; console.log ("awrite PWMpin:" + PWMpin + "perc:" + PERC); b.analogWrite (PWMpin, perc, 2000);}; 

setSpeed ​​() samtalen tar dagens overskrift i betraktning og oppdaterer PWM signal for hvert hjul for å reflektere kurs og fart du har i dag satt
<. pre> TerryTee.prototype.setSpeed ​​= function (v) {if avkastning (TerryTee.running!); if (v < 40) {TerryTee.speed = 0; this.setPWM (TerryTee.leftPWMpin, 0); this.setPWM (TerryTee.rightPWMpin, 0); komme tilbake; } Var leftv = v; Var rightv = v; Var overskriften = TerryTee.heading; if (overskriften > 50) {if (posisjon > = 95) leftv = 0; annet leftv * = 1 - (overskrift-50) /50; } If (posisjon < 50) {if (posisjon < = 5) rightv = 0; annet rightv * = 1 - (50 rubrikken) /50; } Console.log ("setSpeed ​​v:" + v + "leftv:" + leftv + "rightv:" + rightv); this.setPWM (TerryTee.leftPWMpin, leftv); this.setPWM (TerryTee.rightPWMpin, rightv); TerryTee.speed = v;};

Serveren seg selv skaper en TerryTee objekt og deretter tilbyr en Web-kontakten for å kontrollere at Terry. The 'stopp' budskap er ment som en nødstopp som tvinger Terry å slutte å bevege seg og ignorere innspill for en periode, slik at du kan få til det, og deaktiver strøm i tilfelle noe har gått galt.

 Div terry = new TerryTee ('P8_46', 'P8_45', 1,0, 0,97), terry.setSpeed ​​(0); terry.setHeading (50), b.pinMode ('P8_37', b.OUTPUT); b.pinMode (' P8_38 ', b.OUTPUT); b.pinMode (' P8_39 ', b.OUTPUT); b.pinMode (' P8_40 ', b.OUTPUT); b.digitalWrite (' P8_37 ', b.HIGH); b.digitalWrite ('P8_38', b.HIGH); b.digitalWrite ('P8_39', b.LOW); b.digitalWrite ('P8_40', b.LOW); io.sockets.on ('tilkobling' funksjon (socket) {... socket.on ("stopp", funksjon (v) {terry.setSpeed ​​(0); terry.setHeading (0); terry.forceStop ();}); socket.on ('speed', funksjon ( v) {console.log ('satt fart til ", v), console.log (' satt fart til", v.value); if (typeof v.value === «udefinert») tilbake; terry.setSpeed ​​( v.value);}); ... 

Den koden på github er sannsynlig å utvikle seg over tid for å flytte de ulike faste cutoff tall å være konfigurerbar og la Terry å bli reversert fra tabletten

. The Client (webside)

Hvis du raskt vil lage et webgrensesnitt jeg brukte Bootstrap og jQuery. Hvis grensesnittet ble mer avansert så kanskje noe sånt AngularJS ville være en bedre passform. For å kontrollere fart og kurs med en enkel touch-grensesnitt Jeg brukte også bootstrap-slider prosjektet

. ≪ div class = "indre cover" > < div class = "row" > < div class = "col-md-1" > < p class = "lede" >  Speed ​​
< /p > < /div > < div class = "col-md-8" > < innspill id = "speed"
data-slider-id = 'speedSlider' type = "text" data-slider-min = "0 "data-slider-max =" 100 "data-slider-trinn =" 1 "data-slider-value =" 0 "/> < /div > < /div > < div class = "row" > < div class = "col-md-1" > < p class = "lede" > Overskrift
< /p > < /div > < div class = "col-md-8" > < innspill id = "overskriften"
data-slider-id = 'headingSlider' type = "text" data-slider-min = "0 "data-slider-max =" 100 "data-slider-trinn =" 1 "data-slider-value =" 50 "/> < /div > < /div > < /div > < div class = "indre cover" > < div class = "btn-gruppen" > < knappen id = "rotateleft"
type = "button" class = "btn btn-default btn-lg" > < span class = "glyphicon glyphicon-hand-venstre" > < /span > & nbsp; Rot
& nbsp; Venstre
< /knapp > < knappen id = "straightahead" type = "button" class = "btn btn-default btn-lg" > < span class = "glyphicon glyphicon-pil-up" > < /span > & nbsp; Straight & nbsp; videre < /knapp > < knappen id = "rotateright" type = "button" class = "btn btn-default btn-lg" > < span class = "glyphicon glyphicon-hand-rett" > < /span > & nbsp; Rot & nbsp; Høyre < /knapp > < /div > < /div >

Med disse UI elementer kroken opp til serveren er gjennomført ved hjelp av io.connect () for å koble en "Var socket" tilbake til BeagleBone Svart. Koden nedenfor sender kommandoer tilbake til BeagleBone Svart som UI elementer justeres på siden. Den rotateleft kommandoen er simulert ved å sette kurs og fart i noen sekunder og så stopper alt.

 $ ("# speed"). På ('lysbilde ", funksjon (slideEvt) {socket.emit (' speed ', {verdi: slideEvt.value [0],' /end ':' of-melding '});}); ... $ (' # straightahead '.) på ("klikk", funksjon (e) {$ ('# overskriften ") data (' slider ') SetValue (50),..}) $ (' # rotateleft ') på (" klikk ", funksjon (e.) {$ (' # overskriften"). data ('slider') SetValue (0);. $ ('# speed ") data (' slider ') SetValue (70),... setTimeout (function () {$ (' # speed") data ('slider ') .setValue (0); $ (' # overskriften ") data (. 'slider') SetValue (50),.}, 2000);}) 

BeagleBone Svart kjører en webserver som tilbyr filer fra /usr /share /bone101. Jeg fant det praktisk å sette hele prosjektet i /home /XUser /webapps /terry-tee og lage en softlink til prosjektet på /usr /share /bone101 /terry-tee. På denne måten http: //mybeagleip/terry-tee/index.html vil laste webgrensesnitt på en tavle. Cloud9 vil automatisk starte noen Bonescript filer i /var /lib /cloud9 /autorun. Så to linker oppsett Cloud9 til begge tjener klienten og starter automatisk serveren Bonescript for deg:

 root @ beaglebone: /var /lib /cloud9 /autorun $ ls -llrwxrwxrwx en root root 39 23 april 07:02 terry.js - > /home/xuser/webapps/terry-tee/server.jsroot@beaglebone:/var/lib/cloud9/autorun# cd /usr /share /bone101 /root @ beaglebone: /usr /share /bone101 $ ls -l terry- teelrwxrwxrwx 1 root root 29 april 17 05:48 terry-tee - > /home /XUser /webapps /terry-tee 
Wrap Up

Jeg prøvde å bruke GPIO pins P8_41 til 44. Jeg fant ut at hvis jeg hadde ledninger koblet til disse portene den BeagleBone Svart ville ikke starte . Jeg kunne fjerne og på nytt ledningene etter oppstart og ting vil fungere som forventet. På den annen side, forlater 41-44 usammenhengende og bruker 37-40 i stedet BeagleBone Svart ville starte opp fine. Hvis du har et problem å starte din BeagleBone Sort du kanskje uhell ved hjelp av en kontakt som har en reservert funksjon under oppstart.

Mens konfigurasjonen vist i denne artikkelen gir kontroll over bare bevegelsen av robotbasen på den samme koden kan lett utvides til å styre andre aspekter av roboten man bygger. For eksempel, for å kontrollere en arm festet og være i stand til å flytte rundt på ting fra nettbrettet.

Ved hjelp av en BeagleBone Svart å styre roboten basen gir roboten masse CPU-ytelsen. Dette åpner døren til å bruke et montert kamera med OpenCV å implementere objektsporing. For eksempel kan roboten bevege seg rundt for å holde mot deg. Mens konfigurasjonen i denne artikkelen brukt wifi å få kontakt med roboten, er en annen interessant mulighet til å bruke 3G til å koble til en robot som ikke er fysisk i nærheten.

BeagleBone Svart kan lage en stor Web-styrt robot og tre hjul robot basen sammen med noen girmotorer skal få deg i bevegelse ganske enkelt. Selv når du har foten beveger seg rundt deg kan finne det vanskelig å motstå å gi roboten flere muligheter!

Vi vil gjerne takke ServoCity for å forsyne tre hjul robot base, girmotorer, girkasse og servo brukes i denne artikkelen .