Projektrapport - Feststation Program: Industriell Ekonomi, LTH Kurs: EITF11 Digitala projekt Elever : Simon Janzon, Ellen Peber & Love Regefalk, Handledare: Bertil Lindvall & Christoffer Cederberg Datum: 2018-05-21
1 Innehållsförteckning 1. Inledning 2 2. Kravspecifikation 2 2.1 Funktionella krav 2 2.2 Kvalitativa krav 3 3. Hårdvara 3 3.1 NeoPixel 3 3.2 Processor 3 3.3 Lågpassfilter 3 3.4 Högpassfilter 3 3.5 Förstärkare 4 3.6 Mikrofon 4 3.7 Tryckknapp 4 3.8 Övrigt 4 4. Kopplingsschema 4 5. Mjukvara 5 5.1 Källkod 5 6. Metod 5 7. Resultat 6 8. Diskussion 9 8.1 Prototypen 9 8.2 Upplevelse av arbetet 9 9. Slutsats 9 Referenslista 9 Appendix A 10
2 1. Inledning Digital teknik finns överallt omkring oss. I våra datorer, mobiltelefoner, väckarklockor och andra produkter vi använder dagligen. Med tanke på att den digitala tekniken blir allt mer integrerad i vår vardag finns det stort värde för blivande civilingenjörer i att förstå hur ett industriellt utvecklingsarbete går till. Att just förstå hur ett industriellt utvecklingsarbete går till är själva syftet med kursen Digitala projekt inom vilken denna rapport författas. För att uppnå syftet med kursen har ett digitalt projekt kallat Feststation planerats, kravställts, konstruerats och testats. Feststationen består övergripande av en mikrofon, ett högpass- och ett lågpassfilter, tre knappar samt flera självständigt programmerbara LED-lampor vilka sitter samman två komponenter kallade Neopixlar. Feststationen skall införliva en partystämning hos användaren genom att blinka rytmiskt i ett mönster till musik beroende på musikens frekvens (bas eller diskant) samt användarens önskemål. Användaren har möjlighet att justera feststationens blinkande med hjälp av tre knappar. I denna rapport följer nu en mer detaljerad beskrivning av kravställningen på det digitala projektet. Därefter redovisas projektets hårdvarukomponenter och den inkorporerade mjukvaran, konstruktionsprocessen och det slutgilitiga resultatet. Avslutningsvis följer en diskussion och slutsats kring arbetet. 2. Kravspecifikation Flera funktionella och kvalitativa krav har ställts på feststationen, dessa presenteras i följande stycken. 2.1 Funktionella krav 1. Feststationen skall ha tre inprogrammerade festlägen. Lägena är följande: a. Läge 1 : När läge 1 är aktiverat skall Neopixel 1 blinka i ett rosa ljus om ljudet som mikrofonen fångar upp överstiger en viss frekvens (diskanta toner). Antalet LED som tänds (0-8) avgörs av mängden energi som A/D-omvandlingen resulterar i, där mer energi resulterar i fler tända LED. Neopixel 2 skall blinka i ett blått ljus om mikrofonen fångar upp ljud med en frekvens som understiger en viss frekvens (bastoner), men den skall i övrigt fungera analogt med Neopixel 1. b. Läge 2 : När läge 2 är aktiverat tänds Neopixlarnas LED:ar om vartannat i regnbågens färger för att skapa ett mönster där endast en LED för respektive Neopixel är tänd i taget. Läge 2 skall fungera oberoende av vilken musik som spelas. c. Läge 3 : När läge 3 är aktivt tänds samtliga av de två Neopixlarnas LED:ar och de skall blinka synkroniserat i regnbågens färger. Läge 3 skall fungera oberoende av musiken.
3 2. Feststationens två Neopixlar skall kunna blinka rytmiskt i ett mönster, oberoende av om musik spelas eller inte. 3. Önskat festläge skall kunna bestämmas av användaren genom ett knapptryck. 4. Feststationen skall kunna A/D-omvandla ljud till en digital signal som processorn kan avläsa. Utifrån denna signal skall antalet tända LED i festläge 1 justeras. En högre energinivå ska resultera i fler tända LED och vice versa. 2.2 Kvalitativa krav 1. Efter att ett festläge har valts (via knapptryckning) får tidsfördröjningen innan neopixlarnas anpassar sig vara maximalt en sekund. 2. Feststationen ska införliva partystämning hos användaren genom att blinka rytmiskt till musik och genom att 3. Hårdvara För att konstruera en prototyp av Feststationen har följande hårdvarukomponenter använts: 3.1 NeoPixel Som ljuskälla har två Neopixlar använts, vilket är en komponent beståendes av åtta självständigt programmerbara RBG LED-lampor. Neopixlarna är tillverkade av Adafruit. [1] 3.2 Processor Den processor som använts är en ATmega16 8-bit Microcontroller från AVR. Processorn består av 40 pinnar, av vilka 32 är I/O-pinnar som är uppdelade på A-, B-, C- och D-portar. Fyra pinnar på C-porten är reserverade för JTAG och ytterligare fyra portar förser processorn med ström. [2] 3.3 Lågpassfilter Ett lågpassfilter har använts för att släppa igenom signaler som kan anses motsvara bastoner. Övriga frekvenser dämpas kraftigt. Se 4. Kopplingsschema för en schematisk bild över hur lågpassfiltret är konstruerat. 3.4 Högpassfilter Ett högpassfilter har använts för att släppa igenom signaler med en frekvens som motsvarar diskanta toner. Övriga frekvenser dämpas kraftigt. Se 4. Kopplingsschema för en schematisk bild över hur högpassfiltret är konstruerat.
4 3.5 Förstärkare För att förstärka de signaler som mikrofonen tar upp har en operationsförstärkare (op-amp) av modell CA 3140 4.5MHz MOSFET/Bipol från Harris Semiconductors använts. En operationsförstärkare kan bäst beskrivas som en förstärkare med en inverterande ingång (-) och en icke-inverterande ingång (+), där spänningsskillnaden mellan dessa två ingångar förstärks. I detta projekt används en tiofaldig förstärkning [3]. 3.6 Mikrofon En mikrofon har använts för att ta upp ljudet (musiken) som spelas. Med hjälp av processorns A/D-omvandlare, som återfinns i dess A-portar, omvandlas ljudet till elektriska, digitala signaler. 3.7 Tryckknapp Tre tryckknappar används för att alternera mellan Feststationens tre festlägen (läge 1, 2 och 3). 3.8 Övrigt Utöver ovanstående komponenter har även följande motstånd och kondensatorer används: Motstånd : 2st 5KΩ 6st 10KΩ 1st 22KΩ 4st 100KΩ 1st 220KΩ Kondensatorer: 2st 136nF 2st 680nF 1st 220 µf 4. Kopplingsschema Hårdvarukomponenterna har kopplats enligt följande kopplingsschema:
5 Figur 1. Kopplingsschema för Feststationen 5. Mjukvara Mjukvaran är utvecklad i IDP:n Atmel Studio 7, processorn är programmerad i programmeringsspråket C, hemsidan är skriven i HTML5 och kopplingsschemat är gjort i Eagle. Se kapitel 5.2 för källkod.[4][5][6] 5.1 Källkod Se appendix A för källkod. 6. Metod Innan arbetet med att ta fram en prototyp påbörjades, sattes en struktur för hur arbetet skulle bedrivas. Följande delmoment identifierades och arbetet har utgått från dessa: Identifiering av hårdvarukomponenter Skiss av kopplingsschema i Eagle Montering av hårdvarukomponenter enligt kopplingsschema Programmering av Feststationens funktioner Slutgiltigt kopplingsschema färdigställt Hemsida i HTML Rapportskrivning Förberedelser inför muntlig presentation och opponering Utifrån kravspecifikationens funktionella och kvalitativa krav, samt i samråd med Bertil, valdes hårdvarukomponenter till Feststationen. Komponenterna valdes så att kraven som
6 ställts på Feststationen skulle kunna uppfyllas. Utifrån detta skissades sedan ett preliminärt kopplingsschema i programvaran Eagle. När kopplingsschemat godkänts av handledare, kunde verktygslåda och komponenter kvitteras ut. Med verktygslådan i ena handen och komponenterna i den andra, kunde arbetet påbörjas. Monteringen av hårdvarukomponenterna gjordes enligt kopplingsschemat och parallellt med monteringen testades komponenterna regelbundet. Anledningen till att komponenterna testades kontinuerligt var för att upptäcka eventuella fel i ett så tidigt skeende som möjligt. Genom att programmera de pinnar hos processorn som de olika komponenterna var anslutna till kunde komponenternas funktioner testas. I och med att vi började programmera processorn i Atmel Studio 7 med hjälp av en JTAG för att kontrollera de olika komponenternas funktioner, så var ett naturligt nästa steg att programmera Feststationens samtliga funktioner. Koden testades med hjälp av debuggern i Atmel Studio 7. När vår prototyp väl fungerade felfritt sammanställde vi ett slutgiltigt kopplingsschema, vilket kan ses i kapitel 4. Slutligen skrevs en hemsida i HTML5 i textredigeraren Sublime Text, följt av denna rapport och en muntlig presentation och opponering. 7. Resultat Projektet resulterade i att en prototyp av en Feststation konstruerats som uppfyller den initiala kravspecen. Nedan finns bilder på prototypen av feststationen ovanifrån, underifrån och i dess olika lägen. Figur 2. Feststationen underifrån
7 Figur 3. Feststationen ovanifrån Figur 4. Feststationen i läge 1
8 Figur 5. Feststationen i läge 2 Figur 6. Feststationen i läge 3.
9 8. Diskussion 8.1 Prototypen Prototypen visade sig vara svårare att konstruera än vad vi initialt trott. Detta gjorde att vi fick modifiera kravställningen under projektets gång och att resultatet inte blev fullt så storartat som vi föreställt oss. Särskilt Neopixeln var svår att förstå och programmera. Detta då de flesta tips och liknande som finns att tillgå på nätet ges i relation till en Arduino, ej en ATmega16 processor. Som en konsekvens av att mycket tid disponerades på att försöka förstå hur neopixeln fungerade och hur den skulle programmeras, så blev våra filter för att urskilja ljudvågor av olika frekvens lidande. Med facit i hand skulle det fortsatta arbetet ha underlättats om vi till exempel använt oss av ett högpass-, lågpass- och två bandpassfilter istället för endast ett hög- och lågpassfilter. 8.2 Upplevelse av arbetet Projektet har varit både utmanande, spännande och lärorikt. Utmanande då vi under hela processen, gång efter gång, stött på saker som ingen av oss haft förkunskaper kring. Detta har till viss del upplevts frustrerande och vi har behövt lägga mycket tid på att leta information på internet och ställa frågor till våra handledare. Däremot har belöningen varit stor när ett hinder överkommits, vilket motiverat oss till att klura på nästa steg i vårt projekt. Med utmaningarna följde också en hel del spänning (både elektrisk och emotionell sådan). Arbetet har upplevts spännande då varje moment har inneburit från början oanade tekniska utmaningar. Spänningen bidrog till att göra kursen rolig. Avslutningsvis har arbetet varit lärorikt då det har inneburit att helt ny kunskap införskaffats. Det har även varit lärorikt då det krävts ett gott samarbete inom gruppen. Det sistnämnda känner vi att vi har uppnått, vilket vi är väldigt glada över. 9. Slutsats Projektet har gett oss nya insikter kring hur är ett industriellt utvecklingsarbete går till och projektet har effektivt visualiserat dess olika moment. Det har varit väldigt svårt men också väldigt lärorikt. Referenslista [1] Datablad för NeoPixel 8 x 5050 RGB LED with Integrated Drivers https://cdn-shop.adafruit.com/product-files/1138/sk6812+led+datasheet+.pdf
10 Hämtad: 2018-05-07 [2] Datablad för ATmega 16 High-performance AVR 8-bit Microcontroller (Complete) https://www.eit.lth.se/fileadmin/eit/courses/edi021/datablad/processors/atmega16.pdf Hämtad: 2018-05-07 [3] Datablad för CA 3140 4.5MHz MOSFET/Bipol Operational amplifiers https://www.eit.lth.se/fileadmin/eit/courses/edi021/datablad/analog/opamp/ca3140.pdf Hämtad: 2018-05-07 [4] Hemsida för Atmel Studio 7 http://www.microchip.com/avr-support/atmel-studio-7 Hämtad: 2018-05-07 [5] Hemsida för Grupp 1 i Digitala Projekt EITF11 Här ska URL:n in, Bertil Hämtad: 2018-05-07
11 Appendix A #define F_CPU 8000000UL #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> //neopixel0 diskant - sitter på C0 #define DATA_PORT PORTC #define DATA_PIN PC0 #define DATA_DDR DDRC //neopixel1 bas - sitter på B0 #define DATA_PORT1 PORTB #define DATA_PIN1 PB0 #define DATA_DDR1 DDRB uint8_t k,m; /* START Kod för A/D-omvandlare below */ #define START_ADC() ADCSRA = (1<<ADSC) #define TRUE 1 #define FALSE 0 //värden för A/D-omvandlingen volatile uint16_t adc_maxvalue0; volatile uint16_t adc_maxvalue1; volatile uint16_t d; //resultat från hög/lågpass volatile uint16_t adc_res0; //adc res för pin A0 --- HÖGPASS PÅ PIN A0 volatile uint16_t adc_res1; //adc res för pin A1 volatile uint8_t adc_ready; //räknare int counter2; uint8_t adc_cnt = 1; // räkna så vi ad omvandlar tills medelvärde nåtts void rainbowneo0(); void rainbowneo1(); void rainbownbr2neo0(int m); void rainbownbr2neo1(int m);
12 void set_color(int* arr, int red, int green, int blue); void fill_array(int* arr, int color); void turnoffneo0(); void turnoffneo1(); void musicpatternneo0(int m); void musicpatternneo1(int m); void init_adc(); void fill_array(int* arr, int color){ for(int i = 0; i < 8; ++i) arr[i] = color & (1 << (7 - i)); void set_color(int* arr, int red, int green, int blue){ fill_array(arr, green); fill_array(&arr[8], red); fill_array(&arr[16], blue); void rainbowneo0(){ int rgb_array[24]; int rgb_array1[24]; int rgb_array2[24]; int rgb_array3[24]; int rgb_array4[24]; int rgb_array5[24]; int rgb_array6[24]; int rgb_array7[24]; int rgb_array8[24]; set_color(rgb_array,0,0, 0); // bakgrundsljus set_color(rgb_array1,255,255,255); // rosa set_color(rgb_array2,255,0, 144); // lila set_color(rgb_array3,148,0, 211); // lila set_color(rgb_array4,0,0, 255); // blå set_color(rgb_array5,0,255,0); // grön set_color(rgb_array6,255,255, 0); // gul set_color(rgb_array7,255,127,0); //orange set_color(rgb_array8,255,0, 0); // röd //Start - åtta st - nr 1 if(rgb_array1[i]) { //send one
13 else { //send zero for(int k = 0; k < 7; k++) { else { //send zero //slut - åtta st nr 1 // Start - åtta st nr 2 else { //send zero if(rgb_array2[i]) { //send one
14 else { //send zero for(int k = 0; k < 6; k++) { else { //send zero //slut - åtta st nr 2 //Start - åtta st nr 3 for(int k = 0; k < 2; k++) { else { //send zero
15 if(rgb_array3[i]) { //send one else { //send zero for(int k = 0; k < 5; k++) { //slut - åtta st nr 3 else { //send zero //Start - åtta st nr 4 for(int k = 0; k < 3; k++) { else { //send zero
16 if(rgb_array4[i]) { //send one else { //send zero for(int k = 0; k < 4; k++) { //slut - åtta st nr 4 else { //send zero //Start - åtta st nr 5 for(int k = 0; k < 4; k++) { else { //send zero
17 if(rgb_array5[i]) { //send one else { //send zero for(int k = 0; k < 3; k++) { //slut - åtta st nr 5 else { //send zero //Start - åtta st nr 6 for(int k = 0; k < 5; k++) { else { //send zero
18 if(rgb_array6[i]) { //send one else { //send zero for(int k = 0; k < 2; k++) { //slut - åtta st nr 6 else { //send zero //Start - åtta st nr 7 for(int k = 0; k < 6; k++) {
19 else { //send zero if(rgb_array7[i]) { //send one else { //send zero for(int k = 0; k < 1; k++) { //slut - åtta st nr 7 else { //send zero //Start - åtta st nr 8 for(int k = 0; k < 7; k++) {
20 else { //send zero if(rgb_array8[i]) { //send one else { //send zero //slut - åtta st nr 8 _delay_ms(0); // START NEDÅT!!! //Start - åtta st nr 8 for(int k = 0; k < 7; k++) { else { //send zero
21 if(rgb_array8[i]) { //send one else { //send zero //slut - åtta st nr 8 //Start - åtta st nr 7 for(int k = 0; k < 6; k++) { else { //send zero if(rgb_array7[i]) { //send one else { //send zero
22 for(int k = 0; k < 1; k++) { //slut - åtta st nr 7 else { //send zero //Start - åtta st nr 6 for(int k = 0; k < 5; k++) { else { //send zero if(rgb_array6[i]) { //send one else { //send zero
23 for(int k = 0; k < 2; k++) { //slut - åtta st nr 6 else { //send zero //Start - åtta st nr 5 for(int k = 0; k < 4; k++) { else { //send zero if(rgb_array5[i]) { //send one else { //send zero
24 for(int k = 0; k < 3; k++) { else { //send zero //slut - åtta st nr 5 //Start - åtta st nr 4 for(int k = 0; k < 3; k++) { else { //send zero if(rgb_array4[i]) { //send one
25 else { //send zero for(int k = 0; k < 4; k++) { //slut - åtta st nr 4 //Start - åtta st nr 3 else { //send zero for(int k = 0; k < 2; k++) { else { //send zero if(rgb_array3[i]) { //send one
26 else { //send zero for(int k = 0; k < 5; k++) { //slut - åtta st nr 3 else { //send zero // Start - åtta st nr 2 else { //send zero if(rgb_array2[i]) { //send one
27 else { //send zero for(int k = 0; k < 6; k++) { else { //send zero //slut - åtta st nr 2 //Start - åtta st - nr 1 if(rgb_array1[i]) { //send one else { //send zero for(int k = 0; k < 7; k++) {
28 else { //send zero //slut - åtta st nr 1 _delay_ms(0); void rainbowneo1(){ int rgb_array[24]; int rgb_array1[24]; int rgb_array2[24]; int rgb_array3[24]; int rgb_array4[24]; int rgb_array5[24]; int rgb_array6[24]; int rgb_array7[24]; int rgb_array8[24]; set_color(rgb_array,0,0, 0); // bakgrund set_color(rgb_array1,255,255,255); // rosa set_color(rgb_array2,255,0, 144); // lila set_color(rgb_array3,148,0, 211); // lila set_color(rgb_array4,0,0, 255); // blå set_color(rgb_array5,0,255,0); // grön set_color(rgb_array6,255,255, 0); // gul set_color(rgb_array7,255,127,0); //orange set_color(rgb_array8,255,0, 0); // röd //Start - åtta st - nr 1 if(rgb_array1[i]) { //send one
29 else { //send zero for(int k = 0; k < 7; k++) { else { //send zero //slut - åtta st nr 1 // Start - åtta st nr 2 else { //send zero
30 if(rgb_array2[i]) { //send one else { //send zero for(int k = 0; k < 6; k++) { else { //send zero //slut - åtta st nr 2 //Start - åtta st nr 3 for(int k = 0; k < 2; k++) { else { //send zero
31 if(rgb_array3[i]) { //send one else { //send zero for(int k = 0; k < 5; k++) { //slut - åtta st nr 3 else { //send zero //Start - åtta st nr 4 for(int k = 0; k < 3; k++) { else { //send zero
32 if(rgb_array4[i]) { //send one else { //send zero for(int k = 0; k < 4; k++) { //slut - åtta st nr 4 else { //send zero //Start - åtta st nr 5 for(int k = 0; k < 4; k++) {
33 else { //send zero if(rgb_array5[i]) { //send one else { //send zero for(int k = 0; k < 3; k++) { //slut - åtta st nr 5 else { //send zero //Start - åtta st nr 6 for(int k = 0; k < 5; k++) {
34 else { //send zero if(rgb_array6[i]) { //send one else { //send zero for(int k = 0; k < 2; k++) { //slut - åtta st nr 6 else { //send zero //Start - åtta st nr 7 for(int k = 0; k < 6; k++) { if(rgb_array[i]) { //send one
35 else { //send zero if(rgb_array7[i]) { //send one else { //send zero for(int k = 0; k < 1; k++) { //slut - åtta st nr 7 else { //send zero //Start - åtta st nr 8 for(int k = 0; k < 7; k++) {
36 else { //send zero if(rgb_array8[i]) { //send one else { //send zero //slut - åtta st nr 8 _delay_ms(0); // START NEDÅT!!! //Start - åtta st nr 8 for(int k = 0; k < 7; k++) { else { //send zero
37 if(rgb_array8[i]) { //send one else { //send zero //slut - åtta st nr 8 //Start - åtta st nr 7 for(int k = 0; k < 6; k++) { else { //send zero if(rgb_array7[i]) { //send one else { //send zero
38 for(int k = 0; k < 1; k++) { //slut - åtta st nr 7 else { //send zero //Start - åtta st nr 6 for(int k = 0; k < 5; k++) { else { //send zero if(rgb_array6[i]) { //send one else { //send zero
39 for(int k = 0; k < 2; k++) { //slut - åtta st nr 6 else { //send zero //Start - åtta st nr 5 for(int k = 0; k < 4; k++) { else { //send zero if(rgb_array5[i]) { //send one
40 else { //send zero for(int k = 0; k < 3; k++) { else { //send zero //slut - åtta st nr 5 //Start - åtta st nr 4 for(int k = 0; k < 3; k++) { else { //send zero if(rgb_array4[i]) { //send one
41 else { //send zero for(int k = 0; k < 4; k++) { //slut - åtta st nr 4 //Start - åtta st nr 3 else { //send zero for(int k = 0; k < 2; k++) { else { //send zero
42 if(rgb_array3[i]) { //send one else { //send zero for(int k = 0; k < 5; k++) { //slut - åtta st nr 3 else { //send zero // Start - åtta st nr 2 else { //send zero
43 if(rgb_array2[i]) { //send one else { //send zero for(int k = 0; k < 6; k++) { else { //send zero //slut - åtta st nr 2 //Start - åtta st - nr 1 if(rgb_array1[i]) { //send one else { //send zero
44 for(int k = 0; k < 7; k++) { else { //send zero //slut - åtta st nr 1 _delay_ms(0); void turnoffneo0(){ int rgb_array9[24]; set_color(rgb_array9,0,0, 0); // svart for(int k = 0; k < 8; k++) { if(rgb_array9[i]) { //send one else { //send zero _delay_ms(20);
45 void turnoffneo1(){ int rgb_array9[24]; set_color(rgb_array9,0,0, 0); // svart for(int k = 0; k < 8; k++) { if(rgb_array9[i]) { //send one else { //send zero _delay_ms(20); //färg för bas void musicpatternneo1(int m){ //mönster till bas/diskant knapp //m bestäms av hur mkt bas/diskant //cli(); int rgb_array14[24]; set_color(rgb_array14,0,0, 255); // blå for(int k = 0; k < m; k++) { if(rgb_array14[i]) { //send one else { //send zero
46 _delay_ms(20); //färg för diskant void musicpatternneo0(int m){ //mönster till bas/diskant knapp //m bestäms av hur mkt bas/diskant int rgb_array10[24]; int rgb_array11[24]; int rgb_array12[24]; int rgb_array13[24]; int rgb_array14[24]; int rgb_array15[24]; int rgb_array16[24]; int rgb_array17[24]; int rgb_array18[24]; set_color(rgb_array10,0,0, 10); // bakgrund set_color(rgb_array11,255,0,144); // rosa set_color(rgb_array12,148,0, 211); // lila set_color(rgb_array13,75,0,130); // mörklila set_color(rgb_array14,0,0, 255); // blå set_color(rgb_array15,0,255,0); // grön set_color(rgb_array16,255,255, 0); // gul set_color(rgb_array17,255,127,0); //orange set_color(rgb_array18,255,0, 0); // röd //cli(); for(int k = 0; k < m; k++) { _delay_ms(20); if(rgb_array11[i]) { //send one else { //send zero
47 void rainbownbr2neo0(int m){ //mönster till bas/diskant knapp //m bestäms av hur mkt bas/diskant int rgb_array10[24]; int rgb_array11[24]; int rgb_array12[24]; int rgb_array13[24]; int rgb_array14[24]; int rgb_array15[24]; int rgb_array16[24]; int rgb_array17[24]; int rgb_array18[24]; set_color(rgb_array10,0,0, 10); // bakgrund set_color(rgb_array11,255,0,144); // rosa set_color(rgb_array12,148,0, 211); // lila set_color(rgb_array13,75,0,130); // mörklila set_color(rgb_array14,0,0, 255); // blå set_color(rgb_array15,0,255,0); // grön set_color(rgb_array16,255,255, 0); // gul set_color(rgb_array17,255,127,0); //orange set_color(rgb_array18,255,0, 0); // röd for(int k = 0; k < m; k++) { if(rgb_array11[i]) { //send one else { //send zero for(int k = 0; k < m; k++) { if(rgb_array11[i]) { //send one
48 else { //send zero _delay_ms(20); for(int k = 0; k < m; k++) { if(rgb_array12[i]) { //send one else { //send zero for(int k = 0; k < m; k++) { if(rgb_array12[i]) { //send one else { //send zero for(int k = 0; k < m; k++) {
49 if(rgb_array13[i]) { //send one else { //send zero for(int k = 0; k < m; k++) { if(rgb_array13[i]) { //send one else { //send zero for(int k = 0; k < m; k++) { if(rgb_array14[i]) { //send one else { //send zero
50 for(int k = 0; k < m; k++) { if(rgb_array14[i]) { //send one else { //send zero for(int k = 0; k < m; k++) { if(rgb_array15[i]) { //send one else { //send zero for(int k = 0; k < m; k++) { if(rgb_array15[i]) { //send one else { //send zero
51 for(int k = 0; k < m; k++) { if(rgb_array16[i]) { //send one else { //send zero for(int k = 0; k < m; k++) { if(rgb_array16[i]) { //send one else { //send zero for(int k = 0; k < m; k++) { if(rgb_array17[i]) { //send one else { //send zero
52 for(int k = 0; k < m; k++) { if(rgb_array17[i]) { //send one else { //send zero for(int k = 0; k < m; k++) { if(rgb_array18[i]) { //send one else { //send zero for(int k = 0; k < m; k++) { if(rgb_array18[i]) { //send one
53 else { //send zero void rainbownbr2neo1(int m){ //mönster till bas/diskant knapp //m bestäms av hur mkt bas/diskant int rgb_array10[24]; int rgb_array11[24]; int rgb_array12[24]; int rgb_array13[24]; int rgb_array14[24]; int rgb_array15[24]; int rgb_array16[24]; int rgb_array17[24]; int rgb_array18[24]; set_color(rgb_array10,0,0, 10); // bakgrund set_color(rgb_array11,255,0,144); // rosa set_color(rgb_array12,148,0, 211); // lila set_color(rgb_array13,75,0,130); // mörklila set_color(rgb_array14,0,0, 255); // blå set_color(rgb_array15,0,255,0); // grön set_color(rgb_array16,255,255, 0); // gul set_color(rgb_array17,255,127,0); //orange set_color(rgb_array18,255,0, 0); // röd //cli(); for(int k = 0; k < m; k++) { if(rgb_array11[i]) { //send one else { //send zero
54 _delay_ms(20); for(int k = 0; k < m; k++) { if(rgb_array12[i]) { //send one else { //send zero for(int k = 0; k < m; k++) { if(rgb_array13[i]) { //send one else { //send zero for(int k = 0; k < m; k++) {
55 if(rgb_array14[i]) { //send one else { //send zero for(int k = 0; k < m; k++) { if(rgb_array15[i]) { //send one else { //send zero for(int k = 0; k < m; k++) { if(rgb_array16[i]) { //send one else { //send zero
56 for(int k = 0; k < m; k++) { if(rgb_array17[i]) { //send one else { //send zero for(int k = 0; k < m; k++) { if(rgb_array18[i]) { //send one else { //send zero void init_adc() { //sätter vcc som ref, väljer pin A0 som start - ändra detta om du vill alternera mellan kanaler!!! ADMUX = (1<<REFS0) (0<<MUX0); ADCSRA = (1<<ADEN) (1<<ADIE) (1<<ADPS2);
57 //metoder AD ISR(ADC_vect) { uint16_t value = ADC; if (adc_cnt < 5) { adc_res0 += value; if(value> adc_maxvalue0){ adc_maxvalue0 = value; if (adc_cnt == 4){ ADMUX = (1<<MUX0); adc_res0 = adc_res0-2276; //ta bort offset START_ADC(); else { adc_cnt++; int main(void){ //knappisar char b2 = 0; adc_res1 += value ; if(value> adc_maxvalue1){ adc_maxvalue1 = value; if (adc_cnt == 8) { ADMUX &= ~(1<<MUX0); adc_res1 = adc_res1-2256;//ta bort offset adc_cnt = 0; adc_ready = TRUE; if (!adc_ready) { START_ADC();
58 DDRD = DDRD & ~(1<<5); // Set directory d-5 as input. DDRD = DDRD & ~(1<<6); // Set directory d-6 as input. DDRD = DDRD & ~(1<<7); // Set directory d-7 as input. PORTD = 0x00; // Sets all the D-pins to 0 / low. //neopixel0 diskant DATA_DDR = (1 << DATA_PIN); DATA_PORT &= ~(1 << DATA_PIN); //neopixel1 bas DATA_DDR1 = (1 << DATA_PIN1); DATA_PORT1 &= ~(1 << DATA_PIN1); //AD-omvandlaren init_adc(); sei(); START_ADC(); while(1) { turnoffneo0(); turnoffneo1(); // Bas/diskant-knapp if (PIND & (1<<5)) { b2 = 1; while(b2){ //mönster för mängd diskant/bas if(adc_ready){ //högpass-ad-omvandling DISKANT d = 1; //(adc_maxvalue0>>8); adc_res0 = (adc_res0>>2); //division med 4 för att få medelvärde på A0 adc_maxvalue0 = adc_maxvalue0-569; //ta bort offset if (adc_res0 < 38 ){ k=0; else if(adc_res0 > 46){ // adc_maxvalue0){ k=8; else if(adc_res0 > 45 ){ //(adc_maxvalue0 - d ) ){ k=7; else if(adc_res0 > 44 ){ //(adc_maxvalue0 - (d*2) ) ){ k=6; else if(adc_res0 > 43 ){ //(adc_maxvalue0 - (d*3) ) ){ k=5; else if(adc_res0 > 42 ){//(adc_maxvalue0 - (d*4) ) ){ k=4; else if(adc_res0 > 41 ){//(adc_maxvalue0 - (d*5) ) ){ k=3; else if(adc_res0 > 40 ){//(adc_maxvalue0 - (d*6) ) ){
59 k=2; else if(adc_res0 > 39){// (adc_maxvalue0 - (d*7) ) ){ k=1; else{ k=0; // if (adc_res0 < 39 ){ // k=0; // else if(adc_res0 == adc_maxvalue0){ // k=8; // else if(adc_res0 > (adc_maxvalue0 - d ) ){ // k=7; // else if(adc_res0 > (adc_maxvalue0 - (d*2) ) ){ // k=6; // else if(adc_res0 > (adc_maxvalue0 - (d*3) ) ){ // k=5; // else if(adc_res0 > (adc_maxvalue0 - (d*4) ) ){ // k=4; // else if(adc_res0 > (adc_maxvalue0 - (d*5) ) ){ // k=3; // else if(adc_res0 > (adc_maxvalue0 - (d*6) ) ){ // k=2; // else if(adc_res0 > (adc_maxvalue0 - (d*7) ) ){ // k=1; // else{ // k=0; musicpatternneo0(k); //släck neo turnoffneo0(); medelvärde på A0 //lågpass-ad-omvandling BAS d = 1; //(adc_maxvalue0>>8); adc_res1 = (adc_res1>>2); //division med 4 för att få adc_maxvalue1 = adc_maxvalue1-564; //ta bort offset if (adc_res1 > 49 ){ k=0; else if(adc_res1 > 48){//adc_maxValue1){ m=8; else if(adc_res1 >47){// (adc_maxvalue1 - d ) ){ m=7; else if(adc_res1 >46 ){ //(adc_maxvalue1 - (d*2) ) ){ m=6; else if(adc_res1 >45 ){ //(adc_maxvalue1 - (d*3) ) ){ m=5; else if(adc_res1 >44){ //(adc_maxvalue1 - (d*4) ) ){ m=4; else if(adc_res1 > 43){ //(adc_maxvalue1 - (d*5) ) ){ m=3; else if(adc_res1 >42){ //(adc_maxvalue1 - (d*6) ) ){
60 m=2; else if(adc_res1 > 41 ){ //(adc_maxvalue1 - (d*7) ) ){ m=1; else{ m=0; // if (adc_res1 < 46 ){ // k=0; // else if(adc_res1 == adc_maxvalue1){ // m=8; // else if(adc_res1 > (adc_maxvalue1 - d ) ){ // m=7; // else if(adc_res1 > (adc_maxvalue1 - (d*2) ) ){ // m=6; // else if(adc_res1 > (adc_maxvalue1 - (d*3) ) ){ // m=5; // else if(adc_res1 > (adc_maxvalue1 - (d*4) ) ){ // m=4; // else if(adc_res1 > (adc_maxvalue1 - (d*5) ) ){ // m=3; // else if(adc_res1 > (adc_maxvalue1 - (d*6) ) ){ // m=2; // else if(adc_res1 > (adc_maxvalue1 - (d*7) ) ){ // m=1; // else{ // m=0; musicpatternneo1(m); //släck neo turnoffneo1(); adc_res0 = 0; adc_res1 = 0; adc_ready = FALSE; //reset maxvalue ibland så att pixlarna fungerar bra if(counter2 == 5){ adc_maxvalue0 = 0; adc_maxvalue1 = 0; counter2=0; else{ counter2++;
61 START_ADC(); if (PIND & (1<<7)){ b2=0; turnoffneo0(); turnoffneo1(); if (PIND & (1<<6)){ b2=0; turnoffneo0(); turnoffneo1(); if (PIND & (1<<5)){ b2=0; turnoffneo0(); turnoffneo1(); //slut bas/diskant knapp //oberoende mönster-knapp if (PIND & (1<<6)){ b2 = 1; while(b2){ rainbowneo0(); rainbowneo1(); if (PIND & (1<<7)){ b2=0; turnoffneo0(); turnoffneo1(); if (PIND & (1<<6)){ b2=0; turnoffneo0(); turnoffneo1(); if (PIND & (1<<5)){ b2=0; turnoffneo0(); turnoffneo1(); //slut oberoende mönster-knapp //oberoende mönster-knapp2
62 if (PIND & (1<<7)){ b2 = 1; while(b2){ rainbownbr2neo0(8); // rainbownbr2neo1(8); if (PIND & (1<<7)){ b2=0; turnoffneo0(); turnoffneo1(); if (PIND & (1<<6)){ b2=0; turnoffneo0(); turnoffneo1(); if (PIND & (1<<5)){ b2=0; turnoffneo0(); turnoffneo1(); //slut oberoende mönster-knapp