logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak zmodyfikować kod Attiny85 do wysyłania 13 znaków i ENTER?

Dariusz Goliński 26 Lis 2018 21:26 1449 17
  • #1 17587824
    Dariusz Goliński
    Poziom 22  
    Witam szanownych kolegów i koleżanki
    Zwracam się z prośbą o rozwiązanie mojego problemu.

    Potrzebuję małe urządzonko które po zwarciu styków za emuluje mi klawiaturę w systemie i wyśle ciąg znaków do komputera. Dokładnie chodzi o 13 znaków wcześniej zdefiniowanych.

    Znalazłem dość ciekawy projekt na stronie:
    http://blog.flipwork.nl/?x=entry:entry081009-142605
    który przy zwarciu styków przesyła do komputera "]" a przy rozwarciu "[".
    I o takie coś dokładnie mi chodziło tylko że nie mam pojęcia jak zrobić aby zamiast ] było te 13 znaków a przy rozwieraniu znak ENTER. Próbowałem kilka różnych sposobów ale nie zadziałały.

    Poza tym nie bardzo rozumiem tej sekcji:

    if(reportCount == 0){
    if (buttonState == 1){ // if button is not pressed
    key = 0x30; // key = ]
    } else {
    key = 0x2F; // key = [

    skoro 0x30 to znak 0 to dlaczego do komputera przesyłane jest ].

    Czy może mi ktoś pomóc w tym projekcie ?
    Trochę kumam C ale na to jestem za krótki.
  • #2 17587868
    LChucki
    Poziom 31  
    Dariusz Goliński napisał:
    skoro 0x30 to znak 0 to dlaczego do komputera przesyłane jest ].

    Bo wysyłane są kody klawiszy a nie kody ASCII.
    Na raz możesz wysyłać 8 znaków (przynajmniej w CDC dla programowego rozwiązania USB na AVR). Musisz odnaleźć fragment, gdzie zmienne "key" jest wysyłana. Będzie tam wywołana funkcja, w której przekazujesz wskaźnik na zmienną (tablicę) i liczbę znaków do wysłania. Wskaż zamiast zmiennej "key" swoja tablicę, ale pewnie musisz ograniczyć się do 8 znaków. Pozostaje poczekać na wysłanie danych i możesz wysyłać brakujące 5 znaków. Możesz przyjąć, ze wysłanie danych zajmuje 1ms (przynajmniej w klasie CDC) więc kolejna porcję danych wyślij np za 5ms.

    Na AVR nie zajmowałem się klasą HID ale CDC. HID robiłem na ARM. Pamiętaj, że programowe rozwiązanie USB na AVR ma sporo ograniczeń oraz to, że w nowych systemach (od Win7 w górę, w Linux nie wiem) CDC (używasz HID, więc nie problem) nie będzie obsługiwane.
    Proponowałbym zrobić to na AVR czy lepiej ARM ze sprzętowym USB. Masz też FT260 obsługujący HID. Układy firmy FTDI to najlepsze znane mi układy obsługujące USB. Nigdy z nimi nie miałem problemu a z CHxxx, PLxxx, itp bywa różnie.
  • #3 17587900
    Dariusz Goliński
    Poziom 22  
    Dzięki za odpowiedź
    Ale tak szukam i szukam ale nigdzie nie mogę znaleźć żadnej tablicy gdzie mógłbym ten kod dopasować.
    Może źle szukam albo nie do końca rozumiem działanie tego mechanizmu.

    Dodano po 7 [minuty]:

    Fajny ten FT260. Ale czy rozumiem że wystarczy go podłączyć do USB i wysłać beszczelnie coś z mikrokontrolera na RX i zadziała ? czy raczej nie jest to takie proste i trzeba napisać całą obsługę ?
  • #4 17588079
    LChucki
    Poziom 31  
    Dariusz Goliński napisał:
    Ale tak szukam i szukam ale nigdzie nie mogę znaleźć żadnej tablicy gdzie mógłbym ten kod dopasować.

    Słabo szukasz http://www.whdload.de/docs/pl/rawkey.html
    Pamiętaj, że jest jeszt kod puszczenia klawisza, chyba 0xF0 i kod puszczanego klawisza. Niektóre klawisze generują kilka kodów (backspace itp).

    Dariusz Goliński napisał:
    Fajny ten FT260. Ale czy rozumiem że wystarczy go podłączyć do USB i wysłać beszczelnie coś z mikrokontrolera na RX i zadziała

    Nie miałem okazji go użyć, bo zrobiłem na STM32 ale obsługa FT260 jest banalna. Na Stronie FTDIsa jakieś przykłady.
  • #5 17588300
    ble___
    Poziom 17  
    Jakby się skusić na rozwiązanie z bloga to mam jakieś doświadczenie z biblioteką VUSB która jest tam użyta i mogę spróbować pomóc w zmianie przykładu. Prawdopodobnie można użyć nieco tańsze attiny44 (ale chyba z kwarcem) czy na jakims innym AVR jeśli przypadkiem jest pod ręką.
  • #6 17588464
    BlueDraco
    Specjalista - Mikrokontrolery
    Ten projekt da się zrobić w pół godziny na STM32F042. Porównanie ceny STM32F042Fx z ceną zestawu złożonego z taniego AVR i jakiegoś FT pozostawiam zainteresowanym... ;)
  • #7 17588722
    LChucki
    Poziom 31  
    BlueDraco napisał:
    Ten projekt da się zrobić w pół godziny na STM32F042.

    O ile zna sie STM. Autor pyta o Tiny, bo pewnie zna AVR a STM musiałby się uczyć, co zajmie powiedzmy miesiąc. Na Forbocie są kursy, pewnie (mając jakiś zestaw NUCLEO za 50zł i trochę szczęścia i samozaparcia), w tydzień da się taki kurs skończyć. Jak zrobić HID na STM32 opisano między innymi na https://elektronika327.blogspot.com/2017/01/10-stm32f4-cubemx-usb-hid-mysz-oraz.html

    PS
    Na Elektrodzie brakuje takich kursów a jednocześnie w regulaminie napisano "nie reklamuj innych for......". Link, który umieściłem łamie regulamin. Pozostaje wysyłać zainteresowanym linki na PW. Bez sensu to.

    Moderowany przez tmf:

    Linki do innych miejsc nie zawsze łamią regulamin forum. Generalnie link do strony na której nie ma odpowiedzi na konkretne pytanie autora może być potraktowany jako reklama. Link do konkretnej podstrony, na której znajduje się odpowiedź raczej nie będzie tak widziany. No chyba, że odpowiedź to jedno zdanie, które prościej byłoby wkleić niż linkować... Więc jak to zwykle bywa należy rozsądnie do takich spraw podchodzić.

  • #8 17590002
    Dariusz Goliński
    Poziom 22  
    Dzięki wszystkim za pomoc

    ad. LChucki
    Dzięki za linka. Nigdy wcześniej go nie widziałem bo nie tego szukałem. Ale jakoś nadal nie mogę zakumać czemu akurat 0x30 to ].
    Co do STM-a to masz rację. Znam AVR-ki i nie miałem dotąd potrzeby stosować nic innego. Na co dzień zajmuje się i żyję z zupełnie czegoś innego. W automatyce przemysłowej nie mam potrzeby zajmowania się STM-ami. Zresztą dla tak prostego zadania to jak strzelanie z armaty do komara. Ale dzięki za zainteresowanie.

    ad. ble___
    No jak byś pomógł to byłbym zobowiązany. Nie musi być to Attiny48 ale po primo taki miałem po sekundo taki projekt znalazłem i po tercio chciałem zbudować coś co by mi się zmieściło w pendrive.

    Znalazłem ponadto jeszcze taki projekt ale nie potrafiłem go skompilować .
    http://codeandlife.com/2012/03/03/diy-usb-password-generator/
  • #9 17590373
    ble___
    Poziom 17  
    To jest istotny kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    F. usbInterruptIsReady() sygnalizuje czy można coś wysłać.
    F. usbSetInterrupt() rozpoczyna wysyłanie.
    F. buildReport() uzupełnia dane do wysłania tutaj:
    reportBuffer[0] = 0;
    reportBuffer[1] = key;

    O ile rozumiem reportCount jest zerowane przez przycisk.
    Najpierw zmieniłbym wcześniej skopiowany kod na:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Żeby czytelniej opisać.

    Wydaje mi się że zadziała zaminaa f. buildReport() na taką:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    - buildReport jest wywoływane w nieskończonej pętli
    - gdy reportCount = 0 to znaczy że wciśnięto przycisk
    - reportCount jest też używane do określenia kiedy przestać wysyłać
    - wysyłane jest cokolwiek tylko gdy f. zwróci nie-zero


    Z wcześniejszego kodu wnioskuję że wysyłane były zawsze 2 raporty, jeden z kodem klawisza a potem jden z zerem i tutaj staram się to bezmyślnie odwzorować - może niepotrzebnie. Chyba jakoś się sygnalizuje przyciśniecię klawisza a inaczej podniesienie - nie sprawdzałem.
  • #10 17590403
    LChucki
    Poziom 31  
    ble___ napisał:
    Chyba jakoś się sygnalizuje przyciśniecię klawisza a inaczej podniesienie - nie sprawdzałem.

    Dokładnie tak jest o czym pisałem wcześniej. W linku, który wcześniej umieściłem, też sa opisane raporty o naciśnięciu i puszczeniu. Link jest do SM, ale HID to HID i to co się wysyła jest takie samo w AVR jak i w ARM z jednym małym ale. Programowe USB AVR pracuje w USB1.1 a może i 1.0 (programowym USB na AVR bawiłem się dawno temu) a w STM32 jest to 2.0. Są tam duże różnice w wielkościach danych przesyłanych w jednym pakiecie, liczbie endpointów (tu akurat bez znaczenia, raczej myszki, klawiatury, joysticka jednocześnie nie będzie emulował).
  • #11 17590425
    ble___
    Poziom 17  
    "USB HID Keyboard scan codes" - jak to wpisałem w wyszukiwarkę to znalazłem listę kodów klawiszy gdzie zgadzało się 0x30=']'.
    Co do szybkości to zrobiłem na VUSB jako HID woltomierz i wysyła max kilkanaście próbek na sekundę a jak w pobliżu włączy się lutownice transformatorową to przez kilka sekund brak odczytów.
  • #12 17590699
    Konto nie istnieje
    Poziom 1  
  • #13 17591078
    ble___
    Poziom 17  
    stmx napisał:
    co to za bzdura?


    Testowałem i miałem takie problemy ale z win 10 (możliwe że coś pomyliłem ale z tego co pamiętam podłączałem urządzenie na przemian do 2 komputerów).

    Z http://vusb.wikidot.com/usb-device-classes :
    CDC class devices
    [...]
    - Violates the standard.
    - Does not work with some versions of Linux (in combination with particular USB host controllers).
    - Consumes ca. 90% or more of the AVR's CPU time because bulk endpoints are polled aggressively by the host. Real-time applications on the AVR are close to impossible.

    A jakby były problemy z win 10 bez kwarcu to możliwe że z tego powodu:
    https://forums.obdev.at/viewtopic.php?f=8&t=9959

    Jak będzie z tym problem to zaproponuję:
    - przylutować kwarc (12,16 albo 16.5 Mhz z kondensatorami 22pF do pinów 2 i 3 ),
    - zaznaczyć w kodzie jego częstotliwość (usbconfig.h linia 42),
    - usunąć wywołanie f. kalibrującej oscylator (to co na początku f. main() ),
    - podmienić pin przycisku (kwarc go użyje, f. checkButtonChange() ),
    - poprawić fuse żeby używać kwarcu (uważać żeby nie zablokować AVR'a)
    Wpis na blogu jest widzę z czasów z przed win10.

    Edit:
    Jeszcze raz zerkłem na kod i zmiana pinu przycisku w przypadku przylutowania kwarca chyba czytelniejsza do realizacji przez zmianę w main.c linii 18,19,20 niż przez zminę f. checkButtonChange().
    Wcześniej zaproponowane zmiany wybrakowane, trzeba jeszcze zrobić tak żeby f. timerPool() nie była wywoływana dopuki nie zakończono wysyłania napisu (inaczej chyba będzie odstęp czasu pomiędzy literkami) - jak przydatne to mogę uzupełnić opis poprawek.
  • #14 17591875
    Konto nie istnieje
    Poziom 1  
  • #15 17591959
    ble___
    Poziom 17  
    Podejrzewam że autor zdania (które zostało tylko częściowo zacytowane) miał na myśli CDC z VUSB (które jak twierdzi dokumentacja "narusza standard") - co może będzie odpowiedzią.
  • #16 17592113
    BlueDraco
    Specjalista - Mikrokontrolery
    Autor miał na myśli naruszanie standardu przez chore urządzenie low-speed zrobione na AVR, a nie przez dobrze (już obecnie) działające drivery CDC pod Win10 i Linuxem.
  • #17 17592365
    Konto nie istnieje
    Poziom 1  
  • #18 17592381
    quinty
    Poziom 28  
    Kolego najprostsze rozwiązanie to płytka "digispark" z Attiny85 na pokładzie i gotowe biblioteki z obsługą myszy i klawiatury są już w arduino wszyte.
    Nic nie kalibrujesz, nie potrzebujesz nawet dodatkowego programatora bo fabrycznie jest wgrany bootloader-USB , wszystko jest plug&play i od razu ze złączem USB.

    Sam miałem ostatnio podobny temat i zaprojektowałem własne urządzenie i z V-USB, a okazało się to banalne, bo gotowe rozwiązanie już było dostępne.

    Jak zmodyfikować kod Attiny85 do wysyłania 13 znaków i ENTER?
REKLAMA