Innholdsfortegnelse:
- Rekvisita
- Trinn 1: Robotoppsett
- Trinn 2: Joystick-oppsett
- Trinn 3: Kontrollere joystick -verdiene
- Trinn 4: Justering av X- og Y -variablene
- Trinn 5: Konvertering av X og Y til verdier for venstre og høyre motor
- Trinn 6: Sende verdiene som radiomeldinger
- Trinn 7: Motta meldingene på roboten din
- Trinn 8: Bruke innkommende meldinger til å kontrollere robotens motorer
- Trinn 9: Bruke knappene - Motta flere meldinger
- Trinn 10: Sende flere meldinger ved hjelp av kontrollerknappene
- Trinn 11: Neste trinn
Video: Programmering av en Micro: Bit Robot & Joystick: Bit Controller With MicroPython: 11 trinn
2024 Forfatter: John Day | [email protected]. Sist endret: 2024-01-30 11:22
For Robocamp 2019, vår sommerrobotikkleir, lodder unge i alderen 10-13 år, programmerer og bygger en BBC micro: bit basert "antweight robot", samt programmerer en micro: bit som skal brukes som fjernkontroll.
Hvis du er på Robocamp, hopper du til trinn 3, ettersom vi har gjort de to første trinnene som en gruppe
Dette er en trinnvis veiledning for å få en mikro: bit robot til å kommunisere med en joystick: bit kontroller.
Det tar ikke den raskeste ruten for å få alt til å fungere, men prøver ting i små biter slik at du kan teste koden mens du går, sette ditt eget preg på den og forstå hvorfor vi gjør de tingene vi gjør !
For denne aktiviteten bruker vi vår egen tilpassede robot, men den vil fungere med hvilken som helst robot som bruker en lignende motordriver, for eksempel en L9110.
Designfiler for roboten vår finner du her:
Denne guiden er skrevet for nybegynnere, men hvis du aldri har brukt en micro: bit med MicroPython før, anbefaler vi at du prøver et enklere program først, for eksempel navnemerket vårt Instructable: https://www.instructables.com/id/Felt -Microbit-Nam …
Rekvisita
2x BBC micro: bit
Robot som fungerer med en BBC micro: bit (se forklaring ovenfor)
joystick: bit controller (vi har vår fra Cool Components)
Trinn 1: Robotoppsett
Du har noen alternativer for å skrive MicroPython -kode for din micro: bit:
- Mu, som du kan laste ned og installere her:
- Nettredaktøren, som du finner her:
Disse instruksjonene antar at du bruker Mu
Åpne Mu, og koble micro: bit til datamaskinen. Mu bør innse at du bruker en micro: bit og velg micro: bit 'Mode', men hvis den ikke gjør det, må du endre den manuelt.
Få en kopi av robotmotortestkoden her:
Hvis du ikke er vant til Github, kan det være uintuitivt! To enkle måter å få denne koden på er:
- Lagre Raw -filen på datamaskinen din, og last den deretter inn i Mu:
- Kopier og lim inn all den oppgitte koden i en ny fil i Mu.
Klikk nå på "Flash" -knappen fra Mu's verktøylinje for å sende den nye koden til micro: bit.
Dette vil ikke fungere med mindre micro: bit er plugget inn
Det gule lyset på baksiden av micro: bit begynner å blinke. Når den er ferdig, er koden din overført.
OPPSETT AV MOTORVEILEDNINGENE
Dette programmet slår motorene på i forskjellige retninger når du trykker på 'A' -knappen på micro: bit.
Det du vil skal skje er:
- Når 'A' vises, venstre motor fremover
- Når 'B' vises, venstre motor bakover
- Når 'C' vises, høyre motor fremover
- Når 'D' vises, høyre motor bakover
Dette vil sannsynligvis ikke være tilfellet, da det avhenger av hvordan du har koblet roboten din!
Øverst i koden finner du en liste over variabler som bestemmer hvilken pinne på mikro: bit som styrer hvilken motorretning.
Hvis du bruker en av våre roboter (filer), bytter du variabelnavnene rundt for å få roboten til å bevege seg i riktige retninger:
Hvis du bruker en egen robot, må du kontrollere hvilke pinner motordriveren er koblet til før du redigerer koden.
TESTING AV STasjonen
Sjekk nå hvordan roboten din driver ved å erstatte testkoden i hovedløkken med en egen kode.
Du ber roboten om å kjøre ved å ringe stasjon () -funksjonen. Dette krever to argumenter - en verdi for venstre motor og en verdi for de høyre motorene, mellom 0 (av) og 1023 (maks hastighet).
Ved å ringe stasjon (500, 500), for eksempel, forteller du begge motorene at de skal slås på, forover, med omtrent halv hastighet.
Prøv noen alternativer for å få en følelse av hvor rett den kjører og hvor godt den snur.
Tips: Motortestene var inne i både en stund True loop og en if -setning - motorene ville ikke snu før du trykket på A -knappen på micro: bit, og det er for alltid å sjekke om du har trykket på A -knappen.
Tips: motorene slår seg ikke av før du ber dem om det! De vil alltid fortsette å gjøre sin siste instruksjon.
VALGFRITT: FORBEDRE KJØRING I EN RETT LINE
Hvis roboten din ikke vil kjøre i en rett linje, kan en av motorene dine snu raskere enn den andre.
Etter å ha kontrollert at det ikke er noe fysisk som hindrer hjulet i å snu fritt, kan du redigere koden i kjørefunksjonen for å redusere hastigheten til den raskere motoren.
Rull opp for å finne definisjonen av stasjonsfunksjonen, og se på de to øverste instruksjonene:
def drive (L, R):
# Nedenfor er en justering for å korrigere for motorhastighetsavvik L = int (L*1) R = int (R*1)
Disse to linjene tar for tiden verdien av L og R, multipliserer dem med 1, og sørg for at de fremdeles er hele tall (int).
For eksempel, hvis venstre motor er raskere, endrer du *1 på linjen til *0,9, og ser om det forbedrer ting.
Du vil ikke kunne gjøre det perfekt, men du kan fortsette å justere til det kjører rettere.
OPPSETT AV RADIOEN
Sett opp radioen ved å legge til følgende linjer øverst i koden:
importere radio
radio.config (kanal = 7, gruppe = 0, kø = 1) radio.on ()
Dette vil tillate roboten din å motta instruksjoner fra en annen mikro: bit, men for øyeblikket vil den motta instruksjoner fra en hvilken som helst annen mikro: bit.
Dette er fordi kanal 7 og gruppe 0 er standardkanalene.
Endre disse tallene, velg en kanal mellom 0-82 og en gruppe mellom 0-255. Nå vil din micro: bit bare motta instruksjoner fra andre med samme konfigurasjonsinformasjon.
kø = 1 betyr at micro: bit bare beholder en innkommende melding om gangen - dette gir en litt raskere responstid enn standard, som er 3.
Nå må du redigere hovedløyfekoden til, i stedet for å kjøre instruksjoner når du trykker på en knapp, venter du på en innkommende radiomelding og svarer riktig.
Prøv følgende kode som en test (den vil ikke gjøre noe før du har satt opp joysticken i trinn 2):
mens det er sant:
melding = radio.receive () hvis melding == 'fremover': stasjon (500, 500)
Trinn 2: Joystick-oppsett
Koble fra robotens micro: bit, og koble til joystickens micro: bit i stedet
Få en kopi av joystick-konfigurasjonskoden her:
Sett opp radioen med samme konfigurasjon (kanal og gruppenummer) som du gjorde for roboten - dette gjør at de to kan kommunisere med hverandre.
På slutten av programmet, start hovedløkken:
mens det er sant:
if button_a.was_pressed (): radio.send ('forward')
Denne koden bruker ikke styrespaken: bit ennå. Den bruker knapp A på micro: bit for å sende en melding.
Sørg for at både roboten og kontrolleren micro: bits har strøm, og trykk deretter på knappen for å sende meldingen.
Hvis meldingen er vellykket mottatt, og roboten din beveger seg … godt gjort! Du er ferdig med installasjonsinstruksjonene.
FEILSØKINGSTIPS
Hvis du får en feilmelding på kontrolleren micro: bit … feilsøk kontrollerkoden
Hvis du får en feilmelding på robotmikro: bit … ble radiomeldingen sendt! Men roboten kan ikke forstå det, så sjekk at meldingen du sendte, og meldingen du fortalte roboten om å lytte etter kamp.
Hvis ingenting skjer i det hele tatt
- Sørg for at du har blinket den riktige koden til hver mikro: bit - det er lett ved et uhell å blinke feil!
- Sørg for at kanal- og gruppetallene stemmer overens på hver mikro: bit
Trinn 3: Kontrollere joystick -verdiene
De neste trinnene bruker alle kontrollerkoden
Før du kan bruke styrespaken på kontrolleren, må du vite hva slags verdier du får når du trykker på pinnen.
Erstatt hovedsløyfen med følgende kode:
mens det er sant:
joystick = joystick_push () print (joystick) sleep (500)
Flash denne koden til din micro: bit, og klikk deretter på REPL -knappen på Mu's verktøylinje. Dette åpner en terminal nederst i redaktøren, som gir deg en sanntids kobling til micro: bit.
Dette vil ikke fungere med mindre micro: bit er plugget inn
Mens REPL er åpen, trykker du på tilbakestillingsknappen på baksiden av micro: bit.
Du bør se noen verdier bringe "trykt" til skjermen:
Skyv pinnen på joysticken og se hva som skjer med tallene.
Noter verdiene som er gitt når styrespaken er i midtposisjon - i mitt tilfelle (518, 523).
Klikk på REPL -knappen på Mu's verktøylinje igjen for å lukke den - du vil ikke kunne blinke ny kode til micro: bit mens den er åpen.
Trinn 4: Justering av X- og Y -variablene
Du vil endre verdiene gitt av joystick -funksjonen, slik at:
- i midten er det null
- opp er positivt
- ned er negativ.
Dette samsvarer med instruksjonene roboten trenger - et positivt tall for å kjøre fremover, og et negativt tall for å kjøre bakover.
Se på tallene du fikk i det siste trinnet. Det første tallet er x, og det andre tallet er y.
Rediger joystick_push () definisjonen som allerede er i programmet, til minus verdiene dine fra originalen:
def joystick_push ():
x = pin0.read_analog () - 518 y = pin1.read_analog () - 523 return x, y
Bruk dine egne tall, de kan være forskjellige fra mine
Flash den nye koden, åpne REPL, trykk på micro: bits tilbakestillingsknapp og sjekk verdiene.
Får du (0, 0)?
Trinn 5: Konvertering av X og Y til verdier for venstre og høyre motor
For øyeblikket vil denne joysticken ikke være veldig nyttig å kjøre en robot med. Skyvet fremover hele veien, får du en verdi som (0, 500).
Hvis du ga disse tallene til roboten, ville den slå på høyre motor, men ikke den venstre, noe du ikke vil at skal skje!
Dette diagrammet viser hva som skjer med x- og y -verdiene når du beveger styrespaken, og hva vi vil at roboten skal gjøre når du beveger styrespaken.
Du må bruke noen matematikk for å blande x- og y -verdiene for å gi deg noe mer nyttig.
n
MATENE
La oss starte med å skyve joysticken helt frem.
Et eksempel på verdiene du kan få er:
x = 0
y = 500
For å være nyttig for roboten, vil du få verdier som disse:
venstre = 500
høyre = 500
La oss prøve å legge x og y på forskjellige måter for å se hvilke tall vi får:
x + y = 0 + 500 = 500
x - y = 0 - 500 = -500 y + x = 500 + 0 = 500 y - x = 500 - 0 = 500
La oss nå se hva som skjer hvis vi skyver joysticken helt til høyre.
Et eksempel på verdiene du kan få er:
x = 500
y = 0
For å få roboten til å svinge til høyre, vil du at venstre motor skal kjøre fremover, og at høyre motor skal kjøre bakover:
venstre = 500
høyre = -500
La oss prøve formelen vår igjen:
x + y = 500 + 0 = 500
x - y = 500 - 0 = 500 y + x = 0 + 500 = 500 y - x = 0 - 500 = -500
Sammenlign de to settene med formel for å finne ut hvilket alternativ som vil gi deg riktig venstre verdi, og hvilket alternativ som vil gi deg riktig riktig verdi.
Prøv det med noen av verdiene du får fra din egen joystick, for å sikre at formelen du velger fungerer hele tiden.
n
UTVIDE JOYSTICK -FUNKSJONEN
Utvid og rediger joystick -funksjonen for å lage to nye variabler for venstre og høyre, og for å returnere disse verdiene i stedet for x og y:
def joystick_push ():
x = pin0.read_analog () - 518 y = pin1.read_analog () - 523 venstre = høyre = retur venstre, høyre
Flash den nye koden, åpne REPL, trykk på micro: bits tilbakestillingsknapp og sjekk verdiene.
Får du verdiene du forventer?
Hvis du trenger mer hjelp, kan du sjekke eksempelkoden vår her:
Trinn 6: Sende verdiene som radiomeldinger
Nå har du noen verdier klare til å sende til roboten din.
Rediger hovedsløyfen slik at den sjekker verdiene til styrespaken, men i stedet for å skrive ut verdiene blir den klar til å sendes som en radiomelding.
mens det er sant:
joystick = joystick_push () melding = str (joystick [0]) + "" + str (joystick [1])
Dette vil faktisk ikke sende meldingen enda!
Hva skjer i denne nye kodelinjen?
- joystick [0] betyr den første informasjonen som kommer ut av joystick -funksjonen (til venstre)
- joystick [1] er den neste informasjonen (høyre)
- str () konverterer begge disse tallene til strengformat (tekst i stedet for tall) - dette er nødvendig for å kunne sende informasjonen over radioen.
Du vil være vant til å se + for å bety tillegg - det kan både legge tall sammen og sammenkoble strenger, noe som betyr at det vil holde de to informasjonsbitene sammen.
Eksempel:
150 + 100 = 250
str (150) + str (100) = 150100
Så sammenkoblingen vil holde dine venstre og høyre verdier sammen.
For å tvinge en separasjon mellom de to informasjonsbitene (slik at roboten vet at de er to informasjonsbiter), kobler du en ekstra streng mellom dem ved å bruke "". Talemerkene rundt mellomrommet betyr at det allerede er en streng.
Til slutt, utvid koden din for å sende denne nyopprettede meldingen over radioen:
radio.send (melding)
sove (10)
Søvnen senker sending av meldinger slik at mottakende mikro: bit ikke blir overbelastet med for mye informasjon!
Flash denne koden til kontrolleren micro: bit og feilsøk eventuelle feil før du går videre til neste trinn
Trinn 7: Motta meldingene på roboten din
Gå tilbake til robotkoden din fra begynnelsen - husk å koble fra kontrolleren micro: bit, slik at du ikke ved et uhell blinker robotkoden til den
Rull ned til hovedløkken - fjern testkoden og legg til denne i stedet:
mens det er sant:
melding = radio.receive () print (melding) sleep (100)
Dette angir en variabel som er lik den innkommende meldingen, og skriver ut meldingen til REPL - for å kontrollere at meldingene kommer som forventet.
Flash din nye kode, koblet til REPL, og skyv deretter styrespaken.
Du bør få noe slikt:
FEILSØKINGSTIPS
Hvis du får en feilmelding på kontrolleren micro: bit … feilsøk kontrollerkoden
Hvis du får en feilmelding på robotmikro: bit … ble radiomeldingen sendt! Men roboten kan ikke forstå det, så sjekk at meldingen du sendte, og meldingen du fortalte roboten om å lytte etter kamp.
Hvis ingenting skjer i det hele tatt
- Sørg for at du har blinket den riktige koden til hver mikro: bit - det er lett ved et uhell å blinke feil!
- Sørg for at kanal- og gruppetallene stemmer overens på hver mikro: bit
Trinn 8: Bruke innkommende meldinger til å kontrollere robotens motorer
Du får nå to numre som sendes over radioen som en streng.
Du må dele denne meldingen i to strenger, deretter konvertere strengene tilbake til tall igjen, og overføre dette til stasjonsfunksjonen. Mye skjer på en gang!
Før du gjør dette, må du kontrollere at meldingen du mottar er i riktig format.
Hvis ingen meldinger blir sendt, vil du i stedet motta "Ingen". Hvis du prøver å dele dette, får du en feilmelding.
mens det er sant:
melding = radio.receive () hvis meldingen ikke er Ingen: melding = melding.split () stasjon (int (melding [0]), int (melding [1]))
Hva skjer her?
- Den nye koden kjøres hvis meldingen er noe annet enn "Ingen".
- message.split () ser etter et mellomrom i meldingen (som vi la til i det siste trinnet), og bruker dette til å dele meldingen i to.
- int (melding [0]), int (melding [1]) gjør det motsatte av det vi gjorde i forrige trinn - får hver informasjon individuelt og konverterer den til et heltall (et helt tall).
- int (melding [0]) brukes som verdien for den venstre motoren i drivfunksjonen, og int (melding [1]) brukes som verdien for den høyre motoren.
Sjekk at det fungerer - snur motorene når du skyver joysticken?
Hvis ikke - tid for litt feilsøking!
Hvis ja, fantastisk! Du har en fungerende fjernkontrollrobot!
Bruk litt tid på å øve med roboten din før du går videre til neste trinn. Kjører den slik du forventer?
De neste trinnene viser deg hvordan du bruker knappene på styrespaken til å legge til ekstra funksjonalitet for roboten din
Hvis du vil se vår versjon av denne koden så langt:
- Robot:
- Kontroller:
Trinn 9: Bruke knappene - Motta flere meldinger
For øyeblikket vil koden prøve å dele meldinger som ikke er Ingen. Dette betyr at hvis den mottar for eksempel "hei", vil du få en feilmelding.
For å la din micro: bit tolke andre meldinger, må den sjekke hver forventede melding først og deretter dele meldingen bare hvis den ikke har fått beskjed om å gjøre noe annet med den.
Utvid koden din slik:
hvis meldingen ikke er Ingen:
hvis melding == 'hei': display.show (Image. HAPPY) elif melding == 'and': display.show (Image. DUCK) annet: melding = melding.split () stasjon (int (melding [0])), int (melding [1]))
For det første vil den sjekke om den har mottatt meldingen "hei". Hvis det har det, vil det vise et lykkelig bilde, så gå tilbake til toppen av løkken og se etter neste melding.
Hvis meldingen ikke er hei, vil den deretter sjekke om meldingen er 'and'.
Hvis meldingen ikke er enten 'hei' ELLER 'and, vil den gjøre det siste på listen, som deles meldingen og slår på motorene. Det vil ikke prøve å dele meldingen hvis den har mottatt "hei" eller "and", noe som betyr at du ikke får en feilmelding fra noen av disse to meldingene.
Dobbel likhetstegnet er viktig - det betyr 'er lik', sammenlignet med et enkelt likhetstegn, som setter noe (så melding = 'hei' betyr at vi setter variabelen til 'hei', melding == 'hei' betyr at vi spør om meldingen er lik 'hei').
Prøv det med bare to alternativer for nå, for å teste det - du kan legge til så mange andre meldinger du vil senere.
Lenke til arbeidskode:
Trinn 10: Sende flere meldinger ved hjelp av kontrollerknappene
Koble fra robotens micro: bit, og koble til joystickens micro: bit i stedet
Gå tilbake til kontrollerkoden for å redigere.
I likhet med robotkoden, vil vi at kontrolleren skal sjekke om du prøver å sende andre meldinger før du sender styrespakverdiene.
På toppen av løkken vil vi fortsatt at den skal kontrollere de nåværende verdiene til joysticken, men vi vil også at den skal kontrollere om en knapp trykkes for øyeblikket:
mens det er sant:
joystick = joystick_push () -knapp = button_press ()
button_press () returnerer verdien A, B, C, D, E eller F avhengig av hvilken knapp som trykkes for øyeblikket (hvis ingenting trykkes, returnerer den None).
Nå kan vi komme med en if-elif-else-setning, slik vi gjorde for robotkoden-ved hjelp av to knapper, og sende styrespakverdien hvis ingen knapp trykkes.
hvis knappen == 'A':
radio.send ('hallo') sleep (500) elif -knapp == 'B': radio.send ('and') sleep (500) else: melding = str (joystick [0]) + "" + str (joystick [1]) radio.send (melding) søvn (10)
Når du trykker på en knapp, sender du en av meldingene du fortalte roboten å se etter i forrige trinn.
Meldingen blir sendt når du trykker på knappen, og datamaskiner er mye raskere enn mennesker! Så det kan sende meldingen mange ganger før du har klart å ta fingeren av knappen.
Søvnen etter å ha sendt meldingen bremser den, slik at den ikke vil sjekke knappen så raskt igjen - prøv noen få tall her for å få den perfekte tiden for deg - for sakte, og den reagerer heller ikke raskt og roboten din vil motta så mange knappemeldinger at den kan slutte å svare på styrespaken!
Virker det?
Hvis du får feilmeldinger, tenk nøye etter hva du nettopp har endret, og hva som skjer.
Hvis du får en feil på roboten når du trykker på en knapp på kontrolleren din - vet du at meldingen kommer frem, men det forvirrer roboten. Kontroller at meldingen du har sendt, og meldingen du har bedt roboten om å se etter er den samme.
Lenke til arbeidskode:
Trinn 11: Neste trinn
Du har nå kunnskapen du trenger for å jobbe med robotens motorer og med joystick: bit -kontrolleren
Bruk denne kunnskapen til å forbedre de to programmene og gjøre dem til dine egne. Noen ideer nedenfor!
Du har seks knapper på kontrolleren! Hva vil du at de skal gjøre?
- Hva med å programmere en danserutine for roboten din å gjøre på kommando? Skriv en algoritme for kommandoer for stasjon (), atskilt med søvn () -kommandoer!
- Vil du endre retningen roboten beveger seg i slik at den enkelt kan kjøre opp ned? Tenk på x- og y -verdiene til joysticken. Hva representerer de og hvordan kan du manipulere dem?
- Har roboten din (eller kan du legge til!) Ekstra funksjoner som lysdioder, en høyttaler eller sensorer?
Ideer for å forbedre koden
- Kan du hjelpe roboten din med å takle ukjente meldinger ved å bruke prøve/unntakskode?
- Matematikken som ble brukt til å beregne venstre og høyre verdier fra joysticken gir oss ikke hele verdiområdet (robotens stasjon kan godta et tall opptil 1023). Kan du redigere denne koden for å få et bedre område?
- Det finnes andre metoder for å blande styrespakverdiene - kan du finne en bedre måte å gjøre det på?
Anbefalt:
Micro: Bot - Micro: Bit: 20 trinn
Micro: Bot - Micro: Bit: Bygg deg en Micro: Bot! Det er en Micro: Bit kontrollert robot med innebygd ekkolodd for autonom kjøring, eller hvis du har to Micro: Bits, radiostyrt kjøring
Space Invaders i Micropython på Micro: bit: 5 trinn
Space Invaders in Micropython on Micro: bit: I våre tidligere artikler har vi utforsket spillfremstilling på GameGo, en bærbar retro spillkonsoll utviklet av TinkerGen education. Spillene vi lagde minner om gamle Nintendo -spill. I dagens artikkel skal vi ta et skritt tilbake, for å
Arduino Robot With PS2 Controller (PlayStation 2 Joystick): 10 Steps (with Pictures)
Arduino Robot With PS2 Controller (PlayStation 2 Joystick): I denne opplæringen vil jeg vise deg hvordan du bruker en trådløs Playstation 2 (PS2) joystick til å styre en robottank. Et Arduino Uno -brett ble brukt i kjernen av dette prosjektet. Den mottar kommandoer fra den trådløse kontrolleren og angir hastigheten til motorene
Hvordan lage en mobilstyrt robot - DTMF -basert - Uten mikrokontroller og programmering - Kontroll fra hvor som helst i verden - RoboGeeks: 15 trinn
Hvordan lage en mobilstyrt robot | DTMF -basert | Uten mikrokontroller og programmering | Kontroll fra hvor som helst i verden | RoboGeeks: Vil du lage en robot som kan kontrolleres fra hvor som helst i verden, la oss gjøre det
Lys- og fargemålinger Med Pimoroni Enviro: bit for Micro: bit: 5 trinn
Lys- og fargemålinger Med Pimoroni Enviro: bit for Micro: bit: Jeg hadde jobbet med noen enheter som tillater lys- og fargemålinger tidligere, og du kan finne mye om teorien bak slike målinger, instruktørene her og her. Pimoroni har nylig utgitt enviro: bit, et tillegg for m