To ostatni przycisk
W całej historii wielcy artyści zawsze mieli swoje odrębne okresy i serie artystyczne: lilie wodne Claude'a Moneta, seria słoneczników Vincenta van Gogha, Pablo Picasso ze swoim niebieskim okresem i wiele innych. Ostatnio zainteresowałem się tworzeniem projektów z przyciskami: Modułowe moduły klawiszy , Klawiatura makro do wbudowanego warsztatu , a teraz opus magnum, ostatni projekt z serii klawiatur — Jeden przycisk, aby wszystkimi rządzić, jeden przycisk, aby je znaleźć . Jeden przycisk, aby zebrać je wszystkie, a za pomocą RGB związać je.
Nie zepsute? Nie naprawiaj tego.
Problem polega na tym, że jest tak wiele programów i tak wiele funkcji, które mogą wykonywać. Możesz mieć grupę przycisków do Photoshopa, niektóre do Outlooka, inne do gier, ale ostatecznie są one statyczne . A w dzisiejszych czasach musisz mieć coś, co jest świadome kontekstu.
Istnieje wiele podkładek makro… we wszystkich kształtach i rozmiarach. Istnieją nawet takie, które są modułowe . Na koniec dnia wszyscy są tacy sami. Dlatego cel jest jasny: stworzyć pad makro, który składa się z jednego przycisku (z RGB), który jest świadomy kontekstu i zastąpi je wszystkie.
Dość dobrze pamiętam, kiedy w 2011 roku Razer ogłosił, że ich kolejny laptop Razer Blade będzie miał dodatkowe klawisze, które można przypisać do specjalnych funkcji w zależności od aktualnie uruchomionej gry. Następnie jest StreamDeck z małymi wyświetlaczami LCD i różnymi innymi projektami typu Screen-on-a-key, takimi jak Optimus Keyboard , Flux Keyboard , thpoll's polykb , które są niesamowite.
Przeszukując internet, aby znaleźć coś podobnego, znalazłem kilka opcji, ale były one O WIELE za drogie i zrujnowałyby zabawę z samodzielnego hakowania. Jednak dla zainteresowanych istnieje kilka opcji przycisków montowanych na wyświetlaczu LCD, które są w większości produkowane przez firmę o nazwie NKK. Uważaj, te mogą kosztować ponad 50 $ za sztukę.
mogę pokazać ci świat
Wydaje się, że istnieje magiczna kraina dla elektroniki i sprzętu, która jest tak przystępna, że grzechem jest z niej nie korzystać. Nazywa się AliExpress. Tam wszystko jest możliwe.
Skupiłem się na bardzo konkretnym produkcie, który na pierwszy rzut oka nie wydawał się prawdziwy, ale okazał się centralnym punktem tego projektu: monochromatyczny wyświetlacz 0,42". Koszt jednego ekranu wynosi 1 USD. Dobrze przeczytałeś. JEDEN DOLAR. Takich cudów jak ten jest mnóstwo.
Jednak prototypowanie komponentów z niestandardowymi złączami to zupełnie inna sprawa. W takim przypadku będziesz miał trudności, ponieważ te, takie jak ekran 0,42", są wyposażone w 16-pinowe złącze o rastrze 0,65. Nie udało mi się znaleźć gotowej płytki drukowanej z takim złączem tylko po to, aby ją podłączyć deska do krojenia chleba, aby przetestować ekran.Dlatego uciekłem się do ręcznego lutowania cienkich jak włos drutów do tych 16 pinów.I zadziałało !
Problem z takimi unikalnymi komponentami SMD polega na tym, że często brakuje im śladów. Zdarzyło mi się to już kilka razy, głównie przy podzespołach USB-C (które potrafią osiągać ceny do 2,5$ za sztukę na mouser , chociaż tańsze opcje są dostępne, ale nigdy nie są dostępne w magazynie). Zwykle masz pikselowane schematy z przybliżonymi pomiarami. Ogólnie rzecz biorąc, ręczne tworzenie śladów nie jest najgorszym doświadczeniem, ale musisz modlić się do każdego boga znanego człowiekowi, aby ostateczna płytka PCB pasowała do komponentu. Zwykle jest… w porządku.
Produkt końcowy
Stamtąd stworzenie ostatecznej płytki PCB nie było trudne. W przeciwieństwie do moich poprzednich projektów, w których używałem ATTiny85 z protokołem VUSB Bit-banged USB ( TinyPad , próbka ATTiny85USB ), zdecydowałem się na nieco bardziej złożony kontroler — ATmega32u4 z zewnętrznym kryształem 16 MHz, który jest 8 -bitowy mikrokontroler zwykle używany z Arduino Pro Micro . Korzystanie z tego kontrolera okazało się znacznie łatwiejsze niż początkowo oczekiwałem, lutowanie i programowanie go przez port ICSP było dziecinnie proste. Na koniec stworzyłem płytkę adaptera dla ekranu OLED, aby obsługiwać niestandardowy raster 0,65 mm i podłączyć wszystkie odpowiednie piny do VCC i GND.
Spakuj wszystko, wyślij do JLCPCB i po krótkiej wycieczce do Hong Kongu wszystkie komponenty mam pod ręką.
Po powrocie do domu usiadłem do lutowania wszystkiego razem. Po ustaleniu, że użyłem niewłaściwego śladu na adapterze OLED dla kabla taśmowego i po przylutowaniu 32u4 na boki, moja kolejna próba była bardziej owocna.
Jakość komponentów
Ku mojemu zdziwieniu odkryłem w tym momencie, że wysłano mi dwa różne typy tego samego ekranu OLED. Jeden z prawidłową jasnością i taki, który musisz zmrużyć tak mocno, jak to możliwe, aby zobaczyć, co jest wyświetlane na ekranie. Twój przebieg może się różnić.
Aby temu zaradzić, przetestowałem wszystkie zamówione przeze mnie ekrany i ustaliłem, które z nich są wadliwe, a które działają. Wymagało to wielu testów z dużą ilością ręcznego lutowania.
Kiedy już przybiłem roboczą partię ekranów, zlutowałem wszystko razem i zacząłem pisać kod.
Oprogramowanie
Kiedy wszystkie komponenty zostały przylutowane, użyłem portu ICSP do flashowania bootloadera Arduino na urządzeniu. W ten sposób wszystkie kolejne flashowania oprogramowania można wykonać za pomocą USB zamiast zastrzeżonego złącza ICSP.
Oprogramowanie jest dość proste. Po stronie PC znajduje się skrypt Pythona, który stale monitoruje najwyższe okno i wysyła dane do kontrolera przy każdej zmianie.
Aby to zrobić, krótka przygoda z MSDN doprowadziłaby cię do kombinacji kilku funkcji Win32API, które całkiem dobrze wykonują swoją pracę. Korzystając z bibliotek win32api Pythona, ten fragment kodu poda nie tylko proces należący do okna, ale także jego tytuł do filtrowania drobnoziarnistego.
def getCurrentWindow():
# Get the currently foreground window
activeWindow = GetForegroundWindow()
# Get the TID, PID of the window
tid, pid = GetWindowThreadProcessId(activeWindow)
# Get the process handle
proc = OpenProcess(PROCESS_QUERY_INFORMATION, False, pid)
# Get the process image name
fullpath = GetModuleFileNameEx(proc, 0)
# Grab the window title
title = GetWindowText(activeWindow)
# Don't forget to close tha handle to prevent resource leakage
CloseHandle(proc)
return {"proc": path.basename(fullpath),
"title": title}
Ostatecznie najłatwiejszą formą komunikacji danych między komputerem a urządzeniem okazał się zwykły protokół szeregowy przez USB. Hej, jeśli Flipper Zero go używa , czemu nie.
Ponieważ komunikacja szeregowa jest raczej powolna i podatna na błędy, niektóre transakcje obejmujące duże ilości danych, takie jak obrazy ekranu, musiały być wysyłane w porcjach. Podział danych na 64-bajtowe fragmenty rozwiązał wszelkie problemy z synchronizacją.
Z punktu widzenia użyteczności korzystanie z biblioteki SSD1306 było wystarczająco łatwe do skonfigurowania i pozostaje tylko związać to wszystko i stale nasłuchiwać na podciągniętym cyfrowym pinie 12 (PD6 w arkuszu danych 32u4), który naciska przycisk wykrywania. I voila!
Możesz sprawdzić wszystkie źródła, BOM i schematy na mojej stronie GitHub .
Sprawdź to w akcji
Spinki do mankietów
OneBtn —https://github.com/gili-yankovitch/onebtn
Twitter — @GiliYankovitch
LinkedIn — @YankovitchGil