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í (Odkaz na YouTube) .

 


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:

sudo nano /etc/inittab


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:

sudo shutdown -r now

 

 


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í:

sudo minicom -s
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: 

Odkaz na YouTube
(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:

Odkaz na YouTube
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.

 


úvodní strana webu AstroMiK.org

poslední úprava stránky 14.12.2013