Aller au contenu


Photo
- - - - -

Fonction Beep avec buzzer sous arduino


  • Veuillez vous connecter pour répondre
19 réponses à ce sujet

#1 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 03 mars 2016 - 08:30

Bonjour à tous,

 

J'ai codé une fonction pour utiliser un buzzer 5v afin de l'utiliser sur mon robot la fonction pourra être utiliser pour generer un beep ou plusieurs avec une intensité régable , une durée On et Off ...

 

J'ai codé cette fonction pour la durée et l'instensité pour l'instant ...

 

 

Alors qd je mets cette fonction Beep() dans la loop elle fonctionne bien, jai le beep On Off avec l'intensité réglable qui fonctionne ...

 

Je vais l'utiliser pour la marche arrière et pour signaler les obstacles ....

 

par contre qd je declenche ma fonction à partir du void setup par exemple j'ai un beep en continu et pareil dans le switch case ...

 

 

dans la void loop cela fonctionne correctement ! je ne comprends pas trop pourquoi !!

#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Ultrasonic.h>

LiquidCrystal lcd(52, 50, 48, 46, 44, 42);


#define ONE_WIRE_BUS 22
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature ds18b20(&oneWire);

#define T1  24
#define E1  26
#define T2  23
#define E2  25
#define T3  27
#define E3  28
Ultrasonic ultrasonic1(T1, E1);
Ultrasonic ultrasonic2(T2, E2);
Ultrasonic ultrasonic3(T3, E3);
// Moteur A
int dir1PinA = 13;
int dir2PinA = 12;

// Moteur B
int dir1PinB = 11;
int dir2PinB = 8;

// Vitesse Moteur
int speedPinA = 10;
int speedPinB = 9;

int buzzerPin = 2;

int speed = 0;
char incomingByte;

long timedatasend = 1000;
long previousMillis = 0;

long timerefreshLCD = 1000;
long previousMillisLCD = 0;

long previousMillisBuzzer = 0;

int beepdone = 0;

const long timerefreshLED = 250;
long previousMillisLED = 0;
int ledCameraState = LOW;
const int ledCameraPin = 28;
 

float U1 = 0;

void setup() {
  ds18b20.begin();
  lcd.begin(16, 2);
  Serial.begin(115200);
  lcd.print("KBOT");

  pinMode(dir1PinA, OUTPUT);
  pinMode(dir2PinA, OUTPUT);
  pinMode(speedPinA, OUTPUT);
  pinMode(dir1PinB, OUTPUT);
  pinMode(dir2PinB, OUTPUT);
  pinMode(speedPinB, OUTPUT);

  pinMode(ledCameraPin, OUTPUT);

  speed = 100;

  
}

float temperature(){
ds18b20.requestTemperatures();
return ds18b20.getTempCByIndex(0);
}

float ultrason(){
long microsec = ultrasonic1.timing(); 
float cmMsec = ultrasonic1.convert(microsec, Ultrasonic::CM);  
}


void beep(int buzzerpwm, int timebuzzerOn, int timebuzzerOff){
long currentMillis = millis();
if (beepdone == 0){
    if(currentMillis - previousMillisBuzzer > timebuzzerOn) {
        previousMillisBuzzer = currentMillis;
        analogWrite(buzzerPin, buzzerpwm);
        beepdone = 1;
    }
}
if (beepdone == 1){
    if(currentMillis - previousMillisBuzzer > timebuzzerOff) {
        previousMillisBuzzer = currentMillis;
        analogWrite(buzzerPin, 0);
        beepdone = 0;
    }
}
}

void loop() 
{

  if (Serial.available() > 0) {
  lcd.setCursor(0, 0);
  lcd.print("KBOT CONNECTED"); 
  incomingByte = Serial.read();
  //Serial.println(incomingByte, DEC);
  analogWrite(speedPinA, speed);
  analogWrite(speedPinB, speed);
  switch (incomingByte)
    {
    case 'A':
      analogWrite(speedPinA, speed);
      analogWrite(speedPinB, speed);
      digitalWrite(dir1PinA, LOW);
      digitalWrite(dir2PinA, HIGH);
      digitalWrite(dir1PinB, HIGH);
      digitalWrite(dir2PinB, LOW);
      break;
    case 'B':
      digitalWrite(dir1PinA, LOW);
      digitalWrite(dir2PinA, LOW);
      digitalWrite(dir1PinB, LOW);
      digitalWrite(dir2PinB, LOW);
      break;
    case 'C':
      analogWrite(speedPinA, speed);
      analogWrite(speedPinB, speed);
      digitalWrite(dir1PinA, HIGH);
      digitalWrite(dir2PinA, LOW);
      digitalWrite(dir1PinB, LOW);
      digitalWrite(dir2PinB, HIGH);
      break;
    case 'D':
      analogWrite(speedPinA, speed);
      analogWrite(speedPinB, speed);
      digitalWrite(dir1PinA, LOW);
      digitalWrite(dir2PinA, HIGH);
      digitalWrite(dir1PinB, LOW);
      digitalWrite(dir2PinB, HIGH);
      break;
    case 'G':
      analogWrite(speedPinA, speed);
      analogWrite(speedPinB, speed);
      digitalWrite(dir1PinA, HIGH);
      digitalWrite(dir2PinA, LOW);
      digitalWrite(dir1PinB, HIGH);
      digitalWrite(dir2PinB, LOW);
      break;
    default:
      Serial.print("commande : ");
      Serial.print(incomingByte);
      break;
    
      }
    
 
 }

unsigned long currentMillis = millis();
if(currentMillis - previousMillis > timedatasend) {
    previousMillis = currentMillis;  
    //float sondetemperature = temperature();
    float sondetemperature = 35;
    U1 = ultrason();
    Serial.println(sondetemperature);
    Serial.println(U1);
    }


currentMillis = millis();
if(currentMillis - previousMillisLCD > timerefreshLCD) {
    previousMillisLCD = currentMillis;
    lcd.clear();
    lcd.print("U1 :");  
    lcd.print(U1);
    }

currentMillis = millis();
if(currentMillis - previousMillisLED > timerefreshLED) {
    previousMillisLED = currentMillis;
    if (ledCameraState == LOW) {
      ledCameraState = HIGH;
    } else {
      ledCameraState = LOW;
    }

    digitalWrite(ledCameraPin, ledCameraState);
}


 
beep(255,50,50);
}

    
   


Cordialement,

bypbop



#2 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 03 mars 2016 - 09:59

Je viens de remarquer une autre chose ... j'ai timeOn et timeOff qui s'inverse dans ma fonction

 

qd je fais : beep(255,5000,250);

 

J'ai un blanc de 5000 et 250 ms de beep

 

alors que cela devrait etre l'inverse ...

 

pour le buzzerpwm c'est ok ...



#3 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 504 messages
  • Gender:Male
  • Location:Paris

Posté 03 mars 2016 - 10:43

Salut bybop,

Si je comprends bien ta procédure beep, elle doit être appelée plusieurs fois pour fonctionner.

Une première fois pour se déclencher et une 2eme fois pour s'arrêter.

Ce qui explique qu'elle fonctionne bien dans la loop ;)

Dans le setup, c'est executé qu'une seule fois donc elle commence mais ne s'arrête pas.

Dans le switch, il faut repasser dans le même case pour s'arrêter.

Si tu veux arrêter le beep avant la durée fixée par le premier appel, il faudra une autre procédure pour l'arrêt qui fait juste :

analogWrite(buzzerPin, 0);
beepdone = 0;



#4 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 03 mars 2016 - 11:09

c est exactement ca !! 



#5 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 03 mars 2016 - 11:14

Donc je dois créer une fonction pr l'l'arrêt et qui genre le temps de l'arret ?

 

genre void stop beep ( int buzzeroff) {

 

analogWrite(buzzerPin, 0);
beepdone = 0;

 

}

 

cordialement,

bypbop



#6 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 03 mars 2016 - 11:46

Je pense que si je veux l'utiliser plusieurs fois facilement je vais devoir l'inclure dans mon loop plutot ? non ?

 

si par exemple je veux utiliser un beep pour une alarme sur mes ultrasons en faisant varier la durée et la frequence du beep ...

ou un beep au demarrage ...

 

l'idée c'est de coder une fonction que je peux utiliser pour plusieurs choses ...

 

cdlt,

bypbop 



#7 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 504 messages
  • Gender:Male
  • Location:Paris

Posté 04 mars 2016 - 07:39

Si je devais faire ce code, je ferai 2 procédures. Une pour le start buzz, et une autre pour le stop.

 

Tu start là ou tu as besoin et tu place le stop dans ta boucle principale.

 

Le stop se charge de veiller à la durée de ton beep.

Si tu stop un beep déjà stoppé, pas de conséquence.

 

Si tu start un beep déjà en cours, à toi de voir : tu prolonges avec la nouvelle durée / fréquence ou pas, tu ignores ou pas.

Prolonger implique de reset les valeurs déjà placées pour le premier beep.

 

Tu devras aussi sortir des variables pour les placer globalement ou faire une classe de gestion de ton buzzer <- le plus joli ;)



#8 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 06 mars 2016 - 08:31

Merci Path je regarde tt ça et je te tiens au jus



#9 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 08 mars 2016 - 08:30

Re,

cela fonctionne mais je n'arrive pas à recuperer le timebuzzerOn dans la fonction stopbeep()

 

Alors j'ai séparé en deux fonctions ! une je démarre le beep avec son pwm et sa durée et je stop dans la fonction qui est dans la boucle ...

 

 

qd je fixe la durée cela fonctionne bien !



#10 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 09 mars 2016 - 08:26

j'ai fait ceci : 

void beep (int buzzerpwm, int timebuzzerOn)
{
  analogWrite(buzzerPin, buzzerpwm);
  }

dans le loop :


currentMillis = millis();

    if(currentMillis - previousMillisBuzzer > timebuzzerOn) {
        previousMillisBuzzer = currentMillis;
        analogWrite(buzzerPin, 0);
    }

j'ai essayé de mettre dans la fonction beep un return timebuzzerOn mais cela ne compile pas



Karduino.ino: In function 'void beep(int, int)':
Karduino:104: error: return-statement with a value, in function returning 'void' [-fpermissive]
return-statement with a value, in function returning 'void' [-fpermissive]

cdlt,

bypbop



#11 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 934 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 09 mars 2016 - 09:10

En fait ça fait plusieurs fois que je lis le sujet ( à chaque fois qu'une réponse est posée ) mais je n'arrive pas à bien comprendre ce que tu cherches à faire en fait ... 


Il y a plusieurs chose à différencier : 

1) Vouloir avoir un buzzer qui sonne et vouloir faire d'autre choses en même temps // ce que tu avais dans ton loop 

=> Fonction non bloquante , donne l'impression de faire plusieurs chose en même temps . 

2) Vouloir avoir un buzzer qui sonne N fois ou pendant un temps t avant de faire autre chose // ce que tu sembles vouloir faire dans ton setup ... 

=> Fonction bloquante . 

Ce sont deux types de fonctions différentes. 

Ensuite si tu veux tu peux aller jusqu'à décomposer ces fonctions en sous fonction 

=> Celle qui allume le buzzer avec une tonalité donnée 
=> Celle qui éteint le buzzer 

 


 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#12 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 09 mars 2016 - 09:48

Bonjour Mike118,

Oui j'ai modifié la fonction de départ en effet ! la je cherche à démarrer mon buzzer avec une tonalité et un temps ! au départ je voulais aussi ajouter un nombre de bip mais on verra ca avec une autre fonction.

 

alors la :

void beep (int buzzerpwm, int timebuzzerOn)
{
analogWrite(buzzerPin, buzzerpwm);
}

je demarre le beep et je donne une durée

 

dans le loop je regarde le temps et je stoppe le bip cela fonctionne bien qd je fais ceci, en fixant à 1000 par exemple

currentMillis = millis();

if(currentMillis - previousMillisBuzzer > 1000) {
previousMillisBuzzer = currentMillis;
analogWrite(buzzerPin, 0);
}

mais qd je souhaite recuperer timebuzzerOn cela ne marche plus !

currentMillis = millis();

if(currentMillis - previousMillisBuzzer > timebuzzerOn) {
previousMillisBuzzer = currentMillis;
analogWrite(buzzerPin, 0);
}

Cordialement,

bypbop



#13 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 504 messages
  • Gender:Male
  • Location:Paris

Posté 09 mars 2016 - 10:31

Il est global comment ton timebuzzerOn ?

A quel moment tu y accède ?

Je pensais à un truc du genre :

int duree;
int startedAt;

void beep (int buzzerpwm, int timebuzzerOn)
{
  duree = timebuzzerOn;
  startedAt = millis();
  analogWrite(buzzerPin, buzzerpwm);
}

// a appeler dans le loop
void stopBeepAtEnd () {
  currentMillis = millis();
  if(currentMillis - startedAt > duree) {
    analogWrite(buzzerPin, 0);
  }
}



#14 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 09 mars 2016 - 11:07

alors j'essaye de comprendre un peu en mm tps !!

 

j'ai viré ta variable startedAt et j'ai remis previousmillisbuzzer je pense que c'est pareil !

 

par contre le duree ne fonctionne pas je suis obligé de fixer la durée dans stopbeep()

void beep (int buzzerpwm, int timebuzzerOn)
{
  analogWrite(buzzerPin, buzzerpwm);
  int duree = timebuzzerOn;
  long previousMillisBuzzer = millis();
  }

void stopBeepAtEnd () {
long  currentMillis = millis();
if(currentMillis - previousMillisBuzzer > duree) {
    previousMillisBuzzer = currentMillis;
    analogWrite(buzzerPin, 0);
  }
}

qd je remplace duree par 1000 cela fonctionne ...



#15 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 09 mars 2016 - 11:10

pourquoi on peut pas recuperer timebuzzerOn ?



#16 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 504 messages
  • Gender:Male
  • Location:Paris

Posté 09 mars 2016 - 11:54

De ce que je vois, timebuzzerOn n'existe que dans ta fonction beep.
Et pareil pour duree.

C'est pour cela que je déclare duree en dehors des fonctions.

#17 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 934 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 10 mars 2016 - 04:03

De ce que je vois, timebuzzerOn n'existe que dans ta fonction beep.
Et pareil pour duree.

C'est pour cela que je déclare duree en dehors des fonctions.

 

Soit il te faut utiliser les variables globales , 

Soit tu utilises un pointeur 

Après tu peux aussi créer une structure, ou bien faire une librairie et créer une classe Buzzer...  

Bon après tu as déjà des librairies qui existent pour cela : https://www.arduino....m=Tutorial.Tone

 

Et sans librairie tu as aussi des codes d'exemple : https://www.arduino....rial/PlayMelody
 

 

Perso j'encourage le fait de chercher à faire les choses par soit même plutôt que reprendre " bêtement l'existant" car c'est beaucoup plus formateur ;) 
Mais j'encourage aussi à regarder ce qui se fait déjà pour prendre exemple, comprendre et du coup faire mieux ou à minima au aussi bien, que l'existant ;) 

Bonne continuation en tout cas. 

Par contre quoi qu'il en soit si tu veux faire des fonctions " non bloquante" ( pour que le reste de ton code s'exécute un peu comme si c'était en "parallèle" , il va falloir soit que tu joues avec les interruption (ce que je te conseille )  soit que tu joue avec millis un peu partout dans ton code ( ce que je ne te conseil pas , non pas que ça ne marche pas, juste que tu verras que c'est plus simple à mettre en place au début mais ça devient rapidement beaucoup plus chiant à utiliser... )  


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#18 Nulentout

Nulentout

    Membre occasionnel

  • Membres
  • Pip
  • 82 messages
  • Gender:Male

Posté 29 mai 2016 - 10:36

Coucou les copains,

je n'ai peut être pas saisi la finesse de ce que désire faire bypbop, mais si c'est juste faire "couiner" en quelconque buzzer à une tonalité précise durant un délai spécifié, il y a l'instruction tone qui est faite pour ça. Si ça se trouve c'est la solution la plus simple.



#19 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 29 mai 2016 - 11:59

Merci Nulentout,

 

Oui j'avais essayé la fonction Tone !

 

J'avais essyé de faire une fonction avec n Bip et en spécifiant une durée ...

 

Cela fonctionne bien maintenant ;-)

 

@ tte



#20 Jan

Jan

    Webmaster

  • Membres
  • PipPipPipPipPip
  • 4 747 messages
  • Gender:Male
  • Location:Rhône Alpes

Posté 29 mai 2016 - 12:04

 

Cela fonctionne bien maintenant ;-)

 

N'hésites pas à mettre ici la solution que tu as trouvé au final. ça permettra aux lecteurs de passage de trouver la réponse à leur recherche ;)






0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users