Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[ATtiny13] Wykrywanie dotyku (pojemnościowe)

tsiu 17 Sty 2012 23:42 6024 19
  • #1 17 Sty 2012 23:42
    tsiu
    Poziom 13  

    Witam!

    Pracuję ostatnio nad wykryciem dotyku na mikrokontrolerze ATtiny13. Próbowałem to robić za pomocą ADC i tranzystora i działało, ale niestety zakłócenia były ogromne, telefon z dosyć dużej odległości wpływał już negatywnie na układ.

    Znalazłem więc pewien projekt w internecie, na ATtiny2313, w którym autor zaimplementował bardzo efektowną obsługę dotyku.
    Problem polega na tym że nie za bardzo rozumiem o co chodzi w części kodu i prosiłbym kogoś doświadczonego o wytłumaczenie. Kod jest napisany w asemblerze i stąd ta prośba.

    Ponadto chciałbym spytać - czy nie dało się tego napisać w c? Czy autor zdecydował się na asm z powodu jego dużej wydajności w tego typu funkcji?

    Funkcja asemblerowa ma za zadanie zwrócić pojemność która występuje na danym porcie, albo pomiar zbliżony do pomiaru pojemności.

    Tutaj kod w C, ta funkcja ma za zadanie przeleciec po danych portach (channels) i zapisac pojemności do tablicy której wskaźnik podajemy jako argument:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    A tutaj funkcja asemblerowa touch, której działania nie rozumiem:
    Kod: asm
    Zaloguj się, aby zobaczyć kod


    ATtiny13 posiada timer 8-bitowy. Czy zaimplementowanie przerobionego kodu pod ten uC będzie możliwe i czy kod ten będzie o podobnej wydajności?

    pozdrawiam i proszę o odpowiedź

    0 19
  • #2 18 Sty 2012 00:00
    opamp
    Użytkownik obserwowany

    Myślałeś o zewnetrznych układach? ;)

    0
  • #3 18 Sty 2012 18:12
    ca1ek
    Poziom 1  

    15 sekund po użyciu google.
    Efekt?

    Cytat:
    Wstawki asemblerowe
    Oprócz możliwości wstępnie skompilowanych modułów możesz posłużyć się także tzw. wstawkami asemblerowymi. Ich użycie powoduje wstawienie w miejsce wystąpienia wstawki odpowiedniego kodu maszynowego, który powstanie po przetłumaczeniu kodu asemblerowego. Ponieważ jednak wstawki asemblerowe nie są standardowym elementem języka C, każdy kompilator ma całkowicie odmienną filozofię ich stosowania (lub nie ma ich w ogóle). Ponieważ w tym podręczniku używamy głównie kompilatora GNU, więc w tym rozdziale zostanie omówiona filozofia stosowania wstawek asemblera według programistów GNU.
    Ze wstawek asemblerowych korzysta się tak:
    int main ()
    {
    asm ("nop");
    }
    W tym wypadku wstawiona zostanie instrukcja "nop" (no operation), która tak naprawdę służy tylko i wyłącznie do konstruowania pętli opóźniających.


    Cytat z wikibooks

    0
  • #4 18 Sty 2012 22:41
    tsiu
    Poziom 13  

    opamp napisał:
    Myślałeś o zewnetrznych układach? ;)

    Tak, jednak:
    1) Duże koszta - takie jak sam mikrokontroler (≈4.5zł)
    2) Potrzebuje żeby wszystko było malusie na PCB, więc im mniej układów tym lepiej
    3) Nawet jeśli bym się na to zdecydował to nadal podrążyłbym ów funkcję i działanie programu, który wkleiłem - fajnie byłoby wiedzieć jak to działa
    4) wyzwanie dla attiny ! :)

    @ca1ek:
    chyba nie za bardzo wiesz o co chodzi...

    0
  • #7 19 Sty 2012 00:05
    tsiu
    Poziom 13  

    Dzięki za linki i odpowiedzi

    @ginar:
    Mam wrażenie że nawet timer nie jest potrzebny, jedynie dwa ADC.
    Swoją drogą... piszą że dwa kanały ADC są wymagane a na schemacie korzystają.. z jednego.
    [ATtiny13] Wykrywanie dotyku (pojemnościowe)

    @excray:
    Całkiem nieźle, szkoda tylko że trzeba 2 pinów i dwa zewnętrzne elementy.
    Czy są jakieś ograniczenia co do elektrody? (np minimalna powierzchnia) Czy może to być nawet kawałek odstającego drutu?

    Ogółem wygląda na to że metoda którą przedstawiłem w pierwszym poście jest najprostsza w zaimplementowaniu gdyż wymaga jednego pinu na jeden sensor (i bez ADC).
    Może w temacie wypowie się ktoś jeszcze rozumiejący o co chodzi w funkcji asm?

    0
  • Pomocny post
    #8 19 Sty 2012 00:11
    excray
    Poziom 39  

    tsiu napisał:
    Ogółem wygląda na to że metoda którą przedstawiłem w pierwszym poście jest najprostsza w zaimplementowaniu gdyż wymaga jednego pinu na jeden sensor (i bez ADC).

    Obydwie metody które są w linku nie wymagają użycia ADC. Poza tym są proste. Poza tym metoda QTOCH wymaga n+1 portów na n czujników. Na ten przykład implementaja metody QTOUCH w asm z inicjacją procesora i wszelkimi wodotryskami:
    Kod: asm
    Zaloguj się, aby zobaczyć kod

    Jak widać cały kod zajmuje o połowe mniej miejsca niż wstawka asemblerowa w Twoim i nie wymaga ani ADC ani timerów. Poza tym jest szybki. U mnie po 80 pętlach już jest wynik tak albo nie.

    0
  • #10 19 Sty 2012 12:15
    ginar
    Poziom 21  

    Cytat:

    @ginar:
    Mam wrażenie że nawet timer nie jest potrzebny, jedynie dwa ADC.
    Swoją drogą... piszą że dwa kanały ADC są wymagane a na schemacie korzystają.. z jednego.


    Nie wiem skąd wziąłeś ten schemat (to chyba metoda CTMU o wiele bardziej skomplikowana wymagająca wbudowanej jednostki) ale w linku który podałem to metoda CVD (pdf. microchipa AN1298 )
    Do jednego pinu podpięty jest klawisz a drugi pin - wykorzystywany jako źródło napięcia do ładowania kondensatora S&H który jest w każdym ADC.

    Rolę timera przypisałem do wyznaczenia okresów skanowania klawisza - bezpośrednio nie jest wykorzystywany w tej metodzie.

    0
  • #11 19 Sty 2012 14:16
    kred
    Poziom 19  

    A próbowałeś z Atmel QTouch library? Nie wiem czy Tiny13 jest wspierany przez tę bibliotekę, ale na podstawie ich not możesz spróbować zaimplementować coś swojego.

    0
  • #12 19 Sty 2012 18:52
    tsiu
    Poziom 13  

    @excray:
    tak dla sprostowania - kod który wrzuciłem, a dokładniej mówiąc funkcja asm, działa dla 8 kanałów (ma możliwość sprawdzenia dotyku na 8 pinach), a Twój kod na jednym, dlatego musiałbyś porównać wielkość wycinając kod tylko dla jednego kanału ;)

    @gaskoin:
    To co robi texas jest najbliższe temu wykrywaniu które wrzuciłem w pierwszym poście.
    Texasowe bazuje na zewnętrznym przerwaniu:

    Cytat:
    The I/O is set to input with negative-edge interrupt enabled.

    Z tego co widzę attiny13 ma takie piny (PCINT5..0)!

    Ale nastąpiła jedna moja pomyłka - powiedziałem że sposób którego dotyczył mój pierwszy post nie wymagał zewnętrznych elementów, a to nieprawda. Wymagany jest rezystor 1MΩ do Vcc. (w texasowym ok.6MΩ do masy)

    ***

    ogólnie to udało mi się to uruchomić wg algorytmu excray z innego tematu:
    https://www.elektroda.pl/rtvforum/viewtopic.php?p=10365068#10365068

    Jest za to problem - dotyk jest źle wykrywany.
    Zapewne źle zbudowałem elektrodę (kawałek folii aluminiowej), ale próbowałem też z kawałkiem plytki PCB i nie działało poprawnie.
    Mianowicie, jak dotykam samym palcem elektrody - nic się nie dzieje. Jak trzymam w ręku cały zwój cyny (i dotykam tej cyny) albo śrubokręt (metalowy) i tym przedmiotem dotykam elektrody - wykrywa.

    Użyłem elementów 22n i 1k.

    Swoją drogą - dałoby się tak dobrać elementy żeby dotyk był wykrywany przy dotykaniu samej 'wiszącej' nóżki rezystora?

    0
  • Pomocny post
    #13 19 Sty 2012 20:35
    Dexter77
    Poziom 28  

    Pytales o metode pojemnosciowa, wiec ta pojemnosc musi sie zmieniac wobec pewnego punktu odniesienia. W tym przypadku do masy. Jezeli zrobisz antene to slusznie ze nie dziala, ta metoda ma byc odporna na zaklocenia elektromagnetyczne. Zrob kawalek plytki gdzie punkt dotykowy bedzie otoczony polem masy. Utworzysz w ten sposob kondensator o pojemnosci kilku(nastu) pikofaradow. Zblizajac palec wprowadzasz dodatkowa pojemnosc (rownolegle) i ladowanie takiej pojemnosci przebiega dluzej, mozna wykryc dotyk. To tak w skrocie.

    P.S. Nie uzywam polskich znakow diaktrycznych bo jestem w gipsie i ledwo pisze jedna reka.

    0
  • #14 19 Sty 2012 23:14
    excray
    Poziom 39  

    tsiu napisał:
    Jest za to problem - dotyk jest źle wykrywany.
    Zapewne źle zbudowałem elektrodę (kawałek folii aluminiowej), ale próbowałem też z kawałkiem plytki PCB i nie działało poprawnie.

    Żeby nie było nieporozumień - nie dotykasz elektrody. Elektroda ma być odizolowana od palca dielektrykiem. U mnie elektrodą był kawałek blaszki (1cmx1cm) w izolacji z woreczka z zamkiem. Dotykając dotykam woreczka wewnątrz którego jest elektroda. Już po 10-20 cyklach był wynika ale dla pewności stosowałem 80 cykli pętli. Dla 8-miu kanałów kod będzie zbliżony - trzeba czytać wtedy nie jeden kanał a osiem kanałów i wyeliminować sprawdzanie a zastosować stałą pętlę z określoną ilości cykli.

    0
  • #15 27 Sty 2012 22:47
    tsiu
    Poziom 13  

    Próbowałem na elektrodach takich jak na zdjęciu i układ niestety nie działa.
    Średnica największego koła na obrazku (do którego aktualnie jest podpięty drucik) ma 10mm - to dla zobrazowania wielkości.

    [ATtiny13] Wykrywanie dotyku (pojemnościowe)

    Czyżby pole tych elektrod było wciąż za małe? Czy da się uruchomić ten układ na elektrodach wielkości takich jak na zdjęciu (najbardziej interesuje mnie wielkość porównywalna do tego najmniejszego kółka).

    Dotykałem elektrod przez woreczek foliowy i bez worka.

    0
  • Pomocny post
    #16 27 Sty 2012 23:52
    excray
    Poziom 39  

    Z tego co widzę to połączyłeś kilka różnych idei i próbujesz z nich złożyć jeden system. Kolego proponuję doczytać dokładnie na czym polegają poszczególne metody a później eksperymentować. Bo taki schemat jak masz na zdjęciu to pod żadną z nich nie podchodzi. Dla przypomnienia:
    [ATtiny13] Wykrywanie dotyku (pojemnościowe)
    Porównaj to ze swoim schematem.

    Dodano po 25 [minuty]:

    [ATtiny13] Wykrywanie dotyku (pojemnościowe)
    [ATtiny13] Wykrywanie dotyku (pojemnościowe)
    Polem dotykowym jest tutaj ten czerwony przewodzik w izolacji podpięty z jednej strony do PB4 a z drugiej nigdzie. Jak widać pole powierzchni było znikomo małe. Z tego względu zwiększyłem ilość pętli w pomiarze z 80 do 250. Kondensator wzorcowy ma 10nF (w poprzednim miał 4n7) podpięty między PB0 a PB4.
    Kod pod ATiny2313:

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    EDIT> Proszę nie komentować moich paznokci - czyściłem przed chwilą bez rękawiczek "pampersa" w drukarce.

    0
  • #17 28 Sty 2012 10:34
    tsiu
    Poziom 13  

    Dzięki za bardzo wartościowy post ;)

    excray napisał:
    Z tego co widzę to połączyłeś kilka różnych idei i próbujesz z nich złożyć jeden system.


    Jeśli chodzi o rezystor między kondensatorem a elektrodą to jest on na schemacie w pdfie Atmela.
    http://www.atmel.com/dyn/resources/prod_documents/doc8207.pdf
    (strona 14 - zdjęcie które wrzuciłeś, strona 15 - schemat elektryczny)

    excray napisał:

    Kod: asm
    Zaloguj się, aby zobaczyć kod



    Rozumiem że chodzi o maksymalną liczbę cykli pomiaru? (żeby kiedyś uciec z pętli - tak jak opisywałeś to w algorytmie)

    0
  • #18 28 Sty 2012 11:00
    excray
    Poziom 39  

    tsiu napisał:
    Rozumiem że chodzi o maksymalną liczbę cykli pomiaru? (żeby kiedyś uciec z pętli - tak jak opisywałeś to w algorytmie)

    Tak. Poza tym pole dotykowe jak i port procesora nawet kiedy nie jest "dotykany" ma pewną pojemność przez co w końcu kondensator i tak zostanie naładowany. Cykle musisz dobrać doświadczalnie. Im większa pojemność kondensatora tym więcej cykli trwa naładowanie. Im większe pole dotykowe tym mniej cykli. Najlepiej w zmontowanym układzie ustalić dwa marginesy - margines zadziałania i margines gdzie dioda świeci już ciągle i ustawić wartość licznika gdzieś w połowie. Kondensator dobrze jakby miał wartość z zakresu 1-22nF żeby procedura nie trwała zbyt długo. Dla mnie optymalny był 4n7. Wystarczy że pozmieniasz porty w kodzie i będzie działać na ATiny13.

    0
  • #19 29 Sty 2012 13:33
    tsiu
    Poziom 13  

    @excray:
    Zmieniałem porty, dawałem różne kondensatory, ale palca nie chciało wykryć.

    ***

    Ostatecznie odniosłem pełny sukces wzorując się na sposobie z texas instruments.
    Sposób ten działa na pinach PCINT, a wszystkie piny attiny13 mają tę własność.
    Nie wymaga też masy wokół elektrody, potrzebny jest tylko jeden element zewnętrzny (rezystor parę MΩ), działa z izolatorem na elektrodzie na PCB jak i bez, działa na odstającym druciku z izolacją i bez też. Można równie dobrze dotykać nóżki rezystora.

    O to mi właśnie chodziło bo jak wspominałem wyżej mam bardzo ograniczone miejsce na PCB.

    Dziękuję wszystkim wypowiadającym się w temacie :)

    Niedlugo postaram sie zaprezentowac swoj kod dla potomnych

    pozdrawiam

    0
  • #20 04 Lut 2012 12:07
    tsiu
    Poziom 13  

    Oto filmik pokazujący wykrywanie dotyku o którym pisałem w poście wyżej:


    Link

    (opis w opisie filmiku, po ang)

    Dodam jeszcze, że jeśli ktoś potrzebowałby zaimplementować o wiele więcej klawiszy to można byłby użyć uC Atmega48. Posiada ona 24 piny PCINT!
    Z drugiej strony, jakby się uprzeć żeby zrobić klawisze na uC ATmega8, warto wtedy ogarnąć sposób o którym pisał excray w tym temacie.

    Pozdrawiam

    0