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:

FnPopis##PopisFn
NC78GPIO14TXD
NC910GPIO15RXD
REGPIO171112NC
DEGPIO271314GND

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:

Snímka z osciloskopu zobrazujúca správne signály TX, A, B a diferenciálny signál A-B, pričom chýba signál RX pri zapojení na UTRS485G.

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:

Séria obrázkov, zľava doprava: originálny čip UTRS485G, čip odstránený s detailom na piny 2 a 3 potvrdzujúcim ich prepojenie na DPS, nový čip MAX13487E zaspájkovaný na mieste

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:

Snímka z osciloskopu zobrazujúca správne signály TX, RX, A, B a diferenciálny signál A-B pri zapojení na MAX13487E.

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.