Pages: 1 [2] 3 4 5   Go Down
Author Topic: PWM-Signal auswerten  (Read 6145 times)
0 Members and 1 Guest are viewing this topic.
Germany S-H
Offline Offline
Edison Member
*
Karma: 117
Posts: 2455
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nein, für ein und Ausschalten möchte ich in der Fernbedienung den gleichen Schalter/Taster verwenden.

Du brauchst ja eine Logik zum Ein- und auch wieder ausschalten.

Mit Deiner Stückelung in 16 Bereiche kannst Du es beispielsweise so schalten, daß bei "null" alle Pins/Geräte ausgeschaltet werden, und bei jedem anderen Wert wird genau ein einzelner Pin mit einem Gerät aktiviert (und alle anderen sind aus). So daß immer nur "kein" oder "ein" Gerät eingeschaltet ist.

Ist das die Logik, die die vorschwebt?
Die ließe sich nämlich realisieren.

Wenn jedes Gerät unabhängig ein- und ausschaltbar sein soll, z.B. erstes Gerät ein, zweites Gerät aus, drittes Gerät ein, viertes Gerät aus, dann kannst Du mit Deinen 16 Zuständen nur viel weniger als 15 Geräte unabhängig schalten.

Also wie soll es sein:
- Immer nur ein Gerät zur Zeit eingeschaltet?
oder:
- Jedes Gerät unabhängig ein- und ausschaltbar, auch mehrere zur selben Zeit ein?
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ist denn die Hardware im Sender vorhanden?
Am einfachsten wäre es mit 3Stufenschaltern und 2 oder 3 Kanälen zu bewerkstelligen.
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 49
Posts: 2752
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


Nein, dein Irrtum liegt in

LED2=LOW

Das prüft nicht, welchen Zustand deine LED hat, sondern setzt die  Variable int LED2; auf den Wert 0.

Das stört zwar nicht, weil LED2 nicht weiter gebraucht wird, ist aber sicher nicht das was du willst.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Einen Irrtum hab ich behoben.

Code:
void setup ()
{
pinMode (2, OUTPUT);
pinMode (5, INPUT);
ditigalWrite (2,LOW)
}

void loop ()
{
int a = pulseIn(5,HIGH,24000);
int LED2v = digitalRead (2);
if (a>1450 && a<1500 && LED2v=LOW)
digitalWrite (2,HIGH)
delay(1000);
if (a>1450 && a<1500 && LED2v=HIGH)
digitalWrite (2,LOW)
delay(1000);
}

Hab gelesen, dass man über digitalRead auch den Ausgang messen kann http://arduino.cc/forum/index.php?topic=29552.0
Wenn also der Impuls stimmt, und die LED aus ist, wird sie angeschalten. Dann wird eine sec. gewartet: In dieser Zeit sollte ich meinen Finger wieder vom Taster nehmen. In der zweiten Gleichung stimmt dann zwar, dass die LED an ist, aber nicht mehr der Impuls.
Mal schaun, wo der Fehler liegt, dass was so schnell funktioniert ist ja eher unwarscheinlich  smiley-lol

Zu euren Fragen: Ich möchte einen Multiswitch bauen. Für die, die sich im Modellbau jetzt nicht so weit auskennen: Einen "Proportionalkanal", der mittels PWM übertragen wird, aufsplitten auf mehrere "An/Aus-Kanäle". In der Fernsteuerung wird die Stellung des Kreuzknüppels als erstes über ein Poti (veränderbarer Widerstand) erfasst und dann elektronisch auf ein PWM-Signal "konvertiert". Wenn man statt dem Poti ein paar Widerstände mit (An-/Aus-)Schaltern ansteuert, kann man somit gezielt eine bestimmte Impulslänge erzielen.
Achja, zur selben Zeit drücke ich immer nur einen Schalter! Aber es sollen mehrere LEDs and unterschiedlichen Ausgängen gleichzeitig an sein können.
Logged

Germany S-H
Offline Offline
Edison Member
*
Karma: 117
Posts: 2455
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Achja, zur selben Zeit drücke ich immer nur einen Schalter! Aber es sollen mehrere LEDs and unterschiedlichen Ausgängen gleichzeitig an sein können.

Also 16 Taster zum Schalten von 8 Kanälen (Pins) mit insgesamt 17 Schaltzuständen (alles aus = es wird gerade nichts geschaltet, 8 Einschalt-Taster = Kanal einschalten, 8 Ausschalt-Taster = Kanal ausschalten)

Also teilst Du die Bandbreite von 1000 bis 2000 Microsekunden in 17 Pulsbreiten-Bereiche ein, und machst je nach empfangenem Pulsbreitenbereich entweder nichts (kein Taster gerdückt) oder einen Ein- oder Ausschaltvorgang (bei Emfpang einer bestimmten Pulsbreite).

Bei nur wenigen Prozent erlaubtem Unterschied in der Pulsbreite und bei teils recht deftigen Toleranzen handelsüblicher Widerstände wirst Du aber vermutlich schon etwas suchen und messen müssen, um geeignete Widerstände für Dein Vorhaben zu finden, die diese zahlreichen und exakten Impulsbreiten tatsächlich erzeugen, die Du unterscheiden möchtest.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vielleicht sind 16 auch wirklich zu viel. 10 Funktionen würden mir auch reichen.  smiley-lol

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

Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Quote
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  smiley-mad
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?
« Last Edit: February 15, 2013, 10:20:34 am by Bluetruck » Logged

Germany S-H
Offline Offline
Edison Member
*
Karma: 117
Posts: 2455
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Germany S-H
Offline Offline
Edison Member
*
Karma: 117
Posts: 2455
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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:
Quote
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)
Logged

Wien
Offline Offline
Edison Member
*
Karma: 23
Posts: 1664
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hi,

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

Code:
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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Code:
&& LED1v=LOW
Denn wenn ich ihn weglösche, kommt kein Fehler
Logged

Wien
Offline Offline
Edison Member
*
Karma: 23
Posts: 1664
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hi,

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

gruß stefan
Logged

Pages: 1 [2] 3 4 5   Go Up
Jump to: