Androidowy zegar Nixie - Serwis.AVT.pl · U4 78L05_SO 8 Gn 1 BN C C1 1 10 0nF C9 47 uF C8 47uF DK2...

10
32 ELEKTRONIKA PRAKTYCZNA 5/2017 DODATKOWE MATERIAŁY NA FTP: ftp://ep.com.pl user: 44747 , pass: 3qwdwa8u W ofercie AVT* AVT-5582 Podstawowe informacje: Androidowy zegar Nixie ma następujące parametry: y Wyświetlacz Nixie o wielkości cyfr 15,5 mm. y Odchyłka autonomicznego pomiaru czasu max ±1 min/rok. y Automatyczna zmiana czasu lato/zima. y Wygodne sterowanie za pomocą inter- fejsu Bluetooth i aplikacji dla systemu Android dostępnej w sklepie Play. y Podstawowa obsługa pozbawiona przycisków mechanicznych za pomocą zbliżeniowego czujnika laserowego. y Funkcja alarmu w trybie tygodniowym. y Automatyczne sterowanie poziomem jasności w zależności od natężenia oświe- tlenia, z możliwością ustawienia stałego poziomu podświetlania z aplikacji. y Efekt płynnego przejścia pomiędzy cyframi. y Możliwość zaprogramowania przedziału godzin, kiedy zegar ma być wyłączony np. w nocy, aby nie przeszkadzać oraz prze- dłużać żywotność lamp. y Algorytm automatycznego odtruwania katod, przedłużający żywotność lamp. y Przyjemny dla ucha sygnał alarmu. y Zasilanie z zasilacza wtyczkowego 12 V, pobór mocy ok. 2 W (przy 50% jasności). Projekty pokrewne na FTP: (wymienione artykuły są w całości dostępne na FTP) AVT-3141 Zegar Nixie z sekundami (EdW 6/2016) AVT-3097 Zegar Nixie (EdW 7/2014) AVT-5145 Zegar retro na lampach Nixie (EP 9/2008) * Uwaga! Elektroniczne zestawy do samodzielnego montażu. Wymagana umiejętność lutowania! Podstawową wersją zestawu jest wersja [B] nazywana potocznie KITem (z ang. zestaw). Zestaw w wersji [B] zawiera elementy elektroniczne (w tym [UK] – je- śli występuje w projekcie), które należy samodzielnie wlutować w dołączoną płytkę drukowaną (PCB). Wykaz elementów znajduje się w dokumentacji, która jest podlinkowana w opisie kitu. Mając na uwadze różne potrzeby naszych klientów, oferujemy dodatkowe wersje: wersja [C] zmontowany, uruchomiony i przetestowany zestaw [B] (elementy wlutowane w płytkę PCB) wersja [A] płytka drukowana bez elementów i dokumentacja Kity w których występuje układ scalony wymagający zaprogramowania, posiadają następujące dodatkowe wersje: wersja [A+] płytka drukowana [A] + zaprogramowany układ [UK] i dokumentacja wersja [UK] zaprogramowany układ Nie każdy zestaw AVT występuje we wszystkich wersjach! Każda wersja ma załączony ten sam plik pdf! Podczas składania zamówienia upewnij się, którą wersję zamawiasz! http://sklep.avt.pl Androidowy zegar Nixie (1) Na łamach czasopism elektronicznych oraz stronach internetowych opu- blikowano wiele projektów zegarków z lampami Nixie, w najróżniejszych konfiguracjach i opcjach. Były zarówno projekty oparte na popularnych mikrokontrolerach, były zegarki zbudowane na układach serii 74HC, a na- wet zrealizowane na układach programowalnych. Jednak ten zegarek jest inny, ponieważ zastosowano w nim najnowsze zdobycze techniki, takie jak sensor laserowy lub sterowanie za pomocą smartfona. Rekomendacje: zegarek może być ozdobą niejednego wnętrza, a ze wzglę- du na swoją funkcjonalność może stać się nietuzinkowym prezentem. Średnia trwałość lamp LC-513 jest określona na około 100 tys. godzin. Dodatkowe funk- cje, takie jak: automatyczne dostosowanie poziomu jasności do warunków oświetlenio- wych, możliwość zaprogramowania prze- działu godzin w cyklu dobowym (wtedy wyświetlacz może być wyłączony) i funk- cja odtruwania katod, pozytywnie wpływają na trwałość wyświetlacza. Budowa urządzenia Zegar zbudowano w oparciu o dwie płytki drukowane: płytę główną zawierającą mikro- kontroler oraz większość innych układów ( ry- sunek 1) oraz płytę wyświetlacza z układem sterującym ( rysunek 2). Całością steruje mi- krokontroler STM32F103R8T6 (U5) w obu- dowie TQFP64, zawierający 64 kB pamięci Flash oraz 20 kB pamięci RAM. Wybór tego układu był podyktowany jego niską ceną oraz wewnętrznym zegarem RTC, który jest 32-bi- towym licznikiem zwiększającym zawartość co 1 sekundę. Dzięki takiemu rozwiązaniu układ RTC pozwala odmierzać czas syste- mowy bezpośrednio w formacie UTS (Unix Time Stamp). Niestety, późniejsze wersje ukła- dów rodziny STM32 mają typowy zegar RTC zliczający w BCD, co zdaniem autora jest kro- kiem wstecz. Rdzeń mikrokontrolera jest takto- wany wewnętrznym generatorem RC (8 MHz), natomiast licznik RTC jest taktowany za po- mocą dodatkowego sygnału o częstotliwości Na tle innych, podobnych urządzeń, opisy- wany zegarek wyróżnia się brakiem przyci- sków mechanicznych, ponieważ sterowanie odbywa się za pomocą aplikacji dla systemu Android oraz laserowego czujnika zbliże- niowego. Wykorzystanie smartfona z du- żym czytelnym wyświetlaczem jest o wiele wygodniejsze niż obsługa za pomocą przy- cisków mechanicznych oraz ładnego, acz- kolwiek mało funkcjonalnego, wyświetlacza Nixie. Dodatkowo zyskujemy źródło czasu pochodzącego z sieci GSM, który będzie służył do synchronizacji zegara. Czujnik laserowy stanowi uzupełnienie interfejsu i umożliwia szybki dostęp do funkcji, ta- kich jak wyświetlanie daty, godziny alarmu oraz zapewnia szybkie wyłączenie budzika. Rezygnacja z fizycznych przycisków daje możliwość wykonania estetycznej obu- dowy z pleksi lub szkła, pozbawionej otwo- rów w widocznych miejscach. Zastosowanie skompensowanego generatora sygnału zega- rowego 32 kHz umożliwia uzyskanie dobrej dokładności zegara, nawet przy niezbyt czę- stej synchronizacji z telefonem. W urządzeniu zastosowano najpopular- niejsze i najłatwiej dostępne w kraju lampy LC-513 produkcji zakładów Unitra Dolam o wielkości cyfr 15,5 mm. Lampy i podstawki są stosunkowo łatwo dostępne na aukcjach internetowych, więc każdy zainteresowany może wykonać zegar we własnym zakresie. PROJEKTY

Transcript of Androidowy zegar Nixie - Serwis.AVT.pl · U4 78L05_SO 8 Gn 1 BN C C1 1 10 0nF C9 47 uF C8 47uF DK2...

32 ELEKTRONIKA PRAKTYCZNA 5/2017

DODATKOWE MATERIAŁY NA FTP:ftp://ep.com.pluser: 44747, pass: 3qwdwa8uW ofercie AVT* AVT-5582Podstawowe informacje:Androidowy zegar Nixie ma następujące parametry: yWyświetlacz Nixie o wielkości cyfr 15,5 mm. yOdchyłka autonomicznego pomiaru czasu max ±1 min/rok. yAutomatyczna zmiana czasu lato/zima. yWygodne sterowanie za pomocą inter-fejsu Bluetooth i aplikacji dla systemu Android dostępnej w sklepie Play. yPodstawowa obsługa pozbawiona przycisków mechanicznych za pomocą zbliżeniowego czujnika laserowego. y Funkcja alarmu w trybie tygodniowym. yAutomatyczne sterowanie poziomem jasności w zależności od natężenia oświe-tlenia, z możliwością ustawienia stałego poziomu podświetlania z aplikacji. y Efekt płynnego przejścia pomiędzy cyframi. yMożliwość zaprogramowania przedziału godzin, kiedy zegar ma być wyłączony np. w nocy, aby nie przeszkadzać oraz prze-dłużać żywotność lamp. yAlgorytm automatycznego odtruwania katod, przedłużający żywotność lamp. yPrzyjemny dla ucha sygnał alarmu. y Zasilanie z zasilacza wtyczkowego 12 V, pobór mocy ok. 2 W (przy 50% jasności).

Projekty pokrewne na FTP:(wymienione artykuły są w całości dostępne na FTP)

AVT-3141 Zegar Nixie z sekundami (EdW 6/2016)AVT-3097 Zegar Nixie (EdW 7/2014)AVT-5145 Zegar retro na lampach Nixie (EP 9/2008)* Uwaga! Elektroniczne zestawy do samodzielnego montażu. Wymagana umiejętność lutowania!Podstawową wersją zestawu jest wersja [B] nazywana potocznie KITem (z ang. zestaw). Zestaw w wersji [B] zawiera elementy elektroniczne (w tym [UK] – je-śli występuje w projekcie), które należy samodzielnie wlutować w dołączoną płytkę drukowaną (PCB). Wykaz elementów znajduje się w dokumentacji, która jest podlinkowana w opisie kitu.Mając na uwadze różne potrzeby naszych klientów, oferujemy dodatkowe wersje: wersja [C] zmontowany, uruchomiony i przetestowany zestaw [B] (elementy

wlutowane w płytkę PCB) wersja [A] płytka drukowana bez elementów i dokumentacjaKity w których występuje układ scalony wymagający zaprogramowania, posiadają następujące dodatkowe wersje: wersja [A+] płytka drukowana [A] + zaprogramowany układ [UK]

i dokumentacja wersja [UK] zaprogramowany układNie każdy zestaw AVT występuje we wszystkich wersjach! Każda wersja ma załączony ten sam plik pdf! Podczas składania zamówienia upewnij się, którą wersję zamawiasz! http://sklep.avt.pl

Androidowy zegar Nixie (1)Na łamach czasopism elektronicznych oraz stronach internetowych opu-blikowano wiele projektów zegarków z lampami Nixie, w najróżniejszych konfiguracjach i opcjach. Były zarówno projekty oparte na popularnych mikrokontrolerach, były zegarki zbudowane na układach serii 74HC, a na-wet zrealizowane na układach programowalnych. Jednak ten zegarek jest inny, ponieważ zastosowano w nim najnowsze zdobycze techniki, takie jak sensor laserowy lub sterowanie za pomocą smartfona.

Rekomendacje: zegarek może być ozdobą niejednego wnętrza, a ze wzglę-du na swoją funkcjonalność może stać się nietuzinkowym prezentem.

Średnia trwałość lamp LC-513 jest określona na około 100 tys. godzin. Dodatkowe funk-cje, takie jak: automatyczne dostosowanie poziomu jasności do warunków oświetlenio-wych, możliwość zaprogramowania prze-działu godzin w cyklu dobowym (wtedy wyświetlacz może być wyłączony) i funk-cja odtruwania katod, pozytywnie wpływają na trwałość wyświetlacza.

Budowa urządzeniaZegar zbudowano w oparciu o dwie płytki drukowane: płytę główną zawierającą mikro-kontroler oraz większość innych układów (ry-sunek 1) oraz płytę wyświetlacza z układem sterującym (rysunek 2). Całością steruje mi-krokontroler STM32F103R8T6 (U5) w obu-dowie TQFP64, zawierający 64 kB pamięci Flash oraz 20 kB pamięci RAM. Wybór tego układu był podyktowany jego niską ceną oraz wewnętrznym zegarem RTC, który jest 32-bi-towym licznikiem zwiększającym zawartość co 1 sekundę. Dzięki takiemu rozwiązaniu układ RTC pozwala odmierzać czas syste-mowy bezpośrednio w formacie UTS (Unix Time Stamp). Niestety, późniejsze wersje ukła-dów rodziny STM32 mają typowy zegar RTC zliczający w BCD, co zdaniem autora jest kro-kiem wstecz. Rdzeń mikrokontrolera jest takto-wany wewnętrznym generatorem RC (8 MHz), natomiast licznik RTC jest taktowany za po-mocą dodatkowego sygnału o częstotliwości

Na tle innych, podobnych urządzeń, opisy-wany zegarek wyróżnia się brakiem przyci-sków mechanicznych, ponieważ sterowanie odbywa się za pomocą aplikacji dla systemu Android oraz laserowego czujnika zbliże-niowego. Wykorzystanie smartfona z du-żym czytelnym wyświetlaczem jest o wiele wygodniejsze niż obsługa za pomocą przy-cisków mechanicznych oraz ładnego, acz-kolwiek mało funkcjonalnego, wyświetlacza Nixie. Dodatkowo zyskujemy źródło czasu pochodzącego z sieci GSM, który będzie służył do synchronizacji zegara. Czujnik laserowy stanowi uzupełnienie interfejsu i umożliwia szybki dostęp do funkcji, ta-kich jak wyświetlanie daty, godziny alarmu oraz zapewnia szybkie wyłączenie budzika. Rezygnacja z fizycznych przycisków daje możliwość wykonania estetycznej obu-dowy z pleksi lub szkła, pozbawionej otwo-rów w widocznych miejscach. Zastosowanie skompensowanego generatora sygnału zega-rowego 32 kHz umożliwia uzyskanie dobrej dokładności zegara, nawet przy niezbyt czę-stej synchronizacji z telefonem.

W urządzeniu zastosowano najpopular-niejsze i najłatwiej dostępne w kraju lampy LC-513 produkcji zakładów Unitra Dolam o wielkości cyfr 15,5 mm. Lampy i podstawki są stosunkowo łatwo dostępne na aukcjach internetowych, więc każdy zainteresowany może wykonać zegar we własnym zakresie.

PROJEKT Y

33ELEKTRONIKA PRAKTYCZNA 5/2017

Androidowy zegar Nixie

B1 CR20

32

C110

0nF

C3 100n

FC2

100n

F

STM

_JRS

TST

M_J

TDO

STM

_JTD

IST

M_J

TCK

STM

_JTM

S

nRST

Sw1

Sw2

Sw3

PB0

26

PB1

27

PB2

28

PB3

55

PB4

56

PB5

57

PB6

58

PB7

59

PB8

61

PB10

29PB

962

PB11

30

PB12

33

PB13

34

PB14

35

PB15

36

PC0

8

PC1

9

PC2

10

PC3

11

PC4

24

PC5

25

PC6

37

PC7

38

PC8

39

PC9

40

PC10

51

PC11

52

PC12

53

PC13

-TAM

-RTC

2

PC14

-OSC

32_I

N3

PC15

-OSC

32_O

UT

4

PD0-

OSC

_IN

5

PA0-

WKU

P14

PA1

15

PA2

16

PA3

17

PA4

20

PA5

21

PA6

22

PA7

23

PA8

41

PA9

42

PA10

43

PA11

44

PA12

45

PA13

46

PA14

49

PA15

50

PD1-

OSC

_OU

T6

VDD

132

VDD

248

VDD

364

VDD

419

VDD

A13

VSS4

18VS

S363

VSS2

47VS

S131

VSSA

12

VBAT

1

nRST

7

BOO

T060

PD2

54

U5

STM

32F1

03_L

QFP

64

12

34

56

78

910

1112

1314

1516

1718

1920Co

n1ZW

S20

+3,3

V

STM

_JRS

TST

M_J

TDI

STM

_JTM

SST

M_J

TCK

STM

_JTD

OnR

STR2 10

k

JM0

JM1

JM2

JM3

JM4

JM5

JM6

JM7

JM8

JM9

DM

0D

M1

DM

2D

M3

DM

4D

M5

JH0

JH1

JH2

JH3

JH4

JH5

JH6

JH7

JH8

JH9

DH

1D

H2

DH

0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

JP1

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

JP2

EXT

1

CS8

V+2

FB3

GN

D7

AGN

D6

REF

5

SHD

N4

U2

MAX

1771

C610

0nF

R3 9,31

k(16

3V)

R1 1M

C7 22nF

Q1

IRFB

9N30

A

L110

0uH

D1

MU

RS34

0T3O

SCT-

ND

C447

0uF/

25V

GND

GN

D+V

A1

Vin

3Vo

ut2

GND1

U3

SPX1

117

C10

100n

FC1

210

0nF

C13

100n

F

Vin

GND

Vout

GNDGNDGND

U4

78L0

5_SO

8G

n1BN

C

C11

100n

F

C947

uFC8 47

uF

DK2

C14

10uF

Spk1

LD-S

P-U

30/8

A

C5 680n

F

OU

T12

VCC

13

GN

D4

VBAT

5

U1

DS3

2kH

z

+VBA

T

+VBA

T

32kH

z

32kH

z

Ligh

tLVL

Ligh

tLVL

R8 12k

C15

22nF

R6 12k

R4 47k

AUD

C18

47uF

C19

1uF

R19

20k

R16

20k

C17

100n

F

AUD

R7 3k

DK1

Tx1

Rx2

+3,3

V12

KEY

26

LED

24

GN

D13

Mod

1H

C-06

R13

10k

VIN

-4

VIN

+3

BYP

2

VCC

6

VOU

T15

VOU

T28

GN

D7

STBY

1

U6

TS49

90ID

C16

22nF

USA

RT3_

TXU

SART

3_RX

USA

RT3_

RXU

SART

3_TX G

ND

BTLE

D

BTLE

D

1 2 3 4

8 7 6 5

R5 2,7k

1 2 3 4

8 7 6 5

R9 2,7k

1 2 3 4

8 7 6 5

R11

2,7k

1 2 3 4

8 7 6 5

R14

2,7k

1 2 3 4

8 7 6 5

R17

2,7k

1 2 3 4

8 7 6 5

R15

2,7k

1 2 3 4

8 7 6 5

R12

2,7k

1 2 3 4

8 7 6 5

R10

2,7k

L210

uH

GN

DG

ND

GN

DG

ND

GN

D

GN

DG

ND

+3,3

V

+12V

+VA

GN

DG

ND

GN

D

GN

D

GN

D

+5V

GN

D +3,3

V+5

V+5

V_A

+12V

GN

D

+3,3

VG

ND

GN

DG

ND

+5V

GN

DG

ND

GN

D

GN

D

+VA

GN

D

+5V_

A

GN

D

GN

D

+5V_

A

+3,3

V

+5V_

A

Rysunek 1. Schemat ideowy płytki sterującej zegara

34 ELEKTRONIKA PRAKTYCZNA 5/2017

PROJEKT Y

A2

K67

K03

K212

K410

K113

K85

K94

K59

K76

K311

PL1

L3 LC-5

13

A2

K67

K03

K212

K410

K113

K85

K94

K59

K76

K311

PL1

L4 LC-5

13

A2

K67

K03

K212

K410

K113

K85

K94

K59

K76

K311

PL1

L5 LC-5

13

A2

K67

K03

K212

K410

K113

K85

K94

K59

K76

K311

PL1

L6 LC-5

13

R39

10k

R40

10k

R41

10k

R42

10k

T5 MM

BTA4

2

T9 MM

BTA4

2

T13

MM

BTA4

2

T15

MM

BTA4

2

T17

MM

BTA4

2

JM3

JM2

JM1

JM0

T16

MM

BTA4

2

DM

4

DM

3 T11

MM

BTA4

2

DM

1

DM

0

T10

MM

BTA4

2

GN

DG

ND

GN

DG

ND

T19

MM

BTA4

2

T21

MM

BTA4

2

T24

MM

BTA4

2

T27

MM

BTA4

2

T30

MM

BTA4

2

T18

MM

BTA4

2

T20

MM

BTA4

2

T23

MM

BTA4

2

T26

MM

BTA4

2

T29

MM

BTA4

2

GN

DG

ND

T22

MM

BTA4

2

T25

MM

BTA4

2

T28

MM

BTA4

2

GN

D

JM9_

HV

JM8_

HV

JM7_

HV

JM6_

HV

JM5_

HV

JM0_

HV

JM1_

HV

JM2_

HV

JM3_

HV

JM4_

HV

JM8

T4 MM

BTA4

2

T8 MM

BTA4

2

T12

MM

BTA4

2JM

6

JM7

JH9

JH4

JH3

JH4_

HV

JH3_

HV

JH2

JH2_

HV

JH1

JH1_

HV

JH0

JH5

JH6

JH6_

HV

JH7_

HV

JH7

JH8

JH8_

HV

JH9_

HV

DM

2

DM

2_H

VT2 M

MBT

A42 DM

1_H

VT6 M

MBT

A42 DM

0_H

V

DM

5

DM

5_H

VT3 M

MBT

A42 D

M4_

HV

T7 MM

BTA4

2 DM

3_H

V

DH

2

DH

2_H

V

DH

1

DH

1_H

V

DH

0

DH

0_H

V

JM9_

HV

JM8_

HV

JM7_

HV

JM6_

HV

JM5_

HV

JM4_

HV

JM3_

HV

JM2_

HV

JM1_

HV

JM0_

HV

DM

5_H

VD

M4_

HV

DM

3_H

VD

M2_

HV

DM

1_H

VD

M0_

HV

JH9_

HV

JH8_

HV

JH7_

HV

JH6_

HV

JH5_

HV

JH4_

HV

JH3_

HV

JH2_

HV

JH1_

HV

JH0_

HV

DH

2_H

VD

H1_

HV

DH

0_H

V

JH0

JH1

JH2

JH3

JH4

JH5

JH6

JH7

JH8

JH9

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

JP3

HEA

DER

20

DK2

DH

1D

H2

DH

0

JM0

JM1

JM2

JM3

JM4

JM5

JM6

JM7

JM8

JM9

DM

0D

M1

DM

2D

M3

DM

4D

M5

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

JP4

HEA

DER

20

T31

MM

BTA4

2

DK1

DK1

_HV

DS1

LAM

P N

EON

R43

27k

DK1

_HV

OU

T4

VDD

3

GN

D2

OE

1

U1

TSL2

38T

Ligh

tLVL

C1 100n

FT3

2M

MBT

A42

DK2

DK2

_HV

DK1

DS2

LAM

P N

EON

R43

27k

DK2

_HV

BTLE

DT3

3AO

3402

D4

BLU

ED

3BL

UE

D2

BLU

ED

1BL

UE

R44

200

R45

200

R46

200

R47

200

GN

DG

ND

GN

D

+VA

+5V

+5V

JM4

T14

MM

BTA4

2JM

5

JM9

JH5_

HV

JH0_

HV

+VA

+5V

Rysunek 2. Schemat ideowy płytki wyświetlacza

35ELEKTRONIKA PRAKTYCZNA 5/2017

Androidowy zegar Nixie

32 kHz, dostarczanego z generatora DS32KHZ (U1), który jest skompensowanym temperatu-rowo generatorem kwarcowym zapewniają-cym maksymalną odchyłkę czasu 1 minutę na rok oraz charakteryzującym się poborem prądu rzędu 1 mA.

Do linii portu szeregowego UART3_TX, RX dołączono popularny moduł Blue- tooth HC-05, który zapewnia komunikację ze światem zewnętrznym. Moduł ten jest konwerterem protokołu Bluetooth RFCOMM na RS232, który od strony mikrokontrolera może być sterowany za pomocą komend AT.

Do linii PB6 i PB7 stanowiących linie SDA, i SCL układu peryferyjnego I2C1 dołączono laserowy czujnik odległości VL6180x odpo-wiedzialny za wykrywanie gestów. Do portu PB5 dołączono sygnał przerwania GPIO0 czujnika, który jest używany do sygnalizo-wania zdarzeń generowanych przez czujnik, dzięki czemu nie ma konieczności ciągłego odpytywania układu.

Linia PB8, stanowiąca wyjście 3 sygnału PWM TIM3, za pomocą filtru dolnoprze-pustowego złożonego z rezystora R8 i kon-densatora C15 jest dołączona do wejścia wzmacniacza audio TS4490ID (U6). Wzmac-niacz ten pracuje w układzie mostkowym w klasie AB i przy zasilaniu 5 V dostarcza sygnał o mocy 1 W przy obciążeniu 8 V.

Linię PB1 dołączono do linii STBY wzmac-niacza, umożliwiając redukcję poboru prądu przez układ wzmacniacza do około 10 nA w stanie nieaktywności. Wyjście wzmacnia-cza dołączono do niewielkiego głośniczka LD-SP-U30/8A, który jest odpowiedzialny za generowanie dźwięku alarmów. Dzięki zastosowaniu trybu PWM do generowa-nia audio możemy w pamięci Flash mikro-kontrolera zapisać bardziej „przyjazne” dla ucha dźwięki niż przy zastosowaniu typo-wego buzzera.

Zasilacz niskiego napięcia zrealizowano z użyciem stabilizatorów liniowych. Układ

78L05 (U4) dostarcza napięcie +5  V po-trzebne do zasilania wzmacniacza audio, natomiast układ SPX1117-3.3 jest odpowie-dzialny za dostarczanie napięcia +3,3  V stanowiącego zasilanie mikrokontrolera. Do linii zasilającej VBAT mikrokontro-lera, oraz generatora DS32KHZ dołączono zasilanie z baterii litowej CR2032 (B1), za-pewniając podtrzymanie zliczania czasu po zaniku napięcia sieciowego. Blok zasi-lacza wysokonapięciowego dostarczającego napięcie +165 V, do zasilania lamp LC513, zrealizowano w topologii boost z zastoso-waniem kontrolera MAX1171 (U1). Układ ten charakteryzuje się pracą z częstotliwością 300 kHz, zapewnia dużą sprawność przetwa-rzania (rzędu 90%) oraz bardzo mały pobór prądu rzędu 300 mA w stanie bez obciąże-nia. Zawiera także zintegrowany sterow-nik zewnętrznego tranzystora N-MOSFET znacznie zmniejszający liczbę potrzebnych elementów zewnętrznych. Wyjście EXT ste-ruje tranzystorem IRFB9N30A (Q1) o rezy-stancji kanału 0,45 V, napięciu wstecznym 300 V i prądzie przewodzonym 9 A. Cewka L1, dioda D1 i tranzystor Q1 stanowią frag-ment przetwornicy w topologii boost. Pętlę sprzężenia zwrotnego zrealizowano za po-mocą rezystorów R1 i R3, natomiast napięcie wyjściowe jest filtrowane za pomocą kon-densatora 680 nF/450 V (C5). Linie PA0-15, PB13-15, PC0-12, PD0-1 są używane do ste-rowania lampami Nixie. Za pomocą drabinek rezystorowych zostały dołączone do złączy JP1 i JP2, których użyto do połączenia płyty kontrolera z płytką wyświetlacza.

Na płytce wyświetlacza zamontowano układ TSL238T (U1) będący czujnikiem natężenia światła, który zapewnia auto-matyczny dobór jasności świecenia cyfr. Układ ten dostarcza sygnał wyjściowy o częstotliwości proporcjonalnej do natęże-nia oświetlenia, który poprzez złącze JP3 jest podawany na wejście PB0 mikrokontrolera.

Choć czujnik laserowy ma zintegrowany czujnik światła dziennego, celowo zastoso-wano osobny czujnik umieszczony na froncie po to, aby mierzył poziom światła padający bezpośrednio na wyświetlacze. Za sterowa-nie elektrodami Nixie są odpowiedzialne tranzystory bipolarne NPN typu MMBTA42 o maksymalnym napięciu wstecznym 300 V i prądzie przewodzenia do 100 mA. Wyświe-tlacze umieszczono w specjalnych podstaw-kach dla lamp LC513. Pomiędzy lampami L3, L4 a L5, L6 znajdują się dwie neonówki DS1 i DS2 umieszczona jedna nad drugą. Służą one do wyświetlania dwukropka pomiędzy minutami i godzinami.

OprogramowanieOprogramowanie mikrokontrolera napisano w języku C++14 za pomocą kompilatora gcc w wersji 6.2 pracującego pod kontrolą systemu operacyjnego ISIX-RTOS. Jest ono dostępne na otwartej licencji GPL. Oprogramowa-nie można pobrać z repozytorium znajdu-jącego się pod adresem https://www.boff.pl/ cgit/public.

Budowę firmware'u zegara przedsta-wiono na rysunku  3. Oprogramowanie podzielono na warstwę sterowników oraz warstwę aplikacji. Sterowniki są odpowie-dzialne za obsługę: wyświetlacza Nixie, ze-gara RTC, czujnika laserowego, audio PWM oraz portu szeregowego.

Część aplikacyjną zrealizowano w postaci 4 wątków systemu ISIX. Wątek wizualizacji odpowiada za wyświetlanie danych na wy-świetlaczu Nixie. W zależności od kontekstu jest to data, czas lub godzina alarmu. Wątek interpretacji gestów odczytuje stan czujnika VL6180 i w zależności od wykrycia odpo-wiednich gestów polegających na zbliżaniu ręki do czujnika i zatrzymaniu w pewnej od-ległości generuje zdarzenia, które są inter-pretowane przez wątek główny. Wykrywa on dwa rodzaje gestów: gest odczytu daty

Rysunek 3. Budowa firmaware'u zegara

36 ELEKTRONIKA PRAKTYCZNA 5/2017

PROJEKT Y

PWM zapewnia to uzyskanie częstotliwości odświeżania wyświetlacza równej 100 Hz, co jest wartością wystarczającą, aby zapobiec nieprzyjemnemu migotaniu cyfr. Przerwa-nie odpowiedzialne za generowanie sygnału PWM jest wywoływane ze stosunkowo dużą częstotliwością i nie powinno być bloko-wane, dlatego zostało skonfigurowane z naj-wyższym priorytetem i może wywłaszczać pozostałe przerwania. Priorytet przerwania T1_OVERFLOW znajduje się również powyżej priorytetu przerwań blokowanych za pomocą rejestru BASEPRI przy wejściu do sekcji kry-tycznych systemu ISIX, w związku z tym wszystkie operacje związane z tym prze-rwaniem nie mogą wykorzystywać API sys-temu, a jedyną możliwością synchronizacji i komunikacji jest wykorzystanie operacji atomowych. Procedura obsługi przerwania od układu czasowo-licznikowego i najważ-niejsze elementy programowego generowania PWM są przedstawione na listingu 1.

Każde utworzenie nowej instancji klasy soft_pwm powoduje wywołanie konstruk-tora, który za pomocą zmiennej atomowej g_locked blokuje dostęp do obiektu std:list, a następnie dopisuje na koniec listy wskaź-nik na nowo utworzony obiekt klasy. Jeśli przy próbie dopisania elementu lista jest pu-sta oznacza to, że układ czasowo-licznikowy nie został jeszcze uruchomiony. W związku z tym jest wywoływana funkcja, której za-daniem jest konfiguracja układu czasowo--licznikowego T1, aby generował przerwania z częstotliwością 25,6 kHz. Podobnie, gdy obiekt klasy soft_pwm kończy swój cykl życia, zostaje wywołany destruktor, który

polegający na energicznym zbliżaniu ręki do czujnika i zatrzymaniu jej w odległości większej niż 5 cm oraz gest odczytu godziny alarmu polegający na energicznym zbliżaniu ręki i dotknięciu obudowy zegara.

Wątek Bluetooth jest odpowiedzialny za zarządzanie i konfigurację modułu HC-05 oraz interpretacje rozkazów otrzymywa-nych z aplikacji zainstalowanej na smartfo-nie. Po otrzymaniu stosownego komunikatu generuje on zdarzenie interpretowane przez wątek główny aplikacji.

Wróćmy do opisu warstwy sterowników. Z uwagi na to, że w projekcie przyjęto zało-żenie płynnej regulacji jasności oraz efekt płynnego przejścia między cyframi, sterow-nik wyświetlacza musi każdą cyfrą sterować za pomocą sygnału PWM. W mikrokontrole-rach STM32 mamy limitowaną liczbę wypro-wadzeń, które mogą pełnić funkcję wyjścia sprzętowego sygnału PWM, natomiast do sterowania wyświetlaczem potrzebujemy aż 27 linii wyjściowych. Co prawda, jedynie 5 linii jest aktywnych w tym samym czasie i można pokusić się o dołączenie zewnętrz-nych demultiplekserów, jednak niepotrzeb-nie skomplikowałoby to budowę urządzenia. W związku z powyższym zdecydowano się na rozwiązanie w postaci programowego ge-nerowania sygnału PWM. Za generowanie sygnału PWM odpowiada klasa soft_pwm (plik soft_pwm.cpp/hpp), która wykorzy-stuje sygnał przepełnienia od układu cza-sowo-licznikowego T1 do wytwarzania przerwania. Licznik skonfigurowano tak, aby przerwanie było wywoływane z często-tliwością 25,6 kHz. Przy 8-bitowym liczniku

Wykaz elementów:Płytka zegara

Rezystory: (SMD 0805)R1: 1 MVR2, R13: 10 kVR3: 9,31 kVR4: 47 kVR5, R9…R12, R14, R15, R17: 4×2,7 kV (dra-binka rezystorowa)R6, R8: 12 kVR7: 3 kVR16, R19: 20 kVKondensatory: (SMD 0805)C1…C3, C6, C10…C13, C17: 100 nFC4: 470 mF/25 VC5: 680 nF/400 V (THT)C7, C15, C16: 22 nFC8, C9, C18: 47 mF (SMD „D”)C14: 10 mF (SMD)C19: 1 mFPółprzewodniki:D1: MURS340T3OSCT-ND (dioda Schottky'ego, DO214AB)Q1: IRFB9N30A (TO-220)U1: DS32KHZU2: MAX1771 (SO8)U3: SPX1117 (TO-252)U4: 7805 (SO8)U5: STM32F103 (LQFP64)U6: TS4990ID (SO8)Inne:B1: bateria CR2032 z gniazdemL1: 100 mH (EPCOS 19×15)L2: 10 mH (SMD 1206)MOD1: moduł Bluetooth HC-06SPK1: głośniczek LD-SP-U30/8A

Płytka wyświetlaczaRezystory:R39…R42: 10 kV (SMD 1206)R43: 27 kV (SMD 1206)R44, R45, R46, R47: 200 V (SMD 0603)Kondensatory:C1: 100 nF (SMD 0805)Półprzewodniki:D1…D4: LED 5 mmT2…T32: MMBTA42 (SOT-23)T33: AO3402 (SOT-23, MOSFET N)U1: TSL238TInne:JP3, JP4: złącze 2×10L3…L6: lampa Nixie LC-513DS1, DS2: neonówka

ustawia blokadę listy, a następnie kasuje element z listy odpowiadający temu obiek-towi. Procedura obsługi przerwania tim1_up_isr_vector() jest funkcją zaprzyjaźnioną z klasą soft_pwm i cyklicznie z częstotliwo-ścią 25,6 kHz wywołuje metody isr_handler() dla wszystkich zarejestrowanych instancji klas. Wektor przerwania został zdefinio-wany z dodatkowymi atrybutami nakazują-cymi kompilatorowi włączenie dla tej funkcji agresywnej optymalizacji. Wykorzystanie listy obiektów podłączanych pod procedurę przerwania umożliwia elastyczne tworze-nie instancji klas soft_pwm, zapewniając ge-nerowanie dowolnej liczby sygnałów PWM. Publiczne API klasy soft_pwm pokazano na listingu 2.

Listing 1. Procedura obsługi przerwania od układu czasowo-licznikowego i najważniej-sze elementy programowego generowania PWMnamespace { //Vectors for PWM handler callbacks std::list<soft_pwm*> g_handlers; std::atomic<bool> g_locked; volatile soft_pwm::value_type m_pwm_cnt;}

//! Constructorsoft_pwm::soft_pwm( ){ g_locked = true; if( g_handlers.empty() ) { timer_create(); } g_handlers.push_back( this ); g_locked = false;}

//! Destructorsoft_pwm::~soft_pwm(){ g_locked = true; g_handlers.remove( this ); if( g_handlers.empty() ) { timer_destroy(); } g_locked = false;}

//ISR handlerextern „C” { __attribute__((interrupt,optimize(„-O3”))) void tim1_up_isr_vector() { stm32::tim_clear_it_pending_bit( TIM1, TIM_IT_Update ); if( g_locked ) return; for( auto h : g_handlers ) { h->isr_handler(); } ++m_pwm_cnt; }}

37ELEKTRONIKA PRAKTYCZNA 5/2017

metodę handle_digit(). Działanie tej metody polega na wybraniu z tablicy odpowiedniego elementu oznaczającego numer linii GPIO na podstawie cyfry oraz pozycji, a następ-nie wywołaniu metody change_pin() z od-powiadającego obiektu klasy soft_pwm. Jak już wspomniano, priorytet obsługi przerwa-nia realizującego PWM znajduje się powy-żej priorytetu maskowania przerwań sekcji krytycznych systemu, zatem nie ma możli-wości realizacji powiadomień np. za pomocą semaforów systemowych. Aby zapobiec wy-konaniu kolejnej sekwencji przenikania cyfr poprzez niespodziewanie rozpoczęcie nowego cyklu, metoda change_pin() zwraca wartość true, gdy sterownik softpwm znajduje się w trakcie realizacji algorytmu przenikania. Jeśli wywołanie metody change_pin() nie powiodło się, wówczas podejmujemy kolejną próbę po odczekaniu 250 ms. Nie jest to roz-wiązanie zbyt eleganckie, ale dzięki takiemu podejściu przerwanie realizujące PWM nie jest nigdy wstrzymywane.

Lucjan Bryndza, EP

metoda clear() zeruje wyświetlacz i ustawia kursor na pozycji początkowej. Pełna zgod-ność z biblioteką wyświetlaczy znakowych z libfoundation umożliwia wykorzystanie przeciążonego operatora „<<”. Naturalnie, z uwagi na ograniczenia samego wyświetla-cza, na pozycjach 0, 1, 3, 4 mogą być wy-świetlane tylko cyfry, natomiast na pozycji 2 odpowiadającej za dwukropek interpreto-wane są jedynie znaki „:”, „.” „’” oraz spacja. Najciekawsze fragmenty implementacji klasy wyświetlacza przedstawiono na listingu 4.

Tablica ports jest tablicą obiektów dev::out o wymiarach 5×10 zawierającą mapowa-nie poszczególnych portów mikrokontrolera na odpowiadające cyfry wyświetlacza. Za-deklarowano ją jako wyrażenie stałe, znane podczas kompilacji, więc kompilator umieści ją w pamięci Flash. Klasa out przechowuje in-formacje o nazwie portu oraz numerze pinu w postaci prywatnego pola o wielkości jed-nego bajtu i zawiera metody port()/pin(), które umożliwiają zdekodowanie informacji do po-staci akceptowanej przez funkcję gpio_set()/gpio_clr(). Wyświetlenie znaku na wybra-nej pozycji realizowane jest przez prywatną

Wywołanie metody change_pin() z refe-rencją do obiektu out zawierającym nazwę i numer portu GPIO powoduje płynne zmniej-szenie współczynnika wypełnienia sygnału PWM poprzednio przypisanego wyprowa-dzenia i jednocześnie płynne zwiększenie współczynnika wypełnienia dla nowego portu. Zastosowanie takiego triku umożli-wia osiągnięcie ciekawego efektu wizualnego polegającego na płynnym efekcie przejścia z jednej cyfry w drugą. Metoda level() służy do ustawienia poziomu jasności wyświetla-cza, należy tutaj podać wartości w zakresie od 0 do 255. Metoda fast umożliwia określe-nie, czy efekt przejścia między cyframi ma być szybki (0,1 s), czy powolny (1 s). Metoda fast ustawiana jest tylko dla sygnałów PWM odpowiedzialnych za dwukropki.

Klasa soft_pwm jest klasą usługową wy-korzystywaną przez właściwy sterownik wyświetlacza realizowany przez klasę nixie_disp (pliki nixie_disp.cpp/hpp). Sterownik wyświetlania udostępnia wysokopoziomowe API do obsługi cyfr. Na początku tworzy on 5 obiektów klas soft_pwm odpowiadający odpowiednio cyfrom godzin, dwukropkowi oraz cyfrom minut soft_pwm m_pwm[_pwm_eof _];. Publiczne metody klasy sterownika wyświetlacza zgodne są z biblioteką strumie-niową dla wyświetlaczy znakowych z lib-foundation (listing 3).

Metoda putc() służy do wyświetlania znaku na bieżącej pozycji kursora, metoda setpos() ustawia kursor znaku na żądanej po-zycji, metoda brightness() umożliwia usta-wienie poziomu podświetlania, natomiast

Listing 4. Fragmenty funkcji obsługi wyświetlaczanamespace { //Display digit confi g const constexpr out ports[][10] { //H1 { out(out::A,10), out(out::A,11), out(out::A,12) }, //H2 { out(out::A,0), out(out::A,1), out(out::A,2), out(out::A,3), out(out::A,4), out(out::A,5), out(out::A,6), out(out::A,7), out(out::A,8), out(out::B,13) }, //M1 { out(out::C,10), out(out::C,11), out(out::C,12), out(out::C,13), out(out::D,0), out(out::D,1) }, //M2 { out(out::C,0), out(out::C,1), out(out::C,2), out(out::C,3), out(out::C,4), out(out::C,5), out(out::C,6), out(out::C,7), out(out::C,8), out(out::C,9) }, //DOT lo { out(out::B,15) }, // Dot hi { out(out::B,14) } }; //Off port marker constexpr out port_off ;}

// Handle nixie digitvoid nixie_disp::handle_digit( int val, size_t pos ){ const dev::out& d = val!=e_inval?ports[pos][val]:port_off ; //! Wait for fadein fade out while ( m_pwm[pos].change_pin( d ) ) { isix::wait_ms( 250 ); }}

Listing 2. Publiczne API klasy soft_pwm// !Replace pin and change pwm levelbool change_pin( const out& new_pin );//! Change PWM bright valuevoid level( value_type pwm );//! Set fast modevoid fast( bool m );

Listing 3. Publiczne metody klasy ste-rownika wyświetlacza/** Put character on the display */int putc( char ch );/** Set display position */int setpos( int x, int );//! Set brightnessvoid brightness( bright_t val );//! Get brightnessbright_t brightness() const;//! Clear the displayvoid clear();

nej pozycji realizowane jest przez prywatną

Prenumerujesz„Elektronikę Praktyczną”

i „Elektronikę dla Wszystkich”?Masz prawo do

bezpłatnej prenumeratymiesięcznika „Elektronik”

w promocji 1+1=3www.avt.pl/prenumerata

Androidowy zegar Nixie

42 ELEKTRONIKA PRAKTYCZNA 8/2017

Androidowy zegar Nixie (2)Na łamach czasopism elektronicznych oraz stronach internetowych opublikowano wiele projektów zegarków z lampami Nixie, w najróżniej-szych konfi guracjach i opcjach. Były zarówno projekty oparte o popularne mikrokontrolery, były zegarki zbudowane na układach serii 74HC, a nawet zrealizowane na układach programowalnych. Jednak ten zegarek jest inny, ponieważ zastosowano w nim najnowsze zdobycze techniki, takie jak sen-sor laserowy lub sterowanie za pomocą smartfona. Uwaga: artykuł stanowi kontynuację projektu opisanego w EP 5/2017.

PROJEKT Y

DODATKOWE MATERIAŁY NA FTP:ftp://ep.com.pluser: 92822, pass: 37euo8qfW ofercie AVT* AVT-5582Podstawowe informacje:Androidowy zegar Nixie ma następujące parametry: yWyświetlacz Nixie o wielkości cyfr 15,5 mm. yOdchyłka autonomicznego pomiaru czasu max ±1 min/rok. yAutomatyczna zmiana czasu lato/zima. yWygodne sterowanie za pomocą inter-fejsu Bluetooth i aplikacji dla systemu Android dostępnej w sklepie Play. yPodstawowa obsługa pozbawiona przycisków mechanicznych za pomocą zbliżeniowego czujnika laserowego. y Funkcja alarmu w trybie tygodniowym. yAutomatyczne sterowanie poziomem jasności w zależności od natężenia oświe-tlenia, z możliwością ustawienia stałego poziomu podświetlania z aplikacji. y Efekt płynnego przejścia pomiędzy cyframi. yMożliwość zaprogramowania przedziału godzin, kiedy zegar ma być wyłączony np. w nocy, aby nie przeszkadzać oraz prze-dłużać żywotność lamp. yAlgorytm automatycznego odtruwania katod, przedłużający żywotność lamp. yPrzyjemny dla ucha sygnał alarmu. y Zasilanie z zasilacza wtyczkowego 12 V, pobór mocy ok. 2 W (przy 50% jasności).

Projekty pokrewne na FTP:(wymienione artykuły są w całości dostępne na FTP)

AVT-3141 Zegar Nixie z sekundami (EdW 6/2016)AVT-3097 Zegar Nixie (EdW 7/2014)AVT-5145 Zegar retro na lampach Nixie (EP 9/2008)* Uwaga! Elektroniczne zestawy do samodzielnego montażu.Wymagana umiejętność lutowania!Podstawową wersją zestawu jest wersja [B] nazywana potocznie KITem (z ang. zestaw). Zestaw w wersji [B] zawiera elementy elektroniczne (w tym [UK] – je-śli występuje w projekcie), które należy samodzielnie wlutować w dołączoną płytkę drukowaną (PCB). Wykaz elementów znajduje się w dokumentacji, która jest podlinkowana w opisie kitu.Mając na uwadze różne potrzeby naszych klientów, oferujemy dodatkowe wersje: wersja [C] zmontowany, uruchomiony i przetestowany zestaw [B] (elementy

wlutowane w płytkę PCB) wersja [A] płytka drukowana bez elementów i dokumentacjaKity w których występuje układ scalony wymagający zaprogramowania, posiadają następujące dodatkowe wersje: wersja [A+] płytka drukowana [A] + zaprogramowany układ [UK]

i dokumentacja wersja [UK] zaprogramowany układNie każdy zestaw AVT występuje we wszystkich wersjach! Każda wersja ma załączony ten sam plik pdf! Podczas składania zamówienia upewnij się, którą wersję zamawiasz! http://sklep.avt.pl

Za komunikację ze światem zewnętrznym odpowiada wątek serwisu Bluetooth, który zajmuje się zarządzaniem modułem oraz re-alizuje obsługę protokołu pomiędzy zegarem, a aplikacją zewnętrzną. Serwis Bluetooth zaimplementowany został w klasie remote_cmd_serwer (pliki remote_cmd_server.cpp/hpp) i działa według algorytmu przedsta-wionego na rysunku 4. Rozpoczyna pracę

w roli podrzędnej slave. Tryb slave polega na tym, że moduł oczekuje na połączenie zgodne z protokołem RFCOMM. Po zakoń-czeniu fazy konfiguracji serwis przechodzi

Rysunek 4. Algorytm działania serwisu obsługi Bluetooth

od inicjalizacji podstawowych układów peryferyjnych mikrokontrolera oraz konfi-guracji portu szeregowego. Po skonfiguro-waniu portu, mikrokontroler przystępuje do automatycznego wykrywania prędkości transmisji, jaką posługuje się moduł i próby nawiązania komunikacji, co jest realizowane przez prywatną metodę detect_baudrate(). Działanie tej metody polega na próbie cy-klicznego wysyłania komendy AT\r\n z róż-nymi popularnymi prędkościami transmisji, poczynając od 9600 bps. Moduł po odebraniu wspomnianej sekwencji powinien odpowie-dzieć ciągiem znaków OK\r\n. Jeśli moduł nie odpowiedział na komendę AT dla żadnej prędkości, wówczas aplikacja jest zatrzymy-wana, zakładając wystąpienie awarii sprzę-towej zegara.

Po nawiązaniu komunikacji z modułem przechodzimy do fazy konfiguracji realizo-wanej przez prywatną metodę configure().

Konfiguracja polega na wysyłaniu od-powiednich poleceń AT, których zada-niem jest: ustawienie domyślnej nazwy urządzenia, ustawienie domyślnego hasła do parowania, oraz trybu pracy

43ELEKTRONIKA PRAKTYCZNA 8/2017

Androidowy zegar Nixie

epoką Unixa. Choć ten sposób może wyda-wać się dziwny, ma szereg zalet w stosunku do zwykłego zliczania czasu realizowanego przez typowe zegarki RTC w formacie BCD. Przede wszystkim takie operacje, jak: porów-nywanie, dodawanie, odejmowanie są bar-dzo łatwe i sprowadzają się do zwykłych operacji arytmetycznych na pojedynczych liczbach int32_t lub int64_t. Nie ma koniecz-ności skomplikowanego przeliczania ile mi-nut składa się na godzinę, ile dni na miesiąc itp. Po prostu zegar pracujący w formacie UTS zwiększa zawartość licznika co 1 se-kundę. Podobnie sprawdzanie warunku wystąpienia alarmu sprowadza się do ope-racji zwykłego porównania liczb. Główna

ERROR <opis> <kod_numeryczny>\r\nKomunikacja z zegarem polega na wy-

słaniu komendy odczytującej (get) lub usta-wiającej (set) wybrany parametr zakończonej znakami \r\n , po czym należy czekać na od-powiedź, zawierającą opcjonalnie zwrócone argumenty, lub kod błędu wraz z opisem i ko-dem numerycznym. Zestaw wszystkich ko-mend zegara przedstawiono w tabeli 1.

Przy omawianiu oprogramowania ze-gara warto również wspomnieć o sposobie prowadzenia czasu, który jest realizowany przez UTS (Unix Time Stamp). UTS jest systemem reprezentacji czasu, który mierzy liczbę sekund jaka upłynęła od 1 stycznia 1970 roku UTC, czyli od chwili nazwanej

do wykonania pętli głównej, w której ocze-kuje na przesłanie komendy przez urzą-dzenie zewnętrzne. Zestaw rozkazów sterujących dla zegara oparty jest o proste komendy tekstowe zakończone znakami \r\n. Dzięki takiemu rozwiązaniu możemy sterować zegarem bez konieczności posia-dania dedykowanej aplikacji za pomocą ter-minala dołączonego do wirtualnego portu szeregowego. Jest to istotne na etapie eks-perymentowania i uruchamiania układu. Po odebraniu ciągu znaków na porcie szere-gowym zakończonym znakami \r\n aplika-cja przechodzi do parsowania odebranego ciągu tekstowego. Jeśli odebrana komenda jest prawidłowa wówczas następuje wysłanie zdarzenia EV_QUERY informującego wątek główny o odebraniu nowej komendy, a na-stępnie serwer oczekuje na zdarzenie EV_RESP, które jest generowane przez aplikację główną po przetworzeniu komendy. Zdarze-nie odpowiedzi może zawierać dodatkowe dane, które mają zostać przekazane do apli-kacji zewnętrznej przez serwer komunika-cyjny. Wszystkie komendy przesyłane są za pomocą znaków ASCII według schematu py-tanie-odpowiedź, gdzie ogólny format roz-kazu wygląda następująco:

Pytanie: get lub set <nazwa_komendy> <opcjonalne argumenty>\r\n

Odpowiedz: OK <opc jona lne argumenty>\r\n

Tabela 1. Komendy sterujące zegaremPytanie Odpowiedź Opis

get time\r\n OK <UTS>\r\nERROR <description> <code>\r\n

Pobiera czas zegara, gdzie <UTS> to czas podany w formacie Unix Time Stamp.

set time <uts>\r\n OK\r\nERROR <description> <code>\r\n

Ustawia czas główny zegara na wartość wskazywaną przez <UTS>.

get alarm\r\n OK <hh:mm> <al_fl ags>\r\n ERROR <description> <code>\r\n

Pobiera aktualny czas alarmu, gdzie:<hh:mm> to godzina i minuta alarmu,<al_fl ags> Maska bitowa dni tygodnia zwrócona w postaci liczby szesnastkowej oznaczająca odpowiednio 0x01: Poniedzialek 0x02: Wtorek itd. 0x00: alarm wyłączony.

set alarm <hh:m-m><al_fl ags> \r\n

OK\r\nERROR <description> <code>\r\n

Ustawia czas alarmu zgodnie z parametrami z poprzedniego punktu.

get brightness\r\n OK <bsetmode> <currval>\r\nERROR <description> <code>\r\n

Pobiera aktualny poziom jasności wyświetlacza, gdzie<bsetmode>: 1 – sterowanie jasnością automatyczne, <50,100> – ręcznie ustawiony poziom jasności.<currval> – Bieżąca jasność wyświetlacza w %

set brightness <value>\r\n

OK\r\nERROR <description> <code>\r\n

Ustawia poziom jasności wyświetlacza, gdzie jako <value> prze-kazujemy wartość w zakresie 50-100 jeśli chcemy ustalić jasność wyświetlacza na stałe lub A, jeśli jasność wyświetlacza ma być kontrolowana przez czujnik światła.

get failures\r\n OK <pcaddr> <fcount>\r\n Funkcja diagnostyczna zwracająca aktualne informację o awariach oprogramowania zegara, gdzie <pcaddr> to adres PC, w którym apli-kacja zawiodła, natomiast <fcount> oznacza totalną liczbę awarii.

get displayoff \r\n OK <from> <to>\r\nERROR <description> <code>\r\n

Zwraca dobowy przedział godzinowy, w którym wyświetlacz zostanie wygaszony, gdzie <from> to początkowa godzina wygaszenia wyświe-tlacza; <to> końcowa godzina wygaszenia wyświetlacza.

Set displayoff <from> <to>\r\n

OK\r\nERROR <description> <code>\r\n

Ustawia dobowy przedział godzinowy, w którym wyświetlacz zosta-nie wygaszony.

Listing 5. Wybór strefy czasowejvoid _tzset_unlocked_r( struct _reent* ){ constexpr auto sechour = 3600; __tzinfo_type *tz = __gettzinfo (); { tz->__tzrule[0].off set = -1*sechour; tz->__tzrule[1].off set = tz->__tzrule[0].off set - 3600;

tz->__tzrule[0].ch = ‚m’; tz->__tzrule[0].m = 3; tz->__tzrule[0].n = 5; tz->__tzrule[0].d = 0; tz->__tzrule[0].s = 2 * sechour;

tz->__tzrule[1].ch = ‚m’; tz->__tzrule[1].m = 10; tz->__tzrule[1].n = 5; tz->__tzrule[1].d = 0; tz->__tzrule[1].s = 3 * sechour; } __tzcalc_limits (tz->__tzyear); _timezone = tz->__tzrule[0].off set; _daylight = tz->__tzrule[0].off set != tz->__tzrule[1].off set; }}

44 ELEKTRONIKA PRAKTYCZNA 8/2017

trudność dla UTS sprowadza się do końco-wego przeliczenia formatu na czas lokalny, zgodnie z lokalną strefą czasową. Pomimo pozornego skomplikowania zaletą takiej in-terpretacji czasu jest również automatyczne uwzględnienie czasu letniego i zimowego bez konieczności przestawiania zegara. Przeliczanie z formatu UTS na czas lokalny jest zadaniem dość skomplikowanym, jed-nak biblioteka standardowa libc kompila-tora z GCC posiada standardowe funkcje ułatwiające to zadanie. Funkcja localtime_r służy do przeliczania czasu z formatu UTS na na czas lokalny, natomiast funkcja mktime przelicza czas lokalny na format UTS. Jedyną rzeczą jaką należy zrobić, to odpowiednio ustawić strefę czasową definiując funkcję void _tzset_unlocked_r( struct _reent* ). Za-daniem tej funkcji jest wypełnienie struk-tury __tzinfo_type określającej strefę oraz godzinę zmiany czasu z letniej na zimowy i odwrotnie. W naszym przypadku zdecy-dowaliśmy się na ustawienie polskiej strefy czasowej CEST. Istnieje możliwość zdefinio-wania dodatkowej funkcjonalności zegara obsługującej wiele stref czasowych, co pozo-stawiam jako zadanie domowe dla czytelni-ków. Przykład ustawienia strefy czasowej dla polskiego czasu CEST wygląda następująco, jak na listingu 5.

Struktura tzinfo_type zawiera dwie struk-tury __tzrule_type[0] __tzrule_type[1] odpo-wiedzialne odpowiednio za czas letni, oraz za czas zimowy. Pole offset w strukturze __tzrule_type określa przesunięcie czasu w se-kundach względem GMT, odpowiednio dla czasu letniego i zimowego. Pola m/n/d okre-ślają miesiąc , dzień tygodnia, oraz dzień miesiąca zmiany czasu z letniego na zimowy, lub zimowego na letni. Dodatnie powyż-szej funkcji spowoduje, że funkcje biblio-teczne localtime/mktime będą prawidłowo

Rysunek 5. Schemat montażowy zegara Nixie

przeliczały czas z formatu UTS na lokalny czas CEST. Pierwsze mikrokontrolery ro-dziny STM32 jako zegar RTC posiadały pro-sty licznik 32-bitowy zwiększający swoją zawartość co 1 sekundę, tak więc nadają się idealnie do automatycznego prowadze-nia czasu w formacie UTS. Niestety w now-szych wersjach układów producent wycofał się z tego rozwiązania, wybierając gorsze rozwiązanie w postaci zegara RTC zlicza-jącego w BCD.

Aplikacja dla systemu Android służąca do komunikacji została przygotowane z wy-korzystaniem oprogramowania „Android Stu-dio”, i wykorzystuje profil Bluetooth-SPP do komunikacji z zegarem. Oprogramowa-nie zostało napisane zgodnie z wytycznymi „Material Design” i zawiera zestaw prostych i intuicyjnych formatek, które umożliwiają w wygodny sposób ustawienie wszystkich pa-rametrów. Oprogramowanie działa w dwóch wątkach jeden wątek odpowiedzialny jest za realizację komunikacji Bluetooth natomiast drugi wątek realizuje operacje interfejsu użytkownika. Komunikacja po Bluetooth re-alizowana jest w klasie BluetoothSPP (plik Blu-etoothSPP.java) i sprowadza się do otwarcia domyślnego interfejsu Bluetooth, i próby na-wiązania komunikacji, gdzie jako identyfika-tor protokołu SPP należy podać ciąg:private final UUID UUID _ SPP = UUID.fromString(„00001101-0000-1000-8000-00805F9B34FB”);

Niestety szczegółowe umówienie apli-kacji Android wykracza poza łamy ni-niejszego artykułu, i zostanie pominięte. Zainteresowanych czytelników odsyłam do kodu źródłowego.

Montaż i uruchomienieShemat montażowy płytki sterownika ze-gara oraz wyświetlacza przedstawiono

na rysunku 5. Całość wykonano z użyciem elementów SMD 0805, poza kondensatorami wysokonapięciowymi, tranzystorami mocy oraz podstawkami pod lampy. Montaż rozpo-czynamy od płytki wyświetlacza. Najpierw montujemy rezystory, następnie tranzystory wysokonapięciowe MMBTA42, oraz czujnik oświetlenia TSL238. Na koniec montujemy gniazda do lamp NIXIE, oraz dwurzędowe goldpiny stanowiące interfejs połączeniowy z płytką sterownika. Po zmontowaniu płytki wyświetlacza przystępujemy do montażu sterownika. Najpierw montujemy dyskretne elementy SMD kondensatory, rezystory, a na-stępnie przystępujemy montażu półprze-wodnikowych elementów SMD. Kolejną czynnością jest montaż modułu Bluetooth HC-05, większych elementów przewleka-nych, oraz złącz. Po zakończeniu montażu przystępujemy do uruchomienia płyty głów-nej, w tym celu do złącza GN1 podłączamy

Rysunek 6. Okno parowania

PROJEKT Y

45ELEKTRONIKA PRAKTYCZNA 8/2017

Rysunek 9. Widok okna alarmów

zasilacz laboratoryjny ustawiony na napię-cie 12V i ograniczeniu prądowym 200mA. Należy tutaj zachować szczególną ostroż-ność ponieważ pracująca przetwornica do-starcza napięcia 165V, co może stanowić zagrożenie. Po podłączeniu zasilania na-leży sprawdzić poprawność napięć zasila-jących: napięcie na wyjściu stabilizatora U4 powinno mieć wartość 5V, natomiast napię-cie na wyjściu stabilizatora U3 powinno być zbliżone do 3,3V. Należy również sprawdzić poprawność działania przetwornicy dostar-czającej napięcia dla lamp, gdzie wartość napięcia powinna być zbliżona do 165V. Je-śli napięcie znacząco odbiega od wartości zadeklarowanej należy sprawdzić jakość cewki L1, oraz ewentualnie skorygować wartości rezystorów w dzielniku (R1 oraz R3). Zaleca się użycie rezystorów o tolerancji 1%. Na zakończenie należy również spraw-dzić ogólny pobór prądu przez układ, który przy niezaprogramowanym mikrokontrole-rze i odłączony wyświetlaczu nie powinien przekraczać 30mA. Gdy już będziemy pewni co do prawidłowości napięć zasilających mo-żemy przystąpić do wgrania oprogramowa-nia do mikrokontrolera. W tym celu do złącza CON1 należy podłączyć programator zgodny ze standardem JTAG np. BF-30 czy STLINK-v1, a następnie za pomocą oprogramowania ope-nocd, lub innego preferowanego zaprogramo-wać mikrokontroler plikiem btnxclock.hex. Po zaprogramowaniu układu należy odłą-czyć zasilanie, dołączyć płytkę wyświe-tlacza, a następnie ponownie uruchomić zegar. W tym momencie na wyświetlaczu powinien pojawić się przez 10 sekund ciąg szybko zmieniających się cyfr. Zadaniem szybko zmieniającego się ciągu cyfr jest od-truwanie katod wyświetlacza, które również

może być wykorzystane do kontroli stanu lamp. Należy zaobserwować czy na wyświe-tlaczu na pozycjach dziesiątek godzin poja-wiają się na przemian cyfry 0,1,2 na pozycji jednostek godzin i minut cyfry 0-9, oraz na pozycji dziesiątek minut cyfry 0-5. Jeśli zaobserwujemy brak świecenia którejś z cyfr lub świecące naraz dwie cyfry należy odłą-czyć zasilanie i zweryfikować poprawność montażu, prawidłowe działanie tranzysto-rów MMBTA42 oraz sprawność lamp LC513. Jeśli wszystko działa poprawnie po wykona-niu sekwencji odtruwania na wyświetlaczu powinna pojawić się godzina 0:00 oraz miga-jący dwukropek. Możemy również sprawdzić poprawność działania czujnika laserowego, oraz działanie układu audio. Przybliżając rękę do czujnika i zatrzymując w odległości większej niż 5 cm z głośnika powinniśmy usłyszeć sygnał dźwiękowy, a na wyświetla-czu powinna pojawić się data 1-01.

Eksploatacja urządzeniaZaprezentowany zegar do prawidłowej pracy wymaga smarthphona z systemem Android, gdyż bez dostępu do telefonu nie będziemy mieli możliwości ustawienia aktualnego czasu. Istnieje również możliwość napisa-nia dedykowanej aplikacji dla innego sys-temu np. iOS, czy komputera PC ponieważ protokół jest stosunkowo prosty i publicz-nie dostępny. (Zachęcam do tego czytelni-ków). W ostateczności możemy skorzystać terminala i wirtualnego portu szeregowego w systemie Windows czy Linux i wyma-gane komendy wpisać ręcznie. Aplikację dla systemu Android możemy zainstalować bezpośrednio ze sklepu Play korzystając z linku: https://play.google.com/store/apps/details?id=pl.boff.btc.nixieclockcontrol

na komputerze PC, lub bezpośrednio z „Play Store” w telefonie wyszukując aplikację „Nixie Clock Control”. Po uruchomieniu apli-kacji powinno pojawić się okno parowania z zegarem w oknie należy wpisać pin urzą-dzenia 00972 (rysunek 6). Po pomyślnym sparowaniu urządzenia powinniśmy zostać przeniesieni na ekran główny, dotyczący ak-tualnego czasu. Aby poprawnie zsynchroni-zować czas zegara z naszym telefonem należy wcisnąć przycisk SET (rysunek 7).

Po ustawieniu czasu możemy również w zakładce „Ustawienia” skonfigurować ja-sność wyświetlacza, na automatyczną pocho-dzącą z czujnika światła wciskając przycisk ON, lub ręczną przesuwając suwak jasności na odpowiednią pozycję, a następnie wysłać ustawienia wciskając przycisk SET (rysunek 8). Możemy również ustawić przedział go-dzinowy w jakim wyświetlacz będzie wy-gaszony, co przedłuża żywotność lamp, lub jest przydatne jeśli zegar przeszkadza pod-czas snu. Ustawienie wartości 0-0 spowoduje, że wyświetlacz będzie zawsze aktywny.

Codzienna eksploatacja zegara sprowa-dzać się będzie do korzystania głównie z za-kładki alarmów (rysunek 9), gdzie mamy możliwość zdefiniowania alarmu w cyklu tygodniowym. Co jakiś czas należy korygo-wać ustawienia czasu zegara uruchamiając aplikację i wciskając na ekranie głównym przycisk SET jeśli stwierdzimy, że zegar spie-szy lub spóźnia się. Z uwagi na precyzyjny generator kwarcowy nie powinno to mieć miejsca zbyt często. Aplikacja została zapro-jektowana tak, aby zapewnić współpracę się z kilkoma zegarami jednocześnie. Wybór ak-tywnego zegara jest możliwy dzięki zakładce „Paired devices”.

Lucjan Bryndza, EP

Rysunek 7. Okno główne Rysunek 8. Widok okna konfiguracyjnego

Androidowy zegar Nixie