Spisu treści:

Fantazyjny kapelusz LED: 5 kroków (ze zdjęciami)
Fantazyjny kapelusz LED: 5 kroków (ze zdjęciami)

Wideo: Fantazyjny kapelusz LED: 5 kroków (ze zdjęciami)

Wideo: Fantazyjny kapelusz LED: 5 kroków (ze zdjęciami)
Wideo: 5 sposobów na... SKRYTKI NIE DO WYKRYCIA / sekretna aplikacja / tajemny obraz /... 2024, Listopad
Anonim
Image
Image
Fantazyjny kapelusz LED
Fantazyjny kapelusz LED

Zawsze chciałem zrobić projekt Arduino, ale nigdy nie miałem świetnych pomysłów na taki, dopóki moja rodzina nie została zaproszona na fantazyjne przyjęcie z kapeluszami. Z dwutygodniowym czasem realizacji, byłem ciekawy, czy mógłbym zarówno zaplanować, jak i wykonać czapkę do animacji LED wrażliwą na ruch. Okazuje się, że mógłbym! Prawdopodobnie trochę przesadziłem, ale cały projekt kosztował około 80 dolarów. Dzięki eksperymentom i odrobinie kodowania możesz to zrobić za mniej.

Cel z kapeluszem był następujący:

  1. Niech zestaw świateł przesunie się od środka przedniej części czapki do tyłu, po jednym z każdej strony
  2. Zmień prędkość poruszania się światła podyktowaną przechyleniem kapelusza z przodu na tył
  3. Pozwól, aby światła odwróciły się, gdy opaska na kapelusze była pochylona w dół (tj. Naśladuj wpływ grawitacji na światła)
  4. Zmień kolor na podstawie pochylenia kapelusza od lewej do prawej
  5. Wyczuwaj wstrząsy i wyświetlaj efekt specjalny
  6. Poczuj, jak noszący się kręci, i pokaż efekt specjalny
  7. Miej to całkowicie zawarte w kapeluszu

Krok 1: Potrzebne części

Potrzebne części
Potrzebne części
Potrzebne części
Potrzebne części
Potrzebne części
Potrzebne części

Użyłem następujących głównych komponentów (w tym niestowarzyszonych linków Amazon):

  • Mikrokontroler Teensy LC - wybrałem ten zamiast zwykłego Arduino ze względu na jego mały rozmiar i specjalne połączenie do sterowania moimi diodami LED, a także silne wsparcie biblioteki i społeczności.
  • Czujnik pozycyjny oparty na Bosch BNO055 - szczerze jeden z pierwszych, na temat których znalazłem dokumentację. Istnieją znacznie tańsze opcje, jednak gdy zorientujesz się, że Bosch robi dla ciebie wiele rzeczy, które w przeciwnym razie musiałbyś zrobić w kodzie
  • Adresowalna taśma LED WS2812 - wybrałem długość 1 metra ze 144 diodami LED na metr. Dzięki tej gęstości światło wygląda bardziej, jakby się poruszało, a nie poszczególne elementy zapalające się po kolei.

Oraz następujące drobne elementy:

  • Kapelusz - wystarczy każdy kapelusz z opaską. To jest czapka za 6 USD z lokalnego sklepu. Jeśli ma szew z tyłu, łatwiej będzie przeprowadzić okablowanie. Zwróć uwagę, czy opaska na kapelusz jest przyklejona, ponieważ spowoduje to również dodatkowe trudności. Ten jest wszyty wzdłuż góry, ale dół łatwo podciągnięty.
  • Rezystory 4,7 kiloomów
  • Obudowa na 3 baterie AAA - użycie 3 baterii AAA daje napięcie dokładnie w zakresie, jakiego potrzebuje elektronika, co upraszcza sprawę. AAA pasuje do kapelusza łatwiej niż AA i nadal ma świetny czas pracy.
  • Przewód o małym przekroju - użyłem solidnego drutu, który ułożyłem z poprzedniego projektu LED.
  • Lutownica i lutownica
  • Trochę spandexu pasującego do koloru wnętrza kapelusza i nici

Sugerowane, ale opcjonalne:

  • Szybkozłącza do przewodów akumulatora
  • Narzędzie Helping Hands, te rzeczy są bardzo małe i trudne do lutowania

Krok 2: Zmodyfikuj kapelusz

Zmodyfikuj kapelusz
Zmodyfikuj kapelusz
Zmodyfikuj kapelusz
Zmodyfikuj kapelusz
Zmodyfikuj kapelusz
Zmodyfikuj kapelusz
Zmodyfikuj kapelusz
Zmodyfikuj kapelusz

Potrzebne będzie miejsce w kapeluszu do zamontowania elektroniki oraz miejsce na akumulator. Moja żona zajmuje się odzieżą zawodowo, więc poprosiłem ją o radę i pomoc. Skończyło się na stworzeniu dwóch kieszeni ze spandexu. Pierwsza mniejsza kieszeń z przodu jest skierowana jak sam kapelusz, dzięki czemu po zainstalowaniu elektroniki czujnik położenia jest dość dobrze utrzymywany na miejscu, ale w razie potrzeby można go łatwo wyjąć. Druga kieszeń z tyłu służy do trzymania akumulatora na miejscu.

Kieszenie obszyte były nitką w kolorze kapelusza, wzdłuż całej linii korony. W zależności od stylu kapelusza i materiałów jest on wykonany z YMMV tą techniką.

Odkryliśmy również, że opaska do kapelusza jest schowana z jednej strony i została w całości przyszyta do kapelusza w tym miejscu. Musieliśmy usunąć oryginalny szew, aby poprowadzić diody pod opaską. Podczas budowy był utrzymywany na miejscu za pomocą szpilek, a po zakończeniu zszywany pasującą nicią.

W końcu otworzyliśmy szew z tyłu czapki, gdzie jest on zakryty opaską. Wetknęliśmy wiązkę przewodów dostarczoną z diodami LED przez ten szew i ułożyliśmy pierwszą diodę LED na pasku, aby znajdowała się bezpośrednio na szwie. Następnie owinęliśmy diody LED wokół kapelusza i odcięliśmy pasek tak, aby ostatnia dioda LED znajdowała się tuż obok pierwszej. Taśma LED może być utrzymywana na miejscu tylko za pomocą opaski na kapelusz, jednak w zależności od opaski i materiału może być konieczne zabezpieczenie diod LED przez przyszycie lub przyklejenie.

Krok 3: Podłącz go

Podłącz to w górę
Podłącz to w górę

Płyta Teensy i diody LED będą działać z zasilaniem od 3,3 V do 5 V. Właśnie dlatego zdecydowałem się na użycie 3 baterii AAA, napięcie wyjściowe 4,5 V mieści się w tym zakresie i mają dużo czasu pracy, tak jak zaprogramowałem diody LED. Powinieneś być w stanie uzyskać dobrze ponad 8 godzin działania.

Okablowanie zasilania

Połączyłem dodatnie i ujemne przewody z pojemnika na baterie i diody LED, a następnie przylutowałem do Teensy w odpowiednich miejscach. Dodatni biegun akumulatora należy podłączyć do prawego górnego styku Teensy na schemacie (oznaczonym jako Vin na płycie), a ujemny można podłączyć do dowolnego styku oznaczonego jako GND. Dogodnie jest jeden bezpośrednio po przeciwnej stronie planszy lub tuż obok pinu Vin. Pełny schemat pinów tablicy znajduje się na dole tej strony. A w niektórych przypadkach do zamówienia deski dołączona jest papierowa kopia.

Jeśli planujesz uruchomić kod, który ma tylko kilka diod LED włączonych jednocześnie, możesz zasilać diody LED z samego Teensy, używając wyjścia 3,3 V i GND, jednak jeśli spróbujesz pobrać zbyt dużo energii, możesz uszkodzić deskę. Aby zapewnić sobie jak najwięcej opcji, najlepiej jest podłączyć diody LED bezpośrednio do źródła baterii.

Okablowanie diod LED

Do tego projektu wybrałem Teensy LC, ponieważ ma pin, który znacznie ułatwia podłączenie adresowalnych diod LED. Na spodzie płytki pin, który jest drugi od lewej strony lusterka jest pinem #17, ale też ma na nim 3.3v. Nazywa się to podciąganiem, a na innych płytkach musiałbyś podłączyć rezystor, aby zapewnić to napięcie. W przypadku Teensy LC można po prostu podłączyć ten pin bezpośrednio do przewodu danych LED.

Okablowanie czujnika położenia

Niektóre z dostępnych płyt BNO055 są znacznie bardziej rygorystyczne pod względem napięcia i wymagają tylko 3,3 V. Z tego powodu podłączyłem Vin na płycie BNO055 z dedykowanego wyjścia 3.3V na Teensy, które jest trzecim pinem po prawej stronie. Następnie możesz podłączyć GND na BNO055 do dowolnego GND na Teensy.

Czujnik położenia BNO055 używa I2c do komunikacji z Teensy. I2c wymaga podciągania, więc podłączyłem dwa rezystory 4,7 kΩ z wyjścia 3,3 V na Teensy do pinów 18 i 19. Następnie podłączyłem pin 19 do pinu SCL na płycie BNO055, a 18 do pinu SDA.

Wskazówki/sztuczki dotyczące okablowania

Do wykonania tego projektu użyłem drutu litego zamiast skrętki. Jedną z zalet litego drutu jest lutowanie do takich płytek prototypowych. Możesz zdjąć kawałek drutu, zgiąć go pod kątem 90 stopni i przełożyć przez spód jednego z zacisków, tak aby odcięty koniec drutu wystawał nad płytką. Potrzebujesz wtedy tylko niewielkiej ilości lutu, aby trzymać go na zacisku, a nadmiar możesz łatwo odciąć.

Drut lity może być trudniejszy w obróbce, ponieważ zwykle chce pozostać tak, jak jest wygięty. Jednak dla tego projektu było to zaletą. Przeciąłem i ukształtowałem przewody w taki sposób, aby orientacja czujnika położenia była spójna, gdy wkładałem i wyjmowałem elektronikę z kapelusza w celu dostosowania i programowania.

Krok 4: Programowanie

Teraz, gdy wszystko jest już zmontowane, będziesz potrzebować narzędzia programistycznego kompatybilnego z Arduino. Użyłem rzeczywistego środowiska Arduino IDE (działa z systemami Linux, Mac i PC). Do połączenia z płytką Teensy potrzebne będzie również oprogramowanie Teensyduino. Ten projekt w dużym stopniu wykorzystuje bibliotekę FastLED do programowania kolorów i pozycji diod LED.

Kalibracja

Pierwszą rzeczą, którą będziesz chciał zrobić, to udać się do doskonałego repozytorium GitHub Krisa Winera dla BNO055 i pobrać jego szkic BNO_055_Nano_Basic_AHRS_t3.ino. Zainstaluj ten kod przy uruchomionym monitorze szeregowym, a powie ci, czy płyta BNO055 prawidłowo przechodzi do trybu online i przechodzi autotesty. Przeprowadzi Cię również przez kalibrację BNO055, co później zapewni bardziej spójne wyniki.

Pierwsze kroki ze szkicem Fancy LED

Specjalnie dołączony jest kod czapki Fancy LED, a także na moim repozytorium GitHub. Planuję wprowadzić więcej poprawek do kodu, które zostaną opublikowane w repozytorium GitHub. Plik tutaj odzwierciedla kod, kiedy ta instrukcja została opublikowana. Po pobraniu i otwarciu szkicu musisz zmienić kilka rzeczy. Większość ważnych wartości do zmiany znajduje się na samej górze jako instrukcje #define:

Linia 24: #define NUM_LEDS 89 - zmień to na rzeczywistą liczbę diod LED na pasku LED

Linia 28: #define SERIAL_DEBUG false - prawdopodobnie będziesz chciał, aby to było prawdziwe, aby móc zobaczyć wyjście na monitorze szeregowym

Kod wykrywania pozycji

Wykrywanie pozycji i większość twoich poprawek zaczyna się od linii 742 i przechodzi przez 802. Pobieramy dane dotyczące nachylenia, przechyłu i odchylenia z czujnika położenia i używamy ich do ustawiania wartości. W zależności od tego, jak zamontowana jest Twoja elektronika, może być konieczna ich zmiana. Jeśli zamontujesz czujnik położenia z chipem skierowanym w górę czapki, a strzałka obok X nadrukowanego na tabliczce skierowana w stronę przodu czapki, powinieneś zobaczyć:

  • Pitch kiwa głową
  • Roll przechyla głowę, m.in. przyłóż ucho do ramienia
  • Zbaczanie to kierunek. stoisz (północ, zachód itp.).

Jeśli twoja deska jest zamontowana w innej orientacji, będziesz musiał zamienić skok/przechylenie/odchylenie, aby zachowywały się tak, jak chcesz.

Aby dostosować ustawienia rolki, możesz zmienić następujące wartości #define:

  • ROLLOFFSET: z czapką stabilną i wyśrodkowaną, jak to tylko możliwe, jeśli Roll nie wynosi 0, zmień to o różnicę. Tj. jeśli widzisz Roll na -20, gdy twój kapelusz jest wyśrodkowany, zrób to 20.
  • ROLLMAX: maksymalna wartość używana do pomiaru Roll. Najłatwiej znaleźć, nosząc czapkę i przesuwając prawe ucho w kierunku prawego ramienia. W tym celu podczas korzystania z monitora szeregowego potrzebny będzie długi kabel USB.
  • ROLLMIN: najniższa wartość używana do pomiaru przechyłu, gdy przechylasz głowę w lewo

Podobnie w przypadku Pitch:

  • MAXPITCH - maksymalna wartość, gdy patrzysz w górę
  • MINPITCH - minimalna wartość, gdy patrzysz w dół
  • PITCHCENTER - wartość wysokości dźwięku, gdy patrzysz prosto przed siebie

Jeśli ustawisz SERIALDEBUG na true na górze pliku, powinieneś zobaczyć bieżące wartości dla wyjścia Roll/Pitch/Yaw do monitora szeregowego, aby pomóc dostosować te wartości.

Inne parametry, które możesz chcieć zmienić

  • MAX_LED_DELAY 35 - najwolniej, z jaką cząsteczka LED może się poruszać. To jest w milisekundach. Jest to opóźnienie między przejściem od jednej diody do następnej w ciągu.
  • MIN_LED_DELAY 10 - szybkość, z jaką cząsteczka LED może się poruszać. Jak wyżej, w milisekundach.

Wniosek

Jeśli zaszedłeś tak daleko, powinieneś mieć w pełni działającą i zabawną czapkę LED! Jeśli chcesz zrobić z tym więcej, na następnej stronie znajdziesz zaawansowane informacje na temat zmiany ustawień i robienia własnych rzeczy. a także wyjaśnienie, co robi reszta mojego kodu.

Krok 5: Zaawansowany i opcjonalny: Wewnątrz kodu

Wykrywanie uderzeń i obrotów

Wykrywanie uderzenia/wirowania odbywa się za pomocą funkcji czujnika wysokiego przeciążenia BNO055. Możesz dostosować jego czułość za pomocą następujących linii w initBNO055():

  • Linia #316: BNO055_ACC_HG_DURATION - jak długo ma trwać wydarzenie
  • Linia #317: BNO055_ACC_HG_THRESH - jak silny musi być wpływ
  • Linia #319: BNO055_GYR_HR_Z_SET - próg prędkości obrotowej
  • Linia #320: BNO055_GYR_DUR_Z - jak długo ma trwać rotacja

Obie wartości są binarne 8-bitowe, obecnie wpływ jest ustawiony na B11000000, czyli 192 z 255.

Po wykryciu uderzenia lub wirowania BNO055 ustawia wartość, której kod szuka na początku pętli:

// Wykryj wszelkie wyzwolone przerwania, np. z powodu wysokiego bajtu G intStatus = readByte(BNO055_ADDRESS, BNO055_INT_STATUS); if(intStatus > 8) { wpływ(); } else if(intStatus > 0) { spin(); }

Poszukaj wiersza void impact() powyżej w kodzie, aby zmienić zachowanie przy uderzeniu, lub void spin(), aby zmienić zachowanie wirowania.

Pomocnicy

Stworzyłem prostą funkcję pomocniczą (void setAllLeds()) do szybkiego ustawienia wszystkich diod LED na jeden kolor. Używa się go, aby je wszystkie wyłączyć:

setAllLeds(CRGB::Czarny);

Możesz też wybrać dowolny kolor rozpoznawany przez bibliotekę FastLED:

setAllLeds(CRGB::Czerwony);

Istnieje również funkcja fadeAllLeds(), która przyciemni wszystkie diody LED o 25%.

Klasa cząstek

Aby znacznie uprościć okablowanie, chciałem użyć jednego ciągu diod LED, ale żeby zachowywały się jak wiele ciągów. Ponieważ była to moja pierwsza próba, chciałem, aby było to tak proste, jak to możliwe, więc traktuję jeden ciąg jako dwa, ze środkowymi diodami LED tam, gdzie byłby podział. Ponieważ możemy mieć liczbę parzystą lub nieparzystą, musimy to uwzględnić. Zaczynam od kilku zmiennych globalnych:

/* * Zmienna i pojemniki na diody LED */ Diody CRGB[NUM_LEDS]; static unsigned int curLedDelay = MAX_LED_DELAY; statyczna int centerLed = NUM_LEDS / 2; statyczna int maxLedPos = NUM_LEDS / 2;statyczna wartość logiczna oddLeds = 0; statyczna cząstka boolDir = 1; static bool speedDir = 1;unsigned long dirCount; unsigned long hueCount;

I trochę kodu w setup():

if(NUM_LEDS % 2 == 1) { oddLeds = 1; maxLedPos = NUM_LEDS/2; } else { oddLeds = 0; maxLedPos = LICZBA_LED/2 - 1; }

Jeśli mamy liczby nieparzyste, chcemy użyć 1/2 punktu jako środka, w przeciwnym razie chcemy 1/2 punktu - 1. Jest to łatwe do zauważenia dzięki 10 lub 11 diodom LED:

  • 11 diod LED: 11/2 z liczbami całkowitymi powinno dać 5, a komputery liczą od 0. Tak więc 0-4 to jedna połowa, 6-10 to druga połowa, a 5 jest między nimi. Traktujemy nr 5 w tym przypadku tak, jakby był częścią obu, tj. jest nr 1 dla obu wirtualnych ciągów diod LED
  • 10 diod LED: 10/2 to 5. Ale ponieważ komputery liczą od 0, musimy usunąć jedną. Wtedy mamy 0 - 4 na jedną połowę i 5 - 9 na drugą. #1 dla pierwszego wirtualnego ciągu będzie 4, a #1 dla drugiego wirtualnego ciągu będzie #5.

Następnie w naszym kodzie cząstek musimy wykonać pewne liczenie od naszej ogólnej pozycji do rzeczywistych pozycji w ciągu LED:

if(oddLeds) { Poz1 = centerLed + bieżąca pozycja; Poz2 = centerLed - bieżPoz; } else { Poz1 = centerLed + bież. Poz; Poz2 = (centerLed -1) - bież. Poz; }

Kod zawiera również warunki, w których cząstka może zmieniać kierunek, więc musimy to również wziąć pod uwagę:

if(katalog_cząstek) { if((poz_bież == NUM_LED/2) && diody nieparzyste){ położenie_bież = 0; } else if((currPos == NUM_LEDS/2 - 1) && (!oddLeds)){ currPos = 0; } inny { aktualnyPoz++; } } else { if((currPos == 0) && oddLeds){ currPos = centerLed; } else if((currPos == 0) && (!oddLeds)){ currPos = centerLed - 1; } inny { aktualnyPoz--; } }

Tak więc używamy zamierzonego kierunku (particleDir), aby obliczyć, która dioda LED powinna być dalej zapalona, ale musimy również rozważyć, czy osiągnęliśmy rzeczywisty koniec ciągu diod LED, czy nasz punkt środkowy, który działa również jako koniec dla każdy z wirtualnych ciągów.

Gdy już to ustalimy, w razie potrzeby zapalamy kolejne światło:

if(katalog_cząstek) { if(nieparzyste diody) { Poz1 = centerLed + bieżąca pozycja; Poz2 = centerLed - bież. Poz; } else { Poz1 = centerLed + bież. Poz; Poz2 = (centerLed -1) - bież. Poz; } } else { if(oddLeds) { Poz1 = centerLed - bież. Poz; Poz2 = centerLed + bież. Pos; } else { Poz1 = centerLed - bieżPoz; Poz2 = (centerLed -1) + bież. Poz; } } diody[Poz1] = CHSV(currHue, 255, 255); diody[Poz2] = CHSV(currHue, 255, 255); FastLED.show();}

Po co w ogóle robić z tego klasę? Jak to jest, jest to dość proste i tak naprawdę nie musi być w klasie. Mam jednak plany na przyszłość, aby zaktualizować kod, aby umożliwić więcej niż jedną cząsteczkę na raz, a niektóre działają w odwrotnej kolejności, podczas gdy inne idą do przodu. Myślę, że istnieją naprawdę wspaniałe możliwości wykrywania spinów za pomocą wielu cząstek.

Zalecana: