ich habe einen Arduino Mega und das Ethernet Shield 2 und möchte gerne eine Audio-Ausgabe über einen 8 Ohm-Lautsprecher realisieren. Hab mir ein paar Anleitungen dazu im Internet angeschaut und um ehrlich zu sein, blicke ich gerade nicht wirklich durch. Muss auch dazu sagen, dass ich, was Arduino und Audio angeht, auch noch ein Anfänger bin.
Zuerst bin ich auf diese Anleitung gestoßen. Habe dann aber gesehen, dass dort der "DAC0"-Output vom Due-Board verwendet wird. Diesen Pin habe ich beim Mega ja nicht.
Habe dann aber gesehen, dass es auch Lösungen wie diese gibt, wo kein DAC-Output gebraucht wird.
Nicht zuletzt ist dann bei dieser Anleitung auch von DAC0 die Rede, wovon im Anschlussdiagramm aber gar nichts zu sehen ist.
Fazit: Ich bin gerade ziemlich verwirrt, wie ich die Audio-Ausgabe jetzt am besten umsetzen soll. Über jegliche Hilfe von jemandem wäre ich sehr dankbar.
Die AVR Arduinos haben keinen eingebauten DAC. Entsprechend kann es keine solchen Ausgänge geben.
Es gibt externe DACs die über SPI oder I2C angesteuert werden. DIP4 ICs für ein paar Euro. Nicht sonderlich kompliziert.
Die TMRpcm Library verwendet Timer um das irgendwie auszugeben. Was genau da gemacht wird ist mir nicht ganz klar. Die Hauptattraktion ist aber dass man WAV Dateien direkt von der SD Karte lesen kann.
Das ganze ist aber sehr rechenintensiv.
Das sollte dann schon mit deinem 2. Link funktionieren.
Ob dir die Qualität dann ausreicht, ist eine andere Sache und musst du dann entscheiden..
Ich würde für den Fall einen MP3-Player verwenden.
Z.B. den DFplayer mini. Der macht das ganz ordentlich. DFPlayer mini.
Nicht zuletzt ist dann bei dieser Anleitung auch von DAC0 die Rede, wovon im Anschlussdiagramm aber gar nichts zu sehen ist.
Naja...
Zumindest in der Produktbeschreibung des Arduino Zero findet sich folgender Satz:
DAC: A0. Provide a 10bit voltage output with the analogWrite() function.
Und schaut man dann bei analogWrite() nach, findet sich dieses:
Zusätzlich zu den oben erwähnten PWM-Funktionen für die Pins verfügen die MKR- und Zero-Boards über einen echten Analogausgang, wenn analogWrite() auf dem DAC0 (A0)-Pin benutzt wird.
** Zusätzlich zu den oben erwähnten PWM-Funktionen für die Pins verfügt das Due-Board über einen echten Analogausgang, wenn analogWrite() auf den DAC0 und DAC1-Pins benutzt wird.
Okay, vielen Dank. So langsam kommt bei mir Licht in's Dunkel Mir ist grade aufgefallen, dass bei der Anleitung im 2. Link gar keine Analog-Pins beim Arduino verwendet werden, sondern die PWM-Digital-Pins (teilweise). Deshalb ist da auch von keinem DAC die Rede oder? Hat diese Methode irgendwelche Vor-/Nachteile? Sorry für die vielleicht doofe Frage
@Serenifly: Bisher ist geplant, dass eine entsprechende Audio-Datei wiedergegeben wird, je nachdem, welcher kapazitive Sensor berührt wird (arbeite gerade an einer interaktiven Gips-Büste). Zusätzlich soll noch eine Vibration stattfinden.
Jupp, werde ich vielleicht machen. Könntest du mir sagen, ob das Ethernet Shield 2 kompatibel mit dem Due ist (das Due-Board läuft ja mit 3.3 V und auf der Arduino-Website steht nichts davon, dass das Ethernet Shield mit dem Due kompatibel ist)?
Apollo_M:
Jupp, werde ich vielleicht machen. Könntest du mir sagen, ob das Ethernet Shield 2 kompatibel mit dem Due ist (das Due-Board läuft ja mit 3.3 V und auf der Arduino-Website steht nichts davon, dass das Ethernet Shield mit dem Due kompatibel ist)?
Leider kann ich das nicht sagen.
Habe den DUE selbst nicht und müsste auch erst recherchieren.
Apollo_M:
Okay, vielen Dank. So langsam kommt bei mir Licht in's Dunkel Mir ist grade aufgefallen, dass bei der Anleitung im 2. Link gar keine Analog-Pins beim Arduino verwendet werden, sondern die PWM-Digital-Pins (teilweise). Deshalb ist da auch von keinem DAC die Rede oder?
Wenn man PWM schnell genug macht wirkt es ist es im Mittelwert wie ein Analogsignal. Irgendwas in diese Richtung wird da ablaufen. Geht aber wie gesagt auf Kosten der Qualität.
Ich rate Dir zu einen kleinen MP3 Player mit SD Karten Leser, wie der bereits vorgeschlagene DFPlayer Mini MP3 Player For Arduino . Da brauchst Du nur über die Schnittstelle ansprechen und das gewollte MP3-File abzuspielen. Der DFPlayer Mini MP3 Player hat bereits einen Verstärker eingebat und man kann direkt einen Lautsprecher anschließen. Angesteuert kann er über RX/TX oder über angeschlossene Taster.
Nachdem die ersten paar Tests jetzt durch sind, kann ich sagen: Es klappt Danke für die Empfehlungen. Eine Sache beschäftigt mich allerdings noch. Erst einmal nachfolgend kurz, wie mein Setup ist:
Arduino Mega
2 RFID-Tags, 1 Empfänger (RFID-RC522)
DFPlayer Mini MP3 Player For Arduino
Tag 1 kommt auf den Empfänger --> 0001.mp3 wird abgespielt
Tag 2 kommt auf den Empfänger --> 0002.mp3 wird abgespielt
Die .mp3s sind im Moment zum Testen nur kurze Soundeffekte
Das ist im Moment das Programm:
#include <SPI.h> // RFID
#include <MFRC522.h> // RFID
#include "Arduino.h" // Audio
#include "SoftwareSerial.h" // Audio
#include "DFRobotDFPlayerMini.h" // Audio
#define SS_PIN 53 // SDA-Pin for RFID
#define RST_PIN 5 // RST-Pin for RFID
MFRC522 mfrc522(SS_PIN, RST_PIN);
SoftwareSerial mySoftwareSerial(10, 11); // Audio
DFRobotDFPlayerMini myDFPlayer; // Audio
void printDetail(uint8_t type, int value); // Audio
void setup() {
Serial.begin(9600);
SPI.begin();
mfrc522.PCD_Init();
mySoftwareSerial.begin(9600);
if (!myDFPlayer.begin(mySoftwareSerial)) {
Serial.println(F("Unable to begin:"));
Serial.println(F("1.Please recheck the connection!"));
Serial.println(F("2.Please insert the SD card!"));
while(true);
}
myDFPlayer.volume(20);
}
void loop() {
if (!mfrc522.PICC_IsNewCardPresent()) {
return;
}
if(!mfrc522.PICC_ReadCardSerial()) {
return;
}
long code = 0;
for(byte i = 0; i < mfrc522.uid.size; i++) {
code = ((code+mfrc522.uid.uidByte[i])*10);
}
if(code == 1426860) {
myDFPlayer.playMp3Folder(1);
delay(3000);
}
if(code == 402660) {
myDFPlayer.playMp3Folder(2);
delay(3000);
}
}
Die Sache ist folgende: Ohne die delays wird eine Datei erst wiedergegeben, wenn ich den entsprechenden RFID-Tag entferne (vermutlich weil sonst der Befehl pausenlos geschickt wird). Deshalb hab ich dann mal delays eingebaut (sind nur kurze Soundeffekte, die wiedergegeben werden, deshalb hab ich testweise einfach mal 3 Sekunden-delays ausprobiert). Jetzt könnte ich also die delays genau so lange machen, wie die jeweiligen Soundeffekte gehen aber eigentlich sollte man ja bei Arduino eher wenig mit delays arbeiten soweit ich weiß.
Deshalb: Weiß jemand vielleicht, wie ich das ohne delays lösen könnte?
Weiß jemand vielleicht, wie ich das ohne delays lösen könnte?
Sicherlich!
Ablaufsteuerung
Meine Standardantwort zu Ablaufsteuerungen:
Eine Stichworte Sammlung für Google Suchen:
Endlicher Automat,
State Machine,
Multitasking,
Coroutinen,
Ablaufsteuerung,
Schrittkette,
BlinkWithoutDelay,
eigentlich sollte man ja bei Arduino eher wenig mit delays arbeiten soweit ich weiß.
Eigentlich schon. Man muss aber dann überlegen, was passieren soll, wenn der Player noch spielt und ein anderer RFID Tag kommt. Wie kriegst du raus, ob das der Fall ist? Wie brichst du das vorige mp3 ab, wenn das dann gewollt ist?
Ein festes delay() ist schon etwas simpel, richtig.
Sich vorzustellen, dass loop() aber keinen Ablauf beschreibt, sondern pro Durchlauf keine Zeit braucht und stattdessen unendlich häufig drankommt, hilft aber, dass das Ganze einfach verständlich bleibt.