RC-Baustelle.de
Registrierung Mitgliederliste Suche Zur Startseite
RC-Baustelle.de » Fragen und Antworten zu . . . . . . » Elektronik » Arduino Microcontroller im Modell » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Arduino Microcontroller im Modell
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Arduino Microcontroller im Modell
tömchen
König


images/avatars/avatar-1117.jpg

Dabei seit: 27.12.2006
Beiträge: 881
Maßstab: 1:8
Wohnort: München

Level: 46 [?]
Erfahrungspunkte: 5.567.587
Nächster Level: 6.058.010

490.423 Erfahrungspunkt(e) für den nächsten Levelanstieg

  Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen
Nachdem JensR in einem anderen Thread erwähnt hat, daß er einen Arduino im Modell verwendet und an dieser Front auch etwas Probleme hat, dachte ich mir, machen wir mal einen Thread auf.

Das wird kein Tutorial. Ich habe selbst relativ wenig Ahnung davon und kann zunächst nur berichten, wie ich meine relativ eng eingegrenzte Aufgabe gelöst habe. Und wo die Grenzen zu liegen scheinen.

Aber vielleicht kommt im Lauf der Zeit zumindest eine kleine Stoffsammlung zusammen.

Mit dem Arduino ist es nämlich so: Man bekommt zwar unheimlich schnell Ergebnisse und wird auf angenehme Weise von einem über 300seitigem Datenblatt des verwendeten Microcontrollers ferngehalten. Aber wenn die Aufgabe größer wird und sich Grenzen auftun, muß man sich doch durch einen Dschungel aus Forumsbeiträgen und Halbwahrheiten kämpfen. Die Arduino-eigene Dokumentation geht dazu nicht weit genug in die Tiefe.
10.08.2016 22:07 tömchen ist offline E-Mail an tömchen senden Homepage von tömchen Beiträge von tömchen suchen Nehmen Sie tömchen in Ihre Freundesliste auf
5 Kanäle einlesen, 2 Kanäle ausgeben
tömchen
König


images/avatars/avatar-1117.jpg

Dabei seit: 27.12.2006
Beiträge: 881
Maßstab: 1:8
Wohnort: München

Level: 46 [?]
Erfahrungspunkte: 5.567.587
Nächster Level: 6.058.010

490.423 Erfahrungspunkt(e) für den nächsten Levelanstieg

Themenstarter Thema begonnen von tömchen
  Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen
Sodala, zunächst eine knappe Beschreibung meiner Lösung.

Ich glaube, das hat nichts mit Jens' Problemen zu tun, aber wir sammeln einfach mal alles was irgendwie mit Arduino zu tun hat hier.

Meine Aufgabe:
- 5 Kanäle einer Spektrum DX5e einlesen
- Mehrere Analogwerte einlesen
- Sachen berechnen
- 2 RC-Kanäle ausgeben
- 1 Schaltkanal schalten

Die Klippe:
Die Impulslängen mit PulseIn() zu messen und gleichzeitig mit der Bibliothek servo.h Servoimpulse zu erzeugen, beißt sich. Die Servos wackeln rhythmisch mit mehreren Grad, und manchmal zucken sie richtig heftig herum. So gehts nicht.

Die Erkenntnisse:
Die Impulse der Spektrum kommen wie in der guten alten 40MHz-Zeit schön hintereinander. Aber die Wiederholzeit ist 22ms und nicht 20ms.
Die Servoimpulse, welche über die Bibliotheksfunktionen im Hintergrund erzeugt werden, haben aber 20ms Wiederholrate. Da gibts ca. alle 0,5s für die Timer und Interrupts im Microcontroller zu viel zu tun, daher das rhythmische Wackeln der Servos. Und alle paar Sekunden passiert noch was schlimmeres, da gerät das Messen der Pulse mit PulseIn() ganz durcheinander. Servoausgabe und PulsIn() arbeiten mit demselben Timer im Microcontroller (glaube ich).

Die Lösung:
Erstens habe ich alle Kanäle des Empfängers mit Dioden und einem Inverter auf ein Summensignal zusammengelegt. Das muß man nicht unbedingt machen, spart aber Pins am Controller. Und reduziert Empfänger und diese kleine Schaltung zusammen auf eine "black box", die nur Masse und +5V braucht und an einer Leitung das Summensignal zurückliefert.
Dieses Summensignal werte ich durchaus mit 5 aufeinanderfolgenden PulseIn() aus. Das verbraucht natürlich in der Hauptschleife des Programms schon mal bis zu 10ms.
Danach hole ich die Analogwerte und mache die nötigen Berechnungen. Das geht blitzschnell.
Dann gebe ich die Pulse für zwei Servos (bzw. eigentlich Fahrtregler) "zu Fuß" hintereinander aus:
code:
1:
2:
3:
digitalWrite(Servopin, HIGH);
delayMicroseconds(Pulslänge - 5);
digitalWrite(Servopin, LOW);
Das war jetzt nur für einen Servo, die gewünschte Impulslänge in Mikrosekunden wird um einen empirisch ermittelten Offset von 5us gekürzt.
Dieses Verfahren braucht natürlich pro Servo wieder bis zu 2ms in der Programmschleife. Geht also mit zweien, aber bei 5 oder auch schon bei 4 wirds eng.
Denn: Nach der Impulsausgabe ist der Schleifendurchlauf zu Ende, es fängt wieder von vorne an mit dem ersten PulseIn(). Und dieses wartet einfach, bis nach der ca. 12-17ms langen Impulspause vom Empfänger wieder der erste Impuls kommt.
Die Programmschleife des Arduino synchronisiert sich also von selbst auf die Wiederholrate des RC-Empfängers.

Soweit zu meiner Hausmacher-Methode. Klappt für mich zufriedenstellend.

Ich werde mir beizeiten die von Jens erwähnte RCarduino Geschichte ansehen, die hatte ich bei meiner Recherche nicht gefunden.

So Jens, dann beschreib mal Deinen Setup und Dein Problem. Ist aber vermutlich wirklich was elektrisches, Störungen, Stromversorgungs-Unterbrechung oder so.
10.08.2016 22:37 tömchen ist offline E-Mail an tömchen senden Homepage von tömchen Beiträge von tömchen suchen Nehmen Sie tömchen in Ihre Freundesliste auf
RE: Arduino Microcontroller im Modell
JensR
Administrator


Dabei seit: 16.01.2010
Beiträge: 5.265
Maßstab: 1:14,5
Wohnort: England

Level: 56 [?]
Erfahrungspunkte: 27.400.429
Nächster Level: 30.430.899

3.030.470 Erfahrungspunkt(e) für den nächsten Levelanstieg

  Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen
Hi Tom,

Ja, interessant, Du re-generierst im Prinzip das sogenannte PPM Summensignal.
So werden die Signale nämlich seriell durch die Luft geschickt und der Empfänger spaltet die dann auf die Kanäle auf. Du legst (einen Teil) davon wieder zusammen, um die Auswertung zu erleichtern.
Raffiniert. Aber durch das Warten eben auch zeitintensiv.

Auf die Idee bin ich nicht gekommen, aber das kann ich mir wahrscheinlich nicht leisten, da ich ja noch den Lagesensor auswerten muss und der Lageregler soll ja auch noch schnell sein.
Allerdings, Du hast die Drehmomenten-Regelung, das ist ja auch nicht ohne.

Naja, wie gesagt, ich verwende RCarduino zum Einlesen von drei Kanälen.
Das arbeitet mit Interrupts und ist deswegen schneller.
Aber wie das bei geliehener Code so ist, evtl. habe ich da was falsch gemacht, Interrupts sind für mich doch noch ein Problem.

Im Trockenlauf lief es ja noch gut:
https://www.youtube.com/watch?v=RZNMqsyKDKE
https://www.youtube.com/watch?v=GHs56BfeaJA
Aber dann im Sand haben die Servos den totalen Kasper gemacht und der Arduino war teilweise nicht mal durch Reset oder Strom aus/an wiederzubeleben. Erst als ich ihn an den USB gehängt habe, kam er wieder. Also, da ist irgendwas faul. Das letzte Problem ist nicht mehr, der Reset funktioniert, aber Reset ist ja eigentlich nur für den Notfall gedacht...


Mit dem kleinen Oszi habe ich mal geguckt und die Rechteckpulse, die aus dem Arduino kommen, sind teils leicht rund und weniger als 5V hoch, vielleicht führt das bei den Servos zu Problemen. Aber die Probleme werden scheinbar umso größer, je mehr Strom andernorts im Modell fließt. Das Rauschen ist sicherlich auch nicht hilfreich.

Einen Kurzschluss wegen durchgescheuerter Leitung zu meinen LEDs habe ich gefunden. Beim Messen habe ich nichts Weiteres gefunden, aber vielleicht ist doch irgendwas faul. Etwas frustriert bin ich...
10.08.2016 23:42 JensR ist offline E-Mail an JensR senden Beiträge von JensR suchen Nehmen Sie JensR in Ihre Freundesliste auf
tömchen
König


images/avatars/avatar-1117.jpg

Dabei seit: 27.12.2006
Beiträge: 881
Maßstab: 1:8
Wohnort: München

Level: 46 [?]
Erfahrungspunkte: 5.567.587
Nächster Level: 6.058.010

490.423 Erfahrungspunkt(e) für den nächsten Levelanstieg

Themenstarter Thema begonnen von tömchen
  Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen
1. Schnelligkeit:
Ich bekomme höchstens alle 22ms neue Informationen von der Fernsteuerung.
Ich kann dem kleinen Fahrtregler, der den Lenkmotor steuert, höchstens alle 20ms neue Information geben.
Da habe ich mir gedacht, wenn sich mein Regelalgorithmus auch an dieses Raster hält, müßte es reichen. Und tut es auch.
Du könntest zwar den Lagesensor ganz schnell und oft auswerten, aber Dein Stellglied, die Servos, kannst Du auch nur alle 20ms ansprechen.

2. Störungen:
Mit wieviel Bordspannung gehst Du denn in den Arduino rein? Ich habe ja bei der Blauzahn schon die Erfahrung gemacht, daß die 7,2V vom Fahrakku zwar nominell reichen (weil der 5V-Regler der Blauzahn eigentlich super low-drop mit nur 0,3V Verlust ist), aber trotzdem mit Spannungseinbrüchen oder sonstwas verseucht sind und zu Störungen führen. Erst ein separater 8-Zeller als Empfängerakku brachte Ordnung ins System.
Ganz blöde Frage: Gehst Du mit 5V in den Vin-Eingang, der eigentlich für 7-12V gedacht ist?

3. Verschliffene Servosignale:
Hmmm. laut Schaltplan arbeitet der Microcontroller mit 5V, also können keine schwachmatischen Pegelwandler mit Pullups dafür verantwortlich sein. Ich muß mir beizeiten mal die von meinem Arduino erzeugten Signale ansehen. Wie rund sind die denn? Das letzte halbe Volt abgerundet oder richtig rund? Damit ich einen Vergleich habe.
11.08.2016 09:32 tömchen ist offline E-Mail an tömchen senden Homepage von tömchen Beiträge von tömchen suchen Nehmen Sie tömchen in Ihre Freundesliste auf
JensR
Administrator


Dabei seit: 16.01.2010
Beiträge: 5.265
Maßstab: 1:14,5
Wohnort: England

Level: 56 [?]
Erfahrungspunkte: 27.400.429
Nächster Level: 30.430.899

3.030.470 Erfahrungspunkt(e) für den nächsten Levelanstieg

  Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen
1.
Ja, das stimmt. Servos/Regler können allerdings auch häufiger geupdatet werden, aber 50Hz scheint der Standard zu sein. Aber man hat ja auch noch andere Operationen dazwischen. Und da Arduino im Gegensatz zu den professionellen Echtzeit-Systemen auf der Arbeit mir nicht sagt, wie ausgelastet der Prozessor ist, weiß ich nicht wieviel Luft ich noch habe...
Gibt es da ne Möglichkeit das auszulesen?

2.
Ich gehe mit meinem 12V NiMH Akku direkt in den Vin Eingang. Unter Last (max 10A geht der Akku bis auf 10V runter, wenn er leerer ist auch 9V), das sollte immer genug sein. Habe es auch mit eigenem 11.1 LiPo Akku an Vin probiert, mit gemeinsamer Masse. Kein Unterschied.


3.
Muss ich nochmal genau nachgucken. Die Ecken waren nicht sehr rund, definitiv weniger als 0.5V abgerundet.
11.08.2016 15:07 JensR ist offline E-Mail an JensR senden Beiträge von JensR suchen Nehmen Sie JensR in Ihre Freundesliste auf
tömchen
König


images/avatars/avatar-1117.jpg

Dabei seit: 27.12.2006
Beiträge: 881
Maßstab: 1:8
Wohnort: München

Level: 46 [?]
Erfahrungspunkte: 5.567.587
Nächster Level: 6.058.010

490.423 Erfahrungspunkt(e) für den nächsten Levelanstieg

Themenstarter Thema begonnen von tömchen
  Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen
1.
Auslastung des Prozessors? Keine Ahnung, bin ja auch nur Arduino-Neuling mit einer gewissen Portion Verstand.
Wenn die Schleife schnell läuft (weil Deine RC-Impuls-Messung unabhängig durch Interrupts geht), dann würde ich mir einfach auf einem speziellen Pin einen kurzen Peak pro Schleifendurchlauf ausgeben. Einmal einen Pin auf High und sofort wieder auf LOW setzen gibt einen Puls von ca. 5us Dauer. Dann Oszi dranhängen und Du siehst, wie schnell die Schleife durchlaufen wird.
Wenn ich in meinem Programm die "Luft" messen würde, die noch ist, dann würde ich wohl an zwei Pins sowas machen, einmal gleich nach Abschluß des ersten PulseIn() und einmal am Ende der Sevosignal-Ausgabe. Die Zeit des ersten PulseIn() muß ich mir dann dazurechnen und ob die Pause zwischen zwei zu lesenden Pulsen (~30us) reicht, so einen Peak auszugeben und den Start des zweiten Pulses nicht zu verpassen, müßte ich irgendwie ausprobieren.

2.
Dann kanns das mit der Spannung nicht sein. Bei 12V hättest Du auch genug Luft, um mit dicken Drosseln und Kondensatoren die Arduino-Versorgung zu glätten und dämpfen. Da würde ich als nächstes rumprobieren. Die Servos bekommen ja nur die Impulse vom Arduino, oder? Deren Stromversorgung hat damit nichts zu tun? Am Ende des Tages könnte man die Servo-Impulse noch durch Optokoppler schicken, dann kann definitiv nichts zum Arduino zurückspucken.

3.
Das sieht aber dann auch unverdächtig aus.
Mein Spektrum Empfänger gibt übrigens nur 3V hohe Impulse aus, kein Servo hat sich bisher daran gestört. Gemerkt habe ich das erst, als ich die Impulse über Dioden zusammenfassen wollte - danach waren sie nur noch 2,4V hoch und der Arduino hat sie nicht mehr kapiert. Deshalb dann nochmal die Invertierung mit einem Transistor.
11.08.2016 16:00 tömchen ist offline E-Mail an tömchen senden Homepage von tömchen Beiträge von tömchen suchen Nehmen Sie tömchen in Ihre Freundesliste auf
JensR
Administrator


Dabei seit: 16.01.2010
Beiträge: 5.265
Maßstab: 1:14,5
Wohnort: England

Level: 56 [?]
Erfahrungspunkte: 27.400.429
Nächster Level: 30.430.899

3.030.470 Erfahrungspunkt(e) für den nächsten Levelanstieg

  Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen
Hi Tom!

Getrennte Spannung hat nichts geändert.

Die Rundung der EMPFÄNGER Impulse passiert, wenn der Arduino ausgeschaltet ist! Ich vermute, dass da irgendein Pullup-Widerstand nicht ganz aktiv ist und deswegen die Impedanz zu gering ist. Wenn der Arduino Strom bekommt, ist die Ecke des Signals, das aus dem Empfänger kommt wieder scharf.

Nach Flinte-ins-Korn werfen habe ich dann doch das Oszi angesteckt. Ich bin mit ziemlich sicher:
Meine Front-Motoren (Slotcar-Rennmotoren) erzeugen zu viel Störung für meine Auswertelogik.

Ich werde nochmal die Lötstellen der Kondensatoren überprüfen.

Aber ich wollte Dich bitten, ob Du mal Deinen Auswerte-Algorithmus posten/schicken könntest?
Ich habe nämlich das Phänomen, dass meine Turnigy 9x Funke von dem Bürstenfeuer unbeeindruckt ist.
Mein Arduino Algorithmus verwendet Interrupts, d.h. wenn so ein Bürstenfeuer-Puls kommt, könnte er als Servosignal interpretiert werden.
Deine Logik zählt ja die Zeit, könnte also besser funktionieren?
12.09.2016 00:36 JensR ist offline E-Mail an JensR senden Beiträge von JensR suchen Nehmen Sie JensR in Ihre Freundesliste auf
Code
tömchen
König


images/avatars/avatar-1117.jpg

Dabei seit: 27.12.2006
Beiträge: 881
Maßstab: 1:8
Wohnort: München

Level: 46 [?]
Erfahrungspunkte: 5.567.587
Nächster Level: 6.058.010

490.423 Erfahrungspunkt(e) für den nächsten Levelanstieg

Themenstarter Thema begonnen von tömchen
  Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen
klar kann ich den Code posten,

aber es ist ja nur ein Spezialfall - mit meinen 5 Kanälen kann ich gerade noch mit diesen PulseIn() Befehlen arbeiten und auch die beiden Servosignale kann ich ganz simpel mit Zeitsteuerung ausgeben.
Die PulseIn()-Funktion wird wohl genauso empfindlich auf Störungen reagieren, wie eine Interruptgeschichte. Aber vielleicht kommt weniger durcheinander, man kann sich bei diesen geradeaus runterprogrammierten Ablauf schön an beliebigen Stellen Debug-Informationen rausgeben lassen (die ganzen Debug-SerialPrint Befehle habe ich jetzt gerade rausgelöscht)

So:
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:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
/*
  Unimog 1.3

  Weitere Schritte in Richtung duale Steuerung
  Einführung der Verhaltensmodi Kind, RC, Fehler
  Versuch der gemischten Lenkung
  Fahrsteuerung durch Kind mit zwei Fußtastern
*/ 

int RC_Gas_quer; //linker Steuerknüppel links-rechts
int RC_Lenkung_laengs; //rechter Steuerknüppel vor-zurück
int RC_Lenkung; //rechter Steuerknüppel links-rechts
int RC_Gas; //linker Steuerknüppel vor-zurück
int RC_Schaltung; //Schalter 5.Kanal an der Fernsteuerung
int Lenkmotor_Wert = 1500; //Servosignal-Ausgabe für kleinen Lenkmotor-Fahrtregler
int Fahrtregler_Wert = 1000; //Servosignal-Ausgabe für Haupt-Fahrtregler
int Nullpos;
int Sollpos;
int Istpos;
int Lenkrad;
long Lenkrad_Null;
int Lenkrad_Zaehler;
int Vorwaerts;
int Rueckwaerts;
byte Modus = 0;
int Moduszaehler = 0;


const byte RC_Pin = 2;
const byte Lenkmotor_Pin = 3;
const byte Fahrtregler_Pin = 4;
const byte Umpolrelais_Pin = 5;
const byte Istpos_Pin = 0;
const byte Nullpos_Pin = 1;
const byte Lenkrad_Pin = 2;
const byte Gas_Pin = 3;
const byte Schaltung_Pin = 4;
const byte Fehler = 0;
const byte RC = 1;
const byte Kind = 2;

void setup() {
  
  pinMode(RC_Pin, INPUT);
  pinMode(Lenkmotor_Pin, OUTPUT);
  pinMode(Fahrtregler_Pin, OUTPUT);
  pinMode(Umpolrelais_Pin, OUTPUT);
  
}

void loop() {

  RC_Gas_quer = pulseIn(2, LOW);
  RC_Lenkung_laengs = pulseIn(2, LOW);
  RC_Lenkung = pulseIn(2, LOW);
  RC_Gas = pulseIn(2, LOW);
  RC_Schaltung = pulseIn(2, LOW);

  Istpos = analogRead(Istpos_Pin);
  Nullpos = analogRead(Nullpos_Pin);
  Lenkrad = analogRead(Lenkrad_Pin);
  Vorwaerts = analogRead(Gas_Pin); //hier hängt aber nur ein Fußtaster dran
  Rueckwaerts = analogRead(Schaltung_Pin); //hier ein anderer Fußtaster zum Rückwärtsfahren 

  //gleitender Mittelwert und Nullwertbildung für Lenkrad-Drehmomentsensor
  Lenkrad_Null = Lenkrad_Null + Lenkrad;
  if (Lenkrad_Zaehler >= 3000) {
    Lenkrad_Null = Lenkrad_Null - (Lenkrad_Null / 3000);
  }
  else {
    Lenkrad_Zaehler++;
  }
  Lenkrad = Lenkrad - Lenkrad_Null / Lenkrad_Zaehler;
   
  //Nach 1s gültiger RC_Lenkung Neutralwerte vom Fehlermodus in den RC-Modus wechseln
  if (Modus == Fehler) {
    if (RC_Lenkung >= 1485 && RC_Lenkung <= 1515) Moduszaehler++; 
    if (Moduszaehler >= 50) {
      Moduszaehler = 0;
      Modus = RC;
    }
  }

  //Nach 10s RC_Lenkung Neutralwerte in den Kind-Modus wechseln
  if (Modus == RC) {
    if (RC_Lenkung >= 1485 && RC_Lenkung <= 1515) Moduszaehler++; 
    if (Moduszaehler >= 500) {
      Moduszaehler = 0;
      Modus = Kind;
    }
  }

  //Bei RC_Gas größer Neutral oder RC_Lenkung nicht neutral sofort in den RC-Modus
  if (Modus == Kind) {
    if (RC_Lenkung < 1485 || RC_Lenkung > 1515) Modus = RC;
    if (RC_Gas > 1150) Modus = RC;
  }

  //Verhalten im Fhelermodus
  if (Modus == Fehler) {
         Lenkmotor_Wert = 1500;
         Fahrtregler_Wert = 1000;
         digitalWrite(Umpolrelais_Pin, LOW);
  }

  //Verhalten im RC-Modus
  if (Modus == RC) {
         Fahrtregler_Wert = (RC_Gas - 1500) * 1.32 + 1500;
         Sollpos = (RC_Lenkung - 1500) / 2.35; //Sollwert draus machen
         Lenkmotor_Wert = (Sollpos - Istpos + Nullpos) * 10 + 1500;
         if (Lenkmotor_Wert > 2000) Lenkmotor_Wert = 2000;
         if (Lenkmotor_Wert < 1000) Lenkmotor_Wert = 1000;
         if (RC_Schaltung >= 1500) {
                digitalWrite(Umpolrelais_Pin, HIGH);
         }
         else{
                digitalWrite(Umpolrelais_Pin, LOW);
         }
  }

  //Verhalten im Kind-Modus
  if (Modus == Kind) {
         
         //ganze Lenkerei
         if (Lenkrad < -10) {
           Sollpos = Sollpos + 5;
           if (Sollpos > 170) Sollpos = 170;
         }
         if (Lenkrad > 10) {
           Sollpos = Sollpos -5;
           if (Sollpos < -190) Sollpos = -190;
         }
         if (Lenkrad >= -10 && Lenkrad <= 10) {
            if (Sollpos > 0) Sollpos--;
            if (Sollpos < 0) Sollpos++;
         }
         Lenkmotor_Wert = (Sollpos - Istpos + Nullpos) * 10 + 1500;
         if (Lenkmotor_Wert > 2000) Lenkmotor_Wert = 2000;
         if (Lenkmotor_Wert < 1000) Lenkmotor_Wert = 1000;  

         //ganze Fahrerei mit schlichten Fußtastern als Gaspedale
         if (Vorwaerts < 512 && Rueckwaerts > 512) {
            if (Fahrtregler_Wert < 1050) digitalWrite(Umpolrelais_Pin, LOW);
            if (Fahrtregler_Wert < 1200) {
              Fahrtregler_Wert = Fahrtregler_Wert + 3;
            }
            else {
              Fahrtregler_Wert = Fahrtregler_Wert + 8;
            }
         }
         if (Vorwaerts > 512 && Rueckwaerts < 512) {
            if (Fahrtregler_Wert < 1050) digitalWrite(Umpolrelais_Pin, HIGH);
            if (Fahrtregler_Wert < 1200) {
              Fahrtregler_Wert = Fahrtregler_Wert + 3;
            }
            else {
              Fahrtregler_Wert = Fahrtregler_Wert + 8;
            }
         }
         if (Vorwaerts < 512 && Rueckwaerts < 512) Fahrtregler_Wert = 1000;
         if (Vorwaerts > 512 && Rueckwaerts > 512) Fahrtregler_Wert = Fahrtregler_Wert -20;
         if (Fahrtregler_Wert > 2000) Fahrtregler_Wert = 2000;
         if (Fahrtregler_Wert < 1000) Fahrtregler_Wert = 1000;
  }
  digitalWrite(Lenkmotor_Pin, HIGH);
  delayMicroseconds(Lenkmotor_Wert - 5);
  digitalWrite(Lenkmotor_Pin, LOW);

  delayMicroseconds(30);
  
  digitalWrite(Fahrtregler_Pin, HIGH);
  delayMicroseconds(Fahrtregler_Wert - 5);
  digitalWrite(Fahrtregler_Pin, LOW);

}  
12.09.2016 10:55 tömchen ist offline E-Mail an tömchen senden Homepage von tömchen Beiträge von tömchen suchen Nehmen Sie tömchen in Ihre Freundesliste auf
RE: Code
JensR
Administrator


Dabei seit: 16.01.2010
Beiträge: 5.265
Maßstab: 1:14,5
Wohnort: England

Level: 56 [?]
Erfahrungspunkte: 27.400.429
Nächster Level: 30.430.899

3.030.470 Erfahrungspunkt(e) für den nächsten Levelanstieg

  Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen
Vielen Dank, Tom, das hilft mir sehr.

Allerdings kann es etwas dauern, dass ich genug Zeit dafür habe :-/
Werde Dich und Euch aber natürlich updaten!
12.09.2016 17:51 JensR ist offline E-Mail an JensR senden Beiträge von JensR suchen Nehmen Sie JensR in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
RC-Baustelle.de » Fragen und Antworten zu . . . . . . » Elektronik » Arduino Microcontroller im Modell

Views heute: 11.154 | Views gestern: 18.337 | Views gesamt: 249.561.581

Impressum


Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH Designed by MyGEN24.de & timo-reinelt.de | Convert by Synoxis