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 | Tagget , | 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.

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.

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.

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:

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:

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

Byg en drone

I år har vi bygget droner. Selv om lovgivningen har gjort det ganske svært, at flyve dem udendørs, er der stadig nogle muligheder.

Vi er en lille håndfuld elever og tre kolleger.

Da vi intet vidste om droner, har vi været på SDU til deres “drone bygge kursus”. Det kan anbefales. Derefter har vi bestilt tre samlesæt, hvor ALT er inkluderet. Controller, batteri, oplader m.v. fx dette:

Pris p.t. ca. 200 USD + told (20%) og afgift = 160,-. kilde: AliExpress
Søg fx på “drone diy kit” på Amazon, Ebay eller Aliexpress.
Det er nok en god ide at bestille lidt ekstra af de vigtigste dele: motorer, propeller, ESC’er, da de er lette at smadre.

Eneste ekstra del vi har savnet er en kontakt, så man let kan slå batteriet til og fra:

Det kræver noget tålmodighed og et par forsøg, at samle og kalibrere alle delene:

Men det kan også være temmelig hyggeligt:

Her er en nogenlunde fornuftig rækkefølge:
1. Samle kroppen. Montere og forbinde motorer, modtager og GPS.
https://youtu.be/zU3Wf2iX7OU
2. Hvor skal hver motor sidde og hvilken propel skal der på?
http://ardupilot.org/copter/docs/connect-escs-and-motors.html
3. Binde controller og modtager
https://www.youtube.com/watch?v=3nTh7FBiSlw
4. Hente og installere Mission Planner (latest). http://firmware.eu.ardupilot.org/Tools/MissionPlanner/
5. Start Mission Planner, Initial Setup: Wizard, som er:
a. evt. Install firmware (hvis første gang ArduPilot tages i brug). AC3.2.1
b. Connect (Windows: COM-port + Mega 2560. Mac: USB(?). Baudrate: 115200),
c. Initial setup, Mandatory hardware
6. Kalibrere motorer og ESC’ere: http://ardupilot.org/copter/docs/esc-calibration.html
7. Arm motorer ved at holde vesntre stick i nederste højre hjørne i 5 sekunder.

I stedet for det stel, som er i kittet, skal vi prøve at bruge to pinde og nogle skruer til at designe vores eget stel.

Vi vil 3D-printe et stativ, som skal bære sensorer under dronen. Vægt er et issue, så en Arduino Nano+SD-kortlæser skal nok stå for dataopsamlingen.

Første flyvetur stillede vi dronen uden for et vindue, og os selv inden for vinduet, og gav den lidt gas. Motorer, propeller, skruer og andet kan falde af. Desuden kan motorerne ikke være rigtigt kalibreret, hvilket kan bevirke, at dronen flyver ukontrollabelt.

Vores næste flyvetur, skal være i hallen. Vi stiller os ind i et omvendt håndboldmål, og har resten af hallen til flyveplads.

Udgivet i Arduino, Maker | Skriv en kommentar

Elektronisk LEGO

Micro:bit er en god introduktion til computer og elektronik for de 9-15 årige. Da mange af de yngste også leger med Lego, er det oplagt, at kombinere Lego med Micro:bit.

Og noget af det sjoveste imo ved computer science, er at styre motorer. Fx en servo-motor, som her skal bruges til en katapult. Det er Micro:bit ikke ideel til, bl.a. fordi en motor ofte kræver mere strøm end micro:bit kan levere. Men det kan lade sig gøre fx via et motor-breakout board.

Her vil jeg dog i stedet give motoren strøm fra et eksternt 9V batteri, så boarded er ikke nødvendigt. Og når batteriet alligevel er fremme, kan det lige så godt give strøm til Micro:bit, selv om denne max tåler 5V. Jeg giver den 3,3V.

For at komme fra 9V til 3,3V bruger jeg en volt-regulator (efter råd af Martin Lilliendal), som giver en fast spænding, men også et vametab: LM1117T-3.3. Men strøm kan også leveres til bitten via USB eller 2xAAA batterier og til servoen via 9V batteri -gør kredsløbet noget enklere.

Jeg har forbundet via pin connectors/jumper wires:
        
Men forbindelser kan næsten lige så vel skabes med krokodillenæb eller bedre ved lodning.

Kredsløb:

Det er afgørende, at Micro:bit ikke får 9V! Så mål evt. spændingen med et multimeter på den sorte og røde ledning, som går til Micro:bit.

Den ene knap (A) skal lade katapulten til en vagfri vinkel (jo længere tid der trykkes, desto længere går armen ned), og den anden knap (B) skal affyre.

Det er ikke den aller nemmeste kode, og ej heller kredsløb, så projektet er ikke velegnet til de mindste. Men ændres koden, så servoen blot drejer til to fastsatte vinkler, er det noget nemmere.

Kode bygget i pxt miljøet: show leds, er ikke nødvendigt.

JavaScript:
let angle = 10
basic.forever(() => {
while (input.buttonIsPressed(Button.A)) {
pins.servoWritePin(AnalogPin.P0, angle)
basic.pause(10)
angle = angle + 1
}
while (input.buttonIsPressed(Button.B)) {
angle = 10
pins.servoWritePin(AnalogPin.P0, angle)
basic.pause(100)
}
})

Udgivet i Maker, Micro:bit | Skriv en kommentar