Voici:
//ATtiny-UNO_Pont_tournant.ino
/*
Christian BEZANGER - Jean-Luc BECHENNEC - septembre 2019
*** Pour carte UNO ou µC ATtiny25/45/85 ***
Commande la rotation du moteur pas a pas avec un potentiomètre.
Peut servir a un pont tournant.
Les phases du moteur pas a pas sont reliees imperativement aux
sorties PB0:3 : soit 8, 9, 10, 11 sur UNO et broches 5, 6, 7, 2 sur ATtiny25/45/85
Le point milieu d un potentiometre est branche sur A2 (broche 3 sur ATtiny)
*/
#define UNO //
//#define ATtiny // a commenter si UNO
#ifdef UNO
const int portSortie[] = {8, 9, 10, 11};
#endif
#ifdef ATtiny //
const int portSortie[] = {0, 1, 2, 3};
#endif
void setup() {
// les pins en sortie
for (int i = 0; i < 4; i++) {
pinMode(portSortie[i], OUTPUT);
}
}
void loop() {
int vitesse; // plus petit implique plus rapide, sauf 0 = immobile
bool sens;
int potentiometre; // valeur du potentiometre
potentiometre = analogRead(A2); // valeur du potentiomètre (de 0 a 1023)
potentiometre = potentiometre - 512; // maintenant de -512 a +511
// Analyse de la valeur pour determiner le sens
if(potentiometre < 0) sens = false; else sens = true;
// Analyse de la valeur pour determiner la vitesse
potentiometre = abs(potentiometre); // on ne considere que la valeur absolue
if(potentiometre < 100) {vitesse = 0;}
else if(potentiometre >= 100 && potentiometre < 150) {vitesse = 30000;}
else if(potentiometre >= 150 && potentiometre < 200) {vitesse = 26000;}
else if(potentiometre >= 200 && potentiometre < 250) {vitesse = 22000;}
else if(potentiometre >= 250 && potentiometre < 300) {vitesse = 18000;}
else if(potentiometre >= 300 && potentiometre < 350) {vitesse = 14000;}
else if(potentiometre >= 350 && potentiometre < 400) {vitesse = 10000;}
else if(potentiometre >= 400 && potentiometre < 450) {vitesse = 6000;}
else if(potentiometre >= 450 && potentiometre < 500) {vitesse = 2000;}
else if(potentiometre >= 500) {vitesse = 300;}
// Rotation egale a un pas en fonction du sens
tourneUnPas(sens, vitesse);
}
void tourneUnPas(bool dir, int ms) {
// tableau pour la phase
const byte phases[] = {HIGH, LOW, LOW, LOW};
// variable "phaseIndex". Une variable static se comporte comme une variable globale.
// en ce qui concerne sa durée de vie : elle existe avant que le programme ne commence
// et donc en dehors de la fonction où elle est déclarée ; et comme une variable locale
// en ce qui concerne son 'scope' : elle n'est accessible que de tourneUnPas comme
// si il s'agissait d'une variable locale.
static byte phaseIndex = 0;
// La valeur de cette variable indique quelle phase du moteur est alimentee.
// On augmente (ou diminue) cette valeur de 1 unite pour alimenter la phase suivante,
// selon sens de rotation. phaseIndex reste egal a 0, 1, 2, 3 par operation modulo %
if(ms>0) { // moteur non immobile
if(dir) { // decalage vers la gauche
phaseIndex = (phaseIndex+1)%4;
}
else { // decalage vers la droite
phaseIndex = (phaseIndex-1)%4;
}
for(int i=0;i<4;i++) { // ecriture sur les lignes PB0:3
digitalWrite(portSortie[i], phases[(phaseIndex+i)%4]);
}
delayMicroseconds(ms);
}
}