Innehållsförteckning:

Kapacitiv Touch Mood/Ambilight: 8 steg
Kapacitiv Touch Mood/Ambilight: 8 steg

Video: Kapacitiv Touch Mood/Ambilight: 8 steg

Video: Kapacitiv Touch Mood/Ambilight: 8 steg
Video: Very Easy! Capacitive touch Mood/Ambilight [Full Tutorial] 2024, November
Anonim
Kapacitiv Touch Mood/Ambilight
Kapacitiv Touch Mood/Ambilight

Denna instruerbara är en snabb beskrivning av min erfarenhet av att skapa ett multifunktionellt moodlight. Vissa grundläggande kunskaper om elektroniska kretsar förväntas. Projektet har ännu inte slutförts, lite tilläggsfunktioner och tweaking måste göras men det är redan funktionellt. Om ni är entusiastiska över detta instruerbara kommer jag att uppdatera det. I hjärtat av systemet är en Arduino. Den kommer att bearbeta ingången från USB eller var och en av de kapacitiva pekingångarna och styra RGB -lampan. Detta instruerbara är uppdelat i tre sektioner:- Den kapacitiva pekdelen täcker de osynliga ingångsknapparna- Moodlight-sektionen täcker kontrollen av moodlight- Ambilight-sektionen täcker inmatning via serieport, bearbetning av RGB-värden som genereras av ett datorprogram för att styra lamporna Ansvarsfriskrivning: Elektronik kan vara farligt, du är själv ansvarig för eventuella skador. Viss kod samlas in från forum och innehåller kanske inte ägarens namn. Meddela mig så lägger jag till ditt namn.

Steg 1: Objektlista

Följande komponenter behövs för denna instruerbara:- Arduino+USB-kabel- Brödbräda- Dators strömförsörjning- 3x RGB-remsor, kolla in dealextreme.com.- 3x TIP120 FET, som https://uk.farnell.com/stmicroelectronics/tip120 /darlington-transistor-to-220/dp/9804005- Ett gäng motstånd (6 * 10 kiloOhm, 3 * 2 megaOhm)-Mycket tråd. - Verktyg Kapacitiv beröring- Metallringar för markplattor- Koppartråd eller platta- Något att bygga in i (som en bokhylla:)

Steg 2: Kapacitiv beröring - Grunder och kretsar

Kapacitiv beröring - Grunder och kretsar
Kapacitiv beröring - Grunder och kretsar
Kapacitiv beröring - Grunder och kretsar
Kapacitiv beröring - Grunder och kretsar
Kapacitiv beröring - Grunder och kretsar
Kapacitiv beröring - Grunder och kretsar

Eftersom jag målade mina bokhyllor hade jag möjlighet att också "uppgradera" dem. Jag ville styra humörljuset med hjälp av osynlig beröring. Först var min plan att använda en dedikerad IC för detta (som Atmel QT240). Men sedan snubblade jag på en sida som förklarade att Arduino kan emulera en kapacitiv sensor med mjukvara. Den elektroniska kretsen finns på bilden, sensorn är en spiralformad koppartråd (endast en visas för enkelhetens skull). Känsligheten styrs av motstånden som finns före varje stift. De kan sträcka sig från 1 MegaOhm (absolut beröring) till 40 MegaOhm (12-24 tum bort) beroende på om absolut eller nära beröring behövs (jag slutade använda 2M Ohm-motstånd). Experimentera med värdena tills sensorn beter sig som önskat. Det är en bra idé att installera någon ledande yta (åtskild av ett tunt icke-ledande stycke) anslutet till kretsarnas jord på baksidan av varje spiral. På så sätt blir sensorerna mer stabila och mindre påverkade av brus. Några fler bilder om installation av sensorerna i en bokhylla. En plugg är också installerad för enkel anslutning till kretsen senare. Filler används för att dölja allt, och efter det är de redo att målas.

Steg 3: Kapacitiv beröring - Kod och testning

Kapacitiv beröring - kod och testning
Kapacitiv beröring - kod och testning

Följande källkod kan användas på Arduino för felsökning, kontrollera värdena med arduino seriell bildskärm. Sex värden genereras. Den första är ett mått på systemets prestanda. Den andra till sjätte är de avkända värdena på varje stift. Värdena bör stiga när du närmar dig fingret. Om inte, kontrollera om det finns dåliga anslutningar och störningar. Motståndsvärdena kan ändras för att bestämma känsligheten. Genom att implementera en if-then-struktur som aktiveras vid en viss logisk gräns, kan en omkopplare göras. Detta kommer att användas i den slutliga arduino-koden. Mer information, föreslås att läsa: https://www.arduino.cc/playground/Main/CapSense--- Arduino CapTouch Debugging Code ---#include void setup () {CapSense cs_2_3 = CapSense (2, 4); // 10M motstånd mellan stift 2 & 4, stift 4 är sensorstift, lägg till tråd, foilCapSense cs_2_4 = CapSense (2, 7); // 10M motstånd mellan stift 2 & 7, stift 7 är sensorstift, lägg till tråd, foilCapSense cs_2_5 = CapSense (2, 8); // 10M motstånd mellan stift 2 & 8, stift 8 är sensorstift, lägg till tråd, foilCapSense cs_2_6 = CapSense (2, 12); // 10M motstånd mellan stift 2 & 12, stift 12 är sensorstift, lägg till tråd, foilCapSense cs_2_7 = CapSense (2, 13); // 10M motstånd mellan stift 2 & 13, stift 13 är sensorstift, lägg till tråd, foilvoid setup () {Serial.begin (9600);} void loop () {long start = millis (); lång total1 = cs_2_3.capSense (30); lång total2 = cs_2_4.capSense (30); lång total3 = cs_2_5.capSense (30); lång total4 = cs_2_6.capSense (30); lång total5 = cs_2_7.capSense (30); Serial.print (millis () - start); // kontrollera prestanda i millisekunder Serial.print ("\ t"); // tabbtecken för felsökning av avstånd mellan Serial.print (total1); // utskriftssensorutgång 1 Serial.print ("\ t"); Serial.print (total2); // utskriftssensorutgång 2 Serial.print ("\ t"); Serial.print (total3); // utskriftssensorutgång 3 Serial.print ("\ t"); Serial.print (total4); // utskriftssensorutgång 4 Serial.print ("\ t"); Serial.println (total5); // utskriftssensor utgång 5 fördröjning (10); // godtycklig fördröjning för att begränsa data till serieport} --- SLUT ---

Steg 4: Mood Light - Basics & Circuit

Mood Light - Grunder och kretsar
Mood Light - Grunder och kretsar
Mood Light - Grunder och kretsar
Mood Light - Grunder och kretsar
Mood Light - Grunder och kretsar
Mood Light - Grunder och kretsar

Nu är det dags att bygga utgångsdelen av systemet. Arduinos PWM -stift kommer att användas för att styra varje färg. PWM betyder pulsbreddsmodulering, genom att slå på och stänga av en stift väldigt snabbt kommer lysdioderna att dämpas från 0 till 255. Varje stift förstärks av en FET. För tillfället har systemet bara en kanal per färg, vilket betyder att alla RGB -remsor kommer att styras samtidigt och 3 PWM -stift behövs (en för varje färg). I framtiden vill jag kunna styra var och en av mina fyra RGB -remsor. Det betyder 4*3 = 12 PWM -stift (och förmodligen en Arduino Mega). Ok, dags för lite scheman! Detta (se bild) är en grundläggande representation av kretsen (kommer att göra en trevligare en snart). De kapacitiva sensorerna ingår också (grön del). I grund och botten är det tre komponenter som måste förklaras:- FETT Detta är förstärkaren jag pratade om. Den har en port, en källa och ett avlopp. Det förstärker sinnena en liten ström på porten (ansluten till Arduino) och öppnar vägen för RGB -remsan som drivs på 12 volt. Källan ska vara på +12V, dränera på GND (mark). Kontrollera specifikationsbladet för din FET för exakt pinout. Varje RGB -kanal bör placeras före sin egen FET. I denna mening fungerar den som en Arduino-kontrollerad omkopplare.- RGB-remsa Denna 12 volt RGB-remsa är av den vanliga anoden (+). Det betyder att den gemensamma ledningen ska anslutas till +12V och strömmen sjunker genom var och en av de separata färgkanalerna. Remsan har införlivade motstånd, så inga bekymmer om det!- Motstånd Tre 10k motstånd kommer att se till att FET inte slås på när de inte ska sättas på. Tre andra kommer att begränsa den maximala strömmen FET kommer att tömma. De tre översta motstånden finns redan i RGB -remsan. Jag lödde USB -kablar till RGB -remsorna så att jag enkelt kan ansluta dem modulärt. Pluggar från ett gammalt nav placeras på min brödbräda. Använd en gammal dator strömförsörjning för juice, 12V för att driva RGB -remsan och så småningom 5V för kretsen om du vill att den ska köra utan USB -kabeln.

Steg 5: Mood Light - kod och kontroll

Stämningsljuset styrs av de kapacitiva sensorerna. För tillfället programmerade jag bara sensorerna 2 och 3 för färgbyte. De andra sensorerna har ingen funktion än. Här är koden: --- Arduino Mood Control Code ---#include const boolean invert = true; const long timeout = 10000; // Capacitive sensor declarationCapSense In1 = CapSense (2, 4); // 2M motstånd mellan stift 4 & 2, stift 2 är sensorstift, lägg till tråd, folieCapSense In2 = CapSense (2, 7); // 2M motstånd mellan stiften 4 & 6, stift 6 är sensorstift, lägg till tråd, folieCapSense In3 = CapSense (2, 8); // 2M motstånd mellan stift 4 & 8, stift 8 är sensorstift, lägg till tråd, folieCapSense In4 = CapSense (2, 12); // 2M motstånd mellan stift 4 & 8, stift 8 är sensorstift, lägg till tråd, folieCapSense In5 = CapSense (2, 13); // 2M motstånd mellan stift 4 & 8, stift 8 är sensorstift, tillsätt tråd, folie // PWM Stiftdeklarationerint PinR1 = 3; int PinG1 = 5; int PinB1 = 6; // Andra variablerint Color1 = 128; // börja med en röd färg som ljusstyrka1 = 255; // börja med full ljusstyrkaint RedValue1, GreenValue1, BlueValue1; // RGB -komponenterna förlorar inställningar () {// ställer in sensor timeout -värden In1.set_CS_AutocaL_Millis (timeout); In2.set_CS_AutocaL_Millis (timeout); In3.set_CS_AutocaL_Millis (timeout); In4.set_CS_AutocaL_Millis (timeout); In5.set_CS_AutocaL_Millis (timeout);} void loop () {long start = millis (); lång total1 = In1.capSense (30); long total2 = In2.capSense (30); long total3 = In3.capSense (30); long total4 = In4.capSense (30); lång total5 = In5.capSense (30); if (total2> 150) {Color1 ++; // öka färgen om (Color1> 255) {// Color1 = 0; }} annars if (total3> 200) {Color1--; // minska färgen om (Color1 <0) {// Color1 = 255; } // konvertera nyans till rgb hueToRGB (Color1, Brightness1); // skriva färger till PWM -stift analogWrite (PinR1, RedValue1); analogWrite (PinG1, GreenValue1); analogWrite (PinB1, BlueValue1);} // funktion för att konvertera en färg till dess röda, gröna och blåa komponenter. ogiltig hueToRGB (int nyans, int ljusstyrka) {unsigned int scaledHue = (nyans * 6); osignerat int segment = scaledHue / 256; // segment 0 till 5 runt färghjulet osignerade int segmentOffset = scaledHue - (segment * 256); // position inom segmentet osignerad int kompliment = 0; osignerad int prev = (ljusstyrka * (255 - segmentOffset)) / 256; osignerad int nästa = (ljusstyrka * segmentOffset) / 256; om (invertera) {ljusstyrka = 255-ljusstyrka; komplimang = 255; prev = 255-prev; nästa = 255-nästa; } switch (segment) {case 0: // röd RedValue1 = ljusstyrka; GreenValue1 = nästa; BlueValue1 = komplimang; ha sönder; fall 1: // gul RedValue1 = föregående; GreenValue1 = ljusstyrka; BlueValue1 = komplimang; ha sönder; fall 2: // grön RedValue1 = komplimang; GreenValue1 = ljusstyrka; BlueValue1 = nästa; ha sönder; fall 3: // cyan RedValue1 = komplimang; GreenValue1 = föregående; BlueValue1 = ljusstyrka; ha sönder; fall 4: // blå RedValue1 = nästa; GreenValue1 = komplimang; BlueValue1 = ljusstyrka; ha sönder; fall 5: // magenta standard: RedValue1 = ljusstyrka; GreenValue1 = komplimang; BlueValue1 = föregående; ha sönder; }}--- SLUTET ---

Steg 6: Ambi Light - Arduino -sidan

Naturligtvis skulle det vara helt häftigt att kunna styra humörljuset från din dator. Till exempel för att skapa en ambilight eller ett ljudstyrt disco. Detta avsnitt fokuserar på ambilight -delen, i framtiden kommer jag att lägga till mer funktionalitet. Tja, det finns inga ytterligare kretsar eftersom det är tillgängligt i Arduino. Det vi ska använda är seriekommunikationsmöjligheterna och en del 'Processing 1.0' programvara. Anslut din arduino till din dator med en USB-kabel (om du laddade upp skisser till den är det redan). För arduino måste du lägga till lite extra kod för seriell kommunikation. Koden växlar till lyssningsläge och vrider de kapacitiva sensorerna så länge den tar emot RGB -värden från datorn. Den ställer sedan in RGB -värdena till PWM -stiften. Detta är min sista kod för nu, kolla efter ändringarna själv: --- Arduino Ambilight Code ---#include const boolean invert = true; const long timeout = 10000; long commStart = 0; char val; // Capacitive sensor declarationCapSense In1 = CapSense (2, 4); // 2M motstånd mellan stift 4 & 2, stift 2 är sensorstift, lägg till tråd, folieCapSense In2 = CapSense (2, 7); // 2M motstånd mellan stift 4 & 6, stift 6 är sensorstift, lägg till tråd, folieCapSense In3 = CapSense (2, 8); // 2M motstånd mellan stift 4 & 8, stift 8 är sensorstift, lägg till tråd, folieCapSense In4 = CapSense (2, 12); // 2M motstånd mellan stift 4 & 8, stift 8 är sensorstift, lägg till tråd, folieCapSense In5 = CapSense (2, 13); // 2M motstånd mellan stift 4 & 8, stift 8 är sensorstift, tillsätt tråd, folie // PWM Stiftdeklarationerint PinR1 = 3; int PinG1 = 5; int PinB1 = 6; // Andra variablerint Color1 = 128; // börja med en röd färg som ljusstyrka1 = 255; // börja med full ljusstyrkaint RedValue1, GreenValue1, BlueValue1; // RGB -komponentens void -inställning () {Serial.begin (9600); // starta seriell kommunikation // ställ in sensor timeout -värden In1.set_CS_AutocaL_Millis (timeout); In2.set_CS_AutocaL_Millis (timeout); In3.set_CS_AutocaL_Millis (timeout); In4.set_CS_AutocaL_Millis (timeout); In5.set_CS_AutocaL_Millis (timeout);} void loop () {long start = millis (); lång total1 = In1.capSense (30); long total2 = In2.capSense (30); long total3 = In3.capSense (30); long total4 = In4.capSense (30); long total5 = In5.capSense (30); if (Serial.available ()) {// Om data finns att läsa, val = Serial.read (); // läs den och lagra den i val commStart = millis (); if (val == 'S') {// Om start char tas emot, medan (! Serial.available ()) {} // Vänta tills nästa värde. RedValue1 = Serial.read (); // När den är tillgänglig, tilldela. medan (! Serial.available ()) {} // Samma som ovan. GreenValue1 = Serial.read (); medan (! Serial.available ()) {} BlueValue1 = Serial.read (); } Serial.print (RedValue1); Serial.print (GreenValue1); Serial.println (BlueValue1); } annars if ((millis () - commStart)> 1000) {if (total2> 150) {Color1 ++; // öka färgen om (Color1> 255) {// Color1 = 0; }} annars if (total3> 200) {Color1--; // minska färgen om (Color1 <0) {// Color1 = 255; }} hueToRGB (Color1, Brightness1); } analogWrite (PinR1, RedValue1); analogWrite (PinG1, GreenValue1); analogWrite (PinB1, BlueValue1);} // funktion för att konvertera en färg till dess röda, gröna och blåa komponenter. ogiltig hueToRGB (int nyans, int ljusstyrka) {unsigned int scaledHue = (nyans * 6); osignerat int segment = scaledHue / 256; // segment 0 till 5 runt färghjulet osignerade int segmentOffset = scaledHue - (segment * 256); // position inom segmentet osignerad int kompliment = 0; osignerad int prev = (ljusstyrka * (255 - segmentOffset)) / 256; osignerad int nästa = (ljusstyrka * segmentOffset) / 256; om (invertera) {ljusstyrka = 255-ljusstyrka; komplimang = 255; prev = 255-prev; nästa = 255-nästa; } switch (segment) {case 0: // röd RedValue1 = ljusstyrka; GreenValue1 = nästa; BlueValue1 = komplimang; ha sönder; fall 1: // gul RedValue1 = föregående; GreenValue1 = ljusstyrka; BlueValue1 = komplimang; ha sönder; fall 2: // grön RedValue1 = komplimang; GreenValue1 = ljusstyrka; BlueValue1 = nästa; ha sönder; fall 3: // cyan RedValue1 = komplimang; GreenValue1 = föregående; BlueValue1 = ljusstyrka; ha sönder; fall 4: // blå RedValue1 = nästa; GreenValue1 = komplimang; BlueValue1 = ljusstyrka; ha sönder; fall 5: // magenta standard: RedValue1 = ljusstyrka; GreenValue1 = komplimang; BlueValue1 = föregående; ha sönder; }}--- SLUTET ---

Steg 7: Ambi Light - Datorsida

På datorns sida körs en Processing 1.0 -skiss, se processing.org. Detta lilla (något röriga) program beräknar den genomsnittliga skärmfärgen vid varje ögonblick och skickar detta till serieporten. Det är väldigt grundläggande än och det kan behöva justeras lite, men det fungerar mycket bra! Jag kommer att uppdatera det i framtiden för flera separata RGB -remsor och skärmsektioner. Du kan också göra det själv, språket är ganska enkelt. Här är koden: --- Processing 1.0 Code --- import processing.serial.*; Import java.awt. AWTException; import java.awt. Robot; import java.awt. Rectangle; import java.awt.image. BufferedImage; PImage screenShot; Serial myPort; static public void main (String args ) {PApplet.main (new String {"--present", "shooter"});} void setup () {size (100, 100); //size(screen.width, screen.height); // Skriv ut en lista över de seriella portarna för felsökningsändamål: println (Serial.list ()); // Jag vet att den första porten i serielistan på min mac // alltid är min FTDI -adapter, så jag öppnar Serial.list () [0]. // På Windows -maskiner öppnar detta i allmänhet COM1. // Öppna vilken port som helst som du använder. String portName = Serial.list () [0]; myPort = new Serial (this, portName, 9600);} void draw () {// image (screenShot, 0, 0, width, height); screenShot = getScreen (); färg färg = färg (0, 0, 0); färg = color (screenShot); //myPort.write(int(red(kleur))++ ','+int (grön (färg))+','+int (blå (färg))+13); //myPort.write(int(red(kleur)))); //myPort.write (','); //myPort.write(int(green(kleur)))); //myPort.write (','); //myPort.write(int(blå(kleur)))); //myPort.write(13); fill (färg); rect (30, 20, 55, 55);} färgfärg (PImage img) {int cols = (img.width); int rader = (bildhöjd); int dimension = (img.bredd*img.höjd); int r = 0; int g = 0; int b = 0; img.loadPixels (); // Ga varje pixel langs (dimension) för (int i = 0; i <(dimension/2); i ++) {r = r+((img.pixels >> 16) & 0xFF); g = g + ((img.pixels >> 8) & 0xFF); b = b + (img.pixels & 0xFF);} int mean_r = r/(dimension/2); int mean_g = g/(dimension/2); int mean_b = b/(dimension/2); färg medelvärde_clr = färg (medelvärde_r, medelvärde_g, medelvärde_b); myPort.write ('S'); myPort.write (medel_r); myPort.write (medelvärde_g); myPort.write (mean_b); return (mean_clr);} PImage getScreen () {GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment (); GraphicsDevice gs = ge.getScreenDevices (); DisplayMode -läge = gs [0].getDisplayMode (); Rektangelgränser = ny rektangel (0, 0, mode.getWidth (), mode.getHeight ()); BufferedImage desktop = new BufferedImage (mode.getWidth (), mode.getHeight (), BufferedImage. TYPE_INT_RGB); prova {desktop = new Robot (gs [0]). createScreenCapture (gränser); } catch (AWTException e) {System.err.println ("Screen capture mislyckades."); } retur (ny bild (skrivbord));} --- SLUT ---

Steg 8: Resultat

Resultat
Resultat
Resultat
Resultat

Och detta är resultatet, det är faktiskt på undersidan av min säng. Jag behöver fortfarande byta trasan, det kommer att sprida ljuset mer. Fler bilder om det snart. Jag hoppas att du gillar det här instruerbart och jag hoppas också att det är en bas för din egen kreativitet. På grund av tidsbrist skrev jag det väldigt snabbt. Du kan behöva ha grundläggande kunskap om arduino/elektronik för att förstå det, men jag planerar att uppdatera det i framtiden om det blir väl mottaget.

Rekommenderad: