IBIS komunikace s BS120
Dostal se mi do rukou starší panel BUSE BS120, jeho využití v domácích podmínkách bez zbytku OIS je značně kostrbaté a pokud nechcete jen statický text či jeden cyklus, neobejdete se bez počítače s BSLoaderem, či právě nadřazené části OIS. Informace o tom jak komunikovat přes IBIS na fyzické úrovni je vcelku dost, například Jakub Švec o tom má stránku kde je i odkaz na schéma převodníku IBIS na RS232 (mutno podotknout že schéma je dost nepřehledné a není uvedená hodnota D4 tedy BZX85, tato zenerová dioda by měla být 12V) - přesto jsem schéma vyzkoušel a zdá se funkční. Zde přikládám starší vlákno českého fóra. Zde pak ne moc mladší vlákno německého fóra, kde je podrobnější popis směrnice IBIS. Ve zkratce a zjednodušeně je to RS232 posazená na ~24V.
Programy BSloader a gBUSE1 není nějak komplikované najít například na uloztu, nebo githubu, jejich ovládání odpovídá době vzniku a dá se s trochou snahy naučit. Program gBUSE1 slouží ke generování databáze dat, kterou panel následně zobrazí. BSloader poté tuto databázi nahraje do paměti panelu, zároveň umí posílat libovolné příkazy, čímž může nahradit palubní počítač ve voze, nebo jiný nadřazený systém - OIS.
Pro to aby se panel mohl řídit například Arduinem je třeba odposlechnout komunikaci BSloaderu. To jsem udělal dvěma USB-UART převodníky a pár příkazy - povely, které hodlám použít ve vlastní aplikaci.
Odposlechnutá data z BSLoader 4.02:
Baudrate 1200 bps, parita sudá, 7 databitů a 2 stop bity
povel | HEX | význam | BIN |
---|---|---|---|
xC0 | 78 43 30 0D 79 | povel,CR,KS | 01111000 01000011 0011000000001101 01111001 |
xC1 | 78 43 31 0D 78 | povel,CR,KS | 01111000 01000011 0011000100001101 01111000 |
u2019 | 75 32 30 31 39 0D 0D | povel,CR,KS | 01110101 00110010 00110000 00110001 00111001 00001101 00001101 |
u2020 | 75 32 30 32 30 0D 07 | povel,CR,KS | 01110101 00110010 00110000 00110010 00110000 00001101 00000111 |
u2021 | 75 32 30 32 31 0D 06 | povel,CR,KS | 01110101 00110010 00110000 00110010 00110001 00001101 00000110 |
*KS = kontrolní součet
CR = Carriage Return = návrat vozíku = \r
Červená data tedy KS je výsledek XORu všech znaků povelu včetně 0x0D (CR) a k nim 0x7F.
příklad pro „xC0“ (v HEX) : 7F^78^43^30^0D=79 / kde ^ zastupuje funkci XOR
U XORu nezáleží na pořadí prvků, tedy XOR 0x7F můžeme udělat kdykoliv.
Mimochodem děkuji uživateli VroutekB Danykova diskuzního kroužku, který přišel právě na XOR s 0x7F.
Příklad jak to řešit v Arduinu:
- IBIS.ino
// Arduino pro micro (serial - usb; serial1 na pinech) // příchozí znaky na serial postupně XORuju a zároveň odesílám na serial1, výsledek XORu ukládám do proměnné // až přijde 0x0D (CR) standardně vyXORuju s proměnou následně přiXORuju 0x7F // odešlu 0x0D (CR)a přidám výsledek XORu jako poslední znak, vyprázdním prostou pro ukládaní XORu void setup() { Serial.begin(1200, SERIAL_7E2); Serial1.begin(1200, SERIAL_7E2); } int xorByte; void loop() { if (Serial.available()){ int inByte = Serial.read(); if(inByte != 0x0D){ Serial1.write(inByte); xorByte = xorByte^inByte; }else{ xorByte = xorByte^inByte^0x7F; Serial1.write(inByte); Serial1.write(xorByte); xorByte = 0; } }//Serial.available }//loop
Tento kód k danému povelu přidá KS.
Nutno upozornit že nelze přímo připojit Arduino, ani jiný jednočip přímo k IBISu, je nutné použít převodník úrovní. Panel nijak neodpovídá na příchozí příkazy (ty běžné), stačí tedy jen jednosměrný komunikační kanál CPU → BS120. Analogicky:
Autor nenese žádnou zodpovědnost za případné škody - vše děláte na vlastní nebezpečí