Tento príspevok je súčasťou série o probléme s ModbusRTU autoflow na TouchBerry a o tom, ako som ho vyriešil. Ostatné príspevky série nájdete pod tagom touchberry. Upozorňujeme, že novšie príspevky môžu obsahovať aktuálnejšie informácie.
S prístupom k modelu TouchBerry 10” vrátane RS485 som sa dal do ovládania niektorých ModbusRTU zariadení pomocou neho. Má konektor M8, 3-pinový. Stredný pin je pripojený na zem napájacieho napätia, takže som predpokladal, že zostávajúce dva sú A a B pre RS485. Ukázalo sa, že na túto tému nie je verejne dostupná absolútne žiadna dokumentácia.
Pinout RS485 #
Našťastie som dostal e-mail od podpory pomerne rýchlo. E-mail potvrdil pinout.
| # | Pozícia M8 | RS485 |
|---|---|---|
| 1 | vpravo | B- |
| 2 | vľavo | A+ |
| 3 | hore | GND |
Ale keď je GND vyriešené, dostať sa k A a B nie je problém. Ak to nefunguje, jednoducho ich vymeňte a skúste znova. Pri ostatnom správnom nastavení je tento postup dostatočný.
Pinout UPS shieldu #
Následne e-mail obsahoval informácie o pinoute UPS shieldu, ktorý hostí čip RS-485. Čip je Unisonic Technologies UTRS485G, ale o nich som predtým nikdy nepočul. UPS shield tiež obsahuje elektroniku neprerušiteľného napájania (odtiaľ názov) a hodinový čip DS3231 pre možnosti RTC.
Shield využíva celý 40-pinový header pre Raspberry Pi 4, ktorý tvorí jadro TouchBerry 10”, detaily z e-mailu sú nasledujúce:
| Fn | Popis. | # | # | Popis. | Fn |
|---|---|---|---|---|---|
| NC | 1 | 2 | Vin | ||
| SDA | GPIO2 | 3 | 4 | Vin | |
| SCL | GPIO3 | 5 | 6 | GND | |
| NC | 7 | 8 | GPIO14 | TXD | |
| NC | 9 | 10 | GPIO15 | RXD | |
| RE | GPIO17 | 11 | 12 | NC | |
| DE | GPIO27 | 13 | 14 | GND | |
| NC | 15 | 16 | GPIO23 | UPS IN | |
| NC | 17 | 18 | GPIO24 | UPS OUT | |
| NC | 19 | 20 | GND | ||
| NC | 21 | 22 | NC | ||
| NC | 23 | 24 | NC | ||
| GND | 25 | 26 | NC | ||
| NC | 27 | 28 | NC | ||
| NC | 29 | 30 | GND | ||
| NC | 31 | 32 | NC | ||
| NC | 33 | 34 | GND | ||
| NC | 35 | 36 | NC | ||
| NC | 37 | 38 | NC | ||
| GND | 39 | 40 | NC |
Toto bolo dosť nápomocné, pretože čip zodpovedný za RS485 komunikáciu musí vedieť, akým smerom dáta prúdia. Je to pokročilá funkcia navrhnúť celkový systém tak, aby táto zodpovednosť bola od používateľa abstrahovaná — tzv. autoflow alebo automatické riadenie toku.
Používanie rozhrania RS485 na TouchBerry 10 #
Dôležitosť autoflow je zrejmá z Python skriptu poskytnutého ako tretia časť e-mailu od podpory IndustrialShields:
#!/usr/bin/env python3
# IMPORTANT: remember to add "enable_uart=1" line to /boot/config.txt
from gpiozero import OutputDevice
from time import sleep
from serial import Serial
# RO <-> GPIO15/RXD
# RE <-> GPIO17
# DE <-> GPIO27
# DI <-> GPIO14/TXD
#
# VCC <-> 3.3V
# B <-> RS-485 B
# A <-> RS-485 A
# GND <-> GND
# enable reception mode
re = OutputDevice(17)
de = OutputDevice(27)
de.off()
re.off()
with Serial('/dev/ttyS0', 19200) as s:
while True:
# waits for a single character
rx = s.read(1)
# print the received character
print("RX: {0}".format(rx))
# wait some time before echoing
sleep(0.1)
# enable transmission mode
de.on()
re.on()
# echo the received character
s.write(rx)
s.flush()
# disable transmission mode
de.off()
re.off()
Na odoslanie dát cez rozhranie RS485 musia byť piny RE a DE čipu vytiahnuté na HIGH, dáta musia byť prenesené, a potom by mali byť oba piny RE a DE okamžite stiahnuté na LOW, aby prijali odpoveď. Je to veľmi nepríjemné, keďže väčšina Modbus implementácií predpokladá autoflow, čo je aj prípad pri používaní mbpoll.
Chýbajúci autoflow? #
Je to v podstate veľa nepríjemností nemať funkcionalitu autoflow, čo robí väčšinu štandardných Modbus implementácií nepoužiteľnými. Hľadal som dosť usilovne spôsob, ako to urobiť nejakým príjemným automatizovaným spôsobom na RPi softvéri na nejakej aplikačnej alebo jadrovej úrovni, navštevujúc výsledky vyhľadávaní ako alternatívne GPIO funkcie, dtoverlay, RTS0, uart-ctsrts a sériové sniffre, ale riešenie som zatiaľ nenašiel. Niektoré z najsľubnejších sú referencované nižšie medzi inými relevantnými odkazmi.
GPIO17 má alternatívnu funkciu RTS0 na ALT3, ktorá je pripojená na pin RE —
dúfajme, že to je zámerné. Pre GPIO27 pripojený na pin RE však žiadna taká
funkcia nie je dostupná. V skutočnosti by mali byť DE aj RE spojené dokopy,
ovládané jediným pinom RTS0, ktorý je zase riadený GPIO14 ako TXD0. Nemám
tušenia, prečo je pin RE samostatný. Musím ho pripojiť k osciloskopu, aby
som sa dozvedel viac. Pred dotykom spájkovačky musím tiež počkať na ďalšiu
odpoveď e-mailu od podpory — možno poskytnú nejaké užitočné informácie.
Nakoniec, ich
RPi PLC má /dev/ttySC0 a /dev/ttySC1 pre oba RS485 kanály.
Toto je 92. príspevok série #100daystooffload.
Odkazy #
- http://www.unisonic.com.tw/datasheet/UTRS485.pdf
- https://www.industrialshields.com/web/content?model=ir.attachment&field=datas&id=137792&
- https://ethertubes.com/raspberry-pi-rts-cts-flow-control/
- https://raspberrypi.stackexchange.com/a/32504/59436
- https://widgetlords.com/pages/rs485
- https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2711/rpi_DATA_2711_1p0_preliminary.pdf