Obligatorisk oppgave nr. 2

Hva som skal leveres

Fysisk demonstrasjon for din gruppelærer av følgende:

1) Arduino som styrer lysstyrken i en ekstern LED med seriemotstand. Lysstyrken bestemmes av analog spenningsverdi ut fra en sensor med analog utgangsspenning koblet opp som spenningsdeler. Sensor kan være potensiometer, trykksensor, temperatursensor eller annen analog sensor. 

2) Måling av spenning over ekstern LED og sensor med multimeter. 

3) Måling av strøm gjennom ekstern LED med multimeter. 

4) Vise hvordan LEDen flimrer når man kobler fra sensor og berører den frie inngangsledningen med fingrene (statisk støy). 

All kode må lastes opp på Devilry. Det kan bli etterspurt muntlig forklaring av koden.

Frivillig - nyttig og lærerikt

Regler for gjennomføring av obligatoriske oppgaver

Leveringsfrist

Sikkerhet, regler og ressurser

Læringsmål og metode


Oppgave 1

I denne oppgaven kobler vi utgangen av sensoren, her vist for potensiometer, se figur under, til analog inngangspinne A0 på Arduino. Utgangen er den pinnen som står alene på sin side av potensiometeret. Så kobler vi opp en av de andre pinnene på potensiometeret til Arduinos 5V pinne, og kobler så den siste pinnen på potensiometeret til en av Arduinos GND pinner (alle GND pinnene er koblet sammen på kretskortet). På denne måten får vi en variabel spenningsdeler (potensiometeret) som deler ned 5V spenningen til en analog spenningsverdi som blir inngangsignalet til Arduino.

Potensiometer

Så kobler vi en LED i serie med en motstand mellom pinne nr ~6 på Arduino og GND (jord/0V). Motstanden er viktig å bruke da den begrenser strømmen gjennom LEDen. Du finner riktig verdi på motstanden ved å tenke at spenningen over LEDen er 1V når det går strøm. LEDen er ikke bidireksjonal, og må kobles med rett pinne mot GND.

Så skriver du kode som får LEDen til å lyse med en (analog) lysstyrke som du kan justere med å vri på potensiometeret. Bruk analogWrite() for å lage en analog verdi ut fra Arduino. NB: ikke alle pinnene på Arduino fungerer med analogWrite(). De pinnene som fungerer er merket med ~ forran pinnenummeret, og har det vi kaller PWM modus. Pinne ~6 er, for eksempel, grei å bruke med analogWrite().

Dynamisk område. Merk at maks og min verdier fra analogRead() er forskjellig fra analogWrite(). Tenk over hvordan du kan håndtere dette.

Oppgave 2

I denne oppgaven bruker du multimeteret til å måle den analoge spenningen over LEDen og potensiometeret, mens du skrur på potensiometeret (se veiledning).

Oppgave 3

I denne oppgaven bruker du multimeteret til å måle strømmen gjennom LEDen mens du skrur på potensiometeret.

Oppgave 4

Her skal du koble fra potensiometeret. Berør så den frie inngangsledningen med fingrene og se om det påvirker lyset i LEDen. En inngangspinne som ikke er koblet til noe, kan bli påvirket av statisk elektrisitet og støy siden Arduinos inngangsimpedans er veldig høy (mer om dette i analogdelen av kurset).


Frivillig

Visualisere PWM

Arduinos analogWrite() lager ikke et ekte analogt signal, men et høyfrekvent puls-bredde (PWM) kodet signal som kun er 0V eller 5V. Den gjennomsnittlige spenningsverdien varierer med lengden på 5V pulsene, se illustrert i figuren under. Pulsene er i virkeligheten så korte (typisk milli/mikro-sekunder) at man ikke vil oppfatte noe blinking i LEDen, slik at det blir det samme som om man satte på en ekte analog spenning som kan variene slik som illustrert i figuren.

Bildet kan inneholde: azure, plott, skråningen, parallell, font.

Når man måler den "analoge" spenningen med et multimeter, vil ikke multimeteret rekke å reagere på pulsene, viser derfor gjennomsnittsverdien. Vi skal nå bruke et oscilloskop til å se på disse pulsene. Et oscilloskop er raskt nok til å få med seg det som skjer, og vi kan se pulsene på en skjem. På labben har vi et frittstående oscilloskop som vist under. Hvordan man bruker oscilloskopet er beskrevet i labveiledningen og her kan også gruppelærer eller foreleser hjelpe til.

Bildet kan inneholde: medisinsk utstyr, duppeditt, elektronikkteknikk, engineering, medisinsk.

I denne oppgaven tar dere bort LEDen og seriemotstanden. Så kobler dere et oscilloskop til den utgangspinnen på Arduiono som dere kjører analogWrite() til. Klypen på måleproben må kobles til GND og kloen lar man berøre en ledning fra utgangspinnen. Når dere ser firkantpulsene til PWM signalet kan dere justere analog spenning ut av Arduino med å skru på potensiometeret og se hvordan lengden på pulsene varier. Dette gir da en varierende gjennomsnittsverdi som vi refererer til som en "analog verdi".

For de spesielt interesserte:

Hvis dere vil lage et ekte analogt signal fra PWM signalet, kan dere slik som dere har lært i analogdelen av kurset, bruke et lavpass (LP) filter basert på en seriekobling av en motstand og en kondensator. Hvis dere da måler spenningen over kondensatoren med oscilloskopet vil dere se at det firkantede PWM signalet har blitt filtrert til et ekte analogt signal med verdi gitt av gjennomsnittsverdien til PWM signalet. NB: det er vanskelig å få oscilloskopet til å trigge på et analogt signal som er konstant eller sakte varierende, hør med gruppelærer eller foreleser. I figuren under der det vist en simulering av et PWM signal der man øker den analoge verdien lineært. Øverst ser vi PWM signalet, under ser vi signalet etter filterering med et RC filterBildet kan inneholde: rektangel, skråningen, font, parallell, diagram.

Bildet kan inneholde: rektangel, font, skråningen, plott, parallell.

RGB LED stripe

LED-stripen er veldig enkel å bruke. Den har 3 tilkoblingsledninger: GND, 5V power, og signal direkte fra Arduino. Stripen har mange LEDs og vil derfor kunne trekken mye mer strøm enn det Arduino er i stand til å levere. Den er derfor koblet til en separat spenningskilde (er ferdigkoblet). Det eneste dere derfor fysisk trenger å gjøre er å:

1) koble GND (sort ledning i figuren) fra stripen til GND på Arduino,

2) koble signalledningen (gul ledning i figuren) fra stripen til en digital utgangspinne på Arduino, for eksemplel pinne 6.

På hver stang er det 2 separate LED-striper med felles forsyningsspenning. I figuren under er det vist hvordan stripene er koblet opp. Merk at 5V power er allerede ferdig koblet til, og det eneste dere skal gjøre er å koble blå GND og GUL signal-ledning til Arduino. Dere velger ett av parene for å styre en av stripene.

Når dere har koblet til alt, kan dere spørre om hvordan man programmerer en slik LED stripe. Stikkord er NeoPixel, evt. WS2812B. Start med å be om å få et enklest mulig eksempel der man bare setter en LED til en fast verdi. Man kan også be om å ikke få C++ syntaks slik som :: . Når dette virker og om dere forstår koden, kan dere be om å få et nytt eksempel der alle LEDene på stripen blir oppdatert med nye verdier hvert 0.1 sekund med en for-løkke.

Dere kan installere et bibliotek som heter Adafruit NeoPixel i Arduino Library Manager. Tror også biblioteket FastLED kan brukes, og er i såfall litt mer avansert (bedre ytelse?). Dere må så telle hvor mange leds dere ønsker å bruke på stripen og så legge det inn i Arduino-programmet. I C bruker man ofte makroer av typen #define slik som vist i eksempelkoden, dette er for å få bedre oversikt.  Husk på å legge inn en delay() etter at alle LEDene er frisket opp med kommandoen FastLED.show().

Nå er det bare opp til fantasien hva dere kan få LED stripen til å vise.

Ved kø: Vi har bare noen får LED striper på deling slik at hvis mange velger denne deloppgaven kan det bli kø. Derfor har jeg laget en simulator som dere kan bruke til å utvikle lysmønsteret på forhånd. Når dere er fornøyd kan dere overføre koden fra Python til Arduino C for å kjøre mønsteret på virkelige LED stripen.

Trykksensor

Trykksensoren fungerer som en variabel motstand der motstanden er en funksjon av hvor hardt vi trykker på den. Vil man bruke trykksensoren må den seriekobles med en fast motstand med ca samme verdi som motstanden til trykksensoren når den ikke er trykket ned (måles med multimeter). Dette vil på samme måte som et potensiometer, gi en variabel spenningsdeler når dette kobles mellom 5V og GND. Her kan man la LED-stripen vise trykket man presser med, eller la trykket påvirke og generere lysmønstre. Man bruker analogRead() til å lese trykket. 

Temperatursensor

Temperatursensoren kan sees på som en variabel motstand med vedi 100Ohm ved romtemperatur. Denne kan kobles opp som en del av en spenningsdeler og produsere en spenning ut som varierer med temperatur. Her kan man la LED-stripen direkte vise temperaturen.

Mikrofon

Mikrofon med innebygd forsterker. Denne gir ut en analog spenning som er proposjonal med lydstyrken i rommet, og kan leses av direkte med analogWrite(). Her kan man la LED-stripen direkte vise lydnivået i rommet. Er man plaget med mye høyfrekvent støy, kan man ta gjennomsnittsmålinger med analogRead()