Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Urządzenie do liczenia. Dodające lub odejmujące 1.

camoleon 22 May 2020 13:04 1092 27
Altium Designer Computer Controls
  • #1
    camoleon
    Level 5  
    Witam,
    chciałbym zbudować urządzenie do dodawania i odejmowania 1. Chciałbym by miało ono wyświetlacz, wyświetlający liczby do setek, dwa przyciski do dodawania i odejmowania oraz żeby pracowało na baterii. Jako, że jest to mój pierwszy taki "projekt", chciałbym się was spytać, jak będzie najlepiej to zrobić - na przerzutnikach, czy może jakoś inaczej? A także jakie rzeczy będą mi do tego potrzebne, co powinienem kupić?

    EDIT: Zainspirowała mnie praca w sklepie, w którym nie ma fotokomórki, a ochroniarz musi kontrolować liczbę osób w środku ze względu na obostrzenia. To urządzenie mogłoby ułatwić liczenie klientów po prostu :)
    Prowizoryczny podgląd:
    Urządzenie do liczenia. Dodające lub odejmujące 1.
  • Altium Designer Computer Controls
  • Helpful post
    #2
    maciej_333
    Level 38  
    Najprościej będzie to zrobić wyprowadzając poza obudowę tego urządzenia stosowne klawisze z kalkulatora. Wystarczy "+", "-", "1" i "=". Odnośnie układów klasycznych można wstawić liczniki rewersyjne i transkodery kodu BCD na 7-segmentowy. Najlepiej jednak wykorzystać jakiś mikrokontroler. Jeśli jesteś początkujący, to możesz zastosować Arduino, chociaż nie jestem wielkim zwolennikiem tej platformy.
  • Helpful post
    #3
    krzysiek_krm
    Level 40  
    Stosunkowo łatwo zrobić to za pomocą jakiegoś µC, dla osoby początkującej może być na przykład Arduino.
  • Altium Designer Computer Controls
  • #4
    camoleon
    Level 5  
    No tak, z tym, że Arduino raczej ma większe możliwości, a tanie tez nie jest. No i w dodatku są dziesiątki tych płytek, więc którą wybrać?
  • Helpful post
    #5
    Plumpi
    Heating systems specialist
    Można też zrobić na układach cyfrowych TTL 74192 https://eduinf.waw.pl/inf/prg/010_uc/74192.php
    To jest licznik rewersyjny, który po podawaniu impulsów na wejścia UP lub DOWN zlicza je w górę lub w dół.
    Do tego trzeba dołożyć układ 7447 dekoder kodu BCD na kod wyświetlacza 7-segmentowego oraz wyświetlacze.
    W tym wątku https://www.elektroda.pl/rtvforum/topic47689.html masz schemat takiego licznika.

    Ale w dzisiejszych czasach, kiedy do dyspozycji są mikrokontrolery, arduino czy malinki, po prostu łatwiej jest to wykonać na tych elementach/modułach. Łatwiej pod względem oczywiście konstrukcyjnym, bo nie trzeba projektować i wykonywać płytek drukowanych. Trzeba natomiast się nauczyć programowania.
    Co do Arduino to układ, którey chcesz wykonać jest na tyle prosty, że wykonasz go na każdym, nawet tym najtańszym module Arduino za kilkanaście złotych. Wystarczy tylko podłączyć jakiś wyświetlacz ciekłokrystaliczny lub LED i przyciski oraz napisać program.
  • Helpful post
    #6
    krzysiek_krm
    Level 40  
    Nie, żebym był jakimś maniakalnym i ortodoksyjnym miłośnikiem µC ale...
    W sprzętowym liczniku trzeba jakoś maskować drgania styków, w µC robi się to programowo, "za darmo", są nawet dostępne łatwe w użyciu biblioteki.
    W sprzętowym liczniku niemal każda zmiana funkcjonalności wymaga robienia układu od nowa, w µC w większości przypadków zmienia się po prostu program.
    camoleon wrote:
    No tak, z tym, że Arduino raczej ma większe możliwości, a tanie tez nie jest. No i w dodatku są dziesiątki tych płytek, więc którą wybrać?

    Rzuć okiem na przykład tu
    https://botland.com.pl/pl/234-arduino
    albo tu
    https://kamami.pl/13004-arduino
    albo tu
    https://nettigo.pl/products/category/5
    albo w AVT, gdzie można kupić klony - tanie jak barszcz.
    Plumpi wrote:
    Wystarczy tylko podłączyć jakiś wyświetlacz ciekłokrystaliczny lub LED i przyciski oraz napisać program.

    Z analizy problemu
    camoleon wrote:
    Zainspirowała mnie praca w sklepie, w którym nie ma fotokomórki, a ochroniarz musi kontrolować liczbę osób w środku ze względu na obostrzenia. To urządzenie mogłoby ułatwić liczenie klientów po prostu

    to raczej LED - będzie lepiej widoczny.
    Nieco krytykowane Arduino ma tę zaletę, że w Twoim przypadku da się zrobić układ niemal bez prac sprzętowych - no może trzeba jakoś podłączyć przyciski. :D
  • Helpful post
    #7
    yego666
    Level 33  
    Oczywiście można stworzyć dowolnie skomplikowany układ by zrealizować wymaganą funkcję, ale chyba najprostszym rozwiązaniem byłoby przerobienie jakiegoś starego kalkulatora tak by miał jedynie przyciski +, -, oraz 1.

    W ten sposób "za darmo" można zrealizować układ o którym piszesz.
    Kiedyś nawet robiono takie rzeczy na układach MC14007.
    Obecnie dowolny - nawet nieco uszkodzony - kalkulator z wyświetlaczem LCD wystarczy do realizacji tego pomysłu, wystarczy jedynie zmodyfikować klawiaturę i gotowe.
    Przykładowo mogłoby to wyglądać tak:
  • #8
    camoleon
    Level 5  
    Czy "Wielofunkcyjny Shield do Arduino - Uno R3 - Mega2560" (wybaczcie za formę, ale nie mogę jeszcze wstawiać linków) się nada? I rozumiem, że trzeba do tego mieć jeszcze tę główną płytkę, do której mogę sobie normalnie podpiąć USB?
  • Helpful post
    #9
    ojciec
    Level 33  
    Wystarczy:
    Link
    Link

    i kawałek płytki uniwersalnej do osadzenia dwóch/trzech przycisków.

    Przykład wykorzystania wyświetlacza:
    Link
  • #10
    jarek_lnx
    Level 43  
    camoleon wrote:
    EDIT: Zainspirowała mnie praca w sklepie, w którym nie ma fotokomórki, a ochroniarz musi kontrolować liczbę osób w środku ze względu na obostrzenia. To urządzenie mogłoby ułatwić liczenie klientów po prostu :)
    A co sie stanie jak się pomyli? Wydarzy się jakaś tragedia? Cel jest taki żeby klienci nie byli zbyt blisko siebie, nie dajmy się ogłupić. Najprostsza metoda ograniczenia liczby klientów to wymaganie aby każdy klient chodził z koszykiem, a liczba koszyków zakupowych będzie ograniczona.

    A co do tematu, realizacja sprzętowa to licznik + dekoder + wyświetlacz dla każdej dekady, jakby to robić amatorskim sposobem włącznie z PCB pod THT to sporo roboty. Na uC układ się upraszcza, a jeśli to ma być jedna, lub kilka sztuk to lepiej składać z gotowych modułów.
  • #11
    ArturAVS
    Moderator HP/Truck/Electric
    jarek_lnx wrote:
    A co do tematu, realizacja sprzętowa to licznik + dekoder + wyświetlacz dla każdej dekady, jakby to robić amatorskim sposobem włącznie z PCB pod THT to sporo roboty.

    Nie przesadzaj, dwa wyświetlacze+2x7447 i 2x74192+ kilka rezystorów i kondensatorów to dużo roboty? Po lekkiej adaptacji, można użyć; https://serwis.avt.pl/manuals/AVT2038.pdf
    Nie zmienia to faktu, że takie np. Arduino będzie tańsze i z możliwością rozbudowy/zmiany funkcji.
  • #12
    Plumpi
    Heating systems specialist
    jarek_lnx wrote:
    Najprostsza metoda ograniczenia liczby klientów to wymaganie aby każdy klient chodził z koszykiem, a liczba koszyków zakupowych będzie ograniczona.


    Jak sobie wyobrażasz dezynfekcję tych koszyków? Przecież koszyk to najlepszy sposób na przekazywanie wirusa z jednej osoby na drugą. Poza tym ludzie używają koszyków oraz wózków. Ile ma być wózków, a ile koszyków?
    Ja dla przykładu zauważam inne zagrożenia. Coraz częściej w marketach, zwłaszcza budowlanych, zastawiane są przejścia. Siłą rzeczy ludzie muszą się przeciskać i ocierać o siebie. Wystarczyłoby wprowadzić nakaz aby towary były wystawiane tylko i wyłącznie na regałach, pomiędzy którymi powinna być zachowana określona odległość i zakaz zastawiania przejść.
    Moim zdaniem ograniczanie ilości osób w sklepie jest kompletnie bezsensowne, bo ludzie w sklepie nie ustawiają równomiernie na całej powierzchni, lecz jedne działy są oblegane bardziej, a inne mniej. Czasami przy jednym regale tworzy się skupisko ludzi.

    Jeżeli zaś chodzi o liczenie ludzi to można to zrobić automatycznie. Z jednej strony mamy wejście, a z drugiej wyjście. Zamontować fotokomórki lub bariery, a człowiek niech tylko pilnuje czy system liczy prawidłowo i w razie pomyłki niech koryguje. Osoba ta powinna też dopilnować, aby osoby wchodzące i wychodzące zachowywały między sobą odstęp.
    Poza tym nie dajmy się zwariować. W markecie w którym może przebywać dla przykładu 200 osób jak się pomylimy w liczeniu o 10 czy 20 osób, czy oznacza to, że nagle wszyscy się zarażą wirusem? Przecież te wszystkie wytyczne są kompletnie abstrakcyjne i niepoparte są żadnymi danymi empirycznymi, ponieważ sytuacja pandemii tego wirusa jest pierwszą w historii. Powinny być więc tylko i wyłącznie zaleceniami, a nie bezwzględnie egzekwowanym prawem.
  • #13
    jarek_lnx
    Level 43  
    Plumpi wrote:
    Jak sobie wyobrażasz dezynfekcję tych koszyków? Przecież koszyk to najlepszy sposób na przekazywanie wirusa z jednej osoby na drugą. Poza tym ludzie używają koszyków oraz wózków. Ile ma być wózków, a ile koszyków?
    Są w użyciu jeszcze jednorazowe rękawiczki. Poza przypadkami klientów którzy wpadają do sklepu po jedn/dwa produkty, użycia koszyków czy wózków trudno uniknąć. Ile czego ma być? Nie wiem. W wielu sklepach zostawiono tylko wózki.

    Plumpi wrote:
    W markecie w którym może przebywać dla przykładu 200 osób jak się pomylimy w liczeniu o 10 czy 20 osób, czy oznacza to, że nagle wszyscy się zarażą wirusem? Przecież te wszystkie wytyczne są kompletnie abstrakcyjne i niepoparte są żadnymi danymi empirycznymi, ponieważ sytuacja pandemii tego wirusa jest pierwszą w historii. Powinny być więc tylko i wyłącznie zaleceniami, a nie bezwzględnie egzekwowanym prawem.
    Widzę że z czasem ludzie zaczynają rozsądniej do tego podchodzić, w mojej okolicy nie ma już takich kolejek, po prostu nie przychodzą wszyscy o tej samej godzinie, nie ma już potrzeby pilnować każdej osoby na zasadzie jeden wchodzi jeden wychodzi. Zniknęły też głupie pomysły wpuszczania/wypuszczania grupami po kilkanaście osób - pod sklepem który to stosował były najdłuższe kolejki i pewnie najmniejsza sprzedaż.
  • #14
    _jta_
    Electronics specialist
    Mógłby być taki system, że: (1) do wózka trzeba wstawić koszyk (i wolno wejść z samym koszykiem, z wózkiem i koszykiem, ale bez koszyka nie), i (2) po użyciu koszyk (i ewentualnie wózek) idzie na zaplecze do dezynfekcji, a obsługa natychmiast wystawia inne, już zdezynfekowane. Gorzej, jeśli sklep ma parę wejść, i przy jednym są koszyki, a przy drugim kolejka klientów... No i trzeba mieć wózki, do których pasują koszyki... albo zrezygnować z koszyków i udostępniać tylko wózki, albo trochę tych, trochę tych, i obserwować, czego jest w danej chwili mniej przy wejściu.
  • #15
    SylwekK
    Level 32  
    Licznik taki można też zrealizować tanim kosztem na module ze starego tunera sat - kwestia napisania programu, np. w C lub Bascom (dla początkujących i niezbyt wymagających zajmujących się programowaniem okazjonalnie to dobry prosty język).
    Zobacz przykład wykorzystania https://www.elektroda.pl/rtvforum/topic3676125.html
  • #16
    camoleon
    Level 5  
    Dziękuję, wszystkim za pomoc.

    Ostatecznie skorzystałem z tych urządzeń:
    ojciec wrote:
    Wystarczy:
    Link
    Link

    i kawałek płytki uniwersalnej do osadzenia dwóch/trzech przycisków.

    Przykład wykorzystania wyświetlacza:
    Link


    Mniej więcej działa, nie wiem tylko jak zrobić, żeby zmieniało liczbę raz na kliknięcie (aktualnie jeśli przytrzymam przycisk to liczby dodają/odejmują się non stop przez co czasem przeskakują o dwie). Wiem, że to kwestia programu, ale nie bardzo wiem co dopisać.
    Kod:
    Spoiler:
    Quote:
    #include <TM1637Display.h>


    #define ZEGAR A5
    #define DANE A4
    TM1637Display display(ZEGAR, DANE);

    int DODAJ=4;
    int ODEJMIJ=5;
    int delayTime=35;
    int liczba=0;

    uint8_t clearMe[]={
    0,0,0,0
    };

    void setup() {
    display.setSegments(clearMe);
    display.setBrightness(0x0A);
    pinMode(DODAJ, INPUT_PULLUP);
    pinMode(ODEJMIJ, INPUT_PULLUP);

    }

    void loop() {


    display.showNumberDec(liczba);

    if(isButtonPressed(DODAJ)==true){
    if(liczba<9999) {
    liczba+=1;
    display.showNumberDec(liczba);
    }
    else display.showNumberDec(liczba);
    }

    if(isButtonPressed(ODEJMIJ)==true){
    if(liczba>0) {
    liczba=liczba - 1;
    display.showNumberDec(liczba);
    }
    else display.showNumberDec(liczba);
    }
    }


    bool isButtonPressed(int button){
    if(digitalRead(button)==LOW){
    delay(delayTime);
    if(digitalRead(button)==LOW){
    return true;
    }
    }
    return false;
    }




  • #18
    camoleon
    Level 5  
    SylwekK wrote:
    Dopisz oczekiwanie na puszczenie przycisku po jego zliczeniu :)
    Pamiętaj o drgających stykach, które mogą wprowadzać spory błąd.



    Domyślam się, że musi być oczekiwanie, ale nie mam pomysłu jak je zrobić. Bo z delay'em na sztywno działa to bardzo losowo. A co do drgań styków to programowo powinny być wyeliminowane.
  • #19
    SylwekK
    Level 32  
    Nie znam kompletnie arduino, więc tylko sugeruje rozwiązanie jakie bym zrobił w C. Być może komenda do badania klawisza już ma w sobie debounce (antydrgamiowy filtr)

    Oczekiwanie robisz tak, że sprawdzasz stan przycisku i jeśli wciśnięty to program oczekuje, lub przeskakuje fragment odpowiedzialny za zliczanie
  • #20
    krzysiek_krm
    Level 40  
    camoleon wrote:
    SylwekK wrote:
    Dopisz oczekiwanie na puszczenie przycisku po jego zliczeniu :)
    Pamiętaj o drgających stykach, które mogą wprowadzać spory błąd.



    Domyślam się, że musi być oczekiwanie, ale nie mam pomysłu jak je zrobić. Bo z delay'em na sztywno działa to bardzo losowo. A co do drgań styków to programowo powinny być wyeliminowane.

    Jest gotowe oprogramowanie
    https://github.com/thomasfredericks/Bounce2
    wieść gminna głosi, że działa całkiem przyzwoicie.
    W szczególności można wykrywać moment wciśnięcia przycisku.
  • Helpful post
    #21
    _jta_
    Electronics specialist
    Takie programy pisze się zupełnie inaczej - dobrze byłoby zapoznać się z pojęciem maszyny stanów (state machine). Można tak:
    Code: c
    Log in, to see the code

    Zasada jest taka: zwiększamy licznik czasu wciśnięcia, a jeśli wykrywamy, że przycisk nie jest wciśnięty, to go zerujemy; kiedy licznik osiąga delayTime, zliczamy wciśnięcie nie zerując licznika. Jeśli przycisk potrzymamy bardzo długo (ponad minutę), to zostanie policzony powtórnie, bo licznik przekręci się w kółko, ale to chyba nie problem?

    Dobrze byłoby ustalić, ile czasu wykonuje się display.showNumberDec(liczba), bo może to daje spory wkład do czasu wykonania loop() i należy zmniejszyć delayTime, albo nawet wyrzucić delay(1)? Albo wykonywać display.showNumberDec(liczba) tylko po zmianie liczby (chyba nie jest tak, że bez wywoływania tej funkcji cyfry gasną? był i taki sprzęt).
  • #22
    camoleon
    Level 5  
    _jta_ wrote:
    Takie programy pisze się zupełnie inaczej - dobrze byłoby zapoznać się z pojęciem maszyny stanów (state machine). Można tak:
    Code: c
    Log in, to see the code

    Zasada jest taka: zwiększamy licznik czasu wciśnięcia, a jeśli wykrywamy, że przycisk nie jest wciśnięty, to go zerujemy; kiedy licznik osiąga delayTime, zliczamy wciśnięcie nie zerując licznika. Jeśli przycisk potrzymamy bardzo długo (ponad minutę), to zostanie policzony powtórnie, bo licznik przekręci się w kółko, ale to chyba nie problem?

    Dobrze byłoby ustalić, ile czasu wykonuje się display.showNumberDec(liczba), bo może to daje spory wkład do czasu wykonania loop() i należy zmniejszyć delayTime, albo nawet wyrzucić delay(1)? Albo wykonywać display.showNumberDec(liczba) tylko po zmianie liczby (chyba nie jest tak, że bez wywoływania tej funkcji cyfry gasną? był i taki sprzęt).


    Dziękuję za napisanie kodu. Niestety coś nie do końca działa. Wciśnięcie przycisków nie zmienia liczby na wyświetlaczu. Coś jest nie tak w funkcji chyba.
  • #25
    camoleon
    Level 5  
    _jta_ wrote:
    Oj, widzę błąd: nie *time ++, a (*time)++, albo *time += 1. Operator ++ ma wyższy priorytet, niż *. ;)


    Wciąż nie działa, niestety :(
  • Helpful post
    #26
    _jta_
    Electronics specialist
    Nie mam pod ręką Arduino, żeby spróbować, więc przerobiłem program tak, by móc przetestować jego działanie pod Linux-em bez Arduino - i działa.
    Przy zdefiniowanym symbolu ARDUINO kompilują się te elementy, które są dla Arduino; bez niego te, które są do Linux-a.
    Code: c
    Log in, to see the code
  • #27
    camoleon
    Level 5  
    _jta_ wrote:
    Nie mam pod ręką Arduino, żeby spróbować, więc przerobiłem program tak, by móc przetestować jego działanie pod Linux-em bez Arduino - i działa.
    Przy zdefiniowanym symbolu ARDUINO kompilują się te elementy, które są dla Arduino; bez niego te, które są do Linux-a.
    Code: c
    Log in, to see the code



    Faktycznie działa. To był totalnie mój błąd, gdyż w tej wersji programu nie zmieniłem pinów przycisków (w międzyczasie zmieniłem je na takie z obsługą interrupt), dla tego poprzedni program działał a ten nie.
    Dziękuję bardzo za pomoc i przepraszam za wprowadzenie w błąd. :)

    Dodano po 28 [minuty]:

    Tak wygląda mój ostateczny układ. W międzyczasie dodałem jeszcze moduł zasilający, ponieważ chciałem popróbować jak to będzie działać. W efekcie mogę zasilać układ zasilaczem :)
    Urządzenie do liczenia. Dodające lub odejmujące 1.
    Nie wiem, czy te filmiki działają dobrze tutaj, ale wstawiam:




    Kod, dzięki uprzejmości użytkownika _jta_:
    Code: c
    Log in, to see the code
  • Helpful post
    #28
    SylwekK
    Level 32  
    Podam w takim razie jeszcze moje rozwiązanie pozbawione błędu "repeat" przy długim wciśnięciu i posiadający bardzo skuteczny filtr antydrganiowy. Z oczywistych względów program jest w C, ale jeśli w arduino można bezpośrednio pisać do rejestrów to to nie będzie problemów z jego adaptacją :)

    Code: c
    Log in, to see the code


    Wartość"300" należy dobrać doświadczalnie. Jeśli reakcja na przycisk będzie zbyt powolna to wartość należy nieco zmniejszyć. Analogicznie jeśli zależy nam na dłuższym przytrzymaniu do zatwierdzenia - wartość zwiększyć.
    Program jest nieblokujący więc innym ewentualnym funkcjom programu głównego nie będzie przeszkadzał.
    Przeanalizuj działanie tego prostego kodu, bo jest on dobrą podstawą do niezawodnej obsługi przycisków i jest rozwojowy, np. krótki/długi wcisk gdzie tych "długich" może być nawet kilka(!) na jednym przycisku :)