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

Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe

p.kaczmarek2 23 Feb 2020 23:16 3276 10
Computer Controls
  • Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Witajcie moi drodzy
    Dzisiaj przedstawię mój projekt prostego zegara/kalendarza opartego o mikrokontroler PIC16F1455, gotowy moduł wyświetlacza ośmiocyfrowego na MAX7219 oraz gotowy moduł RTCC (zegara/kalendarza) DS1302, zasilanego i konfigurowanego przez USB. Do zegara zaprojektowałem własną obudowę którą wydrukowałem na drukarce 3D.
    Całość opiszę bardzo szczegółowo, wraz z osobnymi krokami któremu podjąłem w trakcie projektowania całości i umieszczę opracowane po drodze przykładowe kody dla PICa.

    Założenia projektu
    Założenia projektu powstawały w trakcie jego wykonywania, ale tutaj podam ich ostateczną, aktualną wersję.
    - projekt będzie bazować na mikrokontrolerze PIC16F1455 i wykorzysta oferowany przez niego wewnętrzny oscylator wysokiej precyzji oraz sprzętowe USB
    - do wyświetlania zostanie użyty moduł 7-segmentowego wyświetlacza na MAX7219
    - do mierzenia czasu zostanie użyty moduł RTCC DS1302 z bateryjką
    - ustawienie godziny będzie możliwe jedynie przez USB (poprzez HID)
    - układ zasilany będzie przez USB z 5V z dowolnej ładowarki/powerbanku
    - firmware napiszę w MikroC PRO for PIC w języku C
    - obudowę zaprojektuję w Blenderze i wydrukuję na swojej drukarce Ender PRO 3
    - zegar będzie wyświetlać na przemian datę i godzinę
    - wszystkie kody i pliki modelów 3D będą opublikowane na forum

    Użyte części, moduły
    Tutaj wypiszę najważniejsze elementy elektroniczne jakich użyłem do zrealizowania projektu.
    8-bitowy mikrokontroler PIC16F1455 w obudowie DIP14:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Mikrokontroler ze sprzętowym USB, SPI, UART, PWM, dwoma Timerami 8-bitowymi i jednym 16-bitowym. 14kB pamięci Flash i 1kB RAM. Dodatkowo posiadający precyzyjny wewnętrzny oscylator, co pozwala na użycie USB bez potrzeby podłączania na zewnątrz oscylatora kwarcowego.
    Do zakupienia za jakieś 6 zł, np. w TME.
    Nota katalogowa PIC16F1455 do pobrania:
    pic16f1455...asheet.pdf Download (6.91 MB)

    Wyświetlacz 7-segmentowy ośmiocyfrowy na MAX7219 z interfejsem SPI:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Prosty moduł wyświetlacza 7-segmentowego, ośmiocyfrowego z kropkami. Niestety bez dwukropka. Oparty o układ scalony MAX7219, dzięki czemu do sterowania wymaga tylko kilku pinów. Korzysta z protokołu SPI.
    Moduł zakupiłem na eBayu za 1.73£, czyli jakieś 9 zł.
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Nota katalogowa MAX7219 (samego układu, nie modułu) do pobrania:
    MAX7219-MA..221.pdf Download (491.3 kB)

    Moduł zegara/kalendarza RTCC DS1302 z bateryjką:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Moduł zegara/kalendarza DS1302 ma na pokładzie rezonator kwarcowy zegarkowy 32.768kHz i bateryjkę CR2032. Ustawiony raz czas jest pamiętany po odłączeniu zasilania dzięki tej bateryjce.
    Również zakupiony na eBayu (w zestawie od razu była bateryjka), całość za 0.99£, czyli około 5 zł:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Nota katalogowa DS1302 (samego układu, nie modułu):
    DS1302.pdf Download (204.81 kB)
    Oprócz tego użyłem drobnicy, kilka rezystorów, kondensatorów podstawki pod PICa, oraz płytki uniwersalnej:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    I oczywiście filamentu PLA do wydruku obudowy.

    Szczegółowy opis kroków konstrukcji
    Poniżej opiszę krok po kroku jak powstawał projekt, załączę zdjęcia i zrzuty ekranu z postępów prac. Sprecyzuję jakie problemy po drodze musiałem rozwiązać, oraz umieszczę kody źródłowe opracowane na każdym etapie (są one zorganizowane tak, że każdy stanowi osobną całość - przykład użycia PICa).

    Krok 1 - Uruchomienie PICa (miganie diodą)
    Na samym początku postanowiłem uruchomić najprostsze miganie diodą na PICu, to praktycznie zawsze jest wstępem do większych projektów.
    Do wgrywania wsadu postanowiłem użyć mojego klonu PICKIT2:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Na płytce uniwersalnej podłączyłem PICa, dałem mu kondensator 100nF między piny zasilania i rezystor 10k na pin MCLR/RESET. Podłączyłem go poprzez ICSP do programatora:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    PICKIT2 początkowo nie wspierał PIC16F1455, ale dzięki nieoficjalnym aktualizacjom pliku PK2DeviceFile.dat teraz go wspiera, więc od razu u mnie go rozpoznał:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Zaktualizowane pliki PK2DeviceFile.dat można pobrać za darmo z forum Microchipa za darmo, tak jak soft PICKIT2, ale w razie czego też go wrzucę tutaj:
    PICkit 2 v...200223.zip Download (3.73 MB)
    Uruchomiłem MikroC PRO for PIC, w którym napisałem prosty program blink, skonfigurowany tak by używał wewnętrznego oscylatora z PICa:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Na płytce stykowej podłączyłem dodatkowo diodę i rezystor i w ten sposób udało się uzyskać pierwsze oznaki życia układu:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Załącznik - PIC16F1455 blink (najprostsze miganie diodą LED) - (projekt MikroC, kod C, skompilowany wsad) do pobrania:
    p16f1455_b...intOsc.zip Download (16.67 kB)Points: 1 for user

    Krok 2 - Test UART
    Następnie wziąłem się za uruchamianie komunikacji UART z PICa do komputera (poprzez przejściówkę na USB).
    Na tym etapie nie zdecydowałem jeszcze się na USB, dlatego eksperymentowałem z UART. Na koniec jednak UART nie użyłem, jednakże załączę tu i tak mój przykładowy kod/projekt, bo może komuś się przyda.
    PIC16F1455 ma funkcje TX/RX UART na następujących pinach:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Podłączyłem do komputera tylko pin RX poprzez tą przejściówkę:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    I użyłem biblioteki UART z MikroC ( https://download.mikroe.com/documents/compilers/mikroc/pic/help/uart_library.htm ) do wysłania tekstu na PC:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Uruchamianie UART na tym PICu przebiegło bez problemów, jednak ostatecznie go nie użyłem, dlatego że USB jest wygodniejsze oraz o ile dobrze pamiętam to jeden z pinów PIC16F1455 współdzielił funkcję UART z SPI, czego obsługa nieco skomplikowałaby projekt.

    Załącznik - PIC16F1455 UART - (projekt MikroC, kod C, skompilowany wsad) do pobrania:
    p16f1455_u...intOsc.zip Download (18.19 kB)Points: 2 for user

    Krok 3 - Programowanie komunikacji z MAX7219
    Następnie postanowiłem uruchomić moduł MAX7219:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Używa on protokołu SPI do komunikacji.
    Do komunikacji z nim używa się tych pinów (te po drugiej stronie nie są potrzebne):
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    - VCC (zasilanie, 5V)
    - GND (masa)
    - DIN (do podłączenia do SDO; wejścia danych z SPI)
    - CS (Chip Select; pozwala wybrać cel komunikacji SPI, dzięki czemu na jednej magistrali SPI możemy mieć wiele urządzeń)
    - CLK (zegar od SPI)
    Nie ma tu pinu 'data out' (SDI od PICa nie podłączamy), komunikacja jest jednostronna.
    W PIC16F1455 jest możliwość użycia SPI sprzętowego, chociaż można też zaimplementować go w pełni w software.
    Tym razem postanowiłem zrobić to sprzętowo, przy użyciu portu SPI oferowanego przez PIC16F1455:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Port ten obsługuje biblioteka SPI od MikroC, ale oczywiście samą komunikacje przez SPI z MAX7219 trzeba już było napisać samemu.
    https://download.mikroe.com/documents/compilers/mikroc/pic/help/spi_library.htm
    Podłączyłem wyświetlacz do odpowiednich pinów:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    I opracowałem odpowiednie funkcje do jego obsługi:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Użyłem też do tego materiałów z forum MikroC i przykładów dla macierzy LED na tym samym układzie scalonym.
    W tabelce zamieszczam skromną dokumentacje opracowanego kodu:
    Funkcja Argumenty Opis
    MAX7219_SPI_Init brak Inicjuje moduł MAX7219
    MAX7219_SPI_Clear brak czyści wyświetlacz MAX7219
    MAX7219_SPI_WriteChar pozycja, znak, czyKropka wyświetla dany znak na danej pozycji wyświetlacza, jeśli trzeci argument to fałsz to gasi kropkę, w przeciwnym razie ją zapala
    MAX7219_SPI_WriteString tekst wyświetla tekst na wyświetlaczu (ale dużo znaków nie jest wspieranych)
    MAX7219_SPI_WriteStringWithDots tekst wyświetla tekst na wyświetlaczu; w inteligentny sposób obsługuje kropki, gdyż na tym wyświetlaczu kropki należą do danej cyfry

    Rezultat działania kodu na zdjęciach:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Załącznik - PIC16F1455 SPI MAX7219 - (projekt MikroC, kod C, skompilowany wsad) do pobrania:
    p16f1455_s...intOsc.zip Download (40.5 kB)Points: 2 for user

    Krok 4 - Programowanie komunikacji USB
    Następnie postanowiłem uruchomić komunikację USB (dokładniej: HID).
    Pomysł był taki, że spróbuję odbierać przez HID ciąg znaków i wyświetlać go na MAX7219.
    Przy użyciu tego PICa komunikacja HID jest banalnie prosta. Nie wymaga zewnętrznych elementów a biblioteka pod nią jest gotowa w Mikro C.
    USB w PIC16F1455 znajduje się na tych pinach:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Do obsługi USB służy ta biblioteka:
    https://download.mikroe.com/documents/compilers/mikroc/pic/help/usb_hid_library.htm
    Na początek do kodu podpiąłem struktury deskryptora USB. Utworzone urządzenie będzie miało USB_VENDOR_ID (aka VID) 0x1234, tak jak widoczne na obrazku poniżej:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Dodatkowo do pola 'Product string descriptor' wpisałem nazwę USB HID Clock20, co też przyda się potem przy identyfikacji naszego urządzenia gdy mamy wiele innych rzeczy podłączonych na USB:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Uzupełniłem kod o niezbędną inicjalizację i komunikację HID.
    Do układu z PICem dodałem złącze micro USB:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Wtedy cały układ prezentował się już tak (wciąż miałem podłączonego MAX7219 z poprzedniego punktu):
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Wgrałem wsad i usłyszałem znajomy dźwięk podłączenia nowego urządzenia do Windowsa - czyli PIC został rozpoznany!
    Moje urządzenie o identyfikatorze 0x1234 pojawiło się w Menedżerze urządzeń:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Kod programu zmodyfikowałem tak, by wyświetlał na podłączonym wyświetlaczu to co zostanie odebrane przez USB/HID.
    Całość postanowiłem testować poprzez Terminal HID od MikroC. Działa on podobnie jak terminal UART - można przez niego wysłać dane, tyle że po HID.
    Włącza się go z poziomu Mikro C z zakładki Tools:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Od razu pojawiło się w nim moje urządzenie ("USB HID Clock20"):
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Ostatecznie, przetestowałem działanie nowego programu.
    Wysyłanie stringu "1 2 3 4 " przez HID Terminal:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Rezultat na MAX7219:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Wysyłanie stringu "1999.12.23" przez HID Terminal:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Rezultat na MAX7219:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    W ten sposób uruchomiłem komunikację poprzez USB i mogłem przejść do kolejnego etapu projektu.
    Załącznik - PIC16F1455 USB + MAX7219 - (projekt MikroC, kod C, skompilowany wsad) do pobrania:
    p16f1455_u...intOsc.zip Download (91.1 kB)Points: 2 for user

    Krok 5 - Obsługa czasu z RTCC DS1302
    Kolejnym krokiem było uruchomienie RTCC DS1302. W tym kroku bardzo pomocny był przykładowy kod komunikacji z tym RTCC dla Arduino:
    https://playground.arduino.cc/Main/DS1302/
    Swoje rozwiązanie oparłem o ten kod, a właściwie wręcz go skopiowałem i uruchomiłem u siebie za pomocą sprytnego użycia preprocesora C:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Funkcji do konwersji BCD użyłem stąd:
    https://download.mikroe.com/documents/compilers/mikroc/pic/help/conversions_library.htm
    Niestety część kodu dotyczącą struktury czasu musiałem przepisać, gdyż Mikro C chyba ze względu na padding w niechciany sposób odczytywał jej pola.
    Na początku testowałem wszystko na sztywno ustawiając bieżącą datę w kodzie na starcie programu, ale w następnym kroku opiszę na to lepsze rozwiązanie.

    Krok 6 - Ustawianie bieżącego czasu przez USB
    Ten punkt jest poniekąd powiązany mocno z poprzednim punktem. Po uruchomieniu RTCC dodałem możliwość ustawienia daty/godziny przez USB, analogicznie do tego jak wcześniej testowałem wysyłanie napisu do wyświetlania przez HID.
    Datę/godzinę do ustawienia przyjąłem w takim formacie:
    "SS MM HH dd mm yy"
    Są to kolejno:
    - SS - wartość sekund (dwie cyfry)
    - MM - wartość minut (dwie cyfry)
    - HH - wartość godzin (dwie cyfry)
    - dd - wartość dni (dwie cyfry)
    - mm - wartość miesięcy (dwie cyfry)
    - yy - wartość lat minus 2000 (dwie cyfry)
    Tego formatu napis wysyła się przez HID do zegara by ustawić bieżący czas, przykładowo wysyłanie "00 15 22 20 02 20" wygląda tak (ze spacjami!):
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Po odebraniu pakietu z HID zegar dekoduje go i zapisuje w RTCC jako bieżący czas. RTCC na bieżąco odlicza czas, nawet po odpięciu zasilania od zegara, bo ma bateryjkę. Program zegara ciągle pokazuje bieżący czas na wyświetlaczu.
    Rezultat wyświetlony przez zegar (zdjęcie robione chwilę później, stąd różnica w czasie):
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Zegar raz wyświetla datę, a raz godzinę.
    Na tym etapie część programistyczna tworzenia zegara była już w zasadzie skończona - dalszych zmian we wsadzie nie wprowadzałem.
    Załącznik: finalny firmware zegara (wiele można by tam poprawić, ale działa; kod, hex, projekt Mikro C):
    p16f1455_u...intOsc.zip Download (156.32 kB)Points: 2 for user

    Krok 7 - Lutowanie 'partyzanckie' na uniwersalnej wierconej płytce
    Teraz przyszła kolej na przeniesienie projektu z płytki stykowej na lutowaną uniwersalną. Postanowiłem, że będzie się ją łączyć z modułem RTCC z pomocą wtyku na goldpiny 2.54mm, a wyświetlacz będzie podłączany kabelkami. Przygotowałem potrzebne elementy:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Następnie rozpoczął się żmudny proces lutowania i kombinowania, nie będę go tutaj szczegółowo opisywać, ale i tak zamieszczę zdjęcia:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe

    Gotowa elektronika:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe

    Krok 8 - Projekt 3D obudowy i wydruk jej
    Obudowę do zegara zaprojektowałem od zera w programie Blender i wydrukowałem na drukarce 3D Creality Ender 3 PRO.
    Obudowę robiłem w ten sposób, że na przemian mierzyłem i drukowałem małe testowe fragmenty, taka metoda pozwala mi uniknąć sytuacji w której po kilkugodzinnym wydruku okazuje się że coś było źle zwymiarowane.
    Zacząłem od zwymiarowania wyświetlacza:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Raz poprawiałem wymiary, za drugim razem wyszło idealnie:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Następnie naniosłem cztery otwory na mocowanie wyświetlacza i poszerzyłem część obudowy, na razie jedynie od jej frontu:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Znów wydrukowałem całość do sprawdzenia i przymiarek:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Wykonałem kolejne poprawki na modelu:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    I po wydruku sprawdziłem mocowanie wyświetlacza oraz modułu RTCC za pomocą śrubek. Dobrze się je wkręca do filamentu PLA, jest on na tyle miękki, że da się je wkręcić i na tyle twardy, by je dobrze trzymać. Ale oczywiście z czasem gwint się wyrabia i już tak nie trzyma.
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Zegar uruchomiony w celu sprawdzenia czy nic się nie popsuło:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    W tym momencie dopiero miałem już cały koncept obudowy. Uznałem, że tył nie będzie ściągany, więc z dolnych śrubek od wyświetlacza trzeba będzie zrezygnować, ale mimo to wyświetlacz dalej się dobrze trzymał.
    Zrobiłem też z tyłu otwór na złącze USB:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Po raz ostatni zaimportowałem STLe do Cura:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    I wydrukowałem finalny element:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    I jeszcze pokrywa:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Wydruk pokrywy:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Do zamocowania pokrywy użyłem śrubek z jakiegoś zezłomowanego laptopa:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    I wreszcie moment przykręcania pokrywy i finalizacji projektu:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Wyszło nieźle, chociaż sam wydruk mógłby być lepszej jakości.
    Załącznik: źródła .blend (model 3D programu Blender) obudowy:
    clockPIC16....blend.zip Download (97.61 kB)Points: 3 for user
    Załącznik: pliki .STL (wyeksportowane do STL dwie części) obudowy:
    clockPIC16...0_stls.zip Download (33.81 kB)Points: 3 for user

    Gotowy zegar - zdjęcia
    Tutaj umieszczę zdjęcia już gotowego w pełni projektu.
    Zegar zasilany przez USB z komputera, jeszcze na roboczym stole:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    (Ciekawostka: w rogu powyższych zdjęć widać coś co też wkrótce będę wrzucać na forum, ale nie jest to związane z tym zegarem)
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Zegar z ładowarką od telefonu Xiaomi, która też oczywiście może go zasilać:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Zegar na boku (zdjęcie ukazuje dopasowanie wyświetlacza do obudowy):
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Zegar zasilany z power banka (oczywiście nie mojego):
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Próba pomiaru poboru prądu przez zegar:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Pobór prądu jest tak mały że USB Doctor nawet go nie wykrywa, pewnie mniej niż 0.01A, oczywiście to zależy też od tego ile segmentów LED się świeci.
    Zegar na szafce, w nocy:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe

    Dodatek - program do ustawiania bieżącej godziny
    W celu odłączenia się od "HID Terminal" z MikroC przygotowałem narzędzie które oferuje podobną funkcjonalność.
    Prezentuje się ono tak:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Po wysłaniu pakietu jest odpowiedni komunikat:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Program też oczywiście wykrywa, czy w ogóle nasze urządzenie (o VID 0x1234 i PID 0x0001, jak wspomiane wcześniej) jest podłączone:
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Za pomocą tego programu można łatwo ustawić bieżący czas w moim zegarku - po prostu naciska się najpierw przycisk ustawiający tekst daty, a potem przycisk wysyłający go przez HID.
    Załącznik do pobrania (wymaga NET Framework 2):
    MyHIDTermi...elease.zip Download (295.77 kB)Points: 1 for user

    Dodatek - schemat projektu
    W trakcie projektu tworzenia projektu nie posiadałem żadnego schematu a całość tworzyłem w oparciu o dokumentację PICa i modułów, ale pod koniec uznałem, że warto będzie takowy narysować, zwłaszcza dla zainteresowanych projektem czytelników z forum.
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Schemat chyba nie wymaga wyjaśnienia, chociaż można by tu dać jeszcze na zasilanie kondensator elektrolityczny o małej pojemności. I może jakieś rezystory pull-up/pull-down, ale u mnie działa bez nich.
    Ten sam schemat do pobrania w formacie .sch z Eagle:
    pic16f1455...s2.sch.zip Download (22.86 kB)Points: 2 for user

    Dodatek - załączniki
    Linki do niektórych załączników są też w tekście, ale dam je tutaj jeszcze raz w tabelce dla przejrzystości.
    Cały projekt jest open source/open hardware, jak zaprojektuję pod niego PCB to też je udostępnię.
    NazwaOpisZałącznik
    p16f1455_blink_intOsc Przykładowy kod migania diodą LED na PIC16F1455
    p16f1455_uart_intOsc Przykładowy kod wysyłania danych przez UART na PIC16F1455
    p16f1455_spi_max7219_intOsc Przykładowy kod obsługi MAX7219 przez SPI na PIC16F1455
    p16f1455_usb_and_spi_max7219_intOsc Przykładowy kod odbioru danych przez HID i wyświetlania ich na MAX7219 przez SPI na PIC16F1455
    p16f1455_usb_and_ds1302_spi_max7219_intOsc Finalny kod zegarka
    Schemat Eagle Schemat poglądowy zegara w formacie .sch programu Eagle
    clockPIC16F1455_20.blend Źródła modelu w formacie .blend programu Blender
    clockPIC16F1455_20_stl Modele obudowy (podstawa i pokrywa, dwa pliki) w formacie STL
    MyHIDTerminal Prosty terminal do wysyłania danych przez z HID z funkcjonalnościa automatycznego formatowania stringu daty/godziny dla zegara



    Dalszy rozwój projektu
    Projekt powstał "na raty" w przeciągu kilku dni więc siłą rzeczy jest dość skromny. Wiele można by ulepszyć. Przede wszystkim myślę o:
    - lepszy, bardziej 'zegarkowy' wyświetlacz - użyty wyświetlacz nie ma dwukropka i niektórym osobom może to przeszkadzać; przydałoby się znaleźć lepszy wyświetlacz z dwukropkami, ale w tej chwili takiego modułu nie znam. Może ktoś z czytelników poleci taki moduł wyświetlacza (ale mający te 8 cyfr, bo 4-cyfrowe widziałem)?
    - PCB pod ten konkretny projekt - przydałoby się zaprojektować PCB pod ten konkretny projekt, pasujące idealnie do obudowy, pewnie na wzór tego które ja przygotowałem
    - dodać pomiar temperatury itd. itp. - PIC ma jeszcze co najmniej jeden pin wolny, do tego można pewnie wykorzystać lepiej kilka pinów sprytnie używając Chip Select od SPI. Można by dodać np. pomiar temperatury i wilgotności na czujniku DHT11/DHT22 lub podobnym
    - wyprowadzić złącze ICSP - dla wygodniejszego programowania; można by te 5 pinów potrzebnych do programowania dać na obudowę
    - wprowadzić system aktualizacji programu przez bootloader USB - zamiast wyprowadzania złącza ICSP można by użyć bootloadera, ale w tej chwili nawet nie wiem czy byłoby to dużo pracy dla PIC16F1455 bo jeszcze się tym nie zajmowałem
    - sprawdzić/dodać obsługę ustawiania daty przez USB z poziomu telefonu z systemem Android - na ten moment można to zrobić tylko z komputera, nie wiem jak wygląda kwestia z Androidem, ale ustawienie daty to zasadniczo tylko wysłanie jednego pakietu HID
    - ulepszyć model obudowy - schować śrubki albo dać je na spód, wydrukować w lepszej jakości
    - wykonać inną obudowę, nie z drukarki 3D - przykładowo drewnianą, ale nie wiem czy jest to teraz w zasięgu moich możliwości
    - przejrzeć i przepisać kod - bieżący kod działa raczej bez błędów, ale można by go zrobić bardziej elegancko

    Podsumowanie
    Z projektu mojego zegara/kalendarza jestem zadowolony. Całość powstała spontanicznie w przeciągu paru dni na skutek kilku godzin wolnego czasu. Głównym mankamentem jest tutaj brak dwukropka na wyświetlaczu, ale mi on wcale nie przeszkadza. Wkrótce być może wykonam drugą wersję tego zegara, już z dedykowanym PCB zaprojektowanym w Eagle i jakąś dodatkową funkcjonalnością, chociażby czujnikiem DHT11.

    Cool? Ranking DIY
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
    About Author
    p.kaczmarek2
    Moderator Smart Home
    Offline 
  • Computer Controls
  • #2
    khoam
    Level 41  
    Czemu wyprowadziłeś na zewnątrz segment LED? Nie lepiej by wyglądało, gdyby "kończyły" się one równo z obudową? Dodatkowo można byłoby wtedy założyć filtr czerwony na ledy.

    Dodano po 9 [minuty]:

    p.kaczmarek2 wrote:
    Może ktoś z czytelników poleci taki moduł wyświetlacza (ale mający te 8 cyfr, bo 4-cyfrowe widziałem)?

    Na ali są 6-cyfrowe z dwukropkami:

    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
  • Computer Controls
  • #3
    p.kaczmarek2
    Moderator Smart Home
    khoam wrote:
    Czemu wyprowadziłeś na zewnątrz segment LED? Nie lepiej by wyglądało, gdyby "kończyły" się one równo z obudową? Dodatkowo można byłoby wtedy założyć filtr czerwony na ledy.

    To jest dobra sugestia. Przyznam szczerze, że nawet o tym nie pomyślałem.
    Tyle, że i tak bym tego nie zrealizował, bo projekt robiłem w kilka dni bez wcześniejszego planowania a takiego filtru nie posiadam.
    Jednakże modyfikacja pod to co zasugerowałeś jest banalna - wystarczy przesunąć o parę mm do przodu odpowiednie powierzchnie modelu.

    khoam wrote:

    Na ali są 6-cyfrowe z dwukropkami:

    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe

    Hm, co prawda nie są to gotowe moduły tylko same wyświetlacze, ale to raczej nie problem. Godzina w postaci 21:50:30 na pewno wyglądałaby lepiej niż to co jest teraz, tylko pytanie co z datą? Czy pod kątem estetyki byłaby to zmiana na lepsze?
  • #4
    khoam
    Level 41  
    p.kaczmarek2 wrote:
    a takiego filtru nie posiadam

    Wycinałem takie filtry z okładek na zeszyty szkolne :) Sprawdziły się.

    p.kaczmarek2 wrote:
    Hm, co prawda nie są to gotowe moduły tylko same wyświetlacze, ale to raczej nie problem.

    To jeśli to nie problem, to możesz sam poskładać taki wyświetlacz np. z dwóch "czwórek" wyświetlaczy ;)
  • #5
    zgierzman
    Level 30  
    Moduł wyświetlacza, fabrycznie krzywo polutowany, rzeczywiście można byłoby cofnąć o parę milimetrów i schować za jakąś dymioną plexi.
    Np. taką:

    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe
    Zegar/kalendarz na PIC16F1455, MAX7219, DS1302 - szczegółowy opis/kody/STLe

    Koszt niewielki - jeśli masz gdzieś w okolicy firmę zajmującą się reklamami, to może mają coś takiego w odpadkach, a jeśli nie, to po wpisaniu na znanym portalu "plexi ciemna" znajdziesz ofertę za 15 zł na kawałek wystarczający na kilka(naście) takich zegarów. 44 cm x 15 cm...
    Za to estetyka wskoczyłaby na wyższy poziom. Szczególnie, jeśli darowałbyś sobie wycinanie plexi pod wymiar okienka, tylko zrobił z niej cały front.

    Mam dwa "stojące" zegary i żaden z nich nie pokazuje daty. Do tej pory ani razu nie pomyślałem, że mogłaby to być użyteczna funkcja.
    Data w takim zegarze przydaje się tylko do automatycznej zmiany czasu letni/zimowy, ale mnie denerwowałby taka dyskoteka z automatycznym przełączaniem wskazania. Zamiast na pół sekundy rzucić okiem na zegar, czasem musiałbym czekać aż zniknie data i pojawi się godzina. Na uparciucha, to po naciśnięciu przycisku data mogłaby się pokazywać. No ale co kto lubi...
    Dodatkowo format bez spacji, tylko z kropkami jest dla mnie mało czytelny. 20200223 licho wygląda moim zdaniem.

    Na nadgarstku mam zegarek który wyświetla dzień i miesiąc (bez migania, osobno, niezależnie od wyświetlania czasu) i to się czasem przydaje - np. na poczcie czy w innym urzędzie, gdzie trzeba wpisać datę. Rok i miesiąc zawsze się pamięta, ale dzień już niekoniecznie. I to jest chyba jedyny przypadek, że wyświetlanie daty w zegarku ma sens.
  • #6
    yogi009
    Level 43  
    Bardzo dobrze udokumentowany DIY, wielkie brawa. Każdy ma swoje patenty, ja pewnie bym chciał zaraz projektować własne PCB, ale na tej dziurawej amerykańskiej płytce to ma jeszcze ciekawszy posmak domowego projektu.
  • #9
    zgierzman
    Level 30  
    artbi881 wrote:
    Gdyby miał DCF byłoby bardziej współcześnie. Tak to: odkrywanie czegoś od nowa.


    Współcześnie? Raczysz żartować, DCF 77 włączyli ponad 60 lat temu, to technologia starożytna, starsza niż większość użytkowników tego forum. Tylko czekać, kiedy wyłączą ten nadajnik... Do tego działa różnie - ja mieszkam w bloku, i zegar z DCF 77 w oknie skierowanym NNW jeszcze coś tam odbiera, ale w reszcie chaty nie ma szans.

    Współcześnie stosuje się klieny NTP po WiFi albo LTE. Albo właśnie RTC z kwarcem na tyle dokładnym, żeby nie trzeba było poprawiać wskazań zegara częściej niż raz do roku.
  • #10
    p.kaczmarek2
    Moderator Smart Home
    Chciałem coś bez WiFi, ale ogólnie to już przyznam, że jest w budowie też (ale nie na mojej PCB - tylko na PCB od czytelnika, z jakiegoś bloga) również prosty zegarek na ESP8266, właśnie z klientem NTP z internetu po WiFi. To będzie taki projekt o wiele prostszy, złożony z gotowych elementów. Też wkrótce go umieszczę na forum i będzie to również w formie szczegółowego opisu krok po kroku.