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ł).

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

0 nowych
Limak   6 #1 09.02.2012 12:22

Ale nakomplikowales z tym polaczeniem - przejsciowka usbrs232 za 50zl a do tego uklad MAX232 ktory jest przejsciem rs232usart, a nastepnie usart do pinow atmegi...nie prosciej i taniej zastosowac FTDI FT232RL (lub podobny) ktory jest przejsciem usbusart i na allegro kosztuje 25zl? Gotowa przejsciowka zbudowana na tym chipie, bo sam chip oczywiscie tanszy jeszcze. Mozna tez wziac kabel z noki DKU-5 lub CA-42, bo tam podobny konwerter jest (pl0205 chyba, czy jakos tak), a na allegro 15zl kosztuje. No i caly schemat bedzie prostszy - wlasciwie to nie ma nawet co rysowac - kabel usb do ft232rl, a z przejsciowki pin tx do rx atmegi i na odwrot. Koniec:P mozna jeszcze Vcc i GND sobie z przejsciowki podpac bezposrednio oczywiscie.

revcorey   7 #2 09.02.2012 12:32

Przejściówkę kupiłem dawno temu jak dopiero się zacząłem interesować elektroniką stąd korzystam z max232. :) Ale tak masz rację można też tak.

mario@   4 #3 09.02.2012 12:34

Parę małych uwag :)

"[...]Układ jest dość prosty składa się tylko z mikrokontrolera Atmel Mega32, MAX232 i przejściówki RS232USB.[...]"
Przy korzystaniu z np. FT232 nie trzeba używać max232.

"[...]obecnie aby użyć tego protokołu potrzebna jest nam przejściówka rs232-usb(w cenie około 50 zł).[...]"
Wspomniany wcześniej układ FT232 kosztuje z 12zł + drobnica (3zł ?), więc do 50zł bardzo daleko. A rozwiązanie wygodniejsze przy braku portów szeregowych (sprzętowo) - porty usb są obecnie w każdym komputerze.

"[...]Dodatkowo wymagane są kondensatory 1u przy MAX232[...]"
Warto by podawać pełne jednostki.

"[...]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.[...]"
Mam zastrzeżenia co do połączenia aref do vcc, bezpieczniej byłoby ustawienie odpowiednio REFS1 - REFS0 a aref do masy przez kondensator (ale to już jak kto woli). Warto by także wstawić filtr przy AVCC (można sprawdzić w dokumentacji).

Opis zastosowania programu Labview pominąłem - najpierw to trzeba go posiadać :).

revcorey   7 #4 09.02.2012 12:38

"Mam zastrzeżenia co do połączenia aref do vcc, bezpieczniej byłoby ustawienie odpowiednio REFS1 - REFS0 a aref do masy przez kondensator (ale to już jak kto woli). Warto by także wstawić filtr przy AVCC (można sprawdzić w dokumentacji)."
Pełna zgoda. Normalnie w układzie stosuje kondensatory, co więcej mały dławik 100 mH można stosować(przy AVCC). I to jest potrzebne żeby dziwne rzeczy się nie działy, ale ja tylko chciałem pokazać jak się połączyć a co tam odczytuje to mniejsza z tym.

revcorey   7 #5 09.02.2012 12:40

Dodam jeszcze głównym tematem jest Labview, elektronika chociaż oczywiście ważna tu jest na drugim planie.

robert-km   4 #6 09.02.2012 13:17

Niestety w schemacie blokowym programu calkowicie sie pogubilem :P
Mysle, ze powinienes go narysowac od nowa.
Z bloku "Oczekiwanie" nie powinny wychodzic 2 strzalki poniewaz nie jest to blok decyzyjny.

revcorey   7 #7 09.02.2012 13:28

@robert-km
Zastanawia mnie tu właśnie jak to zrobić, ja używam przerwania do obsługi RS232. Blok oczekiwanie to nic innego jak wieczna pętla while,pusta w środku.

robert-km   4 #8 09.02.2012 19:36

Jezeli to rzeczywiscie jest przerwanie, to powinno byc tylko napisane, ze jest inicjowane i osobny algorytm obslugi.
Jezeli algorytm co chwile sprawdza stan bitu (co jest kiepskim rozwiazaniem, ze wzgledu na to, ze mikrokontroler bedzie pracowal na duzej mocy nie robiac praktycznie nic), to tam powinno byc to zrobione w ten sposob, ze sprawdzamy, czy bit sie zmienil (przerwanie), jezeli nie, to Oczekiwanie i z tego strzalka do powrotu do instrukcji warunkowej, stamtad osobne wyjscie, na stan 'PRAWDA' i wtedy rysujesz reszte.

Troche pomieszalem, wiec jezeli tego nie zrozumiales, to postaram sie narysowac o co mi chodzilo.

revcorey   7 #9 09.02.2012 20:03

Do obsługi używam wektora przerwania USART_RXC_vect . Wiem o co ci już chodzi.
Swoją drogą zawsze mnie dziwiło dlaczego w dokumentacji Atmel nie używa przerwania do obsługi rs232.
Poprawki naniosę jutro obecnie jestem trochę zajęty.

McDracullo   17 #10 09.02.2012 21:21

""[...]Układ jest dość prosty składa się tylko z mikrokontrolera Atmel Mega32, MAX232 i przejściówki RS232USB.[...]"
Przy korzystaniu z np. FT232 nie trzeba używać max232."
Też mi się tak właśnie wydawało ;D

""[...]obecnie aby użyć tego protokołu potrzebna jest nam przejściówka rs232-usb(w cenie około 50 zł).[...]"
Wspomniany wcześniej układ FT232 kosztuje z 12zł + drobnica (3zł ?), więc do 50zł bardzo daleko. A rozwiązanie wygodniejsze przy braku portów szeregowych (sprzętowo) - porty usb są obecnie w każdym komputerze."
Obecnie każdy komputer wyposażony jest w port szeregowy - USB jest właśnie takim portem.

Limak   6 #11 09.02.2012 22:17

McDracullo: niestety ft232 nie ma w PDIPie, a ciężko to kolbową lutownicą przylutować, dlatego polecam za 25-30zł kupić już na płytce z goldpinami, oraz drobnicą i gniazdem USB ;) Chyba, że ktoś ma wprawę lub hot-air.

McDracullo   17 #12 09.02.2012 22:41

@Limak - a tam ciężko ;) Widziałem ludzi, którzy transformatorówką z gigantycznym grotem (gruby jak cholera ;) ) lutowali takie rzeczy ;)

PS. O ile Atmegi programować lubię (lub muszę lubić :P ) to z labview nie lubię mieć doczynienia ;)

Limak   6 #13 09.02.2012 23:16

hehe, wiem, że są tacy ludzie, ale jak dla mnie ft232 i te jego mikroskopijne odleglosci pomiedzy pinami to szczyt - co innego attiny45/85 w smd ktora ma duze odleglosci miedzy nozkami, albo TQFP32, bo to spokojnie mozna polutować cienkim grotem.

P.S: Ja z labview tez nie mialem doczynienia.

revcorey   7 #14 10.02.2012 00:00

@McDracullo
Czasami jak coś się robi w labview a programowało się w jakimś C, to człowiek fakt może się zdenerwować bo pewne rozwiązania wydają musie być proste w C i aż by się chciało machnąć kawałek kodu a tu w labview trzeba się na machać z drugiej strony dość upraszcza tworzenie interfejsów i analizę sygnałów, czyli mówiąc krótko czasami proste czynności są pod górkę z kolei inne z górki. Pisałem taki program w javie(używałem jfreechart) trochę się nagłowić musiałem ze wszystkim(wiele wątków) z kolei w labview takie coś szło by ekspresem zrobić.

  #15 10.02.2012 09:42

Nie przeczę, na pewno niektóre rzeczy idzie zrobić prościej i szybciej, ale poprostu nie mogę sie przemoc do LabVIEW. Języki graficzne - ok, ale samo LabVIEW wywołuje u mnie napady agresji :P
Jeszcze jedną sprawa - samo znienawidzone przeze mnie LabVIEW umożliwia również w pośredni sposób zwrócenie kodu w C. :) może warto o tym napisać :)
Jest już tyle wpisów o LabVIEW. A co z simulinkiem?

revcorey   7 #16 10.02.2012 10:55

@McDracullo
Labview potrafi też przetworzyć kod matlaba :)
Co do simulinka zastanawiam się od dłuższego czasu ale chyba zwrócę się w stronę xcos(w scilab) chodzi o to że darmowe, myślę że najpierw pokażę jak rozwiązywać równania różniczkowe a później przykład. Może kiedyś w simulinku pokaże prosty silnik prądu stałego.

Mr.J   1 #17 10.02.2012 11:24

Ja tak jeszcze tylko wtrącę swoje 3 grosze co do wyższości układów FTDI nad max232 w przypadku LabView.
Mianowicie sporym atutem FTDI jest udostępnianie bibliotek dla LabView (trzeba poszukać na stronie producenta- np. tutaj są przykłady użycia: http://www.ftdichip.com/Support/SoftwareExamples/CodeExamples/LabVIEW.htmDLL ) z gotowymi funkcjami do obsługi FT232.
Czyli w zasadzie zbędne staje się w ogóle korzystanie z biblioteki VISA. Trzeba jedynie zainstalować sterowniki dla swojego układu.

revcorey   7 #18 10.02.2012 13:17

@MrJ warto wiedzieć o VISA choćby ze względu na to że podłączysz jakiekolwiek urządzenie z rs232 i tylko ściągasz z niego dane za pomocą tego interfejsu.

mario@   4 #19 10.02.2012 15:21

@McDracullo
"Obecnie każdy komputer wyposażony jest w port szeregowy - USB jest właśnie takim portem."
Co racja to racja - ale wiadomo o jaki port chodziło autorowi wypowiedzi :)).

  #20 12.02.2012 18:47

Właśnie się tak zastanawiam, nieco pokątnie głównego tematu. Czemu na DP nie ma programu KiCAD? Przecież to dość dobry program EDA OpenSource. W dodatku ma swoje porty i na Windows, i na Linux-a, a także MacOS-a...

  #21 19.11.2013 11:27

revcorey, bardzo ciekawy przykład!

Pokazuje sposób rozwiązania bardzo częstego problemu - jak w prosty sposób przeanalizować dane z systemu mikroprocesorowego na komputerze PC i potem np. wysłać je z powrotem lub utworzyć interfejs graficzny. A odnośnie do Matlaba - jest dostępna biblioteka do obsługi procesorów ST i utworzenia "Processor-in-the-loop": http://www.mathworks.com/hardware-support/stmicroelectronics.html

revcorey   7 #22 23.11.2013 13:10

Używanie embbeded coder ma tak naprawdę sens w przypadku mocniejszych procesorów poniewąż po prostu kod C generowany raz że jest bardzo słabo zrozumiały dla człowieka to dwa nie jest zbyt optymalny. Na procesorze sygnałowym texasa nie udało mi się zmusić EC do bezproblemowej współpracy i wolałem już z ręki napisać w C cały kod do mojej pracy mgr.

niedzia   1 #23 09.12.2013 00:20

hej, nie jestem zbyt ogarnięta w tym temacie ale potrzeba mi właśnie komunikacji za pomocą RS232 z atmega8... jak miało by to dokładnie wyglądać za pomocą kabla usb do ft232rl? pomoże ktoś ?

  #24 20.06.2014 02:59

Witam. Czy autor mógł by i zechciał udostępnić wsad i kody do procesora oraz do programu do Labview?

revcorey   7 #25 20.06.2014 20:40

Wrzucałem chyba na skydrive ale chyba złe archiwum wgrałem. Jak wrócę z podróży służbowej to poszukam.