Exemple: Potentiometre_Position

Ce programme recopie la position d'un potentiomètre sur un pas à pas. L'idéal est de disposer d'un potentiomètre linéaire de 4,7kΩ et 10kΩ. On ne peut pas trop descendre en dessous de 1kΩ car cela dissipe déjà 1/4W. Si la valeur ohmique est trop importante, le convertisseur analogique numérique donnera des valeur plus bruité et le moteur sera instable.

Liens

Pour faire fonctionner cet exemple, il faut soit télécharger QuickStepExemples.zip contenant tous les fichiers d'exemples, soit télécharger Potentiometre_Position.zip contenant cet exemple, soit créer un répertoire du nom de l'exemple et mettre dedans:
- le fichier Potentiometre_Position.ino de l'exemple
- le fichier de configuration QuickStepConf.h propre à cet exemple
- les trois fichiers (QuickStep.h, QuickStep.cpp et digitalWriteFast.h) pour avoir la bibliothèque (identiques pour toutes les applications)

QuickStepConf.h (extrait)

//  Hybride 200pas/tr en mode 16 micro-pas
#define UN_TOUR (200L*16) pas_ou_micro_pas
#define VITESSE_MAXI 10.0 RPS
#define STEP 2
#define DIR 5
#define ENABLE 8
#define NOMBRE_DE_PAS_MAXIMUM_SUR_16_BITS
#define NB_ORDRES_DANS_LA_PILE 31
#define NB_ORDRES_ACCELERATION 10

Potentiometre_Position.ino (extrait)

Si la valeur retournée par le convertisseur était stable, on pourrait faire:

const uint8_t POTENTIOMETRE = A5; // Broche de la borne centrale du potentiomètre

#
  $menu = ":QS";
  include "QuickStep.h"

void setup()
{
  quickStepInit(); // Obligatoire pour utiliser QuickStep
  // Pour ne pas avoir de mouvement à la mise sous tension:
  quickStepSetPosition(map(analogRead(POTENTIOMETRE), 0, 1024, 0, UN_TOUR*3/4));
  // Note: Le potentiomètre faisant 3/4 tour, le moteur doit en faire autant.
}

long valeurPotentiometreLue; // Résulat de analogRead(POTENTIOMETRE)
long vieilleValeurPotentiometreLue; // Résulat lors du précédent mouvement

void loop()
{ 
  quickStepRotationAbsolu((analogRead(POTENTIOMETRE)*uint32_t(UN_TOUR)*270)/(360UL*1024),
       VITESSE_MAXI, acceleration_sur UN_TOUR / 4, deceleration_sur UN_TOUR / 4);
}

Si la valeur analogRead(POTENTIOMETRE) a de petites variations dans le temps, le moteur suivrait. Pour éviter cela, on ne fera tourner le moteur que si la différence en vaut le coup.

const uint8_t POTENTIOMETRE = A5; // Broche de la borne centrale du potentiomètre

#
  $menu = ":QS";
  include "QuickStep.h"

void setup()
{
  quickStepInit(); // Obligatoire pour utiliser QuickStep
  // Pour ne pas avoir de mouvement à la mise sous tension
  quickStepSetPosition(map(analogRead(POTENTIOMETRE), 0, 1024, 0, UN_TOUR*3/4));
  // Note: Le potentiompètre faisant 3/4 tour, le moteur doit en faire autant.
}

long valeurPotentiometreLue; // Résultat de analogRead(POTENTIOMETRE)
long vieilleValeurPotentiometreLue; // Résultat lors du précédent mouvement

void loop()
{ 
  valeurPotentiometreLue = analogRead(POTENTIOMETRE);
  if (abs(vieilleValeurPotentiometreLue - valeurPotentiometreLue) > HYSTERESIS)
  {
    quickStepRotationAbsolu(map(analogRead(POTENTIOMETRE), 0, 1024, 0, UN_TOUR*3/4),
         VITESSE_MAXI, acceleration_sur UN_TOUR / 4, deceleration_sur UN_TOUR / 4);
    vieilleValeurPotentiometreLue = valeurPotentiometreLue;
  }
}