Innholdsfortegnelse:
2025 Forfatter: John Day | [email protected]. Sist endret: 2025-01-13 06:58
I denne opplæringen får vi GiggleBot til å takle vanskelighetene med en labyrint.
Vi monterer en servo på GiggleBot som vi fester en avstandssensor på. Mens du kjører, skal servoen rotere frem og tilbake slik at avstandssensoren kan måle avstanden opp til hvert hinder. Dette fungerer omtrent som en LIDAR -sensor som vanligvis er mye dyrere.
På samme tid sender GiggleBot disse dataene til en ekstern BBC micro: bit som viser sin 5-til-5-matrise av lysdioder sin relative posisjon til hindringene.
Jobben din er å bare kunne navigere i GiggleBot ved å se på hva den viser på den andre BBC micro: bit. For å kontrollere GiggleBot brukes knappene på den eksterne BBC micro: bit.
Det høres gøy ut! La oss komme til det, skal vi?
Trinn 1: Nødvendige komponenter
Vi kommer til å trenge:
- En fniseBot.
- En batteripakke til BBC micro: bit. Den følger med en BBC micro: bit i pakken.
- x3 AA -batterier til GiggleBot.
- En Grove -kabel for å koble avstandssensoren til GiggleBot.
- Et servosett fra DexterIndustries.
- x3 BBC micro: bits. En for GiggleBot og en som ble brukt til å kontrollere roboten langt unna.
- En avstandssensor fra DexterIndustries.
Få GiggleBot -roboten til BBC micro: bit her!
Trinn 2: Montering av roboten
For å gjøre GiggleBot klar til å bli programmert, må vi montere den, selv om det ikke er så mye som trengs å gjøres.
Sett de 3 AA -batteriene inn i rommet under GiggleBot.
Monter servopakken. Til den roterende armen på servoen bruker du det siste hullet i den til å feste servoen på GiggleBots frontkontakter. Du kan bruke en skrue og/eller en ledning for å gjøre den mer stabil på sin plass. Eller du kan varme lim det på brettet. I mitt tilfelle brukte jeg en skrue og en kort ledning for å knytte servoarmen til GiggleBot -brettet.
Når du monterer servoarmen på servoen, må du kontrollere at servoen allerede er satt til posisjon 80. Du kan gjøre det ved å ringe gigglebot.set_servo (gigglebot. RIGHT, 80). Du kan lese mer om det her.
Plasser deretter avstandssensoren på forsiden av servopakken og fikser den som i eksemplet ovenfor.
Til slutt kobler du avstandssensoren med en Grove -kabel til en av de 2 I2C -portene og servomotoren til den høyre porten som sitter på GiggleBot - den riktige porten er nevnt på den.
Trinn 3: Lag din egen labyrint - valgfritt
I dette tilfellet har jeg brukt en haug med esker for å lage et spor med lukket sløyfe, som ligner på en NASCAR.
På dette trinnet kan du bli veldig kreativ og gjøre den så vridd du vil, eller gjøre den super lang fordi det virkelig er opp til deg.
Eller hvis du ikke vil ha et spor i det hele tatt, kan du for eksempel sette GiggleBot på et kjøkken eller en stue - det burde være godt nok fordi det er mange vegger og hindringer du fortsatt må unngå.
Trinn 4: Sette opp miljøet
For at du skal kunne programmere BBC micro: bit i MicroPython, må du sette opp en editor for den (Mu Editor) og angi GiggleBot MicroPython Runtime som kjøretid. For det må du følge instruksjonene på denne siden. Fra nå av brukes versjon v0.4.0 av kjøretiden.
Trinn 5: Programmering av GiggleBot - del I
La oss først sette opp GiggleBots skript. Dette skriptet får GiggleBot til å rotere servomotoren 160 grader (80 grader i hver retning), samtidig som den tar 10 avlesninger fra avstandssensoren per sving.
Når den er slått på, vil GiggleBot stå i berøring til den mottar en kommando fra fjernkontrollen. Det kan bare være tre kommandoer: gå fremover, til venstre eller til høyre.
Merk: Følgende skript kan mangle mellomrom, og dette ser ut til å skyldes et problem med visning av GitHub Gists. Klikk på essensen for å ta deg til GitHub-siden der du kan kopiere og lime inn koden.
Fjernstyrt LIDAR-basert GiggleBot
fra gigglebot import* |
fra distance_sensor import DistanceSensor |
fra mikrobit import søvn |
fra utime import ticks_us, sleep_us |
import ustruct |
importere radio |
# stopp roboten hvis den allerede beveger seg |
Stoppe() |
# aktiver radio |
radio.on () |
# avstandssensorobjekt |
ds = DistanceSensor () |
ds.start_continuous () |
rotere_tid = 0,7# målt i sekunder |
rotate_span = 160# målt i grader |
rotere_steg = 10 |
overhead_compensation = 1,05# definert i prosent |
time_per_step = 10 ** 6* rotate_time / (rotate_steps* overhead_compensation) |
last_read_time = 0 |
radar = bytearray (roter_steg) |
servo_rotate_direction = 0# 0 for å gå oppover (0-> 160) og 1 ellers |
radar_index = 0 |
set_servo (RIGHT, 0) |
whileTrue: |
# lest fra radaren |
if ticks_us () - last_read_time> time_per_step: |
# lest fra avstandssensoren |
radar [radar_index] = int (ds.read_range_continuous () /10) |
last_read_time = ticks_us () |
print (radar_index) |
# gjør logikken for å rotere servoen fra venstre til høyre |
hvis radar_index == rotate_steps -1og servo_rotate_direction == 0: |
set_servo (RIGHT, 0) |
servo_rotate_direction = 1 |
elif radar_index == 0og servo_rotate_direction == 1: |
set_servo (RIGHT, rotate_span) |
servo_rotate_direction = 0 |
ellers: |
radar_index += 1if servo_rotate_direction == 0else-1 |
# og send radarverdiene |
radio.send_bytes (radar) |
prøve: |
# les robotkommandoer |
lmotor, rmotor = ustruct.unpack ('bb', radio.receive_bytes ()) |
# og aktiver motorene hvis det er mottatte kommandoer |
set_speed (lmotor, rmotor) |
kjøre() |
exceptTypeError: |
sende |
vis rawgigglebot_lidar_robot.py hostet av ❤ av GitHub
Trinn 6: Programmering av fjernkontrollen - Del II
Det som gjenstår er å programmere den andre BBC micro: bit som fungerer som en fjernkontroll.
Fjernkontrollen brukes til å vise den relative avstanden til hindringer på sin 5-til-5-piksel laget skjerm. På det meste kommer det til å være 10 piksler slått på.
Samtidig gir fjernkontrollen deg mulighetene til å fjernstyre GiggleBot ved å trykke på de 2 knappene: gå fremover, til venstre og til høyre.
Merk: Følgende skript kan mangle mellomrom, og dette ser ut til å skyldes et problem med visning av GitHub Gists. Klikk på essensen for å ta deg til GitHub-siden der du kan kopiere og lime inn koden.
Fjernstyrt LIDAR -basert GiggleBot - ekstern kode
fra mikrobitimport, visning, knapp_a, knapp_b |
import ustruct |
importere radio |
import matematikk |
radio.on () |
rotere_steg = 10 |
rotate_span = 160# i grader |
rotate_step = rotate_span / rotate_steps |
maks_avstand = 50# i centimeter |
side_length_leds = 3 # målt i antall piksler |
radar = bytearray (roter_steg) |
xar = bytearray (roter_steg) |
yar = bytearray (roter_steg) |
save_xar = bytearray (roter_steg) |
save_yar = bytearray (roter_steg) |
motorhastighet = 50 |
whileTrue: |
status = radio.receive_bytes_into (radar) |
hvis status ikke er Ingen: |
# display.clear () |
for c, val inenumerate (radar): |
hvis radar [c] <= max_distance: |
# beregne 2d koordinater for hver avstand |
vinkel = rotere_ trinn / (rotere_ trinn -1) * rotere_ trinn * c |
vinkel += (180- rotate_span) /2.0 |
x_c = math.cos (vinkel * math.pi /180.0) * radar [c] |
y_c = math.sin (vinkel * math.pi /180.0) * radar [c] |
# skalere avstandene for å passe på 5x5 mikrobit -skjermen |
x_c = x_c * (side_length_leds -1) / max_distance |
y_c = y_c * (side_length_leds +1) / max_distance |
# flytt posisjoner |
x_c += (side_length_leds -1) |
y_c = (side_length_leds +1) - y_c |
# runde koordinater nøyaktig hvor lysdiodene er funnet |
hvis x_c - matte. gulv (x_c) <0,5: |
x_c = matematikk. gulv (x_c) |
ellers: |
x_c = matematikk.ceil (x_c) |
hvis y_c - matematikkgulv (y_c) <0,5: |
y_c = matematikk. etasje (y_c) |
ellers: |
y_c = matematikk.ceil (y_c) |
xar [c] = x_c |
yar [c] = y_c |
ellers: |
xar [c] = 0 |
yar [c] = 0 |
display.clear () |
for x, y inzip (xar, yar): |
display.set_pixel (x, y, 9) |
# print (liste (zip (xar, yar, radar))) |
stateA = button_a.is_pressed () |
stateB = button_b.is_pressed () |
hvis stateA og stateB: |
radio.send_bytes (ustruct.pack ('bb', motor_speed, motor_speed)) |
print ('fremover') |
hvis stateA og ikke stateB: |
radio.send_bytes (ustruct.pack ('bb', motor_speed, -motor_speed)) |
print ('venstre') |
ifnot stateA og stateB: |
radio.send_bytes (ustruct.pack ('bb', -motor_speed, motor_speed)) |
print ('høyre') |
ifnot stateA og ikke stateB: |
radio.send_bytes (ustruct.pack ('bb', 0, 0)) |
print ('stopp') |
vis rawgigglebot_lidar_remote.py hostet av ❤ av GitHub
Trinn 7: Tolke fjernskjermen
"loading =" lat "kontroller GiggleBot, du har følgende alternativer:
- Trykk på knapp A og B for å flytte GiggleBot fremover.
- Trykk på knapp A for å snurre GiggleBot til venstre.
- Trykk på knapp B for å snurre GiggleBot til høyre.
For å se i hvilken retning de nærmeste hindringene oppdages, bare se på fjernkontrollens (den eksterne BBC micro: bit som du holder) skjermen. Du bør kunne kontrollere GiggleBot langt unna uten å se på den.