Jump to content
Usertreffen 2024: 29.5.-2.6. | Anmelden bitte bis 30.4. ×
Schiffsmodell.net

TPS, SPS für den Modellbau


Guest willie

Recommended Posts

Hallo,

 

ich wollte euch mal mein neues Projekt vorstellen.

Vielleicht kennt ihr ja dieses Projekt hier:

TPS - Tastenprogramierbare Steuerung

Hier kann man mit einfachen Mitteln komplexe Schaltungen realisieren.

Dabei muss man sich nicht auseinandersetzen mit sowas wie Microcontrollerprogrammierung, ISP...

Die verwendeten "Befehle" sind recht einfach und leicht zu erlernen.

Leider fehlt dem Projekt eine Anbindung an eine Fernsteueranlage und die Möglichkeit Servos anzusteuern.

Also hab ich mich mal hingesetzt und das ganze aufgesetzt. Da ich mich mit dem verwendeten Controller nicht gut auskenne, hab ich das ganze in Arduino implementiert mit der Möglichkeit das ganze auch in einen ATTiny44 zu pressen. D.h. es muss kein teuerer Arduino herhalten, sondern im Endeffekt nur ein "billiger" ATTiny.

 

Die Möglichkeiten sind groß. Wenn daran interesse besteht würde ich in lockerer Folge mal über das Projekt berichten. Die fertigen (programmierten) Controller würde ich dann auch anbieten.

Zu den Features/Erweiterungen (nur das Offset gegenüber der TPS):

- 2 Servos ansteuerbar

- 2 RC Kanäle auswertbar

- 2 PWM Kanäle (z.B. für Motoren, Licht)

- einfacheres "Programmierboard" mit 2 7-Segementanzeigen.

- Unterstützung von Arduino Hardware und ATTiny44/84, ATMega8

 

Beim nächsten Mal poste ich mal die Quellen für den Arduino und ein paar einfache Beispielprogramme.

Link to comment
Guest LostInSpace

Hallo willie,

ehrlich gesagt erschließt sich mir der Sinn und das Prinzip dieser "Steuerung" nicht wirklich. Wahrscheinlich liegt es daran, daß ich Controller nur in C und ASM programmiere und das Hühnerfutter entsprechend der Aufgabenstellung platziere.

 

Evtl könntest Du mal anhand von 2 einfachen Aufgabenstellungen das Prinzip erläutern. Ich denke da zB an einen Servo-Reverse und einen Servo-Verzögerer. Schaltungstechnisch sehr einfach und in C auch schnell implementiert. Jetzt die Frage, wie das in TPS gemacht wird.

 

Einen sonnigen Sonntag

Link to comment

Moin Willi!

 

Sehr interessantes Projekt! :that:

 

Ich werde es gespannt verfolgen!

 

Zumal ich mich gerade in die Programmierung der Arduino einarbeite und feststellen muss: Geiles Mopped!

Link to comment
...

ehrlich gesagt erschließt sich mir der Sinn und das Prinzip dieser "Steuerung" nicht wirklich. Wahrscheinlich liegt es daran, daß ich Controller nur in C und ASM programmiere und das Hühnerfutter entsprechend der Aufgabenstellung platziere.

 

Ja, das mag daran liegen. Denn nicht jeder Modellbauer kann programmieren, zumindest was über einen Fahrtenregler hinaus geht und da gibt es auch schon häufig Probleme.

 

Mit der Tastenprogrammierung sind zwar nur wenige Befehle möglich, aber man kann damit kleine Aufgaben im Bereich messen, steuern und regeln lösen, ohne Assembler oder gar C dafür lernen zu müssen.

 

Und viele Modellbauer wollen das auch gar nicht lernen (müssen). ;)

Link to comment

Wie Arno es schon auf den Punkt gebracht hat.

Nicht jeder Modellbauer möchte sich in die Tiefen der Microcontrollerprogrammierung einarbeiten.

Und auch der Arduino ist zwar recht einfach zu programmieren, aber nicht jeder möchte gleich 20€ in sein Modell versenken. Weiterhin ist auch selbst der Arduino für manche noch zu schwierig.

Die TPS (oder Willies SPS) schließt eigentlich genau die Lücke zwischen "super simpel, kann man auch analog machen", zu "jetzt brauch ich hab ich ein komplexes Steuerszenario".

 

Beispielsweise das Blinken einer LED im Sekunden Takt. (Das ist Quasi das "Hello World" der Microcontrollerprogrammierung, für die nicht MCU'ler, wir lernen sprechen.)

 

In TPS:

0: 1 1  LED an Pin 1 an (1 ist der Port Befehl, und 1 heißt 1 LED an)
1: 2 8  Warte (2) 500ms (8)
2: 1 0  LED's aus (1 ist der Port Befehl, und 0 heißt LED's aus)
3: 2 8  wieder, Warte (2) 500ms (8)
4: 3 4  springe zurück um 4 Schritte (4-4 = 0), was zum Anfang führt

Mit diesen 5 Befehlen hat man z.B. schon eine einfache Leuchtturmsteuerung. Die Zeiten kann man natürlich variieren.

2. Beispiel, wo wir gerade beim Leuchtturm sind, 3 Blitze alle 5 Sekunden:

(Ein Blitz ist in diesem Beispiel ein Licht mit 50ms Leuchtdauer und 250ms Pause, nur mal als Beispiel, ob das in wirklichkeit so ist, weiß ich nicht, ist aber für das Beispiel auch irrelevant)

 

// 1. Blitz
0: 1 1  LED an Pin 1 an 
1: 2 5  Warte 50ms 
2: 1 0  LED's aus 
3: 2 7  Warte 200ms (um 250ms zu warten muss man das zusammenstückeln)
4: 2 5  Warte 50ms
// 2. Blitz
5: 1 1  LED an Pin 1 an 
6: 2 5  Warte 50ms 
7: 1 0  LED's aus 
8: 2 7  Warte 200ms (um 250ms zu warten muss man das zusammenstückeln)
// 3. Blitz
9: 2 5  Warte 50ms
A: 1 1  LED an Pin 1 an 
B: 2 5  Warte 50ms 
C: 1 0  LED's aus 

#Einschub: Jetzt müssen wir ein bisschen rechnen. 5 Sekunden soll die ganze Zeit dauern, verbraucht haben wir 50 (1. Blitz) + 250 (1. Pause) + 50 (2. Blitz) + 250 (2. Pause) + 50 (3. Blitz)= 650ms

5000ms - 650ms = 4350 ms müssen wir als noch warten

 

D: 2 A  Warte 2s (2000ms)
E: 2 A  Warte 2s (4000ms)
F: 2 7  Warte 200ms (4200ms)
10: 2 6  Warte 100ms (4300ms)
11: 2 5  Warte 50ms (4350ms)

#Einschub: Jetzt müssen wir an den Anfang zurück. Mit dem normalen Jump kommen wir jetzt nicht mehr hin. Der kann nur max. 16 Zellen zurückspringen. Also müssen wir Absolut springen. Geht aber auch ganz einfach. Wo müssen wir hin? -> zur Zelle 00

Also die erste 0 kommt dann in das Seitenregister (Page 0) die zweite 0 kommt in die Daten vom Jump befehl. macht:

 

12: 8 0  Page 0 (Seite 0)
13: 9 0  Jump 0 (Springe also an den (Seite (0) * 16) + Jumpdaten (0) = 00 Anfang)

Mit 19 einfachen logischen Befehlen das gewünschte Ziel erreicht. Aber man kann das ganze natürlich auch noch kürzer schreiben. Aber dazu später mehr.

 

Hier mal der entsprechende Arduinocode:

/*
Blitzer 3x50ms mit 250ms Pause alle 5 Sekunden. 
*/
// Hardwareanbindung 
const byte Dout_0 = 4; 

void setup() {                
 pinMode(Dout_0, OUTPUT);
 digitalWrite(Dout_0, LOW);
}

void loop() {
 // 1.Blitz
 digitalWrite(Dout_0,HIGH);
 delay(50);
 digitalWrite(Dout_0,LOW);
 delay(250);

 // 2.Blitz
 digitalWrite(Dout_0,HIGH);
 delay(50);
 digitalWrite(Dout_0,LOW);
 delay(250);

 // 3.Blitz
 digitalWrite(Dout_0,HIGH);
 delay(50);
 digitalWrite(Dout_0,LOW);
 delay(4350);
}

ISt auch relativ simpel, aber ich hatte genau bei diesem Programm mir über verschiedenen andere Sachen gedanken gemacht.

- einen kompletten Arduino im Modell versenken ist mir zu groß und zu teuer

- zum Umprogrammieren muss ich immer einen Rechner haben. Mal eben geht eben nicht.

- und jemand anderen das rogramm zu vermitteln, der nicht MCU affin ist, ist schwierig.

So, später mehr.

Link to comment

Aufgabenstellung:

Wie gestern. Blinktonne alle 5 Sekunden 3 Blitze.

Jetzt das ganze mal etwas schlanker mit Schleife. Schleifen funktionieren so.

ZUnächst lade ich den Schleifenzähler (C oder D) mit dem entsprechenden Wert. Dann wird geprüft. Ist das Ergebniss größer 0, dann wird zuerst der Zähler um 1 herrunter gezählt und dann zu dem angegebenen Ziel gesprungen, sonst passiert nix.

 

Hier mal das neue Tonnenprogramm:

 

00: 4 3  A = 3 (3 Blitze sollen es sein)
01: 5 2  C = A (C = 3)
02: A 7  C > 0: C = C -1; Springe zum Blitz (07)
03: 2 A  2s warten
04: 2 A  2s warten
05: 2 6  100ms   warten (4100ms, 250ms wartet ja der Blitz selber) 
06: 9 0  Jump 00
07: 1 1  LED ein,   Blitz starten
08: 2 5  50ms   warten
09: 1 0  LED aus
0A: 2 7  200 ms   warten
0B: 2 5  50 ms   warten
0C: 9 2  Jump 02

So, könnt ihr das nachvollziehen?

Link to comment
könnt ihr das nachvollziehen?

 

:jawoll!: Jawoll, ich kann es und lese weiter gespannt mit.

 

Wird man dann jeweils nur ein Programm (Befehlssequenz) auf dem Chip haben können oder auch mehrere, die man z.B. mit der Funke umschalten kann?

Link to comment

So,

ich habe den Emulator nochmal upgedatet. Und außerdem ist nun auch die ArduinoSPS online. Wer also einen Arduino sein eigen nennt, kann sich das ja mal drauf laden und probieren.

Bei Fehlern aber nicht gleich:cluebat: sondern mir Bescheid geben. Ich mach die dann schnellstmöglich raus. Viel Spass und natürlich gilt wie immer:

Bei Fragen, fragen :mrgreen:

Link to comment

So eine kleine DEnksportaufgabe für die, die aktiv mitlesen (wollen)

Hier mal ein Programm, was ich gestern mit meiner Version der TPS (ArduinoSPS) entwickelt habe. Hat was mit Modellbau zu tun.

Wer errät es?

Addr   BD   Bef      Data      Kommentar
0x00: 48   0X00   X000   A=#:A=8   ,"RC Nullpunkt"
0x01: 51   0X0X   000X   =A:B=A   ,""
0x02: 6B   0XX0   X0XX   A=:A=RC.1   ,"Lesen des Throttles"
0x03: 5D   0X0X   XX0X   =A:E=A   ,"A sichern"
0x04: E1   XXX0   000X   Ret:Call 1   ,"Anzeige Fahrlicht"
0x05: 48   0X00   X000   A=#:A=8   ,""
0x06: 51   0X0X   000X   =A:B=A   ,""
0x07: 6C   0XX0   XX00   A=:A=RC.2   ,"Lesen Lenkung"
0x08: 5D   0X0X   XX0X   =A:E=A   ,"A sichern"
0x09: E2   XXX0   00X0   Ret:Call 2   ,"Anzeige Blinker"
0x0A: 26   00X0   0XX0   Delay:Delay 100ms   ,"Bisschen warten, damit's schön blinkt"
0x0B: 80   X000   0000   Seite:Seite 0   ,"Zurück zum Anfang"
0x0C: 90   X00X   0000   Sprung:Springe 0   ,""
0x0D: 00   0000   0000   0:NOP   ,""
0x0E: 00   0000   0000   0:NOP   ,""
0x0F: E8   XXX0   X000   Ret:Def 1   ,"Subroutine Licht "
0x10: 81   X000   000X   Seite:Seite 1   ,""
0x11: C3   XX00   00XX   Skip if:A=B   ,"Wenn Auto steht, Lampen aus"
0x12: 97   X00X   0XXX   Sprung:Springe 7   ,""
0x13: 40   0X00   0000   A=#:A=0   ,"Licht ausschalten"
0x14: 55   0X0X   0X0X   =A:Dout.1=A.0   ,"Fahrlicht ausschalten"
0x15: 56   0X0X   0XX0   =A:Dout.2=A.0   ,"Rückfahrlicht ausschalten"
0x16: E0   XXX0   0000   Ret:Return   ,""
0x17: 41   0X00   000X   A=#:A=1   ,"Fahrlicht ein"
0x18: 55   0X0X   0X0X   =A:Dout.1=A.0   ,""
0x19: 6D   0XX0   XX0X   A=:A=E   ,"A zurückholen"
0x1A: C2   XX00   00X0   Skip if:A<B   ,"Fahren wir Rückwärts?"
0x1B: E0   XXX0   0000   Ret:Return   ,""
0x1C: 41   0X00   000X   A=#:A=1   ,"Rücklicht einschalten"
0x1D: 56   0X0X   0XX0   =A:Dout.2=A.0   ,""
0x1E: E0   XXX0   0000   Ret:Return   ,""
0x1F: 00   0000   0000   0:NOP   ,""
0x20: E9   XXX0   X00X   Ret:Def 2   ,"Subroutine Blinken"
0x21: 82   X000   00X0   Seite:Seite 2   ,""
0x22: 6D   0XX0   XX0X   A=:A=E   ,""
0x23: C3   XX00   00XX   Skip if:A=B   ,"Kein Lenkausschlag?"
0x24: 9A   X00X   X0X0   Sprung:Springe A   ,""
0x25: 40   0X00   0000   A=#:A=0   ,"Kein Lenkausschlag, alle Blinker aus"
0x26: 57   0X0X   0XXX   =A:Dout.3=A.0   ,""
0x27: 58   0X0X   X000   =A:Dout.4=A.0   ,""
0x28: 52   0X0X   00X0   =A:C=A   ,"Und auch den Zähler zurücksetzen"
0x29: E0   XXX0   0000   Ret:Return   ,""
0x2A: 83   X000   00XX   Seite:Seite 3   ,"Alle Sprungziele liegen jetzt in Seite 3"
0x2B: A0   X0X0   0000   C*:C 0   ,"C > 0; Springe nach 30"
0x2C: 4F   0X00   XXXX   A=#:A=15   ,"Zähler neu laden"
0x2D: 52   0X0X   00X0   =A:C=A   ,""
0x2E: 00   0000   0000   0:NOP   ,""
0x2F: 00   0000   0000   0:NOP   ,""
0x30: 62   0XX0   00X0   A=:A=C   ,""
0x31: C1   XX00   000X   Skip if:A>B   ,"Zähler > 8, dann Blinker ein"
0x32: 95   X00X   0X0X   Sprung:Springe 5   ,""
0x33: 41   0X00   000X   A=#:A=1   ,"Blinker ein"
0x34: 96   X00X   0XX0   Sprung:Springe 6   ,""
0x35: 40   0X00   0000   A=#:A=0   ,"Blinker aus"
0x36: 5E   0X0X   XXX0   =A:F=A   ,"Status sichern"
0x37: 6D   0XX0   XX0X   A=:A=E   ,"Jetzt schauen wohin wir blinken müssen"
0x38: C1   XX00   000X   Skip if:A>B   ,"Rechtsausschlag?"
0x39: 9D   X00X   XX0X   Sprung:Springe D   ,""
0x3A: 6E   0XX0   XXX0   A=:A=F   ,""
0x3B: 57   0X0X   0XXX   =A:Dout.3=A.0   ,"Blinken rechts"
0x3C: E0   XXX0   0000   Ret:Return   ,""
0x3D: 6E   0XX0   XXX0   A=:A=F   ,""
0x3E: 58   0X0X   X000   =A:Dout.4=A.0   ,"Blinken links"
0x3F: E0   XXX0   0000   Ret:Return   ,""
0x40: FF   XXXX   XXXX   Byte:PrgEnd   ,"Ende des Programms"

Im Anhang (was eigentlich ein ZIP it, also einfach PDF in ZIP umbennen) das Programm als direkte Datei für den Emulator. Erspart das Abtippen.

a.zip.pdf

Link to comment
Keiner mehr da?

 

Doch Willi, keine Sorge. Ich habe den Code sogar verstanden :mrgreen:.

Wollte aber nicht Compiler spielen ...

 

Ich lese weiter gespannt mit. Mach mal 'nen Video von Deinem jetzt blinkenden Tamiya.

Link to comment

Moin Willie!

 

Sorry, ich hatte keine Zeit es auszuprobieren, zuviel um die Ohren.

 

Aber wie Du das präsentierst! Chapeau! :that:

 

Bitte mehr davon!

 

Da kann man mal eben "zwischendurch" was lernen!

 

Ich folge dem Thread mit hohem Interesse weiter, auch wenn ich nicht immer dazu komme, es gleich auszuprobieren...

Link to comment

Wieder mal was neues. Diesmal aus dem Schiffsmodellbau.

Ich hab ein Boot mit Jetantrieb. Nun wissen wir ja, das Jet's nur Vorwärtslaufen können, rückwärts geht's nur mit Umlenkklappe. D.h. normalerweise man braucht einen 3. Kanal. Für meinen kleinen NQD Jet brauch ich aber was, was auch mit 2 Kanälen gut funktioniert. Denn den fahr ich am liebsten mit 'ner 2-Kanal Pistolensteuerung.

Also brauchen wird etwas, was die RC Signale splittet, einmal soll es bei Rückwärtsfahrt automatisch die Klappe betätigen, muss dann aber an den Regler Vorwärtssignale weiterreichen. Bei Vorwärtsfahrt muss die Klappe wieder hoch und das Signal für den Regler so wie es ist weiterreichen.

Hier der Code dafür:

 

Addr   BD   Bef      Data      Kommentar
0x00: 48   0X00   X000   A=#:A=8   ,"Nullpunktwert (128) ins B Register"
0x01: 51   0X0X   000X   =A:B=A   ,""
0x02: 40   0X00   0000   A=#:A=0   ,""
0x03: 7C   0XXX   XX00   A=Berechnung:A=A+16*B   ,""
0x04: 51   0X0X   000X   =A:B=A   ,""
0x05: F2   XXXX   00X0   Byte:A=RCin.1   ,"Reglerkanal leseen"
0x06: 5D   0X0X   XX0X   =A:E=A   ,"sichern"
0x07: C2   XX00   00X0   Skip if:A<B   ,"Rückwärts"
0x08: 9B   X00X   X0XX   Sprung:Springe B   ,"Vorwärts"
0x09: 4F   0X00   XXXX   A=#:A=15   ,"Klappenservo ausfahren"
0x0A: C2   XX00   00X0   Skip if:A<B   ,"Ist immer erfüllt"
0x0B: 40   0X00   0000   A=#:A=0   ,"Vorwärts kein Klappenservo"
0x0C: 5B   0X0X   X0XX   =A:Servo.1=A   ,""
0x0D: 6D   0XX0   XX0X   A=:A=E   ,"RC Wert zurückholen"
0x0E: 81   X000   000X   Seite:Seite 1   ,""
0x0F: C2   XX00   00X0   Skip if:A<B   ,""
0x10: 97   X00X   0XXX   Sprung:Springe 7   ,"Bei Vorwärts ohne Berechnung direkt springen"
0x11: 4F   0X00   XXXX   A=#:A=15   ,"2'er komplement berechnen"
0x12: 51   0X0X   000X   =A:B=A   ,""
0x13: 7C   0XXX   XX00   A=Berechnung:A=A+16*B   ,""
0x14: 51   0X0X   000X   =A:B=A   ,""
0x15: 6D   0XX0   XX0X   A=:A=E   ,""
0x16: 79   0XXX   X00X   A=Berechnung:A=A Xor B   ,""
0x17: F7   XXXX   0XXX   Byte:Servo.2=A   ,"Fahrt an den Fahrservo übergeben"
0x18: 80   X000   0000   Seite:Seite 0   ,""
0x19: 90   X00X   0000   Sprung:Springe 0   ,"wieder nach vorne springen"
0x1A: FF   XXXX   XXXX   Byte:PrgEnd   ,""

Angehängt wie immer der Code für den Emulator.

 

Was mach ich hier.

0x00-0x04: Zunächst lade ich mal den Nullwert (128) für die RC Steuerung in das B Register.

0x05: Jetzt lese ich das RC Signal. Da ich es öfters brauche, speichere ich mir das ins E-Register.

Neu lesen kann zu ungewollten Ergebnissen führen, wenn z.B. mitten in der Berechnung der Wert springt...

0x07 - 0x0C: hier berechne ist den Wert für den Klappenservo.

0x0A: Hier mache ich mir zunutze das hier A immer auf 15 steht und B auf 128. Somit ist die Bedingung immer TRUE und der nächste Befehl (A=0), der ja als Sprungziel von 0x08 dient, wird übersprungen.

Schwieriger wird's bei der Berechnung für den Regler.

Vorwärts ist ja noch einfach, einfach RC-Signal direkt auf den Servokanal geben (also auf den Regler)

Beim Rückwärtsfahren muss ich aber eigentlich folgendes machen:

A = 128 - A. Das ist aber nur sehr umständlich in der TPS zu brechnen. Einfacher ist es da mit dem 2'Komplement (Wer nicht weiß, was das ist, einfach mal googlen) zu rechnen. (Das +1 erspar ich mir. 1 mehr oder weniger sind wurscht.) Also 255 ins B und dann A mit B XOR verknüpfen und voila schon haben wir unseren gesuchten Wert.

Da wir uns bei der Berechnung gründlich alle Register zerschossen haben, starten wir jetzt einfach von ganz vorne...

 

Bitte nur Emulatoren ab Version 0.2.1.29 verwenden. Vorher war ein Bug beim BYTE Befehl in der Servoansteuerung drin.

jet.zip.pdf

Edited by willie
Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.