{"id":581,"date":"2014-12-29T15:25:48","date_gmt":"2014-12-29T14:25:48","guid":{"rendered":"http:\/\/www.leinders.de\/harald\/?p=581"},"modified":"2019-12-03T10:52:22","modified_gmt":"2019-12-03T09:52:22","slug":"kaum-macht-mans-richtig","status":"publish","type":"post","link":"https:\/\/www.leinders.de\/harald\/2014\/12\/29\/kaum-macht-mans-richtig\/","title":{"rendered":"Kaum macht man&#8217;s richtig&#8230;"},"content":{"rendered":"<p>Wir haben bei uns im B\u00fcro einen Spruch, der immer zur Anwendung kommt, nachdem man ca. eine halbe Stunde betriebsblind auf eine Konfiguration oder eine Stelle im Quelltext eines Programms gestarrt hat und sich fragt, warum in aller Welt das Ganze nicht funktioniert. Meist kommt dann ein Kollege vorbei, schaut f\u00fcr zwei Sekunden auf den Bildschirm und meint sowas wie: &#8222;Du, das kann doch nicht klappen, guck mal da.&#8220;<\/p>\n<p>In solchen Situationen f\u00e4llt dann der Spruch: &#8222;Kaum macht man&#8217;s richtig, schon funktioniert&#8217;s.&#8220; Wir wollten das schon lange als Schild, als Brandmalerei auf Holz oder als Buzzer haben, um das bei Bedarf hochhalten oder ausl\u00f6sen zu k\u00f6nnen, aber es kam nie dazu &#8211; bis jetzt. Bei Ebay entdeckten wir eine LED-Laufschrift f\u00fcr kleines Geld, und da der besagte Satz kurz vorher mal wieder gefallen war, wollten wir endlich ernst machen. Gesagt, getan, Artikel geschossen. BTW: Die gibt es auch neu bei Pearl. \ud83d\ude09<\/p>\n<p><a class=\"boxersandswipers\" title=\"pe9441_2\" href=\"https:\/\/www.leinders.de\/harald\/wp-content\/uploads\/2014\/12\/pe9441_2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-584\" src=\"https:\/\/www.leinders.de\/harald\/wp-content\/uploads\/2014\/12\/pe9441_2.png\" alt=\"pe9441_2\" width=\"800\" height=\"262\" srcset=\"https:\/\/www.leinders.de\/harald\/wp-content\/uploads\/2014\/12\/pe9441_2.png 800w, https:\/\/www.leinders.de\/harald\/wp-content\/uploads\/2014\/12\/pe9441_2-300x98.png 300w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px\" \/><\/a><!--more--><\/p>\n<p>Der Verk\u00e4ufer meinte zwar dazu, er h\u00e4tte das Ding nicht an&#8217;s Laufen bekommen, aber wir sind ja f\u00e4hige Techniker (*hust*) und waren voller Vertrauen, dass das irgendwie hinzukriegen sei. \ud83d\ude42<\/p>\n<p>Als dann endlich das P\u00e4ckchen ankam, war die Entt\u00e4uschung aber eher gro\u00df: Trotz aller Versuche, der heruntergeladenen Anleitung (die wir sogar gelesen haben!) und aller m\u00f6glichen Treiber f\u00fcr den seriellen Port war mit dem Ding keinerlei Kontakt aufzunehmen. Das Einzige, was es von sich gab, war eine Folge wahlloser Blitze beim Einschalten. Na toll.<\/p>\n<p>Also passierte das, was wir immer machen, wenn wir nicht weiter wissen: Aufschrauben und nachgucken. Stutzig machte uns ein Hinweis in einem Forum, dass das Ger\u00e4t&nbsp; mit einer 5V Stromversorgung l\u00e4uft und daher in einem PKW nicht an die Batterie angeschlossen werden k\u00f6nne. Nach einem kurzen Blick auf das vom Verk\u00e4ufer mitgelieferte Netzteil hatten wir dann eine spontane Ahnung, warum er das Ger\u00e4t nicht an&#8217;s Laufen bringen konnte: Genau. Er hat ein 12V-Netzteil benutzt. Also &#8222;ad\u00e9, TTL-IC&#8217;s.&#8220; \ud83d\ude42<\/p>\n<p>Die Frage war dann nur noch, ob wir jetzt einen sehr teuren und unhandlichen Briefbeschwerer ersteigert hatten oder ob sich mit dem Ding noch was machen lie\u00dfe. Grunds\u00e4tzlich konnte es ja noch was (blitzen), also konnte es auch nicht v\u00f6llig kaputt sein. Da es nun schon mal offen war, konnten wir ja mal schauen, wie das Ganze so funktioniert. Eigentlich waren nur drei verschiedene Typen von IC&#8217;s zu entdecken. Einmal ein Atmel ATmega8\/L, der als klassischer \u00b5C wohl die Steuerung des Lauflichts zu erledigen hatte und mit Sicherheit das erste Opfer der 12V-Spannung war (die externe Stromversorgung ging per Leiterbahn direkt auf den Pin7 &#8211; *fump*). Ansonsten waren da nur eine Handvoll SN74HC164 (das sind 8-Bit Schieberegister ohne Latch) und vier APM4953 (MOSFET Treiber). Die Beschaltung der insgesamt 10 5&#215;7-LED-Elemente legte dann nahe, dass diese spaltenweise durch die Schieberegister und zeilenweise durch die Stromtreiber gesteuert wurden. Man muss sich das Ganze wie das zeilenweise Darstellen von Bildern auf einer alten Fernseh-R\u00f6hre vorstellen. Jede Zeile wird nacheinander aktiviert und durch den Status der 6 Schieberegister leuchten dann die entsprechenden LED&#8217;s in diesen Spalten. Wenn man das schnell genug hintereinander macht, hat man den Eindruck eines stehenden Bildes. <a class=\"boxersandswipers\" title=\"Lunartec-Board\" href=\"https:\/\/www.leinders.de\/harald\/wp-content\/uploads\/2014\/12\/Lunartec-Board.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-600\" src=\"https:\/\/www.leinders.de\/harald\/wp-content\/uploads\/2014\/12\/Lunartec-Board.jpg\" alt=\"Lunartec-Board\" width=\"800\" height=\"365\" srcset=\"https:\/\/www.leinders.de\/harald\/wp-content\/uploads\/2014\/12\/Lunartec-Board.jpg 800w, https:\/\/www.leinders.de\/harald\/wp-content\/uploads\/2014\/12\/Lunartec-Board-300x137.jpg 300w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px\" \/><\/a>Die Schieberegister waren dabei \u00fcber die Pins Q<sub>H<\/sub> und B hintereinander geschaltet und ergaben so ein einziges Schieberegister von 48 Bit L\u00e4nge (die fehlenden zwei Spalten kommen nachher :-)). Der Eingang B des ersten Registers und das f\u00fcr alle Register gleiche CLK-Signal kam direkt vom ATmega. Alsoooooo&#8230;.. DAS kann man doch nachbauen. \ud83d\ude42<\/p>\n<p>Womit wir dann wieder beim Thema Arduino w\u00e4ren. Nicht nur, weil da nat\u00fcrlich auch ein ATmega drauf ist (wenn auch ein 328er), sondern weil man damit genau solche Steuerungen umsetzen kann. Es fehlt da nur an zwei Dingen:<\/p>\n<ul>\n<li>Einer physikalischen Verbindung zum Lauflicht<\/li>\n<li>Einer passenden Firmware.<\/li>\n<\/ul>\n<h2>&#8222;Kirk an Enterprise&#8220; &#8211; Die Verbindung mit der Platine<\/h2>\n<p>Als erstes musste mal der arme, alte und gebratene ATmega8 raus. DIP-Sockel sind scheinbar v\u00f6llig \u00fcberbewertet, daher war dieser nat\u00fcrlich auch fest mit der Platine verl\u00f6tet. So etwas auszul\u00f6ten ist bei 28 Beinchen schon eine Herausforderung, an der ich auch komplett gescheitert bin. \ud83d\ude42<\/p>\n<p>So schnell bekommt man die L\u00f6tpunkte selbst mit Ausl\u00f6tpumpe und Entl\u00f6t-Litze nicht alle gleichzeitig hei\u00df, um den diesen starren, unflexiblen und hartn\u00e4ckigen kleinen Sch&#8230; \u00e4h, Chip auch nur ansatzweise lose zu bekommen. Nach einer halben Stunde Fluchen und etlichen Brandblasen gab ich&#8217;s dann auf, bevor die Platine komplett ruiniert war und holte schweres Werkzeug: Einen ganz kleinen Dremel mit einer ganz winzig kleinen Trennscheibe. Mit einem wahrscheinlich ziemlich unanst\u00e4ndigem und schadenfrohen Grinsen bekam der ATmega dann nacheinander alle 28 Beine amputiert. Die verbleibenden &#8222;St\u00fcmpfe&#8220; waren dann einzeln und mit einer kleinen Zange beim Ausl\u00f6ten kein Problem mehr.<\/p>\n<p><a class=\"boxersandswipers\" title=\"Kill-Mega\" href=\"https:\/\/www.leinders.de\/harald\/wp-content\/uploads\/2014\/12\/Kill-Mega.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-601\" src=\"https:\/\/www.leinders.de\/harald\/wp-content\/uploads\/2014\/12\/Kill-Mega-300x247.png\" alt=\"Kill-Mega\" width=\"300\" height=\"247\" srcset=\"https:\/\/www.leinders.de\/harald\/wp-content\/uploads\/2014\/12\/Kill-Mega-300x247.png 300w, https:\/\/www.leinders.de\/harald\/wp-content\/uploads\/2014\/12\/Kill-Mega.png 932w\" sizes=\"auto, (max-width: 300px) 85vw, 300px\" \/><\/a>Damit mir das nicht noch mal passiert, habe ich dann an die Stelle des ATmega auf der R\u00fcckseite der Platine einen passenden DIP-Sockel eingel\u00f6tet und mit Hilfe zweier weiterer Sockel ein Flachband-Kabel gebastelt. Das l\u00e4sst sich l\u00f6sen und auch wieder einstecken, ohne den L\u00f6tkolben anwerfen zu m\u00fcssen. Das Ganze wurde dann nach Au\u00dfen gef\u00fchrt und endete auf einer kleinen Platine, wo dann, wieder von einem DIP-Sockel aus, die entsprechenden Verbindungen zum Einen auf eine Headerleiste, zum Anderen auf einen passenden 32-Pol-Sockel verl\u00f6tet wurden. Da der Arduino keinen Akku hat, kann er sich leider auch die Uhrzeit nicht merken. Daher haben wir ihm noch eine kleine batteriegepufferte Echtzeituhr spendiert, die einen \u00fcber I2C angesprochenen DS1307 an Bord hat. Daf\u00fcr brauchten wir allerdings Geduld; die Laufzeit dieser Bestellung (per Ebay in China geordert) war 11 Wochen. \ud83d\ude42<\/p>\n<p>Das sieht zwar alles nicht wirklich so aus, als k\u00f6nne man damit seine Elektroniker-Lehre bestehen, aber es funktioniert und zeugt von Hartn\u00e4ckigkeit beim L\u00f6ten (und der Verwendung einer Lupe). Man beachte den 1a Lego-Ger\u00e4tehalter. \ud83d\ude42<\/p>\n<p><a class=\"boxersandswipers\" title=\"Platine_komplett\" href=\"https:\/\/www.leinders.de\/harald\/wp-content\/uploads\/2014\/12\/Platine_komplett.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-627\" src=\"https:\/\/www.leinders.de\/harald\/wp-content\/uploads\/2014\/12\/Platine_komplett-300x175.png\" alt=\"Platine_komplett\" width=\"300\" height=\"175\" srcset=\"https:\/\/www.leinders.de\/harald\/wp-content\/uploads\/2014\/12\/Platine_komplett-300x175.png 300w, https:\/\/www.leinders.de\/harald\/wp-content\/uploads\/2014\/12\/Platine_komplett.png 971w\" sizes=\"auto, (max-width: 300px) 85vw, 300px\" \/><\/a>Lustig war, dass man bei Ber\u00fchrung der richtigen Pins schon Zeilen und Spalten ansprechen konnte &#8211; das hab&#8216; ich beim Durchmessen mit dem Multimeter entdeckt. Prima, es war scheinbar nicht alles gebraten durch den 12V-Schock. Allerdings lie\u00dfen sich die ersten 7 Spalten von links durch nichts zu etwas Sinnvollem verleiten. Das liegt an dem, vom Stromanschluss aus gesehen, ersten Schieberegister, welches offensichtlich auch einen t\u00f6dlichen Stromschlag erhalten hatte und auf allen 8 Ausg\u00e4ngen ein Dauer-HIGH hat. Gn\u00e4digerweise hat es das wenigstens nur mit ca. 7V, so dass es durch seinen fr\u00fchen Tod seine nachgeschalteten Kollegen vor dem Hirnschlag bewahrt hat. Beinahe r\u00fchrend, das erinnert doch an diese Kriegsgeschichten, wo sich der Held auf die Handgranate wirft, um seine Kameraden zu retten. Nun, zumindest hier hat es funktioniert. \ud83d\ude42<\/p>\n<p>Es gibt tats\u00e4chlich in der K\u00f6lner Innenstadt noch einen Laden, wo man einen solchen&nbsp; SN74HC164 kaufen kann. Ok, f\u00fcr&nbsp; \u20ac 2,- statt f\u00fcr 10 Cent wie bei Ebay, daf\u00fcr aber zum Mitnehmen und nicht erst in 11 Wochen. Am gleichen Nachmittag war also das defekte Schieberegister durch ein neues ersetzt, jetzt lie\u00dfen sich alle Spalten reproduzierbar ansprechen. Damit war der elektronische Part fertig.<\/p>\n<p><a class=\"boxersandswipers\" title=\"IMG_0542\" href=\"https:\/\/www.leinders.de\/harald\/wp-content\/uploads\/2014\/12\/IMG_0542.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-628\" src=\"https:\/\/www.leinders.de\/harald\/wp-content\/uploads\/2014\/12\/IMG_0542-300x225.jpg\" alt=\"IMG_0542\" width=\"300\" height=\"225\" srcset=\"https:\/\/www.leinders.de\/harald\/wp-content\/uploads\/2014\/12\/IMG_0542-300x225.jpg 300w, https:\/\/www.leinders.de\/harald\/wp-content\/uploads\/2014\/12\/IMG_0542.jpg 1024w\" sizes=\"auto, (max-width: 300px) 85vw, 300px\" \/><\/a><\/p>\n<h2>Scotty: &#8222;Computer&#8230; Computer&#8230; Hallo, Computer.&#8220;<\/h2>\n<p>Eigentlich w\u00e4re hier auch ein Zitat aus Frankensteins Monster passend gewesen, immerhin geht es darum, dem lobotomisierten Lunartec-Lauflicht ein neues Hirn zu verpassen. Nat\u00fcrlich h\u00e4tte man auch \u00fcberlegen k\u00f6nnen, wieder einen ATmega8 einzusetzen, aber eine Firmaware h\u00e4tte man sowieso schreiben m\u00fcssen und einen Hardware-Programmer habe ich nicht. Also lieber einen <strong>Arduino Nano<\/strong> nehmen, der eine USB-Schnittstelle zur sp\u00e4teren Ansteuerung gleich mitbringt und \u00fcber diese auch programmiert wird. Der Nano hat die gleichen M\u00f6glichkeiten wie ein Uno, nur bei einer wesentlich kompakteren Bauform. Insgesamt braucht man 11 Ausg\u00e4nge: 7 f\u00fcr die Ansteuerung der MOSFETS (Zeilen), einen f\u00fcr den Eingang des gekoppelten 48-Bit-Schieberegisters, einen f\u00fcr das Clock-Signal und zwei weitere, die die ersten beiden Spalten des Displays ansteuern. Das waren die beiden, die in der Rechnung oben noch fehlten: 50 Spalten bei 48 Bit-Schieberegister, da fehlen zwei. \ud83d\ude42 Nachmessen mit dem Multimeter hatten ergeben, dass die auch im Original direkt vom ATmega8 kamen. Der Nano hat reichlich digitale Ausg\u00e4nge (14) und dar\u00fcber hinaus noch Pins f\u00fcr den I2C-Bus f\u00fcr die Kommunikation mit der Echtzeituhr.<\/p>\n<p>Was die Firmware leisten muss, ist eigentlich auch \u00fcberschaubar. Sie muss das Display ansteuern und einen Text darstellen k\u00f6nnen, und sie muss \u00fcber die USB-Schnittstelle Texte und Befehle entgegen nehmen k\u00f6nnen.<\/p>\n<p>Der Teufel steckt hier nat\u00fcrlich im Detail. Da die Schieberegister keinen Latch haben, muss man man permament in einer Schleife zeilenweise die Schieberegister komplett f\u00fcllen (die beiden direkt vom \u00b5C gesteuerten Spalten rechne ich einfach hier hinzu) und dann den richtigen MOSFET-Ausgang einschalten. Bei diesem LED-Matrix-Typ bedeutet das \u00fcbrigens sowohl f\u00fcr die Schieberegister als auch f\u00fcr die Zeilen-Treiber, den Ausgang auf LOW zu setzen. Das muss man dann schnell genug wiederholen, damit sich f\u00fcr das Auge ein stehendes Bild ergibt. Ungl\u00fccklicherweise ist der RAM (Platz f\u00fcr Variablen und Laufzeitobjekte) bei diesem Arduino Nano recht knapp bemessen (2K), so dass man hier wirklich Platz sparen und mit jedem Bit haushalten muss. Daher sind die Charmaps (die man f\u00fcr die darzustellenden Zeichen und Ziffern auch selber hinterlegen muss) in 7&#215;5-Kodierung hinterlegt, also 5 Byte pro Buchstabe. Damit hat man f\u00fcr ein Zeichen nur 5 Bit &#8222;Verschnitt.&#8220; Sie liegen also sozusagen &#8222;auf der Seite&#8220;. Leider muss man daher bei jedem Zeichen, welches man darstellen m\u00f6chte, eine Spalten-zu-Zeilen-Zuordnung vornehmen und sich ganz genau \u00fcberlegen, wleches Bit einer Buchstaben-Spalte man in welcher Zeile an welche Stelle in das Schieberegister schiebt. Auf den Kern dieses Algorithmus, der tats\u00e4chlich funktioniert, bin ich auch m\u00e4chtig stolz: \ud83d\ude42<\/p>\n<p><code>&nbsp;&nbsp;&nbsp; for (r=0; r&lt;NUMROWS; r++) {<\/code><br \/>\n<code>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;lbptr = (byte *)linebuf[r];<\/code><br \/>\n<code>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;lbptr[0] = lbptr[0] &lt;&lt; 1;<\/code><br \/>\n<code>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for (b=1; b&lt;DISPLAYBYTES; b++) {<\/code><br \/>\n<code>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (bitRead(lbptr[b], 7)) {<\/code><br \/>\n<code>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;lbptr[b-1] += 1;<\/code><br \/>\n<code>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<\/code><br \/>\n<code>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;lbptr[b] = lbptr[b] &lt;&lt; 1;<\/code><br \/>\n<code>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<\/code><br \/>\n<code>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;\/\/ Add last bit from cur char<\/code><br \/>\n<code>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;bitWrite(lbptr[DISPLAYBYTES-1], dsp_lastbit, bitRead((byte)colmap, r));<\/code><br \/>\n<code>&nbsp;&nbsp; &nbsp;}<\/code><\/p>\n<p>Der n\u00e4chste gro\u00dfe Block war die Kommunikationsschnittstelle. Angebunden wird das Lauflicht \u00fcber die gute alte &#8222;Serielle Schnittstelle&#8220; oder auch &#8222;RS232.&#8220;<br \/>\nOhne jetzt in&#8217;s Detail gehen zu wollen, versteht das Lauflicht Anweisungen vom Typ:<\/p>\n<p><code>&lt;C&gt;Payload&lt;E&gt;<\/code><\/p>\n<p>Dabei steht C f\u00fcr die Kommandos:<\/p>\n<ul>\n<li>D: Duration == Anzeigedauer einer Nachricht<\/li>\n<li>S: Speed == Geschwindigkeit, mit der ein Text zur Seite scrolled<\/li>\n<li>T: Setzen der Systemzeit<\/li>\n<li>M: Anzeigen einer Nachricht<\/li>\n<li>R: Rotieren (scrollen) einer Nachricht.<\/li>\n<\/ul>\n<p>Je nach Kommando ist die &#8222;Payload&#8220; die anzuzeigende Nachricht oder der zu setzende Wert. Um sicherzustellen, dass die Anweisung vollst\u00e4ndig ist, erwartet der Arduino immer ein abschlie\u00dfendes &lt;E&gt; f\u00fcr &#8222;Ende&#8220;.<\/p>\n<p>Alles in allem funktioniert die Firmware stabil. Insgesamt bin ich dabei mit 13192 Byte f\u00fcr das Programm und 1837 Bytes f\u00fcr Variablen und Puffer zurechtgekommen und kann damit 1K gro\u00dfe Nachrichten darstellen. Das sind immerhin \u00fcber 7 SMS. \ud83d\ude42<\/p>\n<p>Man kann jetzt also dem Lauflicht Nachrichten schicken, die es darstellt. Wenn es nichts zu tun hat, zeigt es einfach die Uhrzeit. Irgendwann f\u00fcge ich noch einen Countdown bis zum Feierabend hinzu. \ud83d\ude42<\/p>\n<p>Wer sich f\u00fcr das Programm interessiert, kann es sich hier ansehen und auch herunterladen: <a href=\"https:\/\/www.leinders.de\/harald\/wp-content\/uploads\/2019\/12\/Lunartec_Arduino.zip\">Lunartec_Arduino.zip<\/a><\/p>\n<h2>&#8222;Mr. Spock, wie kann man dieses&#8230; DING kontrollieren?&#8220;<\/h2>\n<p>Der Arduino hat <em>eine<\/em> wirklich bl\u00f6de Angewohnheit: Wenn man die serielle Schnittstelle \u00f6ffnet und DSR auf HIGH geht, resettet sich der Arduino. Wenn man das Lauflicht also wirklich benutzen will und lustige Nachrichten darstellen m\u00f6chte, braucht man auf dem Steuerrechner (z.B. einem Raspberry oder, wie bei uns, einem alten Mac Mini) einen Daemon, der auf Nachrichten aus dem Netzwerk wartet und diese an die permanent ge\u00f6ffnete serielle Schnittstelle und damit an das Lauflicht weitergibt. Das ist nat\u00fcrlich um Lichtjahre komfortabler als das, womit das eigentlich verkauft wird: Einer Handsteuerung mit vier Pfeil- und einer Enter-Taste, wo man die Nachrichten buchstabenweise m\u00fchsam zusammensetzen muss. \ud83d\ude42<\/p>\n<p>Da ich hier die Wahl hatte, musste ich nat\u00fcrlich nicht C++ wie bei der Arduino-Firmware nehmen sondern konnte auf meine aktuelle Lieblingssprache, <strong><a href=\"https:\/\/golang.org\/\">Go<\/a><\/strong>, zur\u00fcckgreifen. Go ist eine absolut gelungene Mischung aus Python und C, die das Beste beider Welten kombiniert. Einer der Erfinder dieser Sprache ist \u00fcbrigens die beinahe-Gottheit der UNIX-Welt, Ken Thompson.<\/p>\n<p>Auch hier m\u00f6chte ich nicht unn\u00f6tig ins Detail gehen. Der Daemon &#8222;lunartecd&#8220; lauscht auf einem definierten Port auf Nachrichten von Client-Programmen (z.B. dem Kommandozeilen-Tool &#8222;lunartec&#8220;) aus dem Netzwerk. Der Datenaustausch passiert dabei \u00fcber JSON und Webservices, so dass man genauso schnell einen Client f\u00fcr den Browser oder einen Client mit GUI f\u00fcr ein beliebiges Betriebssystem bauen kann. Die Komandos werden auf Korrektheit kontrolliert und dann an das Lauflicht weitergeleitet. Der Daemon selber funktioniert multithreaded, also mit eigenen, voneinander unabh\u00e4ngigen Prozessen f\u00fcr die Verwaltung der seriellen Schnittstelle und der Verbindungen auf dem netzwerk-Stack (bei Go &#8222;gorouties&#8220; genannt). Er stellt dabei einen echten kleinen Webserver bereit, der seine Webservices mit GET und PUT bedienen l\u00e4sst. Er implementiert somit das REST-Protokoll. Die Threads unterhalten sich intern \u00fcber Message-Channels.<\/p>\n<p>Der dazu geh\u00f6renden kleine Kommandozeilen-Client &#8222;lunartec&#8220; nimmt Nachrichten als Parameter entgegen und verschickt sie an den Webservice. Auch hier gilt: Wen das Ganze interessiert, der kann es sich hier anschauen oder herunter laden: <a href=\"https:\/\/www.leinders.de\/harald\/wp-content\/uploads\/2019\/12\/Lunartec_Go.zip\">Lunartec_Go.zip<\/a><\/p>\n<p>Naja, und um den Kreis zu schlie\u00dfen: <strong>Darum haben wir das alles gemacht!<\/strong><\/p>\n<div style=\"width: 840px;\" class=\"wp-video\"><video class=\"wp-video-shortcode\" id=\"video-581-1\" width=\"840\" height=\"473\" preload=\"metadata\" controls=\"controls\"><source type=\"video\/mp4\" src=\"https:\/\/www.leinders.de\/harald\/wp-content\/uploads\/2014\/12\/Kmmrsf_ns.mp4?_=1\" \/><a href=\"https:\/\/www.leinders.de\/harald\/wp-content\/uploads\/2014\/12\/Kmmrsf_ns.mp4\">https:\/\/www.leinders.de\/harald\/wp-content\/uploads\/2014\/12\/Kmmrsf_ns.mp4<\/a><\/video><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Wir haben bei uns im B\u00fcro einen Spruch, der immer zur Anwendung kommt, nachdem man ca. eine halbe Stunde betriebsblind auf eine Konfiguration oder eine Stelle im Quelltext eines Programms gestarrt hat und sich fragt, warum in aller Welt das Ganze nicht funktioniert. Meist kommt dann ein Kollege vorbei, schaut f\u00fcr zwei Sekunden auf den &hellip; <a href=\"https:\/\/www.leinders.de\/harald\/2014\/12\/29\/kaum-macht-mans-richtig\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eKaum macht man&#8217;s richtig&#8230;\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[1,9],"tags":[],"class_list":["post-581","post","type-post","status-publish","format-standard","hentry","category-allgemein","category-arduino"],"_links":{"self":[{"href":"https:\/\/www.leinders.de\/harald\/wp-json\/wp\/v2\/posts\/581","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.leinders.de\/harald\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.leinders.de\/harald\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.leinders.de\/harald\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.leinders.de\/harald\/wp-json\/wp\/v2\/comments?post=581"}],"version-history":[{"count":49,"href":"https:\/\/www.leinders.de\/harald\/wp-json\/wp\/v2\/posts\/581\/revisions"}],"predecessor-version":[{"id":597,"href":"https:\/\/www.leinders.de\/harald\/wp-json\/wp\/v2\/posts\/581\/revisions\/597"}],"wp:attachment":[{"href":"https:\/\/www.leinders.de\/harald\/wp-json\/wp\/v2\/media?parent=581"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.leinders.de\/harald\/wp-json\/wp\/v2\/categories?post=581"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.leinders.de\/harald\/wp-json\/wp\/v2\/tags?post=581"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}