Big Data i biologi

En måde at inddrage IT i biologi, kan være at introducere eleverne til Big Data (indsamling af store mængder data) f.eks. ved at placere en CO2-sensor i et eller flere klasselokaler i en uges tid hen over vinter. De mange data er intet værd uden analyse, og måske et kig i skemaet kan afsløre nogle sammenhænge og give en efterfølgende diskussion om overvågning kontra sundhedsfremme.

Nogle gange er data så mangfoldige, at de kan være svære at analysere for et menneske. Et datasæt fra Wisconsin beskriver tolv forskellige egenskaber ved celler og væv fra over 600 kvinder med en knude i brystet [1]. Det er også registreret om knuden efterfølgende har vist sig god- eller ondartet.

Speciallæger diagnosticerer hvorvidt en knude virker god- eller ondartet ud fra vævs- og celleprøver, og det er de ret gode til. Ifølge et studie får de ret i 96,5% af tilfældene [2].

Der findes også ganske avancerede computermodeller, som kan forudsige om en knude er god- eller ondartet ud fra lignende vævs- og celleprøver. Modellerne kaldes kunstige neurale netværk, og består af en række matematiske operationer, som alt i alt ligner virkemåden i et bundt interforbundne neuroner.

Et studie viser, at computermodellerne kan forudsige om en knude er god- eller ondartet med 97,1% sandsynlighed [2], altså lidt bedre end speciallægerne. Man kan så diskutere, hvem der skal have skylden, når modellen tager fejl.

Jeg har lavet et udkast til en opgave [3], som introducerer eleverne til sådan en model. Der er rigtig mange tal i modellen, og derfor overordentlig stor risiko for, at eleverne kun ser en black box, som de kender fra andre smarte værktøjer, og ikke forstår hvad der foregår. For at mindske den risiko, har jeg lavet en række forsimplinger f.eks. af de tolv egenskaber, som findes i datasættet, arbejder jeg kun med fem tilfældigt valgte:

Yderligere har jeg valgt at bruge den simplest mulige neuralt netværk-model, selv om det ikke er den bedste [4]. Modellen (en perceptron) består af en lineær kombination af vægtede data, som tilsammen forudsiger om knuden er god- eller ondartet. Vores opgave er at finde de vægte (wi), som ud fra de kendte data (xi), bedst får forudsigelser og resultater til at stemme overens. For hver patient, hvor modellen forudsiger forkert, justerer vi vægtene en lille smule.

Hvordan bliver det til en opgave for eleverne? På en god dag, kan eleverne være med til at opstille modellen eller dele af modellen fra bunden. Jeg har valgt at arbejde i Excel [5], fordi alle elever (hos os) har programmet, og fordi det ikke kræver egentlig programmering.

Derefter skal eleverne træne modellen, ved at gennemgå den cyklus ovenfor igen og igen -flere gange på hele datasættet. Her kan makro’er evt. hjælpe med gentagelserne. Eleverne skal holde øje med fejlraten, som skal minimeres, og evt. justere på læringsraten, som er en konstant, der er med til at afgøre, hvor meget vægtene skal ændres, når modellen tager fejl.

Når vi har trænet modellen til at finde de bedste vægte, kan det være interessant at se på hvilke af de fem egenskaber modellen vægter højere end andre. F.eks. ser tilbøjelighed til celledelinger ud til at være mindre afgørende for om en knude er god- eller ondartet, mens knudestørrelse er meget afgørende ifølge modellen.

Opgaven kan stadig finpudses f.eks. ved at prøve med andre eller alle 12 af de egenskaber, som findes i datasættet. Arbejder man sammen med en matematiklærer, giver lidt mere avancerede modeller mulighed for at arbejde med differentialregning og matricer, men det har jeg udeladt her.

Betyder det, at speciallæger skal omskoles til psykologer? For det første klarer computermodellerne sig kun en smule bedre end speciallægerne. For det andet stiller speciallæger assisteret af modeller den rigtige diagnose i 99,5% af tilfældene [2]. Måske er det sådan, at vi skal tænke på kunstig intelligens fremover.

Kilder:

  1. https://www.mathworks.com/matlabcentral/answers/uploaded_files/17053/Wisconsin%20Diagnostic%20Breast%20Cancer.xlsx
  2. Beck et al. ”Deep Learning for Identifying Metastatic Breast Cancer” arXiv:1606.05718v1 [q-bio.QM]  18 Jun 2016
  3. https://drive.google.com/open?id=0B2OKliO0YqClcHBBNHplSmtralU
  4. Noel et al. ”Using Machine Learning Algorithms for Breast Cancer Risk Prediction and Diagnosis” Procedia Computer Science 83 (2016) 1064–1069
  5. https://drive.google.com/open?id=0B2OKliO0YqClN2Q4TVJYdFNSSEU

Dette indlæg er/bliver også bragt i BioFag.

Udgivet i biologi, bioteknologi, Digital Dannelse | Skriv en kommentar

Fjol med intelligent robot

Jeg har fjollet lidt mere med en robot, som lærer via Q-learning, der baserer sig på data (maskinlæring). Dens udfordring er at lære de bevægelser, som ikke i sig selv giver belønning:

  1. løfte grabben
  2. føre grabben fremad
  3. sænke grabben

Derefter bliver der adgang til de trin, som giver en stor belønning:

4. Føre grabben tilbage, og dermed skubbe robotten fremad.

1. Tro på fremtiden:

Variation i gamma-værdierne, som afgør i hvor høj grad robotten, skal tage hensyn til fremtidige potentielle belønninger. Da miljøet i fremtiden, kan se anderledes ud end det gør lige nu, nedreguleres fremtiden med en faktor gamma i n’de (n=trin):

gamma = 0,75: nær optimalt, kommer hurtigt i mål

gamma = 0,25: robotten kommer kun langsomt fremad

Det kan undre, at robotten i dette setup, hvor miljøet er meget konstant, klarer sig dårligt med gamma = 1 (ikke vist). Den litteratur jeg har set bruger også altid gamma<1.

2. Go deep:

Hver motor i grabben kan bevæge sig i 6 states, dvs. der er 6*6=36 states i alt. Arduino UNO løber tør for plads, hvis jeg øger antal states til 8 for hver servo. Dvs. der er kun plads til meget få typer af bevægelser med Q-learning.

I stedet for Q learning, har jeg forsøgt deep Q-learning, dvs. lave et dybt neuralt netværk, som kan funktions-approksimere fra motorernes stadier til belønnings-værdier, i stedet for at finde dem ud fra en erfaringstabel (Q-tabel).

Input er to vinkler, en fra hver servo, og output er en approksimeret Q værdi. Hver knude (firkant nedenfor) har desuden et konstantled (bias, v3, x3 og y3). Jeg har sat det nok simplest mulige dybe netværk (2×2) op i Excel med en logistisk funktion (f) som virker på en vægtet sum i hver knude (firkant):

2×2 ANN

Netværket skal selvfølgelig trænes på eksisterende Q-værdier fra robotten. Alle input og Q-værdier skal normaliseres til mellem 0 og 1. Error (målt Q-værdi minus approksimeret Q værdi) ligner differentialkvotienten på cost-funktionen (samlet afvigelse fra forventning, ofte sum af error^2).

W-værdierne justeres ud fra: (error*input til knuden*learning rate). Gradient Descent ville måske øge sandsynligheden for at opnå de globalt bedste w-værdier.

Jeg har oprettet nogle macro’er i Excel til at lave træningen til hurtigere. Første macro udfører en gange træning, ved at justere w’erne, når den løber hele datasættet igennem een gang. 10x træning kalder første makro 10 gange, mens 100xtræning kalder forrige macro 10 gange.

Det har endnu ikke været muligt at træne netværket til at forudsige realistiske Q-værdier. Kunsten for netværket er at finde systemet, som vist i de fire punkter ovenfor (løft, grab frem, sænk..). Men alle de approksimerede Q-værdier går hurtigt mod den samme værdi. Måske fordi:

  • Netværket er ikke dybt (antal hidden layers) eller bredt (antal knuder i hvert lag) nok.
  • Netværket har ikke trænet længe nok. Måske skal der 10000 træninger til. Det tager tid at gøre i Excel, så en del af svaret er at skifte til fx TensorFlow.
  • Data har været ret svære at opnå, bl.a. fordi afstandsmålingen ikke altid slår igennem på Q værdien. Derfor har jeg selv lavet nogle data.
  • Jeg har ikke data nok. Jeg har lavet en Q-værdi for hver state og action = 36*4=148, hvoraf de fleste er 10 (initialiserings-værdien). Dvs. der er rigtig mange ens Q-værdier.
  • Jeg har måske lavet en fejl i netværket 🙂
  • Data er ikke adskillelige, og netværket vil derfor aldrig komme til et stabilt sæt af w’er, fordi netværket ikke er dybt nok.
  • Learning rate er for stor eller lille. I et andet system, kunne den ændres fra stor (0,5) mod lille (0,001), efterhånden som summen af fejl mindskes.

Jeg har set en anbefaling på at bruge deep Q learning til at forfine bevægelser, frem for at prøve hele spektret af states og actions af.

Det kunne måske også være relevant at koble lagene sammen i et recurrent netværk, da grabbens bevægelser er i en tids-sekvens. Recurrent tilføjer netværket en form for hukommelse ligesom traditionel Q-learning.

Det har vist sig overordenlig svært, at finde det rette setup. TensorFlow eller PyTorch giver måske mulighed for at teste forskellige netværk og antal træninger, da der ikke ser ud til at være en metode til at forudsige en god tilgang. Pga. Excel har jeg måtte bruge det simplest mulige.

Hvordan skal vi så have en chance for at give eleverne indblik i maskinlæring, hvis feltet er så specialiseret og utilgængeligt?

Udgivet i Arduino, Digital Dannelse, Elektronik, Maker | Skriv en kommentar

Mål for 2017-18

Hvordan gik det med målene for 2016-17:

  • Arbejde med Mindset og blive mere erfaren mht. innovation og projektarbejde. Det fik jeg ikke gjort meget ved. Jeg var med i et At-forløb med innovation. Det var godt, men svært at få indpasset i stx’s læreplaner. Mindset ligger mere som en tanke i mig, end som en metode jeg bruger aktivt.
  • Undersøge om Coding Pirates giver mening for mig (os). Deltage som frivillig i Odense ihvertfald i en periode. Jeg besøgte coding pirates een gang, hvilket var meget inspirerende. Turen til Odense er dog ikke praktisk muligt på ugentlig basis. Til gengæld har vi lavet noget om robotter og micro:bit for børn i Svendborg af to omgange (vist 8 torsdage i alt).
  • Opsøge legekammerater i ML, CP og MS. Det er svært både for mig og andre, at få tid til at lege.
  • Bruge mindre tid på styresystemer og platforme -det er kedeligt legetøj. Det er lykkedes nogenlunde.
  • Kost og motion. Floorball i Ollerup? Kostomlægning? Det fik jeg ikke gjort.
  • Bruge passende tid på sociale medier, og lidt mere tid på at kigge ud i luften. I perioder. Men telefonen er svær at lægge væk.

Mål for 2017-18:

  • Arbejde videre med machine learning og kunstig intelligens.
  • Arbejde hen i mod at supplere til uv kompetence i informatik. Begynde kurser sommer 2018.
  • Lave flere forløb om robotter, programmering og ML.
  • Lave motion 30 minutter på ugentlig basis. Alene eller med andre.
  • Holde øje med mit timetal, så arbejde ikke fylder for meget.
  • Blive bedre til 3d printing.
  • Lave mere for børn om robotter, hvis der er overskud.
  • Kunne være sjovt, at prøve at lave et podcast.
Udgivet i planlægning | Skriv en kommentar

Sommerskole 2017

I modsætning til de forrige år, kom jeg hjem fra 2 dages sommerskole 2017 uden nyt legetøj :-(. Jeg er mere erfaren?

En stor tak herfra til Peter Eduard og Karin Høgh for planlægning og lån af udstyr, herunder Peters store LaserCutter. Og tak til Heine for lån af Bork Efterskole.

 

Mine takeaways:

Mice and Mystics. Samarbejds-brætspil for børn. Nok fra 10 år? Der er meget engelsk og mange regler.

Hackerkonference på Bornholm, som afholdes årligt. Vist nok fokus på IT sikkerhed. https://bornhack.dk/bornhack-2017/. Tip via Asbjørn.

Hummingbird, MCU til børn, som er nemmere at gå i gang med end Arduino. Farvekoder og mere plug-n-play. Findes også i en version med en Arduino på bagsiden. Hummingbird er nogle år gammel og koster ca 500 kr. vs. Arduino-kloner til 20 kr.

En billig begynder 3D printer. Virker out-of-the-box. Kassen er i plastik. https://printm3d.com/themicro/ 200 USD dvs. der kommer told og transport oveni. Printer emner på ca. 10x10x10 cm, hvilket er rigeligt i mange sammenhænge. Fik flere advarsler mod Sculpto. Tips via Mikkel fra TalentAkademiet i Sorø.

En anden billigere begynder 3D printer: Hobbyking: 3d printer: https://hobbyking.com/en_us/mini-fabrikator-v2-3d-printer-silver-eu-plug.html. Den skal samles selv, printer også ca. 10x10x10 cm, men koster lidt mindre (ca. 170 €). Kassen er i metal. Da sendes fra GB, er told vist mindre. Den er p.t. i restordre og har været det  siden marts. Tip via Tom fra CFU Sjælland.

Learn to mod https://www.learntomod.com/. Et tilkøb til MineCraft, som gør modding mere kreativt, men stadig nemmere end at skrive al koden selv. Til børn. Tip via Peter Leth fra LærIT.

Teenage engineering. Tip fra Mia. Programmerbar enhed, som vist er et programmerbart musikinstrument og en spilkonsol. En lille sjov microcontroller dedikeret til musik og spil. https://teenage.engineering/products/po

Et gennemgående samtaleemne var programmet Fusion 360 fra AutoDesk, som vist er en lidt mere tilgængelig udgave af tegneprogrammet Inventor (også fra AutoDesk). Det er gratis. Tegninger i 2D til Lasercutter laves som sketches. Ved tegning til 3D print kan tegningerne extruderes til 3d. Heine er en af mestrene. Hans YouTube-kanal: Autodesk Fusion 360 – Byg kasse med tapper (lasercut).

Mini LaserCutter

Jeg er meget misundelig på Heines mini Lasercutter til en 4-5000,- så vidt jeg husker. Den fylder ikke meget mere end en blækprinter og kan skære i emner på ca. A4 størrelse. Forhandles af www.eduard.dk.

Når man har tegnet noget i Fusion 360, som skal 3D printes, kan programmet Blender.org lægge yderligere teksturer på tegningen. Særligt til brætspils-props fx. musten, træ, døre og vinduer m.m. Elementer, som det vil tage laang tid at tegne fra bunden i Fusion. Dog har Blender en stejl læringskurve. Tip via Asbjørn.

Blev mindet om at Fable kan lånes gratis i 30 dage. Særligt er, at den kan styres via en dongle, som kan styre flere robotter samtidig. Desuden et Lego-modul, så den kan bygges sammen med.. Lego. Den adapter, som samler robottens led, kan købes for 30 kr. Dvs. den kan moddes meget billigt. Er alligevel forbeholden overfor det lidt lukkede system.

CNC-fræser

Danmarks måske største CNC-fræser blev luftet. Det er vist Peters.

Næste sommer er Bork Efterskole optaget af ombygning, så sommerskolen 2018 bliver formentlig i Vordingborg med Tom fra CFU Sjælland som koordinator.

Hjemmesiden er (vist) fortsat http://sommerskole.mrsnet.dk/

Udgivet i Elektronik, Maker | Skriv en kommentar

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.

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 | 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