![zegar]()
Cześć i czołem
koleżanki i
koledzy elektronicy!
W artykule postaram się przybliżyć swój pierwszy projekt –
Zegarek. Zdaję sobie sprawę, że nie brzmi to nazbyt imponująco. Niemniej, chyba większość adeptów trudnej sztuki elektroniki zaczyna swoją przygodę właśnie od zegarka. Jest to z jednej strony bardzo prosty układ, jednak z drugiej strony może przysporzyć wiele zgryzot i wątpliwości. Zatem, wierzę, że artykuł przyda się początkującym.
Zapraszam do lektury!
1. Opis układu
Mózgiem, no a przynajmniej sercem układu jest procesor
ATMEGA328-PU (taki sam jak w Arduino UNO). Czas pokazuję na czterech multipleksowanych 7 segmentowych wyświetlaczach. Dane do wyświetlaczy przesyłam przez ekspander
PCF8574. Natomiast czas odmierzam w zegarze czasu rzeczywistego
DS1037 z podtrzymywaniem bateryjnym, dzięki czemu nawet po wyłączeniu układu, czas jest nadal mierzony. Użytkownik za pomocą trzech przycisków: setup; up; down ustawia czas. Zasilanie całego układu zrealizowałem przez cztery baterie AA (1.5v każda) oraz stabilizator liniowy
7805.
Lista potrzebnych elementów:
Zegar:
- 1x DS1307
- 1x koszyk na baterię 3V do DS1307
- 1x kwarc 32.768KHz
- 1x bateria CR2032 3V
W ofercie sklepu
http://nettigo.pl można nabyć te 3 elementy na jednej eleganckiej płytce -
Moduł RTC - DS1307.
Scalaki:
Rezystory, kondensatory- 2x kondensator ceramiczny 22pF
- 2x kondensator elektrolityczny 100uF
- 4x rezystor 10k om
- 2x rezystor 4,7k om
- 1x rezystor 220 om
Można nabyć zestaw:
Zestaw rezystorów i kondensatorów I reszta:2. DS1307
Ten niepozorny scalak, to bardzo popularny zegar czasu rzeczywistego, który komunikuję się ze światem zewnętrznym via
I2Cprzy użyciu pinów
SDA oraz
SCL.
![DS1307]()
![DS1307 schemat]()
- X1, X2 – kwarc 32.768 KHz,
- VBAT– podtrzymywanie bateryjne (min 2.0 – max 3.5V),
- GND – masa,
- VCC– zasilanie (min 4.5 – max 5.5V),
- SQW/OUT – wyjście sygnału prostokątnego, jeśli nie używany, to może wisieć w powietrzu,
- SCL – sygnał zegara magistrali I2C,
- SDA – sygnał danych magistrali I2C.
Zatem, pod nóżki
X1 i
X2 podłączamy kwarc
32.768KHz, jeszcze tylko z płytki Arduino bierzemy napięcie
VCC,
GND, sygnał
SDA oraz
SCL i możemy cieszyć się naszym cackiem.
Można również podpiąć baterie(min 2.0 – max 3.5V) na nóżkę
VBATi nasz
DS1307 będzie pilnować upływ czasu nawet po odłączeniu zasilania
VCC. Jak tylko ustawimy datę oraz czas, to od tego momentu z uporem lepszej sprawy bez wytchnienia układ będzie odmierzać milisekundę za milisekundą. Bez ustanku… A w zasadzie do wyczerpania baterii ;-)
Tak wygląda układ na płytce prototypowej z wykorzystaniem Arduino.
![DS1307 arduino]()
Dla porządku dodamy do sygnałów SCL oraz SDL rezystory pull-up o wartości 4,7KΩ, dzięki czemu na magistrali będziemy mieli stan wysoki gdy żadne urządzenie nie będzie nadawać.
Po tym jak tylko uda nam się cało i szczęśliwie złożyć prototyp, pozostaje jeszcze dopisanie kodu. Zatem, zakasujemy rękawy i ściągamy bibliotekę
RTClib, która dostarcza funkcjonalność układu
DS1307 opakowanego w zgrabny interfejs. Po ściągnięciu biblioteki dodajemy ją do katalogu -
My Documents\Arduino\libraries\
Przykład użycia biblioteki:
[crayon-517755289afed/]
Jak widzimy korzystanie z
DS1307 jest banalnie proste, w funkcji
setup() odpalamy komunikację, a w
loop() cyklicznie odczytujemy czas za pomocą metody
now(), która zwraca ładnie opakowaną datę oraz godzinę w strukturze
DateTime.
3. PCF8574
Szerzej znany jako ekspander, główną jego funkcją jest dodanie
8 wyjść/wejść cyfrowych. Komunikuję się tak jak poprzednio opisywany
DS1307, czyli przez magistralę
I2C.
![ekspander schemat]()
- A0, A1, A2 – adres układu,
- P0,..,P7 – 8 cyfrowych pinów input/output (I/O) – dlatego nazywa się ekspanderem ;-)
- VCC– zasilanie (min 2.5 – max 6V),
- GND – masa,
- SCL – sygnał zegara magistrali I2C,
- SDA – sygnał danych magistrali I2C,
- /INT – zanegowany sygnał przerwania.
Można jednocześnie używać wielu ekspanderów dlatego został stworzony mechanizm, który pozawala je między sobą jednoznacznie rozróżniać. Do tego celu służy adres - w układach
PCF8574 adres ma 7 bitów długości, pierwsze 3 bity
A0,
A1 oraz
A2 nadaje użytkownik a pozostałe 4 są nadawane fabrycznie na stałe. W zależności czy korzystamy z układu
PCF8574 czy z
PCF8574A fabrycznie nastawione są inne adresy, i tak:
PCF8574:
Czyli szesnastkowo (hex) zakres adresu to:
0x20–
0x27PCF8574A:
Czyli szesnastkowo (hex) zakres adresu to:
0x38–
0x3F
Podłączanie do arduino:
![ekspander]()
Cyfrowymi pinami ekspandera
P0-P7 możemy posługiwać się dokładnie tak samo jak cyfrowymi pinami Arduino. My będziemy je używali do ustawiania stanu wyświetlaczy – ale o tym za chwilę.
A jeśli chcielibyśmy nadać inny adres ekspanderowi to możemy dowolnie konfigurować połączenia pinów adresowych z masą
GND bądź zasilaniem
VCC– uzyskując tym samym 8 kombinacji dla
PCF8574 oraz 8 kombinacji dla
PCF8574A, dzięki czemu możemy użyć na raz 16 ekspanderów co da nam bagatela dodatkowych
128 (16*8) pinów cyfrowych!
Obsługa programowa ekspandera jest równie prosta jak układu
DS1307. Wystarczy ściągnąć bibliotekę o zdumiewającej nazwie
PCF8574, dodać do katalogu z bibliotekami i od tej pory za pomocą kilku linijek kodu z łatwością możemy używać
PCF8574 do odczytywania, bądź zapisywania danych na cyfrowe piny.
[crayon-517755289b06a/]
Jak widzimy na początku należy ustawić adres ekspandera u nas
0x20, a potem skonfigurować piny wedle wykorzystania na
INPUT bądź
OUTPUT, a potem czytamy metodą
digitalRead a ustawiamy stan metodą
digitalWrite. Twórca biblioteki dodał kilka dodatkowych metod takich jak:
- Clear– ustawia wszystkie piny na stan LOW,
- Set– ustawia wszystkie piny na stan HIGH,
- Write– ustawia cały bajt na 8 pinach.
Bardziej dociekliwych uprzejmie odsyłam do dokumentacji biblioteki ;-)
4. Wyświetlacz
Do pokazywania godziny będziemy używać czterech wyświetlaczy 7 segmentowych. Te cuda wyglądają tak:
![7 seg display]()
![7 seg display schemat]()
Jak widzimy, wyświetlacz siedmio-segmentowy posiada siedem segmentów (o rety!), ale żeby utrudnić sprawę w podstawce jest 10 nóżek. Ha! Po krótkiej (bądź długiej, zależy kto ma jaką lotność) chwili dostrzegamy, że są dwa typy wyświetlaczy – ze wspólną
katodą, gdzie na te dwie dodatkowe nóżki podłączam
GND, oraz ze wspólną
anodą, gdzie podłączamy
VCC. No ale 7 segmentów + 2 GND/V
CC to daje nam 9 pinów, a jest przecież 10. Ta ostatnia to tzw. dp – czyli kropka ;-)
Uzbrojeni w tę wiedzę możemy śmiało przystąpić do wyświetlania czego nasza dusza zapragnie – czyli liczb od
0 do
9 :D
Warto jeszcze zwrócić uwagę, na to, że wyświetlaczem ze wspólną katodą sterujemy za pomocą stanu wysokiego, tzn. że jeśli chcemy zapalić którąś belkę to musimy wysłać na jej pin stan wysoki (
HIGH), a z kolei wyświetlaczem ze wspólną anodą sterujemy stanem niskim (
LOW).
Teraz dla pogłębienia wiedzy podłączymy sobie pod nasz ekspander jeden wyświetlacz ze wspólną anodą:
![pcf8574, 7 seg display]()
Gwoli jasności mamy połączony ekspander z wyświetlaczem w następujący sposób:
P0 – e P2 – c P4 - b P6 – f
P1 – d P3 – dp P5 – a P7 – g
A teraz będziemy wyświetlać po kolei cyfry od 0 do 9. Super, nie? ;-)
[crayon-517755289b0e4/]
Wszystko pięknie, ładnie ale my przecież chcemy koniec, końców wyświetlać czas, przecież nie damy rady tego zrobić na jednym wyświetlaczu... Załóżmy, że chcemy pokazywać godzinę oraz minuty, zatem potrzebujemy 4 wyświetlaczy. Ale czy to oznacza, że potrzebujemy 4 ekspanderów? Trochę dużo tego wszystkiego wyjdzie. Może istnieje jakieś lepsze (tzn. mądrzejsze) rozwiązanie. Hehe gdyby nie istniało to bym Was drodzy Czytelnicy nie zanudzał tymi rozważaniami ;-)
Otóż, należy zastosować
multipleksowanie– czyli jak podpowiada
wikipedia, zastosować dwa lub większą liczbę kanałów komunikacyjnych w jednym medium transmisyjnym. Mądrze brzmi, ale części z Was szanownych czytelników niczym młodziutkiej
Cerro do króla
Vridanka na ich pierwszej schadzce ciśnie się na usta pytanie: "Niebrzydka rzecz, ale czy ma jakieś zastosowanie praktyczne?".
Otóż, o dziwo ma! Dobrze przedstawia to następujący obrazek:
![]()
Sterujemy wyświetlaczami za pomocą tranzystorów
PNP - BC327, które podpinamy przez rezystory do procesora. Ustawienie sygnału LOW na bazie tranzystora powoduje przepływ prądu - dzięki czemu włączymy dany wyświetlacz. Jeśli będziemy dostatecznie szybko się przełączać to ludzkie oko nie zarejestruje migania.
Nasz prototyp wygląda tak:
BTW proszę nie zapominać o rezystorach pull-up na magistrali I2C– nie będę ich już dodawał do schematu bo i tak jest już dostatecznie nieczytelny…
A teraz, żeby sprawdzić czy układ dobrze hula, napiszmy kod, który będzie wyświetlał liczby od
0 do
9999. A co! Jak szaleć to szaleć ;-)
[crayon-517755289b161/]
5. Zegar = DS1307 + PCF8574 + 4x 7 seg LCD
Dochodzimy do wiekopomnego momentu, gdzie użyjemy naszego
DS1307 opisanego na samym początku artykułu do odczytywania czasu. Co w sumie sprowadzi się do dodania na płytkę prototypową
DS1307 i połączenia go z magistralą
I2C.
![zegar multi arduino]()
Teraz będziemy sobie wyświetlać czas odczytany z zegarka
DS1307.
[crayon-517755289b1cc/]
Jak widać używanie układów współpracujących z magistralą
I2C zasadniczo ułatwia i programowanie i składanie układu.
7. Przyciski
Fajnie jakby można było ustawić sobie dowolny czas - prawda? No, to dodajmy trzy takie oto maleństwa.
![button]()
![]()
Pierwszy przycisk będzie odpowiedzialny za wejście w tryb ustawiania (
setup) i załóżmy, że trzeba będzie chwilę przytrzymać wciśnięty przycisk aby ten tryb ustawiania się włączył. Tym przyciskiem będziemy również akceptować ustawienia. Drugim przyciskiem (
up) będziemy mogli zwiększać wartość. A trzecim przyciskiem (
down) będziemy zmniejszali wartość.
Warto zapoznać się z tzw. "bounce" przycisków.
A i bym zapomniał, po wejściu w tryb
setup zmieniania wartość będzie mrugać - tak żeby było weselej ;-)
Na początek schemat:
![button multi 7 seg display_bb]()
By nam przyjemnie się programowało przyciski, to użyjemy biblioteki
OneButton, która między innymi rozwiązuje problem wcześniej wspomnianego "bounce'u". W sumie nie ma co się rozpisywać nad kodem, zatem jakby ktoś miał pytanie/wątpliwość proszę pytać w komentarzach ;-)
Kodu jest dużo, więc postanowiłem go zwinąć.
[crayon-517755289b244/]
7. ATMEGA328P standalone
Przeniesiemy teraz nasz procesor
ATMEGA328 na płytkę prototypową.
![atmega328p]()
![atmega328-arduino-pinout]()
Jeśli chcemy użyć nowego procesora, będziemy musieli wgrać do niego
bootloader arduino. Tutaj jest ładny na ten temat
tutorial:
http://arduino.cc/en/Tutorial/ArduinoToBreadboard. A jeśli ktoś nie ma czasu bądź ochoty się z tym samemu męczyć, to można nabyć w sklepie
nettigo.pl od razu procesor z
bootloaderemhttp://nettigo.pl/products/175
Po wgraniu
bootloadera możemy zająć się wgrywaniem kodu. Płytka tak powinna wyglądać:
![zagar + display + atmega_bb_2]()
Grubo, prawda? ;D Zostaje jeszcze do odcięcia zasilanie i możemy odłożyć arduino na półkę.
8. Stabilizator 7805
Zawsze kiedyś przychodzi moment, gdy coś się kończy i coś się zaczyna.
Odcinamy ostatnie przewody łączące nas z Arduino i od tej pory nasz układ będzie wieść życie wolne i niezależne! Oh! Aż mi się łza zakręciła z wzruszenia...
![7805]()
Nie jestem specjalistą stabilizatorów i prawdopodobnie zrobiłem jakiegoś babola, u mnie to w sumie działa ale nie jestem przekonany czy 6V to jest dobre wejście na zasilanie...
W każdym razie, na nogę
input dajemy zasilanie z zakresu +5V (możliwe, że powinno być powyżej 7.5V) a z nogi
output ciągniemy stabilizowane 5V, warto jeszcze dodać na wejściu i wyjściu po kondensatorze elektrolitycznym, aby zlikwidować tętnienia.
No i już prawie na sam koniec pokażę całość:
![all_bb]()
Przy podłączaniu kondensatorów elektrolitycznych należy zwrócić szczególną uwagę, aby podłączyć + do +, i - do -. Dłuższa noga kondensatora to +, a z boku na obudowie widać pasek z minusami.
9. PCB
Jako, że cały ten projekt potraktowałem edukacyjnie, to również z tego samego powodu stworzyłem projekt w
eaglu, razem z płytką
PCB, którą wytrawiłem i nawet zdaje się, że działa ;-)
![Projekt_Zegar_v5]()
![PCB_Zegar_v5]()
A tak wygląda płytka:
![IMG_8978]()
![IMG_8988]()
Zamieszczam też link do:
Między kodem z artykułu a z linka są drobne różnice.
10. Koniec
Jeśli ktoś dotarł do tego miejsca, to mam dla niego jedną radę: zajmij się kolego czymś pożyteczniejszym niż czytaniem pierdół po internecie...
A tak na poważnie, to dzięki za wytrwałość. Czekam na pytania, sugestie oraz komentarze.
Pozdrawiam,
--
malebranchi PS: Serdeczne podziękowania
Kasi, za poprawki edytorskie :*
Czytaj dalej...