Spisu treści:

Pojemnościowy nastrój dotykowy/Ambilight: 8 kroków
Pojemnościowy nastrój dotykowy/Ambilight: 8 kroków

Wideo: Pojemnościowy nastrój dotykowy/Ambilight: 8 kroków

Wideo: Pojemnościowy nastrój dotykowy/Ambilight: 8 kroków
Wideo: Unboxing i Recenzja Mikrofonu DNA CM USB KIT - Czy Warto Kupić? 2024, Lipiec
Anonim
Pojemnościowy nastrój dotykowy/Ambilight
Pojemnościowy nastrój dotykowy/Ambilight

Ta instrukcja jest szybkim opisem mojego doświadczenia w tworzeniu wielofunkcyjnego nastrojowego światła. Oczekuje się pewnej podstawowej wiedzy o obwodach elektronicznych. Projekt nie został jeszcze ukończony, trzeba dodać trochę funkcjonalności i poprawić, ale jest już funkcjonalny. Jeśli jesteście entuzjastami tej instrukcji, zaktualizuję ją. Sercem systemu jest Arduino. Przetworzy dane wejściowe z USB lub każdego z pojemnościowych wejść dotykowych i steruje światłem RGB. Ta instrukcja jest podzielona na trzy sekcje: - Pojemnościowa sekcja dotykowa obejmuje niewidoczne przyciski wejściowe - Sekcja moodlight obejmuje sterowanie nastrojowym światłem - Sekcja ambilight obejmuje wprowadzanie przez port szeregowy, przetwarzając wartości RGB generowane przez program komputerowy do sterowania światłami. Zastrzeżenie: Elektronika może być niebezpieczna, Ty sam odpowiadasz za wszelkie wyrządzone szkody. Część kodu jest pobierana z forów i może nie zawierać nazwiska jego właściciela. Daj mi znać, a dodam Twoje imię.

Krok 1: Lista przedmiotów

Do wykonania tej instrukcji potrzebne są następujące elementy: - Arduino + kabel USB - Płytka do krojenia chleba - Zasilacz komputera - 3 x paski RGB, sprawdź dealextreme.com. - 3 x tranzystory FET TIP120, takie jak https://uk.farnell.com/stmicroelectronics/tip120 /darlington-transistor-to-220/dp/9804005- Pęczek rezystorów (6*10 kiloomów, 3*2 megaomy)- Dużo drutu. - Narzędzia Pojemnościowy dotyk - Metalowe pierścienie do podstawek - Miedziany drut lub płyta - Coś do wbudowania (jak półka na książki:)

Krok 2: Dotyk pojemnościowy - podstawy i obwód

Dotyk pojemnościowy - podstawy i obwód
Dotyk pojemnościowy - podstawy i obwód
Dotyk pojemnościowy - podstawy i obwód
Dotyk pojemnościowy - podstawy i obwód
Dotyk pojemnościowy - podstawy i obwód
Dotyk pojemnościowy - podstawy i obwód

Odkąd malowałem swoje regały, miałem też okazję je „ulepszyć”. Chciałem kontrolować nastrojowe światło za pomocą niewidzialnego dotyku. Początkowo planowałem użyć do tego dedykowanego układu scalonego (takiego jak Atmel QT240). Ale potem natknąłem się na stronę wyjaśniającą, że Arduino może emulować czujnik pojemnościowy przez oprogramowanie. Układ elektroniczny można znaleźć na zdjęciu, czujnik jest spiralnym drutem miedzianym (dla uproszczenia pokazano tylko jeden). Czułość jest kontrolowana przez rezystory znajdujące się przed każdym pinem. Mogą wahać się od 1 MegaOhm (absolutny dotyk) do 40 MegaOhm (12-24 cali) w zależności od tego, czy potrzebny jest absolutny lub bliski dotyk (skończyło się na użyciu rezystorów 2M Ohm). Eksperymentuj z wartościami, aż czujnik zachowa się w pożądany sposób. Dobrym pomysłem jest zainstalowanie pewnej powierzchni przewodzącej (oddzielonej cienkim, nieprzewodzącym elementem) połączonej z masą obwodów z tyłu każdej spirali. W ten sposób czujniki będą bardziej stabilne i mniej podatne na hałas. Trochę więcej zdjęć o montażu czujników na półce z książkami. Zainstalowana jest również wtyczka, aby później łatwo połączyć się z obwodem. Wypełniacz służy do ukrycia wszystkiego, a następnie są gotowe do malowania.

Krok 3: Dotyk pojemnościowy - kod i testowanie

Dotyk pojemnościowy - kod i testowanie
Dotyk pojemnościowy - kod i testowanie

Poniższy kod źródłowy może być użyty na Arduino do debugowania, sprawdź wartości za pomocą monitora szeregowego arduino. Generowanych jest sześć wartości. Pierwszy jest miarą wydajności systemu. Drugi do szóstego to wykryte wartości na każdym pinie. Wartości powinny rosnąć, gdy zbliżasz się do palca. Jeśli nie, sprawdź, czy nie ma złych połączeń i zakłóceń. Wartości rezystorów można zmienić, aby określić czułość. Poprzez implementację struktury if-then, która jest aktywowana przy pewnym logicznym progu, można dokonać przełączenia. Będzie to użyte w końcowym kodzie arduino. Więcej informacji, sugerowane do przeczytania: https://www.arduino.cc/playground/Main/CapSense--- Kod debugowania Arduino CapTouch ---#include void setup() {CapSense cs_2_3 = CapSense(2, 4); // Rezystor 10M między pinami 2 i 4, pin 4 to pin czujnika, dodaj przewód, foilCapSense cs_2_4 = CapSense(2, 7); // Rezystor 10M między pinami 2 i 7, pin 7 to pin czujnika, dodaj przewód, foilCapSense cs_2_5 = CapSense(2, 8); // Rezystor 10M między pinami 2 i 8, pin 8 to pin czujnika, dodaj przewód, foilCapSense cs_2_6 = CapSense(2, 12); // Rezystor 10M między pinami 2 i 12, pin 12 to pin czujnika, dodaj przewód, foilCapSense cs_2_7 = CapSense(2, 13); // Rezystor 10M między pinami 2 i 13, pin 13 to pin czujnika, dodaj przewód, foliavoid setup() { Serial.begin(9600);}void loop() { long start = millis(); długa suma1 = cs_2_3.capSense(30); długa suma2 = cs_2_4.capSense(30); długa suma3 = cs_2_5.capSense(30); długa suma4 = cs_2_6.capSense(30); długa suma5 = cs_2_7.capSense(30); Serial.print(millis() - start); // sprawdź wydajność w milisekundach Serial.print("\t"); // znak tabulacji do debugowania odstępów między oknami Serial.print(total1); // drukuj wyjście czujnika 1 Serial.print("\t"); Serial.print(ogółem2); // drukuj wyjście czujnika 2 Serial.print("\t"); Serial.print(ogółem3); // drukuj wyjście czujnika 3 Serial.print("\t"); Serial.print(ogółem4); // drukuj wyjście czujnika 4 Serial.print("\t"); Serial.println(ogółem5); // drukuj wyjście czujnika 5 delay(10); // dowolne opóźnienie w celu ograniczenia danych do portu szeregowego }--- END ---

Krok 4: Nastrojowe światło - podstawy i obwód

Lampka nastrojowa - podstawy i obwód
Lampka nastrojowa - podstawy i obwód
Lampka nastrojowa - podstawy i obwód
Lampka nastrojowa - podstawy i obwód
Lampka nastrojowa - podstawy i obwód
Lampka nastrojowa - podstawy i obwód

Teraz nadszedł czas na zbudowanie wyjściowej części systemu. Piny PWM arduino będą używane do sterowania każdym kolorem. PWM oznacza modulację szerokości impulsu, poprzez bardzo szybkie włączanie i wyłączanie pinu diody LED zostaną przyciemnione od 0 do 255. Każdy pin zostanie wzmocniony przez FET. Na razie system ma tylko jeden kanał na kolor, co oznacza, że wszystkie paski RGB będą sterowane jednocześnie i potrzebne są 3 piny PWM (po jednym na każdy kolor). W przyszłości chcę mieć możliwość sterowania każdym z moich czterech pasków RGB. Oznacza to 4 * 3 = 12 pinów PWM (i prawdopodobnie Arduino Mega). Ok, czas na kilka schematów! To (patrz zdjęcie) jest podstawową reprezentacją obwodu (wkrótce stanie się ładniejsza). W zestawie znajdują się również czujniki pojemnościowe (część zielona). Zasadniczo należy wyjaśnić trzy elementy: FETTo wzmacniacz, o którym mówiłem. Ma Bramę, Źródło i Drenaż. Wzmacnia zmysły niewielki prąd na bramce (podłączonej do Arduino) i otwiera drogę dla paska RGB zasilanego napięciem 12 woltów. Źródło powinno być na +12V, dren na GND (uziemienie). Sprawdź arkusz specyfikacji swojego FET, aby uzyskać dokładny opis pinów. Każdy kanał RGB powinien być umieszczony przed własnym FET. W tym sensie działa jak przełącznik sterowany Arduino.- Pasek RGBTa 12-woltowa taśma RGB jest typu wspólnej anody (+). Oznacza to, że wspólny przewód powinien być podłączony do +12V, a prąd jest odprowadzany przez każdy z oddzielnych kanałów kolorów. Listwa ma wbudowane rezystory, więc nie martw się o to!- RezystoryTrzy rezystory 10k zapewnią, że FET nie włączy się, gdy nie powinny się włączać. Trzy inne ograniczą maksymalny prąd pobierany przez FET. Trzy górne rezystory są już w listwie RGB. Do listew RGB przylutowałem kable USB dzięki czemu mogę je modułowo łatwo połączyć. Wtyczki ze starego huba są umieszczone na mojej płytce stykowej. Użyj starego zasilacza komputerowego do soku, 12 V do zasilania paska RGB i ewentualnie 5 V do obwodu, jeśli chcesz, aby działał bez kabla USB.

Krok 5: Nastrojowe światło - kod i kontrola

Światło nastrojowe jest kontrolowane przez czujniki pojemnościowe. Na razie zaprogramowałem tylko czujniki 2 i 3 do zmiany koloru. Pozostałe czujniki na razie nie działają. Oto kod:--- Kod kontroli nastroju Arduino ---#include const boolean invert = true;const long timeout = 10000;// Deklaracja czujnika pojemnościowegoCapSense In1 = CapSense(2, 4); // Rezystor 2M między pinami 4 i 2, pin 2 to pin czujnika, dodaj przewód, foilCapSense In2 = CapSense(2, 7); // Rezystor 2M między pinami 4 i 6, pin 6 to pin czujnika, dodaj przewód, foilCapSense In3 = CapSense(2, 8); // Rezystor 2M między pinami 4 i 8, pin 8 to pin czujnika, dodaj przewód, foilCapSense In4 = CapSense(2, 12); // Rezystor 2M między pinami 4 i 8, pin 8 to pin czujnika, dodaj przewód, foilCapSense In5 = CapSense(2, 13); // Rezystor 2M między pinami 4 i 8, pin 8 to pin czujnika, dodawanie przewodu, folia// PWM Deklaracje pinówint PinR1 = 3;int PinG1 = 5;int PinB1 = 6;// Inne zmienneint Color1 = 128; // zacznij od koloru czerwonego jak colourint Jasność1 = 255; // zacznij od pełnej jasnościint RedValue1, GreenValue1, BlueValue1; // Komponenty RGBvoid setup() { // ustaw wartości limitu czasu czujnika In1.set_CS_AutocaL_Millis(timeout); In2.set_CS_AutocaL_Millis (przekroczenie limitu czasu); In3.set_CS_AutocaL_Millis (przekroczenie limitu czasu); In4.set_CS_AutocaL_Millis (przekroczenie limitu czasu); In5.set_CS_AutocaL_Millis(timeout);}void loop() { długi start = millis(); długa suma1 = In1.capSense(30); długa suma2 = In2.capSense(30); długa suma3 = In3.capSense(30); długa suma4 = In4.capSense(30); długa suma5 = In5.capSense(30); jeśli (ogółem2 > 150) { Kolor1++; // zwiększ kolor if(Color1 > 255) { // Color1 = 0; } } else if (łącznie3 > 200) { Color1--; // zmniejsz kolor if(Color1 < 0) { // Color1 = 255; } // zamień barwę na rgb hueToRGB(Kolor1, Jasność1); // zapisz kolory do pinów PWM analogWrite(PinR1, RedValue1); zapis analogowy(PinG1, GreenValue1); analogWrite(PinB1, BlueValue1);}// funkcja konwersji koloru na jego składowe czerwony, zielony i niebieski.void hueToRGB(int barwa, int jasność){ unsigned int scaledHue = (odcień * 6); unsigned int segment = scaledHue/256; // segment od 0 do 5 wokół koła kolorów unsigned int segmentOffset = scaledHue - (segment * 256); // pozycja w segmencie unsigned int compliment = 0; unsigned int prev = (jasność * (255 - segmentOffset)) / 256; unsigned int next = (jasność * segmentOffset) / 256; if(invert) { jasność = 255-jasność; komplement = 255; poprzedni = 255-poprzedni; następny = 255-następny; } switch(segment) { case 0: // czerwony RedValue1 = jasność; ZielonaWartość1 = dalej; NiebieskaWartość1 = komplement; przerwa; case 1: // żółty RedValue1 = prev; GreenValue1 = jasność; NiebieskaWartość1 = komplement; przerwa; przypadek 2: // zielony RedValue1 = komplement; GreenValue1 = jasność; NiebieskaWartość1 = dalej; przerwa; przypadek 3: // cyjan RedValue1 = komplement; ZielonaWartość1 = poprzedni; BlueValue1 = jasność; przerwa; przypadek 4: // niebieski RedValue1 = następny; ZielonaWartość1 = komplement; BlueValue1 = jasność; przerwa; case 5: // magenta domyślnie: RedValue1 = jasność; ZielonaWartość1 = komplement; NiebieskaWartość1 = poprzedni; przerwa; }}--- KOŃCZYĆ SIĘ ---

Krok 6: Światło Ambi - strona Arduino

Oczywiście byłoby całkiem fajnie móc sterować nastrojowym światłem z komputera. Na przykład, aby stworzyć ambilight lub dyskotekę sterowaną dźwiękiem. Ta sekcja skupia się na części ambilight, w przyszłości dodam więcej funkcjonalności. Cóż, nie ma żadnych dodatkowych obwodów, ponieważ wszystko jest dostępne w Arduino. Będziemy używać możliwości komunikacji szeregowej i oprogramowania „Przetwarzanie 1.0”. Podłącz swoje arduino do komputera za pomocą kabla USB (jeśli przesyłałeś do niego szkice, to już jest). W przypadku arduino trzeba dodać dodatkowy kod do komunikacji szeregowej. Kod przełączy się w tryb nasłuchiwania, wyłączając czujniki pojemnościowe, o ile otrzyma wartości RGB z komputera. Następnie ustawia wartości RGB na piny PWM. To jest mój ostatni kod na razie, sprawdź sam zmiany:--- Arduino Ambilight Code ---#include const boolean invert = true;const long timeout = 10000;long commStart = 0;char val;// Deklaracja czujnika pojemnościowegoCapSense In1 = CapSense(2, 4); // Rezystor 2M między pinami 4 i 2, pin 2 to pin czujnika, dodaj przewód, foilCapSense In2 = CapSense(2, 7); // Rezystor 2M między pinami 4 i 6, pin 6 to pin czujnika, dodaj przewód, foilCapSense In3 = CapSense(2, 8); // Rezystor 2M między pinami 4 i 8, pin 8 to pin czujnika, dodaj przewód, foilCapSense In4 = CapSense(2, 12); // Rezystor 2M między pinami 4 i 8, pin 8 to pin czujnika, dodaj przewód, foilCapSense In5 = CapSense(2, 13); // Rezystor 2M między pinami 4 i 8, pin 8 to pin czujnika, dodawanie przewodu, folia// PWM Deklaracje pinówint PinR1 = 3;int PinG1 = 5;int PinB1 = 6;// Inne zmienneint Color1 = 128; // zacznij od koloru czerwonego jak colourint Jasność1 = 255; // zacznij od pełnej jasnościint RedValue1, GreenValue1, BlueValue1; // Komponenty RGB: unieważnione ustawienie() { Serial.begin(9600); // uruchom komunikację szeregową// ustaw wartości limitu czasu czujnika In1.set_CS_AutocaL_Millis(timeout); In2.set_CS_AutocaL_Millis (przekroczenie limitu czasu); In3.set_CS_AutocaL_Millis (przekroczenie limitu czasu); In4.set_CS_AutocaL_Millis (przekroczenie limitu czasu); In5.set_CS_AutocaL_Millis(timeout);}void loop() { długi start = millis(); długa suma1 = In1.capSense(30); długa suma2 = In2.capSense(30); długa suma3 = In3.capSense(30); długa suma4 = In4.capSense(30); długa suma5 = In5.capSense(30); if (Serial.available()) { // Jeśli dane są dostępne do odczytu, val = Serial.read(); // przeczytaj i zapisz w val commStart = millis(); if (val == 'S') { //Jeśli otrzymano znak początkowy, while (!Serial.available()) {} //Czekaj na następną wartość. CzerwonaWartość1 = Serial.odczyt(); //Gdy będzie dostępny, przypisz. while (!Serial.available()) {} //Tak samo jak powyżej. ZielonaWartość1 = Serial.odczyt(); while (!Serial.available()) {} BlueValue1 = Serial.read(); } Serial.print(RedValue1); Serial.print(GreenValue1); Serial.println(NiebieskaWartość1); } else if ((millis() - commStart) > 1000) { if (total2 > 150) { Color1++; // zwiększ kolor if(Color1 > 255) { // Color1 = 0; } } else if (łącznie3 > 200) { Color1--; // zmniejsz kolor if(Color1 < 0) { // Color1 = 255; } } hueToRGB(Kolor1, Jasność1); } analogWrite(PinR1, RedValue1); zapis analogowy(PinG1, GreenValue1); analogWrite(PinB1, BlueValue1);}// funkcja konwersji koloru na jego składowe czerwony, zielony i niebieski.void hueToRGB(int barwa, int jasność){ unsigned int scaledHue = (odcień * 6); unsigned int segment = scaledHue/256; // segment od 0 do 5 wokół koła kolorów unsigned int segmentOffset = scaledHue - (segment * 256); // pozycja w segmencie unsigned int compliment = 0; unsigned int prev = (jasność * (255 - segmentOffset)) / 256; unsigned int next = (jasność * segmentOffset) / 256; if(invert) { jasność = 255-jasność; komplement = 255; poprzedni = 255-poprzedni; następny = 255-następny; } switch(segment) { case 0: // czerwony RedValue1 = jasność; ZielonaWartość1 = dalej; NiebieskaWartość1 = komplement; przerwa; przypadek 1: // żółty RedValue1 = prev; GreenValue1 = jasność; NiebieskaWartość1 = komplement; przerwa; przypadek 2: // zielony RedValue1 = komplement; GreenValue1 = jasność; NiebieskaWartość1 = dalej; przerwa; przypadek 3: // cyjan RedValue1 = komplement; ZielonaWartość1 = poprzedni; BlueValue1 = jasność; przerwa; przypadek 4: // niebieski RedValue1 = następny; ZielonaWartość1 = komplement; BlueValue1 = jasność; przerwa; case 5: // magenta domyślnie: RedValue1 = jasność; ZielonaWartość1 = komplement; NiebieskaWartość1 = poprzedni; przerwa; }}--- KOŃCZYĆ SIĘ ---

Krok 7: Światło Ambi - strona komputera

Po stronie komputera uruchamiany jest szkic Processing 1.0, zobacz processing.org. Ten mały (nieco niechlujny) program oblicza średni kolor ekranu w każdej chwili i wysyła go do portu szeregowego. Jak na razie jest bardzo prosty i można go trochę poprawić, ale działa bardzo dobrze! Zaktualizuję go w przyszłości dla wielu oddzielnych pasków RGB i sekcji ekranu. Możesz też zrobić to sam, język jest dość prosty. Oto kod:--- Przetwarzanie kodu 1.0 ---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" });}unieważnij ustawienia() { size(100, 100); //rozmiar(szerokość.ekranu, wysokość.ekranu); // Wydrukuj listę portów szeregowych do celów debugowania: println(Serial.list()); // Wiem, że pierwszy port na liście portów szeregowych na moim Macu // jest zawsze moim adapterem FTDI, więc otwieram Serial.list()[0]. // Na komputerach z systemem Windows zazwyczaj otwiera port COM1. // Otwórz port, którego używasz. String nazwa_portu = Serial.list()[0]; myPort = new Serial(this, portName, 9600);}nieważne rysowanie () { //image(screenShot, 0, 0, szerokość, wysokość); zrzut ekranu = getScreen(); kolor kleur = kolor(0, 0, 0); kleur = kolor(Zrzut ekranu); //myPort.write(int(red(kleur))+', '+int(zielony(kleur))+', '+int(niebieski(kleur))+13); //myPort.write(int(red(kleur))); //mójPort.write(', '); //myPort.write(int(zielony(kleur))); //mójPort.write(', '); //myPort.write(int(niebieski(kleur))); //mojPort.write(13); wypełnić(kleur); rect(30, 20, 55, 55);}color color(PImage img) { int cols = (img.width); int wiersze = (obraz.wysokość); wymiar int = (obraz.width*img.height); int r = 0; intg = 0; intb = 0; img.loadPixels();// Ga elke pixel langs (wymiar)for (int i = 0; i < (wymiar/2); i++) { r = r + ((img.pixels >> 16) & 0xFF); g = g + ((img.pixels >> 8) & 0xFF); b = b + (img.pixels & 0xFF);}int średnia_r = r/(wymiar/2);int średnia_g = g/(wymiar/2);int średnia_b = b/(wymiar/2);kolor średnia_clr = kolor(średnia_r, średnia_g, średnia_b); mójPort.write('S'); mójPort.write(średnia_r); mojPort.write(mean_g); myPort.write(mean_b);return (mean_clr);}PImage getScreen() { Środowisko Grafiki ge = Środowisko Grafiki.getLocalŚrodowisko Grafiki(); Urządzenie Graficzne gs = ge.getScreenUrządzenia(); Tryb wyświetlania = gs[0].getDisplayMode(); Granice prostokąta = new Rectangle (0, 0, mode.getWidth(), mode.getHeight()); Pulpit BufferedImage = new BufferedImage(mode.getWidth(), mode.getHeight(), BufferedImage. TYPE_INT_RGB); spróbuj { desktop = new Robot(gs[0]).createScreenCapture(bounds); } catch(AWTException e) { System.err.println("Przechwytywanie ekranu nie powiodło się."); } return (nowy PImage(desktop));}--- END ---

Krok 8: Wynik

Wynik
Wynik
Wynik
Wynik

I to jest wynik, znajduje się w dolnej części mojego łóżka. Muszę jeszcze wymienić szmatkę, będzie bardziej rozpraszać światło. Więcej zdjęć na ten temat wkrótce. Mam nadzieję, że podoba Ci się ta instrukcja, a także mam nadzieję, że jest to podstawa Twojej własnej kreatywności. Z powodu ograniczeń czasowych napisałem go bardzo szybko. Być może będziesz potrzebować podstawowej wiedzy na temat arduino/elektroniki, aby to zrozumieć, ale planuję zaktualizować ją w przyszłości, jeśli zostanie dobrze odebrana.

Zalecana: