Monday, July 23, 2012

teraterm - terminal portu COM i socketów


Namówiłem Karola żebyśmy połączyli siły i zrobili aplikację embedded z interfejsem webowym, współpraca zapowiada się znakomicie bo mamy uzupełniające się kompetencje. Karol zawodowo zajmuje się sklepami internetowymi a próbkę jego możliwości można zobaczyć tutaj http://www.autogas-lpg.pl/ . Część sprzętowa to będzie moduł GSM i mikrokontroler z całą armaturą dookoła, pisząc galanteria mam na myśli elementy zasilające, interface czy też raczej sygnalizację stanu, obudowy...
Robimy proste doświadczenia dotyczące styku pomiędzy serwerem a modułem GSM. Mamy dwóch faworytów:

  1. metoda POST/GET
  2. surowe dane przesyłane socketami

Oba sposoby mają wady i zalety. POST jest prosty do wytłumaczenia webowcom, każdy od razu wie o co chodzi i nie ma problemu z hostingiem. Problemem posta jest duży narzut na protokół, nie można po prostu przesłać bajtu do serwera bo każdą daną trzeba opakować w nagłówek POSTa, post siłą rzeczy jest tekstowy co rodzi dodatkowe problemy. Socket za to daje pełną swobodę, socket pod względem trudności obsługi po stronie modułu GSM jest porównywalny z przesyłaniem danych uartem. Można wysłać i pojedynczy 8-bitowy znak ale jest problem: Serwer musi być uruchomiony jako osobna maszyna - żaden zdrowo myślący administrator nie pozwoli wystawić otwartych socketów. Cały protokół trzeba budować od początku.
Narazie dostałem od Karola namiar na serwer który przyjmuje dane metodą POST, zanim zaimplementuję POSTy na module GSM postanowiłem przećwiczyć składnię wysyłając "recznie" składane requesty terminalem teraterm. Teraterm jest to Ferrari wśród terminali - dostarcza prosty język dzięki któremu nie trzeba klikać za każdym razem i wklejać danych do wysyłki. Teraterm jest dostępny tutaj http://logmett.com/index.php?/download/tera-term-474-freeware.html a opis języka skryptowego tutaj http://ttssh2.sourceforge.jp/manual/en/macro/index.html . Poniżej wklejam prościutki skrypt który wysyła dane metodą POST. Jak widać teraterm ma problem ze znakami końca lini, funkja sendln nie dołącza CR LF, ale można sobie z tym poradzić, liczę na to że w następnej wersji będzie lepiej.
changedir 'c:\'
logopen 'test.log' 0 1


while 1
connect 'test.someserwer.pl:80 /T=0 /LA=U'
setecho 1
send 'POST /arek01/www/add.html HTTP/1.1'
send 13
send 10
send 'Host: test.halaba.com.pl'
send 13
send 10
send 'Connection: keep-alive'
send 13
send 10
send 'Origin: http://test.halaba.com.pl'
send 13
send 10
send 'Content-Type: application/x-www-form-urlencoded'
send 13
send 10
send 'Content-Length: 26'
send 13
send 10
send 13
send 10
send 'urzadzenieId=nazwa2&data=2'
send 13
send 10
pause 2
disconnect 0


endwhile
Ważna uwaga:
/T=0
w skrypcie zmusza teraterm do otwarcia zwyklego socketa, w przeciwnym razie teraterm będzie próbował połączyć się protokołem telnet.
Składnia jest toporna ale można przywyknąć. Czas spędzony na nauce języka zwróci się co spróbuję udowodnić w jednym z kolejnych postów pokazując jak można wygodnie rozparsować odpowiedź otrzymaną przez port COM. Język skryptowy teraterm pozwala przetestować algorytm odpalając go na PC zamiast na docelowej platformie. Na sprzęcie musi działać tylko wysyłka, odbiór i interpretacja poleceń odebranych portem COM a cała "logika" zostaje zamknięta w skrypcie. Lubię teraterm w sytuacjach kiedy trzeba robić długotrwałe testy z generowaniem wydarzeń co pewne odcinki czasu - zamiast siedzieć ze stoperem w ręku przez godzinę - uruchamiam skrypt i mogę iść na kolejną obowiązkową przerwę kawową...

Friday, July 20, 2012

ImageMagick mogrify - zmniejsz tysiąc bitmap

Coś co dla programistów webowych jest standardem dla branży embedded wcale nie musi. Mój przyjaciel oprogramował sterownik z wyświetlaczem graficznym. Graficzność sterownika sprowadza się do szybkiego przemiatania bitmapami odczytanymi z karty pamięci. Zasoby mikrokontrolera są skromne dlatego nie ma czasu na finezyjne dekompresowanie w locie, wszystko co możliwe jest przygotowane wcześniej i zapisane na karcie. Graficy dostarczyli mu pliki w rozmiarze niedopasowanym do rozdzielczości wyświetlacza więc mój kolega pracowicie zmienił rozmiar grafik otwierając każdy plik w paincie w którym to robił również przycięcie i dorysowywał kilka prostych kształtów. Przygotowanie grafik dla jednej wersji językowej zajmowało ponad godzinę.
Rozwiązaniem problemu okazał się pakiet ImageMagick i program mogrify z tego pakietu. Wywołany z konsoli program potrafi przycinać, skalować, filtrować grafiki, dodawać napisy i proste kształty a nawet wstawiać grafiki w grafiki, scalać wiele plików w jeden, co najważniejsze może tę samą operację przeprowadzić na dowolnej liczbie plików, po prostu zamiast nazwy konkretnego pliku np ekran.bmp wystarczy podać mu *.bmp żeby program przerobił wszystkie pliki z folderu.
Poniżej dwie linijki ze skryptu do przerabiania grafik:
mogrify -crop 800x405+0+75 -geometry 320x162 *.bmp wycina z pliku obszar o rozmiarze 800x405 pikseli przesunięty o 75 od górnej krawędzi - odcina górny pasek o szerokości 75 pikseli a następnie zmienia rozmiar pliku na 320x162 pikseli. Ta operacja jest przeprowadzana na wszystkich plikach .bmp w folderze z którego został wywołany program mogrify.
mogrify -fill transparent -stroke red -strokewidth 1 -draw "roundRectangle 1,35 319,127 5,5" *pro1.bmp dorysowuje do pliku przezroczysty prostokąt o zaokrąglonych rogach. Krawędź tego prostokąta ma grubość 1 i kolor czerwony, współrzędne dwóch rogów to 1,35 (x1,y1) oraz 319,127(x2,y2) zaokrąglenia mają promień 5 pikseli w obu osiach. Zmiany zostają naniesione na wszystkie pliki których nazwa kończy się na pro1.bmp
Mogrify potrafi znacznie więcej, żeby przekonać się o tym pobierz (darmowy!) pakiet ImageMagick z http://www.imagemagick.org/ a następnie w konsoli (np. windowsa, ja korzystam z windowsa) wpisz mogrify żeby przejrzeć listę możliwych opcji, polecam też http://www.imagemagick.org/www/mogrify.html .

Tuesday, July 17, 2012

Światła do jazdy dziennej 1

Narysowałem schemat i projekt PCB prostego sterownika świateł do jazdy dziennej. Wszyscy wiemy że tak zwany "automat" który można kupić na aukcjach internetowych to tak naprawdę przekaźnik. Ja nie chcę przekaźnika - fantazja poniosła mnie i postanowiłem dodać następujące, mniej lub bardziej przydatne funkcje:
-włączanie świateł wyzwolone wzrostem napięcia w instalacji (po odpaleniu silnika samochodu alternator zaczyna ładować akumulator co skutkuje łatwym do zmierzenia wzrostem napięcia zasilającego)
-opóźnione wyłączenie świateł po zgaszeniu silnika
-włączanie świateł na zaprogramowany czas po otwarciu samochodu pilotem od alarmu (sterownik alarmu miga wszystkimi kierunkowskazami, mój sterownik świateł rozpoznaje taką sytuację i włącza światła do jazdy dziennej na pół minuty)
-funkcja odprowadzania do domu: jeżeli zgasisz silnik i migniesz światłami postojowymi to sterownik włączy światła do jazdy dziennej na 2 minuty. Użytkownik zdąży w tym czasie wysiąść, zamknąć samochód i bezpiecznie dojść oświetlonym podjazdem do drzwi domu. Gdyby światła zgasły za szybko można włączyć je ponownie przez wyłączenie i włączenie alarmu pilotem.
-światła są płynnie rozjaśniane i ściemniane przy włączaniu i wyłączaniu a to za sprawą sterowania PWM
Schemat:

Idea działania sprowadza się do pomiaru napięcia zasilającego (do tego jest dzielnik R2,R3) i sprawdzaniu czy na liniach zasilających kierunkowskaz i światła postojowe jest zasilanie czy nie. Nie można podłączyć wprost sygnałów 12-woltowych do wejść mikrokontrolera stąd R1, R8, D2 i D3.
Projekt PCB udało się upchać na zgrabnej, jednostronnej płycie:
PCB zamówiłem tydzień temu, dzięki bardzo małym wymiarom (około 14 na 40[mm]) i długiemu terminowi realizacji (14 dni roboczych) 3 sztuki PCB kosztują wraz z wysyłką mniej niż 40zł. 
Na PCB umieściłem złącze programowania zgodne z PICkitem 2. Nauczony doświadczeniem ze wskaźnikiem AFR (inny projekt - również zasilany z instalacji samochodowej) wybrałem stabilizator napięcia  (bo jakiś stabilizator jest potrzebny żeby zasilić mikrokontroler) z bardzo małym prądem spoczynkowym -quiescent current MCP1701 wynosi około 2uA. Prąd spoczynkowy 78L05 jest jakieś 1500 razy większy i chociaż to pojedyncze miliampery to jednak zdecydowałem się na MCP1701, miłą cecha tego stabilizatora jest niska cena i mała obudowa - SOT23
PCB zostało zaprojektowane z myślą o umieszczeniu układu w koszulce termokurczliwej, jak do tej pory takie rozwiązanie sprawdza się kiedy nie ma groźby bezpośredniego zalania układu.