Velleman MML16CN lichtkrant aansturen

Pagina: 1
Acties:
  • 7.373 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • MadEgg
  • Registratie: Februari 2002
  • Nu online

MadEgg

Tux is lievvv

Topicstarter
Ik probeer om een Velleman MML16CN lichtkrant via de PC aan te sturen. De lichtkrant is via de seriele poort met een RS-232 kabel aangesloten. Het bijgeleverde programma New Sign werkt in ieder geval.

Maar nu wil ik hem zelf gaan aansturen. De handleiding verteld over de mogelijkheid om de lichtkrant over het netwerk aan te sturen; dit gebeurd door een text-only printer toe te voegen in Windows op de seriele poort en deze te delen; vervolgens kan je met het programma New Sign naar deze 'printer' afdrukken. Ook dit werkt. Leek me dus een mooie manier om de lichtkrant aan te sturen.

Om het formaat van de tekst te bepalen heb ik eens een boodschap gemaakt met New Sign en deze naar een normale printer ipv de lichtkrant gestuurd. Er komt dan een pagina met een aantal tags en de tekst tussendoor. Nu heb ik deze tekst eens in notepad overgetypt en dat vervolgens geprint naar de lichtkrant. Het display knippert dan even en gaat dan vrolijk door waar hij mee bezig was; de tekst is niet veranderd.

Kan iemand mij helpen om dit wel werkend te krijgen? Moet ik misschien nog instellingen in de driver aanpassen(ik heb al van alles geprobeerd, zonder resultaat)?

Een eventuele andere oplossing zou het rechtstreeks programmeren van de COM-poort zijn maar dit is natuurlijk in ieder geval een stuk omslachtiger en ook dan heb ik geen idee van het gebruikte protocol.

De reden dat ik het programma New Sign niet wil gebruiken is om het mogelijk te maken om de lichtkrant aan te sturen via een webpagina en hier heeft New Sign geen ondersteuning voor.

Tja


Acties:
  • 0 Henk 'm!

  • MadEgg
  • Registratie: Februari 2002
  • Nu online

MadEgg

Tux is lievvv

Topicstarter
*schop*

Tja


Acties:
  • 0 Henk 'm!

  • MadEgg
  • Registratie: Februari 2002
  • Nu online

MadEgg

Tux is lievvv

Topicstarter
Na heel veel klooien hebben we nu ontdekt dat na de boodschap, tussen de codes in, een soort checksum wordt geplaatst door het programma. Met een serial port monitor heb ik de volgende codes weten te bemachtigen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
<ID00><L1><PA><FE><MA><WC><FE>A35<E>
<ID00><L1><PA><FE><MA><WC><FE>B36<E>
<ID00><L1><PA><FE><MA><WC><FE>C37<E>
<ID00><L1><PA><FE><MA><WC><FE>D30<E>
<ID00><L1><PA><FE><MA><WC><FE>E31<E>
<ID00><L1><PA><FE><MA><WC><FE>F32<E>
<ID00><L1><PA><FE><MA><WC><FE>G33<E> 
<ID00><L1><PA><FE><MA><WC><FE>H3C<E>
<ID00><L1><PA><FE><MA><WC><FE>I3D<E>
<ID00><L1><PA><FE><MA><WC><FE>J3E<E>
<ID00><L1><PA><FE><MA><WC><FE>K3F<E> 
<ID00><L1><PA><FE><MA><WC><FE>L38<E>
<ID00><L1><PA><FE><MA><WC><FE>M39<E> 
<ID00><L1><PA><FE><MA><WC><FE>N3A<E>
<ID00><L1><PA><FE><MA><WC><FE>O3B<E>
<ID00><L1><PA><FE><MA><WC><FE>P24<E>
<ID00><L1><PA><FE><MA><WC><FE>Q25<E>
<ID00><L1><PA><FE><MA><WC><FE>R26<E>
<ID00><L1><PA><FE><MA><WC><FE>S27<E>
<ID00><L1><PA><FE><MA><WC><FE>T20<E>
<ID00><L1><PA><FE><MA><WC><FE>U21<E>
<ID00><L1><PA><FE><MA><WC><FE>V22<E>
<ID00><L1><PA><FE><MA><WC><FE>W23<E> 
<ID00><L1><PA><FE><MA><WC><FE>X2C<E>
<ID00><L1><PA><FE><MA><WC><FE>Y2D<E>
<ID00><L1><PA><FE><MA><WC><FE>Z2E<E> 

<ID00><L1><PA><FE><MA><WC><FE>a15<E> 
<ID00><L1><PA><FE><MA><WC><FE>b16<E>
<ID00><L1><PA><FE><MA><WC><FE>c17<E>
<ID00><L1><PA><FE><MA><WC><FE>d10<E>
<ID00><L1><PA><FE><MA><WC><FE>e11<E>
<ID00><L1><PA><FE><MA><WC><FE>f12<E> 
<ID00><L1><PA><FE><MA><WC><FE>g13<E>
<ID00><L1><PA><FE><MA><WC><FE>h1C<E>
<ID00><L1><PA><FE><MA><WC><FE>i1D<E>
<ID00><L1><PA><FE><MA><WC><FE>j1E<E>
<ID00><L1><PA><FE><MA><WC><FE>k1F<E>
<ID00><L1><PA><FE><MA><WC><FE>l18<E>
<ID00><L1><PA><FE><MA><WC><FE>m19<E>
<ID00><L1><PA><FE><MA><WC><FE>n1A<E>
<ID00><L1><PA><FE><MA><WC><FE>o1B<E>
<ID00><L1><PA><FE><MA><WC><FE>p04<E> 
<ID00><L1><PA><FE><MA><WC><FE>q05<E>
<ID00><L1><PA><FE><MA><WC><FE>r06<E> 
<ID00><L1><PA><FE><MA><WC><FE>s07<E> 
<ID00><L1><PA><FE><MA><WC><FE>t00<E>
<ID00><L1><PA><FE><MA><WC><FE>u01<E>
<ID00><L1><PA><FE><MA><WC><FE>v02<E>
<ID00><L1><PA><FE><MA><WC><FE>w03<E>
<ID00><L1><PA><FE><MA><WC><FE>x0C<E> 
<ID00><L1><PA><FE><MA><WC><FE>y0D<E>
<ID00><L1><PA><FE><MA><WC><FE>z0E<E>


<ID00><L1><PA><FE><MA><WC><FE>AA74<E> 
<ID00><L1><PA><FE><MA><WC><FE>Aa54<E>
<ID00><L1><PA><FE><MA><WC><FE>aA54<E> 
<ID00><L1><PA><FE><MA><WC><FE>aa74<E> 

<ID00><L1><PA><FE><MA><WC><FE>AB77<E>
<ID00><L1><PA><FE><MA><WC><FE>Ab57<E>
<ID00><L1><PA><FE><MA><WC><FE>aB57<E>
<ID00><L1><PA><FE><MA><WC><FE>ab77<E> 

<ID00><L1><PA><FE><MA><WC><FE>BA77<E> 
<ID00><L1><PA><FE><MA><WC><FE>Ba57<E>
<ID00><L1><PA><FE><MA><WC><FE>bA57<E> 
<ID00><L1><PA><FE><MA><WC><FE>ba77<E> 

<ID00><L1><PA><FE><MA><WC><FE>BB74<E>
<ID00><L1><PA><FE><MA><WC><FE>Bb54<E>
<ID00><L1><PA><FE><MA><WC><FE>bB54<E>
<ID00><L1><PA><FE><MA><WC><FE>bb74<E>


<ID00><L1><PA><FE><MA><WC><FE>AAAA74<E> 
<ID00><L1><PA><FE><MA><WC><FE>AAAa54<E> 
<ID00><L1><PA><FE><MA><WC><FE>AAaa74<E> 
<ID00><L1><PA><FE><MA><WC><FE>Aaaa54<E> 
<ID00><L1><PA><FE><MA><WC><FE>aaaa74<E> 

<ID00><L1><PA><FE><MA><WC><FE>AAAB77<E>
<ID00><L1><PA><FE><MA><WC><FE>AABA77<E>
<ID00><L1><PA><FE><MA><WC><FE>ABAA77<E> 

<ID00><L1><PA><FE><MA><WC><FE>AABB74<E>
<ID00><L1><PA><FE><MA><WC><FE>ABAB74<E>
<ID00><L1><PA><FE><MA><WC><FE>BAAB74<E>
<ID00><L1><PA><FE><MA><WC><FE>ABBA74<E> 
<ID00><L1><PA><FE><MA><WC><FE>BABA74<E> 
<ID00><L1><PA><FE><MA><WC><FE>BBAA74<E>

<ID00><L1><PA><FE><MA><WC><FE>ABBB77<E>
<ID00><L1><PA><FE><MA><WC><FE>BABB77<E>
<ID00><L1><PA><FE><MA><WC><FE>BBAB77<E>
<ID00><L1><PA><FE><MA><WC><FE>BBBA77<E>

<ID00><L1><PA><FE><MA><WC><FE>BBBB74<E>

<ID00><L1><PA><FE><MA><WC><FE>ABCD70<E>

<ID00><L1><PA><FE><MA><WC><FE>QQQQ74<E> 
<ID00><L1><PA><FE><MA><WC><FE>QQQq54<E> 
<ID00><L1><PA><FE><MA><WC><FE>QQqq74<E> 
<ID00><L1><PA><FE><MA><WC><FE>Qqqq54<E> 
<ID00><L1><PA><FE><MA><WC><FE>qqqq74<E>


Het gaat hierbij dus om de laatste twee cijfers voor <E>. Ik zie wel een patroon maar het lukt me niet om dit te voorspellen. Herkend iemand dit?

Tja


Acties:
  • 0 Henk 'm!

  • SA007
  • Registratie: Oktober 2002
  • Laatst online: 19:02

SA007

Moderator Tweaking
Voor 1 letter heb ik 'm gekraakt

Hex( Chr(character) XOR 1110100 (0x74) ) = getal wat erachter staat

Ik kijk nog ff verder, maar het is een begin.

Edit:

Helemaal gekraakt.

Blijkbaar moet je alle characters bij elkaar XOR'en en dan nog met die 0x74
Om te testen: http://got.sa007.nl/Velleman_screen.php

Mocht die ooit dood gaan: source:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?
  if (isset($_GET['input'])) {
    $input = $_GET['input'];

    $out = 0x74;

    for ($i = 0; $i < strlen($input); $i++) {
      $out ^= ord($input[$i]);
    }

    echo "Output is : " . dechex($out) . "<br><br>";
  }
?>


Voorbeeld: Bla
B =  66 = 01000010
l = 108 = 01101100
a =  97 = 01100001
De 0x74 = 01110100
    XOR = 00111011 = 59 = 3B

Laat me ff weten of het ook voor langere strings en special chars werkt.

[ Voor 69% gewijzigd door SA007 op 14-03-2007 20:27 ]


Acties:
  • 0 Henk 'm!

  • MadEgg
  • Registratie: Februari 2002
  • Nu online

MadEgg

Tux is lievvv

Topicstarter
Ik dacht eerst dat het nog niet helemaal werkte; uiteindelijk bleek dat als er een getal met letters uitkwam, dat deze letters dan wel hoofdletters moeten zijn. Met die wijziging werkt het perfect tot nu toe, inclusief speciale tekens, lange strings en dergelijke!

Geweldig, bedankt!

[ Voor 4% gewijzigd door MadEgg op 15-03-2007 17:05 ]

Tja


Acties:
  • 0 Henk 'm!

  • SA007
  • Registratie: Oktober 2002
  • Laatst online: 19:02

SA007

Moderator Tweaking
Had al een licht vermoeden dat dat problemen kon geven, maar het hangt meer van de specifieke dechex functie van je programmeertaal af, en wou het voorbeeld ook zo simpel mogelijk houden.

Vraag me alleen nog af waar die 0x74 nou eigenlijk vandaan komt...

Mooi dat het werkt in ieder geval.

Acties:
  • 0 Henk 'm!

  • MadEgg
  • Registratie: Februari 2002
  • Nu online

MadEgg

Tux is lievvv

Topicstarter
Ik denk dat die 0x74 het resultaat is van de overige codes; ik heb gezien dat het veranderen van tekens in

<ID00><L1><PA><FE><MA><WC><FE>

ook uitmaakt. Niet allemaal misschien(<ID00> volgens mij niet...), maar wel een aantal.

Tja


Acties:
  • 0 Henk 'm!

  • Zerobase
  • Registratie: Februari 2007
  • Niet online
Sinds vandaag in het bezit van een Conrad McCrypt lichtkrant (http://www.conrad.nl/goto/?product=590996) en al zoekende op het forum blijkt er al iemand met een vergelijkbare lichtkrant bezig te zijn geweest :)

De McCrypt lichtkrant werkt op dezelfde manier als de Velleman lichtkrant (Zal me niks verbazen als het ding door dezelfde firma gemaakt is).

Mijn bedoeling is om 'm in de woonkamer aan de muur te schroeven. Via een RSS feed wil ik dan nieuwsberichten binnentrekken en op de lichtkrant weergeven.

Ik weet niet of de TS ook zoiets voor ogen heeft, maar mocht je al iets in die richting in elkaar gebakken hebben, dan houd ik me aanbevolen. Ben van plan om zelf iets in elkaar te gaan draaien met perl.

Acties:
  • 0 Henk 'm!

  • yohan
  • Registratie: April 2002
  • Laatst online: 19-09 16:04
Zerobase schreef op donderdag 07 februari 2008 @ 13:58:
Sinds vandaag in het bezit van een Conrad McCrypt lichtkrant (http://www.conrad.nl/goto/?product=590996) en al zoekende op het forum blijkt er al iemand met een vergelijkbare lichtkrant bezig te zijn geweest :)

De McCrypt lichtkrant werkt op dezelfde manier als de Velleman lichtkrant (Zal me niks verbazen als het ding door dezelfde firma gemaakt is).

Mijn bedoeling is om 'm in de woonkamer aan de muur te schroeven. Via een RSS feed wil ik dan nieuwsberichten binnentrekken en op de lichtkrant weergeven.

Ik weet niet of de TS ook zoiets voor ogen heeft, maar mocht je al iets in die richting in elkaar gebakken hebben, dan houd ik me aanbevolen. Ben van plan om zelf iets in elkaar te gaan draaien met perl.
Klinkt interessant! Misschien kun je ons in dit topic op de hoogte houden van je ontwikkelingen en het uiteindelijke resultaat :)

"I'm not a cynic. I get up every morning hoping to find an honest man." - [Jack McCoy, Law & Order]


Acties:
  • 0 Henk 'm!

  • Zerobase
  • Registratie: Februari 2007
  • Niet online
Als ik wat heb draaien dan meld ik dat hier wel.

Ding vreet overigens nauwelijks stroom. Ik meet zo'n 4 watt. Goedkoper in verbruik als een PC met beeldscherm.

Acties:
  • 0 Henk 'm!

  • Zerobase
  • Registratie: Februari 2007
  • Niet online
Net achter gekomen:

in 'DEMO' mode (Alle pagina's leeg) geeft het ding aan dat het een type 'AM03127' lichtkrant is. Als je hier op gaat zoeken via google kom je wat links tegen, waaronder deze:

http://www.f-secure.com/l...iation-in-the-linux-team/

Het ding wordt daar gebruikt met een IRCbot er achter zodat iedereen boodschappen op het ding kan laten verschijnen (Je stuurt de IRCbot een berichtje en het verschijnt op de lichtkrant).

Acties:
  • 0 Henk 'm!

  • Zerobase
  • Registratie: Februari 2007
  • Niet online
Gisteren de hele dag verder zitten prutsen (En ook vandaag weer bezig). Ik maak nu nog even gebruik van ActivePerl op Windows, maar ga de lichtkrant straks vanuit Linux aansturen.

Aansturen vanuit Perl is overigens erg simpel met het volgende stukje code:

use Win32::SerialPort;

sub to_serial_port
{
my $page = shift;
my $str = shift;

# calculate checksum
my $checksum = 0x74;
for (0..length($str)-1)
{
my $c = ord(substr($str, $_, 1));
$checksum = $checksum ^$c;
}

# Construct message

my $ledcode = sprintf ("<ID00><BE>05<E><ID00><L1><P%s><FE><MA><WC><FE>%s%02X<E><ID00><BF>06<E>", uc($page), $str, $checksum);


$com="COM1";
$PortObj=Win32::SerialPort->new($com);
$PortObj->baudrate(9600);
$PortObj->databits(8);
$PortObj->parity("none");
$PortObj->stopbits(1);
$PortObj->handshake("none");
$PortObj->write_settings;
$PortObj->write ($ledcode);
$PortObj->close;
undef $PortObj;
}

&to_serial_port ("A", "0123456789abcdefg");

Er zit echter een beperking aan deze manier van aansturen: Een boodschap van méér dan 17 karakters en de lichtkrant gaat op zwart. Na een powercycle van de lichtkrant krijg ik vervolgens wel de verstuurde boodschap te zien.

Als ik lengte van de string $ledcode uit bovenstaand stukje code bereken, kom ik bij 64 karakters uit. Het lijkt er op dat de interne buffer van de lichtkrant niet groter is dan 64 byte en als de data te snel komt binnenzeilen het ding de weg kwijt raakt.

Flowcontrol instellen heeft geen effect. Het enige dat opvalt als ik een seriele poortmonitor laat meelopen is dat het perlscript alle karakters in een enkele keer naar de lichtkrant wil sturen (IRP_MJ_WRITE) en dat het met de lichtkrant meegeleverde programma dat karakter voor karakter doet (Hier zie ik dus meerdere IRP_MJ_WRITEs voorbij komen, voor ieder karakter 1).

Ik ben nog zoekende naar een oplossing, zal er wel op neer komen dat alle karakters één voor één met korte tussenpozen naar de lichtkrant toe geschreven moeten worden.

Acties:
  • 0 Henk 'm!

  • Zerobase
  • Registratie: Februari 2007
  • Niet online
En de oplossing is gevonden:

my $microseconds=1_000;

for (0..length($ledcode)-1)
{
$PortObj->write (substr($ledcode, $_, 1));
Time::HiRes::usleep ($microseconds);
}

in plaats van

$PortObj->write ($ledcode);

Met tussenpozen van 1 milliseconde ieder karakter apart naar de lichtkrant schrijven werkt perfect. Eventueel kun je nog wat met de delay experimenteren. Te hoog is niet goed, te laag ook niet.

Ik ga de lichtkrant weer ophangen aan de muur en daarna verder met het schrijven van een RSS parser zodat ik het nieuws van de dag op de lichtkrant kan toveren.

Acties:
  • 0 Henk 'm!

  • Zerobase
  • Registratie: Februari 2007
  • Niet online
Er zit nog een fout in de berekening van de checksum.

Zolang je op pagina A tekst wegschrijft werkt de code prima, alleen pagina B en verder klopt de checksum niet. Wordt vervolgd.

Acties:
  • 0 Henk 'm!

  • yohan
  • Registratie: April 2002
  • Laatst online: 19-09 16:04
Zerobase schreef op donderdag 07 februari 2008 @ 13:58:
Sinds vandaag in het bezit van een Conrad McCrypt lichtkrant
Hoe is de lichtsterkte van dat ding? Volgens Conrad is die instelbaar; maar ik kan me voorstellen dat je 'em zo zacht mogelijk wilt laten schijnen. Anders wordt het (vooral van buitenaf gezien) nogal een kermisattractie in je woonkamer..

"I'm not a cynic. I get up every morning hoping to find an honest man." - [Jack McCoy, Law & Order]


Acties:
  • 0 Henk 'm!

  • Zerobase
  • Registratie: Februari 2007
  • Niet online
Fout gevonden:

De startwaarde voor de checksum moet zijn: 0x35.
Daarnaast moet je nog de letter van de pagina XORren met de berekende checksum.

# calculate checksum
my $checksum = 0x35;
for (0..length($str)-1)
{
my $c = ord(substr($str, $_, 1));
$checksum = $checksum ^ $c;
}
$checksum = $checksum ^ ord ($page);

Je kunt nu met een enkele routine elke pagina van de lichtkrant vullen. Stuurcodes voor kleur, scrollsnelheid en effecten zitten verborgen in de codes omgeven door "<XX>".

Ik heb verder een .PDF gevonden die het protocol beschrijft waarmee de lichtkrant wordt aangestuurd. Vooral de beschrijving van de "<XX>" codes is makkelijk, scheelt weer uitzoekwerk. De link: http://www.cs-internet.de...ED+Display+Board+V2_..pdf.

Succes met knutselen!

Acties:
  • 0 Henk 'm!

  • Zerobase
  • Registratie: Februari 2007
  • Niet online
Ik vind het op zich nog wel meevallen. Je kunt de brightness instellen in 4 stappen (100%, 75%, 50% en 25%). Tijdens het scrollen is bij 50% en 25% de tekst wel feller dan op het moment dat deze stil staat.

Verder, het ding is juist bedoeld om op te vallen.

Eventueel kun je de kleur instellen op alleen groene of rode tekst. De oranje kleur is wat feller dan alleen rood of groen (Er zitten per 'pixel' twee leds in, een rode en een groene, maakt samen oranje).
Yohan schreef op zondag 10 februari 2008 @ 16:30:
[...]

Hoe is de lichtsterkte van dat ding? Volgens Conrad is die instelbaar; maar ik kan me voorstellen dat je 'em zo zacht mogelijk wilt laten schijnen. Anders wordt het (vooral van buitenaf gezien) nogal een kermisattractie in je woonkamer..

Acties:
  • 0 Henk 'm!

  • erwink
  • Registratie: December 2000
  • Laatst online: 21:35
Hoi Zerobase,

Toevallig heb ik hetzelfde display gekregen, ik wil er ook text opzetten vanuit een database.

Nu programeer ik in c#

en heb het voor een gedeelte aan de praat.


C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
            string data = "Testje";
            string begindata = "<ID00><L1><PA><FE><MA><WC><FE>";
            string enddata = "<E>";
            string textdata;

            int checksum = 0x74;

            foreach (char c in data)
            {
                int charCode = (int)c;
                
                checksum = checksum ^ charCode;
            }


            string strCheckSum = String.Format("{0:X2}", checksum);

        textdata = begindata+data+strCheckSum+enddata;



Dit werk perfect. Ik kan nu een beep(bell) mee geven in de string ( <BA> ), tijd datum weergeven ( <KD> <KT> ) en texten naar de lichtkrant sturen.


Maar als ik nu iets wil aanpassen bijvoorbeeld de snelheid bv <MA> naar <MB> dan werkt het niet meer. Nu lees ik uit je post dat je over alles de checksum moet berekeken behalve het <IDxx>

Maar dan krijg ik de text niet op het display te zien.


C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
            
            string data = "Testje";
            string begindata = "<ID00>";
            string begincode = "<L1><PA><FE><MA><WC><FE>";
            string enddata = "<E>";
            string textdata;

        int checksum2 = 0x35;

            foreach (char cc in begincode + data)
            {
                int charCode2 = (int)cc;
                checksum2 = checksum2 ^ charCode2;
            }

            checksum2 = checksum2 ^ Char.Parse("A");  //Pagina A
            
            string strCheckSum = String.Format("{0:X2}", checksum2);

        textdata = begindata+begincode+data+strCheckSum+enddata;



Of zie ik nu iets grandioos over het hoofd?

Acties:
  • 0 Henk 'm!

  • dion_b
  • Registratie: September 2000
  • Nu online

dion_b

Moderator Harde Waren

say Baah

Twee dingen zie je over het hoofd:

1) dit topic is meer dan twee weken oud. Grote kans dat Zerobase dit niet meer actief volgt
2) sowieso gaat dit al lang niet meer over (Overige) Hardware, maar over aansturing via Perl of C#. Dat klinkt verdacht als iets wat in Devschuur thuishoort. Ik move even...

Move OH -> PRG

Oslik blyat! Oslik!


Acties:
  • 0 Henk 'm!

  • axis
  • Registratie: Juni 2000
  • Laatst online: 26-01-2023
Heb zelf geen lichtkrant, maar op verzoek van collega ErwinK eens wat zitten snuffelen. Als ik niet uit ga van jullie voorbeeldjes, maar zelf aan de hand van de documentatie code, dan kom ik op het volgende uit om zo snel mogelijk tekstjes te kunnen tonen.

Kan het zelf niet testen dus, maar ik heb me weer een half uurtje vermaakt:

ff snel console app:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //TESTING
            string s = getStringToSend(0, 1, "A", "A", "A", "A", "A", "Hello World");
            Console.WriteLine(s);
        }

        /// <summary>
        /// Create a 'sending page message' for sending to display board.
        /// All values according to documentation:
        /// All according to reference: http://www.cs-internet.de/_files/Communication+protocol+AM004-03127++LED+Display+Board+V2_..pdf
        /// </summary>
        /// <param name="Id">Board Id, eg: 0</param>
        /// <param name="Ln">Line Number, eg: 1</param>
        /// <param name="Pn">Page name, eg: A</param>
        /// <param name="Fx">Leading command, eg: A</param>
        /// <param name="Mx">Display Method, eg: A</param>
        /// <param name="Wx">Waiting time, eg: A</param>
        /// <param name="Fy">Lagging command, eg: A</param>
        /// <param name="Message">Message to display, for example: Hello World!</param>
        /// <returns>A string to send to the display board.</returns>
        private static string getStringToSend(int Id, int Ln, string Pn, string Fx, string Mx, string Wx, string Fy, string Message)
        {
            string strId = String.Format("<ID{0:00}>", Id);
            string strLn = String.Format("<L{0:0}>", Ln);    // Line Number, eg: 1
            string strPn = String.Format("<P{0}>", Pn);      // Page name, eg: A
            string strFx = String.Format("<F{0}>", Fx);      // Leading command, eg: A
            string strMx = String.Format("<M{0}>", Mx);      // Display Method, eg: A
            string strWx = String.Format("<W{0}>", Wx);      // Waiting time, eg: A
            string strFy = String.Format("<F{0}>", Fy);      // Lagging command, eg: A
            string strMessage = Message;

            string strPackageContent = strLn + strPn + strFx + strMx + strWx + strFy + strMessage;
            string strCheckSum = getCheckSum(strPackageContent);
            string strEnd = "<E>";

            string strSend = strId + strPackageContent + strCheckSum + strEnd;
            return strSend;
        }

        private static string getCheckSum(string PackageContent)
        {
            // derived from: http://www.codepedia.com/1/Calculating+and+Validating+NMEA+Checksums
            int Checksum = 0;
            foreach (char Character in PackageContent)
            {
                // Is this the first value for the checksum?
                if (Checksum == 0)
                {
                    // Yes. Set the checksum to the value
                    Checksum = Convert.ToByte(Character);
                }
                else
                {
                    // No. XOR the checksum with this character's value
                    Checksum = Checksum ^ Convert.ToByte(Character);
                }
            }
            // Return the checksum formatted as a two-character hexadecimal
            return Checksum.ToString("X2");
        }
    }
}



En ter verificatie, als ik de methode aanroep met:
code:
1
getStringToSend(0, 1, "A", "E", "A", "C", "E", "A");

krijg ik eruit:
code:
1
<ID00><L1><PA><FE><MA><WC><FE>A35<E>

En dat komt overeen met de gesniffde string van hierboven!

[ Voor 3% gewijzigd door axis op 14-03-2008 15:11 ]

Two advices for network troubleshooting.. learn to draw diagrams in Visio, and THINK IN LAYERS!


Acties:
  • 0 Henk 'm!

  • /\/\|)
  • Registratie: Juli 2000
  • Laatst online: 15-08 18:22
Het if-statement is overigens niet eens nodig.

Acties:
  • 0 Henk 'm!

  • erwink
  • Registratie: December 2000
  • Laatst online: 21:35
Bovenstaande code werkt als en trein :)

na diverse testen met de lichtkrant is deze nu in productie.

Acties:
  • 0 Henk 'm!

  • JozyDaPozy
  • Registratie: December 2002
  • Laatst online: 18-09 17:39
Nog even een toevoeging.

Ik heb ook de Conrad-lichtkrant onlangs gekocht en zat ook even te klooien met de checksum-berekening.
Nu kwam ik er na wat googlen achter dat het hier de NMEA-checksum betreft.
Het getal waarmee ge-xor-ed wordt is niet een vast getal, maar je eerste character.

Voorbeeldje in Delphi:
Delphi:
1
2
3
4
5
6
7
8
9
function Checksum_NMEA(const S: string): string;
var
    i, n: Byte;
begin
    n := Ord(S[1]);
    for i := 2 to Length(S) do
        n := n xor Ord(S[i]);
    result := IntToHex(n, 2);
end;


en in php:
PHP:
1
2
3
4
5
6
7
    function Checksum_NMEA($input) {        
        $out = ord($input[0]);
        for ($i = 1; $i < strlen($input); $i++) {
            $out ^= ord($input[$i]);
        }       
        return strtoupper(dechex($out));
    }

Acties:
  • 0 Henk 'm!

  • axis
  • Registratie: Juni 2000
  • Laatst online: 26-01-2023
JozyDaPozy schreef op zaterdag 22 maart 2008 @ 01:18:
Nog even een toevoeging.

Ik heb ook de Conrad-lichtkrant onlangs gekocht en zat ook even te klooien met de checksum-berekening.
Nu kwam ik er na wat googlen achter dat het hier de NMEA-checksum betreft.
Het getal waarmee ge-xor-ed wordt is niet een vast getal, maar je eerste character.
Klopt, dat zie je ook in de code die ik een paar posts naar boven heb geplaatst. Als je die link volgt kom je ook een pagina waarin die checksum methode wordt gebruikt voor NMEA.. En sja, bij NMEA gebruiken ze toevallig dezelfde methode, alle bytes in een string XORren.. (En er zijn waarschijnlijk nog 100 protocollen die dat doen)

Two advices for network troubleshooting.. learn to draw diagrams in Visio, and THINK IN LAYERS!


Acties:
  • 0 Henk 'm!

  • luteijn
  • Registratie: Maart 2008
  • Laatst online: 16-12-2022
Het perl-script op http://home.ircnet.de/cru/ledticker/ , hoewel voor een iets andere lichtkrant die kennelijk wat beperkter is, heeft nog wat features waar je in eerste instantie misschien niet aan denkt, zoals het uitfilteren/vervangen van bepaalde sequences in de tekst-berichten (met name <E>..) en een functie om de klok gelijk te zetten.

P.

Acties:
  • 0 Henk 'm!

  • p.de.clown
  • Registratie: Mei 2008
  • Laatst online: 27-06 16:00
Aanvullend: de link naar de protocol specificatie zoals hierboven gegeven doet het niet meer.

Wel werkt deze link:

http://www.domoticaforum....RGB%20ledbar%20conrad.pdf

Verder heb ik een versie in Python die prima werkt, deze maakt gebruik van de "pySerial" module voor RS232 communicatie.

De interface naar de LED-display is hier in een class "LedDisplay" gezet, die ook de mogelijkheid heeft om debugging info te printen (stel constructor parameter noisy = True). Zie ook de eenregelige checksum-berekening op regel 14 -- leuk dat het in Python zo kort kan.


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#! /usr/bin/env python

class LedDisplay:
    import serial, operator
    def __init__(self, device, device_id = 1, timeout = 0.1, noisy = False):
        self._device    = device
        self._device_id = device_id
        self._timeout   = timeout
        self._noisy     = noisy
        self._port      = self.serial.Serial(self._device, 9600, self.serial.EIGHTBITS, self.serial.PARITY_NONE, self.serial.STOPBITS_ONE, self._timeout, False, False)
    def __del__(self):
        self._port.close()
    def send(self, data_packet):
        checksum = reduce(self.operator.__xor__, map(ord, data_packet), 0)
        command = "<ID%02X>%s%02X<E>" % (self._device_id, data_packet, checksum)
        if self._noisy:
            print "sending to device %s: \"%s\"" % (self._device, command)
        self._port.write(command)
        response = self._port.read(100)
        if self._noisy:
            if len(response) == 0:
                print "received no response from device \"%s\"." % self._device
            else:
                print "received %d-byte response from device \"%s\": \"%s\"." % (len(response), self._device, response)

def main():

    ledz = LedDisplay("/dev/ttyS0", noisy = True)

    for i in range(1, 1 + 8):
        ledz.send("<L%d><PA><FA><MA><WC><FA>This is line # %d" % (i, i))

    del ledz

if __name__ == "__main__":
    main()


Tenslotte een vraag: in de protocol spec, sectie 4.2.2 wordt gesproken over "Lines". Mijn eerste indruk was dat de verschillende "Lines" op 1 "Page" na elkaar zouden worden weergegeven. Echter, dat lijkt niet het geval te zijn (zie bijvoorbeeld het Python programmaatje hierboven).

Wat is zie is dat ik L1 t/m L9 kan programmeren (ik krijg dan een ACK terug); maar het is mij nog op geen enkele manier gelukt om een andere regel dan L1 zichtbaar te maken op het display.

Heeft iemand hiermee meer succes gehad?

Acties:
  • 0 Henk 'm!

  • p.de.clown
  • Registratie: Mei 2008
  • Laatst online: 27-06 16:00
Nog een vraagje: is iemand erin geslaagd om de lichtkrant zo aan te sturen dat je "naadloos" van een message naar de volgende kunt overgaan?

Voor zover ik het zie wordt het scherm altijd kortstondig donker als er RS232-verkeer wordt ontvangen door de lichtkrant.

Acties:
  • 0 Henk 'm!

  • skaty666
  • Registratie: Juni 2009
  • Laatst online: 14-06 23:23
Hoi,

Ik heb me ook eens bezig gehouden met een programma te schrijven om het lichtkrant aan te sturen.
Ik heb dit in vb.net geschreven en er hangt een access database aan.

Ik heb 3 tabellen voorzien voor een lijst van berichten met instelbare effecten...
Een volledige tabel kan dan in één keer worden gedownload.


Source code: http://sjockfestival.200u...htkrant/VB_Lichtkrant.txt (hernoemen naar .zip)

Afbeeldingslocatie: http://sjockfestival.200u.com/Software/Lichtkrant/Lichtkrant.jpg


Misschien dat er nog wel mensen de originele software slecht vinden, en dat ik ze hier mee kan helpen....


Ik heb deze software geschreven omdat wij met ons muziek festival (SJOCK.COM) een lichtkrant gebruiken waarbij het toch wel handig is als je weet wat je nu in de lichtkrant gaat steken.
Met de originele software was er volledig geen overzicht.

[ Voor 20% gewijzigd door skaty666 op 17-01-2010 12:13 . Reden: aanpassing links ]

Pagina: 1