Popularny post Gieneq Napisano Październik 13, 2020 Popularny post Udostępnij Napisano Październik 13, 2020 (edytowany) Jako fan klawiatur z makrami chciałbym podzielić się z Wami kolejnym projektem. Zaczęło się od małej klawiatury, o której wpis powstał na blogu, a tu już 3 klawiatura (w tym 2 na ESP32). Główną motywacją jest upraszczanie rozbudowanych skrótów klawiszowych, zastąpienie skrótów fikuśnym układem klawiszy oraz automatyzacja powtarzalnych czynności (niewykrywalny bot w grach?). Klawiatura ESP32 V1 Pierwsze podejście do klawiatury na ESP32 było dość udane. Dość... bo klawiatura była niezbyt praktyczna, acz jak na samoróbkę bardzo ładnie wykonana. Brakowało jej jedynie wieczka z czymś do klikania. Składając całość z kawałków HIPSu stwierdziłem, że wieczko to taki banał że wydrukuję w 3D... i tak wydrukowałem że niebyło jak tego przymocować. W końcu zniechęciłem się i projekt poszedł do szuflady. Upakowanie całkiem udane, zwłaszcza że nie ma tu dedykowanej płytki. Co więcej da się to rozebrać i ani grama hot glue! Klawiatura ESP32 V2 Do kolejnego projektu zabrałem się nieco lepiej. Założenia są takie: przyciski mechaniczne i zwykłe, różne rozmieszczenia (żeby czymś się wyróżniały), przyciski mają być duże, nie jak w pierwszej wersji, wzór dla "gejmerów", żeby był WSAD i co tam gejmer potrzebuje do klikania, wyświetlacz i menu do zmiany trybów, zasilanie USB C / akumulator. Wyświetlacz jest o tyle ważna, że używam różne programy (Corel, przeglądarka, Eagle, Fusion 360, TexWorks) i fajnie by było mieć coś do każdego, idealnie byłoby gdyby przy zmianie trybów coś działo się z przyciskami ale ostatecznie skończy się na wypaleniu w drewnie jakiś ślaczków jako wzorki przycisków. To jednak musi poczekać, najpierw elektronika i program. I tak powstał projekt płytki w programie Eagle, częściowo bazując na inżynierii odwrotna ESP32 dev module. Układ zasilania Myślę że za wyjątkiem walorów estetycznych jakiekolwiek powyżej widać, lepiej będzie obejrzeć schemat. Zacznijmy od zasilania, które pochodzi z 2 źródeł: USB C używanego do programowania i ładowania, akumulatora litowo polimerowego. Tu blok dotyczący USB: Złącze USB C oporządzone zgodnie ze sztuką, do tego transile żeby nie groziły przepięcia (to raczej wodotrysk ale niech będzie) i tu pierwsza gafa... zamieniłem D + z D- co odkryłem dopiero, gdy polutowana płytka nie chciała pogadać z komputerem. Wiec pierwsze 2 poprawki zagościły na płytce. Po prawej stronie widnieje typowy układ z dev modułów CP2101 zmontowany w konfiguracji zasilania z zewnętrznego źródła 3,3V. Więcej na ten temat można znaleźć we wpisie na temat układu CP2101/2, który dodałem jakiś czas temu. Z ciekawszych sygnałów mamy tu RX/TX służące do programowania, oraz DTR i RTS służące do wyzwalania programowania. Mamy tu też sygnał USB_5V (jest to nieco zbite 5V pochodzące z USB, które służy do aktywowania układu komunikacyjnego. Jest to potrzebne gdyż 3,3V będzie trafiać na układ cały czas, a ma on działać tylko przy podłączeniu po kablu (przy zasilaniu z akumulatora układ powinien być wyłączony). Widnieje tu też bardzo ważny sygnał, a zarazem zasilanie - VBUS. Jest to istotny sygnał przy przełączaniu źródła zasilania widoczny w kolejnym bloku: Tu widać diodę sygnalizującą zasilanie z USB (przy zasilaniu z baterii, gdzie VBUS wisi w powietrzu nie świeci). Widać też moduł ładowarki podpięty do VBUS. Chyba najciekawszą częścią elektroniczną jest fragment, w którym następuje przełączenie źródła zasilania. Jest to jeden z tematów często poruszanych przez początkujących walczących z Arduino UNO, które ma 2 opcje zasilania. W tym przypadku sposób sterowania jest prostszy: Przy podłączeniu zasilania przez USB na VBUS jest około 5V, trafia to na bramkę tranzystora Q1 odcinając akumulator, prąd dostarczany jest przez diodę shottkyego D1. Tu nie do końca pomyślałem, bo dioda BAT60J ma dość małą moc, raptem 310 mW, więc przy spadku napięcia około 0,3V to 100 mA to dość mało. Ale z drugiej strony pobór prądu nie powinien być tu zbyt wysoki. Gdy odetnie się zasilanie z USB to bramka ściągana jest do masy i podawane jest zasilanie z baterii. Tu widać drobną rozbieżność w wydajności źródeł zasilania, tranzystor AO4459 jest w stanie udźwignąć 3W. Dobierałem go jednak głównie po to by dało się go łatwo wysterować z niskich napięć i napięcie progowe VGSth przy znikomym prądzie drenu to jedynie 1,9V. Dalej prąd trafia na rezystor pomiarowy żeby móc pomierzyć pobór prądu. Wynik jest mierzony przez komparator w układzie różnicowym. Prąd trafia też na regulator napięć MCP170. Dygresja o regulatorach Jakiś czas temu miałem możliwość przetestować sporo regulatorów LDO 3,3V i 5V. Przyznam że do tamtego momentu obierałem 3 drogi: jak chce 5V to LM7805, jak chce 3,3V to LM1117, jak coś innego to pewnie przetwornica impulsowa. Zaś temat regulatora w zasilaniu bateryjnym wiał grozą. A tu okazuje się, że niekoniecznie... Przeanalizowałem kilka modeli patrząc na parametry: napięcia zasilania, maksymalny prąd wyjściowy, prąd w stanie spoczynku (Quiescent Current). I gdy wziąłem układ LDO LM1117, który często widnieje na płytkach ESP to szło się złapać za głowę... Układ ten ma koszmarnie wielki prąd spoczynkowy! Wieje grozą... wielkie miliampery! Oczywiście zależy co chcemy zbudować, ale do zasilania bateryjnego nie polecam... Regulator MCP170 Tak więc moja perełka czyli układ MCP170 posiada takie cudne parametry: 2 uA prądu spoczynkowego to już coś 🤩 dodając do tego bardzo oszczędne tryby pracy ESP32 to można śmiało uznać to za coś co nada się do zasilania z akumulatora. Oczywiście taki układ musi mieć wadę, no i jest - max prąd raptem 250 mA, ale... po co większy? No może do tego bloku: ale postaram się nie robić z klawiatury lampy dyskotekowej. Ktoś zapyta po co te LEDy? A to się później przyda jak będę robił obudowę 😉 mam nadzieję, że się przyda, bo obudowa jest na razie tylko w wyobraźni. Jest tu zatem wąskie gardło dla tranzystora Q1 i wyzwanie dla diody D1, która nie jest w stanie przepuścić prądu 250mA. Więc albo ją wymienię na coś większego albo będę dbał o to żeby nie przekroczyć prądu 100mA. Wydaje mi się, że podmianka jest lepszym pomysłem, bo może to byc jakakolwiek dioda, nawet 0,7 krzemowa, gdyż zapas napięcia jest dość duży. LDO wymaga zapasu jedynie 625 mA przy max poborze prądu 250 mA więc spokojnie 5V da radę wyciągnąć na 3,3V. Matryca przycisków Dalej to co w klawiaturze najważniejsze - matryca! Układ zwyczajny, tylko jest drobny mix przycisków. Część to bezgłośne przyciski Cherry, inne to zwykłe duże i małe Omrony. Układ sterowania I ostatni bloczek - widać tu wszystkie sygnały wyciagnięte z ESP32 (wszystkie dostępne piny są przewidziane do użycia. Jest tu listwa 4 pinów dla małego OLEDa 128x32 px, który ma służyć do informowania o wybranym układzie makr/programie: Widać tu też typowy układ 2 tranzystorów i przycisków służących do sterowania przebiegiem programowania. Taki układ znajdziemy na płytkach dev module i jest on domyślnie ustawiony podczas wgrywania przy użyciu esptool.py. Wątpliwości może budzić te coś z komparatorem... co to w ogóle jest? Historia zaczyna się od próby znalezienia układu z 1 komparatorem... wiecie że ciężko taki znaleźć? Za to z 2 jest pełno. Ale zostawić taki komparator to szkoda więc postanowiłem zaprojektować dość eksperymentalnie jakiś generator. Nie mam z nimi doświadczenia ale wygląda jakby miał działać. Ale jakby nie działał 🙂 to otoczyłem go zworkami żeby odciąć en eksperyment i użyć zwykłego LEDa w formie wskaźnika. Do czego będzie to jeszcze się zobaczy, najpewniej będzie wskazywał stan parowania BT. Ciekawe jaki jest pobór prądu... o tym nie pomyślałem. Płytka PCB i montaż Kilkanaście dni czekania i otrzymałem śliczne płytki: Kilka testów i jak zawsze jestem w szoku gdy coś idealnie pasuje jak te przyciski Cherry i Omrony... żeby wszystko tak pasowało jak te przyciski: Tu się Pan Chińczyk się nie popisał (albo Pan projektant-płytkarz) bo na płytce została wyfrezowana miedź pod nóżki złącza, ale już nie laminat. Nie wiem czy nie mieli tak cienkich frezów, ale złącze to wylutowałem z modułu ładowarki do akumulatora i tam jakoś to wyfrezowali i przylutowali. No mniejsza, działa to najważniejsze. Testy Jak myślicie czy projekt ruszył po zlutowaniu? Oczywiście że nie! 😒 polutowanie układu CP2101 to niemałe wyzwanie ale w końcu udało się. Programowanie jednak nie powiodło się - komputer wykrywa coś ale nie rozpoznaje. I tu wyszedł mój błąd - zamienione linie D+ i D-. Szybka poprawka i komputer już coś rozpoznaje, ale... nie da się zaprogramować 😞 Kilka testów i ustaliłem, że ESP32 działa! Ale CP2101 nie reaguje na test echa ze zwartymi RX i TX... to nie dobrze. Na plus to że USB C działa i tu nic nie mieszam. Czyli chyba jednak upaliłem ten konwerter... 😞 Na tym koniec tej części. Stanąłem teraz przed małym murem (nazwijmy płotkiem) - bo ESP32 da się zaprogramować ale z osobnego układu CP2101 na płytce konwertera i teraz pytanie czy usmażyłem układ podczas lutowania? Chyba tak... Plany W najbliższym czasie mam zamiar przelutować układ CP2101 na nowy wyglądający na bardziej markowy (obecny pochodzi z wylutu i nie ma żadnego nadruku). Jeżeli wszystko będzie się ładnie programować to ruszam z klawiszami i obudową. Tu moja wizja jest następująca - sklejka, naturalne drewno i odlewana żywica w miejscu LEDów. W podobnym stylu robiłem jeden projekt, wiec jest szansa na coś ładnego 😄 ale tu nie obiecuję cudów na kiju, jak będzie coś nowego to o tym opowiem. Nie wiem jednak jak zrobić krzyżykowe mocowania klawiszy. Mam w głowie pomysł na przyciski - drewniane kołki z miedzianymi obręczami... ale czy nie będą za ciężkie? Potestuję i opiszę niebawem 🙂 A i wypadałoby jakoś to nazwać... z wymyślaniem nazw zawsze jest problem, bo jak ma się kojarzyć? Ale to może wyjdzie w międzyczasie. Ostatecznie jak przybędzie kabelków i poprawek będzie śmiało można nazwać "MAKaROn". Stan na dzień 16.10.2020 Poprawki w układzie komunikacyjnym Zgodnie z zapowiedzią przelutowałem układ CP2102, tu miałem wątpliwość czynie wpakuję się znowu w maliny. Płytki ESPx są wyposażone w taki układ tylko wygląda jak od Chińczyka pracującego od godziny 16... brak nadruku. Dlatego dla pewności wziąłem układ który działał rewelacyjnie przy testach i po przelutowaniu tak pozostało. Wszystko ładnie się programuje, ESP32 wchodzi w reset zgodnie z założeniami. I też słuszny wniosek - opalarka z regulowaną temperaturą niekoniecznie nadaje się do lutowania, jakikolwiek Hot Air jest lepszym pomysłem. Edytowano Październik 16, 2020 przez Gieneq 12 Cytuj Link do komentarza Share on other sites More sharing options...
Harnas Październik 14, 2020 Udostępnij Październik 14, 2020 21 godzin temu, Gieneq napisał: Oczywiście taki układ musi mieć wadę, no i jest - max prąd raptem 250 mA, ale... po co większy? No może do tego bloku: Dlaczego postanowiłeś zasilać LEDy z 3.3V zamiast z napięcia przed stabilizatorem? 1 Cytuj Link do komentarza Share on other sites More sharing options...
Gieneq Październik 15, 2020 Autor tematu Udostępnij Październik 15, 2020 @Harnas jak teraz o tym myślę to jest to dobry pomysł. Na PCB te 4 diody są liściem w drzewie 3,3v więc można w razie co rozwiercić przelotkę i dać brzydki kabelek 😒 Cytuj Link do komentarza Share on other sites More sharing options...
Gieneq Październik 20, 2020 Autor tematu Udostępnij Październik 20, 2020 Program UART działa, ESP32 działa, czyli to co najważniejsze jest. Wgrałem przykład z biblioteką Keypad z kursu Arduino II i klawiatura też działa bez problemów. To co jest istotą działa, więc można zabrać się za Bluetooth. Szybki test z użyciem biblioteki BLE Keyboard, która sprawdziła się bezbłędnie w pierwszej odsłonie klawiatury i ruszyło. Zmieniłem nazwę na coś humorystycznego i pojawiła się niespodzianka. Brownout detector was triggered Z googla wynika że jest to błąd sprzętu, ale z drugiej strony coś tam się programuje. Poprawiłem nazwę na starą i działa. Nie jestem specem w Bluetooth, ale szybkie zapytanie do googla i wychodzi na to, że nazwa urządzenia (Device Name) jest za długa. Znalazłem specyfikację Bluetooth 4.2 i jest tam fragment: Cytat The Device Name characteristic shall contain the name of the device as an UTF-8 string (...) The Device Name characteristic value shall be 0 to 248 octets in length. A device shall have only one instance of the Device Name characteristic. 248 bajtów to na pewno nie zapełniłem. Ale po lekturze kilku komentarzy z sieci i specyfikacji BLE 4.2 doszedłem do wniosku, że maksymalna długość to jednak 31 bajty i to byłem w stanie przekroczyć. Patrząc w kod biblioteki: void BleKeyboard::taskServer(void* pvParameter) { BleKeyboard* bleKeyboardInstance = (BleKeyboard *) pvParameter; //static_cast<BleKeyboard *>(pvParameter); BLEDevice::init(bleKeyboardInstance->deviceName); ... Idąc dalej – klasa BLEDevice i funkcja: void BLEDevice::init(std::string deviceName){ ... ::esp_ble_gap_set_device_name(deviceName.c_str()); Dalej: esp_err_t esp_ble_gap_set_device_name(const char *name) { btc_msg_t msg; btc_ble_gap_args_t arg; if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) { return ESP_ERR_INVALID_STATE; } if (strlen(name) > ESP_GAP_DEVICE_NAME_MAX) { return ESP_ERR_INVALID_ARG; } I ostatecznie z chińskiej dokumentacji: #define ESP_GAP_DEVICE_NAME_MAX (32) Czyli zabezpieczenie jest, a ja jednak nie przekroczyłem 32 bajtów. Spróbowałem metody bisekcji w celu ustalenia maksymalnej liczby znaków i wyszło 22. Jak? Nie wiem. Nie zastanawiając się jednak za długo postanowiłem iść dalej. Z poprzedniego projektu klawiatury nauczyłem się ważnego prawidła, które zna też każdy malarz 🤔 rzeźbiarz też – od ogółu do szczegółu. Postanowiłem więc nie drążyć tego tematu, bo skończyłoby się na artykule o Bluetooth w ESP, a tu jednak jest klawiatura do zbudowania. Jak starczy chęci to do tego wrócę. Także w myśl słów "Jeżeli kod działa to znaczy że jest dobry." napisałem zarys programu (kod się trochę rozciągnął bo VSC jakoś mi przerzuca otwierające nawiasy w nową linię): #include <Arduino.h> #include <Keypad.h> #include <BleKeyboard.h> #include <FastLED.h> /* * CONSTANTS */ #define ROWS_COUNT 6 #define COLS_COUNT 6 // MAPPED KEYS OMRON #define KEY_U1 21 #define KEY_U2 27 #define KEY_U3 33 #define KEY_U4 4 #define KEY_U5 10 #define KEY_DRV_UP 9 #define KEY_DRV_DOWN 3 #define KEY_TOP_L 1 #define KEY_TOP_M 17 #define KEY_TOP_R 23 #define KEY_BOT_L 22 #define KEY_BOT_M 16 #define KEY_LEFT_T 5 #define KEY_LEFT_M 34 #define KEY_LEFT_B 28 #define KEY_RIGHT_T 29 #define KEY_RIGHT_M 35 // MAPPED KEYS CHERRY #define KEY_ARROW_T 7 #define KEY_ARROW_TR 1 #define KEY_ARROW_R 18 #define KEY_ARROW_BR 36 #define KEY_ARROW_B 6 #define KEY_ARROW_BL 12 #define KEY_ARROW_L 30 #define KEY_ARROW_TL 13 #define KEY_ARROW_M 24 #define KEY_A 25 #define KEY_B 19 #define KEY_C 2 #define KEY_D 31 #define KEY_E 8 // KEYBOARD PINS #define OUT_1 33 #define OUT_2 25 #define OUT_3 26 #define OUT_4 27 #define OUT_5 13 #define OUT_6 23 #define IN_1 17 #define IN_2 16 #define IN_3 19 #define IN_4 18 #define IN_5 5 #define IN_6 14 //KEYBOARD byte colPins[ROWS_COUNT] = {OUT_1, OUT_2, OUT_3, OUT_4, OUT_5, OUT_6}; byte rowPins[COLS_COUNT] = {IN_1, IN_2, IN_3, IN_4, IN_5, IN_6}; char matrixNumbers[ROWS_COUNT][ROWS_COUNT] = { {36, 1, 2, 3, 4, 5}, {6, 7, 8, 9, 10, 11}, {12, 13, 14, 15, 16, 17}, {18, 19, 20, 21, 22, 23}, {24, 25, 26, 27, 28, 29}, {30, 31, 32, 33, 34, 35}}; Keypad matrix(makeKeymap(matrixNumbers), rowPins, colPins, sizeof(rowPins), sizeof(colPins)); // PROGRAMMABLE DIODES #define STRIP_PIN 4 #define STRIP_COUNT 4 #define MAX_BRIGHTNESS 10 CRGB leds[STRIP_COUNT]; // BLUETOOTH #define DISCONNECTED 0 #define CONNECTED 1 BleKeyboard bleKeyboard("MAKaROn"); int connectionState = DISCONNECTED; /* * FUNCTIONS */ void connectionInit() { Serial.println("Connected"); } void connectionLost() { Serial.println("Disconnected"); } void connectionPolling() { // TODO jakas ciekawa animacja for (int i = 0; i < STRIP_COUNT; i++) leds[i] = CRGB::Red; FastLED.show(); delay(500); for (int i = 0; i < STRIP_COUNT; i++) leds[i] = CRGB::Black; FastLED.show(); delay(500); } void update() { char key = matrix.getKey(); delay(5); } /* * UPDATE KEYBOARD */ void keypadEventHandler(KeypadEvent key) { switch (matrix.getState()) { //todo zrob cos zeby nie dublowac press/release, pamietaj ze nie zawsze press wystepuje z relese np jakies dluzsze macro wystukujace sekwencje case PRESSED: // Serial.print("Pressed: "); // Serial.println(key, DEC); if (key == KEY_ARROW_T) bleKeyboard.press(KEY_UP_ARROW); if (key == KEY_ARROW_B) bleKeyboard.press(KEY_DOWN_ARROW); if (key == KEY_ARROW_L) bleKeyboard.press(KEY_LEFT_ARROW); if (key == KEY_ARROW_R) bleKeyboard.press(KEY_RIGHT_ARROW); if (key == KEY_ARROW_M) bleKeyboard.press('M'); break; case RELEASED: // Serial.print("Released: "); // Serial.println(key, DEC); if (key == KEY_ARROW_T) bleKeyboard.release(KEY_UP_ARROW); if (key == KEY_ARROW_B) bleKeyboard.release(KEY_DOWN_ARROW); if (key == KEY_ARROW_L) bleKeyboard.release(KEY_LEFT_ARROW); if (key == KEY_ARROW_R) bleKeyboard.release(KEY_RIGHT_ARROW); if (key == KEY_ARROW_M) bleKeyboard.release('M'); break; default: break; } } /* * SETUP & LOOP */ void setup() { Serial.begin(9600); Serial.println("Bluetooth Keyboard v2.0 MAKaROn"); bleKeyboard.begin(); FastLED.addLeds<NEOPIXEL, STRIP_PIN>(leds, STRIP_COUNT); FastLED.setBrightness(MAX_BRIGHTNESS); matrix.begin(makeKeymap(matrixNumbers)); matrix.addEventListener(keypadEventHandler); matrix.setHoldTime(500); } void loop() { if (bleKeyboard.isConnected()) { if (connectionState == DISCONNECTED) { connectionInit(); connectionState = CONNECTED; } update(); } else { if (connectionState == CONNECTED) { connectionState = DISCONNECTED; connectionLost(); } connectionPolling(); } } Co tu mamy... Na starcie masa definów. Opisują one klawiaturę, położenia przycisków, piny. Dzięki temu później w kodzie wystarczy, że wpiszę interesującą mnie etykietę, aby odnieść się do konkretnego przycisku. A że nie będą one miały swoich liter, jak to jest w zwykłej klawiaturze, to opisałem je zgodnie z rozmieszczeniem (góra, dół- prawo, góro-prawo górnego. itd). Dalej powołujemy do życia instancję klasy Keypad, oraz obiekty do obsługi diod programowanych (tym razem z ciekawości biblioteka FastLED) i do obsługi klawiatury Bluetooth to o czym wspominałem. Keypad matrix(makeKeymap(matrixNumbers), rowPins, colPins, sizeof(rowPins), sizeof(colPins)); ... CRGB leds[STRIP_COUNT]; ... BleKeyboard bleKeyboard("MAKaROn"); Następnie przygotowałem prostą maszynę stanów do obsługi połączenia Bluetooth. Dzięki tak przygotowanym funkcjom można łatwo zaimplementować przejrzysty kod (a w razie potrzeby wydzielenia klasy, można z nich zrobić latwo delegaty). W pętli loop spotkamy logikę w postaci zatrzasku na wspomnianym stanie: void loop() { if (bleKeyboard.isConnected()) { if (connectionState == DISCONNECTED) { connectionInit(); connectionState = CONNECTED; } update(); } else { if (connectionState == CONNECTED) { connectionState = DISCONNECTED; connectionLost(); } connectionPolling(); } } Wielkiej filozofii tu nie ma, ale robi co ma robić. Po poprawnym połączeniu wykonywany będzie jedynie fragment dotyczący aktualizacji. I tu anegdotka dotycząca pierwszej wersji i skupiania się na tym co ważne w kodzie... W funkcji connectionPolling zaznaczyłem komentarzem: void connectionPolling() { // TODO jakas ciekawa animacja for (int i = 0; i < STRIP_COUNT; i++) leds[i] = CRGB::Red; FastLED.show(); delay(500); for (int i = 0; i < STRIP_COUNT; i++) leds[i] = CRGB::Black; FastLED.show(); delay(500); } Oczyma duszy mojej widzę tu... Kunsztownie przygotowaną animację szkarłatno-złocistych języków ognia, których to światło subtelnie przenika przez nawpół przezroczysty odlew z barwionego epoksydu uformowanego nierówną, łamaną krawędzią deseczki tworzącej front przyszłej, jeszcze nieistniejącej ale zaplanowanej obudowy, mającej składać się nie tylko z łamanego drewna dopełnionego epoksydowym odlewem, ale także złocistego mosiądzu i ognistej miedzi. 🔥 Także zanim zmarnuję 10 godzin na szykowanie tej animacji, która w praktyce będzie widoczna tylko przez 1 sekundę na etapie łączenia, to lepiej zajmę się tym co w klawiaturze najważniejsze... przyciskami 🙄 I tu napotkałem realny problem do rozwiązania – biblioteka Keypad najwyraźniej nie obsługuje kliknięć kilku przycisków jednocześnie. Tak mi się wydaje, bo zdarzenie pochodzi od obiektu klawiatury, zaś w celu aktualizacji pobieram w pętli loop aktualny przycisk... chyba nie tędy droga, albo nie umiem używać tej biblioteki. Pomijając to, użycie uchwytu dobrze działą, przyciski się wciskają, rozpoznają, wysyłają na port szeregowy swoje kody i nawet "klikają" przyciskami poprzez Bluetooth. Na razie przetestowałem strzałki, jakiś znak i działa: case PRESSED: // Serial.print("Pressed: "); // Serial.println(key, DEC); if (key == KEY_ARROW_T) bleKeyboard.press(KEY_UP_ARROW); if (key == KEY_ARROW_B) bleKeyboard.press(KEY_DOWN_ARROW); if (key == KEY_ARROW_L) bleKeyboard.press(KEY_LEFT_ARROW); if (key == KEY_ARROW_R) bleKeyboard.press(KEY_RIGHT_ARROW); if (key == KEY_ARROW_M) bleKeyboard.press('M'); Widać tu jednak problemy w implementacji. Należy jakoś uporać się z powtórzeniami w bloku naciśnięcia i puszczenia szczególnie, gdy wyklikuję zwykłe klawisze. W przypadku makr albo dłuższych sekwencji sprawa będzie wyglądać inaczej. Takie podejście choć dość dokładne to nie sprawdza się. W pierwszej odsłonie klawiatury wpadłem w sidła perfekcjonizmu... Napisałem klasę, która miała tablicę 32 wskaźników na funkcje naciśnięcia, długiego naciśnięcia i puszczenia... Wodotryski jak się patrzy, dodajesz obsługę przycisku z delegata! Wow! Ale jak napisałem 12 osobnych funkcji i blok attachów do tych lśniących 3linikowych uchwytów to się dopiero zastanowiłem, czy 24 ify nie załatwiłyby sprawy... Także nie jest to najlepszy sposób. Jaki jest "właściwszy"? Zobaczę 🙂 1 Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
Treker (Damian Szymański) Listopad 8, 2020 Udostępnij Listopad 8, 2020 Podrzucam trwającą kampanie na Kickstarterze 😉 1 Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Listopad 11, 2020 Udostępnij Listopad 11, 2020 lejna ciekawostka: https://www.kickstarter.com/projects/1613129137/nemeio-the-customizable-global-keyboard/ @deshipu - Ciebie też może zainteresować 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
deshipu Listopad 11, 2020 Udostępnij Listopad 11, 2020 @Treker Niestety fizycznie się nie da klawiszy przesuwać na niej, a trochę im się pomyliło gdzie powinna być linijka "zxcv". Poza tym od klawiatur mechanicznych już nie ma powrotu do membran. 1 Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!