INHOUDSOPGAWE:

N Micro: Bit Robot en Joystick: Bit Controller met MicroPython programmeer: 11 stappe
N Micro: Bit Robot en Joystick: Bit Controller met MicroPython programmeer: 11 stappe

Video: N Micro: Bit Robot en Joystick: Bit Controller met MicroPython programmeer: 11 stappe

Video: N Micro: Bit Robot en Joystick: Bit Controller met MicroPython programmeer: 11 stappe
Video: Flappy Bird ending 2024, November
Anonim
'N Micro: Bit Robot en Joystick: Bit Controller met MicroPython programmeer
'N Micro: Bit Robot en Joystick: Bit Controller met MicroPython programmeer

Vir Robocamp 2019, ons somer-robotika-kamp, soldeer jongmense van 10-13 jaar 'n BBC micro: bit gebaseerde 'antweight robot', en programmeer hulle 'n micro: bit om as afstandsbediening te gebruik.

As u tans by Robocamp is, gaan na stap 3, aangesien ons die eerste twee stappe as 'n groep gedoen het

Dit is 'n stap-vir-stap gids vir die kommunikasie van 'n mikro: bis-robot met 'n joystick: bit-beheerder.

Dit neem nie die vinnigste manier om alles aan die gang te kry nie, maar probeer dinge in klein stukkies sodat u die kode kan toets terwyl u gaan, u eie stempel daarop plaas en verstaan waarom ons die dinge doen wat ons doen !

Vir hierdie aktiwiteit gebruik ons ons eie aangepaste robot, maar dit werk met enige robot wat 'n soortgelyke motorbestuurder gebruik, soos 'n L9110.

Ontwerplêers vir ons robot kan hier gevind word:

Hierdie gids is vir beginners geskryf, maar as u nog nooit 'n micro: bit met MicroPython gebruik het nie, beveel ons aan dat u eers 'n eenvoudiger program probeer, soos ons naamplaatjie Instructable: https://www.instructables.com/id/Felt -Microbit-Nam …

Voorrade

2x BBC -mikro: bietjie

Robot wat werk met 'n BBC micro: bit (sien verduideliking hierbo)

joystick: bit controller (ons het ons van Cool Components gekry)

Stap 1: Opstel van die robot

U het 'n paar opsies om MicroPython -kode vir u micro: bit te skryf:

  • Mu, wat u hier kan aflaai en installeer:
  • Die aanlynredakteur wat u hier kan vind:

Hierdie instruksies neem aan dat u Mu

Maak Mu oop en koppel u micro: bit aan op u rekenaar. Mu moet besef dat u 'n micro: bit gebruik en 'Mode' van micro: bit kies, maar as dit nie die geval is nie, verander dit dan met die hand.

kies modus
kies modus

Kry hier 'n afskrif van die robotmotortoetskode:

As u nie gewoond is aan Github nie, kan dit nie intuïtief wees nie! Twee maklike maniere om hierdie kode te kry, is:

  1. Stoor die rou lêer op u rekenaar en laai dit dan in Mu:
  2. Kopieer en plak al die gegewe kode in 'n nuwe lêer in Mu.
stoor rou lêer
stoor rou lêer

Klik nou op die 'Flash' -knoppie in die werkbalk van Mu om u nuwe kode na die micro: bit te stuur.

Dit sal nie werk tensy die micro: bit ingeprop is nie

Die geel lig aan die agterkant van die micro: bit begin flits. As dit klaar is, is u kode oorgedra.

INSTELLING VAN DIE MOTORRIGTINGS

Hierdie program sal die motors in verskillende rigtings aanskakel as u op die 'A' -knoppie op die micro: bit druk.

Wat jy wil gebeur, is:

  • As 'A' vertoon word, laat die motor vorentoe
  • As 'B' vertoon word, laat die motor agteruit
  • As 'C' vertoon word, draai die regtermotor vorentoe
  • As 'D' vertoon word, regter motor agteruit

Dit sal waarskynlik nie die geval wees nie, want dit hang af van hoe u u robot gekoppel het!

Bo -aan die kode vind u 'n lys met veranderlikes wat bepaal watter pen op die mikro: bis beheer watter motorrigting.

As u een van ons robotte (lêers) gebruik, ruil die veranderlike name om sodat die robot in die regte rigtings kan beweeg:

ruil pen veranderlikes
ruil pen veranderlikes

As u 'n eie robot gebruik, moet u kyk na watter penne die motorbestuurder gekoppel is voordat u die kode wysig.

TOETS VAN DIE RYF

Kyk nou hoe u robot werk deur die toetskode in die hooflus te vervang deur 'n eie kode.

U vertel die robot om te ry deur die drive () -funksie te bel. Dit neem twee argumente - 'n waarde vir die linkermotor en 'n waarde vir die regtermotors, tussen 0 (af) en 1023 (maksimum spoed).

Deur byvoorbeeld aandrywing (500, 500) te bel, vertel u albei motors om teen ongeveer halfsnelheid in die voorwaartse rigting aan te skakel.

Probeer 'n paar opsies om 'n idee te kry van hoe reguit dit ry en hoe goed dit draai.

Wenk: die motortoetse was binne 'n rukkie True lus, sowel as in 'n if -verklaring - die motors sou nie draai totdat u op die A -knoppie op die micro: bit gedruk het nie, en dit word vir ewig nagegaan of u op die A -knoppie gedruk het.

Wenk: die motors sal nie afskakel voordat u dit beveel nie! Hulle sal altyd aanhou om hul laaste opdrag te doen.

OPSIONEEL: VERBETERING VAN RY IN 'N REGTE LYN

As u robot nie in 'n reguit lyn ry nie, draai een van u motors moontlik vinniger as die ander.

Nadat u gekontroleer het dat niks fisies die wiel keer om vrylik te draai nie, kan u die kode in die dryffunksie wysig om die snelheid van die vinniger motor te verminder.

Blaai omhoog om die definisie van die dryffunksie te vind, en kyk na die twee boonste instruksies:

def drive (L, R):

# Hieronder is 'n verstelling om te korrigeer vir teenstrydigheid in motorsnelheid L = int (L*1) R = int (R*1)

Hierdie twee reëls neem tans die waarde van L en R, vermenigvuldig dit met 1, en maak dan seker dat dit steeds heelgetalle (int) is.

As u linkermotor byvoorbeeld vinniger is, verander die *1 op sy lyn na *0,9 en kyk of dit dinge verbeter.

U kan dit nie perfek maak nie, maar u kan aanpas totdat dit reguit ry.

OPSTEL VAN DIE RADIO

Stel nou die radio op deur die volgende reëls bo -aan u kode te voeg:

radio invoer

radio.config (kanaal = 7, groep = 0, tou = 1) radio.on ()

Dit sal u robot in staat stel om instruksies van 'n ander micro: bit te ontvang, maar op die oomblik sal dit instruksies van enige ander micro: bit ontvang.

Dit is omdat kanaal 7 en groep 0 die standaardkanale is.

Verander hierdie getalle deur 'n kanaal tussen 0-82 en 'n groep tussen 0-255 te kies. Nou ontvang u micro: bit slegs instruksies van ander met dieselfde konfigurasie -inligting.

queue = 1 beteken dat die micro: bit slegs een inkomende boodskap op 'n slag sal behou - dit gee 'n effens vinniger reaksietyd as die standaard, wat 3 is.

Nou moet u u hoofluskode wysig om in plaas van instruksies uit te voer as u op 'n knoppie druk, wag vir 'n inkomende radioboodskap en reageer gepas.

Probeer die volgende kode as 'n toets (dit sal niks doen voordat u die joystick in stap 2 opgestel het nie):

terwyl dit waar is:

message = radio.receive () if message == 'forward': drive (500, 500)

Stap 2: Opstel van joystick

Ontkoppel die robot: micro: bit, en koppel in plaas daarvan die joystick se micro: bit

Kry hier 'n afskrif van die opstelkode van die joystick:

Stel die radio op met dieselfde konfigurasie (kanaal en groepnommer) as wat u vir die robot gedoen het - dit laat die twee toe om met mekaar te kommunikeer.

Aan die einde van die program, begin u hooflus:

terwyl dit waar is:

as button_a.was_pressed (): radio.send ('vorentoe')

Hierdie kode gebruik nog nie die joystick: bit. Dit gebruik knoppie A op die micro: bit om 'n boodskap te stuur.

Maak seker dat beide u robot en u controller: micro: bits krag het, en druk dan op die knoppie om u boodskap te stuur.

As die boodskap suksesvol ontvang is en u robot beweeg … welgedaan! U is klaar met die opstelinstruksies.

PROBLEEMOPLOSSINGWENKE

As u 'n foutboodskap op u kontroleerder micro: bit kry … ontfout u beheerderkode

As u 'n foutboodskap op u robotmicro: bit kry … is u radioboodskap suksesvol gestuur! Maar die robot kan dit nie verstaan nie, dus kyk of die boodskap wat u gestuur het en die boodskap wat u aan die robot gesê het, moet luister.

As daar niks gebeur nie

  • Maak seker dat u die korrekte kode vir elke mikro: bis geflits het - dit is maklik om per ongeluk die verkeerde een te flits!
  • Maak seker dat u kanaal- en groepnommers by elke micro: bit pas

Stap 3: Kontroleer die joystickwaardes

Die volgende paar stappe gebruik almal die beheerderkode

Voordat u die joystick op u kontroleerder kan gebruik, moet u weet watter waardes u kry as u die stokkie druk.

Vervang u hooflus met die volgende kode:

terwyl dit waar is:

joystick = joystick_push () druk (joystick) slaap (500)

Flits hierdie kode na u micro: bit en klik dan op die REPL -knoppie in die werkbalk van Mu. Dit sal 'n terminale onderaan die redakteur oopmaak, wat u 'n intydse skakel na die micro: bit gee.

maak die REPL oop
maak die REPL oop

Dit sal nie werk tensy die micro: bit ingeprop is nie

Terwyl die REPL oop is, druk die reset -knoppie agter op u micro: bit.

Beeld
Beeld

U moet sien dat 'n paar waardes op u skerm 'gedruk' word:

waardes in terminale
waardes in terminale

Druk die stok van die joystick en kyk wat met die getalle gebeur.

Let op die waardes wat gegee word wanneer die joystick in die middelste posisie is - in my geval (518, 523).

Klik weer op die REPL -knoppie op die werkbalk van Mu om dit toe te maak - u kan nie nuwe kode na die micro: bit flits terwyl dit oop is nie.

Stap 4: Pas die X- en Y -veranderlikes aan

U wil die waardes wat deur die joystick -funksie gegee word, verander sodat:

  • in die middel is dit nul
  • op is positief
  • af is negatief.

Dit pas by die instruksies wat die robot nodig het - 'n positiewe getal om vorentoe te ry en 'n negatiewe getal om agteruit te ry.

Kyk na die getalle wat u in die laaste stap gekry het. Die eerste getal is x, en die tweede getal is y.

Wysig die definisie van joystick_push () wat reeds in die program is, tot minus u waardes van die oorspronklike:

def joystick_push ():

x = pin0.read_analog () - 518 y = pin1.read_analog () - 523 opgawe x, y

Gebruik u eie nommers; dit kan anders wees as myne

Flits jou nuwe kode, maak die REPL oop, druk die resetknoppie van micro: bit en kyk na jou waardes.

Kry jy (0, 0)?

Stap 5: Omskakeling van X en Y in waardes vir die linker- en regtermotors

Op die oomblik is hierdie joystick nie baie handig om 'n robot mee te bestuur nie. As u vorentoe beweeg, kry u 'n waarde soos (0, 500).

As u hierdie nommers aan die robot gee, sal dit die regte motor aanskakel, maar nie die linker nie; dit is nie wat u wil hê nie!

Hierdie diagram toon wat met die x- en y -waardes gebeur wanneer u die joystick beweeg, en wat ons wil hê die robot moet doen wanneer u die joystick beweeg.

diagram
diagram

U moet 'n paar wiskunde gebruik om die x- en y -waardes te meng, om u iets nuttiger te gee.

n

DIE WISKUNDE

Kom ons begin deur die joystick heeltemal vorentoe te druk.

'N Voorbeeld van die waardes wat u kan kry, is:

x = 0

y = 500

Om nuttig te wees vir die robot, wil u waardes soos hierdie kry:

links = 500

regs = 500

Kom ons probeer om x en y op verskillende maniere by te voeg om te sien watter getalle ons kry:

x + y = 0 + 500 = 500

x - y = 0 - 500 = -500 y + x = 500 + 0 = 500 y - x = 500 - 0 = 500

Kom ons kyk wat gebeur as ons die joystick regs druk.

'N Voorbeeld van die waardes wat u kan kry, is:

x = 500

y = 0

Om die robot regs te laat draai, wil u hê dat die linkermotor vorentoe moet ry, en dat die regtermotor agteruit moet ry:

links = 500

regs = -500

Kom ons probeer weer ons formule:

x + y = 500 + 0 = 500

x - y = 500 - 0 = 500 y + x = 0 + 500 = 500 y - x = 0 - 500 = -500

Vergelyk die twee stelle formule om uit te vind watter opsie u die korrekte linkerwaarde sal gee, en watter opsie u die korrekte regte waarde sal gee.

Probeer dit met 'n paar van die waardes wat u uit u eie joystick kry, om seker te maak dat die formule wat u kies, altyd werk.

n

UITBREIDING VAN DIE JOYSTICK -FUNKSIE

Brei uit en wysig die joystick -funksie om twee nuwe veranderlikes vir links en regs te maak en om die waardes terug te gee in plaas van x en y:

def joystick_push ():

x = pin0.read_analog () - 518 y = pin1.read_analog () - 523 links = regs = terugkeer links, regs

Flits jou nuwe kode, maak die REPL oop, druk die resetknoppie van micro: bit en kyk na jou waardes.

Kry u die waardes wat u verwag?

As u meer hulp nodig het, kyk dan na ons voorbeeldkode hier:

Stap 6: Stuur die waardes as radioboodskappe

Nou het u 'n paar waardes gereed om na u robot te stuur.

Wysig u hooflus sodat dit die waardes van die joystick kontroleer, maar in plaas daarvan om die waardes af te druk, kan u dit as 'n radioboodskap stuur.

terwyl dit waar is:

joystick = joystick_push () boodskap = str (joystick [0]) + "" + str (joystick [1])

Dit stuur eintlik nog nie die boodskap nie!

Wat gebeur in hierdie nuwe reël kode?

  • joystick [0] beteken die eerste bietjie inligting wat uit die joystick -funksie kom (links)
  • joystick [1] is die volgende stukkie inligting (regs)
  • str () skakel albei hierdie getalle om in stringformaat (teks in plaas van getalle) - dit is nodig om die inligting oor die radio te kan stuur.

U sal gewoond wees om + te sien om byvoeging te beteken - dit kan getalle bymekaar voeg en snare saambind, wat beteken dat dit die twee stukkies inligting bymekaar sal hou.

Voorbeeld:

150 + 100 = 250

str (150) + str (100) = 150100

Saamvoeging sal u linker- en regterwaardes bymekaar hou.

Om 'n skeiding tussen die twee stukkies inligting af te dwing (sodat die robot weet dat dit twee stukkies inligting is), verbind 'n ekstra string tussen hulle met behulp van "". Die spraakmerke rondom die ruimte beteken dat dit reeds 'n string is.

Laastens, brei u kode uit om hierdie nuutgeskepte boodskap oor die radio te stuur:

radio.send (boodskap)

slaap (10)

Die slaap vertraag die stuur van boodskappe sodat die ontvangende mikro: bietjie nie te veel inligting oorlaai nie!

Flits hierdie kode na u kontroleerder micro: bit en ontfout enige foute voordat u na die volgende stap gaan

Stap 7: Ontvang die boodskappe op u robot

Gaan van die begin af terug na u robotkode - onthou dat u die controller: micro: bit ontkoppel, sodat u nie per ongeluk die robotkode daaraan laat flits nie

Rol af na u hooflus - verwyder die toetskode en voeg dit in plaas daarvan:

terwyl dit waar is:

boodskap = radio.ontvang () druk (boodskap) slaap (100)

Dit stel 'n veranderlike gelyk aan die inkomende boodskap, en druk die boodskap af na die REPL - om te kyk of die boodskappe na vore kom soos verwag.

Flits u nuwe kode, gekoppel aan die REPL, en druk dan die joystick.

U behoort so iets te kry:

REPL waardes
REPL waardes

PROBLEEMOPLOSSINGWENKE

As u 'n foutboodskap op u kontroleerder micro: bit kry … ontfout u beheerderkode

As u 'n foutboodskap op u robotmicro: bit kry … is u radioboodskap suksesvol gestuur! Maar die robot kan dit nie verstaan nie, dus kyk of die boodskap wat u gestuur het en die boodskap wat u aan die robot gesê het, moet luister.

As daar niks gebeur nie

  • Maak seker dat u die korrekte kode vir elke mikro: bis geflits het - dit is maklik om per ongeluk die verkeerde een te flits!
  • Maak seker dat u kanaal- en groepnommers by elke micro: bit pas

Stap 8: Gebruik die inkomende boodskappe om die robot se motors te beheer

U kry nou twee nommers as 'n string oor die radio.

U moet hierdie boodskap in twee stringe verdeel, dan die snare weer in getalle omskakel en dit in die dryffunksie deurgee. Baie aan die gang op 'n slag!

Voordat u dit doen, moet u seker maak dat die boodskap wat u ontvang, in die regte formaat is.

As geen boodskappe gestuur word nie, sal u in plaas daarvan 'Geen' ontvang. As u dit probeer verdeel, kry u 'n foutboodskap.

terwyl dit waar is:

message = radio.receive () as boodskap nie None is nie: message = message.split () drive (int (boodskap [0]), int (boodskap [1]))

Wat gebeur hier?

  • Die nuwe kode sal loop as die boodskap iets anders is as 'Geen'.
  • message.split () kyk of daar 'n spasie in die boodskap is (wat ons in die laaste stap bygevoeg het) en gebruik dit om die boodskap in twee te verdeel.
  • int (boodskap [0]), int (boodskap [1]) doen die teenoorgestelde van wat ons in die vorige stap gedoen het - kry elke stukkie inligting afsonderlik en omskep dit in 'n heelgetal ('n heelgetal).
  • int (boodskap [0]) word gebruik as die waarde vir die linkermotor in die dryffunksie, en int (boodskap [1]) word gebruik as die waarde vir die regtermotor.

Kyk of dit werk - draai die motors as u die joystick druk?

Indien nie - tyd vir 'n bietjie ontfouting!

Indien wel, fantasties! U het 'n werkende afstandsbedieningsrobot!

Spandeer tyd om met u robot te oefen voordat u na die volgende stap gaan. Ry dit soos u verwag?

Die volgende stappe sal u wys hoe u die knoppies op die joystick kan gebruik om ekstra funksies by u robot te voeg

As u ons weergawe van hierdie kode tot dusver wil sien:

  • Robot:
  • Beheerder:

Stap 9: Die gebruik van die knoppies - ontvangs van ekstra boodskappe

Op die oomblik sal u kode probeer om 'n boodskap wat geen is nie, te verdeel. Dit beteken dat as u byvoorbeeld 'hallo' ontvang, u 'n foutboodskap kry.

Om u micro: bit ander boodskappe te laat interpreteer, moet u eers elke verwagte boodskap nagaan en die boodskap dan slegs verdeel as dit nie aangesê is om iets anders daarmee te doen nie.

Brei u kode so uit:

as die boodskap nie Geen is nie:

if message == 'hallo': display.show (Image. HAPPY) elif message == 'eend': display.show (Image. DUCK) anders: message = message.split () drive (int (boodskap [0])), int (boodskap [1]))

Eerstens sal dit kyk of dit die boodskap 'hallo' ontvang het. As dit die geval is, sal dit 'n gelukkige beeld vertoon, en dan terug na die bokant van die lus gaan en kyk vir die volgende boodskap.

As die boodskap nie hallo is nie, sal dit dan kyk of die boodskap 'eend' is.

As die boodskap nie 'hallo' of 'eend' is nie, doen dit die laaste ding op die lys, wat die boodskap verdeel en die motors aanskakel. Dit sal nie probeer om die boodskap te verdeel as dit 'hallo' of 'eend' ontvang het nie, wat beteken dat u nie 'n foutboodskap van een van hierdie twee boodskappe sal ontvang nie.

Die dubbele gelykteken is belangrik - dit beteken 'is gelyk aan', in vergelyking met 'n enkele gelykteken, wat iets stel (dus boodskap = 'hallo' beteken dat ons die veranderlike op 'hallo' stel, boodskap == 'hallo' beteken dat ons vra of die boodskap gelyk is aan 'hallo').

Probeer dit nou met slegs twee opsies om dit te toets - u kan later soveel ander boodskappe byvoeg as wat u wil.

Skakel na werkkode:

Stap 10: Stuur ekstra boodskappe met die knoppies van die beheerder

Ontkoppel die robot: micro: bit, en koppel in plaas daarvan die joystick se micro: bit

Gaan terug na u beheerderkode om te wysig.

Net soos die robotkode, wil ons hê dat die beheerder moet kontroleer of u ander boodskappe wil stuur voordat hy die joystick -waardes stuur.

Bo -aan die lus wil ons nog steeds hê dat die huidige waardes van die joystick nagegaan moet word, maar ons wil ook hê dat dit moet kontroleer of 'n knoppie tans ingedruk word:

terwyl dit waar is:

joystick = joystick_push () -knoppie = button_press ()

button_press () gee 'n waarde A, B, C, D, E of F terug, afhangende van watter knoppie tans ingedruk word (as niks ingedruk word nie, gee dit None terug).

Nou kan ons 'n if-elif-else-verklaring aflê, soos ons vir die robotkode gedoen het-met behulp van twee knoppies en die joystickwaarde stuur as daar nie op 'n knoppie gedruk word nie.

as knoppie == 'A':

radio.send ('hallo') slaap (500) elif -knoppie == 'B': radio.send ('eend') slaap (500) anders: boodskap = str (joystick [0]) + "" + str (joystick [1]) radio.stuur (boodskap) slaap (10)

As u op 'n knoppie druk, stuur een van die boodskappe wat u aan die robot gesê het om in die vorige stap uit te kyk.

Die boodskap sal gestuur word wanneer daar op die knoppie gedruk word, en rekenaars is baie vinniger as mense! Die boodskap kan dus baie keer gestuur word voordat u die vinger van die knoppie afgehaal het.

Die slaap nadat u die boodskap gestuur het, vertraag dit, sodat dit nie so vinnig op die knoppie sal kyk nie - probeer 'n paar nommers hier om die perfekte tyd vir u te kry - te stadig, en dit reageer ook nie vinnig en u robot sal soveel knoppieboodskappe ontvang dat dit kan ophou reageer op die joystick!

Werk dit?

As u foutboodskappe kry, moet u goed nadink oor wat u pas verander het en wat gebeur.

As u 'n fout op die robot kry as u op 'n knoppie op u kontroleerder druk, weet u dat die boodskap deurkom, maar dit verwar die robot. Kontroleer of die boodskap wat u gestuur het, en die boodskap wat u aan die robot gesê het om te soek, dieselfde is.

Skakel na werkkode:

Stap 11: Volgende stappe

U het nou die kennis wat u nodig het om met die motors van u robot en met u joystick: bit -kontroleerder te werk

Gebruik hierdie kennis om die twee programme te verbeter en dit u eie te maak. 'N Paar idees hieronder!

U het ses knoppies op u beheerder! Wat wil jy hê moet hulle doen?

  • Wat van die programmering van 'n dansroetine wat u robot op bevel kan doen? Skryf 'n algoritme van drive () opdragte, geskei deur slaap () opdragte!
  • Wil u die rigting waarin die robot beweeg verander sodat dit maklik onderstebo kan ry? Dink aan die x- en y -waardes van u joystick. Wat verteenwoordig hulle en hoe kan u dit manipuleer?
  • Het u robot ekstra funksies, soos LED's, 'n luidspreker of sensors?

Idees om die kode te verbeter

  • Kan u u robot help om onbekende boodskappe die hoof te bied deur probeer/behalwe kode te gebruik?
  • Die wiskunde wat gebruik word om die linker- en regterwaardes van die joystick te bereken, gee ons nie die volle reeks waardes nie (die robot se aandrywing kan 'n getal tot 1023 aanvaar). Kan u hierdie kode wysig om 'n beter reeks te kry?
  • Daar is ander metodes om die joystick -waardes te meng - kan u 'n beter manier vind om dit te doen?

Aanbeveel: