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. Lysstyrken bestemmes av analog spenningsverdi ut fra et potensiometer. Potensiometerets utgang kobles til analog inngangspinne A0 på Arduino. (Demo på gruppeøvelsen evt. video)
2) Måling av spenning over ekstern LED med multimeter . (Demo på gruppeøvelsen evt. video)
3) Måling av strøm gjennom ekstern LED med multimeter. (Demo på gruppeøvelsen evt. video)
4) Vise hvordan LEDen flimrer når man kobler fra potensiometeret og berører den frie inngangsledningen med fingrene (statisk støy). (Demo på gruppeøvelsen evt. video)
5) Frivillig - nyttig og lærerikt
Oscilloskop - vise det analoge utgangssignalet (PWM), gitt av analogWrite(). Oscilloskop tilgjengelig på gruppeøvelsen. Man kan også filtrere PWM signalet med et LP filter og se resultatet på oscilloskopet
Så velger man EN av følgende deloppgaver
6a) Signal "rundt" jorda. (Demo på gruppeøvelsen evt. video)
6b) LED stripe, styring med lydsensor (musikk), trykksensor eller potensiometer. (Må gjøres og demonstreres på gruppeøvelsen)
6c) Styring av vibrerende/hoppende pneumatisk gulv i takt med musikk. (Må gjøres og demonstreres på gruppeøvelsen)
Regler for gjennomføring av obligatoriske oppgaver
Leveringsfrist
- 28/2 kl. 23.59
Sikkerhet, regler og ressurser
- Vårt labreglement / sikkerhet på labben
- Kjøp av Arduino student kit
- Nettressurser som medfølger Arduino student kit. Arduino Online Learning Content, (hvis man har lyst på mye mer nyttig info og eksempler)
- Komme i gang med AI
- Bruk av serieport på Windows/Mac/Linux. Hvordan, og hva som kan gå galt
- Hvordan unngå å ødelegge Arduino
Læringsmål og metode
- Å bli trygg på bruken av Arduino I/O
- Å forstå Arduino analog I/O
- Å se effekten av inngangsledninger som ikke er koblet til
- Å få erfaring med litt større mekatroniske prosjekter
- Ha det gøy
Når man har et generelt teknisk spørsmål er rekkefølgen:
1) Spør AI
- Fungerer det ikke, eller forstår man ikke svaret
- Spør AI om den delen av svaret du ikke forsto
- Spør AI på en annen måte
2) Spør gruppelærer
Husk at gruppelærers primære jobb er ikke å hjelpe, men å veilede deg til selv å finne løsninger
Oppgave 1
I denne oppgaven kobler vi utgangen av et 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.



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 å spørre AI. Man kan også evt. be AI om å forklare hvordan man regner ut verdien med tanke på eksamen. (Dette vil bli forelest i analogdelen av kurset). LEDen er ikke bidireksjonal, og må kobles med rett pinne mot GND (hør med AI)
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, se AI dokumentasjon for analogWrite(). 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.
(Demo på gruppeøvelsen evt. video.)
Oppgave 2
I denne oppgaven bruker du multimeteret til å måle den analoge spenningen over LEDen mens du skrur på potensiometeret (se veiledning).
(Demo på gruppeøvelsen evt. video)
Oppgave 3
I denne oppgaven bruker du multimeteret til å måle strømmen gjennom LEDen mens du skrur på potensiometeret.
(Demo på gruppeøvelsen evt. video)
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).
(Demo på gruppeøvelsen evt. video)
Oppgave 5 (frivillig)
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.

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.

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 filter

Oppgave 6
Her velger man EN av følgende deloppgaver
6a) Signal rundt jorda
Signal som går i følgende sekvens rundt jorda. Inspirert av Big Bang Theory
Bryter -> Arduino -> Python på PC -> ping til server i Japan -> ping respons tilbake til Python på PC -> Ardino -> ekstern LED
1) Man kobler en bryter til en Arduino inngangspinne. Man kan slippe å bruke ekstern pullup-motstand hvis man heller aktiverer den indre pullup-motstanden til mikrokontrolleren ved kommandoen pinMode(2, INPUT_PULLUP); gitt at man velger pinne nr 2 som inngangspinne fra bryteren. Spør AI om hvordan man kobler til en bryter ved å bruke intern pullup-motstand.
2) Så kobler man til en ekstern LED med seriemotstand til en utgang, slik som i oppgave 1.
3) Programmer så Arduino til å sende til PC via serieporten en byte eller char med for eksempel verdien 1 i det øyeblikket man trykker ned bryteren.
4) Skriv så et kort program i Python som leser fra serieporten, og i det øyeblikket det kommer noe der, sendes en ping til en server på andre siden av jorden, for eksempel 110.50.243.6 (Japan). Spør som vanlig AI om hvordan man gjør det.
5) Når responsen fra ping kommer tilbake fra Japan, skal Pythonprogrammet sende en byte eller char til Arduino, og
6) Arduino skal da lyse opp LEDen.
(Demo på gruppeøvelsen evt. video.)
Frivillig:
Vi har er relé som drives av 0V/5V og trekker nesten ingen strøm, slik at det kan kobles rett til utgangen av Arduino. Dette releet slipper så igjennom 240 vekselstrøm hvis styresignalet fra Arduino er 5V. Hvis styresignalet fra Arduino er 0V slipper ikke reléet igjennom 240V. Utgangen av releet kan så kobles til et valgfritt 240V apparat, for eksempel en lampe. Dette kan man bruke i stedet for LEDen. I figuren under ser vi releet. 240V utgangen er ikke ferdig koblet på bildet, men er ferdig i dag. Arduinos utgangspinne kobles til kontakthullet illustrert med rød tusj, og Arduinos GND kobles til kontakthullet illustrert med sort tusj. Reléet er basert på effekt-transistorer.

6b) LED-stripe, styring med potensiometer eller trykksensor.
Vi har en adresserbar RGB LED-stripe som vi vil styre fra Arduino. Vi har flere valgfrie måter å styre den på, for eksempel:
- 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

- 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, eller lage mønstre som følger takten i musikk. Er man plaget med mye høyfrekvent støy, kan man ta gjennomsnittsmålinger med analogRead(), spør AI

LED-stripen
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 (blå ledning i figurene) fra stripen til GND på Arduino,
2) koble signalledningen (hvit ledning i figurene) 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 til høyre 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 HVIT 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 slik som eksempelkoden fra AI viser. I C bruker man ofte makroer av typen #define slik som vist i eksempelkoden, dette er for å få bedre oversikt. Be evt. AI forklare hva #define gjør. Ved å iterere en for-løkke over alle LEDene i stripen kan dere sette alle RGB verdiene individuelt. 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 via GPT-4 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.
(Må gjøres og demonstreres på gruppeøvelsen)
6c) Pneumatisk gulv
Vi har et pneumatisk (trykkluftdrevet) gulv som raskt kan løfte seg opp og senke seg ca. 5cm mens en voksen person står på det. Dette vil vi bruke til å øke "dansbarheten" i musikk. Ideen er hentet fra Rockefeller i Oslo der gulvet sies å være oppspent på en måte som får det til å resonnere i takt med bevegelser i folkemengden for visse frekvenser, hvis folk er spesielt aktive. Dette kan vist nok gi en helt spesiell opplevelse som ellers er vanskelig å gjenskape.
Gulvet vårt styres av solenoidventiler (foreleses i siste del av kurset). Disse virker slik at når de får 0V over seg, vil de slippe trykkluft inn i 4 sylindrene i gulvet, og gulvet vil løfte seg. Når de får 12V over seg vil de slippe ut luften og gulvet vil senke seg. Dette kan gjøres raskt hvis vi velger å bruke høyt lufttrykk (30-100ms), eller sakte ved lavt lufttrykk. Trykket kan justeres manuelt i en ventil på kompressoren.
For å gjøre om fra Arduinos 0V/5V utgangssignaler til 0V/12V med tilstrekkelig strømstyrke, bruker vi en NMOS transistor. Dette, og pneumatikk vil vi forelese om senere i kurset. Nå trenger vi ikke vite noe mer om hvordan dette fungerer. De som er spesielt interesserte kan kikke på diagrammet i figuren under


NMOS transistoren fungerer som en styrt bryter. Når den får 5V inn på gate-terminalen (hvit ledning) leder den strøm og kan sees på som en lukket bryter. Får den 0V inn på gate-terminalen virker den som en åpen bryter og leder ikke strøm. Alt er ferdig koblet og det eneste dere trenger å gjøre er å koble Gnd (blå ledning) og styresignal (hvit ledning) til Arduino.
Vi ønsker at gulvet skal senke seg raskt i løpet av 30ms i samme øyeblikk som et taktslag kommer i musikken. Dette får vi til ved å sende ut en 30ms lang HØY verdi fra Arduino. Etter denne pulsen sender vi så ut en LAV verdi og gulvet løfter seg. Denne verdien holder vi lav til neste taktslag.
For å finne ut avstanden mellom taktslagene i kjent musikk kan man søke etter BPM (beat per minute) på denne siden. Et godt eksempel på en låt som har en tydelig og fast BPM gjennom hele låten er Fire Burning av Kingston. Denne har en takt på 123 BPM. Velger man riktige pauser med delay() i Arduino kan får man gulvet til å fungere veldig godt til denne låten. NB: fasen til takten i musikken må matche fasen til gulvet for å få en god opplevelse, ellers blir det bare rart. Fasen kan justeres/forskyves i tid ved å raskt pause avspillingen av musikken mens gulvet går. Her trenger man litt rytmisk sans og utprøving for å treffe bra. Velger man gale delay()-verdier slik at BPM-verdiene ikke matcher, blir det bare en irriterende opplevlese. Musikk kan spilles i hodetelefoner (skal ligge på labben) eller med Soundbox hvis det er ok for de andre på labben.
Man kan godt starte med å simulere gulvet. Ved å koble digital utgang til intern LED på Arduino (pinne 13), ser man visuelt uten bevegelse av gulvet om systemet følger takten i musikken. Her kan man også øve seg på å justere fasen.
Vil man samtidig få en LED-stripe til å følge musikken, må den styres av en annen Arduino, da NeoPixel vil forstyrre systemklokken i Arduino som dealy() er avhengig av.
(Må gjøres og demonstreres på gruppeøvelsen)