Innehållsförteckning:
- Steg 1: Obligatoriska komponenter
- Steg 2: Konfigurera spåren
- Steg 3: Konfigurera miljön
- Steg 4: Programmering av GiggleBot
- Steg 5: Låt det köra
Video: GiggleBot -linjeföljare med Python: 5 steg
2024 Författare: John Day | [email protected]. Senast ändrad: 2024-01-30 12:44
Den här gången programmerar vi i MicroPython Dexter Industries GiggleBot för att följa en svart linje med sin inbyggda linjeföljarsensor.
GiggleBot måste kopplas ihop med en BBC micro: bit för att den ska kunna styras på lämpligt sätt.
Om denna handledning är för avancerad för dig och programmering av GiggleBot är för mycket för nu kan du alltid gå igenom starthandledningen som visar hur roboten kan programmeras i MakeCode här. Den länkade självstudien leder dig genom de grundläggande grunderna.
Steg 1: Obligatoriska komponenter
Följande hårdvarukomponenter krävs:
- x3 AA -batterier - i mitt fall använder jag laddningsbara batterier som har en lägre spänning totalt.
- En Dexter Industries GiggleBot -robot för micro: bit.
- En BBC micro: bit.
Naturligtvis behöver du också en mikro -USB -kabel för att programmera BBC micro: bit - den här kabeln ingår vanligtvis i BBC micro: bit -paketet eller så kan du alltid använda en som används för att ladda (Android) smartphones.
Få GiggleBot för micro: bit här
Steg 2: Konfigurera spåren
Du måste skriva ut några brickor och designa dina egna spår. Du kan använda våra egna plattor så att du är 100% säker på att du replikerar våra villkor. Eller om du känner dig äventyrlig kan du använda lite svart tejp och göra din egen. Här är PDF -filen för brickorna vi har använt.
Ovanstående spår består av följande antal olika brickor:
- 12 brickor av typ #1.
- 5 brickor av typ #2.
- 3 mallar av kakel typ #5.
- 3 mallar av kakel typ #6 - här får du en extra kakel.
Skriv sedan ut dem och klipp ut dem. Prova att placera dem som på bilden ovan och tänk på att på högra ovansidan av banan måste två brickor överlappa en med varandra - detta förväntas om du undrar om du gör något fel.
Steg 3: Konfigurera miljön
För att du ska kunna programmera BBC micro: bit i MicroPython måste du ställa in en editor för den (Mu Editor) och ställa in GiggleBot MicroPython Runtime som dess körtid. För det måste du följa instruktionerna på den här sidan. Från och med nu används version v0.4.0 av körtiden.
Steg 4: Programmering av GiggleBot
Innan GiggleBot MicroPython runtime innehåller den klassiska körtiden för BBC micro: bit och andra bibliotek för att stödja GiggleBot och andra Dexter Industries Sensors.
När du har konfigurerat det öppnar du följande skript i Mu -redigeraren och klickar på Flash. Detta kommer att blinka GiggleBot MicroPython Runtime och skriptet du just har öppnat för din BBC micro: bit. Manuset visas också nedan.
När den blinkande processen är klar, stapla BBC micro: bit in i GiggleBot med brädans neopixlar framåt, placera den på spåret och slå på den.
Lägg märke till att i skriptet är PID och andra 2 konstanter (hastighetsbörvärdet och minimihastighetskonstanterna) redan inställda.
Obs! Följande skript kan sakna blanksteg och detta verkar bero på problem med visning av GitHub -listor. Klicka på kärnan för att ta dig till dess GitHub-sida där du kan kopiera och klistra in koden.
GiggleBot PID Line Follower - Tuned w/ NeoPixels
från mikrobitimport* |
från gigglebot import* |
från utime import sleep_ms, ticks_us |
importera struktur |
# initiera GB neopixlar |
neo = init () |
# timing |
update_rate = 50 |
# förstärkning/konstant (förutsatt att batterispänningen är cirka 4,0 volt) |
Kp = 25,0 |
Ki = 0,5 |
Kd = 35,0 |
trigger_point = 0,3 |
min_hastighet_procent = 0,3 |
bashastighet = 70 |
börvärde = 0,5 |
last_position = börvärde |
integral = 0,0 |
run_neopixels = Sant |
center_pixel = 5# där leppets mittpixel finns på GB |
# turkos = tupel (karta (lambda x: int (x / 5), (64, 224, 208))) # färg att använda för att rita felet med neopixlarna |
# turkos = (12, 44, 41) # vilket är exakt den ovan turkosa kommenterade ovanför detta |
error_width_per_pixel = 0,5/3# max fel dividerat med antalet segment mellan varje neopixel |
defupper_bound_linear_speed_reducer (abs_error, trigger_point, upper_bound, smallest_motor_power, highest_motor_power): |
global bas_hastighet |
om abs_error> = trigger_point: |
# x0 = 0,0 |
# y0 = 0,0 |
# x1 = upper_bound - trigger_point |
# y1 = 1,0 |
# x = abs_error - trigger_point |
# y = y0 + (x - x0) * (y1 - y0) / (x1 - x0) |
# samma som |
y = (abs_error - trigger_point) / (upper_bound - trigger_point) |
motor_kraft = bashastighet * (minsta_motor_kraft + (1- y) * (högsta_motor_kraft - minsta_motor_kraft)) |
return motor_power |
annan: |
returnera bashastighet * högsta_motor_kraft |
kör = falskt |
föregående_fel = 0 |
whileTrue: |
# om knappen a trycks in börjar du följa |
if button_a.is_pressed (): |
kör = Sant |
# men om knappen b trycks in, stoppa linjeföljaren |
om button_b.is_pressed (): |
kör = falskt |
integral = 0,0 |
föregående_fel = 0,0 |
pixlar_off () |
sluta() |
sleep_ms (500) |
if run isTrue: |
# läs linjesensorerna |
start_time = ticks_us () |
höger, vänster = läs_sensor (LINE_SENSOR, BÅDE) |
# rad är till vänster när position <0,5 |
# linje är till höger när position> 0,5 |
# linje är i mitten när position = 0,5 |
# det är ett vägat aritmetiskt medelvärde |
Prova: |
position = höger /flyt (vänster + höger) |
utomZeroDivisionError: |
position = 0,5 |
# intervallet måste vara (0, 1) och inte [0, 1] |
om position == 0: position = 0,001 |
om position == 1: position = 0,999 |
# använd en PD -controller |
fel = position - börvärde |
integral += fel |
korrigering = Kp * fel + Ki * integral + Kd * (fel - föregående_fel) |
previous_error = fel |
# beräkna motorvarvtal |
motor_speed = upper_bound_linear_speed_reducer (abs (fel), börvärde * trigger_point, börvärde, min_hastighet_procent, 1.0) |
leftMotorSpeed = motor_speed + korrigering |
rightMotorSpeed = motor_speed - korrigering |
# tänd neopixlarna enligt det angivna felet |
om run_neopixels isTrueand total_counts %3 == 0: |
för i inb '\ x00 / x01 / x02 / x03 / x04 / x05 / x06 / x07 / x08': |
neo = (0, 0, 0) |
för i inb '\ x00 / x01 / x02 / x03': |
ifabs (fel)> error_width_per_pixel * i: |
om fel <0: |
# neo [center_pixel + i] = turkos |
neo [center_pixel + i] = (12, 44, 41) |
annan: |
# neo [center_pixel - i] = turkos |
neo [center_pixel + i] = (12, 44, 41) |
annan: |
procent = 1- (error_width_per_pixel * i -abs (error)) / error_width_per_pixel |
# tända den aktuella pixeln |
om fel <0: |
# neo [center_pixel + i] = tuple (karta (lambda x: int (x * procent), turkos)) |
neo [center_pixel + i] = (int (64* procent /5), int (224* procent /5), int (208* procent /5)) |
annan: |
# neo [center_pixel - i] = tuple (karta (lambda x: int (x * procent), turkos)) |
neo [center_pixel - i] = (int (64* procent /5), int (224* procent /5), int (208* procent /5)) |
ha sönder |
neo.show () |
Prova: |
# klipp motorns varvtal |
om kvar MotorSpeed> 100: |
leftMotorSpeed = 100 |
rightMotorSpeed = rightMotorSpeed - leftMotorSpeed +100 |
om rätt MotorSpeed> 100: |
rightMotorSpeed = 100 |
leftMotorSpeed = leftMotorSpeed - rightMotorSpeed +100 |
if leftMotorSpeed <-100: |
leftMotorSpeed = -100 |
om rätt MotorSpeed <-100: |
rightMotorSpeed = -100 |
# aktivera motorerna |
set_speed (leftMotorSpeed, rightMotorSpeed) |
kör() |
# print ((fel, motorhastighet)) |
bortsett från: |
# om vi skulle hamna i något oföränderligt problem |
passera |
# och behåll loopfrekvensen |
end_time = ticks_us () |
delay_diff = (end_time - start_time) /1000 |
if1000.0/ update_rate - delay_diff> 0: |
sömn (1000,0/ update_rate - delay_diff) |
visa rawgigglebot_tuned_line_follower.py värd med ❤ av GitHub
Steg 5: Låt det köra
Det finns 2 knappar på BBC micro: bit: knapp A och knapp B:
- Genom att trycka på knappen A ställs GiggleBot in för att följa linjen (om det finns en).
- Genom att trycka på knappen B stoppas GiggleBot och återställer allt så att du kan använda den igen.
Det rekommenderas starkt att inte lyfta GiggleBot medan den följer en linje och sedan sätta tillbaka den på den eftersom felet som beräknas kan ackumuleras och helt förstöra robotens väg. Om du vill lyfta den trycker du på knappen B och sedan när du sätter tillbaka den trycker du på A igen.
Rekommenderad:
Fuktighets- och temperaturobservatör med Raspberry Pi med SHT25 i Python: 6 steg
Fuktighets- och temperaturobservatör med Raspberry Pi Med SHT25 i Python: Som en entusiast för Raspberry Pi tänkte vi på några mer spektakulära experiment med den. I den här kampanjen kommer vi att göra en fukt- och temperaturobservator som mäter relativ fuktighet och temperatur med Raspberry Pi och SHT25, Humidi
Akustisk levitation med Arduino Uno Steg-för-steg (8-steg): 8 steg
Akustisk levitation med Arduino Uno Steg-för-steg (8-steg): ultraljudsgivare L298N Dc kvinnlig adapter strömförsörjning med en manlig DC-pin Arduino UNOBreadboardHur det fungerar: Först laddar du upp kod till Arduino Uno (det är en mikrokontroller utrustad med digital och analoga portar för att konvertera kod (C ++)
Rörelsekontroll med Raspberry Pi och LIS3DHTR, 3-axlig accelerometer, med Python: 6 steg
Rörelsekontroll med Raspberry Pi och LIS3DHTR, 3-axlig accelerometer, med Python: Skönhet omger oss, men vanligtvis måste vi gå i en trädgård för att veta det. - Rumi Som den utbildade gruppen som vi verkar vara investerar vi den stora majoriteten av vår energi i att arbeta före våra datorer och mobiltelefoner. Därför låter vi ofta vårt välbefinnande
Tuning GiggleBot Line Follower - Advanced: 7 Steg
Ställa in GiggleBot -linjeföljaren - Avancerad: I denna mycket korta instruktionsbok kommer du att ställa in din egen GiggleBot för att följa en svart linje. I denna andra handledning GiggleBot Line Follower, hårdkodade vi inställningsvärdena för att fungera enligt det scenariot. Du kanske vill få det att bete sig
Gör en Lidar-guidad robot med GiggleBot: 8 steg
Gör en Lidar-guidad robot med GiggleBot: I den här självstudien får vi GiggleBot att hantera svårigheterna med en labyrint. Vi monterar en servo på GiggleBot som vi fäster en avståndssensor på. Under körning kommer servon att rotera fram och tillbaka så att avståndssensorn