Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

LABVIEW: Komunikacja za pomocą RS232 z Atmel Mega

Używając labview w domu natrafiamy na podstawowy problem jakim jest brak sprzętu. Karty pomiarowe to niezwykle drogie urządzenia jak na domowe warunki. Dlatego pozostaje nam programowa emulacja która jednak jest mało ekscytująca lub użycie urządzeń które już posiadamy(wcześniej przedstawiona karta dźwiękowa) lub które możemy zbudować sami za małe pieniądze. Aby zbudować takie urządzenie możemy wykorzystać tanie mikrokontrolery 8-bitowe np. Atmel Mega 32 w cenie około 28 zł. Wyposażony jest on w porty wejścia/wyjścia i przetworniki analogowo-cyfrowe(zakres od 0-5V, dokładność 10 bit). Aby skomunikować się z labview wykorzystamy interfejs RS232.

UWAGA! Wpis ten wymaga podstawowej wiedzy czytelnika w zakresie programowania mikrokontrolerów i labview.

RS232

Rs232 jest interfejsem przeznaczonym do komunikacji na dość krótkie odległości, kiedyś był on powszechnie stosowany w komputerach PC obecnie aby użyć tego protokołu potrzebna jest nam przejściówka rs232-usb(w cenie około 50 zł).

r   e   k   l   a   m   a

Interfejs RS232 działa przy napięciu 12 V z kolei Atmel Mega przy napięciu 5V. Aby umożliwić komunikację konieczne jest zastosowanie układu MAX232.

Elektronika

Ponieważ portal dp nie jest typowo elektroniczny, opis układu jest skrócony ,a program mikroprocesora pokazany jako schemat blokowy dodatkowo podam linki dla mniej zorientowanych a zainteresowanych częścią programową(w języku C).
Układ jest dość prosty składa się tylko z mikrokontrolera Atmel Mega32, MAX232 i przejściówki RS232<=>USB.

Jak można zauważyć napięcie odniesienia(AREF) jest jednocześnie napięciem zasilania. W tym przypadku 5V co oznacza że korzystamy z pełnego zakresu pomiaru napięcia od 0-5V. Układ MAX232 podłączamy do pinów 15 i 14 mikrokontrolera, piny te odpowiadają za mechanizm USART czyli komunikację RS232. Dodatkowo wymagane są kondensatory 1u przy MAX232 aby nie uszkodzić układu. Jak można zauważyć wejścia ADC(Piny od 40 do 33) „wiszą” w powietrzu, zrobiłem to celowo ponieważ działają one jak antena i łapią jakąś wartość, w przypadku testu nie ma to znaczenia.
Sam program przedstawia się następująco.

Więcej informacji na temat programowania w języku C i konkretnych mechanizmów można znaleźć na:


  • http://www.avrfreaks.net/
  • http://extremeelectronics.co.in/
  • Dokumentacja

Labview

Zanim przejdziemy do tworzenia kodu konieczne jest ściągnięcie z stron NI sterownika NI-VISA,http://sine.ni.com/psp/app/doc/p/id/psp-411/lang/en
Ponieważ programy zrobione w LabView są dość trudne w opisie oprócz opisu tekstowego zamieściłem na końcu .gif pokazujący etapy.
Aby ułatwić sobie pracę skopiujmy kawałek programy z przykładu dostarczonego z labview. Otwieramy wyszukiwarkę przykładów i wyszukujemy Basic 2 Serial Write and Read.vi . Otwieramy BlockDiagram i kopiujemy elementy takie jak(tylko po jednym): timeout(10sec),baudrate(9600),data bits(8),parity(0:none),stop bits,flow control,VISA resource name(writes),VISA serial. Tyle wystarczy, w ten sposób zaoszczędziliśmy sobie żmudnego szukania paru elementów interfejsu. Po przejściu do Front Panel zobaczymy że pojawiło się sporo nowych elementów(element VISA reource name służy do wyboru portu) ale musimy jeszcze wstawić: String Control ,3xString Indicator,Numeric Control i przycisk stopu.
Po wstawieniu elementów w Front Panel wracamy do Block diagram. Na razie są tam tylko elementy skopiowane z przykładu i dołożone przez nas w Front Panel. Jak można zauważyć do skopiowanego wcześniej bloku VISA Configure Serial Port wchodzi wiele wejść. W zasadzie większość nas nie interesuje i nie wymaga jakiej kol wiek zmiany, są one związane z parametrami samego połączenia i są powiedzmy dość standardowe. Wartym wspomnienia jest parametr baud rate tu domyślnie z wartością 9600. Otóż mówi on z jaką prędkością odbywa się transmisja. Jego wartość będzie zależała od tego z jaką prędkością komunikuje się nasze urządzenie. W przypadku mojego mikrokontrolera(zegar wewnętrzny 8 Mhz UBRR=51) jest to także 9600 bps. Wracając do samego bloku służy on do stworzenia połączenia z portem rs232.



Teraz musimy(mój program mikrokontrolera zakłada pytanie-odpowiedź) wysłać jakieś dane do naszego mikrokontrolera. W tym celu musimy użyć bloku VISA Write Function, do jego wejścia VISA resources name podłączamy wyjście bloku VISA Configure Serial Port o nazwie VISA resources name out analogicznie ma się sprawa z error in i out. Teraz konieczne jest wskazanie blokowi co musi zapisać. Aby to osiągnąć łączymy wcześniej stworzony String Control(nazwijmy go string to write) z wejściem write buffer a wyjście return count łączymy z String Indicator(pokaże nam ile bajtów zapisano nazwa: bytes to wrriten). Teraz mając tak zrobiony kawałek kodu zróbmy pętlę while i flat sequence. Pętlą While obejmiemy wszystko oprócz tego co skopiowaliśmy z przykładu. Następnie wybieramy flat sequence w którego obrębie zawiera się tylko VISA Write Function, String to write i bytes wrriten. Teraz prawym przyciskiem myszki kliknijmy na flat sequence i wybierzmy Add frame after, po prawej stronie pokaże się nam kolejna ramka. Ta konstrukcja oznacza że kolejne ramki będą się wykonywać sekwencyjnie(czyli jedna po drugiej). Do nowo stworzonej ramki dodajmy Wait (ms) Function i numeric constant o wartości 10(podłącz do wejścia bloku wait), następnie stwórz kolejną ramkę po tej. Blok wait oznacza iż program będzie czekał określoną liczbę ms. Użyłem opóźnienia aby mieć 100% pewność że układ zdąży z pomiarem i wysłaniem dnych do komputera. Teraz przechodzimy do kolejnej ramki. W której umieszczamy VISA Read Function,Visa Close Function i Simple Error Handler. Dodatkowo przenosimy także wcześniej stworzone(i nie podłączone nadal) String Indicator, Numeric Control i przycisk stopu. Obiekt Numeric(nazwa bytes to read) mówi o tym ile bajtów trzeba przeczytać, podłączamy do wejścia byte count. Liczba bajtów zależy od tego z ilu bajtów składa się odpowiedź z mikrokontrolera, ponieważ moje wyjścia wiszą układ mierzy zazwyczaj powyżej 10 jednostek(1 jednostka równa 5 V/1024) ale mniej niż 40. Dlatego pobieram dwa bajty(bo np. liczba 10 składa się napisów '1' i '0'). Gdyby jednak wysłano tylko jeden bajt program poczeka 10 sekund po czym dojdzie do timeout i ruszy dalej jednak zgłosi błąd i zwróci tylko ten jeden przeczytany bajt.

Dwa ostatnie bloki String Indicator nazwijmy read string i bytes read. Pierwszy wyświetla napis jaki przyszedł od mikrokontrolera a drugi ile bajtów przeczytano. Podłączmy read string to wyjścia read buffer a bytes read do return count. Teraz wróćmy do bloku VISA Write Function, z jego wyjść Visa Resources Name Out i error out ciągniemy połączenie do wejść bloku VISA Read Function(visa resources name i error in). Blok Visa Close Function służy do zamknięcia połączenia jednak my chcemy zamknąć je tylko w wypadku przyciśnięcia przycisku stop. W takim wypadku odnajdujemy Case Structure i zamykamy w niej tylko blok Visa Close Function. Wejściem bloku jest wyjście przycisku stop(przycisk stop połącz także z warunkiem zakończenia pętli while). Pamiętaj aby blok close znalazł się tylko w części bloku case o wartości True. Następnie z wyjścia Visa Resources Name Out i error out bloku VISA Read Function ciągniemy linie do bloku close. Następnie z wyjścia error out bloku Close ciągniemy przewód do Simple Error Handler. Wróćmy jeszcze do Case i ustawmy warunek dla False. W przypadku gdy wartość jest False czyli przycisk stopu nie wciśnięty to łączymy w środku Case error out VISA Read Function z wejściem error in bloku Simple Error Handler.

Ponieważ opis jest dość skomplikowany poniżej znajduje się gif.
GIF

Podsumowanie

Wiedząc jak działa komunikacja tak naprawdę ogranicza nas wyobraźnia. Możemy zapalać diody, sterować silnikiem, wizualizować stan czujników(np. Temperatury) itd.  

sprzęt oprogramowanie programowanie

Komentarze