Nouvelles:

25/06/2023 : Mise à jour du forum. En cas de bug, merci de contacter le Grand Sachem

Menu principal

ATtiny85 et Servomoteur

Démarré par Ph Blondé, 24 Août 2021 à 16:04:37

« précédent - suivant »

0 Membres et 1 Invité sur ce sujet

Ph Blondé

Bonjour à tous,

Construire un système pour commander un servomoteur n'a rien d'extraordinaire et pourtant c'est ce que j'ai cherché à faire depuis quelques temps mais sans utiliser d'Arduino. En effet utiliser un Arduino c'est un peu cher payer la note pour «remuer» un servomoteur. Mais il y a également une autre raison.

Prenons le cas d'une séquence d'animation (avec relais, LEDs, etc.) pilotée par un Arduino. 
On sait qu'un servomoteur mis dans une position souhaitée a besoin, en permanence, de recevoir des signaux de commande pour  maintenir cette position.

Comme l'Arduino est un système mono-tâche, il « lâchera » le servomoteur pour faire autre chose à un moment donné de la séquence d'animation. A cet instant-là l'absence de production de signaux destinés au servomoteur fera que celui-ci n'aura plus de couple moteur... et pourrait quitter la position angulaire sur laquelle il a été mis.

Pour ces raisons et pour piloter correctement un servomoteur, j'ai donc choisi de dédier cette unique tâche à un ATtiny85.
L'ATtiny85 est également un microprocesseur ; mais alors un tout petit-petit microprocesseur qui se programme cependant comme un Arduino, avec moins de possibilités de fonctions tout de même.
Philippe Blondé
Un 59 dans le 22

Ph Blondé

Voici le cahier des charges que je m'étais fixé :

• Une commande de mouvement qui :
        - lorsqu'elle est au moins (0V) ou « en l'air » fait que le servomoteur se déplace puis reste sur un angle de           "repos » dont la valeur est réglage,
        - lorsqu'elle est au plus (5V) fait que le servomoteur se déplace puis reste sur un angle de « travail » dont la valeur est également réglage,
        -accepte les contacts unipolaires.

• Un réglage possible de la valeur des angles : angle de « repos » compris entre 0° et 90° et un angle de travail compris entre 91° et 180°.

• Pour un débattement de 180°, avoir un réglage possible de la vitesse de rotation (entre « quasi instantané » et 3 s).

• Peu de composants.

Philippe Blondé
Un 59 dans le 22

Ph Blondé

Le schéma remplit déjà la dernière condition : 3 résistances variables de 10k seulement !

Inutile de mettre une résistance de 10k entre la commande et la masse pour « tirer » vers le 0V (LOW) l'entrée de cette commande si elle est « en l'air ».
Il suffit de le déclarer dans le « setup » du programme ; 1 composant en moins !  :)
Philippe Blondé
Un 59 dans le 22

Ph Blondé

Le programme (ou le « sketch » comme disent les docteurs es Arduino).

Rien de difficile, il a deux parties ; une qui correspond à la mise au moins ou « en l'air » (LOW) de la commande de mouvement et l'autre qui correspond à la mise au plus (HIGH) de la dite commande.

Chaque partie comprend deux étapes :
-   Le déplacement vers l'angle défini avec contrôle de la vitesse de rotation.
-   Le maintien à l'angle défini atteint tant que l'état de la commande de mouvement n'a pas changé et la possibilité, à cet instant, d'effectuer un réglage de la valeur de cet angle.

Petite remarque, l'angle de « repos » est à définir entre 5° et 90° et celui de « travail » entre 91° et 175° ; pourquoi ?

Parce que certains servomoteurs ne réagissent pas ou mal, aux valeurs strictes de 0° ou de 180° et vibrent alors à ces valeurs extrêmes.  De toute manière, l'écart entre 5° et 175° couvre largement nos besoins : mouvements d'aiguillage, de barrières de PN, de plaque de signaux mécaniques, etc.

Voici le programme que vous trouverez également en fichiers joints (.ino et .doc) :


// MAJ 22-08-2021 - Forum EspaceTrain
// Pour ATtiny85 - Horloge interne à 8MHz
// Alimentation en 5V pour ATtiny85 et servomoteur

#include <SoftwareServo.h>
SoftwareServo Servo_Moteur;

const int Commande = 0;         // BROCHE N° 5 DE L'ATtiny85
int Etat_Commande;

const int Potentiometre_Angle_Mini = A3;  // BROCHE N° 2 DE L'ATtiny85
int Valeur_Angle_Mini;

const int Potentiometre_Angle_Maxi = A2;  // BROCHE N° 3 DE L'ATtiny85
int Valeur_Angle_Maxi;

const int Potentiometre_Vitesse_Deplacement = A1;     // BROCHE N° 7 DE L'ATtiny85
int Valeur_Vitesse_Deplacement;
int val;

void setup()
{
  Servo_Moteur.attach(1); // BROCHE N° 6 DE L'ATtiny85 > PWM

  pinMode (Commande, INPUT);
  digitalWrite (Commande, LOW);
  Etat_Commande = digitalRead (Commande);

  pinMode (Potentiometre_Angle_Mini, INPUT);

  pinMode (Potentiometre_Angle_Maxi, INPUT);

  pinMode (Potentiometre_Vitesse_Deplacement, INPUT);
}

void loop()
{
//************************************************************************************
// PASSAGE DE ANGLE MAXI A ANGLE MINI (REGLABLES) AVEC APPLICATION DU CONTROLE DE VITESSE *
//************************************************************************************

  Valeur_Angle_Mini = analogRead (Potentiometre_Angle_Mini);
  Valeur_Angle_Mini = map (Valeur_Angle_Mini, 0, 1023, 5, 90)

  Valeur_Angle_Maxi = analogRead (Potentiometre_Angle_Maxi);
  Valeur_Angle_Maxi = map (Valeur_Angle_Maxi, 0, 1023, 91, 175);

  Valeur_Vitesse_Deplacement = analogRead (Potentiometre_Vitesse_Deplacement);
  Valeur_Vitesse_Deplacement = map (Valeur_Vitesse_Deplacement, 0, 1023, 1, 50);
 
  // Ligne ci-dessus : transformée de [0, 1023] en [0, 50].
  // Les valeurs 0 et 50 correspondent à 0ms et 50ms si utilisation de "delay" par la suite
  // Dans le cas de l'utilisation de "delayMicoseconds", plage possible peut varier entre 0 et 16383
  // 16383 (16383µs) est la valeur maxi qu'il est possible de mettre dans un "delayMicoseconds"

  val = Valeur_Angle_Maxi;
  do
    {
    Servo_Moteur.write (val);
    SoftwareServo::refresh();
    delay (Valeur_Vitesse_Deplacement);
    val = (val - 1) ;
    }
  while (val >= Valeur_Angle_Mini);

//******************************************************
// MAINTIEN A ANGLE MINI TANT QUE LA COMMANDE VAUT LOW *
//******************************************************

  while (Etat_Commande == LOW)
    {
    val = analogRead (Potentiometre_Angle_Mini);
    val = map (val, 0, 1023, 5, 90);
    Servo_Moteur.write (val);
    SoftwareServo::refresh();
    Etat_Commande = digitalRead (Commande);
    }
   
//************************************************************************************
// PASSAGE DE ANGLE MINI A ANGLE MAXI (REGLABLES) AVEC APPLICATION DU CONTROLE DE VITESSE *
//************************************************************************************

  Valeur_Angle_Mini = analogRead (Potentiometre_Angle_Mini);
  Valeur_Angle_Mini = map (Valeur_Angle_Mini, 0, 1023, 5, 90);

  Valeur_Angle_Maxi = analogRead (Potentiometre_Angle_Maxi);
  Valeur_Angle_Maxi = map (Valeur_Angle_Maxi, 0, 1023, 91, 175);

  Valeur_Vitesse_Deplacement = analogRead (Potentiometre_Vitesse_Deplacement);
  Valeur_Vitesse_Deplacement = map (Valeur_Vitesse_Deplacement, 0, 1023, 1, 50);
 
  // Ligne ci-dessus : transformée de [0, 1023] en [0, 50].
  // Les valeurs 0 et 50 correspondent à 0ms et 50ms si utilisation de "delay" par la suite
  // Dans le cas de l'utilisation de "delayMicoseconds", plage possible peut varier entre 0 et 16383
  // 16383 (16383µs) est la valeur maxi qu'il est possible de mettre dans un "delayMicoseconds"
 
  val = Valeur_Angle_Mini;
  do
    {
    Servo_Moteur.write (val);
    SoftwareServo::refresh();
    delay (Valeur_Vitesse_Deplacement);
    val = (val + 1) ;
    }
  while (val <= Valeur_Angle_Maxi);

//*******************************************************     
// MAINTIEN A ANGLE MAXI TANT QUE LA COMMANDE VAUT HIGH *
//*******************************************************

  while (Etat_Commande == HIGH)
    {
    val = analogRead (Potentiometre_Angle_Maxi);
    val = map (val, 0, 1023, 91, 175);
    Servo_Moteur.write (val);
    SoftwareServo::refresh();
    Etat_Commande = digitalRead (Commande);
    }
}
Philippe Blondé
Un 59 dans le 22

Ph Blondé

#4
Bilan matériel :
-    1 ATtiny85
-    3 résistances variables de 10k
-    1 servomoteur
-    Une chute de Veroboard à pistes
-    Éventuellement des connecteurs

Parlons « sous » : dans le 3 à 4 euros le montage (sans servomoteur ni connecteurs).

Parlons chargement de l'Attiny85 : Heliox nous explique simplement le « comment fait-on »  https://www.youtube.com/watch?v=S-oBujsoe-Q . Comme elle j'ai fabriqué un « Shield » (une interface, quoi...) qui accueillera l'Attiny85 à programmer et qui sera enfiché sur l'Arduino UNO ; c'est bien pratique.

Parlons vidéo, c'est ici : https://youtu.be/86FOV5WgncQ


Bon amusement  :) :)
Philippe Blondé
Un 59 dans le 22

Attiny

Merci Philippe pour cet article. :D

J'espère qu'il incitera certains à se lancer dans la découverte de ce petit microcontrôleur.

Ph Blondé

Mais de rien, dans ce domaine on se doit de partager ; c'est du "open".  :) :)

Le seul point à régler pour se lancer c'est d'avoir fait plusieurs fois la manip avec l'Arduino UNO.

Merci pour ton appréciation :)
Philippe Blondé
Un 59 dans le 22

Dan37

#7
Bonjour Philippe,
Je suis très intéressé par cette commande de servo.
Néanmoins , sur le schéma ci dessus, il y a 2 fois P2 dans la nomenclature, le deuxième P2 est en fait P3,
Mais ce qui me pose soucis, c'est que tu cites une commande par le Plus  ou en l air/0v
sur le schéma le bouton poussoir est relié au moins. Il ne semble pas possible d'avoir une commande par le Plus ...

Pourtant, sur la vidéo, le fil marron de la plaque bouton est bien sur la ligne rouge de la bredboard ! Et donc le plus.

Pourrais tu , stp, me préciser la chose.

Bonne journée.

Cordialement,  Dan.

Ph Blondé

Citation de: Dan37 le 09 Décembre 2021 à 04:22:38
Bonjour Philippe,
Je suis très intéressé par cette commande de servo.
Néanmoins , sur le schéma ci dessus, il y a 2 fois P2 dans la nomenclature, le deuxième P2 est en fait P3,
Mais ce qui me pose soucis, c'est que tu cites une commande par le Plus  ou en l air/0v
sur le schéma le bouton poussoir est relié au moins. Il ne semble pas possible d'avoir une commande par le Plus ...
Pourtant, sur la vidéo, le fil marron de la plaque bouton est bien sur la ligne rouge de la bredboard ! Et donc le plus.
Pourrais tu , stp, me préciser la chose.
Bonne journée.
Cordialement,  Dan.
Bonjour Dan,
D'abord merci car, grâce à toi, je viens de voir que j'ai mis le mauvais schéma qui ne va pas bien du tout mais alors pas bien du tout. Ce que c'est d'enregistrer sans faire le tri...
Honte sur moi et sur les dix prochaines générations  :-[ :-[ :-[
C'est en revoyant la vidéo que je me suis aperçu de l'erreur.

Les résistances variables P1, P2 et P3 valent 10k.

Encore merci à toi.  :D :D
Le vrai schéma est celui-ci :
Philippe Blondé
Un 59 dans le 22

Dan37

Comme on dit : il n'y a que ceux qui ne font rien qui ne font jamais de bêtises !!!   ::)

Bien ,il ne me reste plus qu'a essayer tout ça .

A bientôt.   :D

Dan.

papyg

Bonjour Philippe
l'application fonctionne très bien sur l'Attiny 45 (et 85), mais j'ai un problème avec l'attiny 84,
ayant besoin de 2 sorties supplémentaires (allumage de 2 leds)
pour info : potentiomètres   A1 A2 A3 , commande 6 , moteur 7 , leds 1 et 2
essais avec plusieurs att 84 (neufs ,initialisation faite)  déplacement erratique du servo ,pas dd'allumage des leds ...

Attiny

bonsoir papyg

Voila un problème qui m'intéresse car j'utilise souvent des ATtiny84.

Si je comprends bien ton message:
-Les potentiomètres sont donc branchés sur les broches 10, 11 et 12,
-commande sur la broche 7
-moteur sur la broche 6
-si tes leds sont branchées en 1 et 2 cela correspond aux broches 12 et 11  qui sont respectivement A1 et A2, problème: c'est deux broches sont déjà reliées à deux potentiomètres!!

 

Attiny

Je parle en fait de ce brochage:
ATTiny84-ATTiny44-pinout.png


papyg

bonsoir Attiny
merci pour ta réponse.
tu as parfaitement raison, j'ai mis les leds en 4 et 5 , et tout est rentré dans l'ordre ;
je débute en attiny (et arduino);
toutes mes amitiés.
Guy

Attiny

Bonjour Guy

Un petit conseil, pour t'éviter de nouveau ce genre de problème, rajoute en commentaire au début de programme ces quelques lignes:
/*
              Brochage Attiny84

             VCC=|1  U 14|= GND
             10 =|2    13|= 0 A0
              9 =|3    12|= 1 A1
          Reset =|4    11|= 2 A2
         (pwm)8 =|5    10|= 3 A3
      (pwm)A7 7 =|6     9|= 4 A4
      (pwm)A6 6 =|7     8|= 5 A5(pwm)

*/
Personnellement je le fais systématiquement en symbolisant également les pins en entrée et en sortie, idem pour les ATtiny85:

         Brochage ATtiny85

           =|1  U  8|= VCC
  P1 -->A3 =|2     7|= A1<-- P3
  P2 -->A2 =|3     6|= 1--> Servomoteur
       GND =|4     5|= 0<-- Commande


Je le répète ce n'est qu'un conseil...

Amuse toi bien avec les ATtiny et bonne continuation :)