Hvordan kontrollere en servomotor fra en BeagleBone Svart på Linux

Servo motorer kan rotere til en spesifisert vinkel og hold den vinkelen mot en resistiv kraft. Dette gjør Servos stor for å skape en DIY pan-and-tilt kamera system, for å flytte paneler gjennom en begrenset avstand i et modellfly hvor vinden kan gi motstand til at bevegelse, og i mange tilfeller i robotikk der du kanskje trenger å rotere noe til en bestemt vinkel. I denne opplæringen vil vi dekke hvordan å koble til og styre en servo motor med en BeagleBone svart kjører Linux.

høyere dreiemoment servoer kan kjøre på en høyere spenning enn en BeagleBone Svart vil levere, så må du kanskje bringe en ekstern strømkilde inn i miksen. For å gjøre ting interessant, servo for denne artikkelen trenger minst 6 volt og er montert inn i en girkasse å handle noen RPM for enda mer dreiemoment.

Ved hjelp av en ekstern strømkilde betyr at du trenger bare to pinner fra BeagleBone Svart, en PWM pin (den hvite ledningen i figuren over) for å kontrollere Servo og en bakken pin for å sikre at begge strømkilder har en felles plattform (grønn ledning) til å operere fra.

BeagleBone svart er en liten en gigahertz (GHz) ARM-maskin med 512 megabyte (MB) RAM, 2 gigabyte (GB) on-board flash-minne, og viktigst, to overskrifter hver med to rader med pins kontakter klar for din neste forankret prosjekt . I denne serien på BeagleBone Svart har vi sett hvordan du bruker Linux-grensesnittet tillater oss å få tilgang chips i løpet av SPI og motta avbrudd når spenningen på en pinne endringer.

Anatomy of a Servo Motor

Inne i en servomotor vil du finne selve motoren, en feedback mekanisme, og litt curcuit å kontrollere ting. Mange servoer tilby et begrenset utvalg av bevegelse, for eksempel 90, 180, eller 360 grader av bevegelse. På grunn av omfanget av bevegelse, er en servostyrt ved å fortelle det hvilken vinkel du ønsker motoren å holde. Når det er sagt, noen servoer har ingen begrensninger og gir kontinuerlig rotasjon. Tilbakemeldingene mekanismen inne i en servo kan være et potensiometer som gjør at servo å vite hvilken vinkel det for tiden holder. På denne måten kan fortelle servo å flytte til 120 grader og det vil gjøre justeringer seg å flytte motoren til den vinkelen og deretter fortsette å holde den vinkelen

Det er normalt tre ledninger for en servo. Strøm, bakken, og en signalledning. Denne artikkelen bruker en Hitec HS-5685MH servo. For dette Hitec servo er strømledningen rødt, er malt svart, og signalet ledningen er gul. Dette servo tilbyr en god mengde dreiemoment og kan kjøres på 6 til 7,4 volt (V) av makt. Det er interessant å merke seg at låsen /stall strømkravene til Hitec HS-5685MH er 2 ampere når du slår den på 6 V.

På grunn av de høye strømbehovet for servo, prøver å kjøre den direkte av Arduino eller BeagleBone Svart makt utganger er en dårlig idé. Så jeg slått den av en strømkilde eksternt til BeagleBone Svart eller Arduino og koblet bakken på BeagleBone Svart /Arduino til bakken på den eksterne servo makt curcuit å etablere en felles plattform. Jeg fant ut at servoen ikke ønsker å operere på 5 V --no overraskelse da dette er ute av servo spec. På 6 V servo flyttet jevnt. Maksimal spenning av servo på 7,4 V bør tillate mange batterialternativer for å gi den beste dreiemoment servo kan tilby.

signalledning bruker Pulse Width Modulation (PWM) for å tillate deg å fortelle servo vinkelen du ønsker at det skal rotere. Når du bruker PWM å kontrollere en servo, tiden delt inn i 20 millisekunder (ms) blokker. Inne i en blokk hvis spenningen er høy i 1,5 ms og så lav for resten av blokken, vil servo sitter omtrent i midten av sitt område, i det minste for Hitec servoer brukes i denne artikkelen. Hvis signalet er høyt for bare en av de 20 ms ms blokk av gangen da servo vil bevege seg til en mindre vinkel enn den på midten. Likeledes holder signalet høy til 2 ms vil bevirke at servo til å bevege seg til en større vinkel enn dens midtpunkt.

Noen servoer er tilgjengelige slik at bevegelse gjennom mange forskjellige områder av vinkler. For denne artikkelen Hitec HS-5685MH ble konfigurert for bevegelse gjennom ca 400 grader. Den blokk av gangen (20 ms i dette tilfelle) kalles periode av signalet og tiden spenningen er høy (1-2 ms) er driftssyklusen.

Selv med et høyt dreiemoment servo man kanskje ønsker å handle noen av RPM for en økning i dreiemoment. Bildet ovenfor viser den montert i en ferdiglaget Servo Girkasse som deretter blir montert inne i en kanal Actobotics aluminium servo. En liten fangsten her er at messing Servo utstyr vil ha til å rotere flere ganger for at legeringen større utstyr for å rotere en gang.

For å holde servostyre enkelt, tilbakekoblingsmekanismen i servo fjernes fra servo og festet til større leger gear. Denne måten en servo som skulle gi en 360-graders maksimal rotasjon vil spinne mange ganger for å gi en 360-graders rotasjon av større legering gear. Selvfølgelig, må du bruke en servo som fullt ut kan rotere mange ganger. Noen servoer har fysiske stoppere i dem som ikke tillater full rotasjon. Ved å flytte feedback mekanisme kan du styre vinkelen leger utstyret holder med samme PWM området som servo kan forstå.

Kicking dekkene med Arduino

Som jeg har gjort i Tidligere startet jeg ut ved å kommunisere med maskinvaren ved hjelp av en Arduino og deretter flyttet til erstatte Arduino med en BeagleBone Svart. Tenker i millisekunder laget tallene i diskusjonen ovenfor enklere, men i et program kan det være mer praktisk å bruke mikrosekunder (ms) gjennom å unngå å blande millisekunder og mikrosekunder. Følgende program feier Hitec HS-5685MH servo gjennom ca 360 grader rotasjon. De første 20 ms (20,000 uS) blokk av gangen vil bare ha en høy spenning på 800 us tid. Dette vil stadig øke opp til å være høye 2400 us over 20.000 us tid blokk

 void setup () {pinMode (5, OUTPUT).; digitalWrite (5, LOW);} int periodTimeSlice = 20 * 1000; int minPulseTimeSlice = 800; int maxPulseTimeSlice = 2400; int TimeDelta = 1; void loop () {int c = minPulseTimeSlice; for (c = minPulseTimeSlice; c < = maxPulseTimeSlice; c + = TimeDelta) {digitalWrite (5, HIGH); delayMicroseconds (c); digitalWrite (5, LOW); delayMicroseconds (periodTimeSlice - c); } For (c = maxPulseTimeSlice; c > = minPulseTimeSlice; c - = TimeDelta) {digitalWrite (5, HIGH); delayMicroseconds (c); digitalWrite (5, LOW); delayMicroseconds (periodTimeSlice - c); }} 

Arduino servo biblioteket gir en mye mer praktisk grensesnitt for å kontrollere servomotorer. Koden ovenfor ble bevisst skrevet på et lavt nivå uten å bruke noen bestemt PWM maskinvare, slik at PWM utgang er eksplisitt.

Flytte til Linux og BeagleBone Svart

Jeg startet testing ved hjelp av en HS- 422 servo og BeagleBone Svart. Gitt de lavere strømkravene til HS-422 Jeg bestemte meg for å kjøre det direkte fra 5 V-utgangen på BeagleBone svart. Ved første gang jeg mekke rundt i det lovende jakt /sys /class /PWM katalog tre som er dokumentert i Linux-kjernen dokumentasjonsfiler. Etter en stund uten å lykkes å bruke /sys /class /PWM jeg flyttet til bruker enheten tre overlegg i /lib /firmware.

Ett lite triks her er at hvis du aktiverer to PWM utganger som er drevet av samme brikke da kan du ikke endre den perioden av PWM. Du får noe sånt som "skrivefeil: Ugyldig argument" når du prøver å skrive til perioden filen. Hvis du får skrivefeil, prøve å deaktivere andre PWM overlegg, slik at det bare er en bruk av PWM chip. Et eksempel på fjerning av en overlapping er vist ved enden av artikkelen. Standardperioden er 500000 nanosekunder, eller et halvt millisekund som er for kort for servostyring.

Min opprinnelige plan var å bruke pin 22 på header 9 som er den første PWM chip. Det overlegg unnlot å laste fordi det var en konflikt med SPI bussen overlegg, vises nedenfor. Så enhetstreet overlegg beskyttet en potensiell konflikt bruk av noen pinner! PWM på P9_16 var i stand til å laste uten konflikt.

Et ord av forsiktighet før du aktiverer en PWM utgang, for meg de alltid startet med standardverdier og en av disse er å starte i en løpende tilstand. Så du vil ønske å flytte til pwm_test_P9_16 katalogen ganske raskt og deaktivere PWM utgang. Jeg prøvde å endre dts-fil for å fortelle Linux-kjernen som jeg ønsket PWM grensesnittet skal kunne startes i et ikke-driftsmodus og uten invertert utgang. Dessverre mine mange forsøk førte ikke til noen endring fra standardverdiene når du setter opp sporet

 root @ beaglebone. /Lib /firmware # uname -aLinux beaglebone 3.8.13 # 1 SMP To 12 september 10: 27:06 CEST 2013 armv7l GNU /Linuxroot @ beaglebone: /lib /firmware # echo bone_pwm_P9_22 > /sys /enheter /bone_capemgr * /slots-bash: echo: skrive feil: Fil existsroot @ beaglebone: /lib /firmware # dmesg | tail [4510.813900] bone-capemgr bone_capemgr.9: part_number 'bone_pwm_P9_22' versjon 'N /A' [4510,814095] bone-capemgr bone_capemgr.9: slot # 30: generisk overstyring [4510,814353] bone-capemgr bone_capemgr.9: bein: Ved hjelp av overstyring EEPROM data på sporet 30 [4510,814412] bone-capemgr bone_capemgr.9: slot # 30: Overstyr Navn Board, 00A0, Styr Manuf, bone_pwm_P9_22 '[4510,818521] bone-capemgr bone_capemgr.9: slot # 30: Be om delenummer /versjon basert 'bone_pwm_P9_22-00A0.dtbo [4510,818589] bone-capemgr bone_capemgr.9: slot # 30: Ber om firmware' bone_pwm_P9_22-00A0.dtbo 'for kost-navnet' Styr Board Name ", versjon" 00A0 '[4510,818654] bein -capemgr bone_capemgr.9: slot # 30: dtbo 'bone_pwm_P9_22-00A0.dtbo' lastet; konvertere til å leve tre [4510.819308] bone-capemgr bone_capemgr.9: slot # 30: bone_pwm_P9_22 konflikt P9.22 (# 9: BB-SPIDEV0) [4510,828819] bone-capemgr bone_capemgr.9: slot # 30: Kunne verificationroot @ beaglebone: /lib /firmware # echo bone_pwm_P9_16 > /sys /enheter /bone_capemgr * /slots # cat /sys /enheter /bone_capemgr * /slots 0: 54: PF --- 1: 55: PF --- 2: 56: PF --- 3: 57: PF- - 4: ff: POL Bone-LT-eMMC-2G, 00A0, Texas Instrument, BB-BONE-EMMC-2G 5: ff: PO-- Bone-Black-HDMI, 00A0, Texas Instrument, BB-BONELT-HDMI 6: ff: PO-- Bone-Black-HDMIN, 00A0, Texas Instrument, BB-BONELT-HDMIN 7: ff: Pol Styr Navn Board, 00A0, Styr Manuf, cape-bone-iio 8: ff: Pol Styr Board Name , 00A0, Styr Manuf, am33xx_pwm 9: ff: Pol Styr Navn Board, 00A0, Styr Manuf, BB-SPIDEV010: ff: Pol Styr Navn Board, 00A0, Styr Manuf, GPIO-P9.1211: ff: Pol Styr Board navn, 00A0, Styr Manuf, GPIO-P9.1512: ff: Pol Styr Navn Board, 00A0, Styr Manuf, GPIO-P9.2314: ff: Pol Styr Navn Board, 00A0, Styr Manuf, GPIO-P9.2615: ff: POL styre Navn Board, 00A0, styre Manuf, GPIO-P9.2729: ff: Pol styre Navn Board, 00A0, styre Manuf, bone_pwm_P9_16 

Når pwm_test_P9_16 katalogen finnes du ønsker å flytte til det og sette kjøre til 0 til deaktivere utgang mens du konfigurere PWM. Nedenfor setter jeg fram til 20 ms og en start plikt til 1 ms, etter muliggjør produksjon igjen servo vil svinge til venstre av sin sentrale posisjon. Etter ekko 2 ms inn plikten servo bør flytte til høyre for midten

 root @ beaglebone: # cd /sys/devices/ocp.3/pwm_test_P9_16.*# ekko 0 > kjøre # katt periode. 500000 # cat plikt 0 # katt polaritet 1 # echo 0 > polaritet # echo 20000000 > perioden # echo 1000000 > duty # echo 1 > kjører # echo 2000000 > duty # echo 0 > kjøre 

Skifte HS-422 servo med kanalen mount Servo Gearbox Jeg løp igjen Servo fra en ekstern 6 V strømkilde og koblet bakken pin til bakken av den eksterne strømforsyningen brukes til servo. Jeg fant utvalget av 360 graders bevegelse kan nesten oppnås ved hjelp av en rekke 1 til 2 ms puls. Den minimale nyttig pulsen var ca 880 000 ns opp til ca 2.200.000 ns. Skrive en verdi utenfor dette området forårsaket servo å kontinuerlig rotere i stedet for settling på en bestemt vinkel.

Hvis du vil fjerne et overlegg for en PWM utgang rett og slett vise sporene fil, se sporet nummer av hva du vil fjerne, og skrive -1 * slot-nummeret tilbake til sporene fil som vist nedenfor

 root @ beaglebone: /lib /firmware # echo bone_pwm_P9_16 >. /sys /enheter /bone_capemgr * /slots # cat /sys /enheter /bone_capemgr * /slots 0: 54: PF --- 1: 55: PF --- 2: 56: PF --- 3: 57: PF- - 4: ff: POL Bone-LT-eMMC-2G, 00A0, Texas Instrument, BB-BONE-EMMC-2G 5: ff: PO-- Bone-Black-HDMI, 00A0, Texas Instrument, BB-BONELT-HDMI 6: ff: PO-- Bone-Black-HDMIN, 00A0, Texas Instrument, BB-BONELT-HDMIN 7: ff: Pol Styr Navn Board, 00A0, Styr Manuf, cape-bone-iio 8: ff: Pol Styr Board Name , 00A0, Styr Manuf, am33xx_pwm ... 15: ff: Pol Styr Navn Board, 00A0, Styr Manuf, GPIO-P9.27  29: ff: Pol Styr Navn Board, 00A0, Styr Manuf, bone_pwm_P9_16 
root @ beaglebone: /lib /firmware # echo -29
> /sys /enheter /bone_capemgr * /slotsIt synes at enheten tre overlegg spille en nøkkelrolle i å få tilgang mye av maskinvaren på BeagleBone svart. Med en SoC som kan bruke sine pins til mange forskjellige formål, avhengig av hvordan den er konfigurert, kan enhets overlegg redde deg fra å prøve å tilfeldigvis gjenbruke noen pinner som kan allerede reservert til andre formål. Når en PWM-katalogen er satt opp i /sys/devices/ocp.3 kontrollere en servo fra BeagleBone Black er så enkelt som å skrive et nummer til en fil. Tune in neste gang når vi skal styre noen girmotorer å flytte en robot base rundt ved hjelp Bonescript.

Vi vil gjerne takke ServoCity for å forsyne girkasse og servo brukes i denne artikkelen.