Inhoudsopgave:
- Stap 1: Vereiste componenten
- Stap 2: Stel de sporen in
- Stap 3: De omgeving instellen
- Stap 4: De GiggleBot programmeren
- Stap 5: Het laten lopen
Video: GiggleBot-regelvolger met Python: 5 stappen
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:16
Deze keer programmeren we in MicroPython de Dexter Industries GiggleBot om een zwarte lijn te volgen met behulp van de ingebouwde lijnvolgersensor.
De GiggleBot moet worden gekoppeld aan een BBC micro:bit om op de juiste manier te kunnen worden bestuurd.
Als deze tutorial te geavanceerd voor je is en het programmeren van de GiggleBot voor nu te veel is, kun je altijd de starterstutorial doorlopen die je laat zien hoe de robot kan worden geprogrammeerd in MakeCode hier. De gekoppelde zelfstudie leidt u door de basisprincipes.
Stap 1: Vereiste componenten
De volgende hardwarecomponenten zijn vereist:
- x3 AA-batterijen - in mijn geval gebruik ik oplaadbare batterijen die over het algemeen een lagere spanning hebben.
- Een Dexter Industries GiggleBot-robot voor de micro:bit.
- Een BBC-micro:bit.
Natuurlijk heb je ook een micro-USB-kabel nodig om de BBC micro:bit te programmeren - deze kabel zit meestal in het BBC micro:bit-pakket of je kunt er altijd een gebruiken die wordt gebruikt voor het opladen van (Android-)smartphones.
Download hier de GiggleBot voor de micro:bit
Stap 2: Stel de sporen in
Je zult een aantal tegels moeten printen en je eigen tracks moeten ontwerpen. U kunt onze eigen tegels gebruiken, zodat u 100% zeker weet dat u onze voorwaarden repliceert. Of als je avontuurlijk bent, kun je wat zwarte tape gebruiken en er zelf een maken. Hier is de PDF voor de tegels die we hebben gebruikt.
Het bovenstaande spoor bestaat uit het volgende aantal verschillende tegels:
- 12 tegels van het type #1.
- 5 tegels van het type #2.
- 3 sjablonen van tegeltype #5.
- 3 sjablonen van tegeltype #6 - hier krijg je een extra tegel.
Druk ze vervolgens af en knip ze uit. Probeer ze te plaatsen zoals op de bovenstaande foto en houd er rekening mee dat aan de rechterbovenkant van de baan 2 tegels elkaar moeten overlappen - dit wordt verwacht voor het geval je je afvraagt of je iets verkeerd doet.
Stap 3: De omgeving instellen
Om de BBC micro:bit in MicroPython te kunnen programmeren, moet je er een editor voor instellen (de Mu Editor) en de GiggleBot MicroPython Runtime als runtime instellen. Daarvoor moet je de instructies op deze pagina volgen. Vanaf dit moment wordt versie v0.4.0 van de runtime gebruikt.
Stap 4: De GiggleBot programmeren
Voordat we ermee aan de slag gaan, bevat de GiggleBot MicroPython-runtime de klassieke runtime voor de BBC micro:bit en andere bibliotheken om de GiggleBot en andere Dexter Industries-sensoren te ondersteunen.
Nadat je het hebt ingesteld, open je het volgende script in de Mu-editor en klik je op Flash. Hiermee flitst de GiggleBot MicroPython Runtime en het script dat je zojuist hebt geopend voor je BBC micro:bit. Het script wordt ook hieronder weergegeven.
Zodra het knipperen is voltooid, stapelt u de BBC micro:bit in de GiggleBot met de neopixels van het bord naar voren gericht, plaatst u deze op de baan en schakelt u hem in.
Merk op dat in het script de PID en andere 2 constanten (het toerentalsetpoint en minimum toerentalconstanten) al zijn ingesteld.
Opmerking: het volgende script bevat mogelijk ontbrekende spaties en dit lijkt te wijten te zijn aan een probleem bij het weergeven van GitHub Gists. Klik op de kern om naar de GitHub-pagina te gaan waar u de code kunt kopiëren en plakken.
GiggleBot PID-lijnvolger - afgestemd met NeoPixels
van microbit-import* |
van gigglebot-import* |
van utime import sleep_ms, ticks_us |
import ustruct |
# initialiseer GB neopixels |
neo = init() |
# timing |
update_rate = 50 |
# versterkingen/constanten (ervan uitgaande dat de batterijspanning ongeveer 4,0 volt is) |
Kp = 25.0 |
Ki = 0,5 |
Kd = 35.0 |
trigger_point =0.3 |
min_speed_percent =0.3 |
basissnelheid = 70 |
instelpunt =0.5 |
last_position = instelpunt |
integraal =0.0 |
run_neopixels =True |
center_pixel =5# waar de middelste pixel van de glimlach zich op de GB bevindt |
# turkoois = tuple(map(lambda x: int(x / 5), (64, 224, 208))) # kleur die moet worden gebruikt om de fout met de neopixels te tekenen |
# turkoois = (12, 44, 41) # wat precies de bovenstaande turkoois is die hierboven is becommentarieerd |
error_width_per_pixel =0.5/3# max fout gedeeld door het aantal segmenten tussen elke neopixel |
defupper_bound_linear_speed_reducer (abs_error, trigger_point, upper_bound, kleinste_motor_power, hoogste_motor_power): |
globale basissnelheid |
if 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) |
# hetzelfde als |
y = (abs_error - trigger_point) / (upper_bound - trigger_point) |
motor_power = basis_snelheid * (kleinste_motor_power + (1- y) * (hoogste_motor_power - kleinste_motor_power)) |
retour motor_power |
anders: |
return base_speed * hoogste_motor_power |
uitvoeren =False |
previous_error = 0 |
whileTrue: |
# als knop a wordt ingedrukt, begin dan met volgen |
if button_a.is_pressed(): |
rennen = True |
# maar als knop b wordt ingedrukt, stop de lijnvolger |
if button_b.is_pressed(): |
uitvoeren =False |
integraal =0.0 |
vorige_fout =0.0 |
pixels_off() |
stop() |
sleep_ms(500) |
als uitvoeren waar is: |
# lees de lijnsensoren |
start_time = ticks_us() |
rechts, links = read_sensor (LINE_SENSOR, BEIDE) |
# lijn is aan de linkerkant wanneer positie < 0,5 |
# lijn is aan de rechterkant wanneer positie > 0,5 |
# lijn is in het midden wanneer positie = 0,5 |
# het is een gewogen rekenkundig gemiddelde |
proberen: |
positie = rechts / zwevend (links + rechts) |
behalveZeroDivisionError: |
positie =0.5 |
# het bereik moet (0, 1) zijn en niet [0, 1] |
als positie ==0: positie =0.001 |
als positie ==1: positie =0.999 |
# gebruik een PD-controller |
fout = positie - instelpunt |
integraal += fout |
correctie = Kp * fout + Ki * integraal + Kd * (fout - vorige_fout) |
previous_error = fout |
# bereken motorsnelheden |
motor_speed = upper_bound_linear_speed_reducer(abs(error), setpoint * trigger_point, setpoint, min_speed_percent, 1.0) |
leftMotorSpeed = motor_speed + correctie |
rightMotorSpeed = motor_speed - correctie |
# verlicht de neopixels volgens de gegeven fout |
if run_neopixels isTrueand total_counts %3==0: |
voor i inb'\x00\x01\x02\x03\x04\x05\x06\x07\x08': |
neo = (0, 0, 0) |
voor i inb'\x00\x01\x02\x03': |
ifabs(fout) > error_width_per_pixel * i: |
als fout <0: |
# neo[center_pixel + i] = turkoois |
neo[center_pixel + i] = (12, 44, 41) |
anders: |
# neo[center_pixel - i] = turkoois |
neo[center_pixel + i] = (12, 44, 41) |
anders: |
procent = 1- (error_width_per_pixel * i -abs(error)) / error_width_per_pixel |
# verlicht de huidige pixel |
als fout <0: |
# neo[center_pixel + i] = tuple(map(lambda x: int(x * percentage), turquoise)) |
neo[center_pixel + i] = (int(64* procent /5), int(224* procent /5), int(208* procent /5)) |
anders: |
# neo[center_pixel - i] = tuple(map(lambda x: int(x * percentage), turquoise)) |
neo[center_pixel - i] = (int(64* procent /5), int(224* procent /5), int(208* procent /5)) |
pauze |
neo.show() |
proberen: |
# clip de motorsnelheden |
indien linksMotortoerental >100: |
linkerMotorSnelheid = 100 |
rechtsMotorSnelheid = rechtsMotorSnelheid - linksMotorSnelheid +100 |
indien juistMotortoerental >100: |
rechts MotorSnelheid = 100 |
leftMotorSpeed = leftMotorSpeed - rightMotorSpeed +100 |
indien linksMotorsnelheid <-100: |
linkerMotorSnelheid =-100 |
indien rechtsMotorsnelheid <-100: |
rechtsMotorSnelheid =-100 |
# activeer de motoren |
set_speed (linksMotorSpeed, rechtsMotorSpeed) |
rit() |
# print((fout, motor_snelheid)) |
behalve: |
# voor het geval we in een onoplosbaar probleem komen |
doorgang |
# en behoud de lusfrequentie |
end_time = ticks_us() |
delay_diff = (eindtijd - begintijd) /1000 |
if1000.0/ update_rate - delay_diff >0: |
slaap (100.0/update_rate - delay_diff) |
bekijk rawgigglebot_tuned_line_follower.py gehost met ❤ door GitHub
Stap 5: Het laten lopen
Er zijn 2 knoppen op de BBC micro:bit: knop A en knop B:
- Door op knop A te drukken, laat de GiggleBot de lijn volgen (als die er is).
- Door op knop B te drukken stopt de GiggleBot en reset alles zodat je hem weer kunt gebruiken.
Het wordt ten zeerste aangeraden om de GiggleBot niet op te tillen terwijl hij een lijn volgt en hem er dan weer op te plaatsen, omdat de fout die wordt berekend zich kan ophopen en de route van de robot volledig kan verstoren. Als u hem wilt optillen, drukt u op knop B en als u hem weer terugplaatst, drukt u nogmaals op A.
Aanbevolen:
Meerdere LED's besturen met Python en de GPIO-pinnen van je Raspberry Pi: 4 stappen (met afbeeldingen)
Meerdere LED's besturen met Python en de GPIO-pinnen van je Raspberry Pi: deze Instructable laat zien hoe je meerdere GPIO-pinnen op je RaspberryPi kunt besturen om 4 LED's van stroom te voorzien. Het zal je ook kennis laten maken met parameters en voorwaardelijke uitspraken in Python.Onze vorige Instructable met behulp van de GPIO-pinnen van je Raspberry Pi om
Aan de slag met Python: 7 stappen (met afbeeldingen)
Aan de slag met Python: programmeren is geweldig! Het is creatief, leuk en het geeft je hersenen een mentale training. Velen van ons willen meer leren over programmeren, maar overtuigen onszelf ervan dat dat niet kan. Misschien heeft het te veel wiskunde, misschien schrikt het jargon dat eromheen wordt gegooid
Draadloze afstandsbediening met 2,4 GHz NRF24L01-module met Arduino - Nrf24l01 4-kanaals / 6-kanaals zenderontvanger voor quadcopter - RC Helikopter - RC-vliegtuig met Arduino: 5 stappen (met afbeeldingen)
Draadloze afstandsbediening met 2,4 GHz NRF24L01-module met Arduino | Nrf24l01 4-kanaals / 6-kanaals zenderontvanger voor quadcopter | RC Helikopter | Rc-vliegtuig met Arduino: een Rc-auto besturen | Quadcopter | Drone | RC vliegtuig | RC-boot, we hebben altijd een ontvanger en zender nodig, stel dat we voor RC QUADCOPTER een 6-kanaals zender en ontvanger nodig hebben en dat type TX en RX is te duur, dus we gaan er een maken op onze
Maak een Lidar-geleide robot met de GiggleBot: 8 stappen
Maak een door Lidar geleide robot met de GiggleBot: In deze tutorial laten we de GiggleBot de moeilijkheden van een doolhof aanpakken. We monteren een servo op de GiggleBot waarop we een afstandssensor bevestigen. Tijdens het draaien gaat de servo heen en weer draaien zodat de afstandssensor
Toegang tot Arduino YÚN beheren met MySQL, PHP5 en Python: 11 stappen (met afbeeldingen)
Beheer de toegang van Arduino YÚN met MySQL, PHP5 en Python: Hallo vrienden! Nou, zoals je weet, in september het nieuwe première schild van Arduino, Arduino YUN. Deze kleine vriend heeft een Linux embedded systeem waarmee we alles kunnen draaien wat je maar kunt bedenken (tenminste tot nu toe). Hoewel er weinig informatie is