Aide code multiplexeur buzzer

noepham:
Je suis en première année d'étude en école d'ingénieur , on a commencé a parlé des multiplexeurs et des diviseurs la semaine dernière . Outre le jugement personnel qui ne me semble pas être validée dans la dite charte que vous avez mentionnées plutôt , je vous répète depuis tout à l'heure que je n'ai pas de problème avec le concept , je l'ai compris. Je me demande simplement comment choisir sur Arduino un des signal possible , merci

Ah, école d'ing, OK. On prend les mecs et on les balance à la flotte sans leur avoir expliqué les mouvements pour nager. C'est une méthode. En l'occurrence ils n'ont qu'à aller chercher les infos sur Internet. S'il y a des coups de pied au cul qui se perdent, ce ne sont pas les élèves mis dans cette situation qui les méritent...

D'ailleurs, si vous êtes en école d'ing vous avez du faire une prépa, et dans les prépas maintenant on fait de l'initiation à la programmation informatique, souvent en python. Donc vous devriez savoir qu'on peut déclarer une variable entière et l'incrémenter sans avoir besoin d'écrire des "if". Je retire donc ce que j'ai écrit plus haut et vous invite à méditer pour savoir qui mérite le coup de pied au cul.

kamill:
Bonjour,

Comme il a été dit plus haut il faut que tu gères un compteur de 0 à 4. Il est incrémenté par l'appui sur le bouton.
Ensuite tu mets le bit 0 de ton compteur sur la sortie 4, le bit 1 sur la sortie 3 et le bit 2 sur la sortie 2.

Bonjour,
je vois très bien mais j'ai pas vu comment le faire donc je vois pas.

tone(buzzer,valeur_pwm);

Le sujet ne parle pas de note variable. Il parle de fréquence fixe:

La PWM émanant de la broche D5 de l'Arduino a une fréquence d'environ 980 Hz.

Dans votre projet, Arduino fabrique une seule fréquence, celle du PWM que vous ne pouvez pas changer facilement. Vous pouvez juste changer le rapport cyclique et comme il y a un buzzer derrière, cela impose la valeur. Pour plus d'info:
-> PWM
-> fonction analogWrite.


etat=digitalRead(bouton) ;

Pour être tranquile, on recommande de mettre le bouton en entrée. Mais cela devrait fonctionner car le micro met ses entrées par défaut à l'initialisation en entrée. Même moi qui suis économe en code, je programme mes pins en entrées.
mais sur le schéma, il n'y a pas de résistance de pulldonw comme demandé ("bouton poussoir avec résistance de pulldown"). Souvent avec une Uno, on utilise les pullup car il y an a dans le micro. Mais c'est plus compliqué à comprendre.

int pin=12;
int valeur_pwm=0;
char buzzer=12;
int bouton=7;
int etat;
int compteur=0;

Pour celui qui lit ce n'est pas facile à suivre. Dedans, il y a des n° de broches et des variables. Un nom un peu plus explicite ou mieux un commentaire permet d'éclaircir

le N°12 sort deux fois. C'est le numéro de la broche? c'est une valeur à envoyer?

la pin 12 doit être une entrée parce qu'elle est reliée à une sortie (celle du multiplexeur) et on ne relie pas deux sorties ensemble en général. Si l'une impose un 0V et que l'autre impose un 5V, il y a un problème. La pin 12 doit servir plus tard, dans une question ultérieure.

int pin=12;

Pin? laquelle? Pourquoi faire?
Il vaut mieux écrire:
int pinSortieMultiplexeur=12;
int pin; // Broche pour lire le signal en sortie du multiplexeur
....


void setup() {
pinMode(pin,OUTPUT);
etat=digitalRead(bouton);
}

Dans l'initialisation on est au moins obligé de déclarer les broches qui sont des sorties. Ici c'est D
, D3, D4 et D5. Si onne met pas ces broches en tant que sortie, elle resteront en entrée.
La broche pin doit être en entrée (voir plus haut)
Le setup est exécuté une fois pour toutes. Une fois seulement. Donc la lecture du bouton ne pouvant pas être fait qu'une seule fois, elle doit être dans loop et pas dans setup.


digitalWrite(pin,valeur_pwm);

Quel est le signal qui doit sortir du PWM? Sur quelle broche le signal doit sortir?


if(etat==LOW)
{
compteur++;
if(compteur>4)
compteur=0
}

Il n'est pas marqué le compteur s'incrémente tant que le bouton est LOW sinon si on laisse le doigt appuyé dessus, on aurait une incrémentation toutes les 10µs environ. Quand on lache on a plutôt une valeur au hasard. C'est au moment ou on appuie qu'il faut incrémenter le compteur. Il faut donc mémoriser que l'on en a déjà tenu compte. Une image: on te charge de donner une collation chaque fois qu'une personne franchit la porte. Quand une personne arrive tu lui donne l'apéro. Mais une fois le tour de salle fait, tu ne lui donne pas de nouveau l'apéro. Tu as mémorisé que tu lui a déjà offert. Quand elle sort, tu efface ta mémoire et ainsi si elle rentre de nouveau, elle aura un nouveau verre. C'est pareil pour le bouton.

Il y a aussi précisé un délai de 100ms pour l'anti rebond.


tone(buzzer,valeur_pwm);
delay(1000);
noTone(buzzer);

On n'a pas à faire du bruit ou pas, on récupère le bruit du PWM

je vois très bien mais j'ai pas vu comment le faire donc je vois pas.

Il y a beaucoup de choses à faire en même temps. au début, tu peux scinder le problème en plusieurs morceaux:

  • mettre la sortie D5 pour qu'elle délivre un signal à 980Hz
  • incrémenter le compteur quand on appuie sur le bouton
  • envoyer le compteur sur le multiplexeur.

C'est presque trois tâches indépendantes. On peut en régler une puis l'autre... En essayant de faire tout en même temps, cela risque d'embrouiller. Si on fait une tâche après l'autre on a l'impression d'avancer. Et on peut dépanner facilement un petit code.

int valeur_pwm=0;//valeur pwm
char buzzer=12;//pin buzzer
int bouton=7;//pin bouton
int etat;//etat bouton
int compteur=0;
int rebond =millis();
int derniertemps=0;
int sortiemux=12;


void setup() {
pinMode(sortiemux,OUTPUT);

pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(3,OUTPUT);
pinMode(2,OUTPUT);



digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(3,HIGH);
digitalWrite(2,HIGH);


}

void loop() {
analogWrite(valeur_pwm,980);
etat=digitalRead(bouton);

if(etat==HIGH && rebond-derniertemps>100)
 compteur++;

if(compteur>4)
compteur=0;
}

if(compteur==0)
{
  //Sortie mux 4

}

if(compteur==1)
{
//Sortie mux 3

}


if(compteur==2)
{
//Sortie mux 2

}

if(compteur==3)
{
//Sortie mux 1

}

if(compteur==4)
{
digitalWrite(3,bitRead(0,4);

}

tone(buzzer,valeur_pwm);
delay(1000);
noTone(buzzer);

}

Pour la sortie du mux c'est comme ça ?

Pour faire les choses bien tu commences par donner un nom aux sorties

const byte S0=4;
const byte S1=3;
const byte S2=2;

Ensuite tu positionnes les sorties en fonction de l'état des bits de compteur

  digitalWrite(S0, bitRead(compteur,0));
  digitalWrite(S1, bitRead(compteur,1));
  digitalWrite(S2, bitRead(compteur,2));

Tu pourrais faire une boucle, mais pour 3 sorties ça ne vaut pas le coup.

kamill:
Pour faire les choses bien tu commences par donner un nom aux sorties

const byte S0=4;

const byte S1=3;
const byte S2=2;




Ensuite tu positionnes les sorties en fonction de l'état des bits de compteur


digitalWrite(S0, bitRead(compteur,0));
  digitalWrite(S1, bitRead(compteur,1));
  digitalWrite(S2, bitRead(compteur,2));

Du coup je mets dans les if ?

Il n'y a pas de if!

Est ce que tu comprends ce qu'il faut faire?
Compteur a une certaine valeur et tu dois recopier les 3 bits de poids faible de cette valeur sur les sorties S0, S1, S2

Par exemple si compteur vaut 3

en binaire ça donne 00000011
Donc il faut mettre 1 'dans' S0, 1 dans S1, 0 dans S2 (en partant du bit de poids le plus faible)

kamill:
Est ce que tu comprends ce qu'il faut faire?
Compteur a une certaine valeur et tu dois recopier les 3 bits de poids faible de cette valeur sur les sorties S0, S1, S2

Par exemple si compteur vaut 3

en binaire ça donne 00000011
Donc il faut mettre 1 'dans' S0, 1 dans S1, 0 dans S2 (en partant du bit de poids le plus faible)

int valeur_pwm=0;//valeur pwm
char buzzer=12;//pin buzzer
int bouton=7;//pin bouton
int etat;//etat bouton
int compteur=0;
int rebond =millis();
int derniertemps=0;
int sortiemux=12;

const byte S0=4;
const byte S1=3;
const byte S2=2;

void setup() {

pinMode(sortiemux,OUTPUT);

pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(3,OUTPUT);
pinMode(2,OUTPUT);



digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(3,HIGH);
digitalWrite(2,HIGH);


}

void loop() {
analogWrite(valeur_pwm,980);
etat=digitalRead(bouton);

if(etat==HIGH && rebond-derniertemps>100)
 {compteur++;

if(compteur>3)
compteur=0;
}

Serial.print("Voie");
Serial.print(compteur);
Serial.print(" : ");
Serial.println(Sortie(compteur));

tone(buzzer,valeur_pwm);
delay(1000);
noTone(buzzer);

}

int Sortie(byte compteur) {
  
  // On sélectionne la voie
  digitalWrite(S0, bitRead(compteur, 0));
  digitalWrite(S1, bitRead(compteur, 1));
  digitalWrite(S2, bitRead(compteur, 2));
 
  // On lit la valeur courante
  analogRead(5);
}

D'accord , du coup ceci fonctionne ?

Quand tu essaies ça fonctionne ?

Formates correctement ton code (avec ctrl t).

  • tu crées une fonction Sortie() que tu n'appelles jamais.
  • c'est quoi cet appel à tone? Le cahier des charges impose un signal pwm. De plus la pin 12 n'est pas une sortie car elle serait connectée à une autre sortie du multiplexeur. Le cahier des charges n'en parle pas, mais elle pourrait être utilisée pour mesurer la période de sortie.
  • compteur ne va pas de 0 à 3 mais de 0 à 4
    ...

kamill:
Quand tu essaies ça fonctionne ?

Formates correctement ton code (avec ctrl t).

  • tu crées une fonction Sortie() que tu n'appelles jamais.
  • c'est quoi cet appel à tone? Le cahier des charges impose un signal pwm. De plus la pin 12 n'est pas une sortie car elle serait connectée à une autre sortie du multiplexeur. Le cahier des charges n'en parle pas, mais elle pourrait être utilisée pour mesurer la période de sortie.
  • compteur ne va pas de 0 à 3 mais de 0 à 4
    ...

J'appelle la fonction sortie dans le serial.println car ils demandent plus tard de vérifier au serial tracer les différents signal pwm que l'on peut obtenir du multiplexeur, concernant le buzzer s'il n'est pas connecté à la pin 12 , sur quelle pin est-elle connecté ?

Je n'avais pas vu l'appel à Sortie().
On n'appelle pas une fonction qui fait quelque chose sur les sorties dans une fonction d'affichage (c'est correct qu point de vue syntaxique, mais c'est source de beaucoup d'erreurs). De plus qu'est ce que c'est supposé afficher? La fonction Sortie ne retourne rien!

Le buzzer est connecté sur la sortie du multiplexeur (c'est le but de toute cette manip).

int valeur_pwm=0;//valeur pwm
char buzzer=12;//pin buzzer
int bouton=7;//pin bouton
int etat;//etat bouton
int compteur=0;
int rebond =millis();
int derniertemps=0;
int sortiemux=12;

const byte S0=4;
const byte S1=3;
const byte S2=2;

const byte y=5;

void setup() {

pinMode(sortiemux,OUTPUT);

pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(3,OUTPUT);
pinMode(2,OUTPUT);



digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(3,HIGH);
digitalWrite(2,HIGH);


}

void loop() {
analogWrite(valeur_pwm,980);
etat=digitalRead(bouton);

if(etat==HIGH && rebond-derniertemps>100)
 {compteur++;

if(compteur>4)
compteur=0;
}




digitalWrite(S0, bitRead(compteur, 0));
digitalWrite(S1, bitRead(compteur, 1));
digitalWrite(S2, bitRead(compteur, 2));



Serial.print("Voie");
Serial.print(compteur);
Serial.print(" : ");
Serial.println(digitalRead(y));


tone(y,digitalRead(y));
delay(1000);
noTone(y);

}

Donc cela marche comme ça ?

Non

pinMode(sortiemux, OUTPUT); <- la pin 12 n'est pas une sortie

analogWrite(valeur_pwm, 980); <- c'est supposé faire quoi ? valeur_pwm vaut 0 ??

tone(y, digitalRead(y)); <- il n'y a pas a utiliser tone, c'est quoi y ? de plus qu'est ce que va donner digitalRead(y)?

kamill:
pinMode(sortiemux, OUTPUT); <- la pin 12 n'est pas une sortie

analogWrite(valeur_pwm, 980); <- c'est supposé faire quoi ? valeur_pwm vaut 0 ??

tone(y, digitalRead(y)); <- il n'y a pas a utiliser tone, c'est quoi y ? de plus qu'est ce que va donner digitalRead(y)?

int valeur_pwm=0;//valeur pwm
char buzzer=12;//pin buzzer
int bouton=7;//pin bouton
int etat;//etat bouton
int compteur=0;
int rebond =millis();
int derniertemps=0;
int sortiemux=12;

const byte S0=4;
const byte S1=3;
const byte S2=2;

const byte y=5;//sortie mux

void setup() {

pinMode(sortiemux,INPUT);

pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(3,OUTPUT);
pinMode(2,OUTPUT);

digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(3,HIGH);
digitalWrite(2,HIGH);


}

void loop() {
analogWrite(5,980);
etat=digitalRead(bouton);

if(etat==HIGH && rebond-derniertemps>100)
 {
 compteur++;
if(compteur>4)
compteur=0;
}

digitalWrite(S0, bitRead(compteur, 0));
digitalWrite(S1, bitRead(compteur, 1));
digitalWrite(S2, bitRead(compteur, 2));



Serial.print("Voie");
Serial.print(compteur);
Serial.print(" : ");
Serial.println(analogRead(y));

tone(y,analogRead(y));
delay(1000);
noTone(y);

}

Y c'est la sortie du multiplexeur

noepham:
Y c'est la sortie du multiplexeur

??????????????

Vires moi ce tone
Pour sortir un signel pwm c'est analogWrite

Je crois que le programme est trop gros pour toi pour être traité en une seule fois. Et les trois parties que j'ai décrites

  • mettre la sortie D5 pour qu'elle délivre un signal à 980Hz
  • incrémenter le compteur quand on appuie sur le bouton
  • envoyer le compteur sur le multiplexeur.

sont quasi indépendantes. Quand tu écris tone(), on ne sait pas ce que tu pense pouvoir faire avec. Si tu veux avancer, commence déjà par faire seulement le premier point. Si celui-là ne marche pas, ce n'est pas la peine d'aller plus loin.
Si tu veux travailler sur les trois tâches il ne faut pas qu'elle soient mélanger au début. Une fois que châque tâche est comprise, on les assemblera.
Tu pourras voir par exemple que tone, sortiemux... n'appartiennent à aucune tâche.

Moi, je veux bien t'aider, mais en commençant par le début et pas par la fin. Au d"ébut, on a des briques, à la fin on a un seul code.

vileroi:
Je crois que le programme est trop gros pour toi pour être traité en une seule fois. Et les trois parties que j'ai décrites

sont quasi indépendantes. Quand tu écris tone(), on ne sait pas ce que tu pense pouvoir faire avec. Si tu veux avancer, commence déjà par faire seulement le premier point. Si celui-là ne marche pas, ce n'est pas la peine d'aller plus loin.
Si tu veux travailler sur les trois tâches il ne faut pas qu'elle soient mélanger au début. Une fois que châque tâche est comprise, on les assemblera.
Tu pourras voir par exemple que tone, sortiemux... n'appartiennent à aucune tâche.

Moi, je veux bien t'aider, mais en commençant par le début et pas par la fin. Au d"ébut, on a des briques, à la fin on a un seul code.

Incrémentation du compteur

int compteur=0;
int rebond=millis();
int derniertemps=0;
int etat;
int bouton=7;



void setup() {
  // put your setup code here, to run once:

}

void loop() {

etat=digitalRead(bouton);

if(etat==HIGH && rebond-derniertemps>100)
 {
 compteur++;
 derniertemps=rebond;
if(compteur>4)
compteur=0;
}
}

Sortie D5 pour qu'elle délivre un signal à 980hz

int pin5=5;
int valeur_pwm=0;

void setup() {

Serial.begin(9600);
pinMode(pin5,INPUT);
}

void loop() {

analogWrite(pin5,980);
Serial.println(valeur_pwm);
}

Envoyer le compteur sur le multiplexeur

const byte S0=4;
const byte S1=3;
const byte S2=2;

void setup() {
pinMode(4,OUTPUT);
pinMode(3,OUTPUT);
pinMode(2,OUTPUT);

}

void loop() {
for(int i=0;i++;i<4)
{
digitalWrite(S0, bitRead(i, 0));
digitalWrite(S1, bitRead(i, 1));
digitalWrite(S2, bitRead(i, 2));
}

}