Maskinlæring med selvbalancerende robot

Lidt naivt har jeg forsøgt, at lave en selvbalancerende robot baseret på en gul DC-motor og en micro:bit. Bitten har en indbygget gyro-sensor, som kan måle om den er ved at vælte til den ene eller anden side.

[youtube https://www.youtube.com/watch?v=LDcZrqrbFec?rel=0]

Robotten kan ikke balancere selv, og jeg er derfor skiftet til Arduino, en ekstern gyro og er på vej mod at udskifte DC-motoren med to Stepper-motorer. Desuden skal motorerne sikkert have mindst en kapacitor for at give mere jævn spænding under start.

Stepper-motorer kan ligesom servoer dreje til præcise gradtal, og reagerer hurtigere end DC-motorer. Steppere er ikke begrænset til 180 grader, som servo-motorer er, men kan dreje flere omgange, hvorfor de anvendes i 3D printere og andre CNC maskiner.

Alligevel skal deres omdrejninger stabiliseres af et PID-system. Og det er sjovt.

PID kan betragtes som maskinlæring, om end det har været anvendt i mange år (ligesom nogle typer af maskinlæring). Kort fortalt går det ud fra at motorens hastighed reguleres som summen af tre led:

Proportionelt med en sensormåling. I dette tilfælde gyro’ens afvigelse i en dimension fra balance.

Integralet af afvigelse fra balance. Her akkumuleres fejl over en vis periode, så motoren yder mere jo større fejl, der registreres. Når systemet kommer mere i balance givet motorens større reaktion, bliver mindre fejl akkumuleret og integral-leddet bliver mindre. På den måde forsøges erfaringer inkorporeret i systemet.

Differentialet er differential-kvotienten af motorens hastighed. Når systemet går mod balance, vil motoren ofte have forholdsvis store omdrejninger, som dog er på vej nedad -de bliver mindre. Men de mindskes ikke hurtigt nok, hvorfor systemet ofte vil overskyde balancepunktet og svinge over i den modsatte side. Differentialet dæmper dette overskud en smule, så systemet nemme kan finde balance. På den måde forsøges fremtiden inkorporeret i systemet.

Dvs. systemet lærer delvist på baggrund af de data den opsamler, heraf maskinlæring, dog uden neurale netværk. Alligevel kan systemet være ret svært at stabilisere. En Arduino-kode kunne se ud noget i denne stil:

kilde: http://web.csulb.edu/~hill/ee444/Lectures/08_PID%20Control.pdf

Hvert led (P+I+D) er forsynet med en faktor (Kp, Ki og Kd), som skal indstilles til den rigtige værdi. Hver værdi kan som regel kun findes ved små justeringer (tuning). Her kunne maskinlæring også være en oplagt tilgang. Dog en udfordring, at efter hvert run, skal jeg bringe robotten i balance igen.

Må se om jeg får tid til at gå videre med systemet.

 

Udgivet i Arduino, Elektronik, Maker, Micro:bit | Skriv en kommentar

Alle indlæg

[post_grid id=”1715″]

Udgivet i Uncategorized | Skriv en kommentar

Puzzlebox med micro:bit

Escape-rooms er sjove at gennemføre (ikke at jeg har prøvet), men måske endnu sjovere at planlægge. Da jeg ikke kan lave et escaperoom hjemme, er et mere tilgængeligt alternativ en puzzlebox. Altså en box, som kun åbner, når der er løst en række gåder.

Micro:bit (µbit) har den fordel, at den har indbyggede sensorer, knapper og display, som gør den nem at komme i gang med. Vil man lave mere avancerede ting, kan de medfødte komponenter til gengæld begrænse friheden, med mindre man selv tilslutter komponenter.

Her en puzzlebox prototype baseret på micro:bit. Mine puzzles er målrettet børn, så de er ikke så svære, og man får (imo) tydelige hints via 5×5 displayet, idet µbitten stikker op gennem et hul i låget.

µbit er monteret i et breakout edge-connector board for at give adgang til flere pins. Det er dog ikke strengt nødvendigt. På den anden side skal µbitten sidde fast i noget. Nogle forbindelser/ledninger er desuden sikret med lim fra en limpistol.

Første puzzle (meget nem): Tryk på begge knapper samtidig. Hint: pile peger på knapperne.

Andet puzzle (middel?): Køl kassen ned til under 10 grader C. Bruger µbit’s indbyggede temperatur-sensor, som dog altid viser en temperatur ca. 3 grader over den egentlige rumtemperatur, givet processorens varmeudvikling. Hint: display viser teksten “cool”. Man kan gøre det sværere ved at skrive teksten i morse-kode.

Tredje puzzle (svær): Der er to ledninger, som stikker ud af kassen, og 10 skruer. Ledningerne skal forbindes til skrue nr. 2 og 5. Desuden skal en on/off switch være tændt. Derved kommer der 3V til pin1. Hint: Display viser “5  2”.

Løsning af de tre puzzles, trigger en servo på pin0, som åbner boxen i 10 sekunder. Derefter låser den igen, og de tre puzzles skal løses forfra. Det hele får strøm fra en 5V powerbank.

Puzzle 3 er ikke en særlig elegant løsning, og vil gerne lave en løsning a la Makey Makey, hvor man blot skal berøre skruerne. Jeg har ikke haft tid til at forsøge med hvilken modstand, der er passende til µbitens 3V i stedet for 5V.

kilde: efter https://www.bigmessowires.com/2016/08/19/fruit-electronics-piano/

Der er mange andre puzzles, som børnene måske kan være med til at designe: Bruge accelerometeret, kompas, morse (som sagt), lys. Begrave µbit i boxen, så den fremstår mere ren. Boxen kan skæres på lasercutter.

kode m.m.:

Udgivet i Elektronik, Maker, Micro:bit | Skriv en kommentar

Simpel robot med machine learning

Machine Learning er et skridt på vejen mod menneskelignende kunstig intelligens. Machine learning benytter store mængder data og kan inddeles i supervised, unsupervised og reinforcement learning.

Kendte anvendelser er søgemaskiner, genkendelse af tale, tekst og billeder, data-analyser, sygdoms-diagnoser og mange flere.

Jeg er p.t. interesseret i reinforcement learning, som efterligner dyrerigets brug af belønning og straf. Den er velegnet til at lære nogle robotter at bevæge sig, og kan gøres på flere måder.

Jeg har før skrevet om en simpel selvlærende robot. Her anden generation, med et eksempel på anvendelse af metoden Q-learning på en Arduino-baseret crawler-robot, som har to servo-motorer og dermed to frihedsgrader:

Robotten skal lære at bevæge sig fremad ved at modtage belønning (reward). Belønning uddeles på baggrund af en afstandsmåler, som måler afstanden til en bagvæg.

Jeg håber at eksemplet kan bruges, til at lege med nogle af de afgørende parametre i modellen, herunder alpha, epsilon og gamma.

Hver af de to servo-motorer har 6 stillinger (states). Det giver 6 x 6=36 mulige states. I hvert state er 2 mulige handlinger (actions) pr. motor: flyt en motor et trin op, eller flyt den et trin ned.

Belønningerne gemmes i en state og action matrice på 36 x 4 kaldet Q, deraf navnet Q learning. C++ sproget, som Arduino-programmering er baseret på, har (mig bekendt) ingen biblioteker til matrice-manipulationer, så det meste foregår manuelt. Fx initialiseres matricen med 10-taller a la:

for(int i=0; i<36; i++){ 
   for(int j=0; j<4; j++){ 
      Q[i][j] = 10.0; 
   } 
}

For hver tidsskridt gennemgår robotten en cyklus fra:

  1. state (s, start state),
  2. select action,
  3. get reward (baseret på afstandsmåler),
  4. go to state’ (s’, efterfølgende state),
  5. update Q.

Belønningerne i Q opdateres med en reward PLUS et vægtet gennemsnit af alle fremtidige forventede højeste belønninger. Fordelen er, at en action, som måske i sig selv er ufordelagtig (giver negativ belønning), kan vinde, fordi de efterfølgende actions giver en stor belønning. De fremtidige forventede belønninger bliver dog vægtet med gamma^n (n=trin), så jo senere belønningerne ligger, desto mindre betydning får de.

I koden ser opdateringen af Q sådan ud:

sample = r + gamma*lookAheadValue; 
Q[s][a] = Q[s][a] + alpha*(sample - Q[s][a]);

r er den reward, som afstandsmåleren giver for den action, som har fundet sted. Her er r afstanden i cm, som robotten har flyttet sig fra s til s’.
“lookAheadValue” giver den højest mulige belønning i state’, som findes i Q. I denne værdi er inkorporeret de efterfølgende forventede belønninger. På den måde kan systemet se fremad.
Alpha er learning-rate mellem 0 og 1, som afgør i hvor hurtigt systemet skal inddrage belønning OG de fremtidige forventede belønninger, mens Gamma afgør i hvor høj grad de fremtidige forventede belønninger skal inddrages.

[youtube https://www.youtube.com/watch?v=SfK9kOaqj6c?rel=0]

Under forløbet vil værdierne i Q ændres til nogle er meget fordelagtige, andre det modsatte:

Epsilon er sandsynligheden for om robotten vælger en tilfældig action eller en optimal action. Ved epsilon = 1 vælges kun tilfældige actions.

Epsilon aftager eksponentielt med tiden, hvorfor robotten bruger en epsilon-aftagende strategi, dvs. den begynder med at vælge tilfældige actions (random(0,4)), men vælger efterhånden de bedst mulige actions (aMax). Den går fra exploratorisk politik til at udnytte (exploitation) den bedste politik:

epsilon = exp(-float(t)/explorationConst);

Hele koden kan findes her. Stor tak til Andrew August, som har skrevet koden.

Next: 1) Variere gamma. 2) Udvide Q til dobbelt antal states. 3) Når antallet af actions og states udvides, kan Q ikke opdateres hurtigt nok, og skal i stedet approximeres vha. neurale netværk.

Udgivet i Arduino, Maker | Skriv en kommentar

Mikroskop i nyt lys

Jeg har opgraderet et gammelt lys-mikroskop med et digitalt kamera og en Raspberry Pi zero W (RPi 0w).

Der findes nok adaptere, som kan sætte en smartphone på mikroskopet eller en forstørrende linse direkte på smartphonens kamera. Så hvorfor sætte en Raspberry Pi med kamera på mikroskopet?

Hvorfor? Fordi jeg kan!, sekundært fordi Pi er en billig computer med wifi, som børnene nemt kan se skærmbilleder fra.

Lysmikroskopet fik lys gennem en ekstern glødelampe, som skulle lyse på et lille spejl under mikroskopet. Spejlet har jeg pillet af og erstattet med en hvid LED, serieforbundet til en 1kOhm modstand. LED’en er sat fast med gaffa.

Blænden på mikroskopet var rustet fast, den har jeg erstattet med et potentiometer (variabel modstand), som kan skue op og ned for lysstyrken på LED’en.

Her viser Raspberry Pi en af sine svagheder. Der er ingen analoge indgange til at modtage signalet fra potentiometer. Jeg kunne måske finde en løsning med noget PWM.

I stedet har jeg forbundet en Arduino Nano, som blot får strøm (5V) fra Pi’en, når denne er tændt. Forsøgte at give strøm fra en GPIO pin, så jeg kunne tænde og slukke Nano’en, men Pi’ens pins giver åbenbart kun 3,3V, hvilket er for lidt til en Nano.

Raspberry Pi’en bor i en kasse, som egentlig er til en Arduino Uno, men som passer godt i størrelse til Pi’en. Den er sat fast på mikroskopet med velcro og en plastikstrip, og er forbundet til et kamera, som startes fra et python-script, modificeret herfra: http://www.stuffaboutcode.com/2013/09/raspberry-pi-run-raspivid-with-python.html

På billederne ses krystaller af fint salt, uden og med baggrundsbelysning fra LED:

     

Forbindelser:

RPi 0W

Arduino Nano

 Andet

5V (GPIO4)

Vin

GND (GPIO6)

GND

 potentiometer, LED

A3

potentiometer

9

LED


Python-script på Raspberry Pi 0W:

import os
import subprocess
import threading
import time

RASPIVIDCMD = ["raspivid"]
TIMETOWAITFORABORT = 0.5

#class for controlling the running and shutting down of raspivid
class RaspiVidController(threading.Thread):
    def __init__(self, timeout, preview, otherOptions=None):
        threading.Thread.__init__(self)
        
        #setup the raspivid cmd
        self.raspividcmd = RASPIVIDCMD

        #add file path, timeout and preview to options
        self.raspividcmd.append("-t")
        self.raspividcmd.append(str(timeout))
        if preview == False: self.raspividcmd.append("-n")

        #if there are other options, add them
        if otherOptions != None:
            self.raspividcmd = self.raspividcmd + otherOptions

        #set state to not running
        self.running = False
        
    def run(self):
        #run raspivid
        raspivid = subprocess.Popen(self.raspividcmd)
        
        #loop until its set to stopped or it stops
        self.running = True
        while(self.running and raspivid.poll() is None):
            time.sleep(TIMETOWAITFORABORT)
        self.running = False
        
        #kill raspivid if still running
        if raspivid.poll() == True: raspivid.kill()

    def stopController(self):
        self.running = False

#test program
if __name__ == '__main__':

    #create raspivid controller
    vidcontrol = RaspiVidController(100000, True, ["-f")

    try:
        print("Starting raspivid controller")
        #start up raspivid controller
        vidcontrol.start()
        #wait for it to finish
        while(vidcontrol.isAlive()):
            time.sleep(0.5)

    #Ctrl C
    except KeyboardInterrupt:
        print ("Cancelled")

    #Error
    except:
        print ("Unexpected error:"), sys.exc_info()[0]

        raise

    #if it finishes or Ctrl C, shut it down
    finally: 
        print ("Stopping raspivid controller")
        #stop the controller
        vidcontrol.stopController()
        #wait for the tread to finish if it hasn't already
        vidcontrol.join()
        
    print ("Done")

Arduino kode:

int ledPin = 9;      // LED connected to digital pin 9
int analogPin = 3;   // potentiometer connected to analog pin 3
int val = 500;         // variable to store the read value

void setup(){
  pinMode(ledPin, OUTPUT);   // sets the pin as output
}

void loop()
{
  val = analogRead(analogPin);   // read the input pin
  analogWrite(ledPin, val / 4);  // analogRead values go from 0 to 1023, analogWrite values from 0 to 255
}

Udgivet i Arduino, biologi, Elektronik, Raspberry Pi | Skriv en kommentar

Bedre end rundbold

Jeg hader rundbold. 25 mennesker står og kigger og “gør sig klar”, mens 2-3 stykker er aktive.

I år bygger mine elever EV3 mindstorms-robotter i stedet. Konkurrencen er inspireret fra Lego’s eget materiale, som jeg så på et besøg hos MV Nordic, Odense.

Konkurrence: Byg en robot, der kan bevæge sig så langt som muligt i én retning på 1 minut, UDEN at bruge hjul eller andre runde klodser. Underlag = gulvet i lokalet.

Når alle har fået kontakt mellem EV3 klodsen og App’en på ipad, kører konkurrencen a mindst to runder på præcis ca. 15 minutter.

En af de gode ting ved konkurrencen er, at eleverne kan bygge på mange forskellige måder -der er mange måder at indbygge fremdrift. Åbenheden i Lego-systemet blomstrer:

Jeg havde håbet, at opgaven også kunne være en introduktion til brug af “loops“. Her valgte eleverne selvfølgelig det åbenlyse, at give motorer kommandoer om at lave flere omdrejninger, fremfor at loope på en omdrejning.

Må prøve at omdefinere opgaven til noget, som kræver et loop, men stadig indeholder åbenhed.

Overhørte en elev fortælle om et setup, hvor man bygger en robot, som kan holde sig inden for en afmærket bane, og så hurtigt som muligt skubbe nogle klodser ud ad banen.

[youtube https://www.youtube.com/watch?v=Q7M1v5lJwPI?rel=0]

Udgivet i Digital Dannelse, Elektronik, EV3 Mindstorms, Maker | Skriv en kommentar

Innovation i AT

Mit første (og sidste) AT forløb med innovation. Det er fantastisk og meget problematisk.

Det er med en ret dygtig klasse. Vi arbejder sammen med Vand&Affald, kommunens renovationsselskab. Det er der mange gaver i. Vand&Affald kommer med problemstillingerne, som for det meste drejer sig om klimaforandringer, og Vand&Affald skal hjælpe med at vurdere de løsninger, som eleverne foreslår.

Og eleverne er ret motiverede og kommer op med mange gode forslag både til problemfelter og løsninger. Faskiner, klima-venlig kost, turbiner i kloakrørene, efterafgrøde i rensningsanlæg og pant på affald er nogen af buddene.

De fleste af løsningerne er der andre, som har arbejdet på før, men det kigger vi på senere i forløbet, når innovationhøjden skal vurderes. Og små skridt kan også være vejen til en samlet klimaløsning.

Derimod er det ganske håbløst at få problemer og løsninger til at passe ind i de traditionelle gymnasie-fag. Også selv om vi har udvidet vores fagrække, med alle de fag, som vi to lærere dækker. Og det er unaturligt, at problemfelterne i dette forløb skal passe ind i snævre fag-rammer. Så det har vi valgt, at se ret stort på i dette forløb.

Yderligere har eleverne svært ved at arbejde fagligt, når rammerne er så løse. Selv om det er en dygtig klasse, kan jeg se, at meget af tiden går med at finde på mærkelige navne til deres koncept og prøve forskellige praktiske koncepter af. Det kan der være meget læring i, men nogle gange sker det i stedet for at læse sig til grundlæggende viden om problemfeltet.

I den konsulent-rolle jeg har i forløbet, ligger jeg ikke inde med lærebøger om alle de mærkelige afkroge eleverne bevæger sig. “Søg på nettet”, “spørg bibliotekaren” giver noget, men det er rigtig svært, at finde relevante kilder på et passende niveau om dette og hint.

Vi kunne selvfølgelig vælge en strammere ramme. Med et givent problem, som vi ved rammer ind i noget grundlæggende faglighed. Og vi kunne lægge en stram tidsplan med del-aflevering af diverse logbøger og udkast.

Det har vi ikke gjort, hvilket jeg fortryder lidt. At styre tid, herunder research og produkt, er en stor del af projektarbejdet, men skal nok have en strammere progression, selv om det er en dygtig klasse.

Innovation er en gave, som skal ud i fagene, hvor det kan spille bedre sammen med fagligheden. Det er synd, men innovation uden faglighed er meningsløst, og den eneste faglige ramme jeg kan tilbyde er inden for mine fag.
Måske kunne man i naturvidenskab arbejde med at innovere på forsøgs-opstillinger, og på den måde få innovations-kompetencer koblet med den naturvidenskabelige metode. Det kunne blive en traditionel vej at gå, ligesom “formidlings-vejen” efterhånden er blevet det i innovation med humaniora.

Jeg er spændt på elevernes evaluering, specielt mht. de frie rammer og motivation.

“Tire Flip” by Jason Edward Scott Bain – http://www.flickr.com/photos/jasonbain/3912616899/in/set-72157594385306593/. Licensed under CC BY 2.0 via Wikimedia Commons – https://commons.wikimedia.org/wiki/File:Tire_Flip.jpg#/media/File:Tire_Flip.jpg

Udgivet i innovation | Skriv en kommentar

Streaming til YouTube

En gang imellem har jeg fundet det nyttigt, at streame. Fx slippe for at overføre timers video fra harddisk til web, følge en proces (forsøg eller 3D-print), vise et demo-forsøg på projektoren, virtuel undervisning eller transmittere en begivenhed fx åbent hus.

Dette er ikke en komplet guide, da teksten i så faldt, ville blive temmelig omfattende.

Forsøg og begivenheder:
App’en “Live Now” streamer nemt fra Ipad til Youtube. En adresse og en kode, skal hentes fra videoadministration i YouTube og ind i app’en, og så håber man, at det ikke er malware -det har det ikke været endnu.
(Serverwebadressen er formentlig generisk, men streamnøglen er højst personlig)

YouTube-streamet kan indstilles til privat, skjult eller offentligt, og indlejres på fx en hjemmeside.

Fjernundervisning:
Jeg har i den forbindelse brugt OBS studio til at have mit eget skærmbillede, webcam og lyd på streamet. Og vil prøve at tilslutte en anden monitor og køre med udvidede skærme, hvor jeg kan styre OBS og Lectio m.m. på den ene, og streame den anden.

Jeg brugte YouTubes indbyggede chat-funktion med eleverne. Som så ofte er det dem, der har mindst brug for hjælp, som skriver mest.

Raspberry Pi:
En tredje mulighed for streaming er via Raspberry Pi 3. Jeg sloges nogle uger med den for at få installeret styresystem (Rasberian via NOOBS) og få skærmbillede. Et problem var, at en HDMI-adapter til VGA, ikke er et entydigt produkt, og jeg måtte igennem tre, før systemet nogle gange valgte en opløsning, så jeg kunne få et skærmbillede.

Derefter prøvede jeg lidt med styresystemet motioneyeOS, som er særligt til streaming. Det virkede ok, indtil jeg, med venners hjælp, fandt frem til hvordan IP-strukturen er sat op herhjemme. Min PI får ikke en unik IP-adresse, som jeg kan tilgå udefra.

Men jeg tænkte, at det måtte være muligt at sende mit video-signal til en server fx via OBS studio, og derfra sende det ud på www.

PI’en skal sættes op med trådløst netværk, kamera og ffmeg, som jeg mener fungerer a la OBS, og konverterer videoen og sender streamet videre til YouTube. Framerate, vinkel, m.m. kan indstilles. Der er dog ingen lyd med i streamet.

Dertil har fundet den autoexecute-fil, som Raspian starter op på, og tilføjet en kommando, så streamet starter efter boot-up.

Pointen er at jeg ender med en PI, som bare skal have strøm fra en mobiloplader eller lille powerbank, hvorefter den begynder at streame video via det trådløse netværk til YouTube 🙂

Udgivet i Maker, Raspberry Pi, Uncategorized | Tagget , | Skriv en kommentar

DIY micro:bit buggy

DIY har mange grader. Jeg har endnu ikke udvundet mit eget kobber, men bygget en buggy baseret på micro:bit, inspireret af de mange Arduino-baserede tohjulede buggy’s, som findes. Fx denne:

Basic robot.jpgBy SimonwilmotEget arbejde, CC BY-SA 3.0, Link

Hverken Arduino eller micro:bit giver strøm nok til de gule DC motorer, som mange af robotbilerne bruger. Derfor skal bruges et board eller skjold. Fx et motorboard eller L298N. Her er brugt L298N.

Simpelt kredsløb:

Det kræver et connector (breakout-)board at lave kredsløbet.

Bemærk at både Boardets “0V” og batteriboksens sorte ledning, skal forbindes til GND på L298N. De fleste forbindelser kan skabes med hun-hun kabler:

Alle dele monteres fx som:

De pins som styrer om motorerne drejer, og hvilken vej, ses her. De styres af digitale signaler, som kan have værdien 0 eller 1 (tændt eller slukket).

Motorerne kører på max eller ingen omdrejninger. Husk at der skal være jumpers på pin EnA og EnB på L298N -det er de sorte “hatte” i de gule cirkler nedenfor.

Koden (JavaScript) for en motor-test, som kører fremad, bagud, drej til den ene side, drej til den anden side, stop:
pins.digitalWritePin(DigitalPin.P13, 0)
pins.digitalWritePin(DigitalPin.P14, 1)
pins.digitalWritePin(DigitalPin.P15, 0)
pins.digitalWritePin(DigitalPin.P16, 1)
basic.pause(2000)
pins.digitalWritePin(DigitalPin.P13, 1)
pins.digitalWritePin(DigitalPin.P14, 0)
pins.digitalWritePin(DigitalPin.P15, 1)
pins.digitalWritePin(DigitalPin.P16, 0)
basic.pause(2000)
pins.digitalWritePin(DigitalPin.P13, 1)
pins.digitalWritePin(DigitalPin.P14, 0)
pins.digitalWritePin(DigitalPin.P15, 0)
pins.digitalWritePin(DigitalPin.P16, 1)
basic.pause(2000)
pins.digitalWritePin(DigitalPin.P13, 0)
pins.digitalWritePin(DigitalPin.P14, 1)
pins.digitalWritePin(DigitalPin.P15, 1)
pins.digitalWritePin(DigitalPin.P16, 0)
basic.pause(2000)
pins.digitalWritePin(DigitalPin.P13, 0)
pins.digitalWritePin(DigitalPin.P14, 0)
pins.digitalWritePin(DigitalPin.P15, 0)
pins.digitalWritePin(DigitalPin.P16, 0)

Supplér evt. med passende pile/billeder i 5×5 displayet.

Styre hastighed:
Ovenfor et simpelt kredsløb, idet pin EnA og EnB på L298N ikke anvendes (se ovenfor). Når disse to pins bruges og forbindes med særlige pins på micro:bitten, kan de styre omdrejningstallet, gennem et analogt signal (værdi mellem 0 og 1023).

Hvis hastigheden skal styres kan kredsløbet fx se sådan ud. Husk at fjerne jumper-hattene på pin EnA og EnB (ses ikke på tegningen):

Og forbindelserne skal stilles til:

* = værdi mellem 0 og 1023.

L298N har en pin, som tilsyneladende leverer 5V. Flere steder advarer mod at bruge den som strømforsyning til micro:bit, selv om det er fristende.

Kode, som får buggy til at accellerere til max og derefter stop. Vigtigt at give analoge pins besked, før de digitale:
basic.showIcon(IconNames.Snake)
for (let index = 0; index <= 1023; index++) {
index += 10
pins.analogWritePin(AnalogPin.P0, index)
pins.digitalWritePin(DigitalPin.P13, 0)
pins.digitalWritePin(DigitalPin.P14, 1)
pins.analogWritePin(AnalogPin.P1, index)
pins.digitalWritePin(DigitalPin.P15, 0)
pins.digitalWritePin(DigitalPin.P16, 1)
basic.pause(100)
}
pins.digitalWritePin(DigitalPin.P13, 0)
pins.digitalWritePin(DigitalPin.P14, 0)
pins.digitalWritePin(DigitalPin.P15, 0)
pins.digitalWritePin(DigitalPin.P16, 0)

Test:
[youtube https://www.youtube.com/watch?v=p7ggtb3eix8?rel=0&w=853&h=480]

Hvis de to motorer ikke kører samme vej, byttes om på to ledninger. Hvis de ikke kører lige hurtigt (som i videoen), kan kompasset evt. bruges til at korrigerer. Buggy’en kan udbygges med afstandsmåler eller Bluetooth-styring eller begge dele.

Mere inspiration kan hentes her.

Udgivet i Maker, Micro:bit | Skriv en kommentar

Micro:bit buggy-mod

Micro:bit kan bl.a. kombineres med et kit, til en line-follow buggy. Af en eller anden grund synes jeg ikke den er så sjovt, måske fordi der ikke findes linjer på de virkelige veje.

Her et mod, der bruger motor-boarded fra kittet med en ultra-sonic afstandsmåler, som kun kræver 3V.

Sådan kører den:
[youtube https://www.youtube.com/watch?v=U6d-IQ7FQis?rel=0]

Plotter-funktionen er en fin og enkelt måde at illustrere data. Dog er jeg bekymret for om koden er for indviklet til børn. Måske kan den “Sonic Package”, som Owen Brotherwood har vist, en mere spiselig løsning.

Næste skridt: Afstandsmåleren er som sædvanligt lidt usikker. Jeg kunne lægge flere filtre ind i koden fx tage snit af 10 måler eller bedre medianen af fem målinger.

Kunne være sjovt at styre buggyen med mobilen eller en anden bit.

Hvorfor skulle H-bridge boarded L298N ikke virke med bit? Må prøves.

Koden fra pxt IDE’et:
let item = 0
basic.forever(() => {
pins.digitalWritePin(DigitalPin.P8, 0)
pins.digitalWritePin(DigitalPin.P12, 1)
pins.digitalWritePin(DigitalPin.P0, 0)
pins.digitalWritePin(DigitalPin.P16, 1)
basic.pause(100)
pins.digitalWritePin(DigitalPin.P1, 1)
basic.pause(1)
pins.digitalWritePin(DigitalPin.P1, 0)
item = pins.pulseIn(DigitalPin.P2, PulseValue.High)
led.plotBarGraph(
item,
5000
)
if (item < 400 && item > 10) {
pins.digitalWritePin(DigitalPin.P8, 1)
pins.digitalWritePin(DigitalPin.P12, 0)
pins.digitalWritePin(DigitalPin.P0, 0)
pins.digitalWritePin(DigitalPin.P16, 1)
basic.pause(1000)
}
})
item = 0

Udgivet i Maker, Micro:bit | Skriv en kommentar