Skocz do zawartości

Gieneq

Moderator
  • Zawartość

    1476
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    47

Gieneq wygrał w ostatnim dniu 14 października

Gieneq ma najbardziej lubianą zawartość!

Reputacja

650 Mistrz

O Gieneq

  • Ranga
    7/10
  • Urodziny 19.05.1994

Informacje

  • Płeć
    Mężczyzna
  • Lokalizacja
    Gdynia
  • Języki programowania
    Java, Python
  • Zainteresowania
    Przetwarzanie obrazu
  • Zawód
    Grafik komputerowy
  • www

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

  1. @sorek genialny projekt! Sam od dłuższego czasu planuję coś wpakować w OBD ale od kiedy naprawiłem instalację gazową i check engine poszedł w zapomnienie jakoś mi się odechciało. Narazie jest przejściówka z BT ale temat leży odłogiem. Podoba mi się że sprzęt wygląda naprawdę profesjonalnie. Na pewno zajrzę do tego jak zabiorę się za swoje dzieło... A pytanko, bo piszesz że sprzedajesz - jakie jest zainteresowanie takim sprzętem?
  2. @badbit fajnie że działasz z zadaniami dodatkowymi Sugestie? No to dam 2: łatwa - dodaj etykiety do tzw. magicznych liczb. Czyli żeby nie było jakiś liczb w kodzie tylko daj definy które je opisują, np. LEFT_PIN 6 itp. trudne - wyrzuć delaye to już daleko poza kursem, ale jak masz ochotę się z tym zmierzyć to próbuj.
  3. @Kemer witam na forum Możesz przejrzeć kurs QT na blogu, może znajdziesz tam coś co Ci się przyda w tym przypadku. Jeżeli nie, to myślę że kolega @Matthew11 odpowie na każde pytanie dotyczące QT
  4. Podepnę się do tematu, akurat bieżąca sprawa. Wczoraj rozmawiałem z kumplem co zbudował dom pod Gdańskiem i patrząc na mapę BTS to nie dziwię się, że 20 Mb/s to u niego max. Gość przetestował trochę sprzętów i bez zmian. I tak się zastanawiam: czy są firmy, zamawia się speca od tych spraw i przychodzi i montuje jakiś pro router, anteny, wzmacniacz i działa? czy te co pisze @Wojciech to będzie strzał w dziesiątkę? Jak one polepszają jakość sygnału? BTW. ten konfigurator chyba się zepsuł.
  5. @Mike84 a masz inny moduł żeby porównać? Możliwe że ten osobnik jest po prostu felerny, pewnie raz na jakiś czas tak się może trafić. Ostatnio przy robieniu swojej płytki udało mi się po raz pierwszy mieć "moduł" ESP, w którym kod ładuje się bez potrzeby wciskania przycisków Zresztą czy moduł za 7zł (czy po ile one tam chodzą na Ali) może się czasem zepsuć?
  6. @Qaser witaj Przemku na naszym forum To dobrze trafiłeś, powodzenia! @niken dzień dobry @Wirgiliusz również witam na naszym forum fajnie że ambitnie podchodzisz do tematu, jak będziesz działać z własną konstrukcją tzw. DIY to zachęcam Cię do podzielenia się tym na forum
  7. @hansnoway witam na forum a pobierasz wersję konkretnie dla RPi4? Pamiętam że jak po premierze RPI4 sprawdzałem retropie albo lakke to był to istotny problem.
  8. 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: 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ę
  9. @Sergii witam na forum Dobrze że nie tracisz ochoczego ducha i masz ciekawe zajęcia. Powodzenia i dużo zdrowia!
  10. @badbit fajnie że kombinujesz z różnicą sygnałów, idziesz w dobrą stronę. Choć nie do końca rozumiem po co ta średnia, chyba lepiej działać na staych wartościach (progach), bo nie jestem pewny czy możesz teraz ustalić przybliżoną odległość (czy jest coś blisko/daleko). Możesz spróbować obliczyć dla każdej diody odległość (cos jak odległość 2 punktów na płaszczyźnie i na tej podstawie dla każdej diody wyznaczyć świecenie (a nawet jasność jak dasz PWM). Możesz też pozbyć się warunków jak zapakujesz dane w tablice - o tym możesz poczytać w sieci, albo przeszukać komentarze pod tym wątkiem
  11. @Myras13 witam na forum Przeczytaj proszę wcześniejsze komentarze w tym temacie, jest tam wyjaśnienie.
  12. @RPIFLASH najlepiej jakbyś miał dostęp do zasilacza laboratoryjnego, albo rozetnij kabel od zasilacza do RPI, jak kojarzę są tam tylko 2 linie łatwe do rozdzielenia.
  13. @call_me_Loczek dziwne to, a próbowałeś klikać/przytrzymywać przycisk reset podczas wgrywania?
×
×
  • Utwórz nowe...