Raspberry Pi
47) Sériová komunikace přes RS232
(připojení multimetru METEX
M-4640A k RasPi)
1) Základní informace o RS232
Raspberry Pi má v základním systému zabudovanou podporu pro komunikaci RS232.
Tato komunikace se používá pro přenos dat mezi počítačem a nějakým dalším zařízením (například multimetrem).
Také je možné přenášet data mezi dvěma počítači.
Detailní informace o této komunikaci si můžete přečíst třeba tady:
http://cs.wikipedia.org/wiki/RS-232
2) Převodník ADM3232E
RasPi má komunikační linku vyvedenou na piny GPIO14
(pin 8 na GPIO konektoru) a GPIO15 (pin 10).
Jediným problémem je to, že RasPi pracuje s napěťovými úrovněmi 3,3V, ale RS232
potřebuje ke své činnosti napětí vyšší ( například +6V a -6V).
Existují ale specializované obvody, ke kterým stačí připojit napájení 3,3V a několik kondenzátorů.
Tyto obvody se pak o generovaní +/-6V starají samy.
Já jsem pro pokusy použil obvod ADM3232E od firmy Analog Devices, který má tu výhodu, že pracuje s napájecím napětím 3,3V (Logické signály na straně k RasPi jsou tedy také třívoltové) a k činnosti mu stačí jen 5 vnějších kondenzátorů.
Obvod má celkem 4 kanály - dva výstupní (Raspi jimi může posílat data k připojenému zařízení) a dva vstupní (Na nich RasPi může přijímat data , které odesílá připojené zařízení)
Pro vysílací kanály se používá označení TxD (Transmitted Data)
Přijímací kanály se označují RxD (Received Data)
Obvod ADM3232 má také ochranu proti zkratu na vnějších vývodech - při zkratu přes tyto piny nepoteče více než 15mA.
Přesný popis funkce naleznete v katalogovém listu, ale v jednoduchosti to funguje takto:
Pokud se na některý vysílací kanál vyšle z RasPi logická "0", přepne se
výstup tohoto kanálu na +6,5V
Když se na vysílací pin přivede logická "1" (3,3V), přepne se výstup obvodu na -6,5V.
Na přijímacích kanálech to funguje stejně:
Když od vnějšího zařízení přijde po komunikačním kabelu -6V, přepne se přijímací pin na straně RasPi do logické "1".
Pokud ze zařízení přijde kladné napětí (+6V), přepne se přijímací pin na RasPi do logické "0"
Detaily a katalogový list: http://www.analog.com/en/interface-isolation/rs-232/adm3232e/products/product.html
POZOR:
Velice často se v návodech na internetu můžete setkat s obvodem MAX232.
Má stejnou funkci a dokonce i stejně zapojené vývody, jako zde
popisovaný ADM3232, Rozdíl je však v tom, že pracuje s 5V logickými
úrovněmi. Proto je pro RasPi nevhodný.
3) Specifikace přenosu pro multimetr Metex M-4640A
Aby bylo možné zprovoznit komunikaci, je třeba
zjistit, v jakém formátu a jakou rychlostí odesílá připojené zařízení
data.
V případě multimetru Metex to bylo jednoduché. Všechny potřebné
informace (dokonce i s jednoduchým přikladem) byly v návodu:
Naskenované stránky z manuálu, na kterých je popsána
komunikace
4) Schéma připojení METEXu k RasPi přes převodník
ADM3232E
S multimetrem jsem musel řešit jiný problém:
Když jsem ho připojoval jen pomocí 3 vodičů (TxD, RxD a
GND), pořád se mi nedařilo komunikaci rozchodit. Multimetr neodesílal
žádná data. Tak jsem ho zkusil připojit k normálnímu PC a použil jsem
originální program pro záznam měření.
Na PC to všechno šlapalo, jak má.
Proměřil jsem i ostatní vývody a zjistil jsem, že aby Metex začal odesílat data, musí mít na vývodu
DTR napětí +6,5V.
Vytvořit 6,5V bylo na převodníku ADM3232 jednoduché. Stačilo jen využít druhý TxD kanál
(T2in), který se na straně RasPi nastavil na "0". Tím se na výstupu převodníku objevilo napětí 6,5V.
Pak už začal Metex komunikovat i s RasPi.
Všimnul jsem si, že na vývodu RTS také probíhají nějaké impulzy. Je to pravděpodobně signál od
multimetru, že začíná posílat data.
Nikdy jsem ale ten signál nepoužil - přenos funguje i bez něj.
Na vývody T1in a R1out je možné připojit LED diody.
Když probíhá komunikace je pak vidět jejich krátké problikávání
()
.
5) Příprava systému
Ke zprovoznění sériové komunikace na RasPi je třeba upravit dva soubory.
Netuším, co přesně má ta úprava za význam. Anglický popis je tady:
http://www.abelectronics.co.uk/raspberrypi-serialportusage/info.aspx
Takže když to opíšu do češtiny, tak je třeba pro jistotu nejdříve zazálohovat
první soubor /boot/cmdline.txt příkazem
sudo cp /boot/cmdline.txt /boot/cmdline.bckup |
Pak je třeba ten soubor otevřít v editoru:
sudo nano /boot/cmdline.txt |
V tom otevřeném souboru je jedna jediná řádka, která se nahradí tímto:
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait |
(Opravdu nevím, co to znamená, jen opisuji...)
Po úpravě by měl soubor vypadat takto:
Následuje klasické ukončení editace a uložení (Ctrl+X, Y, Enter)
Druhý soubor, který je třeba upravit, je /etc/inittab
Tento soubor už není třeba zálohovat, protože úprava spočívá
pouze v zakomentování jedné řádky:
Na konci souboru je řádka, která obsahuje text :
.... respawn:/sbin/getty -L ttyAMA0 .....
Tak před tuto řádku se vloží dvojitý křížek (#)
Po úpravě vypadá ta řádka takto:
... Zavřít, Uložit (Ctrl+X, Y, Enter)
Na závěr je třeba RasPi restartovat:
6) Instalace programů (CuteCom, minicom)
Pro použití komunikace existuje několik hotových programů. Já jsem vyzkoušel grafický CuteCom a terminálový minicom.
Instalace obou programů je popsána zde:
http://blackeagle.duckdns.org:86/Comp/RPi/Serial.html
sudo apt-get update
sudo apt-get install cutecom
sudo apt-get install minicom |
Program CuteCom se spouští v grafickém prostředí
("Start" -> Other -> CuteCom).
Ten program tady nebudu popisovat - stačí jen nastavit komunikační parametry do příslušných políček.
Za upozornění stojí snad jen políčko "Device", do kterého je třeba zadat /dev/ttyAMA0
Trochu horší to bylo s terminálovým minicomem.
Ale i tam se mi to nakonec podle nápovědy povedlo po celkem krátké době zprovoznit.
Po instalaci je třeba spustit program s parametrem pro
nastavení:
a v menu "Serial port setup" je třeba nastavit "Serial Device" na /dev/ttyAMA0
Když se nastaví správné přenosové parametry, vypadá
přenos dat z multimetru takto:
Důležitá je klávesová zkratka Ctrl+A, následovaná klávesou
"Z" pomocí které se dostanete do menu.
V menu je možné si pomocí dalších písmen vybrat požadovanou akci (přenosová rychlost,
posílání znaku CR na konci řádky ....)
Toho nastavení je tam spousta a ani jsem to všechno nezkoumal.
7) Příklad programu v Pythonu s využitím
pySerial API Jedinou věcí, která mi chyběla na obou programech (je možné, že tam je, ale já jsem jí neobjevil),
bylo pravidelné odesílání dat z RasPi do zařízení.
V mém konkrétním případě jsem chtěl, aby mi připojený multimetr každou půlsekundu odeslal do RasPi naměřenou hodnotu.
Aby multimetr odeslal naměřená data, bylo třeba každou půlsekundu odeslat z RasPi do multimetru písmeno "D".
K této automatické komunikaci jsem chtěl využít Python.
V Pythonu je pak bez problému možné se získanou hodnotou okamžitě pracovat (průměrovat, ukládat do souboru, porovnávat s nastavenou mezí .....)
Python sám ale přes RS232 komunikovat nedokáže.
Bylo třeba doinstalovat modul pro sériovou komunikaci.
Pro instalaci stačí v terminálu zadat tento příkaz:
sudo apt-get install python-serial |
Po instalaci modulu je možné z Pythonu odesílat a přijímat data.
Stačí jen nastavit správné parametry komunikace a pomocí funkcí read
a write se může spustit komunikace.
Popis všech funkcí tohoto modulu je zde:
http://pyserial.sourceforge.net/pyserial_api.html
Na závěr jednoduchý příklad pro čtení 10 naměřených hodnot z
Metexu.
Příklad je ke stažení tady: rs232.py
V programu si můžete všimnout třech řádek:
x = spojeni.read(14)
Jsou tam kvůli tomu, že v rámci jednoho bloku dat se z Metexu odesílají 4 hodnoty.
První je hlavní měřená hodnota na velkém displeji.
Zbylé tři jsou údaje na malých pomocných displejích, jejichž funkci je možné
na multimetru nastavit.
(Například na zobrazení průměrné, maximální a minimální hodnoty).
V základním režimu se na těchto 3 malých displejích zobrazuje 3 sekundy stará historie naměřených hodnot z velkého displeje, takže jsou tyto údaje nezajímavé.
8) Připojení staré sériové myši
Ještě jsem našel doma jednu hodně starou sériovou myš, tak jsem jí zkusil připojit.
V první řadě bych chtěl upozornit, abyste nevěřili
prvnímu článku, který objevíte
na internetu, a který popisuje zapojení myšího konektoru.
Bez ověření se dokonce nespoléhejte ani na tento článek.
Pro moji konkrétní myš totiž funguje následující připojení (na rozdíl
od cizích článků je u mě zapojený pin č.7):
Vaše myši mohou být zapojené odlišně.
Piny 5, 3 a 2 na myším konektoru Canon asi budou stejné. Rozdíl bude
pravděpodobně v tom pinu 7.
Při takto připojené myši jsem spustil program CuteCom, na kterém
jsem nastavil následující přenosové parametry:
Baud rate: 1200
Data bits: 8
Stop bits:1
Když jsem pak spustil přenos a zahýbal myší, začaly se z myši do
RasPi sypat data:
Na první pohled ta data nedávají smysl, ale třeba tady
na té stránce je popsaný způsob, jakým se z toho dají získat údaje
o směru a rychlosti pohybu a nebo o stisknutém tlačítku: http://www.hw.cz/teorie-a-praxe/dokumentace/mys-mouse-rs-232.html
Tady je krátké video:
(Na červené LEDce je vidět přenos dat při pohybu myši)
... A ještě doplnění k té myši:
Trochu jsem upravil ten Pythoní program, který četl data z
multimetru - předělal jsem ho na čtení myši a zobrazení získaných
dat v binárním tvaru.
Program je tady: mys.py
Z výstupu toho programu je pěkně vidět, jaké významy mají
jednotlivé bity:
Video s ukázkou činnosti "myšího"
programu:
Mezi 10.a 16. sekundou záznamu jsem nehýbal myší, ale klikal jsem tlačítky.
Nejdřív 4x levým a pak 4x pravým.
Na výstupu je vidět, že se v té době v prvním bajtu (levý sloupec)
měnily hodnoty bitů 5 a 4.
|