Indholdsfortegnelse:

Kapacitiv berøringsstemning/Ambilight: 8 trin
Kapacitiv berøringsstemning/Ambilight: 8 trin

Video: Kapacitiv berøringsstemning/Ambilight: 8 trin

Video: Kapacitiv berøringsstemning/Ambilight: 8 trin
Video: Kapacitiv szenzor 2024, Juli
Anonim
Kapacitiv berøringsstemning/Ambilight
Kapacitiv berøringsstemning/Ambilight

Denne instruktive er en hurtig opskrivning af min erfaring med at skabe et multifunktionelt moodlight. Der forventes en vis grundlæggende viden om elektroniske kredsløb. Projektet er endnu ikke afsluttet, nogle tilføjelser til funktionalitet og justeringer skal udføres, men det er allerede funktionelt. Hvis I er begejstrede for dette instruerbare, vil jeg opdatere det. I hjertet af systemet er en Arduino. Det behandler input fra USB eller hver af de kapacitive berøringsindgange og styrer RGB -lyset. Denne instruktør er opdelt i tre sektioner:- Den kapacitive berøringsafdeling dækker de usynlige inputknapper- Stemmelysafsnittet dækker styring af moodlight- Ambilight sektionen dækker input via seriel port, behandling af RGB-værdier genereret af et computerprogram til styring af lysene Ansvarsfraskrivelse: Elektronik kan være farlig, du er selv ansvarlig for eventuelle skader. Nogle koder indsamles fra fora og indeholder muligvis ikke navnet på dens ejer. Giv mig besked, så tilføjer jeg dit navn.

Trin 1: Vareliste

Følgende komponenter er nødvendige for denne instruerbare:- Arduino+USB-kabel- Brødbræt- Computer strømforsyning- 3x RGB-strips, tjek dealextreme.com.- 3x TIP120 FET'er, f.eks. Http://uk.farnell.com/stmicroelectronics/tip120 /darlington-transistor-to-220/dp/9804005- En flok modstande (6 * 10 kiloOhm, 3 * 2 megaOhm)-En masse ledning. - Værktøjer Kapacitiv berøring- Metalringe til bundplader- Kobbertråd eller -plade- Noget at bygge det ind i (som en reol:)

Trin 2: Kapacitiv berøring - Grundlæggende og kredsløb

Kapacitiv berøring - Grundlæggende og kredsløb
Kapacitiv berøring - Grundlæggende og kredsløb
Kapacitiv berøring - Grundlæggende og kredsløb
Kapacitiv berøring - Grundlæggende og kredsløb
Kapacitiv berøring - Grundlæggende og kredsløb
Kapacitiv berøring - Grundlæggende og kredsløb

Da jeg malede mine reoler, havde jeg også mulighed for at 'opgradere' dem. Jeg ville kontrollere stemningslyset ved hjælp af usynlig berøring. Først var min plan at bruge en dedikeret IC til dette (som Atmel QT240). Men så faldt jeg over en side, der forklarede, at Arduino kan efterligne en kapacitiv sensor ved hjælp af software. Det elektroniske kredsløb kan findes på billedet, sensoren er en spiralformet kobbertråd (kun en er vist for nemheds skyld). Følsomheden styres af de modstande, der findes før hver pin. De kan variere fra 1 MegaOhm (absolut berøring) til 40 MegaOhm (12-24 tommer væk) afhængigt af om der er behov for absolut eller nær berøring (jeg endte med at bruge 2M Ohm modstande). Eksperimenter med værdierne, indtil sensoren opfører sig som ønsket. Det er en god idé at installere en ledende overflade (adskilt af et tyndt ikke-ledende stykke) forbundet til kredsløbets jord på bagsiden af hver spiral. På denne måde bliver sensorerne mere stabile og mindre påvirket af støj. Nogle flere billeder om installation af sensorerne i en reol. Et stik er også installeret for let forbindelse med kredsløbet senere. Filler bruges til at skjule alt, og derefter er de klar til at blive malet.

Trin 3: Kapacitiv berøring - Kode og test

Kapacitiv berøring - Kode og test
Kapacitiv berøring - Kode og test

Følgende kildekode kan bruges på Arduino til fejlfinding, tjek værdierne med arduino seriel skærm. Seks værdier genereres. Den første er et mål for systemets ydeevne. Den anden til sjette er de registrerede værdier på hver pin. Værdierne bør stige, når du nærmer din finger. Hvis ikke, skal du kontrollere for dårlige forbindelser og forstyrrelser. Modstandsværdierne kan ændres for at bestemme følsomheden. Ved at implementere en if-then-struktur, der aktiveres ved en bestemt logisk grænseværdi, kan der skiftes. Dette vil blive brugt i den endelige arduino-kode. Flere oplysninger, foreslået at læse: https://www.arduino.cc/playground/Main/CapSense--- Arduino CapTouch Debugging Code ---#include void setup () {CapSense cs_2_3 = CapSense (2, 4); // 10M modstand mellem ben 2 & 4, pin 4 er sensorstift, tilføj ledning, foilCapSense cs_2_4 = CapSense (2, 7); // 10M modstand mellem ben 2 & 7, pin 7 er sensorstift, tilføj ledning, foilCapSense cs_2_5 = CapSense (2, 8); // 10M modstand mellem ben 2 & 8, pin 8 er sensorstift, tilføj ledning, foilCapSense cs_2_6 = CapSense (2, 12); // 10M modstand mellem ben 2 & 12, ben 12 er sensorstift, tilføj ledning, folieCapSense cs_2_7 = CapSense (2, 13); // 10M modstand mellem ben 2 & 13, pin 13 er sensorstift, tilføj ledning, foilvoid setup () {Serial.begin (9600);} void loop () {long start = millis (); lang total1 = cs_2_3.capSense (30); lang total2 = cs_2_4.capSense (30); lang total3 = cs_2_5.capSense (30); lang total4 = cs_2_6.capSense (30); lang total5 = cs_2_7.capSense (30); Serial.print (millis () - start); // kontrollere ydelsen i millisekunder Serial.print ("\ t"); // fanetegn for fejlfinding af vind -afstand Serial.print (total1); // print sensor output 1 Serial.print ("\ t"); Serial.print (total2); // print sensor output 2 Serial.print ("\ t"); Serial.print (total3); // print sensor output 3 Serial.print ("\ t"); Serial.print (total4); // print sensor output 4 Serial.print ("\ t"); Serial.println (total5); // print sensor output 5 forsinkelse (10); // vilkårlig forsinkelse for at begrænse data til seriel port} --- SLUT ---

Trin 4: Mood Light - Basics & Circuit

Humørlys - Grundlæggende og kredsløb
Humørlys - Grundlæggende og kredsløb
Humørlys - Grundlæggende og kredsløb
Humørlys - Grundlæggende og kredsløb
Humørlys - Grundlæggende og kredsløb
Humørlys - Grundlæggende og kredsløb

Nu er det tid til at bygge output -delen af systemet. Arduinoens PWM -ben bruges til at styre hver farve. PWM betyder Pulse Width Modulation, ved at tænde og slukke en pin meget hurtigt, vil lysdioderne dæmpes fra 0 til 255. Hver pin forstærkes af en FET. Foreløbig har systemet kun en kanal pr. Farve, hvilket betyder, at alle RGB -strimler styres på én gang, og der er brug for 3 PWM -ben (en for hver farve). I fremtiden vil jeg være i stand til at styre hver af mine fire RGB -strips. Det betyder 4*3 = 12 PWM -pins (og sandsynligvis en Arduino Mega). Ok, tid til nogle skemaer! Dette (se billede) er en grundlæggende fremstilling af kredsløbet (vil snart lave en pænere). De kapacitive sensorer er også inkluderet (grøn del). Grundlæggende er der tre komponenter, der skal forklares:- FETT Dette er forstærkeren, jeg talte om. Det har en port, en kilde og et afløb. Det forstærker sanserne en lille strøm på porten (forbundet til Arduino) og åbner vejen for RGB -strimlen, der drives på 12 volt. Kilden skal være på +12V, dræne på GND (jord). Kontroller specifikationsarket for din FET for nøjagtig pinout. Hver RGB -kanal skal placeres før sin egen FET. I denne forstand fungerer den som en Arduino-kontrolleret switch.- RGB-strip Denne 12 volt RGB-strip er af den almindelige anode (+) type. Det betyder, at den fælles ledning skal tilsluttes +12V, og strømmen sænkes gennem hver af de separate farvekanaler. Strimlen har indbygget modstande, så ingen bekymringer om det!- Modstande Tre 10k modstande vil sikre, at FET ikke tænder, når de ikke skal tænde. Tre andre vil begrænse den maksimale strøm, FET vil tømme. De tre øverste modstande er allerede i RGB -båndet. Jeg lodde USB -kabler til RGB -strimlerne, så jeg let kan tilslutte dem modulært. Stik fra en gammel hub er placeret på mit brødbræt. Brug en gammel computer strømforsyning til juice, 12V til strømforsyning til RGB -båndet og til sidst 5V til kredsløbet, hvis du vil have den til at køre uden USB -kablet.

Trin 5: Humørlys - kode og kontrol

Humørlyset styres af de kapacitive sensorer. For nu har jeg kun programmeret sensorer 2 & 3 til farveændring. De andre sensorer har endnu ingen funktion. Her er koden: --- Arduino Mood Control Code ---#include const boolean invert = true; const long timeout = 10000; // Capacitive sensor declarationCapSense In1 = CapSense (2, 4); // 2M modstand mellem ben 4 & 2, ben 2 er sensorstift, tilføj ledning, folieCapSense In2 = CapSense (2, 7); // 2M modstand mellem ben 4 & 6, pin 6 er sensorstift, tilføj ledning, folieCapSense In3 = CapSense (2, 8); // 2M modstand mellem ben 4 & 8, ben 8 er sensorstift, tilføj ledning, folieCapSense In4 = CapSense (2, 12); // 2M modstand mellem ben 4 & 8, ben 8 er sensorstift, tilføj ledning, folieCapSense In5 = CapSense (2, 13); // 2M modstand mellem ben 4 & 8, pin 8 er sensorstift, tilføj ledning, folie // PWM Pin -deklarationer ind PinR1 = 3; int PinG1 = 5; int PinB1 = 6; // Andre variablerint Color1 = 128; // start med en rød lignende farve Lysstyrke1 = 255; // start med fuld lysstyrkeint RedValue1, GreenValue1, BlueValue1; // RGB -komponenterne ugyldige opsætning () {// indstil værdier for sensor -timeout 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 (); lang total1 = In1.capSense (30); lang total2 = In2.capSense (30); lang total3 = In3.capSense (30); lang total4 = In4.capSense (30); lang total5 = In5.capSense (30); hvis (total2> 150) {Color1 ++; // øge farven, hvis (Farve1> 255) {// Farve1 = 0; }} ellers hvis (total3> 200) {Farve1--; // reducere farven hvis (Farve1 <0) {// Farve1 = 255; } // konverter hue til rgb hueToRGB (Color1, Brightness1); // skriv farver til PWM -pins analogWrite (PinR1, RedValue1); analogWrite (PinG1, GreenValue1); analogWrite (PinB1, BlueValue1);} // funktion til at konvertere en farve til dens røde, grønne og blå komponenter. ugyldig hueToRGB (int hue, int brightness) {unsigned int scaledHue = (hue * 6); usigneret int segment = scaledHue / 256; // segment 0 til 5 omkring farvehjulet usigneret int segmentOffset = scaledHue - (segment * 256); // position inden for segmentet usigneret int kompliment = 0; usigneret int prev = (lysstyrke * (255 - segmentOffset)) / 256; usigneret int næste = (lysstyrke * segmentOffset) / 256; hvis (inverter) {lysstyrke = 255-lysstyrke; kompliment = 255; prev = 255-prev; næste = 255-næste; } switch (segment) {case 0: // rød RedValue1 = lysstyrke; GreenValue1 = næste; BlueValue1 = kompliment; pause; case 1: // gul RedValue1 = prev; GreenValue1 = lysstyrke; BlueValue1 = kompliment; pause; sag 2: // grøn RedValue1 = kompliment; GreenValue1 = lysstyrke; BlueValue1 = næste; pause; sag 3: // cyan RedValue1 = kompliment; GreenValue1 = forrige; BlueValue1 = lysstyrke; pause; sag 4: // blå RedValue1 = næste; GreenValue1 = kompliment; BlueValue1 = lysstyrke; pause; case 5: // magenta default: RedValue1 = lysstyrke; GreenValue1 = kompliment; BlueValue1 = forrige; pause; }} --- SLUT ---

Trin 6: Ambi Light - Arduino Side

Det ville selvfølgelig være helt fedt at kunne styre stemningslyset fra din computer. For eksempel for at skabe en ambilight eller et lydstyret diskotek. Dette afsnit fokuserer på ambilight -delen, i fremtiden vil jeg tilføje mere funktionalitet. Nå, der er ingen yderligere kredsløb, fordi det hele er tilgængeligt i Arduino. Det, vi skal bruge, er de serielle kommunikationsmuligheder og noget 'Processing 1.0' software. Tilslut din arduino til din computer med et USB-kabel (hvis du uploader skitser til den, er den allerede). For arduinoen skal du tilføje en ekstra kode til seriel kommunikation. Koden skifter til lytttilstand og drejer på de kapacitive sensorer, så længe den modtager RGB -værdier fra computeren. Det indstiller derefter RGB -værdierne til PWM -benene. Dette er min sidste kode for nu, tjek selv for ændringerne: --- Arduino Ambilight-kode ---#inkluderer const boolean invert = true; const long timeout = 10000; long commStart = 0; char val; // Kapacitiv sensorerklæringCapSense In1 = CapSense (2, 4); // 2M modstand mellem ben 4 & 2, ben 2 er sensorstift, tilføj ledning, folieCapSense In2 = CapSense (2, 7); // 2M modstand mellem ben 4 & 6, pin 6 er sensorstift, tilføj ledning, folieCapSense In3 = CapSense (2, 8); // 2M modstand mellem ben 4 & 8, ben 8 er sensorstift, tilføj ledning, folieCapSense In4 = CapSense (2, 12); // 2M modstand mellem ben 4 & 8, ben 8 er sensorstift, tilføj ledning, folieCapSense In5 = CapSense (2, 13); // 2M modstand mellem ben 4 & 8, pin 8 er sensorstift, tilføj ledning, folie // PWM Pin -deklarationer ind PinR1 = 3; int PinG1 = 5; int PinB1 = 6; // Andre variablerint Color1 = 128; // start med en rød lignende farve Lysstyrke1 = 255; // start med fuld lysstyrkeint RedValue1, GreenValue1, BlueValue1; // RGB -komponenterne ugyldige opsætning () {Serial.begin (9600); // start seriel kommunikation // indstil værdier for sensor -timeout 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 (); lang total1 = In1.capSense (30); lang total2 = In2.capSense (30); lang total3 = In3.capSense (30); lang total4 = In4.capSense (30); lang total5 = In5.capSense (30); if (Serial.available ()) {// Hvis data er tilgængelige til læsning, val = Serial.read (); // læs den og gem den i val commStart = millis (); if (val == 'S') {// Hvis start char modtages, mens (! Serial.available ()) {} // Vent til næste værdi. RedValue1 = Serial.read (); // Når den er tilgængelig, tildel. mens (! Serial.available ()) {} // Samme som ovenfor. GreenValue1 = Serial.read (); mens (! Serial.available ()) {} BlueValue1 = Serial.read (); } Serial.print (RedValue1); Serial.print (GreenValue1); Serial.println (BlueValue1); } ellers hvis ((millis () - commStart)> 1000) {if (total2> 150) {Color1 ++; // øge farven, hvis (Farve1> 255) {// Farve1 = 0; }} ellers hvis (total3> 200) {Farve1--; // reducere farven hvis (Farve1 <0) {// Farve1 = 255; }} hueToRGB (farve1, lysstyrke1); } analogWrite (PinR1, RedValue1); analogWrite (PinG1, GreenValue1); analogWrite (PinB1, BlueValue1);} // funktion til at konvertere en farve til dens røde, grønne og blå komponenter. ugyldig hueToRGB (int hue, int brightness) {unsigned int scaledHue = (hue * 6); usigneret int segment = scaledHue / 256; // segment 0 til 5 omkring farvehjulet usigneret int segmentOffset = scaledHue - (segment * 256); // position inden for segmentet usigneret int kompliment = 0; usigneret int prev = (lysstyrke * (255 - segmentOffset)) / 256; usigneret int næste = (lysstyrke * segmentOffset) / 256; hvis (inverter) {lysstyrke = 255-lysstyrke; kompliment = 255; prev = 255-prev; næste = 255-næste; } switch (segment) {case 0: // rød RedValue1 = lysstyrke; GreenValue1 = næste; BlueValue1 = kompliment; pause; case 1: // gul RedValue1 = prev; GreenValue1 = lysstyrke; BlueValue1 = kompliment; pause; sag 2: // grøn RedValue1 = kompliment; GreenValue1 = lysstyrke; BlueValue1 = næste; pause; sag 3: // cyan RedValue1 = kompliment; GreenValue1 = forrige; BlueValue1 = lysstyrke; pause; sag 4: // blå RedValue1 = næste; GreenValue1 = kompliment; BlueValue1 = lysstyrke; pause; case 5: // magenta default: RedValue1 = lysstyrke; GreenValue1 = kompliment; BlueValue1 = forrige; pause; }} --- SLUT ---

Trin 7: Ambi Light - Computerside

På siden af computeren køres en Processing 1.0 -skitse, se processing.org. Dette lille (noget rodet) program beregner den gennemsnitlige skærmfarve i hvert øjeblik og sender dette til den serielle port. Det er meget grundlæggende endnu, og det kan bruge nogle justeringer, men det fungerer meget godt! Jeg vil opdatere det i fremtiden for flere separate RGB -strimler og skærmsektioner. Det kunne du også selv, sproget er ganske ligetil. Her er koden: --- Behandler 1.0-kode --- importbehandling.serie.*; Import java.awt. AWTException; import java.awt. Robot; import java.awt. Rektangel; 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); // størrelse (skærm.bredde, skærm.højde); // Udskriv en liste over de serielle porte til fejlfinding: println (Serial.list ()); // Jeg ved, at den første port i serielisten på min mac // altid er min FTDI -adapter, så jeg åbner Serial.list () [0]. // På Windows -maskiner åbner dette generelt COM1. // Åbn den port, du bruger. String portName = Serial.list () [0]; myPort = new Serial (this, portName, 9600);} void draw () {// image (screenShot, 0, 0, bredde, højde); screenShot = getScreen (); farve farve = farve (0, 0, 0); farve = color (screenShot); //myPort.write(int(red(kleur))++ ','+int (grøn (farve))+','+int (blå (farve))+13); //myPort.write(int(red(kleur)))); //myPort.write (','); //myPort.write(int(green(kleur)))); //myPort.write (','); //myPort.write(int(blue(kleur)))); //myPort.write(13); fill (farve); rect (30, 20, 55, 55);} farve farve (PImage img) {int cols = (img.width); int rækker = (billedhøjde); int dimension = (img. bredde*img. højde); int r = 0; int g = 0; int b = 0; img.loadPixels (); // Ga hver pixel langs (dimension) for (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); farve middel_clr = farve (middel_r, middelværdi_g, middelværdi_b); myPort.write ('S'); myPort.write (middel_r); myPort.write (middelværdi_g); myPort.write (mean_b); return (mean_clr);} PImage getScreen () {GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment (); GraphicsDevice gs = ge.getScreenDevices (); DisplayMode -tilstand = 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); prøv {desktop = new Robot (gs [0]). createScreenCapture (grænser); } catch (AWTException e) {System.err.println ("Screen capture mislykkedes."); } return (ny PImage (desktop));} --- END ---

Trin 8: Resultat

Resultat
Resultat
Resultat
Resultat

Og dette er resultatet, det er faktisk i undersiden af min seng. Jeg mangler stadig at udskifte kluden, det vil diffundere lyset mere. Flere billeder om det snart. Jeg håber, at du kan lide dette instruerbare, og jeg håber også, at det er en base for din egen kreativitet. På grund af tidsbegrænsninger skrev jeg det meget hurtigt. Du skal muligvis have noget grundlæggende arduino/elektronik -viden for at forstå det, men jeg planlægger at opdatere det i fremtiden, hvis det bliver godt modtaget.

Anbefalede: