Innehållsförteckning:

Programmering av en Micro: Bit Robot & Joystick: Bit Controller With MicroPython: 11 steg
Programmering av en Micro: Bit Robot & Joystick: Bit Controller With MicroPython: 11 steg

Video: Programmering av en Micro: Bit Robot & Joystick: Bit Controller With MicroPython: 11 steg

Video: Programmering av en Micro: Bit Robot & Joystick: Bit Controller With MicroPython: 11 steg
Video: Arduino project 😎^ Arduino #arduino #2022 #2021 #2023 #dc #arduinoproject #diy #foryou 2024, November
Anonim
Programmering av en Micro: Bit Robot & Joystick: Bit Controller Med MicroPython
Programmering av en Micro: Bit Robot & Joystick: Bit Controller Med MicroPython

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.

välj läge
välj läge

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:

  1. Spara Raw -filen på din dator och ladda den sedan i Mu:
  2. Kopiera och klistra in all given kod i en ny fil i Mu.
spara råfil
spara råfil

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:

byt stiftvariabler
byt stiftvariabler

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.

öppna REPL
öppna REPL

Detta fungerar inte om inte micro: bit är inkopplad

Med REPL öppen, tryck på återställningsknappen på baksidan av din micro: bit.

Bild
Bild

Du bör se några värden som ger "tryckt" till din skärm:

värden i terminalen
värden i terminalen

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.

diagram
diagram

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:

REPL -värden
REPL -värden

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: