Sadržaj:

Kapacitivno raspoloženje na dodir/Ambilight: 8 koraka
Kapacitivno raspoloženje na dodir/Ambilight: 8 koraka

Video: Kapacitivno raspoloženje na dodir/Ambilight: 8 koraka

Video: Kapacitivno raspoloženje na dodir/Ambilight: 8 koraka
Video: Атеросклероз — 3 лучших метода избавления от недуга! 2024, Novembar
Anonim
Kapacitivno raspoloženje na dodir/Ambilight
Kapacitivno raspoloženje na dodir/Ambilight

Ovo uputstvo je brzo pisanje mog iskustva stvaranja multifunkcionalnog raspoloženja. Očekuje se neko osnovno poznavanje elektroničkih kola. Projekt još nije završen, potrebno je izvršiti dodatnu funkcionalnost i dotjerivanje, ali on je već funkcionalan. Ako ste oduševljeni ovim uputstvom, ažurirat ću ga. U srcu sistema je Arduino. On će obraditi ulaz sa USB -a ili svakog od kapacitivnih dodira i upravljati RGB svjetlom. Ovo uputstvo je podijeljeno u tri odjeljka:- Kapacitivni dio osjetljiv na dodir pokriva nevidljive tipke za unos- Odjeljak moodlight pokriva upravljanje svjetlom raspoloženja- Odjeljak Ambilight pokriva unos putem serijskog porta, obrađujući RGB vrijednosti generirane od računarskog programa za kontrolu svjetla. Odricanje odgovornosti: Elektronika može biti opasna, sami ste odgovorni za bilo kakvu štetu. Neki kôd prikupljen je s foruma i možda ne sadrži ime svog vlasnika. Javite mi i dodaću vaše ime.

Korak 1: Lista stavki

Za ovu instrukciju potrebne su sljedeće komponente:- Arduino+USB kabel- Oglasna ploča- Napajanje računara- 3x RGB trake, provjerite na dealextreme.com.- 3x TIP120 FET-ova, poput https://uk.farnell.com/stmicroelectronics/tip120 /darlington-tranzistor-to-220/dp/9804005- Gomila otpornika (6 * 10 kiloOhm, 3 * 2 megaOhm)-Mnogo žice. - Alati Kapacitivni dodir- Metalni prstenovi za temeljne ploče- Bakrena žica ili ploča- Nešto u što se može ugraditi (poput police za knjige:)

Korak 2: Kapacitivni dodir - osnove i sklop

Kapacitivni dodir - osnove i sklop
Kapacitivni dodir - osnove i sklop
Kapacitivni dodir - osnove i sklop
Kapacitivni dodir - osnove i sklop
Kapacitivni dodir - osnove i sklop
Kapacitivni dodir - osnove i sklop

Budući da sam slikao police za knjige, imao sam priliku da ih i 'nadogradim'. Želeo sam da kontrolišem raspoloženje pomoću nevidljivog dodira. U početku sam planirao koristiti namjenski IC za to (poput Atmela QT240). Ali onda sam naletio na stranicu koja objašnjava da Arduino može softverski oponašati kapacitivni senzor. Elektroničko kolo se može naći na slici, senzor je spiralna bakrena žica (samo je jedna prikazana radi jednostavnosti). Osetljivost se kontroliše otpornicima koji se nalaze pre svakog pina. Mogu biti u rasponu od 1 MegaOhm (apsolutni dodir) do 40 MegaOhm (udaljeni 12-24 inča) ovisno o tome je li potreban apsolutni ili bliski dodir (na kraju sam koristio 2M Ohm otpornike). Eksperimentirajte s vrijednostima dok se senzor ne ponaša kako želite. Dobra je ideja instalirati neku vodljivu površinu (odvojenu tankim neprovodnim komadom) spojenu na uzemljeno kolo na stražnjoj strani svake spirale. Na ovaj način senzori će biti stabilniji i manje pod utjecajem buke. Još nekoliko slika o instaliranju senzora na policu za knjige. Ugrađen je i utikač radi lakšeg povezivanja sa strujnim krugom kasnije. Punila se koriste za skrivanje svega, a nakon toga su spremna za farbanje.

Korak 3: Kapacitivni dodir - Kôd i testiranje

Kapacitivni dodir - Kôd i testiranje
Kapacitivni dodir - Kôd i testiranje

Sljedeći izvorni kod može se koristiti na Arduinu za otklanjanje grešaka, provjerite vrijednosti pomoću arduino serijskog monitora. Generira se šest vrijednosti. Prvi je mjera performansi sistema. Drugi do šesti su osjetljive vrijednosti na svakom pinu. Vrijednosti bi se trebale povećati pri približavanju prstu. Ako nije, provjerite ima li loših veza i smetnji. Vrijednosti otpornika se mogu promijeniti kako bi se odredila osjetljivost. Implementacijom if-then strukture koja se aktivira na određenom logičkom pragu, može se izvršiti prebacivanje. Ovo će se koristiti u konačnom arduino kodu. Više informacija, preporučeno za čitanje: https://www.arduino.cc/playground/Main/CapSense--- Arduino CapTouch kod za ispravljanje pogrešaka ---#include void setup () {CapSense cs_2_3 = CapSense (2, 4); // 10M otpornik između pinova 2 i 4, pin 4 je pin osjetnika, dodajte žicu, folijuCapSense cs_2_4 = CapSense (2, 7); // 10M otpornik između pinova 2 i 7, pin 7 je pin senzora, dodajte žicu, folijaCapSense cs_2_5 = CapSense (2, 8); // 10M otpornik između pinova 2 i 8, pin 8 je pin osjetnika, dodajte žicu, folijuCapSense cs_2_6 = CapSense (2, 12); // 10M otpornik između pinova 2 i 12, pin 12 je pin senzora, dodajte žicu, folijuCapSense cs_2_7 = CapSense (2, 13); // 10M otpornik između pinova 2 i 13, pin 13 je pin senzora, dodajte žicu, postavka foilvoida () {Serial.begin (9600);} void loop () {long start = millis (); ukupno ukupno1 = cs_2_3.capSense (30); ukupno ukupno2 = cs_2_4.capSense (30); ukupno ukupno3 = cs_2_5.capSense (30); ukupno ukupno4 = cs_2_6.capSense (30); ukupno ukupno5 = cs_2_7.capSense (30); Serial.print (millis () - početak); // provjerava performanse u milisekundama Serial.print ("\ t"); // znak tabulatora za ispravljanje pogrešaka unutar razmaka Serial.print (ukupno1); // ispis senzorskog izlaza 1 Serial.print ("\ t"); Serial.print (total2); // ispis senzorskog izlaza 2 Serial.print ("\ t"); Serial.print (ukupno3); // ispis senzorskog izlaza 3 Serial.print ("\ t"); Serial.print (ukupno4); // ispis senzorskog izlaza 4 Serial.print ("\ t"); Serial.println (ukupno 5); // ispis senzora ispisa 5 kašnjenje (10); // proizvoljno kašnjenje za ograničavanje podataka na serijski port} --- END ---

Korak 4: Rasvjeta - osnove i sklop

Raspoloženje - osnove i sklopovi
Raspoloženje - osnove i sklopovi
Raspoloženje - osnove i sklopovi
Raspoloženje - osnove i sklopovi
Raspoloženje - osnove i sklopovi
Raspoloženje - osnove i sklopovi

Sada je vrijeme za izgradnju izlaznog dijela sistema. Arduino PWM pinovi će se koristiti za kontrolu svake boje. PWM znači Pulse Width Modulation, brzim uključivanjem i isključivanjem pina LED diode će biti prigušene od 0 do 255. Svaki pin će biti pojačan FET -om. Za sada sistem ima samo jedan kanal po boji, što znači da će se sve RGB trake kontrolirati odjednom i potrebna su 3 PWM pina (po jedan za svaku boju). U budućnosti želim moći kontrolirati svaku od svoje četiri RGB trake. To znači 4*3 = 12 PWM pinova (i vjerovatno Arduino Mega). U redu, vrijeme je za neke sheme! Ovo (vidi sliku) je osnovni prikaz kola (uskoro će biti ljepši). Uključeni su i kapacitivni senzori (zeleni dio). U osnovi postoje tri komponente koje se moraju objasniti:- FETOvo je pojačalo o kojem sam govorio. Ima Vrata, Izvor i Odvod. Pojačava osjetila male struje na vratima (spojen na Arduino) i otvara put za RGB traku koja se napaja na 12 volti. Izvor bi trebao biti na +12V, odvod na GND (uzemljenje). Za tačan ispis provjerite list sa specifikacijama vašeg FET -a. Svaki RGB kanal treba postaviti ispred svog FET -a. U tom smislu, djeluje kao Arduino upravljački prekidač.- RGB trakaOva 12 voltna RGB traka je tipa zajedničke anode (+). To znači da bi zajednička žica trebala biti spojena na +12V i struja bi trebala proći kroz svaki od kanala u boji. Traka ima ugrađene otpornike, tako da nema brige oko toga!- Otpornici Tri 10k otpornika će se pobrinuti da se FET ne uključi kad se ne bi trebali uključiti. Tri druge će ograničiti maksimalnu struju koju će FET isprazniti. Tri gornja otpornika već su u RGB traci. Zalemio sam USB kabele na RGB trake tako da ih mogu lako modularno spojiti. Utikači sa starog čvorišta postavljeni su na moju ploču. Koristite staro računarsko napajanje za sok, 12V za napajanje RGB trake i na kraju 5V za krug ako želite da radi bez USB kabela.

Korak 5: Rasvjetno raspoloženje - Kôd i kontrola

Rasvjetno raspoloženje kontroliraju kapacitivni senzori. Za sada sam programirao samo senzore 2 i 3 za promjenu boje. Ostali senzori još nemaju funkciju. Evo koda: --- Arduino Mood Control Code ---#uključuje const boolean invert = true; const long timeout = 10000; // deklaracija kapacitivnog senzoraCapSense In1 = CapSense (2, 4); // 2M otpornik između pinova 4 i 2, pin 2 je pin osjetnika, dodajte žicu, folijuCapSense In2 = CapSense (2, 7); // 2M otpornik između pinova 4 i 6, pin 6 je pin osjetnika, dodajte žicu, folijuCapSense In3 = CapSense (2, 8); // 2M otpornik između pinova 4 i 8, pin 8 je pin osjetnika, dodajte žicu, folijuCapSense In4 = CapSense (2, 12); // 2M otpornik između pinova 4 i 8, pin 8 je pin osjetnika, dodajte žicu, folijuCapSense In5 = CapSense (2, 13); // 2M otpornik između pinova 4 i 8, pin 8 je pin osjetnika, dodajte žicu, foliju // PWM deklaracija pinovaint PinR1 = 3; int PinG1 = 5; int PinB1 = 6; // Ostale varijableint Color1 = 128; // započinjemo crvenom bojom Brightness1 = 255; // počinje pri punoj svjetliniint RedValue1, GreenValue1, BlueValue1; // RGB componentsvoid setup () {// postavlja vrijednosti vremena čekanja senzora In1.set_CS_AutocaL_Millis (timeout); In2.set_CS_AutocaL_Millis (vremensko ograničenje); In3.set_CS_AutocaL_Millis (vremensko ograničenje); In4.set_CS_AutocaL_Millis (vremensko ograničenje); In5.set_CS_AutocaL_Millis (timeout);} void petlja () {long start = millis (); ukupno ukupno1 = In1.capSense (30); ukupno ukupno2 = In2.capSense (30); ukupno ukupno3 = In3.capSense (30); ukupno ukupno4 = In4.capSense (30); ukupno ukupno5 = In5.capSense (30); if (ukupno2> 150) {Color1 ++; // povećavanje boje if (Color1> 255) {// Color1 = 0; }} else if (ukupno3> 200) {Color1--; // smanjujemo boju if (Color1 <0) {// Color1 = 255; } // pretvoriti nijansu u rgb hueToRGB (boja1, svjetlina1); // upisuje boje na PWM pinove analogWrite (PinR1, RedValue1); analogWrite (PinG1, GreenValue1); analogWrite (PinB1, BlueValue1);} // funkcija za pretvaranje boje u njenu crvenu, zelenu i plavu komponentu.void hueToRGB (int nijansa, int svjetlina) {unsigned int scaledHue = (hue * 6); nepotpisani int segment = scaledHue / 256; // segment 0 do 5 oko kotača u boji unsigned int segmentOffset = scaledHue - (segment * 256); // pozicija unutar segmenta unsigned int compliment = 0; bez potpisa int prev = (svjetlina * (255 - segmentOffset)) / 256; unsigned int next = (svjetlina * segmentOffset) / 256; if (invertiraj) {brightness = 255-brightness; kompliment = 255; prev = 255-prev; next = 255-next; } prekidač (segment) {slučaj 0: // crveno RedValue1 = svjetlina; GreenValue1 = next; BlueValue1 = kompliment; break; slučaj 1: // žuta RedValue1 = prev; GreenValue1 = svjetlina; BlueValue1 = kompliment; break; slučaj 2: // zelena RedValue1 = kompliment; GreenValue1 = svjetlina; BlueValue1 = next; break; slučaj 3: // cijan RedValue1 = kompliment; GreenValue1 = prev; BlueValue1 = svjetlina; break; slučaj 4: // plava RedValue1 = next; GreenValue1 = kompliment; BlueValue1 = svjetlina; break; slučaj 5: // magenta zadano: RedValue1 = svjetlina; GreenValue1 = kompliment; BlueValue1 = prev; break; }} --- KRAJ ---

Korak 6: Ambi svjetlo - Arduino strana

Naravno, bilo bi potpuno cool moći kontrolirati svjetlo raspoloženja s vašeg računara. Na primjer, za stvaranje ambilighta ili diska sa zvukom. Ovaj dio se fokusira na dio ambilight -a, u budućnosti ću dodati još funkcionalnosti. Pa, nema dodatnih kola jer je sve dostupno u Arduinu. Ono što ćemo koristiti su mogućnosti serijske komunikacije i neki softver 'Processing 1.0'. Priključite svoj arduino na računar putem USB kabla (ako ste na njega postavljali skice, to već jeste). Za arduino, moramo dodati još neki kôd za serijsku komunikaciju. Kod će se prebaciti u način slušanja, okrećući kapacitivne senzore sve dok prima RGB vrijednosti od računara. Zatim postavlja RGB vrijednosti na PWM pinove. Ovo je moj konačni kod za sada, provjerite sami promjene: --- Arduino Ambilight kôd ---#uključuje const boolean invert = true; const long timeout = 10000; long commStart = 0; char val; // Deklaracija kapacitivnog senzoraCapSense In1 = CapSense (2, 4); // 2M otpornik između pinova 4 i 2, pin 2 je pin osjetnika, dodajte žicu, folijuCapSense In2 = CapSense (2, 7); // 2M otpornik između pinova 4 i 6, pin 6 je pin osjetnika, dodajte žicu, folijuCapSense In3 = CapSense (2, 8); // 2M otpornik između pinova 4 i 8, pin 8 je pin osjetnika, dodajte žicu, folijuCapSense In4 = CapSense (2, 12); // 2M otpornik između pinova 4 i 8, pin 8 je pin osjetnika, dodajte žicu, folijuCapSense In5 = CapSense (2, 13); // 2M otpornik između pinova 4 i 8, pin 8 je pin osjetnika, dodajte žicu, foliju // PWM deklaracija pinovaint PinR1 = 3; int PinG1 = 5; int PinB1 = 6; // Ostale varijableint Color1 = 128; // započinjemo crvenom bojom Brightness1 = 255; // počinje pri punoj svjetliniint RedValue1, GreenValue1, BlueValue1; // RGB componentsvoid setup () {Serial.begin (9600); // započinje serijsku komunikaciju // postavlja vrijednosti vremenskog ograničenja senzora In1.set_CS_AutocaL_Millis (timeout); In2.set_CS_AutocaL_Millis (vremensko ograničenje); In3.set_CS_AutocaL_Millis (vremensko ograničenje); In4.set_CS_AutocaL_Millis (vremensko ograničenje); In5.set_CS_AutocaL_Millis (timeout);} void petlja () {long start = millis (); ukupno ukupno1 = In1.capSense (30); long total2 = In2.capSense (30); ukupno ukupno3 = In3.capSense (30); ukupno ukupno4 = In4.capSense (30); ukupno ukupno5 = In5.capSense (30); if (Serial.available ()) {// Ako su podaci dostupni za čitanje, val = Serial.read (); // pročitajte i spremite u val commStart = millis (); if (val == 'S') {// Ako je primljen početni znak, while (! Serial.available ()) {} // Sačekajte do sljedeće vrijednosti. RedValue1 = Serial.read (); // Kad bude dostupno, dodijeli. while (! Serial.available ()) {} // Isto kao gore. GreenValue1 = Serial.read (); while (! Serial.available ()) {} BlueValue1 = Serial.read (); } Serial.print (RedValue1); Serial.print (GreenValue1); Serial.println (BlueValue1); } else if ((millis () - commStart)> 1000) {if (total2> 150) {Color1 ++; // povećavanje boje if (Color1> 255) {// Color1 = 0; }} else if (ukupno3> 200) {Color1--; // smanjujemo boju if (Color1 <0) {// Color1 = 255; }} hueToRGB (boja1, svjetlina1); } analogWrite (PinR1, RedValue1); analogWrite (PinG1, GreenValue1); analogWrite (PinB1, BlueValue1);} // funkcija za pretvaranje boje u njenu crvenu, zelenu i plavu komponentu.void hueToRGB (int nijansa, int svjetlina) {unsigned int scaledHue = (hue * 6); nepotpisani int segment = scaledHue / 256; // segment 0 do 5 oko kotača u boji unsigned int segmentOffset = scaledHue - (segment * 256); // pozicija unutar segmenta unsigned int compliment = 0; bez potpisa int prev = (svjetlina * (255 - segmentOffset)) / 256; unsigned int next = (svjetlina * segmentOffset) / 256; if (invertiraj) {brightness = 255-brightness; kompliment = 255; prev = 255-prev; next = 255-next; } prekidač (segment) {slučaj 0: // crveno RedValue1 = svjetlina; GreenValue1 = next; BlueValue1 = kompliment; break; slučaj 1: // žuta RedValue1 = prev; GreenValue1 = svjetlina; BlueValue1 = kompliment; break; slučaj 2: // zelena RedValue1 = kompliment; GreenValue1 = svjetlina; BlueValue1 = next; break; slučaj 3: // cijan RedValue1 = kompliment; GreenValue1 = prev; BlueValue1 = svjetlina; break; slučaj 4: // plava RedValue1 = next; GreenValue1 = kompliment; BlueValue1 = svjetlina; break; slučaj 5: // magenta zadano: RedValue1 = svjetlina; GreenValue1 = kompliment; BlueValue1 = prev; break; }} --- KRAJ ---

Korak 7: Ambi Light - računarska strana

Sa bočne strane računara pokreće se skica Processing 1.0, pogledajte processing.org. Ovaj mali (pomalo neuredan) program izračunava prosječnu boju ekrana u svakom trenutku i šalje to na serijski port. Zasad je vrlo osnovni i moglo bi mu trebati malo dotjerivanja, ali radi jako dobro! U budućnosti ću ga ažurirati za više zasebnih RGB traka i odjeljaka ekrana. To možete učiniti i sami, jezik je prilično jasan. Evo koda: --- Obrada 1.0 koda --- uvoz processing.serial.*; Uvoz java.awt. AWTException; uvoz java.awt. Robot; uvoz java.awt. Rectangle; uvoz java.awt.image. BufferedImage; PImage screenshot); //size(screen.width, screen.height); // Odštampajte listu serijskih portova, za potrebe otklanjanja grešaka: println (Serial.list ()); // Znam da je prvi port u serijskoj listi na mom macu // uvijek moj FTDI adapter, pa otvaram Serial.list () [0]. // Na Windows strojevima ovo općenito otvara COM1. // Otvorite bilo koji port koji koristite. String portName = Serial.list () [0]; myPort = new Serial (this, portName, 9600);} void draw () {// image (screenshot, 0, 0, width, height); screenShot = getScreen (); boja kleur = boja (0, 0, 0); kleur = boja (snimak ekrana); //myPort.write(int(red(kleur))+ ','+int (zeleno (kleur))+','+int (plavo (kleur))+13); //myPort.write(int(red(kleur))); //myPort.write (','); //myPort.write(int(green(kleur))); //myPort.write (','); //myPort.write(int(blue(kleur))); //myPort.write(13); fil (kleur); rect (30, 20, 55, 55);} boja u boji (PImage img) {int cols = (img.width); int redovi = (img.height); int dimenzija = (img.width*img.height); int r = 0; int g = 0; int b = 0; img.loadPixels (); // Ga elke pikseli langs (dimenzija) za (int i = 0; i <(dimenzija/2); i ++) {r = r+((img.pikseli >> 16) & 0xFF); g = g + ((img.pikseli >> 8) & 0xFF); b = b + (img.pikseli & 0xFF);} int srednja_r = r/(dimenzija/2); int srednja_g = g/(dimenzija/2); int srednja_b = b/(dimenzija/2); boja srednji_clr = boja (srednji_r, srednji_g, srednji_b); myPort.write ('S'); myPort.write (mean_r); myPort.write (mean_g); myPort.write (mean_b); return (mean_clr);} PImage getScreen () {GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment (); GraphicsDevice gs = ge.getScreenDevices (); Način prikaza DisplayMode = gs [0].getDisplayMode (); Granice pravokutnika = novi pravokutnik (0, 0, mode.getWidth (), mode.getHeight ()); BufferedImage desktop = new BufferedImage (mode.getWidth (), mode.getHeight (), BufferedImage. TYPE_INT_RGB); isprobajte {desktop = new Robot (gs [0]). createScreenCapture (granice); } catch (AWTException e) {System.err.println ("Snimanje ekrana nije uspelo."); } return (nova PImage (desktop));} --- END ---

Korak 8: Rezultat

Rezultat
Rezultat
Rezultat
Rezultat

I ovo je rezultat, zapravo se nalazi na donjoj strani mog kreveta. Još uvijek moram zamijeniti tkaninu, ona će više raspršiti svjetlo. Više slika o tome uskoro. Nadam se da vam se sviđa ovo uputstvo, a nadam se da je i osnova za vašu kreativnost. Zbog vremenskih ograničenja napisao sam to vrlo brzo. Možda ćete morati imati osnovno znanje o arduinu/elektronici da biste ga razumjeli, ali planiram ga ažurirati u budućnosti ako bude dobro prihvaćen.

Preporučuje se: