Forum: Mikrocontroller und Digitale Elektronik WTV020 Start - Stop - ohne AVR


von Bernd Z. (carlo1309)


Angehängte Dateien:

Lesenswert?

Hallo,
ich will einen Türgong mit den WTV Modul realisieren.
Leider habe ich überhaupt keinen Plan wie ich das mit einem AVR
hinbekomme.
Deshalb der diskrete Aufbau.
Der Wunsch war, das über die Start/Stop Taste die Melodie abgespielt
wird.
Gleichzeitig soll eine Led impulsartig blinken, die Werte gelten für die
cmos Variante des 555 (Hab kein Symbol für die cmos Variante.)
Um das zu steuern habe ich mir die Schaltung ausgedacht.
Soweit funktioniert das ganze, ich kann aber nur den Startimpuls für das
Soundmodul erzeugen, ich habe keine Idee woher ich ein 2. Impuls
herbekomme, am Ende des Sounds, bzw. hier - nach einer festen Zeit.
Der 4017 "verlängert" die Periodendauer auf 50sec (R+C Werte in der
Zeichnung stimmen nicht überein.)
Die Transistorstufe als Pegelwandler habe ich erstmal nur so
eingezeichnet, z.Z. ist ein Gatter vom 4093 dran.
Die Resettaste vom Modul will ich nicht bedienen, weil dann immer wieder
zum ersten Titel zurückgesprungen wird.
Der "Key A" wird später ein Optokoppler. Das Soundmodul ist nicht
eingezeichnet.
Mein Halbwissen reicht leider nicht mehr.

Vielen Dank, wenn sich jemand die Mühe macht.
Anbei die Schaltung

VG
carlo

von Harald (Gast)


Lesenswert?

> Leider habe ich überhaupt keinen Plan wie ich das mit einem AVR
> hinbekomme.

Hast du mal gesucht nach „Arduino wtv020 doorbell“. Da gibt es 
zahlreiche fertige Anleitungen, sogar Videos.

> Deshalb der diskrete Aufbau.
> über die Start/Stop Taste
> Gleichzeitig soll eine Led impulsartig blinken
> Ich habe keine Idee woher ich ein 2. Impuls herbekomme
> Der 4017 "verlängert" die Periodendauer

Du siehst, mit reinem diskreten Aufbau wird das kompliziert. Ich würde 
sogar behaupten, dass du dich besser etwas in Arduino einarbeitest (ist 
wirklich leicht), die Zeit wäre meiner Meinung nach besser investiert.

von Bernd Z. (carlo1309)


Lesenswert?

Du magst ja Recht haben, mich hätte es trotzdem interessiert,
na vielleicht kann ja noch jemand ein Idee einstellen.

Das Doorbell Prijekt habe ich auch gefunden und war überrascht, wie 
einfach es aufgebaut ist.

Deshalb:

Hab schonmal vor 3 Jahren mit AVR anfangen wollem. hatte mir bei Radig 
einen Programmer gekauft, das warst dann aber schon.

Seit ein paar Stunden versuche ich es nochmal...und komme mit der usb 
dll nicht weiter.

Gerät wird mittlerweile erkannt, aber trotzdem wird die dll nicht 
gefunden...
Werde mal einen neuen Thread aufmachen.

: Bearbeitet durch User
von Harald A. (embedded)


Lesenswert?

Bernd Z. schrieb:

> Hab schonmal vor 3 Jahren mit AVR anfangen wollem. hatte mir bei Radig
> einen Programmer gekauft, das warst dann aber schon.

Ich rede ja auch von Arduino. Ist zwar oft auch AVR, gegenüber der 
Direktprogrammierung aber doch noch deutlich einfacher. Für fast alles 
gibt es LIBs.
Als Beispiel(!) fallen mir die intelligenten LEDs wie WS2812 ein: Direkt 
in C erfordert das schon einiges an Erfahrung, per Arduino ist die erste 
Inbetriebnahme ein Zweizeiler bzw. das Abändern eines Beispiels, das bei 
der Lib immer dabei ist. Für WTV020 habe ich es nicht geprüft, aber auch 
da sollte es fertige LIBs geben.

Was meinst du mit usb dll? Einen Programmer brauchst du bei Arduino 
nicht, der ist quasi mit drin. Arduino installieren, USB anstöpseln, COM 
Port ermitteln und einstellen, Beispiel laden, los gehts.

Du hast anscheinend ja gute Kenntnisse in der Elektronik, daher wirst du 
Arduino recht schnell lieben lernen. Es ist selbst unter erfahrenen 
Programmierern oft in der Anwendung, weil man in Windeseile mal eben 
schnell Logic, SPI etc. realisieren kann.

: Bearbeitet durch User
von Harald (Gast)


Lesenswert?

Konkret spreche ich von einem Arduino Nano, den gibt es als Clone für 
ca. 1,50€ - allerdings mit Lieferzeit. Du bekommst auch per Prime einen 
für 5€, der ist dann übermorgen da, falls du in D wohnst.

Bei einem Clone kann es zwei Minimalhürden bei der Inbetriebnahme geben, 
die ich hier nenne:
1.
Statt des teuren FTDI USB-Serill Wandler ist meist ein CH340 verbaut, 
der kann das gleiche, benötigt aber einen anderen Treiber. Sehr leicht 
installierbar. Windows 10 kennt den schon so ohne Treiber-Download.

2.
Meist muss man in den Einstellungen „old bootloader“ wählen, das wars.

Mit einem Original-Arduino ist es tatsächlich Plug-and-Play, aber wie 
gesagt, es ist recht einfach. Wir werden Dir hier helfen.

von Bernd Z. (carlo1309)


Angehängte Dateien:

Lesenswert?

Klingt gut, also bischen was habe ich schon...

ISP Programmer von Radig...

UNO Board, ich nehme an das man den Programmieren kann, hat aber einen 
6-poligen ISP Anschluß, Programmer hat einen 10 poligen Anschluß...

Dann noch ein mit 28pol. Fassung, sicher gleiche Verwendung wie der UNO.
Muss noch der Chip drauf....hab ich noch nicht.
Fehlen auch noch paar Bauteile, auf der LP steht was von 1x 10kOhm, aber 
drin ist ein 1kOhm, hab ihn noch nicht verlötet. Welcher muss rein?

So wie ich das sehe, scheint der UNO vollkommen ausreichend für den 
Anfang.

von Bernd Z. (carlo1309)


Angehängte Dateien:

Lesenswert?

Klingt gut, also bischen was habe ich schon...

ISP Programmer von Radig...(3)

UNO Board, ich nehme an das man den Programmieren kann, hat aber einen 
6-poligen ISP Anschluß, Programmer hat einen 10 poligen Anschluß...(1)

Dann noch ein mit 28pol. Fassung, sicher gleiche Verwendung wie der UNO.
Muss noch der Chip drauf....hab ich noch nicht.
Fehlen auch noch paar Bauteile, auf der LP steht was von 1x 10kOhm, aber 
drin ist ein 1kOhm, hab ihn noch nicht verlötet. Welcher muss rein? (2)

So wie ich das sehe, scheint der UNO vollkommen ausreichend für den 
Anfang.

von Harald A. (embedded)


Lesenswert?

Irgendwie bist du noch völlig falsch unterwegs. Bei einem Arduino 
brauchst du keinen Programmer und keinen 28pol. Sockel. Der 6Pin ist nur 
für den Fall, dass man den Bootloader tauschen will. Das kommt aber 
normalerweise nie vor. Bei Arduino kannst du deinen Programmer 
vergessen, den brauchst du nicht. Auch nicht dessen Software oder 
Compiler.

Der UNO geht, allerdings ist der relativ groß und der bleibt in der 
Schaltung. Daher hatte ich einen Nano vorgeschlagen, der ist besser 
integrierbar und auch Steckbrett-fähig.

Also, aus dem Bild braucht du nur 1., alles Andere kann in den Schrank. 
Schau dir noch einmal Videos zum Thema „Arduino Erste Schritte“ an, dann 
dürfte vieles klarer werden, hier ein Mehrteiler in Deutsch:

https://youtu.be/0wAY3DYihyg

: Bearbeitet durch User
von Bernd Z. (carlo1309)


Lesenswert?

Ok, hab mir die ersten 4 Videos angesehen, verstehe jetzt was Du meinst.
Aber irgendwo kann man den Programmer doch verwenden, oder?

Bei dem WTV020 Modul habe ich nur für WTV020-SD16 Einträge gefunden,muss 
mal probieren ob das Modul einen Laut gibt. Meines ist ein WTV020M01 , 
soweit ich das richtig gefunden habe, liegt der Unterschied nur im 
Soundformat.

Wobei ich für meine Anwendung nur die Start Stop Taste brauche, Reset 
nur wenn sich das Modul aufhängt.

Außerdem noch Play - next was dann nach z.B. 5 Melodien wieder auf den 
Anfang springt.
Mal sehen ob ich es heute abend noch zusammenstecken kann.

: Bearbeitet durch User
von Bernd Z. (carlo1309)


Lesenswert?

Bin jetzt beim WTV020M1 Modul, hab "WTV020SD16P-master" in den Arduino 
eingebunden, von http://forum.arduino.cc/index.php/topic,117009.0.html
hab ich den code eingebunden
Ist für das SD16 Modul, hab ich aber nicht...

===================================
/*
Example: Control a WTV020-SD-16P module to play voices from an Arduino 
board.
Created by Diego J. Arevalo, August 6th, 2012.
Released into the public domain.
*/

#include <Wtv020sd16p.h>

int resetPin = 2;  // The pin number of the reset pin.
int clockPin = 3;  // The pin number of the clock pin.
int dataPin = 4;  // The pin number of the data pin.
int busyPin = 5;  // The pin number of the busy pin.

/*
Create an instance of the Wtv020sd16p class.
1st parameter: Reset pin number.
2nd parameter: Clock pin number.
3rd parameter: Data pin number.
4th parameter: Busy pin number.
*/
Wtv020sd16p wtv020sd16p(resetPin,clockPin,dataPin,busyPin);

void setup() {
 //Initializes the module.
 wtv020sd16p.reset();
}

void loop() {
 //Plays synchronously an audio file. Busy pin is used for this method.
 wtv020sd16p.playVoice(0);
 //Plays asynchronously an audio file.
 wtv020sd16p.asyncPlayVoice(1);
 //Plays audio file number 1 during 2 seconds.
 delay(5000);
 //Pauses audio file number 1 during 2 seconds.
 wtv020sd16p.pauseVoice();
 delay(5000);
 //Resumes audio file number 1 during 2 seconds.
 wtv020sd16p.pauseVoice();
 delay(5000);
 //Stops current audio file playing.
 wtv020sd16p.stopVoice();
 //Plays synchronously an audio file. Busy pin is used for this method.
 wtv020sd16p.asyncPlayVoice(2);
 delay(2000);
 //Mutes audio file number 2 during 2 seconds.
 wtv020sd16p.mute();
 delay(2000);
 //Unmutes audio file number 2 during 2 seconds.
 wtv020sd16p.unmute();
 delay(2000);
 //Stops current audio file playing.
 wtv020sd16p.stopVoice();
}
===============================
Hochladen kommt Fehlermeldung:

Arduino: 1.8.8 (Windows 10), Board: "Arduino/Genuino Uno"

WTV020sd16_erster:22:1: error: 'Wtv020sd16p' does not name a type

 Wtv020sd16p wtv020sd16p(resetPin,clockPin,dataPin,busyPin);

 ^

...\Arduino\WTV020sd16_erster\WTV020sd16_erster.ino: In function 'void 
setup()':

WTV020sd16_erster:26:2: error: 'wtv020sd16p' was not declared in this 
scope

  wtv020sd16p.reset();

  ^

...\Arduino\WTV020sd16_erster\WTV020sd16_erster.ino: In function 'void 
loop()':

WTV020sd16_erster:31:2: error: 'wtv020sd16p' was not declared in this 
scope

  wtv020sd16p.playVoice(0);

  ^

exit status 1
'Wtv020sd16p' does not name a type

: Bearbeitet durch User
von Bernd Z. (carlo1309)


Lesenswert?

Als absoluter Neuling will ich ein WTV020M01 zum laufen bringen.
Einzeln aufgebaut funktioniert alles. Jetzt soll der Arduino das Modul 
steuern.
Genaugenommen brauche ich nur die Play/Stop/Next/Reset Funktion für 
einen Türgong.
Die lib ist im Programm eingebunden, ein Testsketch habe ich 
hochgeladen, das kommt allerdings eine fehlermeldung.
Hab mit 2 Varianten probiert, beide haben unterschiedliche 
Fehlermeldungen.

Hier die Erste Variante: (Auszug)
=================
/*
Example: Control a WTV020-SD-16P module to play voices from an Arduino 
board.
Created by Diego J. Arevalo, August 6th, 2012.
Released into the public domain.
*/
#include <WTV020SD16P.h>

int resetPin = 2;  // The pin number of the reset pin.
int clockPin = 3;  // The pin number of the clock pin.
int dataPin = 4;  // The pin number of the data pin.
int busyPin = 5;  // The pin number of the busy pin.

Wtv020sd16p wtv020sd16p(resetPin,clockPin,dataPin,busyPin);
.
.
.
=================
Die letzte Zeile wird angemeckert: 'Wtv020sd16p' does not name a type


Zweite Variante:
=================
#include <WTV020SD16P.h>

int clockPin = 3;  // The pin number of the clock pin.
int dataPin = 4;  // The pin number of the data pin.
int busyPin = 5;  // The pin number of the busy pin.

/*
Create an instance of the Wtv020sd16p class.
 1nd parameter: Clock pin number.
 2rd parameter: Data pin number.
 3th parameter: Busy pin number.
 */

WTV020SD16P wtv020sd16p(clockPin,dataPin,busyPin);

void setup()
{
  wtv020sd16p.setVolume(7);
}

Fehlermeldung:
Arduino: 1.8.8 (Windows 10), Board: "Arduino/Genuino Uno"

...\ccdVKZYW.ltrans0.ltrans.o: In function `main':

...\Arduino\hardware\arduino\avr\cores\arduino/main.cpp:46: undefined 
reference to `loop'

collect2.exe: error: ld returned 1 exit status

exit status 1
Fehler beim Kompilieren für das Board Arduino/Genuino Uno.

Im Arduino Forum war beschrieben,das die 2. Variante gelaufen ist.
https://forum.arduino.cc/index.php?topic=468617.0

Deshalb hab ich das kopiert...
Verdrahtung nochmal geprüft, sollte stimmen. Zwar verstehe ich nicht 
warum die Start/Stop Taste nicht belegt wird...

Vielleicht ist es auch ein ganz einfacher fehler das ich beim Einbinden 
twas falsch gemacht, wie schon gesagt Neuling, bis auf die 4 Grundkurse 
hat ich noch nichts mit Arduino gemacht.

von Harald A. (embedded)


Lesenswert?

Du hast vermutlich die verlinkte Lib nicht eingebunden. Das Verzeichnis 
aus dem ZIP muss in den Installationsordner Arduino, Unterordner 
Libraries. Dann Arduino neu starten und du findest das Beispiel schon 
direkt unter Datei/Beispiele.

>Aber irgendwo kann man den Programmer doch verwenden, oder?

Ja, aber nicht für Arduino.

von Harald A. (embedded)


Lesenswert?

Warum fängst Du für jedes Unterproblem immer einen neuen Thread an?

Hier gelöst:
Beitrag "Re: WTV020 Start - Stop - ohne AVR"

von Bernd Z. (carlo1309)


Angehängte Dateien:

Lesenswert?

Doch, ist eingetragen bei den "Beigetragenen Bibliotheken"

Wenn ich aber in den Biblotheksverwalter gehe finde ich keinen Eintrag 
der mit "WTV" beginnt

Hab noch einen neuen Thread aufgemacht zu dem Thema oder ist das nicht 
so sinnvoll?

von Bernd Z. (carlo1309)


Lesenswert?

...weil es ja jetzt nicht mehr um "ohne AVR" geht.
Du meinst, ich sollte im alten weiterschreiben?
Gut dann lösche ich das wieder...

Geht nix löschen, hab wohl keine Berechtigung

: Bearbeitet durch User
von Harald (Gast)


Lesenswert?

Bernd Z. schrieb:
> Doch, ist eingetragen bei den "Beigetragenen Bibliotheken"

Hast du unter Beispiele einen Eintrag mit WTV...? Falls nicht ist die 
Bibliothek nicht richtig eingebunden. Ich habe das gestern auch kurz 
gemacht, allerdings durch direktes Reinkopieren ins das Verzeichnis. Hat 
auf Anhieb compiliert.

von Bernd Z. (carlo1309)


Angehängte Dateien:

Lesenswert?

Nein, in den Beispielen sehe ich es nicht.
Hatte in die Libraries auch direkt kopiert.
Im Ordner Examples sind aber nur fertige *.ino drin...

In den Bibliotheken sind die Examples mit drin, in der von mir benutzten 
sind keine drin. Muss mir vielleicht eine andere Bibliothek laden.

Hab jetzt mal mit einem DHT probiert und dabei ist mir das aufgefallen.
Hab die DHT kopiert und auch in den beispielen ist jetzt ein DHT 
Eintrag.
Mit dem DHT klappe es, also liegt es am fehlenden Beispiel in meiner Lib
Bin begeistert...

Welche WTV020 Lib hast Du benutzt?

: Bearbeitet durch User
von Bernd Z. (carlo1309)


Angehängte Dateien:

Lesenswert?

Beim hochladen der WTV Beispieldatei kommt wieder die gleiche 
Fehlermeldung
"exit status 1
Wtv020sd16p.h: No such file or directory"

Benutze ich den Sketch kommt die Fehlermeldung beim Hochladen nicht,
dort ist der Eintrag

"#include <WTV020SD16P.h>"

groß geschrieben, in der Beispieldatei nicht.

Ok, sketch seperat erstellt und 8 ad4 Titel drauf, dabei den vormals 20 
Titel Eintrag auf 8 reduziert,
==============
Serial.println("Playing from 0 to 8...");

    // Play the AD4-files from "0000.AD4" to "0020.AD4".
    // All of my files have/had a duration below 5 seconds.
    // ATTENTION: Files have to start with number "0000" and
    // must be continuously!
    for(int i = 0; i < 9; i++)
==============
ich höre aber nichts :-(
ohne den Arduino funktioniert es mit dem abspielen...
Wenn ich den Reset Pin am Modul abklemme funktioniert per Hand

Ich habe laut einem Schaltbild:
Modul Pin - Arduino
    1         4
    7         5
   10         6
   15         7

Offenbar muss ich anderes anschließen:
Connections:
Module pin 1 --> arduino pin 2 (reset)
module pin 7 --> arduino pin 3 (clock)
module pin 10 --> arduino pin 4 (data)
module pin 15 --> arduino pin 5 (busy)
==============

Sound geht jetzt, springt nn zum nächsten Titel...

: Bearbeitet durch User
von Bernd Z. (carlo1309)


Angehängte Dateien:

Lesenswert?

Nun muss nur noch ein Taster das ganze auslösen und zusätzlich ein 
Ausgang für den LED Blitzer :-(

von Ingo (Gast)


Lesenswert?

Die Library geht von einem wtv020 Modul aus, dass für "two line serial 
mode" konfiguriert mode, also auf Befehle von einem Steuergerät wie 
deinem arduino wartet.

Mit großer Wahrscheinlichkeit jedoch hast du ein Modul erwischt, dass im 
"mp3 player mode" konfiguriert wurde. Dann sind Eingänge wie clock oder 
data anders belegt (z.b. ändern Sie die Lautstärke, wenn du dort einen 
Taster anschließt).

Das hat zwar alles überhaupt nichts mit dem Problem zu tun, dass die 
Bibliothek noch nicht eingebunden wird. Wenn du dies jedoch bisher nicht 
zweifelsfrei abgeklärt hast, würde ich dir empfehlen zuerst den Modus 
deines Moduls herauszufinden, bevor du weiter mit einer Library kämpfst, 
die später gar nicht anwendbar ist. Du findest alles im entsprechenden 
Datenblatt (letzte Seiten mit den schaltungsbeispielen für die 
unterschiedlichen Modi).

Ingo

von carlo1309 (Gast)


Lesenswert?

Das mit der lib konnte ich klären, ich hatte es weiter oben beschrieben.
Am Ende lag es auch noch an den falschen Verbindungen zum Arduino...

von Harald (Gast)


Lesenswert?

Na also, geht doch voran! Was ich dir noch wärmstens empfehlen kann, 
wäre ein Logic Analyzer. Die sog. Saleae Clones gibt es für <10€, mit 
der freien Software Sigrok kann man sehr einfach Signalverläufe von bis 
zu 8 Signalen verfolgen, auch über längere Zeiträume. Das hilft bei der 
Fehlersuche ungemein, nicht nur für dieses Projekt. Dabei können auch 
Bussysteme wie Seriell, SPI, I2C usw. decodiert werden und die Inhalte 
in „Klartext“ ausgegeben werden.

von Bernd Z. (carlo1309)


Lesenswert?

Ja stimmt,...die Clone vom Analyser funktionieren auch ganz gut?
Würde bei Ali mal schauen.

Für die Schaltung muss nun noch der Taster rein, und die Schleife für 
das Abspielen umgestrickt werden, damit auch nur ein Titel spielt und 
beim nächsten Drücken der Taste der nächste.
Die LED die dann "blitzen" soll mass ebenfalls noch rein, aber sie soll 
nur 30-60 sec lang blitzen. Geht diese Länge überhaupt zu realisieren?

von Bernd Z. (carlo1309)


Lesenswert?

Die vorgestellten Beispiele finde ich für meinen Einsatz viel zu 
kompliziert.
Warum kann ich nicht einfach sagen:

wenn Taste start gedrückt spiele song 1 (signal wird an Play Pin9 
geschickt
nach 60 sec nochmal signal in Pin9, damit der Song wieder anhält, falls 
er zu lang ist
dann signal an next, damit der nächste Titel aufgerufen wird

Das ganze dann in einer Schleife von 10 Titeln, am ende nochmal ein 
Signal an reset und fertig das ganze

Hab hier einen code mit Taster offenbar: (hier aus dem Forum)
==================
#include <WTV020SD16P.h>

const int resetPin= 2;
const int clockPin= 3;
const int dataPin= 4;
const int busyPin= 5;
int buttonPin = 12;
int button= 0;

Wtv020sd16p wtv020sd16p (resetPin, clockPin, dataPin, busyPin);

 void setup()
 {
wtv020sd16p.reset ();
 pinMode (buttonPin, INPUT);
 }

 void loop()
 {
 button = digitalRead (buttonPin);
 if (button == HIGH)
 {
wtv020sd16p.playVoice (4[/code]);
 delay(2000);
 }
 }]
===================

Die 4.Zeile von unten: wtv020sd16p.playVoice (4[/code]);

wird mit Fehler angemeckert:
expected primary-expression before '/' token

Was fehlt indem sketch

: Bearbeitet durch User
von Bernd Z. (carlo1309)


Lesenswert?

Hab die Fehler zwar beseitigen können, der sketch scheint aber nicht 
geeignet zu sein. Ob es jetzt das macht wofür es gedacht war kann ich 
nicht sagen.

von Bernd Z. (carlo1309)


Lesenswert?

nach ewigen strg-c und strg-v komme ich nicht weiter.
Wenn ich das Modul nur mit den "play" und "next" Tasten steuern will 
wird nach "next" gleich der nächste Titel abgespielt.
2x drücken der play taste hält den Titel an, aber wenn ich jetzt "next" 
auslöse geht der nächste ong weiter.

Mit einer loop funktioniert es zwar, aber da werden ja alle Titel 
hintereinander abgespielt.
Ich weis nicht wie ich die Schleife im sketch und mit einem Taster 
unterbrechen soll, auch nicht wie ich das ganze per Taste starte...bin 
so langsam am Ende...
Hier mal meine Zusammenstückelungen
==========================
// playPin => pin  9 WTV
// nextPin => pin 13 WTV
// prevPin => pin 12 WTV
// PIN_WTV_RESET => pin  1 WTV
// PIN_WTV_DATA  => pin  6 WTV
// PIN_WTV_BUSY  => pin 15 WTV

#include <WTV020SD16P.h>
#define DELAY_RESET 1000

// nur reset und busy verwendet, mass aber alle deklarieren

#define PIN_WTV_RESET 2
#define PIN_WTV_CLOCK 3
#define PIN_WTV_DATA  4
#define PIN_WTV_BUSY  5


// Create an object of the "driver".
Wtv020sd16p wtv020sd16p(PIN_WTV_RESET, PIN_WTV_CLOCK, PIN_WTV_DATA, 
PIN_WTV_BUSY);

    int playPin = 12;
    int nextPin = 13;

void setup() {
    pinMode(playPin, OUTPUT);
    pinMode(nextPin, OUTPUT);
    Serial.begin(9600);
    wtv020sd16p.reset();
    }

void loop()
    {
//    for(int i = 0; i < 9; i++)
    {
    digitalWrite(playPin, HIGH);
    delay(500);
//  digitalWrite(nextPin, HIGH);
    delay(500);
    wtv020sd16p.playVoice(0);
//  digitalWrite(playPin, LOW);
    wtv020sd16p.stopVoice();
    delay(15000);
    digitalWrite(playPin, LOW);
    delay(500);
    wtv020sd16p.playVoice(1);
//  digitalWrite(playPin, LOW);
    wtv020sd16p.stopVoice();
    delay(15000);
    wtv020sd16p.playVoice(4);
//  digitalWrite(playPin, LOW);
    wtv020sd16p.stopVoice();
    delay(15000);

//  wtv020sd16p.stopVoice();
  digitalWrite(nextPin, LOW);
  delay(100);
//  wtv020sd16p.stopVoice();

    }
}

=============
ich rufe Titel 0, 1 und 4 auf

: Bearbeitet durch User
von Harald (Gast)


Lesenswert?

Das Problem ist hier ein wenig, dass ein paar Details fehlen:

- Welches Modul hast du genau? Es gibt da ja nach Aussage verschiedene 
Ausführungen. Wie funktioniert dein Modul. Was muss man ansteuern?

- Man müsste aus deinem Schaltplan und dem Text Reverse Engineering 
machen, um herauszufinden was du genau machen willst. Das wird kaum 
jemand machen. Dir ist klar, was du willst, dem Leser nicht.

- Wenn du mehrere Vorgänge parallel hast (Taster abfragen, Signal State 
Machine und LED blinken) bietet sich das in einzelnen Unterfunktionen 
an, die jeweils eine eigene State Machine abbilden. Das geht mit Hilfe 
von switch/case Stukturen. Klingt kompliziert, ist es aber nicht. Jedes 
Unterprogramm wird so geschrieben, dass es Abfragen macht um ggf. in 
einem neuen State zu springen. Jedes Unterprogramm wird schnellstmöglich 
wieder verlassen, damit alle anderen Unterprogramme im gleichen Zeittakt 
aufgerufen werden können.

Also du kommst (hier) am besten weiter, wenn du etwas mehr beschreibst. 
Vielleicht kannst du eine Signalabfolge darstellen/skizzieren.

von Bernd Z. (carlo1309)



Lesenswert?

Beschreibung

Eine Klingeltaste ist die Gesamtsteuerung

Taste gedrückt = kurzer Impuls Start 1.song
 (das WTV Modul braucht ein LOW zum auslösen der jeweiligen Funktionen)

und
LED = High, blinkend
Länge des Song: delay 30sec
nach Ablauf springt zum nächsten Titel

und wartet auf erneute Eingabe.

Taste gedrückt = kurzer Impuls Start 2.song
und
LED = High, blinkend
Länge des Song: delay 30sec
nach Ablauf springt zum nächsten Titel
und wartet auf erneute Eingabe.

↑ Das hier oben soll die loop sein
=================
Bei der direkten Steuerung des Modul wird beim drücken der „next“ Taste 
sofort der nächste song abgespielt, den reset Eingang (WTV020) kann ich 
hier nicht verwenden, weil dann immer nur der 1.song abgespielt wird.
Die beiden Befehle:
wtv020sd16p.playVoice(1);
wtv020sd16p.stopVoice();

könnte ich verwenden, es gibt keinen „next“ Befehl für das Modul

In der Datei WTV020SD16P.cpp aus dem lib Verzeichnis ist noch folgendes 
beschrieben/definiert

void Wtv020sd16p::playVoice(int voiceNumber){
sendCommand(voiceNumber);

Also könnte man durch Aufruf der voiceNumber den nächsten Titel aufrufen 
aber erst abspielen wenn Taste nochmal gedrückt wurde.
Insgesamt wollte ich 10 Titel verwenden, danach wird wieder der 1.song 
abgespielt

Ich verwende das WTV020 M01 – spielt *.ad4 das WTV020sd16 Modul spielt 
*.mp3. Das Dateiformat der songs muss 0000.ad4 0001.ad4 usw. sein.
Der Rest ist gleich.
Ich weis nicht wie ich es beschreiben soll: entweder ich steuere das 
Modul rein Hardware technisch, also so, wie es meine Schaltung ganz am 
Anfang machen sollte, dabei werden die Arduino Pin als Ausgänge 
definiert und schalten dann das Modul oder reine Softwaresteuerung durch 
Arduino.
Aber das Problem ist wie schon benannt, das Betätigen der Next Taste am 
WTV spielt den neuen Titel sofort ab., deswegen scheint die Steuerung 
über die 4 Anschlüsse 1,7,10,15 die bessere Variante
Einziger Input ist ein Taster, und zusatzlicher output ist eine LED

Im Gesamtschaltbild ist ein SD20 (20Pin) Modul, da sind die Anschlüsse 
anders. Richtiger Anschlüss siehe Anhang

: Bearbeitet durch User
von Harald (Gast)


Lesenswert?

Vorbildich! Damit kann man arbeiten. Ich werde versuchen, heute Abend 
mal einen ersten Vorschlag einzustellen.

von Harald (Gast)


Lesenswert?

Doch nicht ganz klar, dein Anschlussbild "falsch_hier_richtig" stiftet 
Verwirrung.

Schließe bitte die Pins wie folgt an
WTV Pin  1 an Arduino Pin 4
WTV Pin  7 an Arduino Pin 5
WTV Pin 10 an Arduino Pin 6
WTV Pin 15 an Arduino Pin 7
Sonst keine weiteren Digitalsignale, nur noch Power und GND

Das Programm wie folgt testen, damit sollte das Programm je 5sec die 
Sounds in der Reihenfolge 1, 4, 2, 3 spielen, ohne Wenn und Aber.
Geht das soweit? Dann machen wir weiter.

Deine obigen Ansätze sehen so aus, als ob du serielle Modulansteuerung 
per SPI und Tastenansteuerung miteinander vermischen willst. Das geht 
natürlich nicht. Der SPI-Treiber auf dem Arduino soll ja dafür sorgen, 
dass du jeden Sound gezielt starten und stoppen kannst. Also nicht mehr 
mit NEXT oder START rumspielen...


#include <WTV020SD16P.h>

#define PIN_WTV_RESET 4
#define PIN_WTV_CLOCK 5
#define PIN_WTV_DATA  6
#define PIN_WTV_BUSY  7


// Create an object of the "driver".
Wtv020sd16p wtv020sd16p(PIN_WTV_RESET, PIN_WTV_CLOCK, PIN_WTV_DATA,
PIN_WTV_BUSY);

void setup()
{
  wtv020sd16p.reset();
}

void loop()
{
  wtv020sd16p.playVoice(1);
  delay(5000);
  wtv020sd16p.playVoice(4);
  delay(5000);
  wtv020sd16p.playVoice(2);
  delay(5000);
  wtv020sd16p.playVoice(3);
  delay(5000);
}

von Harald (Gast)


Lesenswert?

Ändere die Loop-Funktion bitte wie folgt, da das obige Kommando auf 
Abschluss der Ausgabe wartet. Wir wollen nur starten.

void loop()
{
  wtv020sd16p.asyncPlayVoice(1);
  delay(5000);
  wtv020sd16p.asyncPlayVoice(4);
  delay(5000);
  wtv020sd16p.asyncPlayVoice(2);
  delay(5000);
  wtv020sd16p.asyncPlayVoice(3);
  delay(5000);
  wtv020sd16p.stopVoice();
  delay(5000);
}

Jetzt sollte es so sein, dass jeder Sound exakt 5sec gespielt wird, 
Inder Reihenfolge 1, 4, 2, 3. Dann sollte 5sec Pause folgen und dann 
sollte das Spiel von vorne losgehen.

Prüfst Du das mal?

von Bernd Z. (carlo1309)


Lesenswert?

Ja, hab ich diesmal gleich richtig angeschlossen,

Im 1. Beispiel werden die Titel jeweils bis zum Ende gespielt,
im letzten Beispiel jeweils für 5sec, wie Du beschrieben hast.
und von vorn wieder los...

von Harald (Gast)


Lesenswert?

Sehr gut, morgen geht es weiter!

von Bernd Z. (carlo1309)


Lesenswert?

Ich probiere mich seit paar Tagen an den sketches,
So richtig steige ich nicht durch...

Eine LED soll 1 sec blinken für insgesamt 6sec, nachdem ein Taster kurz 
gedrückt wurde. Wo muss ich die 1 sec blinken einbauen?

=====================
int LED=6;
int taster=7;
int tasterstatus=0;

void setup()
{
pinMode(LED, OUTPUT); //Der Pin mit der LED (Pin 6) ist jetzt ein 
Ausgang.
pinMode(taster, INPUT); //Pin mit dem Taster (Pin 7) ist jetzt ein 
Eingang.
// INPUT_PULLUP ersetzt den Widerstand
}
void loop()
{
tasterstatus=digitalRead(taster);  //Hier wird der Pin7 ausgelesen

if (tasterstatus == LOW)  // Wenn der taster gedrückt ist (Das
//Spannungssignal ist low)..
{   //Programmabschnitt des IF-Befehls öffnen.
digitalWrite(LED, HIGH);
delay(6000);
digitalWrite(LED, LOW);
}
else
{
digitalWrite(LED, LOW);   // ...soll die LED aus sein.
}
}

von Bernd Z. (carlo1309)


Angehängte Dateien:

Lesenswert?

Der Logikanylyser ist auch angekommen.

Bei Verwendung des sketchs:

//////////////////////////////////////////////////////
//
// LED per PWM nach oben und unten dimmen
//
//////////////////////////////////////////////////////

int REDLED =     9;    // hier befindet sich eine LED
int brightness = 0;    // mit dieser Helligkeit
int fadeAmount = 5;    // Grad der Helligkeitsänderung


void setup() {
  pinMode(REDLED, OUTPUT);
}

void loop() {
  // Helligkeit für LED setzen:
  analogWrite(REDLED, brightness);

  // heller oder dunkler je nach Vorzeichen von fadeAmount:
  brightness = brightness + fadeAmount;

  // Am Rand des Helligkeitsspektrums kehren
  // wir die Veränderung der Helligkeit um
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;
  }
  delay(20); // etwas Pause lassen
}
===========
bring er einen framing error, anylysiert wird pin9 mit 4MS/s andere 
Einstellung meckert "Saleae Logic" an.
Die Analyzers Einstellung ist: Async Serial

von Harald A. (embedded)


Lesenswert?

Hier ein Programmvorschlag für dein eigentliches Problem:

Es ist nicht nach allen Regeln der Kunst, sollte aber einen Eindruck 
vermitteln, wie man parallele Tätigkeiten in ein Programmablauf bekommt.

#include <Wtv020sd16p.h>

#define LED_OUT 12
#define TASTER  13

#define TIME_LED_FLASH 20    // Blinkgeschwindigkeit in 10ms Schritten
#define TIME_SOUND     3000  // Soundzeit in 10ms Schritten


int resetPin = 4;  // The pin number of the reset pin.
int clockPin = 5;  // The pin number of the clock pin.
int dataPin  = 6;  // The pin number of the data pin.
int busyPin  = 7;  // The pin number of the busy pin.

Wtv020sd16p wtv020sd16p(resetPin,clockPin,dataPin,busyPin);

// 
------------------------------------------------------------------------ 
----------------------------------

void setup()
{
  pinMode (LED_OUT, OUTPUT);
  pinMode (TASTER,  INPUT_PULLUP);    // Pullup für Optokoppler/Taster 
Eingang aktivieren
  wtv020sd16p.reset();
}


// 
------------------------------------------------------------------------ 
----------------------------------
// "led_flasher" wird im 10ms Takt aufgerufen, per "mode" lässt sich 
Zustand 0:AUS oder 1:BLINKEN festlegen
void led_flasher (uint8_t mode)
{
  static uint8_t counter, state;

  if (mode == 0)
  {
    state = 0;
    counter = 0;                              // Zaehler zurücksetzen
    digitalWrite(LED_OUT, 0);                 // LED aus
  }
  else
  {
    counter++;
    if (counter >= TIME_LED_FLASH)             // Flashzeit hochzaehlen
    {
      counter = 0;
      state ^= 1;                              // nach abgelaufener Zeit 
Zähler rücksetzen und Ausgang toggle
      digitalWrite(LED_OUT, state);
    }
  }
}

// 
------------------------------------------------------------------------ 
----------------------------------
// "handler" wird alle 10ms aufgerufen, hier wird die Taste ausgewertet, 
Sounds gestartet und die LED bedient

void handler (void)
{
  static uint8_t state;
  static uint16_t counter;

  switch (state)
  {
    case 0 :                                 // Warten auf Taster
    default :
    {
      counter = 0;
      if (digitalRead(TASTER) == 0)
      {
        wtv020sd16p.asyncPlayVoice(1);       // Wenn Tastendruck erkannt 
Sound 1 starten und nächster Schritt
        state = 1;
      }
    }
    break;

    case 1 :                                 // Sound spielt, LED 
blinken lassen
    {
      led_flasher(1);                        // LED blinkt
      counter++;
      if (counter >= TIME_SOUND)             // Soundzeit abgelaufen
      {
        wtv020sd16p.stopVoice();             // Soundausgabe stoppen
        led_flasher(0);                      // LED aus
        state++;                             // nächster Step
      }
    }
    break;

    case 2 :
    {
      counter = 0;
      if (digitalRead(TASTER) == 0)           // wieder warten auf 
Tastendruck
      {
        wtv020sd16p.asyncPlayVoice(2);        // Sound 2 starten
        state++;
      }
    }
    break;

    case 3 :
    {
      led_flasher(1);                         // wieder LED blinken 
lassen
      counter++;
      if (counter >= TIME_SOUND)
      {
        wtv020sd16p.stopVoice();               // nach Zeit Sound stop
        led_flasher(0);
        state = 0;                             // wieder zu Schritt 0
      }
    }
    break;
  }
}


// 
------------------------------------------------------------------------ 
----------------------------------

void loop()
{
  static uint32_t timer_compare;

  if (millis() >= (timer_compare+10))    // 10ms vergangen?
  {
    timer_compare = millis();            // neuen Zeitpunkt merken
    handler();                           // handler() wird alle 10ms 1x 
aufgerufen
  }
}

von Harald A. (embedded)


Lesenswert?

Bzgl. des Logic-Analyzers. Du stellst einen Decoder "Async" für Channel 
0 ein, das bedeutet, man möchte eine serielle UART-Schnittstelle an 
Channel 0 decodieren. Darum geht es in diesem Fall aber nicht. Wenn Du 
nur reine Digitalsignale anaylsieren willst brauchst du keinen Decoder.

In diesem Projekt könntest Du schauen, wie die Befehle per SPI an den 
WTV übertragen werden. Zu diesem Zweck brauchst Du hier zwei Kanäle, CLK 
an Pin 7 und DATA an Pin 10. Der zuständige Decoder muss dann auf SPI 
eingestellt werden.
Beschäftige dich etwas damit und schaue vielleicht ein paar Videos oder 
sonstige Tutorials, dann bekommst du schnell mehr Klarheit.

: Bearbeitet durch User
von Bernd Z. (carlo1309)


Angehängte Dateien:

Lesenswert?

Das funktioniert perfekt, danke.
Wie hätte ich darauf kommen sollen?

von Bernd Z. (carlo1309)


Lesenswert?

warum ist uint8_t und uint16_t benutzt?
Hätte für LED und Taste uint8_t gereicht oder hat das einen anderen 
Hintergrund?

von Harald (Gast)


Lesenswert?

Bernd Z. schrieb:
> Das funktioniert perfekt, danke.
Gern geschehen.

> Wie hätte ich darauf kommen sollen?
Ohne Programmiererfahrung schwierig. Aber vielleicht bist du jetzt ja 
angefixt und machst einfach noch mehr mit Arduino und Co.
Starte mit den einfachen Sachen und lerne dabei, Schritt für Schritt

Bernd Z. schrieb:
> warum ist uint8_t und uint16_t benutzt?
Man soll möglichst immer die native Datenbreite des Prozessors nehmen, 
die kann er am besten verarbeiten. „state“ kann nur maximal 3 annehmen, 
da reicht die native Datenbreite des AVRs mit 8bit vollkommen. Für 
„counter“ kann der Wert bis zu 3000 annehmen, da reicht 8bit nicht. Also 
nimmt man 16bit.
Bei einem ARM Prozessor mit 32bit kann man in aller Ruhe alles mit 32bit 
machen, der Prozessor mag das lieber als 8bit irgendwo herauszulösen. 
Mit 32bit stößt man seltener an Zahlengrenzen. 32bit würden hingegen 
einen AVR schon mehr beschäftigen. Schöner Leistungskiller für beide 
Prozessoren sind Fließkommazahlen, wenn die CPU nicht eine extra Einheit 
dafür hat.

In dieser Anwendung ist das aber alles total egal, auch der AVR 
langweilt, sich hier zu ca. 99%.

von Harald (Gast)


Lesenswert?

Übrigens sieht dein neues Bild vom Logic Analyzer noch nicht richtig 
aus. Ich würde erwarten, dass man bei CLOCK die 16(?) Bits des 
Steuerwortes sieht, an DATA die zugehörigen Daten.

CLOCK ist an Pin 7 des WTV, DATA an Pin 10.

von Harald (Gast)


Lesenswert?

Bernd Z. schrieb:
> Wie hätte ich darauf kommen sollen?

Bin den Thread gerade nochmal durchgegangen, ich war bei dem Vorschlag 
der Verwendung eines Arduinos etwas zu optimistisch.
Das Starten und Stoppen von Sounds ist banal einfach und wäre wirklich 
nur ein Wenigzeiler geworden. Etwas kompliziert wurde es durch die 
Forderung einer parallel blinkenden LED. Wenn ich drüber nachdenke wäre 
es vielleicht im ersten Ansatz noch einfacher...

von Harald (Gast)


Lesenswert?

Der folgende Ansatz bringt das gleiche Ergebnis und ist vielleicht für 
den Anfänger leichter zu verstehen. Dafür bietet es aber kaum 
Möglichkeiten für weitere parallele Aktionen. Außerdem weißt Du jetzt 
schon, wie eine state machine funktioniert.

#include <Wtv020sd16p.h>

#define LED_OUT 12
#define TASTER  13

#define TIME_LED_FLASH 20    // Blinkgeschwindigkeit in 10ms Schritten
#define TIME_SOUND     3000  // Soundzeit in 10ms Schritten


int resetPin = 4;  // The pin number of the reset pin.
int clockPin = 5;  // The pin number of the clock pin.
int dataPin  = 6;  // The pin number of the data pin.
int busyPin  = 7;  // The pin number of the busy pin.

Wtv020sd16p wtv020sd16p(resetPin,clockPin,dataPin,busyPin);

// 
------------------------------------------------------------------------ 
----------------------------------

void setup()
{
  pinMode (LED_OUT, OUTPUT);
  pinMode (TASTER,  INPUT_PULLUP);    // Pullup für Optokoppler/Taster 
Eingang aktivieren
  wtv020sd16p.reset();
}


void loop()
{
  uint8_t x, y;

  for (x=1; x<=2; x++)
  {
    while (digitalRead(TASTER));                          // Warten auf 
Taster=0
    wtv020sd16p.asyncPlayVoice(x);                        // Sound x 
starten
    for (y=0; y<(TIME_SOUND/TIME_LED_FLASH); y++)         // Schleife 
zum LED blinken
    {
       digitalWrite(LED_OUT, !digitalRead(LED_OUT));      // alle 
"TIME_LED_FLASH" ms den Ausgang toggeln
       delay(TIME_LED_FLASH);
    }
    wtv020sd16p.stopVoice();                              // Ausgabe 
beenden
    digitalWrite(LED_OUT, 0);                             // LED 
loeschen
  }
}

von Bernd Z. (carlo1309)


Angehängte Dateien:

Lesenswert?

Harald schrieb:
> Übrigens sieht dein neues Bild vom Logic Analyzer noch nicht richtig
> aus. Ich würde erwarten, dass man bei CLOCK die 16(?) Bits des
> Steuerwortes sieht, an DATA die zugehörigen Daten.

Ja, hast Recht, vielleicht habe ich auch nicht richtig gezoomt...
und nur den "blauen" Teil gesehen.

: Bearbeitet durch User
von Bernd Z. (carlo1309)


Lesenswert?

Harald schrieb:
> Der folgende Ansatz bringt das gleiche Ergebnis und ist vielleicht für
> den Anfänger leichter zu verstehen.

Bei "uint" hatte ich nicht verstanden, warum 8bit nicht reichen, aber 
jetzt verstanden.

Ja, ein bischen einfacher schon.
▲ Funktioniert genauso..... für mich einfacher die Anzahl der Titel zu 
erhöhen :-)

Bei der ersteren Variante suchte ich vergeblich nach einer Möglichkeit 
das Tastverhältnis der LED zu ändern. "state ^= 1;" ?
Ich nehme mal an Uno kennt Standard=50% deshalb fehlt das, richtig?
Im 2. zwar gefunden "digitalWrite(LED_OUT, !digitalRead(LED_OUT)" ist 
auch die 50% Einstellung : out=1 out=0 - oder?

von Bernd Z. (carlo1309)


Lesenswert?

"if....state" verstehe ich so, das ich z.B. 1x klick Taste 1.LED an, 2x 
klick 2.LED an, also ein CD4017.

von Bernd Z. (carlo1309)


Lesenswert?

Noch eine letzte Frage:
(TIME_SOUND/TIME_LED_FLASH) ist tatsächlich eine Division?
Die Variablen zu nutzen, ist natürlich viel intellgenter, als eine Zahl 
einzutragen.

von Bernd Z. (carlo1309)


Lesenswert?

Bernd Z. schrieb:
> "if....state" verstehe ich so, das ich z.B. 1x klick Taste 1.LED
> an, 2x
> klick 2.LED an, also ein CD4017.

Nur ist die Variable dann das PIN am Uno :-(
Da könnte ich ein Schieberegister nehmen....dann bleibt es seriell

: Bearbeitet durch User
von Harald (Gast)


Lesenswert?

Bernd Z. schrieb:
> Noch eine letzte Frage:
> (TIME_SOUND/TIME_LED_FLASH) ist tatsächlich eine Division?
> Die Variablen zu nutzen, ist natürlich viel intellgenter, als eine Zahl
> einzutragen.

Das ist eine Division, allerdings schon zu Compilierzeit. D.h. im 
übertragenen Programm ist dann das Ergebnis der Division der beiden 
Konstanten verwendet, es wird nicht zur Laufzeit dividiert.

von Harald (Gast)


Lesenswert?

Bernd Z. schrieb:
> Bernd Z. schrieb:
>> "if....state" verstehe ich so, das ich z.B. 1x klick Taste 1.LED
>> an, 2x
>> klick 2.LED an, also ein CD4017.
>
> Nur ist die Variable dann das PIN am Uno :-(
> Da könnte ich ein Schieberegister nehmen....dann bleibt es seriell

Ich kann dir leider nicht folgen, führe mal etwas aus was du möchtest.

von Harald (Gast)


Lesenswert?

So wäre die Änderung mit variablem LED Tastverhältnis


#define TIME_LED_ON      20  // LED ein Zeit in ms
#define TIME_LED_OFF     80  // LED aus Zeit in ms
#define TIME_SOUND     3000  // Soundzeit in 10ms Schritten


  for (y=0; y<(TIME_SOUND/(TIME_LED_ON+TIME_LED_OFF); y++)
  {
     digitalWrite(LED_OUT, 1);
     delay(TIME_LED_ON);
     digitalWrite(LED_OUT, 0);
     delay(TIME_LED_OFF);
  }

von Harald (Gast)


Lesenswert?

Korrektur

define TIME_LED_ON        2  // LED ein Zeit in 10ms
#define TIME_LED_OFF      8  // LED aus Zeit in 10ms
#define TIME_SOUND     3000  // Soundzeit in 10ms Schritten


  for (y=0; y<(TIME_SOUND/(TIME_LED_ON+TIME_LED_OFF); y++)
  {
     digitalWrite(LED_OUT, 1);
     delay(TIME_LED_ON*10);
     digitalWrite(LED_OUT, 0);
     delay(TIME_LED_OFF*10);
  }

von Bernd Z. (carlo1309)


Lesenswert?

Das war eine Überlegung wie "if...state" funktioniert.
Ich bezog mich auf Deinen 1.code

=========================
if (mode == 0)
  {
    state = 0;
    counter = 0;
    digitalWrite(LED_OUT, 0);
  }
  else
  {
    counter++;
    if (counter >= TIME_LED_FLASH)
    {
      counter = 0;
      state ^= 1;

      digitalWrite(LED_OUT, state);
=========================

war natürlich nicht korrekt meine Schreibweise "if...state"

: Bearbeitet durch User
von Harald (Gast)


Lesenswert?

Ja ne, das war mir schon klar. Ich bezog mich auf:


>> klick 2.LED an, also ein CD4017.
>> Nur ist die Variable dann das PIN am Uno :-(
>> Da könnte ich ein Schieberegister nehmen

von Carlo0109 (Gast)


Lesenswert?

Wenn ich das mit dem uno machen würde, müsste ich an je einen Ausgang 
eine LED hängen, die Ausgabe wäre parallel, ein 4017 würde am Eingang 
seriell arbeiten und jeweils seine Ausgänge schalten.

von Harald (Gast)


Lesenswert?

Carlo0109 schrieb:
> Wenn ich das mit dem uno machen würde, müsste ich an je einen
> Ausgang
> eine LED hängen, die Ausgabe wäre parallel, ein 4017 würde am Eingang
> seriell arbeiten und jeweils seine Ausgänge schalten.

Ich verstehe leider immer noch nicht, worauf Du hinaus möchtest. Wir 
haben ein Programm für den WTV gebaut, du sprichst von 4017, LEDs und 
paralleler Ausgabe. Grübel...

von Carlo0109 (Gast)


Lesenswert?

Ich hatte den Gedanken wofür man die Befehle noch verwenden könnte, hat 
nix mit WTV zu tun...

von Carlo0109 (Gast)


Lesenswert?

Also nicht mehr drüber nachdenken

von Harald (Gast)


Lesenswert?

Nach all den Zeilen würde ich gerne als Resümee noch wissen, ob Dir die 
Lösung per Software/Arduino gefallen hat oder ob du es doch lieber in 
Hardware umgesetzt hättest.

von Bernd Z. (carlo1309)


Angehängte Dateien:

Lesenswert?

Ja, natürlich, hätte mich schon noch gemeldet, musste paar dringende 
Dinge erledigen.
Ich möchte das nicht mehr in Hardware umsetzen, die Softwarelösung ist 
einfach genial!
Bin schon am zusammensuchen der anderen Bauteile, ich hatte ganz weit 
vorher eine Lösung mit einem U880 :-) da hat aber der benutzer einen 
Kurzschluß verursacht und ich habe keinen Schaltplan mehr. Einen EProm 
hatte ich noch uns eine pcb.
Seit mehreren Jahren suchte ich einen Ersatz dafür, weil das was es auf 
dem Markt gibt, mir nicht gefällt.
Ich bin total inspiriert, auch andere Sachen zu machen, wie Du es schon 
eingangs sagtest, einmal Blut geleckt....

Die Hardwarelösung hätte so ausgesehen: allein die zu verlötenden 
Drähte...
der WTV fehlt da noch..

Bin gerade beim Einrichten des Nano, muss den Treiber noch suchen, aber 
Du hattest oben ja schon geschrieben worauf ich achten muss.
Zwischendurch hab ich noch paar Sensoren etc. gekauft:-)

von Bernd Z. (carlo1309)


Lesenswert?

So geht erstmal mit dem Nano, aber das Blamken strtet sofort der Sound 
viel später und er springt zum nächsten Titel.
Aktuell hält er nicht mehr an.
Muss geute abend nochmal ne Fehlersuche machen.

von Bernd Z. (carlo1309)


Lesenswert?

"Old bootloader" löst das Problem nicht.

von Bernd Z. (carlo1309)


Angehängte Dateien:

Lesenswert?

In der Verdrahtung hab ich keine Fehler gefunden.
Aufnahme vom Analyser.

Hab gerade mal nachgesehen, mein Uno hat auch einen CH340G drauf,
auf dem Nano steht nichts drauf, auf dem serial Chip.

: Bearbeitet durch User
von Harald (Gast)


Lesenswert?

Bernd Z. schrieb:
> steht nichts drauf, auf dem serial Chip.

SO16 dürfte CH340 sein, die FTDI gibt es in vielen anderen Bauformen 
aber nicht in SO16. Ansonsten VID/PID im Geräte-Manager unter 
Eigenschaften/Details/Hardware-IDs nachsehen und googeln.

von Carlo0109 (Gast)


Lesenswert?

SOT16 hat er auch, hab nochmal einen neuen Nano bestellt, bei einem 
anderen Anbieter. Sollte Montag ankommen.

von Bernd Z. (carlo1309)


Angehängte Dateien:

Lesenswert?

Der Nano scheint einen Treffer zu haben, hab einen anderen sketch 
probiert.
Der funktioniert auch nicht.
Sketch hat am Eingang einen Piezo und soll auf "Klopfen" reagieren.
Beim Nano "läuft" die Spannung am Eingang hoch und wieder runter, die 
LED geht nicht an. Er schwingt sozusagen, Kondensatoren über Ub brachten 
auch nichts.
Schaltung sh. Anhang
Sketch hier:
===================
int piezoPin = 0; // Analog-Pin=A0 für den Piezo-Sensor
int ledPin = 12;  // Ausgangspin für die LED
int wert = 0;     // Aktuell gemessener Wert

// Aktuelle Status der LED (wechselt bei Piezo-Klopfzeichen)
int ledStatus = LOW;
int schwelle = 5;

void setup() {
pinMode(ledPin, OUTPUT);  // Pin 12 für die LED als Ausgangspin setzen
Serial.begin(9600);
}

void loop() {
  wert = analogRead(piezoPin);    // Eingangswert an A0 lesen
  // Liegt der Wert über dem oben definierten Schwellenwert? Dann 
Ereignis auslösen
  if (wert >= schwelle)
  {
    ledStatus = !ledStatus; // Status der LED umkehren (1/0 = ein/aus)
    delay(100);
    digitalWrite(ledPin, ledStatus); // Pin 12 auf den Status setzen
   }
 //else
 //digitalWrite(ledPin, LOW);
    Serial.println(wert);
    // Der Piezo braucht einige Zeit, um sich wieder zu beruhigen, daher 
200ms warten.
    delay(200);
  }


 //der sketch reagiert "empfindlicher"
 //dafür schaltet LED erst beim nächsten "Klopf" wieder aus
===================

: Bearbeitet durch User
von Bernd Z. (carlo1309)


Angehängte Dateien:

Lesenswert?

Bin wieder zurück, der Nano ist erst gestern angekommen.
Gleiches Problem wie vorher, sketch geht mit dem Nano nicht richtig.
Hochladen mit den Einstellungen sh. Anhang funktioniert.
Jetzt weis ich nicht mehr weiter, müsste einen Uno verbauen, damit hat 
es ja funktioniert.

Da ich auf dem Uno Board auch einen CH340 habe, kann es am Treiber 
eigentlich nicht liegen.

: Bearbeitet durch User
von Bernd Z. (carlo1309)


Lesenswert?

Auf dem neuen Nano ist ein FTDI Chip drauf, wird vom System auch erkannt

von Bernd Z. (carlo1309)


Lesenswert?

Gestern habe ich versucht den 1. Nano mit neuem Bootloader zu flshen, 
dabei habe ich wahrscheinlich den Uno der eigentlich als 
Programmiergerät war, geflasht.
Nun läuft der Uno genauso (nicht) wie der Nano, also startet allein und 
spielt alle ausgewählten Titel ab, ohne das er auf die Starttaste 
reagiert.
Aber da scheint ja irgendwas mit den Bootloader, den ich drauf gemacht 
habe nicht zu passen.

von Harald A. (embedded)


Lesenswert?

Bitte mal den Arduino UNO/Nano Schaltplan checken, an Pin 13 hängt eine 
LED, die den PIN gegen Masse zieht. Also verwende für den Tastereingang 
einen anderen Pin, z.B. D8.

von Bernd Z. (carlo1309)


Lesenswert?

Ich hab die LED an 12 und den Taster an 13.
Hab nun die Schaltung soweit fast fertig verdrahtet.
Stecke ich jetzt den Nano drauf, der vorher ging, geht es wieder nicht.
Uno funktioniert immer noch.
Dann hab ich den sketch nochmal draufgespielt, geht es wieder.
Kann es sein das der Nano etwas "vergisst"?
Was mir auch noch aufgefallen ist, das Modul startet nicht immer am 
Anfang.
Ein 100nF am Reset des Moduls geht nicht, dafür ist der Reset Impuls vom 
Nano zu kurz.
Vielleicht müsste der WTV am Anfang einen längeren Reset bekommen.

von Bernd Z. (carlo1309)


Lesenswert?

Es ist ganz kurios, betreibe ich den Nano mit MTV über die USB Buchse 
geht es, mit seperaten 8V an Vin geht es nach dem abstecken nicht mehr.
(USB entfernt)
Wieder zurück auf USB, geht es wieder.

von Bernd Z. (carlo1309)


Lesenswert?

Aktuell muss ich wohl einen Uno nehmen, der geht sowohl an USB als auch 
externe Versorgung. Der Nano spinnt, ich kann es nicht erklären was der 
macht. Habe zwischenzeitlich nochmal die erste Variante draufgespielt, 
da sieht man den Reset am WTV, aber wirklich sicher geht es mit dem Nano 
nicht.

von carlo1309 (Gast)



Lesenswert?

Hier 2 Bilder vom Analyser.
Hab zuerst mit USB Kabel und dann mit externer Ub, in beiden Fällen der 
Nano, ja er ging gerade mal wieder.

von Bernd Z. (carlo1309)


Lesenswert?

Es scheint das WTV Modul zu sein.
Wenn ich es abklemme, läuft der Nano und der Analyser hat auch das 
passende Bild.
Nano hängt an Vin.
Nun tausche ich mal das WTV Modul, allein betrieben funktioniert es ohne 
Fehler.

von Bernd Z. (carlo1309)


Lesenswert?

Muss mich wohl nach einem anderen Sound Modul umsehen.
Oder die Uno Variante machen, die geht nach wie vor - warum auch immer

von Harald (Gast)


Lesenswert?

Irgendwie scheinst du meinen Beitrag bzgl. Pin 13 nicht gelesen zu 
haben...

von Carlo0109 (Gast)


Lesenswert?

Doch hab ich, hab aber nicht umgesteckt bzw. Darauf geändert. Ich nahm 
an das es ein Hinweis auf einen Verbindungsfehler  ist. Aber offenbar 
meinst du das ich es um Stecken MUSS.
Komme erst nächste Woche dazu.

von Harald A. (embedded)


Lesenswert?

Pin 13 ist intern im Arduino Modul an eine LED angeschlossen, die den 
Pin gegen Masse zieht. Zusätzlich kann es sein, dass verschiedene 
Bootloader diese LED unterschiedlich handhaben, ich bin kein 
Arduino-Experte. Daher die Unterschiede. D8 ist hingegen immer frei.

von Carlo0109 (Gast)


Lesenswert?

Achso, daran hab ich nicht gedacht

von Bernd Z. (carlo1309)


Angehängte Dateien:

Lesenswert?

Hallo Harald, ich kam erst jetzt wieder dazu....
Hab den Anschluß in die 8 geändert, es funktioniert wie es soll.
Jetzt ist die SD karte kaputt gegangen und eine neue bis 1GB habe ich 
leider kurzfristig nicht ranbekommen. Der WTV "verträgt" nur bis 1GB.
Hab nur noch ab 8GB.
Habe mich deswegen mit dem DFPlayer beschäftigt.
Nach mehreren Stunden habe ich es mit Deinem sketch auch hinbekommen.
Für Dich sicher nur eine 10 min Kaffeepause, aber bei mir dauert es eben 
länger.
Der Vorteil des DFPlayer liegt zum einem an der geringeren 
Außenbeschaltung aber viel wesentlicher erscheint mir, das ich damit die 
mp3 direkt verwenden kann, er meckert auch keine Stereo Aufnahmen an.
Außerdem spare ich mir die Pegelwandlung.
Beim WTV geht nur das ad4 Format. Eine einfache Lautstärke Einstellung 
geht ebenfalls viel besser mit dem DFPlayer.
Nun hat es den Stand, das auch andere es nutzen könnten.

Im Anhang mal ein Bild vom Aufbau. Die 1W LED hängt natürlich nicht 
direkt am Anschluß des Nano :-)

Kannst bitte nochmal über den den sketch schauen.. eine Zeile habe ich 
aus einer anderen Anwendung verwendet, allerdings brauche ich offenbar 
nur den Aufruf als Start, denn wenn die Zeile fehlte ging es nicht.
Die Zeile bezieht sich wohl eher auf die serielle Textausgabe auf das 
Display. -> "...if (!myDFPlayer.begin(mySoftwareSerial..."

Also ohne Deinen sketch hätte ich das auch nicht mal einfach umstellen 
können, danke nochmal.

......................
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

#define LED_OUT 12
#define TASTER  8

#define TIME_LED_FLASH 400   // Blinkgeschwindigkeit in 10ms Schritteno
#define TIME_SOUND     8000  // Soundzeit in 10ms Schritten

//#define DFPLAYER_EQ_NORMAL 0
#define DFPLAYER_EQ_POP 1
//#define DFPLAYER_EQ_ROCK 2
//#define DFPLAYER_EQ_JAZZ 3
//#define DFPLAYER_EQ_CLASSIC 4
//#define DFPLAYER_EQ_BASS 5

#define DFPLAYER_DEVICE_SD 2

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;

// --------------------------------------------------------

void setup()
{
  pinMode (LED_OUT, OUTPUT);
  pinMode (TASTER,  INPUT);    // INPUT_PULLUP für Optokoppler/Taster 
Eingang aktivieren
  myDFPlayer.reset();
  //myDFPlayer.play(1);
  //myDFPlayer.next();
  mySoftwareSerial.begin(9600);

if (!myDFPlayer.begin(mySoftwareSerial, false)) {  //start 
softwareSerial to communicate with mp3.
    while(true){
      delay(0); // Code to compatible with ESP8266 watch dog.
    }
  }
  myDFPlayer.volume(20);  //Set volume value. From 0 to 30
}
.....................

: Bearbeitet durch User
von Harald A. (embedded)


Lesenswert?

Tja, keine Ahnung, kenne das Produkt DFPlayer nicht. Allerdings spuckt 
Google das hier aus, mache es doch so
https://www.dfrobot.com/wiki/index.php/DFPlayer_Mini_SKU:DFR0299

Die While-Schleife macht meiner Meinung nach keinen Sinn.

von Bernd Z. (carlo1309)


Lesenswert?

Na der ist so ähnlich wie der WTV....
Ja die Schleife macht auch keinen Sinn, im sketch muss sowas wie
"myDFPlayer.begin" rein, das fehlte bei vielen Beispielen.
Kenne die genaue Schreibweise nicht, deshalb hab ich es gelassen.
Hab aber auch noch nich hinreichend getestet.
Das WTV Modul kommt noch zum Einsatz, hab noch einen Interessenten der 
einen Gong haben will.

von Bernd Z. (carlo1309)


Lesenswert?


von Bernd Z. (carlo1309)


Lesenswert?

nochmal ne kurze Rückmeldung...
WTV funktioniert auch problemlos mit dem sketch, war wirklich nur der 
"falsche" Ausgang

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.