Arduino, Attiny85 et SD player d'ELM Chan via I2C

Salut à toi al1fch, ben de rien de rien, j'ai juste farfouillé à droite et à gauche pour trouver ça, j'ai pas eu à faire grand chose en fait, puisque tout était quasiment fait, bon mis à part comprendre la marche à suivre ^^

Pour la lecture du fichier wav, oui il suffit d'envoyer juste le numéro du morceau wav à jouer, c'est vraiment ultra easy, et je suis pas mécontent d'avoir trouvé ça, ça m'évite de passer par le shield Wavplayer qui ne fait pas le méme prix pour mon petit projet :slight_smile:

En tout les cas je te remercie pour le logiciel Audacity, je m'y met ce midi, et pour le LM386 logiquement les fils ne devraient pas étre long puisque le montage sera fait sur Veroboard, enfin si je trouve un moyen convenable de fixer le LM386 CMS sur la veroboard...

Vali valou

A+

Pour un noob comme tu as dis, tu te débrouille quand même très bien. :astonished:
A l'état actuel je sais pas si j'aurais su faire la même chose (motivation :grin: )
On vois qu'il y a de la recherche, ça change du "noob" qui ce précipite sur le forum pour avoir du tout cuit. :slight_smile:
Bravo et merci pour le partage. :wink:

Re all, bon juste pour prévenir, en fait le lancement par I2C ne se fait qu'une fois, impossible de lancer un second morceaux une fois qu'un morceau ai été lancé....
pour ma part ça ne me pose pas de soucis, puisque c'est un son final que je souhaite (bruit d'explosion ou un beau "You Win").
Donc si vous voulez pousser la chose, je crois que l'auteur donne un indice sur son site :

Die Software wurde so modifiziert, dass per I2C-Bus ein bestimmter Sound von der SD-Karte abgespielt werden kann. Benötigt werden hier 5 Sounds: Sounddatei 1-4 sind die Sounds für 1/4, 1/2, 3/4 und volle Stunde, Sounddatei 5 ist der Sound, der bei jeder vollen Stunde anschließend an Sound 4 noch entsprechend des Stundenwerts x-mal als Glockenschlag abgespielt wird, sozusagen das "Bong". Der Simple SD Audio Player ist dabei ein I2C-Slave, der über das USI realisiert wurde. Da die I2C-Pins des ATtiny85 eigentlich schon für die Ansteuerung der SD-Karte belegt sind, wurde hier eine softwaremäßige Umschaltung vorgenommen: nach PowerOn werden diese als I2C geschaltet und es wird gewartet, bis die Soundnummer empfangen wurde. Anschließend werden die Pins als SPI Interface für die SD-Kartenansteuerung verwendet. Der Atmega8 der Ping Pong Platine ist der I2C-Master und nutzt das on-chip I2C-Interface. Die erforderlichen Pullups für I2C werden im ATmega8 intern hinzugeschaltet. Nachdem die Soundnummer übertragen wurde, wird im Atmega8 das I2C-Interface abgeschaltet und beide Pins SCL und SDA werden als Eingänge beschaltet. Hierüber kann dann erkannt werden, wann der Sound zu Ende ist, da dann keine Pegelwechsel mehr auf der CLK-Leitung der SD-Karte vorhanden sind.

Traduction Googlienne :

Le logiciel a été modifié de sorte qu'il peut être joué via le bus I2C est un certain son de la carte SD. Nécessaire voici 5 sons: fichier sonore 1-4 sont les bruits de 1 / 4, 1 / 2, 3 / 4 et plein de fichiers sonores heures 5 est le son que par la suite, chaque heure de son 4 pour le moment en fonction de la valeur horaire de x parfois joué un accident vasculaire cérébral, pour ainsi dire, le "bong" est. Le simple SD Audio Player est un esclave I2C qui a été réalisé grâce à l'iodation universelle du sel. Depuis les broches I2C sont en réalité les ATTINY85 est déjà plein pour le contrôle de la carte SD, voici un logiciel de commutation à base a été faite: après une marche entre eux que I2C, puis attend jusqu'à ce que le numéro de son a été reçue. Puis les broches sont utilisés comme une interface SPI pour le lecteur de carte SD. L'Atmega8 l'Ping Pong conseil d'administration est le maître I2C et utilise l'interface I2C sur puce. Les tractions nécessaires pour I2C pour être connecté en interne dans l'ATmega8. Une fois que le numéro a été transmis le son, l'Atmega8 est l'interface I2C est éteint et les deux broches SCL et SDA sont connectés comme entrées. Par ici peut alors être détectée lorsque le son est trop tard, parce qu'alors, aucun niveau de changements plus sur la ligne CLK de la carte SD sont disponibles.

j'ai mis en bleu la phrase intéressante....
Aprés ce que j'en ai compris c'est qu'il coupé les broches d'entrée SDA/SDL de l'attiny une fois l'info donné pour laisser place au lecteur de WAV, mais ce que je ne comprends pas c'est pourquoi en ayant flashé un sketch avec une boucle, l'arduino ne fait pas en sorte que le morceau tourne en boucle une fois finit?

fin bref je verrais ça plus tard, la faut que je finisse mon projet avant tout ^^, c'était juste une info.

Bonjour,

Arioch:
Re all, bon juste pour prévenir, en fait le lancement par I2C ne se fait qu'une fois, impossible de lancer un second morceaux une fois qu'un morceau ai été lancé....
pour ma part ça ne me pose pas de soucis, puisque c'est un son final que je souhaite (bruit d'explosion ou un beau "You Win").
Donc si vous voulez pousser la chose, je crois que l'auteur donne un indice sur son site :

D'après ce que j'ai compris du programme l'attiny initialise d'abord un bus i2c software et attend un octet correspondant au numéro de la musique, une fois reçu il "stop" ce bus I2C et l'utilise en port SPI pour communiquer avec la carte sd et jouer la musique, donc c'est logique qu'une fois la musique lancé il soit impossible de stopper ou de changer de musique.
Le seul moyen de stopper/changer de musique c'est d'envoyer une impulsion LOW sur le reset de l'attiny pour le faire "redémarrer" et qu'il reparte en attente sur le bus I2C.

Arioch:
Aprés ce que j'en ai compris c'est qu'il coupé les broches d'entrée SDA/SDL de l'attiny une fois l'info donné pour laisser place au lecteur de WAV, mais ce que je ne comprends pas c'est pourquoi en ayant flashé un sketch avec une boucle, l'arduino ne fait pas en sorte que le morceau tourne en boucle une fois finit?

Quand le programme "tombe" dans le while(1) après 1 secondes le "watch-dog" détecte la boucle infini et redémarre l'attiny, ainsi il recommence à partir en mode I2C et attend un nouveau octet, et etc etc ... c'est pour ça que le morceau ne tourne pas en boucle.

Salut à toi Skywood et merci de tes précisions, par contre petite question pour envoyer une impulsion Low et donc réinitialiser le Attiny, j'aurais donc juste besoin de brancher un cable d'une broche digital "Y" vers le pin 1 de l'attiny, et d'envoyer l'impulsion avec cette ligne de commande:

digitalWrite(PinY,LOW);

...

Arioch:
Salut à toi Skywood et merci de tes précisions, par contre petite question pour envoyer une impulsion Low et donc réinitialiser le Attiny, j'aurais donc juste besoin de brancher un câble d'une broche digital "Y" vers le pin 1 de l'attiny, et d'envoyer l'impulsion avec cette ligne de commande:

digitalWrite(PinY,LOW);

Voila en gros un

digitalWrite(PinY, LOW); 
delay(100); 
digitalWrite(PinY, HIGH);

et l'ATtiny sera redémarré illico presto.

Re, ben euh ça marche pas .....
Avec un cable connecté du pin 1 de l'ATtiny sur la broche digital 3 de l'arduino ça bloque complétement la lecture.

#include <Wire.h>

void setup()
{
  Wire.begin(); // join i2c bus (address optional for master)
  pinMode(3, OUTPUT);


}


void loop()
{
  Wire.beginTransmission(85);
  Wire.send(1);
  Wire.endTransmission();
  delay(3000);
  digitalWrite(3, LOW); 
  delay(100);
    digitalWrite(3, HIGH); 
}

Arioch:
Re, ben euh ça marche pas .....
Avec un cable connecté du pin 1 de l'ATtiny sur la broche digital 3 de l'arduino ça bloque complétement la lecture.

Tu as fait quel montage du SD player (Stéréo, Mono, Mono-HD) ?
Si c'est le montage stéréo ou mono-hd la broche de reset est utilisé en I/O classique, donc plus de broche de reset.

Sinon tente de mettre un digitalWrite(3, HIGH); après le pinMode().

Salut, salut, pour le montage j'ai fait le mono, donc le pin reset de l'ATtiny est toujours en fonction.

Pour le digitalWrite aprés le pinMode j'avais déja testé aussi sans succés, mais il parle aussi d'un ADP3303, qui je pense doit couper l'alimentation de l'ATtiny pour faire un reset....enfin c'est que je crois avoir compris...

Da die SD-Karte mit Spannungspegeln von 2,7 ... 3,3V arbeitet, wurde ein 3,0V LowDrop Linearspannungsregler ADP3303-3.0 verwendet, der zusätzlich über einen Shutdown-Pin verfügt. Wenn Shutdown auf GND gezogen wird, dann werden die 3V abgeschaltet und der Spannungsregler verbraucht im Standbymodus nur wenige µA. Der Shutdown-Pin wird am Portpin D.1 der Ping Pong Platine angeschlossen, sodass der Atmega8 die Spannungsversorgung für den Simple SD Audio Player ein- und ausschalten kann.

Depuis la carte SD avec des niveaux de tension de 2,7 ... 3.3 fonctionne V, 3,0 V une LowDrop régulateur linéaire de tension ADP3303-3.0 a été utilisé, qui a aussi une goupille d'arrêt. Si l'arrêt est tiré à GND, puis le 3V hors tension et le régulateur de tension ne consomme qu'un peu d'uA en mode veille. La goupille d'arrêt est sur ??le port broches Ping Pong bord D.1 ligne, permettant à l'Atmega8 de l'alimentation pour le joueur SD audio simple sur et hors tension.

Arioch:
Pour le digitalWrite aprés le pinMode j'avais déja testé aussi sans succés, mais il parle aussi d'un ADP3303, qui je pense doit couper l'alimentation de l'ATtiny pour faire un reset....enfin c'est que je crois avoir compris...

L'ADP3303 est un régulateur de tension 3v3, ce qui m'étonne dans ton schéma (pas facile à lire, il est un peu petit) c'est que la broche RESET de l'attiny soit laissé en l'air.
Normalement un signal LOW sur la broche RESET, reboot l'attiny quoi qu'il arrive ...

Bonjour
-Dans ce schéma le 3,3V n'est pas permanent : utilisation de la broche Shut Down du régulateur.
PD1 (?) peut donc indirectement resetter le Tiny85 (Power on reset)
-même étonnement que skywodd pour la broche de reset externe en l'air .... tant qu'il n'y a pas de relais ou de moteur à proximité ça peut tout juste aller....
-puisque la fonction Reset du Tiny85 est restée activée il est très étonnant qu'un niveau bas d'au moins 25µs ne resette pas

Bonsoir à vous, désolé pour le petit schéma j'avais pas tilté que j'avais pris le lien de la miniature:

ce n'est donc pas le pin Reset de l'ATtiny qui permettrais de relancer du son aprés le premier son, mais le fait de couper le 3V d'alim de la SD et de l'ATtiny durant un laps de temps pour se faire?
Puisque comme vous le dites tous les deux le reset de l'ATtiny n'est relié à rien sur le schéma.

PS : je vous met le code d'ELO-WEB qu'il a programmé pour le Atmega8 , qui gére le pilotage de l'ATtiny ( Programmé avec le hex modifié (d'ELM-CHAN) se trouvant Ici)

Arioch:
ce n'est donc pas le pin Reset de l'ATtiny qui permettrais de relancer du son aprés le premier son, mais le fait de couper le 3V d'alim de la SD et de l'ATtiny durant un laps de temps pour se faire?
Puisque comme vous le dites tous les deux le reset de l'ATtiny n'est relié à rien sur le schéma.

Il ne donne pas les valeurs des fusibles qu'il a utilisé mais je pense qu'il à désactivé le RESET de son ATtiny, sinon avec RESET en l'air comme ça le µc marcherai de manière chaotique.

Dans sont systéme effectivement c'est une coupure d'alim qui redémarre l'attiny, mais en règle générale, un LOW de +25µs sur RESET déclenche un redémarrage du micro-contrôleur quoi qu'il arrive.

Re, ben voila les valeurs des fusibles, comment tu fais pour savoir si il a désactivé ou pas le fusible?

high:0xD6 low:0xE1 extended:0xFF

Arioch:
Re, ben voila les valeurs des fusibles, comment tu fais pour savoir si il a désactivé ou pas le fusible?

high:0xD6 low:0xE1 extended:0xFF

-> AVR® Fuse Calculator – The Engbedded Blog

C'est les fusibles de ton attiny !? :fearful:
Selon les valeurs que tu donne la programmation ISP est désactivé, et le systéme utilise un oscillateur externe ...
Sa colle pas avec ton schéma :astonished: et pire, sans un programmateur HVSP l'attiny est impossible à reprogrammer avec ces fusibles !

ben je viens de cocher les méme value que sur le screen fournis par ELO-WEB (ci-dessous) , et j'obtiens les méme valeur, la case SPIEN étant coché, la programation par ISP reste donc possible?
Bon c'est pas bien grave si je peut plus le programmer il marche bien pour l'utilisation que je veux en faire, mais pour une réutilisation du montage pour autre chose, j'aimerais bien comprendre comment faire pour que ça marche ^^

Bizarre moi j'obtiens pas la même chose ...
Dans la mesure ou tu utilise un le calculateur de fusibles de Avr Dragon, je pense que tu a raison pour SPIEN.

(Oui j'ai plus confiance en Avr-studio que en avrfuses :sweat_smile:)

Edit: ok j'ai compris, j'avais pas choisi le bon mode pour la PLL, et pour une raison XY avrfuses utilisent 0x01 au lieu de 0xFF pour le extended fuse ...

Arioch, as-tu tenté (juste pour voir ce que ça donne un reset du Tiny85 par bouton poussoir sur sa broche 1) .....ça serait juste un lever de doute ......

L'entrée Reset est un peu particulière vu qu'elle sert aussi à détecter la 'haute tension' de programmation? C'est spécifié =12V pour une alimentation de 5V mais qui sait, un Tiny85 particulièrement 'susceptible' alimenté en 3,3V réagit peut être avec 5V sur son Reset ?

Si le reset par BP fonctionne bien il suffirait (si l'hypothèse du passage involontaire en HVSP est valide) soit :
-d'abaisser le niveau haut envoyé par l'Arduino sur le reset du Tiny85 (pont diviseur par exemple.....)
-ou ou de séparer les niveaux hauts (5V et 3,3V) en mettant une diode (cathode en sortie Arduino et anode en pin 1 du Tiny85. )

Salut, bon je reviens sur ce montage, d'une part parce que ça m'intrigue, et d'une autre part parce que j'aimerais vraiment intégrer un lecteur SD à mon projet, et j'ai un peu matter sur la toile mais y'a rien de comparable au lecteur d'ELM Chan transformé par ELO-WEB....enfin si mais trop cher.

Alors déja @al1fch j'ai cablé le reset en direct sur un pin arduino pour faire un reset, et en direct sur l'arduino ça marche pas, je suis passé par un 2N3904, et le reset se fait nickel, faut mettre un temps de latence entre l'appuis du reset et le lachage virtuel, et aussi un petit temps de démarrage pour envoyer une commande, donc merci à toi :

#include <Wire.h>
const int reset = 2;
int count = 0;

void setup()
{
  pinMode(reset, OUTPUT);
  digitalWrite(reset,1);
  Wire.begin(); 

}


void loop()
{

  if(count < 3){
  Wire.beginTransmission(85);
  Wire.send(2);
  Wire.endTransmission();
  delay(2000);
  digitalWrite(reset,0);
  delay(10);
  digitalWrite(reset,1);
  delay(100);
  Wire.beginTransmission(85);
  Wire.send(3);
  Wire.endTransmission();
  delay(2000);
  digitalWrite(reset,0);
  delay(10);
    digitalWrite(reset,1);
      count ++;
  }

Aprés vu que méme avec les convertisseurs de niveaux logique le fait de lancer un morceaux plante complétement le déroulement du prog (dû au passage du bus I2C vers SPI) j'ai pensé à un truc, et je ne sais pas si c'est faisable, j'attends donc que vous m'éclairiez.

J'ai testé le voltage entre la ligne SDA et SCL sur l'ATtiny85 pendant tout le cycle de lecture d'une piste, j'obtiens donc:
-Au repos : 1V
-Lecture : 1.5V
-Aprés fin lecture : pique à 3.3V
-Repos : 1 V
........

Serait t'il possible de rajouter un Attiny85 qui lui serait là pour faire office de "relais" d'ouverture et de fermeture pour couper la ligne SDA/SCL le temps de la lecture, en gros l'arduino envois la commande à l'ATtiny qui lit la musique, l'autre ATtiny compare la tension entre SDA et SCL et si celle ci dépasse 1V coupe la liaison SDA/SCL entre l'arduino et le lecteur audio, et l'a réouvre une fois que la tension reviens à 1V?

C'est possible ou pas?

Merci de vos réponses, A+