Teknologi og programmering#

Læringsutbytte

Etter å ha arbeidet med dette temaet, skal du kunne:

  1. lage enkle programmer på en micro:bit

  2. bruke knapper, radio og sensorer på micro:bit

  3. illustrere hvordan sensorer fungerer ved å bruke micro:bit

Teknologi i et bærekraftig perspektiv#

Utvikling og bruk av teknologi lider av et dårlig rykte i miljøsammenheng. Støy, giftige utslipp, \(CO_2\)-utslipp og avfall er noen av problemene med bruk av teknologi og teknologiproduksjon. Men i tillegg til å være et potensielt miljøproblem kan teknologi også være en av løsningene mot en bærekraftig framtid med nok energi og ressurser til å dekke alles grunnleggende behov. Ikke minst kan teknologi hjelpe til med å rette opp i feil vi har gjort. Plastfangere kan samle inn avfall i havet. Sporere og kamera kan hjelpe til med å kartlegge det biologiske mangfoldet slik at vi kan sette inn tiltak der det trengs. Intelligente avfallsanlegg sorterer ulike plasttyper slik at de kan gjenvinnes fornuftig med minst mulig energitap.

Sett i et større perspektiv er det ikke teknologien som er et problem, det er menneskene bak den. Dermed blir gode valg og fornuftig bruk av teknologi essensielt for å sikre en bærekraftig framtid for alle.

Programmering med mikrokontrollere#

Vi kan utforske programmering i en teknologisk sammenheng gjennom mikrokontrollere. En mikrokontroller er en liten datamaskin i én enkel integrert krets. Den viktigste komponenten i en slik krets, er transistorene. Det er disse som styrer strømmen av informasjon gjennom en datamaskin. “Hjernen” i en datamaskin kalles for en CPU (Central Processing Unit) og består i dag av flere hundretalls millioner transistorer (ja, de er små!).

En transistor fungerer som en slags bryter og kan representere 0 (av) eller 1 (på). Det vil si at alt vi programmerer, må oversettes til et språk datamaskinen forstår, og det er et språk som består av kun 0-er og 1-ere. Dette tallsystemet kalles det binære tallsystemet eller totallsystemet. Men det hadde vært tungvint å programmere en datamaskin ved å kun gi den instruksjoner med 0 og 1. Heldigvis er moderne programmeringsspråk enklere å bruke fordi et program som kalles en kompilator oversetter dem til binær kode.

Det finnes mange ulike mikrokontrollere: Arduino, Raspberry Pi og micro:bit er noen av de mest kjente. Det finnes utrolig mye utstyr til disse mikronkontrollerne, og de har til dels ganske kraftige prosessorer. Spesielt gjelder dette Arduino og Raspbery Pi. Micro:bit har en del lavere kapasitet, men den er til gjengjeld veldig enkel å bruke. Disse mikrokontrollerne skal vi lære oss å programmere.

Introduksjon til micro:bit#

Micro:bit blei designa av det britiske selskapet BBC i 2014 for å lære britiske ungdommer programmering. De blei sendt ut gratis til britiske grunnskoler i 2016, og den ideelle foreningen Lær kidsa koding har i samarbeid med Vitensentrene og Sparebankstiftelsen sendt ut micro:bit til grunnskoler over hele Norge.

Det går an å programmere micro:bit med blokkbaserte kodesnutter. Blokkbasert koding baserer seg på å flytte ferdigdefinerte blokker i en logisk rekkefølge slik at et program fungerer. Det går også an å programmere dem i Python (eller JavaScript). Vi skal se på både blokk og tekst (Python) her.

Elektronikken#

Vi starter med å se litt på hvordan micro:bit-en er bygd opp:

Vi ser følgende komponenter på figuren:

  1. USB-tilkobling: Her kobles micro:bit med en USB til en datamaskin når vi skal programmere den.

  2. LED-lys: 25 LED-lys utgjør en slags “skjerm” på micro:bit-en.

  3. Knapper: A-knappen og B-knappen kan programmeres til å styre sekvenser på micro:bit-en.

  4. Innganger: Det finnes 5 hovedinnganger for tilkobling av eksternt utstyr, merka med 0, 1, 2, 3V og GND (ground = jording).

  5. Batteriinngang: Her kobles batteripakka på to AA-batterier (2 x 1,5 V) til.

  6. Omstartsknapp: Starter programmet på micro:bit-en på nytt.

  7. Radio og Bluetooth: Liten innebygd antenne som blant annet kan brukes til å kommunisere mellom to enheter.

  8. Prosessor: Norskprodusert lettvekterprosessor med svært lavt strømforbruk. Lav hastighet, men har også integrert midlertidig minne (RAM) og lagringsminne (flash).

  9. Kompass og akselerometer: Måler retning, posisjon og akselerasjon i de ulike retningene. Integrerte sensorer som en kan hente data fra.

Vi kommer til å bruke all denne elektronikken i prosjektene vi skal se på seinere. Men la oss først se litt på hvordan vi kan programmere i både blokk og med Python.

Grunnleggende programmering#

Med blokkspråket til micro:bit kan vi definere variabler slik:

Disse blokkene velges fra menyer, og legg merke til at de har “puslespillender”. Det betyr at vi må ha en blokk uten “knagger”, slik som gjenta for alltid-blokka (utføres hele tida) eller ved start-blokka (utføres når micro:bit startes opp) som vi kan putte andre blokker inni. Programmet ovenfor lager en variabel a som den lagrer verdien 0 i, for deretter å legge til 1 i variabelen. Den tilsvarende Python-koden for dette kan skrives slik:

a = 0
a = a + 1

Vilkår kan programmeres slik med blokker:

I dette programmet settes variabelen til 10. Deretter testes det om tallet er mindre enn eller større enn 0. Hvis tallet verken er større eller mindre enn 0, må det være null, og det er det siste som inntreffer hvis de andre ikke inntraff. Merk at her skrives ikke noe ut, men teksten vises på “skjermen” av LED på micro:bit-en. Dette kan vi få til i Python slik:

from microbit import *

tall = 10

if tall < 0:
	display.scroll('Tallet er negativt!')
elif tall > 0:
	display.scroll('Tallet er positivt!')
else:
	display.scroll('Tallet er 0!')

Micro:bit inneholder en del spesialfunksjoner som vi må importere inn i programmet med linja from microbit import *. Deretter får vi tilgang til all micro:bit-elektronikken, som vi skal se på seinere. Når vi laster dette programmet over på micro:bit-en, ruller teksten over skjermen. Hvis vi vil vise teksten med én bokstav om gangen, bruker vi display.show() isteden.

Løkker kan også enkelt programmeres med blokk. En evig løkke kan lages med en enkelt blokk kalt gjenta for alltid på samme måte som ved start-blokka:

Koden ovenfor er en evig løkke som for alltid viser et hjerte på skjermen. Dette kan skrives slik i Python:

from microbit import *

while True:
	display.show(Image.HEART)

“while True” betyr “så lenge sant” og sant er jo sant så lenge sant ikke blir usant. Dette er nesten litt filosofisk, men sant blir aldri usant av seg selv i datamaskinens verden, så løkka kjører til evig tid. Hvis vi ønsker at løkka skal stoppe, velger vi en annen betingelse for løkka vår, f.eks. slik:

Kodesnutten gir følgende output: 0 2 4 6 8. Merk at løkka her har en annen farge, i tillegg til at den må pusles sammen med en annen brikke. En tilsvarende kode i Python kan være slik:

from microbit import *

partall = 0
while partall < 10:
	display.show(partall)
	partall = partall + 2

Nå har vi raskt vært innom grunnleggende programmeringskonsepter i både blokk og tilsvarende Python-kode. La oss nå begynne å bruke dette for fullt på micro:bit-en!

LED-skjermen#

LED-lampene på micro:bit-en kan vi bruke til å vise eller rulle tekst over en slags skjerm. Vi har sett på noe av det før, men la oss kort oppsummere gjennom et kodeeksempel.

from microbit import * 

while True:
	display.show(Image.GHOST)
	display.scroll('Du er kul!')

I blokk kan vi gjøre f.eks. som nedenfor. I tillegg kan du enkelt tegne hvilke LED-er som skal lyse. Dette kan du også gjør i Python, men det er litt mer komplisert, så det skal vi ikke vise her (men du kan enkelt finne det på internett!).

Prøv å forstå hva programmet ovenfor gjør. Du kan programmere pause i Python ved å skrive display.pause(1000), der det som angis i parentes, er pausen i kjøringen gitt i antall millisekunder. Skjermen kan tømmes ved å skrive display.clear().

Underveisoppgave

Lag et Python-program som gjør omtrent det samme som blokkprogrammet ovenfor.

Knapper#

Siden micro:bit har to knapper, kan vi bruke disse til å styre beslutninger og sette i gang prosesser. Det kan en enkelt gjøre i blokk slik:

Her kan vi selvfølgelig bytte ut knapp A med knapp B, og vi kan også angi at knapp A + B skal trykkes samtidig. I Python kan vi gjøre det slik:

from microbit import *

while True:
    if button_a.is_pressed():
        display.scroll('A')
    elif button_b.is_pressed():
        display.scroll('B')
    elif button_a.is_pressed() and button_b.is_pressed():
        display.scroll('AB')
    sleep(1000)

Underveisoppgave

Lag et program som gjør et eller annet (f.eks. tegner en figur eller viser en tekst) når du trykker på én eller flere knapper.

Det fins også mulighet for å telle antall trykk, f.eks. ved å skrive antall = button_a.get_presses(). Hvis vi da trykker på A-knappen 4 ganger, blir verdien til variabelen antall lik 4.

Radio#

Det er ganske enkelt å sette opp micro:bit til å sende og motta informasjon. Nedenfor er et enkelt blokkprogram som sender en melding:

Det meste ovenfor er kanskje enkelt å forstå, men radio sett gruppe er litt spesiell. Den oppretter en kanal mellom 0 og 255 slik at mange micro:bit-er kan kommunisere sammen uten at det blir kollisjon i meldingene. Et tilsvarende program vil i Python kunne se slik ut:

from microbit import *
import radio  # Importerer radio-funksjonaliteten

radio.on()  # Slår på radioen
radio.config(group=42) # Setter kanalen/gruppa til 42

while True:
    if button_a.is_pressed():
        radio.send('Hei!')
        display.scroll('SENDT')
    elif button_b.is_pressed():
        melding = radio.receive()
        display.scroll(melding)

Underveisoppgave

Lag et program som sender en beskjed eller et hemmelig tall til en annen micro:bit.

Eksterne tilkoblinger (pins)#

Det er egentlig veldig mange måter en kan feste ting til en micro:bit på. Inngangene heter “pins”, og det er flere av dem enn du først kanskje antar. Bildet nedenfor illustrerer mulighetene for tilkobling:

Vi skal konsentrere oss om utgangene som er formet som store, runde hull (0, 1, 2, 3V og GND).

Spenning, strøm og resistans#

La oss først repetere litt om spenning, strøm og motstand (resistans). Spenning er den elektriske potensielle energien mellom to punkter. Det vil si at desto høyere spenning, desto høyere potensiell energi er det f.eks. mellom to ladninger. Høy potensiell energi kan føre til bevegelse, f.eks. av ladninger som elektroner. Når slike ladninger beveger seg, får vi strøm.

Spenning

Spenning, U, er elektrisk potensiell energi mellom to punkter og måles i V (volt).

Strøm

Strøm, I, er antallet ladninger som passerer et visst punkt hvert sekund og måles i ampere (A).

Siden spenning får elektroner til å bevege seg, kan det ses på som et slags “elektrisk trykk”. Desto høyere trykk, desto flere elektroner går igjennom en leder (f.eks. en kobbertråd/ledning), altså får vi en høyere strøm av elektroner.

Noe som kan hindre en slik strøm av ladninger, er motstand. En elektrisk leder har lav motstand. Dette er typisk for metaller, f.eks. kobber og gull. Dette er fordi det er metallbinding mellom metallatomene. Du husker kanskje at dette er en binding der atomene deler på alle elektronene i en “elektronsjø”? Siden elektronene er så udefinert bundet, kan de lett flytte på seg. Det vil si at en spenning lett lager en strøm av elektroner gjennom et slikt metall.

Plast, porselen og tre er eksempler på materialer som ikke leder strøm godt pga. liten mulighet for elektronflyt gjennom kovalente bindinger. Vi sier at disse materialene har høy resistans. Når vi kobler elektriske kretser, ønsker vi ofte å sette inn ulike motstander for å ikke få for høy strøm gjennom de elektriske komponentene våre. Disse motstandene ser ofte slik ut i småelektronikk:

Resistans

Resistans, R, er motstand mot strøm i en elektrisk krets og måles i ohm (\(\Omega\)).

Lese av og skrive til eksterne tilkoblinger#

For å sette spenning på pins, og/eller lese av spenningen, kan vi i blokk gjøre slik:

Her skrives verdien 1 til P0. Når vi skriver digitalt, betyr det at vi enten setter strømmen på (1) eller av (0). Det vil si 0 V eller 3 V. Hvis vi vil variere strømmen mellom disse verdiene, må vi bruke “skriv analog” isteden. Når vi setter på analog strøm, kan vi variere ved å sette verdien mellom 0 (0 V) og 1023 (3 V).

I den andre linja i programmet leses analogverdi fra P1, dvs. at det leses av en verdi mellom 0 og 1023 og lagres i variabelen spenning. Hvis vi f.eks. har kobla pin0 med pin1 med en motstand imellom, kan vi lese av spenningen mellom pin-ene. Husk derimot at 1023 ikke betyr 1023 V, men 3 V!

Vi skal konsentrere oss om pin0, pin1 og pin2 + GND. Pin-en som er merka med 3V er litt spesiell, så den skal vi kun bruke hvis vi må. I Python-kode kan vi lese av og sette på strøm slik:

from microbit import *

while True:
	pin0.write_digital(1)
	spenning = pin1.read_analog()
	display.scroll(spenning)

Legg derimot merke til at Python-funksjonene som brukes, kan gi en helt annen følsomhet og spenning enn blokkene! Det er altså ikke 100 % samsvar mellom de ulike måtene å kode på og elektronikken.

Vi kan også sende strøm igjennom kroppen (!) ved hjelp av f.eks. pin0.is_touched. Hvis vi da tar på pin0 og GND samtidig (lukka krets), aktiveres denne funksjonen. Blokkprogrammet nedenfor viser en beskjed når du gjør nettopp dette:

Underveisoppgave

Lag programmet ovenfor i Python.

Sensorer#

En elektrisk sensor er et instrument som tolker et elektrisk signal om til en størrelse vi ønsker å måle. En temperatursensor kan for eksempel sende strøm gjennom en leder, for eksempel en platinatråd. Ved høye temperaturer øker motstanden i en slik leder, og det vil dermed være mer strøm som kommer igjennom tråden ved lave temperaturer. Hvis vi måler spenningen som har gått tapt, kan vi dermed oversette dette til temperatur. Men dette krever kalibrering.

Kalibrering er en prosess som kreves for alle sensorer. Det vil si å måle (minst) to kjente størrelser. F.eks. kan temperatursensoren vår ovenfor testes i isvann. Dette vannet holder 0 \(^\circ\)C. Vi leser av spenningen i dette vannet. Deretter tester vi i kokende vann (100 \(^\circ\)C) og leser av spenningen der også. Disse to spenningene utgjør målepunkter vi er sikre på, også kan vi anta at spenningen er lineær mellom disse to punktene (og kanskje utenfor også?).

La oss si at vi setter på en spenning, måler strømmen og regner om til resistans (\(U = RI\)). Vi sier at resistansen ved 0 \(^\circ\)C var 100 \(\Omega\) og resistansen ved 100 \(^\circ\)C var ca 140 \(\Omega\). Vi trekker en rett linje gjennom disse punktene, og hvis vi f.eks. neste gang leser av 120 \(\Omega\), veit vi at temperaturen er 50 \(^\circ\)C. Dette vil ikke stemme for alle temperaturer, og vi sier at sensoren har et lineært gyldighetsområde. Derfor står det ofte på sensorer i hvilket intervall sensoren måler korrekt. Figuren nedenfor viser en temperatursensor med gyldighetsområde fra ca. -50 til 300 \(^\circ\)C

La oss nå bruke de innebygde sensorene i micro:bit først, så skal vi prøve å lage egne sensorer litt seinere. Vi kan hente data fra de ulike innebygde sensorene slik:

Akselerasjonen gir akselerasjon i milli-g (\(1 \ g = 9.81 \ m/s^2\)) i x-, y- eller z-retning. Kompasset gir retning i grader (360\(^\circ\) er nord, 90\(^\circ\) er øst, osv.). Temperaturen gir temperaturen på prosessoren i \(^\circ\)C, men den er ikke kalibrert, og vil ofte gi for høy temperatur. Men den er grei for å se på enkle temperaturendringer.

I Python kan du gjøre slik:

from microbit import *

while True:
	akselerasjon = accelerometer.get_x()
	kompassretning =  compass.heading()
	temperatur = temperature()

Underveisoppgave

Programmene ovenfor viser ikke variablene på skjermen. Modifiser dem slik at de viser det du måler, f.eks. ved ulike tastetrykk.

Nå har du lært nok til å kunne bryne deg på noen litt mer utforskende og kreative oppgaver. Lykke til!

Oppgaver#

Oppgave 1

Lag et program som logger temperaturen og sender den til en annen micro:bit.

Oppgave 2

Lag et program som teller antall ganger du trykker på en knapp, og viser deg hvor mange ganger du trykker på knappen.

Oppgave 3

Et vaterpass, eller bare vater, er et instrument som måler om noe står eller ligger vinkelrett. Lag ditt eget vater ved hjelp av akselerasjons-sensoren på micro:bit-en. Tips: Det er virkelig vanskelig å få micro:bit-en til å ligge 100 % flatt – prøv med et intervall du synes er greit.

Oppgave 4

Lag en skritteller ved hjelp av akselerometeret.

Oppgave 5

Programmet nedenfor gjør micro:bit om til en krystallkule. Fyll inn og modfiser som du ønsker, og lag dine egne beskjeder.

from microbit import *
import random

svar = [
    "Det er sikkert",
    "Tvilsomt",
    "Mine kilder sier nei",
    "Du har blitt el-overfølsom",
]

while True:
    if accelerometer.was_gesture('shake'):
        display.scroll(random.choice(svar))
    sleep(10)

Oppgave: Overlev på Mars!

Du er ansatt som astrobiolog og har fått ansvar for det eneste drivhuset på Mars. Siden både vann og mat er en begrenset ressurs, må du overvåke systemene nøye for å få mest mulig optimal avling med minst mulig bruk av ressurser. Først får du som oppdrag å lage en fuktighetssensor som måler fuktigheten i jorda.

dyrking på mars

Sensoren du skal lage, baserer seg på at vi kobler to spikere til hver sin pin i en micro:bit. Disse spikerne setter vi ned i jorda. Deretter setter vi på en spenning (pin 0) og måler spenningsfallet (pin 1) som forårsakes av motstanden i jorda.

  1. Hvordan kan måling av strøm/spenning være et mål på fuktighet i jorda?

  2. Foreslå en måte vi kan oversette spenning til prosentvis fuktighet.

  3. Koble en ledning med bananplugg til pin1 og en annen til pin2.

  4. Fest en spiker i den frie enden av hver av bananpluggene med en krokodilleklemme.

  5. Diskuter hvordan du vil kalibrere sensoren, altså vite hva som er høyest og hva som er lavest fuktighet.

  6. Lag et program som:

  • Setter spenning på via pin0.

  • Leser av spenningen via pin1 når du f.eks. trykker på en knapp.

  • Viser spenningen til displayet. Her kan du gjerne oversette spenningen til prosent fuktighet. Spenningen blir gitt som et tall mellom 0 og 1023, der 0 er 0 V og 1023 er 3 V.

  1. Test sensoren på ulike planter med tørr og våt jord. Hva viser sensoren?

  2. Modifiser programmet som du ønsker, f.eks. slik at det:

    • Sier fra når det er for lite vann.

    • Gir tommel opp/smilefjes når det er nok vann.

    • Kommuniserer med en annen micro:bit som fungerer som mottaker.

  3. Ekstra: Koble til en liten motor som setter på vanning når fuktigheten i jorda er under en viss verdi. Dette må legges til i programmet ditt.

  4. Utvid programmet og oppsettet med andre sensorer, for eksempel luftfuktighetssensor og temperatursensor.