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)