Innehållsförteckning:
- Tillbehör
- Steg 1: Robotinställning
- Steg 2: Joystick-inställning
- Steg 3: Kontrollera joystickvärdena
- Steg 4: Justera X- och Y -variablerna
- Steg 5: Konvertera X och Y till värden för vänster och höger motor
- Steg 6: Skicka värdena som radiomeddelanden
- Steg 7: Ta emot meddelanden på din robot
- Steg 8: Använda inkommande meddelanden för att styra robotens motorer
- Steg 9: Använda knapparna - ta emot ytterligare meddelanden
- Steg 10: Skicka ytterligare meddelanden med hjälp av kontrollknapparna
- Steg 11: Nästa steg
Video: Programmering av en Micro: Bit Robot & Joystick: Bit Controller With MicroPython: 11 steg
2024 Författare: John Day | [email protected]. Senast ändrad: 2024-01-30 12:43
För Robocamp 2019, vårt sommarrobotläger, löd ungdomar i åldern 10-13 år, programmerar och bygger en BBC micro: bit-baserad 'antweight robot', samt programmerar en micro: bit som ska användas som fjärrkontroll.
Om du för närvarande är på Robocamp, hoppa till steg 3, eftersom vi har gjort de två första stegen som en grupp
Detta är en steg-för-steg-guide för att få en micro: bit robot att kommunicera med en joystick: bit controller.
Det tar inte den snabbaste vägen för att få allt att fungera, men försöker saker i små bitar så att du kan testa koden när du går, sätta din egen prägel på den och förstå varför vi gör de saker vi gör !
För denna aktivitet använder vi vår egen anpassade robot, men den fungerar med vilken robot som helst som använder en liknande motordrivrutin, till exempel en L9110.
Designfiler för vår robot hittar du här:
Den här guiden är skriven för nybörjare, men om du aldrig tidigare har använt en micro: bit med MicroPython rekommenderar vi att du försöker med ett enklare program först, till exempel vårt namnmärke Instructable: https://www.instructables.com/id/Felt -Microbit-Nam …
Tillbehör
2x BBC micro: bit
Robot som fungerar med en BBC micro: bit (se förklaring ovan)
joystick: bit controller (vi fick vår från Cool Components)
Steg 1: Robotinställning
Du har några alternativ för att skriva MicroPython -kod för din micro: bit:
- Mu, som du kan ladda ner och installera härifrån:
- Online -redigeraren, som du hittar här:
Dessa instruktioner förutsätter att du använder Mu
Öppna Mu och anslut din micro: bit till din dator. Mu bör inse att du använder en micro: bit och välj micro: bit 'Mode', men om det inte gör det, ändra det manuellt.
Få en kopia av robotmotortestkoden härifrån:
Om du inte är van vid Github kan det vara ointuitivt! Två enkla sätt att få den här koden är:
- Spara Raw -filen på din dator och ladda den sedan i Mu:
- Kopiera och klistra in all given kod i en ny fil i Mu.
Klicka nu på "Flash" -knappen från Mu's verktygsfält för att skicka din nya kod till micro: bit.
Detta fungerar inte om inte micro: bit är inkopplad
Det gula ljuset på baksidan av micro: bit börjar blinka. När den är klar har din kod överförts.
INSTÄLLNING AV MOTORANVISNINGARNA
Detta program startar motorerna i olika riktningar när du trycker på "A" -knappen på micro: bit.
Det du vill ska hända är:
- När "A" visas, vänster motor framåt
- När "B" visas, vänster motor bakåt
- När 'C' visas, höger motor framåt
- När 'D' visas, höger motor bakåt
Detta kommer förmodligen inte att vara fallet, eftersom det beror på hur du har kopplat upp din robot!
Högst upp i koden hittar du en lista med variabler som avgör vilken stift på micro: bit styr vilken motorriktning.
Om du använder en av våra robotar (filer), byt variabelnamn runt för att få roboten att gå i rätt riktning:
Om du använder en egen robot, kontrollera vilka stift motordrivrutinen är ansluten till innan du redigerar koden.
ATT TESTA ENHETEN
Kontrollera nu hur din robot kör genom att ersätta testkoden i huvudslingan med en egen kod.
Du säger till roboten att köra genom att ringa till drive () -funktionen. Detta kräver två argument - ett värde för den vänstra motorn och ett värde för de högra motorerna, mellan 0 (av) och 1023 (maxvarvtal).
Genom att ringa till exempel drivenhet (500, 500) säger du till båda motorerna att de ska slås på, i riktning framåt, med ungefär halv hastighet.
Prova några alternativ för att få en känsla för hur rak den körs och hur bra den blir.
Tips: Motortesterna var inne i både en stund True loop och en if -sats - motorerna skulle inte svänga förrän du tryckte på A -knappen på micro: bit, och det är för alltid att kontrollera om du har tryckt på A -knappen.
Tips: motorerna stängs inte av förrän du säger åt dem! De kommer alltid att fortsätta göra sin sista instruktion.
TILLVAL: FÖRBÄTTRA KÖRNING I EN RAK LINJE
Om din robot inte kör i en rak linje kan en av dina motorer svänga snabbare än den andra.
Efter att ha kontrollerat att det inte finns något som fysiskt hindrar hjulet från att vrida fritt, kan du redigera koden i drivfunktionen för att minska hastigheten på den snabbare motorn.
Bläddra upp för att hitta definitionen av drivfunktionen och titta på de två översta instruktionerna:
def -enhet (L, R):
# Nedan följer en justering för att korrigera för motorvarvtal L = int (L*1) R = int (R*1)
Dessa två rader tar för närvarande värdet på L och R, multiplicera dem med 1, se sedan till att de fortfarande är hela tal (int).
Till exempel, om din vänstra motor är snabbare, ändra *1 på linjen till *0,9 och se om det förbättrar saker.
Du kommer inte att kunna göra det perfekt, men du kan fortsätta justera tills det kör rakare.
INSTÄLLNING AV RADIO
Ställ nu in radion genom att lägga till följande rader högst upp i koden:
importera radio
radio.config (kanal = 7, grupp = 0, kö = 1) radio.on ()
Detta gör att din robot kan få instruktioner från en annan mikro: bit, men för närvarande kommer den att få instruktioner från alla andra mikro: bitar.
Detta beror på att kanal 7 och grupp 0 är standardkanaler.
Ändra dessa nummer, välj en kanal mellan 0-82 och en grupp mellan 0-255. Nu kommer din micro: bit bara att få instruktioner från andra med samma konfigurationsinformation.
kö = 1 betyder att micro: bit bara behåller ett inkommande meddelande i taget - detta ger en något snabbare svarstid än standard, vilket är 3.
Nu måste du redigera din huvudsakliga kod för att, i stället för att köra instruktioner när du trycker på en knapp, vänta på ett inkommande radiomeddelande och svara på lämpligt sätt.
Prova följande kod som ett test (det kommer inte att göra någonting förrän du har ställt in joysticken i steg 2):
medan det är sant:
meddelande = radio.receive () om meddelande == 'framåt': enhet (500, 500)
Steg 2: Joystick-inställning
Koppla ur robotens micro: bit och anslut istället joystickens micro: bit
Hämta en kopia av joystick-konfigurationskoden härifrån:
Ställ in radion med samma konfiguration (kanal och gruppnummer) som du gjorde för roboten - det gör att de två kan kommunicera med varandra.
I slutet av programmet, starta din huvudslinga:
medan det är sant:
if button_a.was_pressed (): radio.send ('forward')
Denna kod använder ännu inte joysticken: bit. Den använder knapp A på micro: bit för att skicka ett meddelande.
Se till att både din robot och din controller: micro: bitar har ström, tryck sedan på knappen för att skicka ditt meddelande.
Om meddelandet har tagits emot och din robot rör sig … bra gjort! Du är klar med installationsanvisningarna.
FELSÖKNINGSTIPS
Om du får ett felmeddelande på din controller micro: bit … felsök din kontrollkod
Om du får ett felmeddelande på din robotmikro: bit … skickades ditt radiomeddelande! Men roboten kan inte förstå det, så kontrollera att meddelandet du skickade och meddelandet du sa till roboten att lyssna efter match.
Om ingenting alls händer
- Se till att du blinkade rätt kod till varje mikro: bit - det är lätt att av misstag blinka fel!
- Se till att dina kanal- och gruppnummer matchar på varje mikro: bit
Steg 3: Kontrollera joystickvärdena
De nästa stegen använder alla kontrollkoden
Innan du kan använda joysticken på din handkontroll måste du veta vilken typ av värden du får när du trycker på pinnen.
Ersätt din huvudslinga med följande kod:
medan det är sant:
joystick = joystick_push () print (joystick) sleep (500)
Flasha den här koden till din micro: bit och klicka sedan på REPL -knappen i Muss verktygsfält. Detta öppnar en terminal längst ner i redigeraren, vilket ger dig en realtidslänk till micro: bit.
Detta fungerar inte om inte micro: bit är inkopplad
Med REPL öppen, tryck på återställningsknappen på baksidan av din micro: bit.
Du bör se några värden som ger "tryckt" till din skärm:
Tryck på styrspaken och se vad som händer med siffrorna.
Anteckna värdena som ges när joysticken är i mittläge - i mitt fall (518, 523).
Klicka på REPL -knappen i Mu's verktygsfält igen för att stänga den - du kommer inte att kunna blinka ny kod till micro: bit medan den är öppen.
Steg 4: Justera X- och Y -variablerna
Du vill ändra värdena som ges av joystickfunktionen, så att:
- i mitten är det noll
- upp är positivt
- ned är negativ.
Detta matchar instruktioner som roboten behöver - ett positivt tal för att köra framåt och ett negativt tal för att köra bakåt.
Titta på siffrorna du fick i det sista steget. Det första talet är x och det andra är y.
Redigera joystick_push () -definitionen som redan finns i programmet, till minus dina värden från originalet:
def joystick_push ():
x = pin0.read_analog () - 518 y = pin1.read_analog () - 523 return x, y
Använd dina egna nummer, de kan skilja sig från mina
Flasha din nya kod, öppna REPL, tryck på micro: bitens återställningsknapp och kontrollera dina värden.
Får du (0, 0)?
Steg 5: Konvertera X och Y till värden för vänster och höger motor
För tillfället är den här joysticken inte särskilt användbar att köra en robot med. Genom att skjuta fram hela vägen får du ett värde som (0, 500).
Om du gav dessa nummer till roboten skulle den slå på den högra motorn men inte den vänstra, vilket inte är vad du vill ska hända!
Detta diagram visar vad som händer med x- och y -värdena när du flyttar joysticken och vad vi vill att roboten ska göra när du flyttar joysticken.
Du måste använda lite matematik för att blanda x- och y -värdena för att ge dig något mer användbart.
n
MATTERNA
Låt oss börja med att skjuta joysticken hela vägen fram.
Ett exempel på de värden du kan få är:
x = 0
y = 500
För att vara användbar för roboten vill du få värden som dessa:
vänster = 500
höger = 500
Låt oss försöka lägga till x och y på olika sätt för att se vilka siffror vi får:
x + y = 0 + 500 = 500
x - y = 0 - 500 = -500 y + x = 500 + 0 = 500 y - x = 500 - 0 = 500
Låt oss nu se vad som händer om vi trycker joysticken hela vägen till höger.
Ett exempel på de värden du kan få är:
x = 500
y = 0
För att låta roboten svänga åt höger vill du att den vänstra motorn ska köra framåt och den högra motorn för att köra bakåt:
vänster = 500
höger = -500
Låt oss testa vår formel igen:
x + y = 500 + 0 = 500
x - y = 500 - 0 = 500 y + x = 0 + 500 = 500 y - x = 0 - 500 = -500
Jämför de två uppsättningarna formel för att räkna ut vilket alternativ som ger dig rätt vänstervärde, och vilket alternativ ger dig rätt rätt värde.
Prova det med några av de värden du får från din egen joystick, för att se till att formeln du väljer fungerar hela tiden.
n
UTVIDNING AV JOYSTICK -FUNKTIONEN
Expandera och redigera joystickfunktionen för att skapa två nya variabler för vänster och höger, och för att returnera dessa värden istället för x och y:
def joystick_push ():
x = pin0.read_analog () - 518 y = pin1.read_analog () - 523 vänster = höger = retur vänster, höger
Flasha din nya kod, öppna REPL, tryck på micro: bitens återställningsknapp och kontrollera dina värden.
Får du de värden du förväntar dig?
Om du behöver mer hjälp, kolla in vår exempelkod här:
Steg 6: Skicka värdena som radiomeddelanden
Nu har du några värden redo att skicka till din robot.
Redigera din huvudslinga så att den kontrollerar joystickens värden, men i stället för att skriva ut värdena blir den redo att skickas som ett radiomeddelande.
medan det är sant:
joystick = joystick_push () meddelande = str (joystick [0]) + "" + str (joystick [1])
Detta kommer faktiskt inte att skicka meddelandet ännu!
Vad händer i denna nya kodrad?
- joystick [0] betyder den första informationen som kommer ut från joystickfunktionen (vänster)
- joystick [1] är nästa bit information (höger)
- str () konverterar båda dessa nummer till strängformat (text istället för siffror) - detta är nödvändigt för att kunna skicka informationen över radion.
Du kommer att vara van att se + för att betyda addition - det kan både lägga till siffror och sammanfoga strängar, vilket innebär att det kommer att hålla ihop de två bitarna av information.
Exempel:
150 + 100 = 250
str (150) + str (100) = 150100
Så sammanfogning kommer att hålla dina vänstra och högra värden ihop.
För att tvinga fram en separation mellan de två informationsbitarna (så att roboten vet att de är två bitar av information), sammanfoga en extra sträng mellan dem med hjälp av "". Talmarkeringarna runt utrymmet betyder att det redan är en sträng.
Slutligen, förläng din kod för att skicka detta nyskapade meddelande via radion:
radio.send (meddelande)
sova (10)
Sömnen bromsar sändningen av meddelanden så att den mottagande mikrobiten inte blir överbelastad med för mycket information!
Flasha den här koden till din controller micro: bit och felsök eventuella fel innan du går vidare till nästa steg
Steg 7: Ta emot meddelanden på din robot
Gå tillbaka till din robotkod från början - kom ihåg att koppla ur din controller micro: bit så att du inte av misstag blinkar robotkoden till den
Rulla ner till din huvudslinga - ta bort testkoden och lägg till denna istället:
medan det är sant:
meddelande = radio.receive () skriv ut (meddelande) viloläge (100)
Detta ställer in en variabel som är lika med det inkommande meddelandet och skriver ut meddelandet till REPL - för att kontrollera att meddelandena kommer fram som förväntat.
Flasha din nya kod, ansluten till REPL, tryck sedan på joysticken.
Du borde få något så här:
FELSÖKNINGSTIPS
Om du får ett felmeddelande på din controller micro: bit … debug din controller -kod
Om du får ett felmeddelande på din robotmikro: bit … skickades ditt radiomeddelande! Men roboten kan inte förstå det, så kontrollera att meddelandet du skickade och meddelandet du sa till roboten att lyssna efter match.
Om ingenting alls händer
- Se till att du blinkade rätt kod till varje mikro: bit - det är lätt att av misstag blinka fel!
- Se till att dina kanal- och gruppnummer matchar på varje mikro: bit
Steg 8: Använda inkommande meddelanden för att styra robotens motorer
Du får nu två nummer som skickas över radion som en sträng.
Du måste dela upp det här meddelandet i två strängar, sedan konvertera strängarna till siffror igen och överföra detta till enhetsfunktionen. Mycket händer på en gång!
Innan du gör detta måste du kontrollera att meddelandet du får är i rätt format.
Om inga meddelanden skickas får du istället "Inget". Om du försöker dela detta får du ett felmeddelande.
medan det är sant:
meddelande = radio.receive () om meddelandet inte är Inget: meddelande = meddelande.split () enhet (int (meddelande [0]), int (meddelande [1]))
Vad är det som händer här?
- Den nya koden körs om meddelandet är något annat än "Ingen".
- message.split () söker efter ett mellanslag i meddelandet (som vi lade till i det sista steget) och använder detta för att dela meddelandet i två.
- int (meddelande [0]), int (meddelande [1]) gör motsatsen till vad vi gjorde i föregående steg - får varje information individuellt och omvandlar den till ett heltal (ett helt tal).
- int (meddelande [0]) används som värdet för den vänstra motorn i drivfunktionen, och int (meddelande [1]) används som värdet för den högra motorn.
Kontrollera att det fungerar - vrider motorerna när du trycker på joysticken?
Om inte - dags för lite felsökning!
Om ja, fantastiskt! Du har en fungerande fjärrkontrollrobot!
Tillbringa lite tid att öva med din robot innan du går vidare till nästa steg. Kör den som du förväntar dig?
Nästa steg visar hur du använder knapparna på joysticken för att lägga till extra funktionalitet för din robot
Om du vill se vår version av denna kod hittills:
- Robot:
- Controller:
Steg 9: Använda knapparna - ta emot ytterligare meddelanden
För närvarande försöker din kod dela upp alla meddelanden som inte är Inga. Det betyder att om det får till exempel "hej", får du ett felmeddelande.
För att din micro: bit ska kunna tolka andra meddelanden måste den först kontrollera varje förväntat meddelande och sedan bara dela meddelandet om det inte har blivit tillsagt att göra något annat med det.
Utöka din kod så här:
om meddelandet inte är Inget:
if meddelande == 'hej': display.show (Image. HAPPY) elif message == 'duck': display.show (Image. DUCK) else: message = message.split () drive (int (meddelande [0])), int (meddelande [1]))
Först kontrollerar den om den har fått meddelandet "hej". Om det har det kommer det att visa en glad bild, sedan gå tillbaka till toppen av öglan och leta efter nästa meddelande.
Om meddelandet inte är hej kommer det nästa att kontrollera om meddelandet är "anka".
Om meddelandet inte är antingen "hej" ELLER "anka, kommer det att göra det sista på listan, som delas upp meddelandet och slår på motorerna. Det kommer inte att försöka dela meddelandet om det har fått "hej" eller "anka", vilket innebär att du inte får ett felmeddelande från något av dessa två meddelanden.
Dubbel likhetstecknet är viktigt - det betyder 'är lika med', jämfört med ett enda likhetstecken, som sätter något (så meddelande = 'hej' betyder att vi sätter variabeln till 'hej', meddelande == 'hej' betyder att vi frågar om meddelandet är lika med "hej").
Prova med bara två alternativ för att testa det - du kan lägga till så många andra meddelanden som du vill senare.
Länk till arbetskod:
Steg 10: Skicka ytterligare meddelanden med hjälp av kontrollknapparna
Koppla ur robotens micro: bit och anslut istället joystickens micro: bit
Gå tillbaka till din controller -kod för att redigera.
I likhet med robotkoden vill vi att regulatorn kontrollerar om du försöker skicka några andra meddelanden innan du skickar joystickvärdena.
Högst upp i öglan vill vi fortfarande att den ska kontrollera de nuvarande värdena för joysticken, men vi vill också att den ska kontrollera om en knapp trycks för närvarande:
medan det är sant:
joystick = joystick_push () -knapp = button_press ()
button_press () returnerar ett värde A, B, C, D, E eller F beroende på vilken knapp som trycks för närvarande (om inget trycks, returnerar det None).
Nu kan vi göra ett if-elif-else-uttalande, som vi gjorde för robotkoden-med två knappar och skicka joystickvärdet om ingen knapp trycks in.
if -knapp == 'A':
radio.send ('hej') sleep (500) elif -knapp == 'B': radio.send ('anka') sleep (500) else: meddelande = str (joystick [0]) + "" + str (joystick [1]) radio.send (meddelande) sömn (10)
När du trycker på en knapp, skicka ett av meddelandena som du sa till roboten att se upp för i föregående steg.
Meddelandet kommer att skickas när du trycker på knappen och datorer är mycket snabbare än människor! Så det kan skicka meddelandet många gånger innan du har lyckats ta bort fingret från knappen.
Sömnen efter att du skickat meddelandet saktar ner det, så att det inte kommer att kontrollera knappen igen så snabbt - prova några siffror här för att få den perfekta tiden för dig - för långsamt och det kommer inte att reagera också snabbt och din robot kommer att få så många knappmeddelanden att den kan sluta svara på joysticken!
Fungerar det?
Om du får felmeddelanden, tänk noga efter vad du just har ändrat och vad som händer.
Om du får ett fel på roboten när du trycker på en knapp på din handkontroll - vet du att meddelandet kommer fram, men det förvirrar roboten. Kontrollera att meddelandet du har skickat och meddelandet du har sagt till roboten att leta efter är detsamma.
Länk till arbetskod:
Steg 11: Nästa steg
Du har nu den kunskap du behöver för att arbeta med din robots motorer och med din joystick: bit controller
Använd denna kunskap för att förbättra de två programmen och göra dem till dina egna. Några idéer nedan!
Du har sex knappar på din handkontroll! Vad vill du att de ska göra?
- Vad sägs om att programmera en dansrutin för din robot att göra på kommando? Skriv en algoritm för drive () -kommandon, åtskilda av sleep () -kommandon!
- Vill du ändra riktningen som roboten rör sig i så att den enkelt kan köra upp och ner? Tänk på x- och y -värdena på din joystick. Vad representerar de och hur kan du manipulera dem?
- Har din robot (eller kan du lägga till!) Extrafunktioner som lysdioder, högtalare eller sensorer?
Idéer för att förbättra koden
- Kan du hjälpa din robot att hantera okända meddelanden genom att använda try/except -kod?
- Matematiken som används för att beräkna vänster och höger värden från joysticken ger oss inte hela värdena (robotens enhet kan acceptera ett tal upp till 1023). Kan du redigera den här koden för att få ett bättre intervall?
- Det finns andra metoder för att blanda joystickvärdena - kan du komma på ett bättre sätt att göra det?
Rekommenderad:
Micro: Bot - Micro: Bit: 20 steg
Micro: Bot - Micro: Bit: Bygg dig en Micro: Bot! Det är en Micro: Bit -styrd robot med inbyggt ekolod för autonom körning, eller om du har två Micro: Bits, radiostyrd körning
Space Invaders i Micropython på Micro: bit: 5 steg
Space Invaders i Micropython på Micro: bit: I våra tidigare artiklar har vi undersökt speltillverkning på GameGo, en bärbar retro spelkonsol utvecklad av TinkerGen education. Spelen som vi gjorde påminde om gamla Nintendo -spel. I dagens artikel kommer vi att ta ett steg tillbaka, för att
Micro: bit - Micro Drum Machine: 10 steg (med bilder)
Micro: bit - Micro Drum Machine: Det här är en micro: bit mikrotrummaskin, som istället för att bara generera ljudet, trummar faktiskt. Det är tungt inspirerat av kaninerna från micro: bit orkestern. Det tog lite tid att hitta några solenoider som var enkla att använda med mocro: bit,
Arduino Robot With PS2 Controller (PlayStation 2 Joystick): 10 Steg (med bilder)
Arduino Robot With PS2 Controller (PlayStation 2 Joystick): I den här självstudien visar jag dig hur du använder en trådlös Playstation 2 (PS2) joystick för att styra en robot tank. En Arduino Uno -bräda användes i kärnan i detta projekt. Den tar emot kommandon från den trådlösa handkontrollen och ställer in motorernas hastighet
Hur man gör en mobilstyrd robot - DTMF -baserad - Utan mikrokontroller och programmering - Kontroll överallt i världen - RoboGeeks: 15 steg
Hur man gör en mobilstyrd robot | DTMF -baserad | Utan mikrokontroller och programmering | Kontroll överallt i världen | RoboGeeks: Vill du göra en robot som kan styras var som helst i världen, låt oss göra det