- Lenkachsensteuerung mit Umschaltung zwischen Königsbolzen und Fernsteuerung.
- Warntafel in 3facher Darstellung mit Umschaltung zwischen deutschen Text und englischen Text über Fernsteuerung.
3.Umschalter für 5 Nauticmodule bei einem Sendermodul
Crazydiver:
- Lenkachsensteuerung mit Umschaltung zwischen Königsbolzen und Fernsteuerung.
- Warntafel in 3facher Darstellung mit Umschaltung zwischen deutschen Text und englischen Text über Fernsteuerung.
3.Umschalter für 5 Nauticmodule bei einem Sendermodul
Danke für deine sehr ausführliche Beschreibung.
Allerdings solltest du noch mal nachzählen, aus meiner Sicht fehlt da eine von deinen ausführlichen "Beschreibungen".
Ein weiteres von mir:
/* Beleuchtungstester für Zugmaschine und Auflieger/Anhänger
über Fernsteuerung starten und beenden
*/
int schalterPin = 2; //startschalter für den test
int testschalter = 0; // signal für testschalter
const int LED1 = 13;
const int LED2 = 3; //Blinker rechts
const int LED3 = 4; // Blinker links
const int LED4 = 5; // Bremse
const int LED5 = 6; // Nebel
const int LED6 = 7; // Rückwärts
const int LED7 = 8; // Standlicht
const int LED8 = 9; // Ablendlicht
const int LED9 = 10; // Fernlicht
const int LED10 = 11; // Rundumwarnleuchte
void setup()
{
pinMode(testschalter, INPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT); // alle LEDs nur über Opto und Transistor
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
pinMode(LED6, OUTPUT);
pinMode(LED7, OUTPUT);
pinMode(LED8, OUTPUT);
pinMode(LED9, OUTPUT);
pinMode(LED10, OUTPUT);
}
void loop() {
testschalter = digitalRead(schalterPin);
if (testschalter == HIGH){
digitalWrite(LED1, LOW);
digitalWrite(LED2, HIGH);
delay(1100); // Zeitstufe notfalls anpassen
digitalWrite(LED2, LOW);
delay(1200); // Zeitstufe notfalls anpassen
digitalWrite(LED3, HIGH);
delay(1100); // Zeitstufe notfalls anpassen
digitalWrite(LED3, LOW);
delay(1200); // Zeitstufe notfalls anpassen
digitalWrite(LED4, HIGH);
delay(1100); // Zeitstufe notfalls anpassen
digitalWrite(LED4, LOW);
delay(1200); // Zeitstufe notfalls anpassen
digitalWrite(LED5, HIGH);
delay(1100); // Zeitstufe notfalls anpassen
digitalWrite(LED5, LOW);
delay(1200); // Zeitstufe notfalls anpassen
digitalWrite(LED6, HIGH);
delay(1100); // Zeitstufe notfalls anpassen
digitalWrite(LED6, LOW);
delay(1200); // Zeitstufe notfalls anpassen
digitalWrite(LED7, HIGH);
delay(1100); // Zeitstufe notfalls anpassen
digitalWrite(LED7, LOW);
delay(1200); // Zeitstufe notfalls anpassen
digitalWrite(LED8, HIGH);
delay(1100); // Zeitstufe notfalls anpassen
digitalWrite(LED8, LOW);
delay(1200); // Zeitstufe notfalls anpassen
digitalWrite(LED9, HIGH);
delay(1100); // Zeitstufe notfalls anpassen
digitalWrite(LED9, LOW);
delay(1200); // Zeitstufe notfalls anpassen
digitalWrite(LED10, HIGH);
delay(1100); // Zeitstufe notfalls anpassen
digitalWrite(LED10, LOW);
delay(1200); // Zeitstufe notfalls anpassen
}
else if (testschalter == LOW) {
digitalWrite(LED1, HIGH);
}}
Zum testen der Beleuchtung am Modell welches über die Funke gestartet wird und auch angehalten werden kann
Und noch was:
/*Richtungsblinker mit Warnblinker über 3 Fernschalter steuern
*/
int blinkschalterrechtsPin = 2; // Schalter für rechten Blinker
int blinkschalterlinksPin = 3; // Schalter für linken Blinker
int warnblinkschalterPin = 4; // Schalter für Warnblinker
int blinkrechts = 0; //Signal für Blinker rechts
int blinklinks = 0; //Signal für Blinker links
int warnblink = 0; //Signal für Warnblinker
const int LED1 = 13;
const int LED2 = 12;
const int LED3 = 11;
void setup ()
{
pinMode(blinkrechts, INPUT);
pinMode(blinklinks, INPUT);
pinMode(warnblink, INPUT);
pinMode(LED1, OUTPUT); // nur über Opto und Transisitor
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
}
void loop()
{
blinkrechts = digitalRead(blinkschalterrechtsPin);
blinklinks = digitalRead(blinkschalterlinksPin);
warnblink = digitalRead(warnblinkschalterPin);
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
{
}
if (blinkrechts == HIGH) {
digitalWrite(LED1, HIGH);
delay(240);
digitalWrite(LED2, HIGH);
delay(240);
{
}
}
else if (blinkrechts == LOW) {
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
delay (240);
{
}
if (blinklinks == HIGH) {
digitalWrite(LED1, HIGH);
digitalWrite(LED3, HIGH);
delay(240);
{
}
}
else if (warnblink == HIGH) {
digitalWrite(LED1, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
delay(240);
}
}
}
Der Richtungsblinker wird über einen Kanalmischer von der Lenkung gesteuert.Der Warnblinker wird seperat geschaltet.
Ok, Crazydiver.....ich frage also nochmal. Kannst du richtige Beschreibungen zu deinen Zeilen posten.
So sehe ich ich das nicht als Projekt und es kann keiner irgend einen Sinn darin sehen.
Also passt das hier nicht rein. Es ist kein Projekt.
Hi
Ich muß HotSystems recht geben.
Ich sehe die Sketche als eine Art 'Snipped' - also Code-Fragmente, Die man sich passend zusammen bauen kann.
Wobei Das hier auch nicht recht passt, da man kaum zwei der Sketche mischen kann - zumindest nicht, wenn man nicht recht genau weiß, was man da tut.
Auch sind die Hintergrund-Informationen zu den 'Projekten' arg dürftig.
MfG
Crazydiver:
Ein weiteres von mir:/* Beleuchtungstester für Zugmaschine und Auflieger/Anhänger
über Fernsteuerung starten und beenden
*/
int schalterPin = 2; //startschalter für den test
int testschalter = 0; // signal für testschalter
const int LED1 = 13;
const int LED2 = 3; //Blinker rechts
const int LED3 = 4; // Blinker links
const int LED4 = 5; // Bremse
const int LED5 = 6; // Nebel
const int LED6 = 7; // Rückwärts
const int LED7 = 8; // Standlicht
const int LED8 = 9; // Ablendlicht
const int LED9 = 10; // Fernlicht
const int LED10 = 11; // Rundumwarnleuchte
void setup()
{
pinMode(testschalter, INPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT); // alle LEDs nur über Opto und Transistor
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
pinMode(LED6, OUTPUT);
pinMode(LED7, OUTPUT);
pinMode(LED8, OUTPUT);
pinMode(LED9, OUTPUT);
pinMode(LED10, OUTPUT);
}
void loop() {
testschalter = digitalRead(schalterPin);
if (testschalter == HIGH){
digitalWrite(LED1, LOW);
digitalWrite(LED2, HIGH);
delay(1100); // Zeitstufe notfalls anpassen
digitalWrite(LED2, LOW);
delay(1200); // Zeitstufe notfalls anpassen
digitalWrite(LED3, HIGH);
delay(1100); // Zeitstufe notfalls anpassen
digitalWrite(LED3, LOW);
delay(1200); // Zeitstufe notfalls anpassen
digitalWrite(LED4, HIGH);
delay(1100); // Zeitstufe notfalls anpassen
digitalWrite(LED4, LOW);
delay(1200); // Zeitstufe notfalls anpassen
digitalWrite(LED5, HIGH);
delay(1100); // Zeitstufe notfalls anpassen
digitalWrite(LED5, LOW);
delay(1200); // Zeitstufe notfalls anpassen
digitalWrite(LED6, HIGH);
delay(1100); // Zeitstufe notfalls anpassen
digitalWrite(LED6, LOW);
delay(1200); // Zeitstufe notfalls anpassen
digitalWrite(LED7, HIGH);
delay(1100); // Zeitstufe notfalls anpassen
digitalWrite(LED7, LOW);
delay(1200); // Zeitstufe notfalls anpassen
digitalWrite(LED8, HIGH);
delay(1100); // Zeitstufe notfalls anpassen
digitalWrite(LED8, LOW);
delay(1200); // Zeitstufe notfalls anpassen
digitalWrite(LED9, HIGH);
delay(1100); // Zeitstufe notfalls anpassen
digitalWrite(LED9, LOW);
delay(1200); // Zeitstufe notfalls anpassen
digitalWrite(LED10, HIGH);
delay(1100); // Zeitstufe notfalls anpassen
digitalWrite(LED10, LOW);
delay(1200); // Zeitstufe notfalls anpassen
}
else if (testschalter == LOW) {
digitalWrite(LED1, HIGH);
}}
Zum testen der Beleuchtung am Modell welches über die Funke gestartet wird und auch angehalten werden kann
Jetzt hab ich das mit dem "delay" endlich kapiert!
Strg+T wird eh völlig überbewertet. Wer braucht sowas?
@Uwe kann man in diesem Forum gewisse Teilnehmer auf ignorieren einstellen?
Gruß Fips
Derfips:
@Uwe kann man in diesem Forum gewisse Teilnehmer auf ignorieren einstellen?
Ich bin zwar nicht Uwe, aber diese Möglichkeit habe ich auch schon einmal vermisst. Soweit ich weiß, ist das immer noch nicht möglich. Und ich bin mir inzwischen nicht sicher, ob das wirklich restlos gut wäre. Es gibt hier Leute, die einerseits manchmal ziemlich viel Stuss loslassen, die andererseits sehr kompetent sind, wenn es um bestimmte Sachen geht.
Halt's aus
Gruß
Gregor
noiasca:
OT: ... und dennoch sind die Posts von Crazy hier in diesen Thread nutzlos und gehören (inkl. unserer Kommentare drauf) GELÖSCHT/ENTFERNT.
Da gebe ich dir Recht.
Also Uwe, bitte löschen.
Oder vielleicht in einen neuen Thread "Zeigt her eure delay-verseuchten Snippets" oder so verschieben?
Whandall:
Oder vielleicht in einen neuen Thread "Zeigt her eure delay-verseuchten Snippets" oder so verschieben?
Ich schlage vor, den Thread zu teilen: 1 x "Zeigt her ...", 1 x "Kommentare zu ..."
Vielleicht ergeben sich noch zwei weitere Threads. Ich vierteile so gerne ... gerade am Wochenende.
Gruß
Gregor
PS: „Kommentare zu den Kommentaren des bla-Threads" könnte Nummer 3 sein.
Hallo,
Ein Post vor einigen Tagen zum Thema Regelung hat mich dazu veranlasst mich selbst mal wieder mit dem Thema zu beschäftigen. Ich habe wärend meines Studiums vor 40 Jahren Regelungstechnik gemacht, allerdings damals mit Analogtechnik und meist dem LM741. Beruflich waren es dann GS-Antriebe später Servo, FU, Hydraulik, Heizung/Kühlung, Druck uund Mengenregelkreise im Maschinenbau.
Die Idee für diese Projekt war einen Simulator zu bauen mit dem an eine Regelstrecke mit einem PI Regler optimieren kann. Da viele einfache Regelstrecken eine Verzögerzng 2. Ordnung sehr ähnlich kommen habe ich also zwei PT1 Glieder hintereinander verwendet.
Der Sketch lässt sich über Befehle die man am Monitor eingibt steuern. Der Nennbereich für Eingaben ist für -100 bis 100 gedacht. Kann man also als Prozentwerte betrachten.
soll=xx.x Sollwert ändern (-100....+100)
T1=xx.x Verzögerung des ersten PT1 Glieds der Strecke
T2=xx.x Verzögerung des ersten PT2 Glieds der Strecke
KS=xx.x P-Verstärkung der Stecke
KP=xx.x P-Anteil des PI Reglers
TN=xx.x I-Anteil des PI Reglers Nachstellzeit s
CL=1 /CL=0 closed loop Regelkreis offen=0 geschlossen=1
anz=xx Anzeige Interval in ms
start startet den Lauf neu
stop stopt den Lauf
Der Sketch läuft auf einem UNO ohne zusätzliche Hardware in Verbindung mit dem Monitor oder einem anderen Terminal-Program. Wenn man ihn mit den Voreinstellungen startet wird nach dem Befehl start die Sprungantwort der Strecke numerisch ausgegeben. Mit den Parametern KS, T1,T2 kann man das Verhalten der Strecke ändern oder die Eingangsgrösse Ue1 mit dem Sollwert ändern. Parameter können jederzeit eingegeben werden und sind sofort wirksam. Änderungen werden in der Ausgabe mit angegeben, damit lässt sich u.A. ein neuer Abschnitt leichter finden. Bei T =0 verhält sich das PT1-Glied wie ein P-Glied. Durch die Eingabe des Befehls stop wird der Vorgang angehalten es erfolgt keinee Berechnung neuer Werte mehr. In der letzten Zeile werden die aktuelle Parameter angezeigt. Mit der erneuten Eingabe von Start beginnt der Vorgang neu mit t=0.
Als nächstes kann man nun mittels dem Befehl CL=1 den offenen Regelkreis schliessen. Damit ist dann zunächst der P-Anteil des Regles wirksam, TN=0. durch ändern von KP kann der Regelkreis dann optimiert werden. Als letztes kann man dann mittes der Eingabe von TN>0 die Nachstellzeit und damit den I-Anteil eingeben. Durch mehrfaches änder des Sollwertes auf 0 und z.B 10 lässt sich das Regelverhalten numerisch aufzeichnen und durch stop und Erneutem start mit der Zeitachse beginnend mit Null ausgeben.
Die Anzeige auf dem Monitor kann man mit CTR C in die Zwischenablage kopieren und dann in eine Excel Tabelle einfügen. Damit man daraus ein XY Diagramm machen kann sollte man zunächst mittels Bearbeiten Suchen Ersetzen alle Decimalpunkte gegen ein Komma tauschen. Damit werden Inhalte der Zellen dann als Zahl erkannt. Als Beispiele im Anhang ein paar Grafiken dazu.
Viel Spass beim spielen
PS Sketch folgt
Also hier der Sketch, passte nicht mehr
/*
Autor Heinz Baumstark Sept. 2018
Simuliert eine Regelstreke PT2 mit einem PI Regler.
Der Recheninterval beträgt 100ms. Nennbereiche sind -100..+100
Die Parameter können über die serielle Schnttstelle mit
Befehlen eingestellt werden. Folgende Befehle stehen zur Verfügung:
soll=xx.x Sollwert ändern (-100....+100)
T1=xx.x Verzögerung des ersten PT1 Glieds der Strecke
T2=xx.x Verzögerung des ersten PT2 Glieds der Strecke
KS=xx.x P-Verstärkung der Stecke
KP=xx.x P-Anteil des PI Reglers
TN=xx.x I-Anteil des PI Reglers Nachstellzeit s
CL=1 /CL=0 closed loop Regelkreis offen=0 geschlossen=1
anz=xx Anzeige Interval in ms
start startet den Lauf neu
stop stopt den Lauf
mit den voreingestellte Parametern wird die Srungantwort der
Strecke ausgegeben mit der Eingangsgrösse 10% und die
Streckenverstärkung KS=1 und den Zeiten T1=3s, T2=3s
----------------------------------------------------------
*/
int CL = 0; // closed loop
float t, ex, tdiv; // allgem. Variablen
bool lauf = LOW; // Status run / stop
// Strecke Parameter
float Ue1, Ua1; // E/A Grössen 1. PT1 Glied
float Ue2, Ua2; // E/A Grössen 2. PT1 Glied
float T1 = 3.0; // Parameter Verzägerung 1. PT1 Glied
float T2 = 3.0; // Parameter Verzögerung 2. PT1 Glied
float KS = 1.0; // Proportional Wert der Gesamtstrecke
//Regler Parameter
float Yp, Yi, Y; // Ausgang Regelanteile
float Soll = 10.0;// Sollwert
float Rd; // Regeldifferenz
float Ist; // Regler Istwert Rückführung
float KP = 1.0; // P-Anteil
float TI = 0.0; // I-Anteil Nachstellzeit
String eingabe = "";
unsigned long startzeit; // Anfangszeit der der Simulation
unsigned long altzeit, paltzeit; // Hilfswerte
unsigned long anzinterval = 500; // Anzeigeintervall
void setup() {
Serial.begin(9600);
startzeit = millis();
// Ausgabe der voreingestellte Werte
Serial.println("Startparameter");
Serial.print ("Sollwert "); Serial.println(Soll);
Serial.print ("Strecke 1. Verz. T1 (s)"); Serial.println(T1);
Serial.print ("Strecke 2. Verz. T2 (s)"); Serial.println(T2);
Serial.print ("P-Verst. Strecke KS "); Serial.println(KS);
Serial.print ("Regler KP "); Serial.println(KP);
Serial.print ("Regler TN (s)"); Serial.println(TI);
Serial.print ("Closed Loop "); Serial.println(CL);
Serial.print ("Anzeige Interval (ms) "); Serial.println(anzinterval);
Serial.println("Eingabebefehl start / stop");
}
void loop() {
if (millis() - altzeit >= 100UL && lauf == true) { // 100 ms
tdiv = (millis() - altzeit) / 1000.0; // Zeitintervall
altzeit = millis();
t = (millis() - startzeit) / 1000.0; // Laufzeit gesamt
// Regler bearbeiten
if (CL == 1) { // Istwer benutzen colsed loop
Ist = Ua2;
}
else { // open loop
Ist = 0;
}
Rd = Soll - Ist;// Regeldifferen bilden
Yp = Rd * KP; // P-Anteil
if (TI > 0) Yi = Yi + Rd * tdiv / TI; else Yi = 0; // Integral bilden
if (Yi > 100) Yi = 100 ; // I Anteil begrenzen
if (Yi < -100) Yi = -100;
Y = Yp + Yi; // PI Regler // gesamt Regler bilden und begrenzen
if (Y > 100) Y = 100 ;
if (Y < -100) Y = -100;
// Strecke bearbeiten
Ue1 = Y * KS;// Eingang verbinden mit Reglerausgang
// erstes PT1 Glied
ex = T1 / tdiv;
Ua1 = ((Ua1 * ex) + Ue1) / (ex + 1);
// zweites PT1 Glied
Ue2 = Ua1; // Eingang verbinden mit Ausgang Ua1
ex = T2 / tdiv;
Ua2 = ((Ua2 * ex) + Ue2) / (ex + 1);
if (millis() - paltzeit >= anzinterval) { // AnzeigeInterval
paltzeit = millis();
anzeige();
}
}
lesen(); // Benutzer Eingabe lesen
}
void anzeige () {
Serial.print(t); Serial.print("\t");
Serial.print(Soll); Serial.print("\t");
Serial.print(Y); Serial.print("\t");
Serial.print(Ua2);
Serial.println();
}
void lesen() {
while (Serial.available()) { // Wenn was angekommen ist
char zeichen = char (Serial.read());
eingabe += zeichen; // Eingabestring bilden
if (zeichen == '\n') { // ende erkannt
Serial.print(eingabe); // Kontroll-Ausgabe
// auswerten
if (eingabe.startsWith ("start") && !lauf) { // Status laüft
lauf = true;
startzeit = millis();
altzeit = millis();
Serial.println("t\t Soll\t Y \t Ist"); // Kopfzeile ausgeben
}
if (eingabe.startsWith("stop")) { // Status stop
lauf = false;
Serial.print(" T1="); Serial.print(T1);
Serial.print(" T2="); Serial.print(T2);
Serial.print(" KS="); Serial.print(KS);
Serial.print(" KP="); Serial.print(KP);
Serial.print(" TN="); Serial.print(TI);
Serial.print(" CL="); Serial.print(CL);
Serial.println();
Serial.println("------------------------");
}
if (eingabe.startsWith("anz=")) { // Anzeigeinterval
String s = eingabe.substring(4);
anzinterval = s.toInt();
}
if (eingabe.startsWith("soll=")) { // Sollwert einlesen
String s = eingabe.substring(5);
Soll = s.toFloat();
}
if (eingabe.startsWith("T1=")) { // Verz. 1 Glied
String s = eingabe.substring(3);
T1 = s.toFloat();
}
if (eingabe.startsWith("T2=")) { // Verz. 2. Glied
String s = eingabe.substring(3);
T2 = s.toFloat();
}
if (eingabe.startsWith("KS=")) { // Streckenverstärkung
String s = eingabe.substring(3);
KS = s.toFloat();
}
if (eingabe.startsWith("KP=")) { // P Anteil Regler
String s = eingabe.substring(3);
KP = s.toFloat();
}
if (eingabe.startsWith("TN=")) { //I Anteil Regler
String s = eingabe.substring(3);
TI = s.toFloat();
}
if (eingabe.startsWith("CL=")) { // Status colose Loop
String s = eingabe.substring(3);
CL = s.toInt();
}
zeichen = "";
eingabe = "";
}
}
}
Laßt mich mal aus dem Urlaub zurückkommen, dann schaue ich mir morgen die Sache in Ruhe an.
Grüße aus Piran
Uwe
@ Rentner: Toll gemacht, ich wollte mich auch mal wieder mit dem Thema beschäftigen, habe über die Jahre viel zu viel vergessen...
Gruß
Danke für die Blumen
Ging mir bei vielem Theoretischen Kram in den letzten Tagen auch so,aber zum Glück gibt's ja Wikipedia , da ist man dann schnell wieder drin.
Viel Sachen macht man dann in der Praxis einfach jahrelang so weil man das immer so gemacht hat aber mit der Mathe dahinter beschäftigt man sich dann doch nicht mehr
Gruß Heinz
Rentner:
Viel Sachen macht man dann in der Praxis einfach jahrelang so weil man das immer so gemacht hat aber mit der Mathe dahinter beschäftigt man sich dann doch nicht mehr
Wie war! Da ist dieses Forum dann eine schöne Anregung, sich zumindest gedanklich damit mal wieder auseinanderzusetzen. Danke dafür!
Bei meinem Berufseinstieg hat mir ein altgedienter Facharbeiter die Regelung mit einer Toilettenspülung erklärt. Das war schön anschaulich.
@stoni99
geil, typisch deutsch
Alles schön übersichtlich und aufgeräumt.
So stelle ich mir ein finales Projekt vor.
Kein Pappkarton und kein Klebeband.
Respekt !!!
Halloween Gimmick mit Sound Effekten.
Features:
Android App / Bluetooth
10 Sounds
Bewegungsmelder
Konfigurierbare Led Helligkeit und Flackern bei Bewegung aktiv/inaktiv
Live Update mit CRC16 Check in Beide richtungen.
Onboard Stepup von 0,8-3V