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)
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
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...
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
et ainsi de suite pour les six bouton,
tu vois?
je réfléchi à mon code pour mon histoire de potar ,
à bientôt
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)
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 !
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)
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 !
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,
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à !
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.
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
mais pour ca il me faudrait avoir l'intensité sur la broche, 'je suis pas sur que ma pince ampermetrique passe ) 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
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.
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
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
× 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.
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !