TE4101 mérleget szeretnénk Arduino-val/Rapberry-vel olvasni. Először is egy könnyen beszerezhető RS232 to USB kábellel (CH340 csippel szerelt) próbáltam összeköttetést kialakítani a mérleg és egy PC között. A kábel csatlakoztatása után a megfelelő driver automatikusan települ, ha nem akkor ezt manuálisan kell megtennünk. Sikeres telepítés után a következőt kell látnunk:

Ezt a Start menü → Vezérlőpult → Eszközkezelő menü alatt találjuk meg. A COM14-es porton találjuk az eszközünket, ez persze eltérhet.
A port olvasásához a CoolTerm programot használom (http://freeware.the-meiers.org/) a következő beállításokkal:
Port COM14 Baudrate 9600 Data Bits 7 Parity odd Stop Bits 1
Ezeknek a beállításoknak egyeznie kell a mérleg beállításaival, ott az alapbeállítás 1200 bit/second, ezzel nekem nem működött ezért átállítottam 9600-ra. Itt megtalálod a kezelési útmutatót és a kommunikációs protokollt:
Description of the Interface for GD, GE and TESartorius_GD_GE
Természetesen mivel egy Sartorius termékről van szó, így nem követi a szabványt, amire a mérleg hátulján lévő felirat is figyelmeztet.

Egy kis átkötésre lesz szükség, hogy működésre bírjuk. Első körben szükségünk lesz egy átalakító kábelre, ami a 25 pines kimenetet leredukálja 9-re.

Ezt a 9 pines female-t, ha közvetlenül összekötjük az RS232-USB kábelünk male felével akkor sajnos nem fog működni, ezért egy kis átkötésre lesz szükség. Itt a pin kiosztás a csatlakozókhoz:
–
Itt látszik, hogy ezzel a Tx-et a Tx-hez kapcsolnánk, ezért ezt fel kell cserélni, ehhez egy MINI GENDERCHANGER-t használok így a tüskéket female jumper wire-rel könnyen össze tudom kötni. Ezután a CoolTerm nevű programmal már tudtam olvasni, de parancsot sajnos még nem sikerült küldeni a mérlegnek. A mérlegen be lehet azt is állítani, hogy folyamatosan küldje az adatokat.

Ez tehát fél siker, de reméljük az adatküldés is hamar megoldódik.
Lássuk akkor ugyanezt Arduino-val, ehhez egy RS232 to TTL átalakítóra lesz szükségünk, ami így néz ki:

Ez MAX3232 csippel van szerelve, beépítésre én MAX232N használtam, egy másik project-hez. A legtöbb mikrokontroller manapság UART-tal szerelt (universally asynchronous receiver/transmitter) ilyen az Arduino és a Raspberry is. A TTL-UART-nál csak 3 vezeték kell a kétoldalú soros kommunikációhoz. Egy Adás (Transmit-TX) egy Vétel (Receive-RX) és egy közös föld (GND) vezeték. A TX vonalon küldjük el az adatot a másik eszköznek, és az RX vonalon a másik eszköz küld adatot nekünk. TTL serial (transistor-transistor logic) kommunikációnál a feszültség érték leggyakrabban 3,3 és 5 volt, ez reprezentálja a logikai magas értéket (1) míg a 0V a logikai alacsony (0) értéknek felel meg. Az RS232 esetében pont fordított a helyzet, itt a logikai 1 negatív tartományban van ez -3 és -25 között bárhol lehet, a logikai 0 érték pedig a pozitív tartományban van +3 és +25 volt között.
RS232 to ttl
Az RS-232 egy 9 pólusú ún. D-Sub csatlakozót használ. Az aszinkron soros kommunikáció során ebből csak hármat használunk.
• RxD : adatfogadás, 3-as láb
• TxD : adatküldés, 2-es láb
• Föld (GND): 5-ös láb
Itt kitérnék egy picit a kapcsolat tesztelésére. Van ez a RS232 to ttl átalakítónk, ezt közvetlenül össze tudjuk kötni USB serial RS232 konverterrel (így néz ki). Az egyik ablakban megnyitjuk az Arduino-hoz, a másikban a RS232-USB átalakítóhoz tartozó soros monitort. Ebben az esetben ez COM23 és COM20. Arduino-ra feltöltjük a következő kódot.
#include <SoftwareSerial.h> SoftwareSerial mySerial(2, 3); void setup() { Serial.begin(9600); mySerial.begin(9600); } void loop() { mySerial.print(15,DEC); delay(1000); while (mySerial.available()){ Serial.println(mySerial.read(),DEC); } }
Ez annyit csinál, hogy folyamatosan küld egy 15-ös számot, amit a COM20 porton látunk, amit meg a innen küldünk az a COM23-on lesz látható. Ha mindent jól csatlakoztattunk, jól állítottuk be a baudrate-et, és ennek ellenére nem működik, akkor kapjunk elő egy voltmérőt és mérjük meg a feszültséget a Tx-GND és Rx-GND között. RS232 to ttl átalakító esetében ez -5,984V (Tx-GND) és 0V (Rx-GND). Az egyik hibás modulnál pl. +2,5 és +2,5 volt. Az USB serial RS232 konverter esetében -9,047V (Tx-GND) és 0V (Rx-GND). Tehát akkor gyanús ha a Tx-GND pozitív tartományban van, vagy ha a Rx-GND nem nulla.
Vissza a mérleghez. A 3. ábrán látható kábellel, egy male to male átalakítóval és egy RS232 to TTL konverter segítségével kialakítjuk a kapcsolatot az Arduino és a mérleg között.
Az Rx megy az Arduino 2-es a Tx a 3-as pinjére.
A mintakód igen egyszerű, ezzel kiolvassuk a mérleg által küldött karaktereket és decimálisban megjelenítjük.
#include <SoftwareSerial.h> SoftwareSerial mySerial(2, 3); void setup() { Serial.begin(9600); mySerial.begin(9600); } void loop() { while (mySerial.available()){ Serial.println(mySerial.read(),DEC); } }
A felső sorban a beérkezett adat decimálisban, az alatta lévő az ASCII megfelelője, vagyis nem teljesen mert a 176 megfelelője a °, a 174-é pedig a ®. Ez most vagy kommunikációs félreértés a két eszköz között, vagy a Sartorius sajátossága. Az érték az 0.0 g. A 32-es karakter = SP – Space én “_” jelöltem.
32 | 32 | 32 | 32 | 32 | 32 | 32 | 176 | 174 | 176 | 32 | 103 | 32 | 32 | 13 | 138 |
_ | _ | _ | _ | _ | _ | _ | 0 | . | 0 | _ | g | _ | _ | CR | Š |
Egy másik példa, itt az érték 10.8 g
171 | 32 | 32 | 32 | 32 | 32 | 49 | 176 | 174 | 56 | 32 | 103 | 32 | 32 | 13 | 138 |
+ | _ | _ | _ | _ | _ | 1 | 0 | . | 8 | _ | g | _ | _ | CR | Š |
Itt sem teljesen egyértelmű, mert a 171 megfelelője a « és nem +, holott ennek kellene lennie.
Ehhez kellene majd írni egy programot, ami átkonvertálja a megfelelő értékre, majd I2C-n keresztül kérésre továbbítja a raspberry felé.
2017.01.15.
Közben megjött a válasz a korábbi kérdésre, hogy miért nem egyezik a decimálisból ACSII-ra átváltott karakterek. A 176, 174, 138-as számok esetében volt csak probléma. Ezekből a számértékekből, ha levonunk 128-at akkor stimmel: 176-128 = 48 (ASCII megfelelője 0). Ez a paritás bit miatt van. A számérték bináris értékében ha az egyesek száma páros akkor az első helyi értékű bitet 1 re állítja. Ezt kell majd 0-ra állítani és akkor rendben lesz.
48 binárisan 00110000, ebben két egyes van, tehát az egyesek száma páros, ezért az első helyi érték 1-re változott, így 10110000, ami 176.
Felhasznált irodalom
https://www.sparkfun.com/tutorials/215
http://www.hobbielektronika.hu/cikkek/egyszeru_soros_kommunikacio_avr-rel_uart.html?pg=2
http://www.aboutmyip.com/AboutMyXApp/AsciiChart.jsp