PWM-Signal auswerten

Vielleicht sind 16 auch wirklich zu viel. 10 Funktionen würden mir auch reichen. XD

Ich will jetzt erstmal die Funktionsweise der Programmierung testen. Und dann schau ich, wieviel Funktionen möglich sind.

Ich hab ein Grundlegendes Problem.
Ich möchte das PWM-Signal per Serieller Schnittstelle auslesen (ich brauch ja nur die groben Werte).
Dazu müsste das ja funktionieren:

void setup (){
Serial.begin(9600);
pinMode(3,INPUT);
}
void loop (){
int a = pulseIn(3,HIGH,24000);
Serial.println(a,DEC);
}

Geht aber nicht. Es werden zwar Daten angezeigt, aber die verändern sich nicht, wenn ich den Kanal per Funke verändere. Die Zahlen sind abhängig von dem Abstand der Fernbedienung zum Kabel zwischen Empfänger und Arduino :0
Also hab ich 1. ein Empfangsproblem (was wohl daran liegt, das das Kabel recht lang ist - kann man ändern) und 2. ein Problem in der Programmierung, oder?
Edit: Hab jetzt ein ganz kurzen Kabel genommen. Nichts verändert.
Wenn ich mit der Funke etwas weiter weg bin, ist der angezeigte Wert zwischen 300-800. Wenn ich in die Funke in 20cm entfernung habe, kommen meistens Werte von 1500, dazwischen dann mal 1, oder 2. Weiß jemand, was das Problem sein könnte?

Bluetruck:
Geht aber nicht. Es werden zwar Daten angezeigt, aber die verändern sich nicht, wenn ich den Kanal per Funke verändere. Die Zahlen sind abhängig von dem Abstand der Fernbedienung zum Kabel zwischen Empfänger und Arduino

Woher weißt Du, dass die relevanten Impulse HIGH-Impulse sind und nicht LOW-Impulse, die Du am Empfänger auslesen mußt?

Hast Du probeweise am Empfängeranschluß mal einen Servo angeschlossen und reagiert dieser normal?

Mit welcher Spannung arbeitet eigentlich der Empfänger?

Und sind die Minuspole der Stromversorgung vom Arduino und RC-Empfänger (Ground and Ground) überhaupt miteinander verbunden?

Empfänger arbeitet mit 5V (Ausgang). Ja, ich hab einen Servo angeschlossen. Aber reicht es nicht, wenn nur die Steuerleitung zwischen Empf. und Arduino da ist? Weil Spannung kommt ja vom PC.

Hallo,
nimm einfach ein normales Servokabel.
Plus(5V) und Minus an den Arduino und die Signalleitung an Pin 3.
dann wird es funktionieren.

Bluetruck:
Empfänger arbeitet mit 5V (Ausgang). Ja, ich hab einen Servo angeschlossen. Aber reicht es nicht, wenn nur die Steuerleitung zwischen Empf. und Arduino da ist? Weil Spannung kommt ja vom PC.

Ja und, wo ist das Vergleichslevel, mit dem das Potential der Steuerleitung verglichen werden soll?

Entweder verbindest Du bei getrennter Stromversorgung von Arduino und RC-Empfänger Ground an Ground.

Oder Du versorgst den RC-Empfänger über GND und 5V mit von der Arduino-Stromversorung (falls sonst keine Servos am RC-Empfänger hängen, denn der 5V Pin am Arduino gibt nicht so sehr viel Strom her).

Jedenfalls kann die auszuwertende Steuerleitung nur gegen ein definiertes Ground-Level ausgewertet werden und nicht "freihängend in der Luft" mit der Luft als zweitem Vergleichspotential.

Danke! Das war das Problem.
Daten hab ich gesammelt, jetzt wollt ich das in den Arduino übertragen. Beim Speichern kommt aber folgender Fehler:

sketch_Multiswitch2.ino: In function 'void loop()':
sketch_Multiswitch2:12: error: lvalue required as left operand of assignment
sketch_Multiswitch2:14: error: expected `;' before 'delay'
sketch_Multiswitch2:15: error: lvalue required as left operand of assignment
sketch_Multiswitch2:17: error: expected `;' before 'delay'

Hier nochmal der Sketch:

void setup ()
{
pinMode (13, OUTPUT);
pinMode (3, INPUT);
digitalWrite (13,LOW);
}

void loop ()
{
int a = pulseIn(3,HIGH,24000);
int LED2v = digitalRead(13);
if (a>1228 && a<1242 && LED2v=LOW)
digitalWrite (2,HIGH)
delay(1000);
if (a>1228 && a<1242 && LED2v=HIGH)
digitalWrite (2,LOW)
delay(1000);
}

Ein Fehler in der if-gleichung
Dann möchte er vor Delay ein ";" - aber das soll ja in die if-formel mit rein. Sonst würd er das ja immer machen (und dass würde ja alles endlos in die Länge ziehen)

hi,

was in der if-bedingung passieren soll, muß in geschwungene {} klammern, das hat nichts mit ; zu tun.

if (a>1228 && a<1242 && LED2v=LOW) {
digitalWrite (2,HIGH);
delay(1000);
}
if (a>1228 && a<1242 && LED2v=HIGH) {
digitalWrite (2,LOW);
delay(1000);
}

gruß stefan

Ah, dann kann ich auch ";" setzen
Er bringt aber immer noch die andere Fehlermeldung.
"IValue (am anfang ein i)benötigt für übrige/fehlende Rechengröße in Aufgabe" Versuchsweise Übersetzung. Also jedenfalls hat es was mit dem letzten Teil in der if-bedingung zu tun

&& LED1v=LOW

Denn wenn ich ihn weglösche, kommt kein Fehler

hi,

kann man pins, die auf output gesetzt sind, mit digitalread einlesen?

gruß stefan

ok, gelesen, kann man anscheinend.
aber vergleiche sind immer mit doppeltem gleichheitszeichen, also LED1v==LOW.

gruß stefan

Eisebaer:
hi,

kann man pins, die auf output gesetzt sind, mit digitalread einlesen?

gruß stefan

Jein

Beim Arduino UNO, MEGA, Nano ecc schon; beim Due nicht; beim Leonardo weiß ich nicht.

Grüße Uwe

Achso.
Danke! Das mit dem == wars. Jetzt bringt er keine Fehlermeldungen mehr.

Bluetruck:
Er bringt aber immer noch die andere Fehlermeldung.
"IValue (am anfang ein i)benötigt für übrige/fehlende Rechengröße in Aufgabe" Versuchsweise Übersetzung. Also jedenfalls hat es was mit dem letzten Teil in der if-bedingung zu tun

&& LED1v=LOW

Denn wenn ich ihn weglösche, kommt kein Fehler

LED1v=LOW ist eine Zuweisung

LED1v==LOW ist ein Vergleich.

Normalerweise macht eine Zuweisung innerhalb if keine Fehlermeldung; funktioniert dann aber nicht. In diesem Fall glaube ich, bekommst Du eine Fehlermeldung weil Du LOW und HIGH vergleichst.

Grüße Uwe

Auf jeden Fall funktioniert es jetzt! Danke an alle :smiley:
Mit genauen Widerständen muss ich noch ausprobieren. Hab jetzt an einer Schaltung ausprobiert, die eigentlich für was anderes gedacht war. Aber erfüllen tut sie den gleichen Zweck. Der Toleranzbereich eines Widerstands beträgt so etwa 20.

20 ist im Vergleich zu 1024 nicht viel.
grad mal 2%
Würde schon 1% Widerstände nehmen.
Grüße Uwe

Hallo,
Du kannst den Wert von pulseIn auch mappen.
z.B a=map(pulseIn(3,HIGH,24000),1000,2000,0,10).
Du erzeugst dann nur Werte zwischen 0 und 10.

swordfish:
Hallo,
Du kannst den Wert von pulseIn auch mappen.
z.B a=map(pulseIn(3,HIGH,24000),1000,2000,0,10).
Du erzeugst dann nur Werte zwischen 0 und 10.

Was aber nicht 100% gut ist, weil es so Rundungfehler gibt und die 11 Zahlen nicht gleichmäßig verteilt sind.
von 1000 bis 1099 ergibt 0
von 1100 bis 1199 ergibt 1
von 1200 bis 1299 ergibt 2
von 1300 bis 1399 ergibt 3
von 1400 bis 1499 ergibt 4
von 1500 bis 1599 ergibt 5
von 1600 bis 1699 ergibt 6
von 1700 bis 1799 ergibt 7
von 1800 bis 1899 ergibt 8
von 1900 bis 1999 ergibt 9
2000 ergint 10

Grüße Uwe

Ich weiß jetzt nicht, was mir mappen bringen sollte, es funktioniert doch!

Aber ein anderes Problem.
Ich möchte die delay()-Schleife raus haben.

void setup ()
{
pinMode (13, OUTPUT);
pinMode (3, INPUT);
}

void loop ()
{
int a = pulseIn(3,HIGH,24000);
int L1 = digitalRead(13);
if (a>1228 && a<1242 && L1==LOW){//Wenn Eingangssignal im richtigen Bereich und entsprechende LED aus ist,
  digitalWrite (13,HIGH);//dann schalte LED 13 an
  if (a>1490 && a<1505){//Wenn neutrales Einganssignal (Mittelstellung),
    goto if1H;//dann geh weiter zu nächsten if-Bedingung
  }
  else 
  {
    goto if1L;//sonst wiederhole aktuelle if-Bedingung
  }
}
if1H:

if (a>1228 && a<1242 && L1==HIGH){
  digitalWrite (13,LOW);
  if (a>1490 && a<1505){
    goto if1L;
  }
  else 
  {
    goto if1H;
  }

}
if1L:
;
}

Kann das an dem "goto" liegen? Weil er erkennts nicht als funktion, aber es ist ja eine offizielle Funktion !?

Zur Info nochmal das Funktionsprinzip: Wenn eine LED-geschaltet wird, wird automatisch eine weitere if-gleichung in Gang gesetzt, dass die vorhergehende if-gleichung so lange wiederholt wird, bis kein Schalter gedrückt wird (Der Wert am Eingang beträgt dann so um die 1500). Dann gehts nach gewohntem Prinzip weiter. Damit wird verhindert, dass die LED gleich wieder ausgeschaltet wird.

Ich push das hier nochmal hoch
Weiß denn keiner was?