Go Down

Topic: [Partage] Boutons Poussoirs (Read 11327 times) previous topic - next topic

bricoleau

Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

J-M-L

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

bricoleau

V4.1 du 16/11/2016

Compatibilité ESP8266 (testé sur wemos)

Attention : les exemples fournis sont basés sur les numéros de pin d'une arduino uno, à modifier pour fonctionner sur un wemos. Par exemple :
Code: [Select]
const uint8_t pin_bouton = 3;//cablage pin---BP---GND
 doit être modifié en
Code: [Select]
const uint8_t pin_bouton = D3;//cablage pin---BP---GND

Retourner en début de topic pour accéder au téléchargement
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

buldo


J-M-L

J'avais noté de signaler cela:

Petite modification nécessaire ligne 15 --> rajoutez un cast sinon l'opération ~ va générer un int et on aura un warning à la compilation

Code: [Select]
const uint8_t masque_pin_simpleBouton = (uint8_t) ~(masque_etat_simpleBouton | masque_chgt_simpleBouton);
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

J-M-L

#35
Jan 06, 2019, 03:20 pm Last Edit: Jan 06, 2019, 03:42 pm by J-M-L
Salut @bricoleau

j'ai acquis il y quelques temps tout un lot de boutons momentanés avec LED intégrée

que je souhaitais utiliser dans le cadre de travaux pratiques de découverte, soit en simple bouton momentané, soit avec allumage de la LED, soit avec association d'un son par le biais d'un Piezo.



Comme je voulais simplifier initialement la gestion de ces boutons, je me suis dit que partir de votre librairie ne pouvait pas faire de mal - mais plutôt que de gérer la LED ou le PIEZO lors des actions, je me suis dit qu'il serait sympa d'intégrer ces boutons particuliers à votre librairie en tant que sous classe.

J'ai donc modifié un tout petit peu la classe simpleBouton pour modifier la déclaration de
Code: [Select]
bool actualiser(); //retourne true si l'état du bouton a changé
 en
Code: [Select]
virtual bool actualiser(); //retourne true si l'état du bouton a changé
de façon à pouvoir gérer correctement l'héritage

J'en ai aussi profité pour modifier une ligne dans le .cpp qui donne un warning avec la dernière version de l'IDE
Code: [Select]
const uint8_t masque_pin_simpleBouton = (uint8_t) ~(masque_etat_simpleBouton | masque_chgt_simpleBouton);

en rajoutant le cast en (uint8_t) parce que (masque_etat_simpleBouton | masque_chgt_simpleBouton) ou le résultat du complément à 1 est automatiquement promu en int (sur 2 octets).

J'ai donc créé deux nouvelles classes ledBouton et ledPiezoBouton qui héritent de simpleBouton
Code: [Select]
class ledBouton : public simpleBouton
class ledPiezoBouton : public ledBouton


Les constructeurs sont simples, pour le ledBouton on prend un paramètre en plus qui dit quelle est la pin associée à la LED et pour le ledPiezoBouton il y a encore une pin de plus qui dit quelle est la pin associée à son piezo.

Je voulais aussi pouvoir prendre l'approche "machine à état" et utiliser des callbacks, mais j'ai eu un peu la flemme de partir sur ce que vous aviez fait avec la classe boutonAction alors j'en propose une toute nouvelle boutonRetroAction qui reprend globalement l'intégralité de votre travail, sauf que cette classe attend en entrée de son constructeur un pointeur sur un simpleBouton (ou sous classe) déjà instancié. J'ai aussi profité de la modification pour changer la signature des clicks (simple, double, triple) pour passer en paramètre l'instance du bouton qui déclenche le callback. ça permet ainsi d'avoir la même fonction associée à plusieurs boutons et de différencier au sein de la fonction qui est le bouton appelant. Je trouve que ça donne comme cela plus de flexibilité.

Je mets un code de test + les 2 fichiers principaux de la nouvelle version en PJ dans le zip (trop gros pour poster directement) qui va avec ce petit montage



Le bouton vert (pin3) se comporte en simple bouton
Le bouton orange (pin 5) en bouton avec LED (pin 4)
Le bouton bleu (pin 7) déclenche en plus de la LED (pin 6)  un son sur le piezo (pin 12).

à noter un truc qui n'est pas trop conventionnel si vous achetez ce genre de boutons:
- d'une part sur certains sites ils sont notés 12v, ce n'est pas vrai du tout... ne dépassez pas les valeurs habituelles pour des LEDs, (3.3V ou 5V et utilisez une résistance de limitation de courant entre 200Ω et 300Ω)
- Pour savoir où est l'Anode et la cathode sur le bouton, ils ont mis un point rouge d'un côté... on associe souvent le rouge au pôle positif dans les montages, ben... ici c'est le contraire, le point rouge dénote la cathode de la LED (donc vous reliez cette partie à la masse).



Le code de démo comprend en plus un #define, suivant que vous l'activez ou pas vous allez utiliser la version "de base" ou la version avec les callbacks.
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Kanter

#36
Apr 26, 2019, 01:32 pm Last Edit: Apr 26, 2019, 01:43 pm by Kanter
Bonjour
Je suis en train de tester simpleBouton.h et un tutoriel sur la machien à état qui répond à mes attentes: action quand le bouton est appuyé (et non relâché) Merci à son auteur !


Peux-ton faire un callback avec cette librairie pour faire fonctionner ce code  ?
Code: [Select]
void simpleclick()//http://forum.arduino.cc/index.php?topic=470879.0
{
... // le code à exécuter quand on fait un click sur le bouton
}

void setup() {
  button.attachClick(simpleclick); // on associe le fonction callBack à l'appui sur le bouton
}


void loop() {
  button.tick();  // On vérifie l'état des boutons, ce qui déclenche les appels aux fonctions
}


A priori non car j'ai ce message
Quote
'class simpleBouton' has no member named 'attachClick'
Idem avec bouton_aller.attacher(clic);



Comment faire?
Code: [Select]
//essai state machine du 26/04
#include "simpleBouton.h"
#include <AccelStepper.h>

#define FULLSTEP 4
#define HALFSTEP 8

#define motorPin1  8     // Blue   - 28BYJ48 pin 1
#define motorPin2  9     // Pink   - 28BYJ48 pin 2
#define motorPin3  10    // Yellow - 28BYJ48 pin 3
#define motorPin4  11    // Orange - 28BYJ48 pin 4

#define motorPin5  4     // Blue   - 28BYJ48 pin 1
#define motorPin6  5     // Pink   - 28BYJ48 pin 2
#define motorPin7  6     // Yellow - 28BYJ48 pin 3
#define motorPin8  7     // Orange - 28BYJ48 pin 4

// Define two motor objects
// The sequence 1-3-2-4 is required for proper sequencing of 28BYJ48
AccelStepper stepper_ar(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);
AccelStepper stepper_camera(HALFSTEP, motorPin5, motorPin7, motorPin6, motorPin8);


simpleBouton bouton_aller(2);
simpleBouton bouton_retour(3);

enum {DEMARRE, ALLER, RETOUR} etatCourant;

// ------------------------------------------------------
// Cette fonction installe l'état initial
// ------------------------------------------------------
void demarre()
{
stepper_ar.moveTo(500);//4096 = 2 tours
 stepper_ar.setSpeed(400);
 etatCourant = DEMARRE;
}


// ------------------------------------------------------
// La fonction de call back, appellée automatiquement quand on clique
// ------------------------------------------------------
void clic()
{
  switch (etatCourant) {
    case ARRET: // on était au repos et on a un appui, on allume la verte
      stepper_ar.moveTo(2000);//4096 = 2 tours
      stepper_ar.setSpeed(400);
      etatCourant = ALLER; // on note le nouvel état de notre système
      break;

    case ALLER: // on était led verte allumée et on a un appui, on allume la jaune
      stepper_ar.moveTo(-2000);//4096 = 2 tours
      stepper_ar.setSpeed(-400);
      etatCourant = RETOUR;// on note le nouvel état de notre système
      break;
  }
}


void setup() {

  bouton_aller.attachClick(clic); // on associe le fonction callBack à l'appui sur le bouton
    bouton_retour.attachClick(clic); // on associe le fonction callBack à l'appui sur le bouton
   
  arret();

stepper_ar.setMaxSpeed(700.0);
stepper_ar.setAcceleration(400.0);
stepper_camera.setMaxSpeed(700.0);
stepper_camera.setAcceleration(400.0);
}



void loop() {
  bouton_aller.actualiser();
  bouton_retour.actualiser();

  stepper_ar.run();
stepper_camera.run();
}


Merci beaucoup !

J-M-L

Regardez la classe boutonAction de la librairie ou mon post #35 pour des évolutions
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

ThibaultH

Bonjour Bricoleau,

tout d'abord je tiens à te remercier de créer des bibliothèques pour simplifier la vie des débutants  :)

J'ai testé différents exemples avec deux boutons poussoirs et je remarque que chez moi il se passe l'inverse entre le code et l'action.
Je m'explique, si je prend l'exemple numéro 1 : état bouton. Au moment de l'appuie sur mon BP j'ai le message Relache sur le moniteur série et quand je le relache j'ai le message Enfonce.

J'ai ce soucis sur tout les exemples, une idée de ce que je fais de mal ?

J'utilise le Grove Button v1.2 de seedstudio

Merci

fdufnews

Si j'en crois les informations sur le site seeedstudio
Quote
This new version of button twig contains one independent button, which are configured with pull-down resistor
le bouton est câblé au plus avec une résistance de tirage à la masse. Donc le branchement est l'inverse de ce que préconise bricoleau dans ses explications. Donc c'est normal que tu trouves un comportement inverse.

Kanter

#40
May 20, 2019, 07:56 am Last Edit: May 20, 2019, 08:02 am by Kanter
Regardez la classe boutonAction de la librairie ou mon post #35 pour des évolutions
Merci ça marche nickel

Je remercie Bricoleau pour sa libraire : je suis cependant étonné qu'elle fonctionne sans utiliser de debounce et resistance
J'ai teste de nombreux codes/library de boutons et je devais créer un debounce (hardware c'est plus facile pour moi) pour que les boutons fonctionnent à 100%
Avec la librairie de Bricoleau et un circuit ultra basique, nul besoin de quoique ce soit : les boutons lancent les actions à coup certain !
Bizarre...J'ai quand même envie de faire un debounce au cas où...

Qu'en pensez-vous?

J-M-L

#41
May 20, 2019, 08:05 am Last Edit: May 20, 2019, 08:05 am by J-M-L
Je suis cependant étonné qu'elle fonctionne sans utiliser de debounce et resistance
J'ai teste de nombreux codes/library de boutons et je devais créer un debounce (hardware c'est plus facile pour moi) pour que les boutons fonctionnent à 100%
Avec la librairie de Bricoleau et un circuit ultra basique, nul besoin de quoique ce soit : les boutons lancent les actions à coup certain !
Bizarre...J'ai quand même envie de faire un debounce au cas où...

Qu'en pensez-vous?
Lisez le code en détail :)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

bricoleau

#42
May 20, 2019, 03:12 pm Last Edit: May 20, 2019, 03:36 pm by bricoleau
Hello

Oui d'où le nom de simpleBouton.h  :)

La bibliothèque intègre un debounce logiciel de 20 ms par défaut, valeur que l'on peut changer lors de la déclaration du bouton.

Pour les mordus du fer à souder, il est toujours possible d'ajouter un debounce physique avec une capa en parallèle du bouton.
Et dans ce cas, réduire le délai de debounce logiciel, qui ne sert plus à rien.
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

Kanter

Bonjour


J'ai regardé le code en question histoire d'être moins bête et je pense avoir trouvé :
Code: [Select]
  //Filtrage temporel
  uint32_t maintenant = millis();
  if (etat_courant != etat_precedent)
  {
    uint32_t delai = maintenant - this->_millis_etat_actuel;
    if (delai < this->_delai_debounce_ms)
    {
      etat_courant = etat_precedent;
    }
  }


Quote
La bibliothèque intègre un debounce logiciel de 20 ms par défaut, valeur que l'on peut changer lors de la déclaration du bouton.
Merci beaucoup !
Je vous donne un karma à tous les deux !

SijoreSSuS

Bonjour Bricoleau,
Je viens de m'inscrire sur le forum juste pour te féliciter pour cette bibliothèque !
Moi qui galérais avec un programme avec l'habituelle "Bounce2", en 2 minute grâce a ton travail, mon programme est opérationnel !

Encore Bravo et Merci !


SijoreSSuS

Go Up