Detta är del 3 av 4 i vår genomgång av programmeringsspråket Scratch.

Innehållsförteckning till genomgången hittar du här.

I detta inlägg går Jack-Benny Persson från Cyberinfo Sverige igenom hur man kan använda scratch för att räkna på Ohms lag.

Denna gång ska vi göra ett program i Scratch som hjälper oss att räkna ut Ohms lag. Oroa dig inte ifall du inte vet vad Ohms lag är för något, vi kommer att gå igenom det också.

Vi kommer att lära oss en mängd nya saker denna gång. Dels kommer vi lära oss grundläggande ellära, dels kommer vi fortsätta våra äventyr med programmering. Denna gång kommer vi lära oss bland annat vad funktioner är för något och hur dessa kan hjälpa oss när vi programmerar.

Även om du inte har något intresse för ellära kan du ändå lära dig programmeringen som vi kommer att gå igenom här. Så oroa dig inte ifall du inte finner Ohms lag eller ellära intressant för just dig, du kommer ändå kunna följa med och programmera.

Ohms lag & grundläggande ellära

Ohms lag beskriver förhållandet mellan spänning, ström och resistans.

Spänning mäts i enheten volt och betecknas U på kopplingsscheman. I våra svenska hushåll har vi exempelvis 230 volt i vanliga eluttag. Ett bilbatteri är på 12 volt och ett AA-batteri är på 1,5 volt. Spänningen finns alltid där, även om vi inte har en sluten krets.

Ström mäts i enheten ampere och betecknas I på kopplingsscheman. Ström uppstår när en krets skapas och elektronerna börjar röra på sig. Man kan likna det vid en vattenslang. Även när munstycket är stängt finns vattnet där (spänningen), men när vi öppnar munstycket flödar vattnet (ström uppstår). Det är en förenklad förklaring men det duger gott till vårt ändamål.

Resistans är motståndet i elektriska komponenter, så som exempelvis glödlampor. Men framförallt brukar vi tänka på resistorer när vi talar om resistans. Resistorer är en komponent vars enda uppgift är att skapa resistans, eller motstånd. Resistans mäts i enheten ohm och betecknas R på kopplingsscheman. Man använder ofta omega-symbolen Ω för att beteckna ohm.

Nu när vi har ett hum om dessa storheter kan vi först titta på ett enkelt kopplingsschema och sedan en enkel skiss där vi föreställer oss motståndet som en glödlampa och spänningskällan på 12 volt som ett bilbatteri. Därefter kikar vi på formlerna för att räkna fram de olika värdena. Att visualisera nya koncept brukar öka förståelsen.

En enkel krets

En enkel krets

+12V och GND i bilden ovan representerar vårt batteri. R1 är ett motstånd, eller en resistor som det egentligen heter, på 50 ohm. Nedanför har vi istället ritat upp det med verkliga objekt, som bilbatteri och en glödlampa. Här visar vi också hur strömmen flödar genom kretsen.

Vår krets, nu med ett bilbatteri och en glödlampa

Vår krets, nu med ett bilbatteri och en glödlampa

Ohms lag

Eftersom vi har en spänning på 12 volt och en resistans på 50 ohm får vi att strömmen som flödar i kretsen är på 0.24 ampere. Detta får vi genom I = U / R. I vårt fall blir detta 12 / 50 = 0.24 ampere.

Eftersom vi nu vet hur många ampere som rör sig i kretsen kan vi också räkna på andra hållet. Låt oss säga att vi enbart hade känt till strömmen och spänningen, men skulle vilja veta resistansen. Då får vi formeln R = U / I som i vårt fall blir 12 / 0.24 = 50 ohm.

Och om vi istället endast hade känt till strömmen och resistans, men skulle vilja räkna fram spänningen får vi formeln U = R * I som i vårt fall blir 50 * 0.24 = 12 volt.

Det är just dessa tre formler som utgör förhållandet mellan spänning, ström och resistans och kallas för Ohms lag.

Ohms lag

Ohms lag

Skulle vi klippa av en ledning i bilden ovan så skulle vi fortfarande ha 12 volt mellan punkter +12V och GND, men ingen ström skulle längre flöda i kretsen.

Dags att programmera

Det här kommer bli vårt största program vi skapat hittills i denna artikelserie om Scratch. Och just eftersom programmet kommer att bli relativt stort så kommer vi att dela upp programmet i mindre delar. Det är precis så här man gör för att få sina program mer lätthanterliga. Istället för att ha ett riktigt stort program som är svårt att överskåda och göra ändringar i, så delar man upp det i mindre delar. Varje del kallar man för en funktion. Vi kommer alltså att skapa våra helt egna funktioner här. I Scratch kallar man funktioner för block, vilket är ett riktigt bra namn. Vi har ju redan sett en lång rad färdiga block i Scratch, till exempel say-block, divisions-block, set [] to []-block och så vidare. Nu kommer vi att skapa våra helt egna block!

Vårt program kommer därför bestå utav en huvuddel och tre separata block. Dessa separata block kommer innehålla formlerna för Ohms lag. Ett block per formel. Både huvuddelen och de tre blocken kommer att skapas på samma yta i Scratch. Om du tittar på bilden här nedanför så ser du att ingen av delarna är speciellt stor eller komplicerad.

Så här ser hela programmet ut när det är klart

Så här ser hela programmet ut när det är klart

Det här är huvuddelen av programmet

Det här är huvuddelen av programmet

De egna blocken vi kommer att skapa

De egna blocken vi kommer att skapa

Huvudprogrammet

Vi börjar med huvudprogrammet. Läs gärna igenom En introduktion till Scratch för en genomgång av hur Scratch fungerar och var de olika delarna finns i programmet.

  1. Som vanligt börjar vi med att dra ut ett startblock i form av ett when [flag] clicked-block.
  2. Därefter behöver vi ett ask and wait-block (finns under Sensing) för att katten ska fråga oss vad det är vi vill räkna ut. Koppla detta på startblocket och skriv frågan i rutan som på bilden över huvudprogrammet ovan.
  3. Därefter växlar vi till Data och skapar en variabel som vi döper till svar. Dra sedan ut ett set [] to []-block och sätt blocket till variabeln svar. I den vita rutan sätter vi ett answer-block som finns under Sensing.
  4. Nu växlar vi till Control och drar ut tre styck if then-block. Koppla samman alla dessa på rad och koppla ihop dem med resten av koden.
  5. Nu behöver vi tre styck likhets-block ([ ] = [ ]) som finns under Operators. Placera ett sådant block i varje if-block’s vita ruta som på bilden över huvudprogrammet.
  6. På vänster sida av alla likhetstecken sätter vi nu variabeln svar som vi hittar under Data. På andra sidan likhetstecknet skriver vi i det första if-blocket “resistans”, i det andra “spänning” och i det tredje “ström”.

Tre nya block

Nu har vi hela logiken klar i själva huvudprogrammet. Nu är det dags att skapa de tre blocken (kallas funktioner i andra programmeringsspråk) som ska utföra själva beräkningarna.

Gå till More Blocks och klicka på knappen Make a Block. Nu får du upp en ny ruta med ett litet lila block med en markör i. Skriv in namnet på blocket i rutan och klicka på ok. Som namn på det första blocket väljer vi här “resistans”. Nu får du ett nytt block med samma form som startblocket för själva huvudprogrammet. Detta markerar att det är starten för vår funktion, eller block som det heter i Scratch. Flytta det nya resistans-blocket till sidan om huvudprogrammet. Du kan välja att placera det vart du vill, men jag brukar lägga dem sidan om huvudprogrammet.

Tre egna block

Tre egna block

Skapa nu ytterligare två nya block och döp dem till “spänning” och “ström”. Du ska nu ha sammanlagt tre nya block. Under More Blocks ska du nu också se dina tre nya block, resistans, spänning och ström som på bilden till höger. Placera nu dessa tre nya block inuti if-blocken. Börja med resistans i det övre if-blocket, och sedan spänning och till sist ström. Titta på bilden ovan över huvudprogrammet var jag har placerat mina nya block.

Nu när vi har kommit så här långt är det dags att fylla våra nya block med innehåll. Just nu innehåller de ingenting och ingenting kommer att hända om vi försöker köra våra nya block. Precis som med startblocket för huvuddelen av programmet kommer vi nu att bygga på de nya blocken med innehåll.

Första egna blocket, resistans

Vi börjar med resistans-blocket och tar det steg för steg.

  1. Växla till Sensing och dra ut två styck ask [] and wait-block samt två styck answer-block.
  2. Växla till Data och dra ut två styck set [] to []-block och sätt den ena till variabeln u och den andra andra till variabeln i. Dra in ett answer-block i vardera set [] to []-block.
  3. Koppla ihop det ena ask [] and wait-blocket med starten av blocket och skriv “Ange spänningen” i den vita rutan.
  4. Koppla på blocket som heter set u to answer till blocket ovan.
  5. Sätt det andra ask [] and wait-blocket under ovanstående och skriv “Ange strömmen” i rutan.
  6. Koppla ihop blocket set i to answer till blocket ovan.
  7. Växla nu till Looks och dra ut ett vanligt say-block. Växla sedan till Operators och dra ut två styck join-block och och ett styck divisions-block. Växla därefter till Data och dra ut en u- och och en i-variabel.
  8. Sätt nu ihop delarna från punkt 7 enligt nedan bild.

    Formeln i Scratch för resistans

    Formeln i Scratch för resistans

Resterande block

Gör likadant med de resterande blocken men byt ut variablerna, divisions-blocket och texterna enligt översiktsbilden ovan över de tre egna blocken. När du väl är klar med alla tre blocken är vårt program klart och det är dags att testköra.

Testkörning av programmet

Klicka på flaggan ovanför katten för att starta programmet. Om allt har gått vägen kommer katten att fråga “Vad är det du vill räkna ut? Resistans, ström eller spänning?”. Skriv ett av dessa alternativ i rutan, exempelvis “ström”, så att vi kan följa exemplet från bilderna med bilbatteriet och glödlampan.

När vi angett “ström” kommer första if-blocket i huvuddelen av programmet att vara sann och därmed kommer vårt egentillverkade ström-block att köras. Nu kommer därför katten att fråga: “Ange spänningen”. Skriv här 12 (för 12 volt) så att vi fortsätter följa vårt lampexempel. Nästa fråga från katten kommer att bli “Ange resistansen”. Skriv här 50 (för 50 ohm). Nu kommer programmet att räkna ut strömmen åt oss och katten kommer att säga att “I = 0.24 ampere”.

Förbättringar av programmet

Vårt program vi precis har skapat är inte perfekt på något sätt. Det finns flera olika sätt vi skulle kunna förbättra vårt program på. Exempelvis om man inte svarar varken “ström”, “spänningen” eller “resistans” just nu, så kommer ingenting att hända. Programmet kommer bara tyst att avslutas. Här skulle man kunna lägga in en kontroll för att se vad användaren anger, och om det inte är något av dessa tre kommer programmet att ge instruktioner för vad man kan ange som giltiga svar. För att detta ska bli riktigt bra behöver vi här använda oss av if else-block istället för vanliga if-block. Ett exempel på en sådan lösning visas här nedanför.

If-else-block med ett standardval ifall användaren skriver fel värde

If-else-block med ett standardval ifall användaren skriver fel värde

Varför vi måste använda if else-blocken ovan är för att alla valen måste “hänga samman”. Om du tittar på vårt originalprogram så är alla if-blocken fristående, men här hänger de samman i en lång slinga. Det innebär att om det första if-blocket inte är sant, fortsätter den till nästa (om man läser det uppifrån och ner blir det else if, vilket är precis så som det skrivs i många andra programmeringsspråk). Är detta inte heller sant fortsätter programmet till nästa, ända tills det inte finns något kvar mer än else som då är programmets enda utväg. Här på det sista else-blocket skriver programmet ut att endast värdena resistans, ström eller spänning är giltiga.

Skulle något av de andra if-blocken bli sanna, till exempel redan vid “resistans”, så avbryts hela if-slingan. Inga andra if-block som “hänger samman” kommer då att köras. Hade det inte varit så, så skulle ju texten “Var god ange endast resistans, ström eller spänning” alltid ha skrivits ut på skärmen, även om vi har angett helt rätt värden.

Modifiera gärna ditt program genom att byta ut de vanliga if-blocken mot dessa if else-block istället enligt bilden ovan.

Ytterligare förbättringar och utmaningar

Hade det inte varit perfekt om programmet loopades om och om igen utan att avslutas varje gång vi var klara med en uträkning? Då hade vi kunnat räkna ut formel efter formel utan att behöva starta programmet varje gång. Det blir din utmaning att införa denna förbättring!

Python-versionen av det förbättrade programmet

Här nedan visas Python-versionen av det förbättrade programmet vi gjorde ovan med de nya if else-blocken. Som du ser nedan är även detta programmet likt vårt Scratch-program. Till och med hur man definierar nya funktioner, eller block som det heter i Scratch. Om du tittade extra noga på Scratch-programmet såg att du säkert att starten av blocken hette “define resistans” för resistans-blocket. Även i Python använder man nyckelordet define, fast i förkortad form, def. Istället för else if använder man förkortningen elif i Python för att få if-blocken att “hänga samman”.

#!/usr/bin/env python3

# Funktionerna, eller "blocken"
def resistans():
    u = float(input("Ange spänningen: "))
    i = float(input("Ange strömmen: "))
    print ("R = " + str(u/i) + " ohm")

def spanning():
    r = float(input("Ange resistansen: "))
    i = float(input("Ange strömmen: "))
    print ("U = " + str(r*i) + " volt")

def strom():
    u = float(input("Ange spänningen: "))
    r = float(input("Ange resistansen: "))
    print ("I = " + str(u/r) + " ampere")


# Huvuddelen av progammet
svar = input("Vad vill du räkna ut? Resistans, ström eller spänning? ")

if (svar == "resistans"):
    resistans()
elif (svar == "spänning"):
    spanning()
elif (svar == "ström"):
    strom()
else:
    print("Var god ange endast resistans, ström eller spänning")

Länkar

Mitt egna Ohms lag-program finns offentligt på Scratch för den som vill använda det som mall för vidare experiment. Kopiera gärna (Remix-knappen längst upp till höger) och experimentera och modifiera programmet! Det är ofta så man lär sig programmera när man är ny, att peta och ändra på andras program.