Pages: [1]   Go Down
Author Topic: tone() und LED-Ausgabe parallel funktioniert nicht!?  (Read 675 times)
0 Members and 1 Guest are viewing this topic.
northern germany
Offline Offline
Jr. Member
**
Karma: 2
Posts: 94
Ausbildung: Funkmechaniker, Systemadministrator
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
  // 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:
  tone(speakerPIN, 2000);
  digitalWrite(ledPIN, HIGH);
  delay(signalTime);
  noTone(speakerPIN);
  digitalWrite(ledPIN, LOW);

wird es nicht anders.

Dirk
Logged

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

Germany S-H
Offline Offline
Faraday Member
**
Karma: 134
Posts: 2849
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

northern germany
Offline Offline
Jr. Member
**
Karma: 2
Posts: 94
Ausbildung: Funkmechaniker, Systemadministrator
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

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

Offline Offline
Faraday Member
**
Karma: 96
Posts: 3491
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Germany S-H
Offline Offline
Faraday Member
**
Karma: 134
Posts: 2849
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

northern germany
Offline Offline
Jr. Member
**
Karma: 2
Posts: 94
Ausbildung: Funkmechaniker, Systemadministrator
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

« Last Edit: June 16, 2013, 11:18:31 am by dischneider » Logged

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

Germany S-H
Offline Offline
Faraday Member
**
Karma: 134
Posts: 2849
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

northern germany
Offline Offline
Jr. Member
**
Karma: 2
Posts: 94
Ausbildung: Funkmechaniker, Systemadministrator
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.


Logged

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

Cologne
Offline Offline
Sr. Member
****
Karma: 11
Posts: 495
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

northern germany
Offline Offline
Jr. Member
**
Karma: 2
Posts: 94
Ausbildung: Funkmechaniker, Systemadministrator
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Cologne
Offline Offline
Sr. Member
****
Karma: 11
Posts: 495
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Germany S-H
Offline Offline
Faraday Member
**
Karma: 134
Posts: 2849
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
 tone(speakerPIN, 2000, signalTime);
  delay(10);
  digitalWrite(ledPIN, HIGH);
  delay(signalTime-10);
  digitalWrite(ledPIN, LOW);

oder wenn erst die LED gesetzt wird
Code:
  digitalWrite(ledPIN, HIGH);
  tone(speakerPIN, 2000, signalTime);
  delay(signalTime);
  digitalWrite(ledPIN, LOW);
« Last Edit: June 16, 2013, 04:54:59 pm by jurs » Logged

northern germany
Offline Offline
Jr. Member
**
Karma: 2
Posts: 94
Ausbildung: Funkmechaniker, Systemadministrator
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

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

Pages: [1]   Go Up
Jump to: