Trafikljus

Denna gång ska vi programmera våra egna trafikljus!

Detta inlägg inspirerades av ett trafikljus kitt som finns på Hands-On Science, men det går lätt att samla komponenterna själv.

Du behöver

Material för ett trafikljus:

  • micro:bit (Självklart!)
  • röd LED (3 eller 5 mm storlek funkar bra)
  • gul/orange LED
  • grön LED
  • ”sockerbit” / kopplingslist med 6 positioner (Helst dom som är lite smalare)
  • 2 sladdar med krokodilklämmor

Verktyg:

  • Kabelskalare (eller avbitare/kniv om du inte har)
  • Skruvmejsel (antagligen spår/”dom platta”)

Koppla ihop

En LED har en plus och minus sida. Det finns flera sätt att se vilken är vilken. Det benet som är lite längre är plus sidan. Det finns den plattat sida på LED lampan, vilket visar var minus sidan sitter. Och sist kan man titta noga på hur insidan ser ut. Den biten som är minus är ofta lite större där. Koppla in alla tre LED lampor till kopplingslisten. Det är smidigast om du sätter alla lampor med plus och minus i samma riktning.

Klippa sladden hur det visas på bilden (tagit från Hands-On Science). Detta gör att vi får 4 sladdar med 1 krokodilklämma, och 2 vanliga sladdar.

Så här ska alla minus ben av LED lamporna blir kopplade till en krokodilklämma.

Tvinna ihop änderna på sladdarna så att dom blir en sladd, även på dom som inte är flera sladdar tillsammans. Detta gör att det inte blir små trådar som pekar åt alla håll.

Och på denna bilden är alla sladdar ansluten. Översta  svarta krokodilklämma går till alla negativa ben på LED lamporna och ska anslutas till jord (GND på micro:bit). Dom andra tre går till positiva ben på varje LED lampa och ska anslutas till port 0, 1 och 2 på micro:bit.

Testa med kod

Nu när vi har kopplat alla sladdar så att röda lampan sitter på pin 0, gul på pin 1, och grön på pin 2. Då är det dags att skapa kod som kan styra våra lampor! Ska vi börja med att testa om dom funkar som dom ska?

För att tända en lampa som sitter kopplade till en pin ska vi ”sätta på” den pin, vilket betyder att strömmen (3 volt) går på. Detta gör vi med blocket ”digitalt skriv pin P0 till 1” från kategorin Pins, som gömmer sig under Avancerad. Digitalt i detta fall betyder att strömmen är antingen på (när vi skriver värdet 1) eller av (när vi skriver värdet 0). I följande exempel tänder vi först röd (p0) och släcker dom andra, sen gul (p1), sen grön (p2). Ladda ner det till din micro:bit och testa om alla lampor fungerar. Om någonting inte tänds, kolla om alla sladdar och plus och minus sidorna av lysdioderna stämmer.

basic.forever(() => {
 pins.digitalWritePin(DigitalPin.P0, 1)
 pins.digitalWritePin(DigitalPin.P1, 0)
 pins.digitalWritePin(DigitalPin.P2, 0)
 basic.pause(500)
 pins.digitalWritePin(DigitalPin.P0, 0)
 pins.digitalWritePin(DigitalPin.P1, 1)
 pins.digitalWritePin(DigitalPin.P2, 0)
 basic.pause(500)
 pins.digitalWritePin(DigitalPin.P0, 0)
 pins.digitalWritePin(DigitalPin.P1, 0)
 pins.digitalWritePin(DigitalPin.P2, 1)
 basic.pause(500)
})

Länk till koden.

Styra med knapparna

Nu är det dags att kunna byta mellan grön och röd, och det ska gå till på rätt sätt. Hur ändras färgerna på en riktig trafikljus när det blir rött? Och när det blir grönt? Bygg om din kod så att det börjar med rött ljus, blir grönt när du trycker på A-knappen, och rött när du trycker på B-knappen.

input.onButtonPressed(Button.A, () => {
 pins.digitalWritePin(DigitalPin.P0, 1)
 pins.digitalWritePin(DigitalPin.P1, 1)
 pins.digitalWritePin(DigitalPin.P2, 0)
 basic.pause(1000)
 pins.digitalWritePin(DigitalPin.P0, 0)
 pins.digitalWritePin(DigitalPin.P1, 0)
 pins.digitalWritePin(DigitalPin.P2, 1)
})
input.onButtonPressed(Button.B, () => {
 pins.digitalWritePin(DigitalPin.P0, 0)
 pins.digitalWritePin(DigitalPin.P1, 1)
 pins.digitalWritePin(DigitalPin.P2, 0)
 basic.pause(1000)
 pins.digitalWritePin(DigitalPin.P0, 1)
 pins.digitalWritePin(DigitalPin.P1, 0)
 pins.digitalWritePin(DigitalPin.P2, 0)
})
pins.digitalWritePin(DigitalPin.P0, 1)
pins.digitalWritePin(DigitalPin.P1, 0)
pins.digitalWritePin(DigitalPin.P2, 0)

Länk till koden.

Två trafikljus tillsammans

Nästa steg blir att ha två trafikljus som styrs samtidigt. När det blir grönt på en, ska det blir rött på den andra, och tvärtom. För att får flera micro:bit att prata med varandra kan vi använda deras trådlösa radio funktion. För att se till att alla micro:bit pratar på samma kanal ställer vi in den som grupp i ”vid start” med ett nummer som vi väljer mellan 1 och 255. Sen blir det att när man trycker på A-knappen ska det bli grönt på den första, men bara efter att vi har sagt åt den andra att den ska vara rött (och vi väntar tills den är det). När vi trycker på B-knappen ändrar den första till rött, och sen säger vi till den andra att den får bli grönt.

För att få andra micro:bit att byta färg skickar vi en sträng (textbit) via radio som är antingen ”röd” när den ska bli röd, eller ”grön” när den ska bli grön. När micro:bit mottager strängen finns det två om-satser för att förstå vilket ord vi har fått. I villkoret kollar vi om variablen receivedString är lika med en text. Variabelblocket hittar man i Variabler kategorin, och mörkgula textblocket finns i Text kategorin som gömmer sig under Avacerat. Nya paus-block har lagts till för att vänta tills ena trafikljuset är rött innan andra byter till grön. Testa själv hur lång pauserna ska vara.

input.onButtonPressed(Button.A, () => {
 radio.sendString("röd")
 basic.pause(1500)
 pins.digitalWritePin(DigitalPin.P0, 1)
 pins.digitalWritePin(DigitalPin.P1, 1)
 pins.digitalWritePin(DigitalPin.P2, 0)
 basic.pause(1000)
 pins.digitalWritePin(DigitalPin.P0, 0)
 pins.digitalWritePin(DigitalPin.P1, 0)
 pins.digitalWritePin(DigitalPin.P2, 1)
})
input.onButtonPressed(Button.B, () => {
 pins.digitalWritePin(DigitalPin.P0, 0)
 pins.digitalWritePin(DigitalPin.P1, 1)
 pins.digitalWritePin(DigitalPin.P2, 0)
 basic.pause(1000)
 pins.digitalWritePin(DigitalPin.P0, 1)
 pins.digitalWritePin(DigitalPin.P1, 0)
 pins.digitalWritePin(DigitalPin.P2, 0)
 basic.pause(500)
 radio.sendString("grön")
})
radio.onDataPacketReceived( ({ receivedString }) => {
 if (receivedString == "grön") {
 pins.digitalWritePin(DigitalPin.P0, 1)
 pins.digitalWritePin(DigitalPin.P1, 1)
 pins.digitalWritePin(DigitalPin.P2, 0)
 basic.pause(1000)
 pins.digitalWritePin(DigitalPin.P0, 0)
 pins.digitalWritePin(DigitalPin.P1, 0)
 pins.digitalWritePin(DigitalPin.P2, 1)
 }
 if (receivedString == "röd") {
 pins.digitalWritePin(DigitalPin.P0, 0)
 pins.digitalWritePin(DigitalPin.P1, 1)
 pins.digitalWritePin(DigitalPin.P2, 0)
 basic.pause(1000)
 pins.digitalWritePin(DigitalPin.P0, 1)
 pins.digitalWritePin(DigitalPin.P1, 0)
 pins.digitalWritePin(DigitalPin.P2, 0)
 }
})
radio.setGroup(138)
pins.digitalWritePin(DigitalPin.P0, 1)
pins.digitalWritePin(DigitalPin.P1, 0)
pins.digitalWritePin(DigitalPin.P2, 0)

Länk till koden.

Förenkla & förtydliga

Men oj, vad många pin block som det börjar bli. Att hålla koll på vilka block tänder vilka ljus är inte helt enkelt. Och en hel del av koden har vi nu skrivit flera gånger. Kan vi förenkla koden, så att det både blir lättare att förstå vad den gör, och att det minskar hur många block vi behöver? Visst kan vi det, genom att skapa funktioner. Till exempel så kan vi skapa en funktion för att tända bara röd ljus. Sen kan vi överallt där vi vill visa röd ljus anropa denna funktion. Då kommer koden se ut såhär.

input.onButtonPressed(Button.A, () => {
 radio.sendString("röd")
 basic.pause(1500)
 visaRödOchGul()
 basic.pause(1000)
 visaGrön()
})
input.onButtonPressed(Button.B, () => {
 visaGul()
 basic.pause(1000)
 visaRöd()
 basic.pause(500)
 radio.sendString("grön")
})
radio.onDataPacketReceived( ({ receivedString }) => {
 if (receivedString == "grön") {
 visaRödOchGul()
 basic.pause(1000)
 visaGrön()
 }
 if (receivedString == "röd") {
 visaGul()
 basic.pause(1000)
 visaRöd()
 }
})
function visaRöd() {
 pins.digitalWritePin(DigitalPin.P0, 1)
 pins.digitalWritePin(DigitalPin.P1, 0)
 pins.digitalWritePin(DigitalPin.P2, 0)
}
function visaRödOchGul() {
 pins.digitalWritePin(DigitalPin.P0, 1)
 pins.digitalWritePin(DigitalPin.P1, 1)
 pins.digitalWritePin(DigitalPin.P2, 0)
}
function visaGul() {
 pins.digitalWritePin(DigitalPin.P0, 0)
 pins.digitalWritePin(DigitalPin.P1, 1)
 pins.digitalWritePin(DigitalPin.P2, 0)
}
function visaGrön() {
 pins.digitalWritePin(DigitalPin.P0, 0)
 pins.digitalWritePin(DigitalPin.P1, 0)
 pins.digitalWritePin(DigitalPin.P2, 1)
}
radio.setGroup(138)
visaRöd()

Länk till koden.

 

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *