czwartek, 23 października 2014

Frezowanie PCB na CNC

Każdy elektronik amator na pewno próbował kiedyś na własną rękę tworzyć płytki drukowane. Metoda termotransferu nie zawsze wychodzi, no i trzeba wiercić... Posiadając frezarkę CNC można bardzo prosto i szybko wytworzyć taką płytkę za pośrednictwem bardzo prostej wtyczki do programu Eagle. Wtyczka dostępna jest na ftp://ftp.cadsoft.de/eagle/userfiles/ulp/gcode_02.zip oraz na moim dysku google https://drive.google.com/file/d/0B-MlcGl3cPlodjhzT0xzcVFza1U/view?usp=sharing. Wtyczkę kopiujemy do folderu ULP znajdującym się w głównym katalogu programu Eagle. Gdy mamy gotową płytkę, wystarczy wybrać w Eagle z menu File -> Run ULP. Tam odnajdujemy wtyczkę gcode_02.ulp. Naszym oczom ukaże się coś takiego:
Interfejs tej wtyczki jest dziecinnie prosty i każdy powinien sobie z nim poradzić. Mamy tutaj 3 sekcje: frezowanie ścieżek (z opcją czyszczenia powierzchni), wiercenie, wycinanie płytki po konturze. Najlepiej jest wygenerować sobie 3 pliki osobno do każdej z tych czynności. Ja posiadając prostą frezarkę bez miernika wysokości narzędzia oraz bez automatycznej wymiany narzędzia właśnie tak robię. Wygenerowane pliki wrzucamy do maszyny i zaczyna się zabawa...
Wyfrezowana płytka wygląda po skończonej pracy bardzo ładnie, wszystko jest idealnie równe. Na filmiku można zobaczyć, że miałem tępego freza, niestety nie miałem pod ręką innego freza grawerskiego. Ale nawet tępym można wykonać precyzyjnie płytkę, wystarczy tylko ja później przejechać papierem ściernym. Wykonuję płytki tą techniką i jestem bardzo zadowolony. Warto zainteresować się tematem frezarek CNC. tych którzy chcą się wgłębić w temat zapraszam na forum - http://www.cnc.info.pl. Frezarkę do PCB można poskładać bardzo ale to bardzo tanio, konstrukcje zmontowane ze sklejki nadają się do tego idealnie. Poniżej filmiki z każdego etapu produkcji takiej płytki.


Zegar RTC oparty o DS1307

Zegar czasu rzeczywistego jest spotykany w praktycznie każdym urządzeniu. Dzięki zastosowaniu bateryjki, która podtrzymuje proces odmierzania czasu możemy go nastawić praktycznie raz na zawsze. Po odłączeniu urządzenia od zasilania i ponownym go włączeniu jesteśmy zawsze "na czasie". Układ DS1307 komunikuje się z mikroprocesorem po magistrali I2C. Do chipu wymagane jest podłączenie tak zwanego kwarcu zegarkowego o częstotliwości 32.768kHz. Niżej mały podgląd standardowej aplikacji tego układu:
Na rysunku widać na liniach SDA i SCL interfejsu I2C rezystory podciągające zwykle o wartości 4,7k. Warto zwrócić uwagę na bateryjkę, gdy będziemy ją wsadzać w gniazdo, żeby nie pomylić polaryzacji, chociaż przyznam się szczerze, że kiedyś fazie testów podłączyłem ją odwrotnie, układ wydaje się być na to odporny. 

Na długie lata wystarczy bateryjka taka jaka można spotkać na płytach głównych komputerów PC, czyli CR2032 o napięciu 3V. Tutaj pełny datasheet układu DS1307: http://datasheets.maximintegrated.com/en/ds/DS1307.pdf. Odnajdziemy w nim informacje w jaki sposób się z nim komunikować. Dowiemy się tam, że tryb write następuje po wybraniu adresu 11010000 a tryb read po wybraniu 11010001 co daje odpowiednio liczby 208 i 209. Później już po kolei możemy wpisywać lub odczytywać dane z zegara takie jak sekundy, minuty, godziny, dni, dni tygodnia, miesiące, lata itd. Możemy ustawic czas 12 lub 24-godzinny. Domyślnie jest to 24h. Układ sam koryguje lata przestępne więc nie musimy się niczym przejmować po tym jak ustawimy raz na początku godzinę i datę. Skoro bateria będzie trzymać kilka lat proponuję, aby najpierw wrzucić program który ustawia datę, a później program tylko do odczytu danych z DS1307. Tak więc ustawmy zegar !

$regfile = "m16def.dat"
$crystal = 4000000
$baud = 9600

Config Sda = Porta.2
Config Scl = Porta.1

Dim Sekundy As Byte
Dim Minuty As Byte
Dim Godziny As Byte
Dim Dzien As Byte
Dim Dzientyg As Byte
Dim Miesiac As Byte
Dim Rok As Byte

Sekundy = 0
Minuty = 24
Godziny = 16
Dzien = 4
Dzientyg = 23
Miesiac = 10
Rok = 14

Sekundy = Makebcd(sekundy)
Minuty = Makebcd(minuty)
Godziny = Makebcd(godziny)
Dzien = Makebcd(dzien)
Dzientyg = Makebcd(dzientyg)
Miesiac = Makebcd(miesiac)
Rok = Makebcd(rok)


I2cstart
I2cwbyte 208
I2cwbyte 0
I2cwbyte Sekundy
I2cwbyte Minuty
I2cwbyte Godziny
I2cwbyte Dzien
I2cwbyte Dzientyg
I2cwbyte Miesiac
I2cwbyte Rok
I2cstop

Wait 4
Printbin 12
Print "Zegar RTC"
Print "ustawiono zegar"

Do
Loop
End
 Teraz gdy zegar mamy już ustawiony wczytujemy program do odczytu i wyświetlania godziny, daty i dnia tygodnia. Użyłem wyświetlacza z poprzedniego wpisu na blogu, czyli VFD sterowany poprzez UART. Poniżej kod programu:
$regfile = "m16def.dat"
$crystal = 4000000
$baud = 9600

Config Sda = Porta.2
Config Scl = Porta.1

Dim Sekundy As Byte
Dim Minuty As Byte
Dim Godziny As Byte
Dim Dzien As Byte
Dim Dzientyg As Byte
Dim Miesiac As Byte
Dim Rok As Byte

Dim Ssekundy As String * 2
Dim Sminuty As String * 2
Dim Sgodziny As String * 2
Dim Sdzien As String * 3
Dim Sdzientyg As String * 2
Dim Smiesiac As String * 2
Dim Srok As String * 2

Dim Petla As Word

Wait 4
Printbin 12
Print "Zegar RTC"
Print "Krzysztof MLR"
Wait 2
Printbin 12

Do

Incr Petla
If Petla = 20000 Then

I2cstart
I2cwbyte 208
I2cwbyte 0
I2cstop
I2cstart
I2cwbyte 209
I2crbyte Sekundy , Ack
I2crbyte Minuty , Ack
I2crbyte Godziny , Ack
I2crbyte Dzien , Ack
I2crbyte Dzientyg , Ack
I2crbyte Miesiac , Ack
I2crbyte Rok , Nack
I2cstop

Sekundy = Makedec(sekundy)
Minuty = Makedec(minuty)
Godziny = Makedec(godziny)
Dzien = Makedec(dzien)
Dzientyg = Makedec(dzientyg)
Miesiac = Makedec(miesiac)
Rok = Makedec(rok)

Ssekundy = Str(sekundy)
Sminuty = Str(minuty)
Sgodziny = Str(godziny)
Sdzientyg = Str(dzientyg)
Smiesiac = Str(miesiac)
Srok = Str(rok)


Ssekundy = Format(ssekundy , "00")
Sminuty = Format(sminuty , "00")
Sgodziny = Format(sgodziny , "00")
Sdzientyg = Format(sdzientyg , "00")
Smiesiac = Format(smiesiac , "00")
Srok = Format(srok , "00")

If Dzien = 1 Then Sdzien = "Pon"
If Dzien = 2 Then Sdzien = "Wto"
If Dzien = 3 Then Sdzien = "Sro"
If Dzien = 4 Then Sdzien = "Czw"
If Dzien = 5 Then Sdzien = "Pia"
If Dzien = 6 Then Sdzien = "Sob"
If Dzien = 7 Then Sdzien = "Nie"


Print "ZegarRTC         " ; Sdzien;
Print Sgodziny ; ":" ; Sminuty ; ":" ; Ssekundy ; "  " ; Sdzientyg ; "." ; Smiesiac ; ".20" ; Rok;

Petla = 0

End If
Loop
End
  Teraz można się cieszyć funkcjonalnym zegarem. W kodzie programu użyłem kilka razy funkcji STR oraz FORMAT aby wygodniej wyświetlać informacje na wyświetlaczu, chodzi o to żeby liczby jak i nazwy dni miały stałą liczbe znaków, przykładowo zamiast 1.4.2014 będzie wyświetlać się zawsze 01.04.2014. Warto także wspomnieć, że funkcja PRINT bez znaku średnika na końcu zawsze wysyła na końcu znak CR (carriage return) co w niektórych przypadkach jest wręcz złośliwe, zwłaszcza, gdy chcemy wyświetlić znak na 20 (ostatnim) miejscu linii wyświetlacza. Efekt można podziwiać poniżej:
 

środa, 22 października 2014

Wyświetlacze VFD z kas fiskalnych, jak to ugryźć?...

Witam w moim pierwszym wpisie na blogu. Dziś zajmiemy się wyświetlaczami ze sklepowych kas fiskalnych. Wyświetlacze VFD zawsze budziły dreszczyk emocji wśród elektroników hobbystów, a już na pewno takich którzy mieli okazje programować mikrokontrolery. Wszyscy dobrze wiedzą też, że takie wyświetlacze oparte chociażby o popularny sterownik HD44780 nie są tanie. I tutaj dochodzimy do sedna. Nie dość że można tanio kupić wyświetlacz VFD z kasy fiskalnej to zazwyczaj jest on bardzo duży i ma standardowo 2x20 znaków. Świetnie ! Musimy też wiedzieć, że do takich wyświetlaczy zazwyczaj wykorzystuje się interfejs RS232, większość mikroprocesorów także posiada sprzętowy UART. Wszystko fajnie, tylko jak to podłączyć? Bez żadnej ingerencji w taki wyświetlacz potrzebowalibyśmy konwertera napięć TTL/RS232. Tylko, że to bez sensu. Po co konwertować napięcia TTL z mikroprocesora na RS232 skoro w wyświetlaczu jest kolejny konwerter tylko, że w drugą stronę? Logicznym wyjściem z sytuacji jest ominięcie konwertera napięć w wyświetlaczu. Ja zrobiłem to w ten sposób i działa znakomicie. Zwykle jest tak, że nie wiemy, jaki wyświetlacz nam się trafi, ale łączy je wspólna cecha czyli sposób wysyłania do nich informacji. Dzięki temu możemy dostosować do swoich mikroprocesorowych potrzeb każdy wyświetlacz. Generalnie pierwszym etapem jest odnalezienie pinów zasilających wyświetlacz. Można to zrobić na podstawie specyfikacji technicznej znalezionej w internecie. osobiscie przerobiłem dwa wyświetlacze. jeden z nich to IEE PC322 http://www.ieeinc.com/specs/PDK_0003_INOPML_REVC.pdf a drugi to VFD WD-202 http://www.eposintl.com/manual/Magnum%20%28WD%20202%29%20Customer%20Display%20Manual.pdf. Niestety, w obydwu przypadkach nie znajdziemy informacji o zasilaniu. Dlatego odnajdujemy charakterystyczne punkty na płytce, czyli masę układu, kondensatory filtrujące, w razie potrzeby szukamy datasheetu pierwszego lepszego układu na płytce, szukamy pinów zasilania i sprawdzamy czy zgadza się ze znalezionym przyłączem zasilania. Kolejnym krokiem jest odnalezienie pinu RxD. UWAGA - w niektórych specyfikacjach napisane jest na odwrót (TxD zamist RxD). Weryfikujemy wszystko po znalezieniu układu konwertera napięć RS232/TTL. U mnie wyglądało to tak:

Chip Sipex SP232ECT http://www.ecs.umass.edu/ece/tessier/courses/354/lab1/SP231A.pdf


Chip Intersil ICL232CB http://www.intersil.com/content/dam/Intersil/documents/icl2/icl232.pdf

Dosyć łatwo poznac te układy na płytce wyświetlacza, zapewne będą one zawierać liczbę 232 w swojej nazwie. Znaleźliśmy konwertery. Co teraz? Sprawdzamy który pin to wyjście RxD. Dla wyświetlacza WD-202 jest to nóżka numer 9. Teraz odłączamy nóżkę układu i do miejsca gdzie nóżka była przylutowana możemy podawać sygnał z mikroprocesora. Oczywiście nie tak od razu. Dla pewności proponuję podać sygnał poprzez rezystor 10kOhm i wsatwić diodę zenera 3,6V. Całość tej niewielkiej modyfikacji widać na zdjęciu wyżej przedstawiającym układ ICL232CB oraz jego okolice. Tutaj mały schemat:

Od strony procesora naturalnie podłączyć do TxD. Teraz wysyłając znaki poprzez UART bez problemu wyświetlimy teksty. Najpierw jednak konfiguracja. Teraz dużą pomocą będzie specyfikacja wyświetlacza. Mamy tam tabele znaków, tryby wpisywania tekstu, Wszystko co potrzeba. Komendy wysyłamy najczęściej binarnie lub hexadecymalnie. Przykładowy kod w popularnym BASCOM'ie:
$regfile = "m16def.dat"
$crystal = 4000000
$baud = 9600


Printbin 12        'czyszczenie wyświetlacza w hex jest to liczba 0C
Print "testowy napis"
Print "         druga linia"

Do
Loop
End
Program czyści wyświetlacz i wyświetla prosty napis, warto wspomnieć, że po każdym Print w Bascom'ie wysyłany jest znak CR (carriage return), dlatego automatycznie przechodzi do nowej linii. Efekty możemy podziwiać na wyświetlaczu:
Uważam, że takie rozwiązanie jest bardzo wygodne w późniejszym projektowaniu, ponieważ wykorzystujemy tylko jedna linie procesora do sterowania wyświetlaczem tekstowym, nie trzeba stosować specjalnych bibliotek do wyświetlaczy. Cena jest zadowalająca, ten ze zdjęcia kosztował 40 zł, a użyteczna powierzchnia wyświetlania ma 176x39mm.