====== Projektname ======
Umbau von 2x2 LED Matrix Anzeigen aus Bahnhofsdisplays.
===== Informationen =====
Der Treff hat zwei große Bahnhofdisplays mit LED Matrix-Anzeigen und in der Summe 4 Bahnhofsuhren gespendet bekommen. Den Fortschitt beim entschlüsseln des Anzeige-Protokolls und die folgenden Projekte dokumentieren wir hier.
Linksammlungen für weitergehende Projekte:
* [[https://pad.chaostreff-dortmund.de/p/gb2dfi|Game Boy Classic direkt mit dem Display verbinden]] (vorerst nur ein Pad)
* [[https://repos.ctdo.de/silversonic/gnuboy-for-dfi|Gameboy Emulator der die LED Matrix per UDP anspricht]]
===== Eigener Controller =====
Wir aktuell entwickelt. Siehe https://repos.ctdo.de/ctdo/dfi-led-matrix
===== Bilder =====
{{:projekte:vectorimage_2017-12-16_112705.jpg?200|}}
{{:projekte:vectorimage_2017-12-17_030640.jpg?200|}}
{{:projekte:vectorimage_2017-12-17_031231.jpg?200|}}
{{:projekte:vectorimage_2017-12-17_031543.jpg?200|}}
====== Kommunikation mit dem Display (Boardcomputer) ======
Baud: 19200
Erste Informationssammlung (Ohne CRC Informationen):
ID = 001D = 01H
001D = 30 30 31
XX XX XX = ID
END = 1B?
Status Abfrage
00000000 02 53 30 30 31 30 31 9C 03 02 53 30 30 31 30 31 .S00101...S00101
00000010 9C 03 ..
Eine einzelne Anfrage schickt:
02 53 XX XX XX 30 31 9C 03
Anzeige löschen
00000000 02 44 30 30 31 30 31 8B 03 02 44 30 30 31 30 31 .D00X01...D00101
00000010 8B 03 ..
Eine einzelne Anfrage schickt:
02 44 XX XX XX 30 31 8B 03
Zeile löschen ( Klingt komisch / Keine Zeile in der Anfrage zu sehen )
00000000 02 5A 30 30 31 30 31 95 03 02 5A 30 30 31 30 31 .Z00101...Z00101
00000010 95 03 ..
Eine einzelne Anfrage schickt:
02 5A XX XX XX 30 31 95 03
Text senden ( In diesem Fall ist der Text "TEST" und die Zeile "1" )
00000000 02 49 30 30 31 30 31 31 30 31 1B 30 46 4C 31 54 .I00101101.0FL1T
00000010 45 53 54 B0 03 02 49 30 30 31 30 31 31 30 31 1B EST...I00101101.
00000020 30 46 4C 31 54 45 53 54 B0 03 0FL1TEST..
31 30 31 31 30 31 1B 30 46 4C 31 54 45 53 54 CRC-8/DARC 0xB0
Hier mit Text "TEST" und Zeile "2"
00000000 02 49 30 30 31 30 31 31 30 32 1B 30 46 4C 31 54 .I00101102.0FL1T
00000010 45 53 54 B3 03 02 49 30 30 31 30 31 31 30 32 1B EST...I00101102.
00000020 30 46 4C 31 54 45 53 54 B3 03 0FL1TEST..
Hier mit Text "T" und Zeile "1"
00000000 02 49 30 30 31 30 30 38 30 31 1B 30 46 4C 31 54 .I00100801.0FL1T
00000010 FA 03 02 49 30 30 31 30 30 38 30 31 1B 30 46 4C ...I00100801.0FL
00000020 31 54 FA 03 1T..
Hier mit Text "T" und Zeile "2"
00000000 02 49 30 30 31 30 30 38 30 32 1B 30 46 4C 31 54 .I00100802.0FL1T
00000010 F9 03 02 49 30 30 31 30 30 38 30 32 1B 30 46 4C ...I00100802.0FL
00000020 31 54 F9 03 1T..
Eine einzelne Anfrage schickt:
02 49 XX XX XX 30 31 31 30 31 1B 30 46 4C 31 54 45 53 54 B0 03
FF = Fest
XX = ID
YY = Zeile
TT = Text ("TEST")
MM = Menge
AA = Ausrichtung (L|Z|R)
Menge = 7 + Anzahl an Zeichen
FF FF XX XX XX MM MM MM YY YY FF FF FF AA FF TT TT TT TT ?? FF
02 49 30 30 31 30 31 31 30 31 1B 30 46 4C 31 54 45 53 54 B0 03
02 49 30 31 39 30 30 38 30 31 1B 30 46 5A 31 54 E5 03 - Vom PC (Text "T" Zeile "1" Adresse "19")
Text senden funktion in JS:
function crc (string) {
var cr = 255;
var charArray = string.split('');
for (var cx = 0; cx < charArray.length; cx++) {
var stringValue = charArray[cx].charCodeAt(0);
cr = cr ^ stringValue;
}
return (cr | 128);
}
function binStringToHex1(s) {
var s2 = [], c;
for ( var i = 0, l = s.length; i < l; ++i ) {
c = s.charCodeAt(i);
s2.push(
(c >> 4 ).toString(16),
(c & 0xF ).toString(16));
}
String.prototype.concat.apply('',s2);
return s2;
}
function generateCommand(address, row, direction, message) {
var commandBegin = "I";
while (address.length < 3) {
address = "0" + address;
}
if (row.length == 1) {
row = "0" + row;
}
var messageWithoutLenghtAndCrc = row + String.fromCharCode(27) + "0F" + direction + "1" + message;
var lengthOfMessageWithoutCrc = messageWithoutLenghtAndCrc.length + "";
while (lengthOfMessageWithoutCrc.length < 3) {
lengthOfMessageWithoutCrc = "0" + lengthOfMessageWithoutCrc;
}
var messageWithoutCrc = commandBegin + address + lengthOfMessageWithoutCrc + messageWithoutLenghtAndCrc;
var crcFromMessage = crc(messageWithoutCrc);
var messageWithCrc = String.fromCharCode(2) + messageWithoutCrc + String.fromCharCode(crcFromMessage) + String.fromCharCode(3);
return messageWithCrc;
}
console.log(binStringToHex1(generateCommand("19", "1", "Z", "Hello World!")).join('').toUpperCase());
Toller VB Code
befehl = "I"
adresse = Trim(Str(adresseesse))
Do While Len(adresse) < 3
adresse = "0" + adresse
Loop
If Ausr(0).Value = True Then ausrichtung = "L"
If Ausr(1).Value = True Then ausrichtung = "Z"
If Ausr(2).Value = True Then ausrichtung = "R"
string1 = Text1(0).Text
zeile = Trim(Str(zei))
If Len(zeile) = 1 Then zeile = "0" + zeile
string1 = zeile + Chr(27) + "0F" + ausrichtung + "1" + string1
laengeVonAllem = Trim(Str(Len(string1)))
Do While Len(laengeVonAllem) < 3
laengeVonAllem = "0" + laengeVonAllem
Loop
string1 = befehl + adresse + laengeVonAllem + string1
CRC_bilden:
crcVonBefehl = CRC(string1)
befehlMitCRC = Chr(2) + string1 + Chr(crcVonBefehl) + Chr(3)
Sende_Telegram befehlMitCRC, COMnr
Function CRC(S As String) As Byte
Dim Cr, Cx
Cr = 255
For Cx = 1 To Len(S)
Cr = Cr Xor Asc(Mid(S, Cx, 1))
Next Cx
Cr = Cr Or 128
CRC = Cr
End Function