Tento príspevok je súčasťou série o probléme s autoflow ModbusRTU na TouchBerry a o tom, ako som ho vyriešil. Ostatné príspevky série nájdete pod tagom touchberry. Všimnite si, že novšie príspevky môžu obsahovať aktuálnejšie informácie.
V priebehu série som skúmal záhadný UPS shield, ktorý možno objednať ako najvyššiu konfiguráciu TouchBerry 10 od IndustrialShields (odkazy v predchádzajúcich príspevkoch).
Dokumentácia k tomuto panelu bohužiaľ neobsahuje nič o rozhraní RS-485 ani o ModbusRTU, ktorý ho využíva. Prvá dokumentácia bola dostupná v podobe emailu od podpory, konkrétne uvádzajúca pinout 40-pinového hlavičkového konektora Raspberry Pi 4, napájajúceho panel:
| Fn | Popis | # | # | Popis | Fn |
|---|---|---|---|---|---|
| NC | 7 | 8 | GPIO14 | TXD | |
| NC | 9 | 10 | GPIO15 | RXD | |
| RE | GPIO17 | 11 | 12 | NC | |
| DE | GPIO27 | 13 | 14 | GND |
To, čo som opakovane zistil, je, že v skutočnosti tomu tak nie je. Namiesto toho, aby GPIO17 riadil pin RE (pin číslo 2) obscurného čipu UTRS485G a GPIO27 riadil pin DE (pin číslo 3), GPIO17 nerobí nič (pokiaľ viem) a GPIO27 riadi oba piny RE aj DE.
Pri pokuse odoslať nejaký príkaz z TouchBerry na zariadenie ModbusRTU,
napríklad prepnutím cievky pomocou mbpoll:
mbpoll -a 2 -b 9600 -t 0 -P none /dev/ttyS0 1
Možno vidieť nasledujúcu chybu, aj keď zariadenie cievku nastaví.
Write discrete output (coil) failed: Connection timed out
Dôvod je zrejmý — odpoveď zo zariadenia sa nedostala do Pi. Tu je ďalší dôkaz toho, čo sa deje s UTRS485G, keď je GPIO27 trvalo nastavený na HIGH:

RX nemá žiadny prenos, pretože UTRS485G čaká na to, aby oba piny 2 a 3 (RE a DE) boli po prenose nastavené na LOW, aby sa obrátil smer. To je síce dosiahnuteľné skriptom z časti 1 alebo podobným spôsobom, ale je to veľká komplikácia. Neskôr som mohol potvrdiť, že piny 2 a 3 na čipe sú skutočne správne prepojené na DPS pri výmene súčiastky, ako je vidieť na kombinovanom obrázku nižšie:

Výmena bola veľkým úspechom. MAX13487E má automatické riadenie smeru, skrátene autoflow — funkciu, o ktorú som dúfal, že ju dosiahnem buď softvérovo (cez pin RTS0, ale keďže je na GPIO17 a nie na GPIO27, je to nemožné, nehovoriac o tom, že má aj opačnú polaritu) alebo nejakou hardvérovou zmenou. Tu je to, ako osciloskop zobrazil testovú komunikáciu ModbusRTU pri prepínaní cievky po výmene čipu:

RX teraz má odpoveď zo zariadenia. Obe snímky osciloskopu vynechávajú piny
2 a 3, ale s MAX13487E sú trvalo nastavené na HIGH. Aby som to dosiahol od
spustenia, mohol by som dať pull-up rezistor na GPIO27 alebo by som
mohol pravdepodobne tiež povoliť pull-up rezistor v Pi na tomto pine (ešte
som to neskúšal). Našiel som však iný, možno trochu prenositeľnejší spôsob
tu.
Stručne, upravte /boot/config.txt a pridajte na koniec:
dtoverlay=gpio-poweroff,gpiopin=27,active_low
Tým sa GPIO27 nastaví na HIGH hneď po nabootovaní TouchBerry, čo spolu
s MAX13487E uľahčuje volania ModbusRTU, teda Pi tiež dostáva odpoveď zo
zariadenia. Pri vyššie uvedenom nastavení nie je potrebné manuálne meniť
žiadny stav alebo funkciu pinu. Keďže /boot/config.txt je štandardný
vstupný bod pre úpravy pre mnohých používateľov Raspberry, je to
pravdepodobne najlepší spôsob uloženia tejto funkcionality.
Zakončenie RS-485 #
Všimnite si, že na strane UPS shieldu nie je žiadny zakončovací rezistor
120R, takže keď je pripojený k zariadeniu, ktoré ho tiež nemá, a ani na
kábli medzi linkami A a B nie je žiadny, odpoveď z mbpoll môže vyzerať
takto:
Write discrete output (coil) failed: Response not from requested slave
Vloženie spomínaného rezistora 120R medzi A a B rieši problém a odpoveď teraz vždy hlási nasledovné:
Written 1 references.
Vo všeobecnosti je osoba vykonávajúca RS-485 pripojenie zodpovedná za poskytnutie správnych predpätých a zakončovacích rezistorov, takže toto v skutočnosti nie je problém UPS shieldu na TouchBerry 10 ako takom, je to len vec, ktorú treba mať na pamäti.