Partage
  • Partager sur Facebook
  • Partager sur Twitter

projet son arduino

en attendant un lieu adequat...

Sujet résolu
    27 avril 2012 à 21:49:38

    bonjour
    fervent lecteur des cours arduino ici proposé je suis parti sur un projet pour un spectacle,
    j'ai donc intégré un waveshiel sur un arduino duemilanove, mis ca dans une boite avec un ampli et tiré six boutons des six ports analogiques et je me retrouve avec mes six morceaux de musique (en fait 5 car j'utilise un fichier foireux pour faire office de stop)

    tout ceci est expliqué photos à l’appui sur mon blog a cette adresse :http://ggrrrdiy.noblogs.org/

    donc je me demande, mais j'ai bien une petite idée si en utilisant un switch sur une broche numérique ou deux (ou les 4 disponibles) je pourrais pas avoir 12,18 voir 24 sons

    j'utilise le code suivant
    #include <FatReader.h>
    #include <SdReader.h>
    #include <avr/pgmspace.h>
    #include "WaveUtil.h"
    #include "WaveHC.h"
    
    
    SdReader card;    // This object holds the information for the card
    FatVolume vol;    // This holds the information for the partition on the card
    FatReader root;   // This holds the information for the filesystem on the card
    FatReader f;      // This holds the information for the file we're play
    
    WaveHC wave;      // This is the only wave (audio) object, since we will only play one at a time
    
    #define DEBOUNCE 5  // button debouncer
    
    // here is where we define the buttons that we'll use. button "1" is the first, button "6" is the 6th, etc
    byte buttons[] = {14, 15, 16, 17, 18, 19};
    // This handy macro lets us determine how big the array up above is, by checking the size
    #define NUMBUTTONS sizeof(buttons)
    // we will track if a button is just pressed, just released, or 'pressed' (the current state
    volatile byte pressed[NUMBUTTONS], justpressed[NUMBUTTONS], justreleased[NUMBUTTONS];
    
    // this handy function will return the number of bytes currently free in RAM, great for debugging!   
    int freeRam(void)
    {
      extern int  __bss_end; 
      extern int  *__brkval; 
      int free_memory; 
      if((int)__brkval == 0) {
        free_memory = ((int)&free_memory) - ((int)&__bss_end); 
      }
      else {
        free_memory = ((int)&free_memory) - ((int)__brkval); 
      }
      return free_memory; 
    } 
    
    void sdErrorCheck(void)
    {
      if (!card.errorCode()) return;
      putstring("\n\rSD I/O error: ");
      Serial.print(card.errorCode(), HEX);
      putstring(", ");
      Serial.println(card.errorData(), HEX);
      while(1);
    }
    
    void setup() {
      byte i;
      
      // set up serial port
      Serial.begin(9600);
      putstring_nl("WaveHC with ");
      Serial.print(NUMBUTTONS, DEC);
      putstring_nl("buttons");
      
      putstring("Free RAM: ");       // This can help with debugging, running out of RAM is bad
      Serial.println(freeRam());      // if this is under 150 bytes it may spell trouble!
      
      // Set the output pins for the DAC control. This pins are defined in the library
      pinMode(2, OUTPUT);
      pinMode(3, OUTPUT);
      pinMode(4, OUTPUT);
      pinMode(5, OUTPUT);
     
      // pin13 LED
      pinMode(13, OUTPUT);
     
      // Make input & enable pull-up resistors on switch pins
      for (i=0; i< NUMBUTTONS; i++) {
        pinMode(buttons[i], INPUT);
        digitalWrite(buttons[i], HIGH);
      }
      
      //  if (!card.init(true)) { //play with 4 MHz spi if 8MHz isn't working for you
      if (!card.init()) {         //play with 8 MHz spi (default faster!)  
        putstring_nl("Card init. failed!");  // Something went wrong, lets print out why
        sdErrorCheck();
        while(1);                            // then 'halt' - do nothing!
      }
      
      // enable optimize read - some cards may timeout. Disable if you're having problems
      card.partialBlockRead(true);
     
    // Now we will look for a FAT partition!
      uint8_t part;
      for (part = 0; part < 5; part++) {     // we have up to 5 slots to look in
        if (vol.init(card, part)) 
          break;                             // we found one, lets bail
      }
      if (part == 5) {                       // if we ended up not finding one  
        putstring_nl("No valid FAT partition!");
        sdErrorCheck();      // Something went wrong, lets print out why
        while(1);                            // then 'halt' - do nothing!
      }
      
      // Lets tell the user about what we found
      putstring("Using partition ");
      Serial.print(part, DEC);
      putstring(", type is FAT");
      Serial.println(vol.fatType(),DEC);     // FAT16 or FAT32?
      
      // Try to open the root directory
      if (!root.openRoot(vol)) {
        putstring_nl("Can't open root dir!"); // Something went wrong,
        while(1);                             // then 'halt' - do nothing!
      }
      
      // Whew! We got past the tough parts.
      putstring_nl("Ready!");
      
      TCCR2A = 0;
      TCCR2B = 1<<CS22 | 1<<CS21 | 1<<CS20;
    
      //Timer2 Overflow Interrupt Enable
      TIMSK2 |= 1<<TOIE2;
    
    
    }
    
    SIGNAL(TIMER2_OVF_vect) {
      check_switches();
    }
    
    void check_switches()
    {
      static byte previousstate[NUMBUTTONS];
      static byte currentstate[NUMBUTTONS];
      byte index;
    
      for (index = 0; index < NUMBUTTONS; index++) {
        currentstate[index] = digitalRead(buttons[index]);   // read the button
        
        /*     
        Serial.print(index, DEC);
        Serial.print(": cstate=");
        Serial.print(currentstate[index], DEC);
        Serial.print(", pstate=");
        Serial.print(previousstate[index], DEC);
        Serial.print(", press=");
        */
        
        if (currentstate[index] == previousstate[index]) {
          if ((pressed[index] == LOW) && (currentstate[index] == LOW)) {
              // just pressed
              justpressed[index] = 1;
          }
          else if ((pressed[index] == HIGH) && (currentstate[index] == HIGH)) {
              // just released
              justreleased[index] = 1;
          }
          pressed[index] = !currentstate[index];  // remember, digital HIGH means NOT pressed
        }
        //Serial.println(pressed[index], DEC);
        previousstate[index] = currentstate[index];   // keep a running tally of the buttons
      }
    }
    
    
    void loop() {
      byte i;
      
      if (justpressed[0]) {
        justpressed[0] = 0;
        playfile("wav1.wav");
      }
      else if (justpressed[1]) {
          justpressed[1] = 0;
          playfile("wav2.wav");
      }
      else if (justpressed[2]) {
          justpressed[2] = 0;
          playfile("wav3.wav");
      }
      else if (justpressed[3]) {
          justpressed[3] = 0;
          playfile("wav4.wav");
      } 
      else if (justpressed[4]) {
          justpressed[4] = 0;
          playfile("wav5.wav");
      } 
      else if (justpressed[5]) {
          justpressed[5] = 0;
          playfile("wav6.wav");
      }
    }
    
    
    
    // Plays a full file from beginning to end with no pause.
    void playcomplete(char *name) {
      // call our helper to find and play this name
      playfile(name);
      while (wave.isplaying) {
      // do nothing while its playing
      }
      // now its done playing
    }
    
    void playfile(char *name) {
      // see if the wave object is currently doing something
      if (wave.isplaying) {// already playing something, so stop it!
        wave.stop(); // stop it
      }
      // look in the root directory and open the file
      if (!f.open(root, name)) {
        putstring("Couldn't open file "); Serial.print(name); return;
      }
      // OK read the file and turn it into a wave object
      if (!wave.create(f)) {
        putstring_nl("Not a valid WAV"); return;
      }
      
      // ok time to play! start playback
      wave.play();
    }
    


    donc, avec un petit digitalread bien place ca doit etre possible non?
    merci à celui ou ceux qui prendrai(en)t 10 minutes pour se pencher sur mon cas
    je continu de mon coté à bosser le dessus en début de semaine prochaine.
    a bientot
    • Partager sur Facebook
    • Partager sur Twitter
      27 avril 2012 à 22:34:09

      Oulallalala c'est dur à lire... tu peux mettre le tout dans une balise code avant qu'on commence à lire ?
      • Partager sur Facebook
      • Partager sur Twitter

      Retrouvez moi sur mon blog et ma chaine Youtube !

        29 avril 2012 à 15:28:06

        voila, c'est fait desolé, je debute en zero ;)
        • Partager sur Facebook
        • Partager sur Twitter
          29 avril 2012 à 15:52:02

          Je viens de lire ton blog, plutôt cool et merci pour les remerciements ^^

          Pour l'idée du switch, c'est tout as fait viable. C'est le principe du multiplexage. Un sélecteur permet de dire "je suis sur les musiques 1 à 4" ou je "je suis sur les musiques 5 - 8)"

          Tu pourrais m'expliquer un peu comment fonctionne tes boutons ? je suis assez curieux à ce propos (notamment le signal qu'il fournisse)

          Sinon pour revenir à ce que tu dis à la fin, oui, c'est tout a fait possible d'utiliser des potentiomètres pour les transformer en "bouton" sélecteur.

          Ainsi, tu peux partager par exemple un potentiomètre en quatres zones de 255 chacune:
          - 0-255
          - 256-512
          - 513-767
          - 768-1023

          Ensuite, dans ton code tu fais la conversion puis choisi en fonction de la valeur la musique à lancer.

          Physiquement, sur ton potentiomètre çà se traduit par quatre zones sensible.

          Si tu arrives à être "précis" avec ton potentiomètre tu peux même faire plus de zones :)

          En utilisant deux potars tu as (nombres de zones)² carrées choix.

          Sinon tu peux aussi faire un potentiomètre et un sélecteur, etc etc etc... :)
          • Partager sur Facebook
          • Partager sur Twitter

          Retrouvez moi sur mon blog et ma chaine Youtube !

            29 avril 2012 à 17:32:20

            Merci
            mes boutons sont des touches contacts avec le +5v en commun, une résistance entre la masse et chaque entre analogique relié au bouton
            euh c'est pas claire là!!!
            un shema Image utilisateur
            et ainsi de suite pour les six bouton,
            tu vois?
            je réfléchi à mon code pour mon histoire de potar ,
            à bientôt
            • Partager sur Facebook
            • Partager sur Twitter
              29 avril 2012 à 17:47:17

              Pourquoi tu mes ces boutons sur une entrée analogiques ? Pourquoi pas les mettre directement sur des entrées numériques ?
              L'avantage est qu'une lecture numérique est plus rapide qu'une conversion analogique numérique (et ca laisse les broches libres pour des futures potentiomètres)
              • Partager sur Facebook
              • Partager sur Twitter

              Retrouvez moi sur mon blog et ma chaine Youtube !

                29 avril 2012 à 17:56:49

                bein il me semble que je suis sur du numerique , si je pige bien le code , c'est juste que le shield ne me laisse pas 6 entrées libres,
                • Partager sur Facebook
                • Partager sur Twitter
                  29 avril 2012 à 18:07:47

                  Autant pour moi j'avais juste regarder ton schéma du dessus et fait le lien sur ton premier post en me disant "c'est dommage il utilise une entrée analogique alors qu'il pourrait la prendre comme numérique". Mes excuses, le code est bien paramétrer comme entrée numérique.

                  Par contre le branchement électronique ne devient plus très correct... Dans ton setup ligne 73 tu déclares tes entrées à HAUT, ce qui a pour effet de mettre des résistances de pull-up sur cette entrée (je viens moi même de découvrir quel pouvait être intégrer avec cette fonction...)
                  Si on conserve ton montage, cela aurait pour effet de drainer du courant... je vais faire un petit schéma pour expliquer et je reviens !

                  Voila un petit schéma... a gauche c'est la théorie, au milieu c'est ce que tu as, a droite c'est ce qu'il serait mieux d'avoir... J'espere que je ne fait pas d'erreur car je n'arrive pas a retrouver ce genre d'infos sur le web (comme si tout le monde voulait mettre une pull down absolument)
                  EDIT : J'ai googlé un peu et je ne dit pas de bétise !

                  Image utilisateur
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Retrouvez moi sur mon blog et ma chaine Youtube !

                    29 avril 2012 à 18:30:19

                    et ou je mettrais la jonction vers l'arduino stp? sur ton schema tu semble l'avoir zappé,
                    • Partager sur Facebook
                    • Partager sur Twitter
                      29 avril 2012 à 18:44:06

                      Nan en fait il faut considérer que tout ce qui est "en décroché" ca appartient à Arduino... Donc si on prend la broche 7 par exemple, l'interrupteur aurait une patte sur l'entrée Arduino et l'autre sur la masse. (mais attention, il faut bien sur faire attention a activer la pull-up sur l'entrée numérique, comme fait dans ton code)
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Retrouvez moi sur mon blog et ma chaine Youtube !

                        29 avril 2012 à 20:02:50

                        Attends j'édite mon dessin tu vas comprendre

                        EDIT : Voila ! En bleu c'est la carte Arduino... en pointillé c'est ce qu'il y a dans le microcontrolleur Arduino (donc que l'on voit pas)

                        C'est mieux ?

                        Image utilisateur
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Retrouvez moi sur mon blog et ma chaine Youtube !

                          29 avril 2012 à 20:56:25

                          ok je viens de tester c'est bien plus simple comme ca, du coup je retirerais ca cleen demain,
                          merci
                          • Partager sur Facebook
                          • Partager sur Twitter
                            29 avril 2012 à 21:25:05

                            Nickel alors :)
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Retrouvez moi sur mon blog et ma chaine Youtube !

                            Anonyme
                              30 avril 2012 à 17:42:02

                              je viens de penser à quelque chose : tu peux mettre plusieurs boutons pour une seule entrée analogique. En fait, tu met en série plusieurs résistances, qui créent alors plusieurs tensions en chaque point, le tout connecté à une seule entrée analogique. Donc tu va pouvoir en mettre beaucoup des boutons comme ça ! :)
                              • Partager sur Facebook
                              • Partager sur Twitter
                                30 avril 2012 à 21:52:57

                                attend attend attend!!!!!
                                je comprend pas !!!!!!!!
                                merci de me lire mais là je veux bien que tu m'en dise un peu plus,

                                sinon ma question dans la version avec des " banques" comme, je disais précédemment est ce que ca craint si je met des interupteurs basculant et que mon "LOW" reste ,suis-je claire? il y a t'il une contre indication à garder un circuit fermé sur une entré digital pour jouer sur les touches contact d'une banque ? je pense à un interrupteur multi-positions ,
                                mais avec ce que tu dit olyte ca devient ne deviens plus utile....
                                j'ai hate d'en savoir plus,
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  30 avril 2012 à 22:17:46

                                  Tu peut parfaitement prendre un interrupteur multiple-position, j'aurais même prit sa moi.
                                  Tu met une résistance de plus en plus grande à chaque borne, et voilà !
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  2b||!2b   sqrt(4b²)
                                  Anonyme
                                    30 avril 2012 à 22:23:41

                                    ben, par rapport à ton premier post (je fais abstraction de tout ce qui a été dit jusque là) où tu demandais comment avoir plus de 6 sons, je te propose une autre solution à laquelle je n'avais pas encore pensée.

                                    Cette solution consiste à créer des ponts diviseurs de tension grâce à des résistances en série et ainsi pouvoir créer plein de son juste avec une seule entrée analogique. En fait, chaque sortie des ponts diviseurs (PDT) est reliée à un bouton différent et chaque "sortie" de bouton est reliée à une seule broche analogique. En divisant ta tension de 5V par 10 par exemple pour chaque PDT, cela te fait des tensions de 0.5V. Tu en auras 10 (10 * 0.5 = 5V) et ainsi tu auras 10 sons différents. Libre à toi de diviser par un plus grand nombre s'il le faut.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      1 mai 2012 à 8:16:17

                                      oui , ok en fait c'est ce que je voulais faire avec un potentiomètre,
                                      et meme mieux, un inter rotatif 12 pistes avec des résistance soudée entre les cosses, comme ca en plus j'ai un repère dans "l'espace" avec le clic de passage d'une plage à l'autre.
                                      par contre pour coder ca...
                                      (j'en suis qu'au 7 segment moi dans vos cours)

                                      dans l'idée : ça avec une resistance de heu!!! je sortirais une calculette et une loi d'Ohme entre caque broches
                                      Image utilisateur
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Anonyme
                                        1 mai 2012 à 12:02:30

                                        ha ok, je pensais que tu préférais la solution avec plein de boutons. Pour les résistances en association, c'est sur ce chapitre. :)
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          2 mai 2012 à 0:59:46

                                          mais pour ca il me faudrait avoir l'intensité sur la broche, 'je suis pas sur que ma pince ampermetrique passe :D ) tu a une idée de ce que ca envois? pour calculer mes resistances (pour la version potentiomètre, mais c'est pour un autre projet , mais ca revient au même de toute façon .Pour ta vision de la chose, que je risque d'adopter, donc pour 10 plages soit 9 sons et un stop
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Anonyme
                                            2 mai 2012 à 8:59:41

                                            je ne suis plus sur de bien suivre le sujet, je ne comprends pas : pourquoi tu as besoin de l'intensité ? :euh:
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              2 mai 2012 à 13:18:55

                                              holla j'ai mal au crane moi , comment j’évalue la valeur de mes resistances entre chaque boutons,

                                              le cablage je l'ai bien mais les valeures je m’emmêle..Image utilisateur
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                              Anonyme
                                                2 mai 2012 à 16:35:41

                                                Tu t'en fout, tu les met toutes à la même valeur, là je vois que c'est 470Ohms, tu peux prendre ça ou bien des valeurs que tu possède. Après tu sais que la tension sera toujours à un intervalle régulier entre chaque bouton (j'ai la flemme de faire le calcul) et quelque soit la valeur de la résistance si tu prends toutes les mêmes.
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  3 mai 2012 à 11:36:39

                                                  j'ai modifié le schema, sur l'autre ca n'allait pas

                                                  Image utilisateur
                                                  ca vous parais correct?

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                  Anonyme
                                                    3 mai 2012 à 17:55:11

                                                    ça à l'air bien ;)
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      6 janvier 2013 à 8:53:39

                                                      j'avais oublié , mais je repasse par la...
                                                      si quelqu'un est sur la même problématique il y a les résistance pullup réintégrées à activer et plus besoin de s’embêter avec des résistance externes

                                                      ex
                                                      digitalWrite(10, HIGH);    // turn on pullup resistors
                                                      


                                                      voilà, maintenant je cherche comment déclencher un servo moteur qui ferais un aller retour de sa course (0°->180°->0°) suit a un appui sur un micro switch

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        6 janvier 2013 à 14:45:06

                                                        oh le déterrage ^^
                                                        pour cet aspect "résistance de pull-up intégré" nous l'avons rajouté dans le tuto :)
                                                        pour le problème du servo, je suis en train de te répondre sur ton nouveau sujet ^^
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter

                                                        Retrouvez moi sur mon blog et ma chaine Youtube !

                                                        projet son arduino

                                                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                        • Editeur
                                                        • Markdown