[Tutorial] Luacontroller mit pin und port

Mahlzeit ihr interessierten!

Es mag daran liegen, dass ich die Erklärung auf der Homepage vom Luacontroller nicht richtig verstanden habe, aber die Sache mit Pin und Port ist mir echt lange wirklich auf die Nerven gegangen. Warum zur Hölle wollte das nie so funktionieren, wie ich es haben wollte?

Nun, die Antwort war eigentlich ganz einfach und offenbart eine kleine Schwäche in den Bezeichnungen des Luacontrollers. Hätte man in der Beschreibung p-in, geschrieben anstelle von Pin, so hätte ich den Zusammenhang wahrscheinlich schneller verstanden. Oder wenn es als Gegenstück zu Pin ein Pout gegeben hätte, anstelle von Port.

Denn wenn man es genau nimmt, ist es genau so gedacht. Pin besagt, dass ein Mesecons-Signal von aussen am Controller ankommt, während Port dafür sorgt, dass einer der vier Anschlüsse aktiviert wird. Doch egal, hier kommt nun ein kleines Tutorial, wie man mit Pin und Port umgeht und ein kleines Beispiel, was man damit zum Beispiel machen kann.

Hier hätten wir meinen wundervollen Bastelraum. Perfekt gelegen keine zehn Meter neben meinem Atomkraftwerk. Ideal, wenn das Licht nicht geht, denn man leuchtet so wunderschön im dunkeln.

Aber Spass beiseite.  Hier kommen nun die verschiedenen Komponenten rein, die wir für das Tutorial brauchen.

Für die, die bislang mit Mesecons noch nichts am Hut hatten, Mesecons ist prinzipiell so etwas wie ein Stromkreis. Zu meinem Bedauern wird jedoch anscheinend freie Energie verwendet, denn auch wenn es Generatoren für Mesecons gibt (Wasserturbine, Solarzelle …), scheint der Strom aus der Luft zu kommen. Vielleicht wird es deshalb auch Signal und nicht Strom genannt. Meiner Meinung nach wäre es dennoch schöner, wenn man wie bei Technic auch bei Mesecons einen Generator betreiben müsste, um etwas zum laufen zu bringen.

Gut, was hier nun passiert wird man sich denken können. Ein Schalter, eine Mesecons-Leitung und ein grünes Licht.

Schalter an und schon leuchtet das Licht. Ganz ohne Energiequelle. Wie man auch sehen kann, leuchtet auch die Leitung dazwischen. Sehr praktisch, falls man mal eine längere Strecke baut und zwischendrin etwas vergessen hat. Es fällt auch auf grössere Distanz prima auf.

So ein Schalter ist aber statisch und langweilig. Er taugt dafür, um etwas an und aus zuschalten. Ich verwende es zum Beispiel gerne, um meine unterirdischen Bauten zu beleuchten. Hat auch einen schönen Effekt, da das Signal offensichtlich nicht wie üblich mit Lichtgeschwindigkeit davoneilt. Bei grösseren Flächen ergibt sich dabei ein Effekt, wie in der Realität in grösseren Lagerhäusern.

Für Lichter ist das ja noch in Ordnung. Doch will man etwas komplexeres mit den Signalen bauen, dann muss das Signal einfach flexibler sein.

Genau hier kommt der Luacontroler ins Spiel. Wohl mit eine der genialsten Erweiterungen überhaupt. Es lassen sich wirklich die unmöglichsten Dinge damit verwirklichen, da man das Teil in der Tat mit einer richtigen Skriptsprache programmieren kann. Eine Sprache, wie sie zum Beispiel auch in dem Window-Manager Awesome für Linux zum Einsatz kommt. Es ist also keine Sprache, die nur ein paar lahme Funktionen am Start hat, sondern eine wahrlich ausgewachsene. Nicht so wie C/C++, Lava, oder C#, aber man kann allerhand damit anrichten. Direkt im spiel!

Gut. Schauen wir uns das Teil mal genauer an. Wie man sieht hat er vier Anschlüsse. A, B, C und D. Von links angefangen im Uhrzeigersinn. Hier kann man nun entweder Mesecons, oder eine Digiline anschliessen. Digiline wäre zu bevorzugen, da man dann nur einen der Anschlüsse braucht und dennoch unzählige Geräte anschliessen kann, doch hier geht es um Mesecons und wie man sich vorstellen kann, ist nach vier Geräten auch schon wieder Feierabend. Es reicht jedoch, um dennoch interessante Sachen damit zu basteln.

Schliessen wir doch einfach mal einen Schalter über eine Mesecons-Leitung an Anschluss A an, was dann ähnlich aussehen sollte, wie auf dem Bild.

Aktivieren wir nun den schalter, so leuchtet die Leitung bis zum Anschluss des Luacontrollers. Das A leuchtet in dem Fall jedoch nicht! Für mich war das anfangs ein Hinweis darauf, dass der Controller das Signal nicht verstehen konnte und ich etwas falsch gemacht hatte. Denn …

… aktiviert man einen der Anschlüsse aus dem Controler heraus, was im Falle von Anschluss B mit

port.b = true

gemacht wird, dann sieht der Anschluss ganz anders aus!

Der Unterschied ist deutlich. Anschuss B, welchen wir vom Controller aus aktiviert haben, leuchtet, während Anschluss A dunkel bleibt. Hat der Controller also Anschluss A nicht erkannt, oder kann damit nichts anfangen?

Testen wir es doch einfach mal und bauen das Licht über eine Leitung an Anschluss C. 

Schalter auf Anschluss A, Licht auf Anschluss C, wie man es hier gut erkennen kann.

Aktivieren wir probehalber Anschluss C, indem wir ihn direkt im Controller aktivieren.

port.c = true

Das Licht leuchtet, wer hätte das gedacht?

Deaktivieren wir den Anschluss wieder, indem wir einfach die Zeile wieder aus dem Controller löschen und schalten den Schalter ein, dann passiert nichts. Es sollte aber auch nicht verwundern, denn der Controller weiss ja gar nicht, was er mit dem eingehenden Signal überhaupt anstellen soll. Prinzipiell ist er dumm, solange wir ihn nicht mit einem Programm füttern.

Jetzt kommen wir zum Kern des ganzen! Wer logisch mitgedacht hat, sollte zu dem Schluss gekommen sein, man müsse einfach nur Anschluss C mit Anschluss A gleichsetzen und schon müsste das Licht leuchten, wenn man den Schalter anschaltet. Das würde dann so aussehen:

port.c = port.a

Zumindest war ich die ganze Zeit der Meinung. Doch damit lag ich falsch. Warum?

Damit hatte ich wirklich lange meine Schwierigkeiten! Wenn ich mit

port.c = true

doch den Anschluss C aktivieren konnte, dann müsste ich doch Anschluss A ebenfalls mit port auslesen können. Von wegen!

Aus irgendeinem Grund behandelt der Luacontroller die Anschlüsse differenziert. Eingehende Signale frägt man mit pin ab, während ausgehende Signale mit port gesteuert werden. Warum? Keine Ahnung. Warum heisst es port und nicht pout? Auch keine Ahnung!

Will man nun also den gewünschten Effekt erzielen und Ausgang C mit Eingang A gleichsetzen, so muss man es folgendermassen machen:

port.c = pin.a

Genial, oder? Schalter an, Licht an. Gesteuert vom Luacontroler.

Nun würde natürlich niemand auf die Idee kommen, einen Controller für so eine simple Sache zu verwenden. Es sei denn, er will sich zum Beispiel anzeigen lassen, dass das Licht angeschaltet ist. Ich könnte es zum Beispiel verwenden, um das Licht an der Hyperloop-Station an meiner Grube zu kontrollieren. So könnte ich mir einfach eine Digiline von einem Luacontroler anschliessen, der zwischen Licht und Schalter gesetzt wurde. Er könnte mir dann anzeigen, ob das Licht eingeschaltet ist.

Bauen wir doch einfach mal so einen Aufbau!

Dazu schliessen wir mittels einer Digiline einfach ein LCD am Anschluss B des Controllers an. Dazu sei gesagt, was wo angeschlossen ist, spielt keine Rolle. Man muss einfach nur im Programmcode darauf achten, dass man immer die richtigen Anschlüsse verwendet.

Das LCD bekommt noch einen Channel. Ich habe es einfach lcd genannt. Das ist, wie in meinem anderen Tutorial gezeigt, wichtig für die Ansteuerung über den Controler. Digilines werden rein nur über den Channel angesprochen! Es ist also völlig egal, ob es nun an Anschluss B oder D sitzt. Das Programm muss in dem Fall nicht angepasst werden!

Wir wollen nun, dass wir auf dem LCD angezeigt bekommen, ob das Licht nun an ist, oder aus.

Das Programm fängt wieder damit an, dass wir port.c mit pin.a gleichsetzen.

Als nächstes kommt eine Abfrage. Wie es in den Meisten Programmiersprachen üblich ist, beginnt diese mit if.

if port.c == true then digiline_send(„lcd“, „An“)

  • If ist klar. Damit leiten wir die Abfrage ein.
  • port.c == true bedeutet, wenn Ausgang C wahr ist. Also aktiv.
  • then bedeutet, dass folgendes dann ausgeführt werden soll.
  • digiline_send(„lcd“, „An“) schickt ein Digiline-Signal ab. Deshalb steht in Klammern zuerst „lcd“. Damit sagen wir dem Signal, für wen es bestimmt ist. „An“ ist der Text, der angezeigt werden soll.

Auf gut deutsch gesagt sagt die Zeile also aus, wenn port.c an ist, dann schreib „An“ aufs LCD.

Wir wollen aber auch, dass auf dem LCD „Aus“ steht, wenn das Licht nicht aktiv ist. Das tun wir mit folgender Zeile:

else digiline_send(„lcd“, „Aus“)

  • else heisst so viel wie, wenn die erste Bedingung nicht erfüllt ist, wird etwas anderes ausgeführt.
  • digiline_send(„lcd“, „Aus“) in diesem Fall.

Nun müssen wir die Abfrage noch schliessen.

end

Das sollte verständlich sein!

Siehe da, der Schalter ist unten, dass Licht es aus, also zeigt uns das LCD auch Aus an.

Schalter hoch, Licht ist an und das LCD zeigt es uns an. So wie es gedacht war.

Nun gibt es aber noch andere Wege, ein Signal am Controller zu empfangen. Nehmen wir hier mal einen Node Detector, welcher einen Sandblock in einem Block Entfernung aufspüren soll. Das Bild zeigt, wie es aufgebaut werden sollte.

Der Detector muss in dem Fall noch korrekt eingestellt werden.

In die Zeile

Name of node to scan for (empty for any)

muss der Name des Blocks, auf welchen der Detector reagieren soll. Ich empfehle, die Debug-Anzeige in Minetest mit F5 zu aktivieren. Dann visiert man den Block an, den man haben möchte und bekommt angezeigt, wie diese heisst. In unserem Fall muss also in diese Zeile ein

default:sand

Wir wollen aber, dass er auf den Block reagiert, der ein Block von ihm selbst entfernt ist, also ein Block Abstand zum Ziel besteht. Dafür müssen wir in die Zeile

Distance (0-10)

eintragen, wo sich der Block befindet. 0 würde bedeuten, er steht direkt vor dem Detector. Da wir aber den in einem Block Entfernung erkennen wollen, muss hier also eine 1 rein und dann auf Save drücken.

Siehe da, der Detector hat den Block erkannt, was man an dem grünen Licht und der aktiven Leitung erkennen kann. Im Controller arbeitet immer noch das Programm, welches wir für den Schalter eingegeben hatten. Bedeutet das also, dass das Licht nun an ist?

Korrekt! Der Detector hat den Block erkannt, gibt einen Signal über die Leitung an Anschluss A, im Controller wird dadurch pin.a (nicht port.a!!!) auf true gesetzt, also aktiviert und die Zeile port.c = pin.a aktiviert Anschluss C. Mittels der Abfrage wird weiterhin auf dem LCD angezeigt, ob das Licht an, oder aus ist. So wollten wir das ja haben!

Zur Kontrolle entfernen wir einfach mal den Sand-Block und siehe da, der Detector kann ihn nicht mehr erkennen, schaltet das Signal ab, was das Licht abschaltet und auf dem LCD „Aus“ erscheinen lässt.

Damit wären wir schon am Ende des Tutorials. Ich hoffe es hat euch Wissen vermittelt und ihr könnt damit etwas für eure eigenen Projekte anfangen. Ich würde mich natürlich über Kommentare freuen und vielleicht sieht man sich ja mal im Spiel.

 

Ersten Kommentar schreiben

Antworten

Deine E-Mail-Adresse wird nicht veröffentlicht.


*