Go Down

Topic: tone() und LED-Ausgabe parallel funktioniert nicht!? (Read 950 times) previous topic - next topic

dischneider

Hallo,

ich möchte mit auf einem PIN meines Leonardo ein Ton ausgeben, parallel dazu soll eine LED leuchten.
Beides soll x Sekunden als Benachrichtigung bei bestimmten Events ausgegeben werden.
Als Ausgabe des Tons verwende ich einen Piezo an PIN 12, die LED ist an PIN 13.
Leider schaltet die LED aber immer sofort wieder ab, wo ist mein Fehler?
Ich hab folgendes probiert

Code: [Select]

  // init
  int speakerPIN =12;
  int ledPIN = 13;
  int signalTime = 5000;

  // void setup() ...
  // void loop() ...

  tone(speakerPIN, 2000, signalTime);
  digitalWrite(ledPIN, HIGH);
  delay(signalTime);
  digitalWrite(ledPIN, LOW);


Auch mit

Code: [Select]

  tone(speakerPIN, 2000);
  digitalWrite(ledPIN, HIGH);
  delay(signalTime);
  noTone(speakerPIN);
  digitalWrite(ledPIN, LOW);


wird es nicht anders.

Dirk
using arduino leonardo, arduino uno ...
--
tomorrow today will only be yesterday, so live your life today!

jurs


... Leonardo ...
Als Ausgabe des Tons verwende ich einen Piezo an PIN 12


Also ich lese in der Leonardo-Doku:
PWM: 3, 5, 6, 9, 10, 11, and 13.

Warum schließt Du den Piezo nicht an einen der PWM-Pins an, die in der Board-Dokumentation stehen?


Auch mit
...
wird es nicht anders.


So isses.

dischneider

Hmm, gute Frage.
Warum sollte ich denn einen PWM-Port nehmen, hab in der Doku zu tone() nix dahingehend gefunden ...
tone() schaltet doch den DigitalOut nur ein und aus und macht keine PWM?

Aber auch der Tausch der beiden Ports bringt keinen Unterschied zu vorher.
Also Status unverändert.

Dirk
using arduino leonardo, arduino uno ...
--
tomorrow today will only be yesterday, so live your life today!

Serenifly

So wie ich das lese macht Tone PWM per Software auf jedem Pin. Braucht also nicht die Hardware PWM Pins.

jurs


Also Status unverändert.


Merkwürdig.
Welche Arduino-Software Version verwendest Du?

In den Release Notes http://arduino.cc/en/Main/ReleaseNotes steht zur Version ARDUINO 1.0.2 ausdrücklich drin:
Fix for tone() on the Leonardo. (Shigeru Kanemoto)

Bist Du vielleicht noch auf einer älteren Arduino-Version?

Oder ist das ein Ausschnitt aus einem größeren Programm, dem der RAM-Speicher ausgegangen ist und das deshalb nicht mehr funktioniert?

dischneider

#5
Jun 16, 2013, 06:14 pm Last Edit: Jun 16, 2013, 06:18 pm by dischneider Reason: 1
@Serenifly:
Was ja passen würde, die Ausgabe von tone() funktioniert ja problemlos, nur die parallele Ansteuerung einer LED auf einem DigitalOut-PIN leider nicht.

Dirk

Wegen Überschneidung als Nachtrag @jurs:
Software ist 1.0.5
Ja, ist ein Ausschnitt aus einem größeren Sketch.
Aber es funktioniert eben auch im "kleinen", also minimierten Code nicht.
tone() tut wie soll, parallele Ansteuerung einer LED lässt diese nur kurz "aufblinken" und nicht die gewünschte Zeit anbleiben.

using arduino leonardo, arduino uno ...
--
tomorrow today will only be yesterday, so live your life today!

jurs


Aber es funktioniert eben auch im "kleinen", also minimierten Code nicht.
tone() tut wie soll, parallele Ansteuerung einer LED lässt diese nur kurz "aufblinken" und nicht die gewünschte Zeit anbleiben.


Und bei der LED ist auch nicht der Vorwiderstand komplett falsch berechnet, so dass sie beim Aufblinken mehr als 40mA Strom ziehen könnte und der Atmega wegen Überstrom an diesem Pin instabil arbeitet?

dischneider

Nein, der Vorwiderstand passt.
220 Ohm begrenzt den Strom auf max 27mA, Eigenschaften der LED vernachlässigt.
Ohne tone() tut sie auch wie gewünscht.
Hatte auch schon einen Schalttransistor testweise zwischengesetzt, keine Änderung.


using arduino leonardo, arduino uno ...
--
tomorrow today will only be yesterday, so live your life today!

erni-berni

Das liegt daran, dass die tone() Funktion im Hintergrund abläuft.
Du schaltest den Ton ein und sozusagen gleichzeitig die LED, der Ton ist 5s an und die delay Funktion läßt die LED nach 5s, dann gleichzeitig mit dem Ton ausgehen.
Gib mal statt delay(signalTime); delay(signalTime + 1000); ein und du wirst sehen, dass die LED 1s anbleibt.

Und das hat auch nichts mit dem Leonardo zu tun...

dischneider

Nein, passiert nicht.
LED blinkt kurz auf und ist wieder aus.

Und das was du beschreibst, mit den zeitgleich an und aus, ist je das, was ich eigentlich will ...

Danke für den Ansatz.
using arduino leonardo, arduino uno ...
--
tomorrow today will only be yesterday, so live your life today!

erni-berni

OK, jetzt verstehe ich ....
Also doch ein Leonardo Thema ? Auf dem Mega funktioniert's jedenfalls.

jurs

#11
Jun 16, 2013, 11:27 pm Last Edit: Jun 16, 2013, 11:54 pm by jurs Reason: 1

LED blinkt kurz auf und ist wieder aus.


Das ist ja echt zum Mäusemelken.

Passiert das denn nur, wenn die LED direkt nach dem tone-Befehl gesetzt wird?

Was passiert mit einem kleinen delay() nach dem Einschalten des Tons, z.B.: mit:
Code: [Select]

 tone(speakerPIN, 2000, signalTime);
 delay(10);
 digitalWrite(ledPIN, HIGH);
 delay(signalTime-10);
 digitalWrite(ledPIN, LOW);


oder wenn erst die LED gesetzt wird
Code: [Select]

  digitalWrite(ledPIN, HIGH);
  tone(speakerPIN, 2000, signalTime);
  delay(signalTime);
  digitalWrite(ledPIN, LOW);


dischneider

Da passiert ebenfalls das gleiche.
Das Problem scheint an der Timernutzung der tone()-Funktion zu liegen.
Mit

Code: [Select]

  digitalWrite(ledPIN, HIGH);
  for (int i = 0; i < signalTime * 2; i++) {
  digitalWrite(speakerPIN, HIGH);
  delayMicroseconds(250);
  digitalWrite(speakerPIN, LOW);
  delayMicroseconds(250);
  }
  digitalWrite(ledPIN, LOW);


funktioniert es.
Das ist zwar nicht die perfekte, aber immerhin eine funktionierende Lösung.
Also Tonausgabe selbst generiert ...

Danke für die Hilfe, bin gerne zum Testen bereit, wenn noch jemand eine perfekte Idee hat ...

Dirk
using arduino leonardo, arduino uno ...
--
tomorrow today will only be yesterday, so live your life today!

Go Up