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

Licznik z rejestratorem na karcie SD

Limonit 20 Apr 2015 14:00 8799 18
Automation24
  • Pomysł na ten projekt podsunął mi kolega. Poprosił o analizę problemu zliczania klientów wchodzących do sklepu.

    Licznik z rejestratorem na karcie SD

    Zaproponowałem taki projekt:
    - kontaktoron reagujący na otwarcie drzwi lub tor optyczny,
    - rejestracja zdarzeń w pliku na karcie SD,
    - rejestracja kazdego zdarzenia wraz z godziną – uzycie RTC
    - zasilanie całości z baterii – dzięki temu będzie mniej przewodów.


    W czasie opracowywania doszły dodatkowe uwagi:
    - ostrzeżenie o słabej baterii,
    - alarm otwartych drzwi (dla wersji z kontaktronem – po minucie sygnał dźwiękowy).

    W efekcie powyższych założeń i ustaleń powstało takie oto urządzenie.


    Wykonane zostały trzy egzemplarze. Są właściwie identyczne – różnią się mało istotnymi szczegółami (np. jeden nie ma wlutowanych goldpinów do podłączenia programatora, inny kolor diod).

    W urządzeniu wykorzystałem gotowy moduł kart micro SD i gotowy moduł RTC z układem DS3231. Oszczedza to nieco pracy a koszt przy tak małej liczbie egzemplarzy jest własciwie zaden. Zarówno moduł karty jak i zegara ma podciągnięte linie danych do Vcc rezystorami 10K – zatem brak ich na schemacie (dla karty SD nie jest to konieczne).

    Jako mikrokontroler jest użyta Atmega328P – dysponuje na tyle dużą ilością pamięci Flash i RAM, ze bez problemu obsługuje system plików FAT (wykorzystałem FatFS).

    Na płytce jest jeszcze buzer piezo wraz ze zworką, która można go odłączyć całkowicie.

    Jest też układ do pomiaru napięcia baterii. Wykorzystywany jest w tym celu przetwornik ADC wraz z wewnętrznym źródłem odniesienia 1,1V. Układ pomiarowy składa się z dzielnika napięcia (2:1) oraz tranzystora, który go załącza (w tej roli BC547). Dzielnik jest załączany do masy na czas pomiaru, aby nie pobierał prądu, kiedy nie jest potrzebny. Przypominam, że układ jest zasilany z baterii.

    Licznik z rejestratorem na karcie SD



    Układ projektowany jest do zasilania z dwóch baterii AA. Zatem wymagało to podejścia minimalizującego pobór prądu. W oczekiwaniu na zdarzenie procesor jest w trybie Power Down i wybudzany jest przerwaniem (Pin change interrupt). W tym stanie cały układ pobiera 160-170uA. Szczegółowy pomiar wykazuje, że około 95% z tego jest pobieranych mniej więcej po równo przez kartę SD i układ DS3231. Problemem jest realizacja wejścia kontaktronu. Jest ono podciągnięte do zasilania przez rezystor 10k. Przy zastosowaniu kontaktronu normalnie otwartego (większość dostępnych) dochodzi ok. 0,3mA. Sumarycznie wychodzi zatem niecałe 0,5mA. Praktyczny test wykaże, na ile realnie wystarczy komplet baterii, zakładam, że będzie to co najmniej kilka tygodni.

    W programie napisanym w C wykorzystałem biblioteki FatFS. Wykonałem w nich dwie przeróbki – do obsługi karty SD wykorzystałem sprzętowy interfejs SPI. Druga zmiana – data modyfikacji pliku pobierana jest z układu Ds3231 – co jest zupełnie logicznym rozwiązaniem, wziąwszy pod uwagę dostępność aktualnego czasu. Zegar jest ustawiany przy pomocy specjalnego pliku konfiguracyjnego, który należy umieścić na karcie pamięci.

    W czasie komunikacji z kartą uSD zegar procesora wynosi 8MHz – w pozostałym czasie zegar jest zwalniany do 1MHz (bit CKDIV8). Źródło – oscylator wewnętrzny RC.

    Do wpisu załączam instrukcję obsługi urządzenia – są tam szczegóły dotyczące konfiguracji.

    Załączam także próbkę logu. Zawiera on godzinę zdarzenia, temperaturę otoczenia (układ DS3231 posiada wbudowany niezły termometr), co 10. pomiar zawiera również pomierzone napięcie baterii.

    Układ posiada alarm otwartych drzwi (sygnał dźwiękowy po minucie). Posiada alarm rozładowanych baterii.

    Cały czas trwają testy układu, zapewne nie obędzie się bez drobnych poprawek kodu.

    Udostępniam projekt płytki i schemat w KiCadzie. Nie będzie tym razem kodu, ale chętnie odpowiem na pytania o sposób realizacji (projekt wg mojego rozeznania ma potencjał komercyjny i nie chcę podrzucać komuś gotowca). Dodatkowo instrukcja i próbka logu.

    O projekcie można poczytać również na
    mojej stronie:

    Jeszcze jeden obrazek:
    Licznik z rejestratorem na karcie SD

    Cool? Ranking DIY
    About Author
    Limonit
    Level 13  
    Offline 
    Limonit wrote 138 posts with rating 366, helped 1 times. Live in city Wwa. Been with us since 2007 year.
  • Automation24
  • #2
    anu
    Level 17  
    Witam! Mała, ale fajna rzecz. Mam pytanie: czy i jak został rozwiązany problem ograniczonej ilości liczby cykli zapisu na karcie SD?
  • #3
    Limonit
    Level 13  
    Dzięki.
    Ciekawe pytanie - ze strony urządzenia brak takiego rozwiązania.
    O ile mi wiadomo wiele kart ma wbudowany wear leveling i zakładam, że to wystarczy.
    Mamy jak na razie zwykłe karty, chyba san disk 2GB i praktyka pokaże ile da radę wytrzymać.
  • #4
    anu
    Level 17  
    Pierwsze małe karty pamięci chyba nie miały tego, ale ręki sobie uciąć nie dam.

    Przy wielokrotnym zapisie masz 2 poziomy problemu:
    - wielokrotny zapis tego samego sektora dla każdej nowej linijki tekstu;
    - aktualizacja FAT.

    Można kombinować z trzymaniem tego w pamięci, ale jest wtedy problem bezpieczeństwa.

    Projekt OK. Sam coś podobnego potrzebuję, tyle że na więcej wejść. Ja swoje rzeczy zawsze pisałem w ASM, więc pewne sprawy związane z C (np. brak widocznej kontroli nad drobnymi szczegółami) mnie nurtują niesamowicie. Ale to nie ten czas jeszcze... :)

    Ciekawi mnie też, czy ten RTC daje radę, czy trzeba go "kalibrować" laptopem i programatorem co tydzień? :D
  • Automation24
  • #5
    gdkj
    Level 26  
    W następnej edycji może jakiś eprom plus bezpośrednia komunikacja z komputerem ? (np.uart,wifi,etc)
    A w komputerze aplikacja do robienia statystyk połączona z programem magazynowym i załoga sklepu przeszczęśliwa, we wtorki wystawiamy majtki a środy papierosy... ;)
    Pozdrawiam.
    PS. Jeżeli są wątpliwości do do wytrzymałości karty to nie lepiej zrobić na karcie zapis raz na jakiś czas ? Ja kiedyś robiłem moduł do szafy grającej to dane z dnia procek zapisywał do pamięci przy wyłączaniu szafy. Teoretycznie dało mi to 100 tyś, dni.
    Prędzej szafa się rozpadnie...
  • #6
    Limonit
    Level 13  
    Kombinowałem, zeby zrobić w pamięci procka bufor i zapisywać np co 10-20 zdarzeń na kartę, teoretycznie powinno to wydłuzyć tylokrotnie jej zywotność. Jeśli bedzie problem ze zbyt szybko padającymi kartami, na pewno dorobię takie rozwiązanie.
    Tak swoją drogą - np tego typu karty w wideorejestratorach samochodowych - nie maja lekkiego życia. Może ktos się orientuje, ile wytrzymują.

    Rozważałem zastosowanie "autorskiego" interfejsu do komputera (własnie jakiś UART albo transmisję bezprzewodową), ale jednak to wymaga aplikacji po drugiej stronie. Jednak dla uzytkownika karta z plikiem csv jest chyba najwygodniejsza. Nie ma problemu czy jest to Windows, Linux, MacOS. Byle jaki PC z byle jakim arkuszem kalkulacyjnym wystarczy żeby obejrzec sobie logi, zrobić statystyki.

    Dodatkową zaletą użycia karty w roli pamięci nieulotnej jest to, że jej wymiana w razie awarii w zasadzie nie wymaga wysiłku a i cena tez raczej nie jest problemem.
  • #8
    scooba
    Level 15  
    Super pomysl, pokusilbym sie tylko o normalne zasilanie , chyba , ze urzadzenie ma byc mobilne, wypozyczane do sklepow.
    Bardzo podoba mi sie pomysl wiazki na wysokosci np. 1metra.
    Ograniczanie sie z zapasem energi urzadzenia wydaje mi sie dyskfalifikowac je jako profesjonalne, oczywiscie to jest moja subiektywna ocena.
    Sam pomysl oraz projekt oczywiscie nie moge ocenic inaczej jak tylko na plus. A moja subiektywna ocena wynika tylko i wylacznie z mojego maloekologicznego widzimisie.
    Piszac to ,zastanawiam sie .. Skoro ma to pracowac na baterii, to rownie dobrze moze miec jakies male ogniwo fotowoltaiczne, wszak w sklepie jest przewaznie sporo swiatla i zamiast baterii siedzielby aku doladowywany w czasie pracy sklepu. A jak w sklepie ciemno w nocy przechodzi w stan uspienia. Pozdrawiam
  • #9
    Limonit
    Level 13  
    Zasilanie fotowoltaiczne - powinno być wykonalne w 100%, ilość energii wymagana przez urzadzenie jest znikoma.
    Do podtrzymania w okresie ciemności wystarczyłby nawet (super)kondensator ~1F.
    Zasialnie z baterii moim zdaniem upraszcza montaż, nie trzeba kombinować z przewodami.

    W jednym z urzadzeń kolega ma zamiar użyć toru optycznego i z racji, że taka fotokomórka wymaga juz zasilania sieciowego, sam rejestrator zostanie równiez podłaczony niejako przy okazji. W ogólnosci nie jest to zaden problem.

    Odnośnie dokładności DS3231 - padło takie pytanie. Teoretycznie bardzo dobra, praktycznie za krótko mam te układy, żeby powiedzieć. Tutaj odsyłam do DS - prawdopodobnie w okolicach kwoty kilka-kilkanascie zł nie będzie nic lepszego.
    Sam moduł RTC ma swoje podtrzymanie bateryjką CR1220, która powinna starczyć na długie lata.
  • #10
    LA72
    Level 41  
    Limonit wrote:
    Sam moduł RTC ma swoje podtrzymanie bateryjką CR1220, która powinna starczyć na długie lata.


    Myślałem o podtrzymywaniu zasilania dla uC. Miałbyś wtedy możliwość wykonywania wpisów dna kartę pamięci co jakiś czas.
  • #11
    Limonit
    Level 13  
    Zrozumiałem :)

    Ale skoro całość jest zasilana z baterii, to jak jeszcze podtrzymywać :)
    Procek monitoruje stan baterii - programowa realizacja zrzutu bufora kiedy bateria się wyczerpuje powinna wystarczyć.
    Atmega328P będzie pracować do napięcia 1,8V, pierwsze odmówią współpracy karta i układ RTC, zatem kiedy napięcie spada w okolice minimum, procesor da radę bezpiecznie wyłączyć całość (tak to jest zresztą zrobione).
  • #12
    noel200
    Level 26  
    Mam taki moduł rtc na DS3231 i drugi podobny. Oba pracują nieprzerwanie kilka miesięcy i czas względem aktualizowanego czasu w PC rozjechał się jedynie kilka sekund, więc są bardzo dokładne.
    Ciekawe urządzenie. Podoba mi się. Ile czasu zajmuje zapis jednej linijki tych danych na karcie sd dla atmega 328 pracującej na 8MHz?
  • #13
    Limonit
    Level 13  
    noel200 wrote:
    Ile czasu zajmuje zapis jednej linijki tych danych na karcie sd dla atmega 328 pracującej na 8MHz?


    Czas jest niemierzalny metodami organoleptycznymi - ułamek sekundy. Sprawdzalem na oscyloskopie, transmisja trwa tak krótko, że ciężko ją uchwycić. Ponieważ dokładny pomiar nie był mi potrzebny, odpuściłem dalszą analizę. Teraz nawet trochę szkoda, że nie zmierzyłem - nie mam już tych urzadzeń.
    Dopisanie do pliku, który zajmował już kilka MB nie trwało znacząco dłużej.

    Generalnie SPI pracuje z częstotliwością 4MHz co daje teoretycznie max 4MBit/s. ale do tego dochodzi narzut protokołu, przetwarzanie danych przez procek no i opóźnienia karty (aczkolwiek zakładam, że nie są zbyt duże).
  • #14
    dondu
    Moderator on vacation ...
    Limonit wrote:
    LA72 wrote:
    Myślałem o podtrzymywaniu zasilania dla uC. Miałbyś wtedy możliwość wykonywania wpisów dna kartę pamięci co jakiś czas.


    Zrozumiałem :)

    Ale skoro całość jest zasilana z baterii, to jak jeszcze podtrzymywać :)

    ... odłączając za pomocą mikrokontrolera i tranzystora zasilanie karty SD.

    Zastosowanie drogiego RTC DS3231 jest oczywiście jakimś rozwiązaniem, ale dając tak duży mikrokontroler jak ATMEGA328, który ma możliwość podłączenia zewnętrznego kwarcu zegarkowego, nie stosowanie DS3231 znacznie zmniejszyłoby koszty projektu przy zachowaniu niewiele gorszej dokładności odmierzania czasu.

    Generalnie projekt OK :)
  • #15
    tank_driver
    Level 17  
    Problem z trwałością karty SD można rozwiązać stosując zewnętrzną pamięć RAM z podtrzymaniem bateryjnym, zapisywać w niej bieżąco i zgrywać z niej dane na kartę kilka razy dziennie + dodatkowo przyciskiem na żądanie operatora (dla przykładu przed wyciągnięciem karty z układu, tak aby dane na niej były aktualne).
    http://www.microchip.com/wwwproducts/Devices.aspx?product=23LCV512

    EDIT: możesz również skorzystać z DS3232M, który to oprócz RTC integruje w swojej strukturze 236 bajtów podtrzymywanej pamięci RAM.
  • #16
    hektorer
    Level 11  
    A czy zadbałeś o to by zbyt krótkie impulsy nie były zapisywane? Chodzi mi o sytuacje kiedy ktoś niezdecydowany ledwie uchyli drzwi, czyli nie przejdzie.
  • #17
    Limonit
    Level 13  
    Kazdy sygnał powyżej około kilkudziesięciu milisekund jest brany pod uwagę. Urzadzenie właśnie przechodzi testy - bedzie porównywane z zapisem monitoringu i jesli faktycznie pojawią się jakieś możliwości poprawy - np. własnie zmniejszenie czułości - to będe doprogramowywał.

    Co do poboru energii - odłączanie karty SD ma te wadę, że przy włączeniu przechodzi procedurę inicjująca, która trochę trwa i trochę energii potrzebuje. Niekoniecznie to musi się opłacac, aczkolwiek może.

    Dobrym pomysłem byłoby odłaczanie zasilania układu RTC. Na podtrzymaniu bateryjnym pobiera z baterii znacznie mniej prądu niż ze źródła zasilania (jesli zajmuje sie tylko odmierzaniem czasu, bez komunikacji). Mozna nawet pokusic sie o zasilanie bezpośrednio z pinu mikrokontrolera - pobór prądu jest mały.
  • #18
    anu
    Level 17  
    hektorer wrote:
    A czy zadbałeś o to by zbyt krótkie impulsy nie były zapisywane? Chodzi mi o sytuacje kiedy ktoś niezdecydowany ledwie uchyli drzwi, czyli nie przejdzie.

    Dla mnie taka opcja brzmi jak bug, który może wykorzystać zaznajomiony z projektem.
    Alternatywnie można zapisywać takie zdarzenie z oznaczeniem, że tutaj ktoś normalnie otwierał, a tutaj tylko zajrzał.
  • #19
    Alek_H
    Level 8  
    Siedem lat temu pojawił się ten artykuł, lecz mam nadzieję, że Autor jeszcze go pamięta (chyba, że ELEKTRODA mu przypomni).
    Właśnie tego typu licznika potrzebuję.
    Mam zawór sterowany hydraulicznie, który za pomocą mikroprzełącznika krańcowego wysyła informację 0-1 do układu elektronicznego sterowania maszyną.
    Potrzebuję zapisu takich momentów zadziałań tej krańcówki. Nie jest to dużo zdarzeń, ok. 2-3 na godzinę. Lecz chcę znać czas takiego zadziałania. Nic więcej.
    Codziennie mogę wymieniać baterię czy dokonywać odczytu logów z karty SD.
    Nie jest mi potrzebna żadna sygnalizacja dźwiękowa ani analiza stanu baterii.
    Jedynie zapis godziny i minuty na karcie SD.
    W zawiązku z tym mam następujące pytania:
    1. Jaki element w Pańskim projekcie dawał układowi znać, że nastąpiło otwarcie drzwi? Krańcówka na drzwiach czy czujnik zbliżeniowy?
    2. Czy po siedmiu latach należałoby wprowadzić zmiany w związku z nową generacją kart SD?
    3. O jaki zespół należałoby rozbudować układ aby stał się on elementem sieci WiFi, przez którą wysyłany byłby sygnał zadziałania krańcówki i przez którą ściągane byłyby na komputer logi.
    Pozdrawiam i gratuluję artykułu.