Popularny post TPReal Napisano Grudzień 7, 2022 Popularny post Udostępnij Napisano Grudzień 7, 2022 Postanowiłem zbudować sobie budzik, który budziłby dźwiękiem dzwonków wietrznych. Filmik z działania - na żywo brzmi lepiej Hardware Urządzenie ma następujące komponenty/elementy: Raspberry Pi Pico W z dolutowanymi przeze mnie złączami Wyświetlacz kolorowy OLED Przyciski: enkoder z gałką oraz przycisk dotykowy Buzzer na wszelki wypadek Małe serwo do ruszania dzwonkiem Próbowałem też zamontować moduł radiowy, ale zupełnie nie mogę go zmusić do działania z odległości większej niż pół metra, więc jest, ale nie jest używany Dzwonek Zaphir Sufi - szukałem dzwonków o ładnym delikatnym dźwięku, i ten zdecydowanie wygrał Obudowa (wyfrezowana deska główna i parę deseczek na "budę") Ozdobny front, zrobiony dla mnie przez przyjaciółkę (nie do tego projektu, ale tu akurat pasowało mi go użyć) Główną deskę wyfrezowałem żeby puścić tam przewody do pokrętła, przycisku dotykowego i ekranu. Wszystkie komponenty, razem z Pico, podłączone są do płytki uniwersalnej z przylutowanymi połączeniami. Dzwonek wisi na haczyku (miał wisieć bezpośrednio na haczyku, ale okazało się że muszę go trochę opuścić, więc jest dodany ten niebieski drucik), a jego sznurek jest przepuszczony przez łapkę obracaną przez serwomechanizm z zakresem ruchu 180°. Przyciski i ekran osadzone są w desce przy użyciu plasteliny. Przycisk zbliżeniowy, jak się okazuje, reaguje nie tylko na palec, ale też na drewno, a nawet na plastik, więc trzeba go ustawić tak, że przed nim jest trochę powietrza, a potem dopiero drewno, w takiej odległości, żeby na nie nie reagował, ale jednocześnie żeby reagował po przyłożeniu do niego palca po drugiej stronie - udało się to zrobić. Software Program jest napisany w MicroPythonie. Okazał się znacznie bardziej skomplikowany, niż pierwotnie podejrzewałem. Zawiera takie na przykład elementy: Pobieranie aktualnego czasu po HTTP (zegar czasu rzeczywistego w Pico nie ma osobnego zasilania). Pobieranie kalendarza świąt (z calendarific.com). Odczytywanie konfiguracji ruchu serwomechanizmem z pliku (istnieją predefiniowane sekwencje, których ustalenie, swoją drogą, było dość pracochłonne; przy niektórych dzwonek zaczyna się za mocno huśtać albo uderza o ścianę i deskę, przy innych brzmi zbyt powtarzalnie). Odczytywanie konfiguracji alarmów: istnieją alarmy zdefiniowane na różne godziny, dni tygodnia, z uwzględnieniem świąt. Poza tym każdy alarm może mieć etapy, na przykład delikatny dzwonek 10 minut przed właściwą godziną alarmu itp. Alarm może też rozsuwać zasłony (projekt zasłon opisany tutaj, dodałem do nich serwer HTTP żeby można nimi zdalnie sterować). Logger zapisujący zdarzenia do plików, z usuwaniem starych plików. Moduł sterowania wyświetlaczem, oparty na klasie framebuf.FrameBuffer. Moduł przesuwa też wyświetlany obraz o kilka pikseli żeby zmniejszyć efekt wypalania obrazu w matrycy OLED. Dużo funkcji ułatwiających pisanie asynchronicznego kodu, bariery cykliczne, czekanie w tle na zmianę pliku itp. Serwer FTP - niezbędny żeby była możliwość wgrać nowy program bez odłączania Pico od układu, co byłoby potwornie uciążliwe. Moduły bezpieczeństwa, uruchamiające serwer FTP w sytuacji dowolnego błędu przy uruchamianiu albo działaniu programu - żeby nawet gdy zdarzy się wgrać kod z literówką, nadal można było to naprawić nie odłączając Pico od układu - póki co to zabezpieczenie faktycznie działa :] Moduł uruchamiania kodu przez FTP - obserwuje określony plik, i uruchamia go gdy tylko zostaje zmieniony. Bardzo pomocne do testowania i debugowania. Biblioteka do wyświetlania menu, pozwalającego na wykonanie pewnych operacji bezpośrednio na urządzeniu, na przykład wyłączenia alarmu, albo określenia, że jakiś dzień ma być traktowany jak dzień wolny, chociaż w kalendarzu nim nie jest. Mnóstwo dodatkowych drobnych ale potrzebnych modułów... W rezultacie niestety okazało się, że kończy mi się pamięć RAM na Pico. Najwięcej pamięci zajmuje sam skompilowany kod MicroPythona. Zmusiło mnie to do lepszej optymalizacji niektórych modułów, ale prawdopodobnie skończy się tak, że będę musiał część modułów włączyć jako część firmware'u - na szczęście MicroPython ma do tego dość dobre wsparcie (code freezing). Jeżeli chodzi o faktyczną konfigurację urządzenia, to w dni robocze ustawiony jest alarm na pewną godzinę, i 10 minut wcześniej zaczyna podzwaniać i po trochu rozsuwać zasłony, natomiast w dni wolne budzik jest późniejszy i znacznie mniej natarczywy. Poza tym dzwonki wydają odgłos co godzinę, od rana (oznacza to co innego w dni pracy, a co innego w dni wolne) do wieczora. Można też uruchomić subtelne podzwanianie, na przykład siedzieć sobie i słuchać. Pokrętło pozwala poruszać się po menu. Można tam testować zapisane konfiguracje dzwonienia, włączać i wyłączać poszczególne alarmy, ustawiać dni wolne, sprawdzać zużycie pamięci, zrestartować urządzenie itp. Rzeczy do poprawy, możliwy dalszy rozwój Wiele rzeczy mi się w tym projekcie udało, ale wiele też jest takich, które być może należało zrobić inaczej, albo też jeszcze ciągle jest szansa je poprawić. Oto niektóre z nich: Pi Pico okazuje się mieć mało pamięci RAM na potrzeby tego programu. Nie wymienię go już na Pi Zero, więc prawdopodobnie będę musiał zamrozić część kodu w firmwarze, co będzie wymagało wyciągnięcia Pico z układu, więc trzeba to zrobić na koniec, kiedy już wszystko będzie sfinalizowane. Niestety słychać bzyczenie serwomechanizmu. Nie przeszkadza mi to specjalnie, i tak jest wielokrotnie cichsze niż silnik krokowy ciągnący zasłony, ale zdecydowanie jest to wada, której raczej nie jestem w stanie naprawić. Rozważałem też poruszać dzwonkami przy użyciu wentylatora, ale ostatecznie nawet nie przetestowałem tej możliwości. Jak wspominałem, moduł radiowy nie działa, w rezultacie nie mogę łatwo włączyć/wyłączyć budzika zdalnie. Rozważam na przykład wystawienie prostego serwera HTTP i strony, na której mogę wykonywać operacje z telefonu. Przydałoby się lepsze wykorzystanie ekranu, na przykład w czasie gdy nic się nie dzieje, można by tam wyświetlić informacje o następnym alarmie itp, chociaż wiąże się to z problemem wypalania w ekranie OLED, dlatego póki co się na to nie zdecydowałem. Czasami to kółko na dole dzwonka stuka o deskę, można pewnie coś okleić czymś miękkim, ale jeszcze nie wiem jak to zrobić dobrze. Ten dzwonek brzmi ślicznie, ale jest dość brzydki z wyglądu moim zdaniem, i mało pasuje do reszty urządzenia. Może owinę go jakimś papierem w bardziej stonowanym kolorze. 9
Treker (Damian Szymański) Grudzień 7, 2022 Udostępnij Grudzień 7, 2022 Dziękuję za opis i gratuluję oryginalnego DIY! Właśnie zatwierdziłem ten temat, więc projekt jest już widoczny publicznie. Jeśli chcesz, aby Twój projekt wziął udział w naszej akcji rabatowej (50 zł do sklepu Botland) to upewnij się, że link do tego tematu umieściłeś w tym miejscu Zachęcam do opisywania kolejnych projektów
ethanak Grudzień 7, 2022 Udostępnij Grudzień 7, 2022 3 godziny temu, TPReal napisał: Nie wymienię go już na Pi Zero A na ESP32? 520 kB RAM (z czego ponad 300 do Twojej własnej dyspozycji), co najmniej 4MB Flash (do 16), ew. jakiś moduł ESP32 WROVER (4 lub 8 MB PSRAM)?
TPReal Grudzień 7, 2022 Autor tematu Udostępnij Grudzień 7, 2022 55 minut temu, ethanak napisał: A na ESP32? 520 kB RAM (z czego ponad 300 do Twojej własnej dyspozycji), co najmniej 4MB Flash (do 16), ew. jakiś moduł ESP32 WROVER (4 lub 8 MB PSRAM)? Nie znam w ogóle ESP32, ale być może przyjrzę się przy kolejnym projekcie, jak rozumiem można tam wsadzić MicroPythona i pewnie niewiele się różni? A tutaj już pewnie zostanie tak jak jest, zwłaszcza że mam tę płytkę polutowaną i na pewno nie mam ochoty jej zmieniać na inny rozmiar...
SOYER Grudzień 7, 2022 Udostępnij Grudzień 7, 2022 @TPReal gratulacje pomysłu i wykonania. Oczywiście o gustach za bardzo nie dyskutujemy, ale mnie się podoba. Jest to coś oryginalnego, innego, połączenie sztuki, elektroniki i Twojego hobby. Brawo. 2
ethanak Grudzień 7, 2022 Udostępnij Grudzień 7, 2022 4 godziny temu, TPReal napisał: Niestety słychać bzyczenie serwomechanizmu. O właśnie: jakie serwo tam wsadziłeś? Trochę się bawiłem różnymi serwami właśnie biorąc pod uwagę głośność pracy, najlepiej wypadło HD 1370A. Wiem, że to maleństwo, ale może wystarczy? 1
pmochocki Grudzień 7, 2022 Udostępnij Grudzień 7, 2022 Pomysł jest fajny, taki budzik który łagodnie budzi - SUPER! Wykonanie mi się podoba. Widać, że się napracowałeś. uPython - rozumiem, że wolisz języki wysokiego poziomu. Właśnie do takich projektów wydaje się idealny. 4 godziny temu, TPReal napisał: zaczyna podzwaniać i po trochu rozsuwać zasłony, natomiast w dni wolne budzik jest późniejszy i znacznie mniej natarczywy. Poza tym dzwonki wydają odgłos co godzinę, od rana (oznacza to co innego w dni pracy, a co innego w dni wolne) do wieczora. Można też uruchomić subtelne podzwanianie, na przykład siedzieć sobie i słuchać. Masz różne tryby tutaj. Możesz trochę przybliżyć część mechaniczną i jak servo jest sterowane? Bardzo fajny pomysł aby tak uruchamiać te dzwonki. Gratuluje pomysłu i wykonania! 1
TPReal Grudzień 7, 2022 Autor tematu Udostępnij Grudzień 7, 2022 (edytowany) 56 minut temu, ethanak napisał: O właśnie: jakie serwo tam wsadziłeś? Trochę się bawiłem różnymi serwami właśnie biorąc pod uwagę głośność pracy, najlepiej wypadło HD 1370A. Wiem, że to maleństwo, ale może wystarczy? Kurcze, jestem pewien że dałem linka do Botlandu, ale znikł... I owszem, jest to to samo serwo. Nie jest samo z siebie głośne, ale niestety jest zamocowane do tej drewnianej konstrukcji, i ona trochę rezonuje. Upchnąłem tam trochę uszczelek gumowych i filcowych, ale niewiele to pomogło. Jeśli chodzi o siłę, jest zupełnie wystarczające, szczególnie że hak znajduje się dokładnie nad osią serwomechanizmu, więc jego ruch nie wykonuje pracy (w sensie nie podnosi dzwonka). 44 minuty temu, pmochocki napisał: Masz różne tryby tutaj. Możesz trochę przybliżyć część mechaniczną i jak servo jest sterowane? Bardzo fajny pomysł aby tak uruchamiać te dzwonki. Dzięki Co do trybów, tu przykładowa konfiguracja alarmu weekendowego: "holiday_wake_up": { "name": "How about waking up?", "time": {"on": "holiday", "at": "9:20"}, "plan": [ {"at_mins": -30, "chimes": "1-subtle-1", "dim": false}, {"at_mins": -29.5, "curtains": 0.15}, {"at_mins": -15, "chimes": "1-subtle-2"}, {"at_mins": -14.5, "curtains": 0.4}, {"at_mins": -0.5, "curtains": 1}, {"at_mins": 0, "chimes": "1-subtle-3"}, ], }, Do tego konfiguracja konkretnych ruchów: "1-subtle-1": ["~", "s",400,500, "d",100, "s",400,0], "1-subtle-2": ["~", [2, "s",400,-400, "s",400,0]], "1-subtle-3": ["~", [2, "s",400,-400, "s",400,0], "d",400, [2, "s",400,400, "s",400,0], ], Serwomechanizm widać na jednym zdjęciu. Jest przymocowany do deski taśmą montażową, jakieś uszczelki tam są między serwem a elementami mocującymi żeby chociaż trochę wyciszyć. Serwo jest sterowane bezpośrednio z układu, w sensie zasilanie idzie z pinu VBUS, który daje 5V bezpośrednio z zasilacza (więc można ciągnąć duży prąd), a przewód sterujący jest na zwykłym pinie, dla którego tworzę machine.PWM na 50Hz, i ustawiam wypełnienie. Edytowano Grudzień 7, 2022 przez TPReal 1
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »