Motorisation d'un télescope de fabrication personnelle

Gilles57:
Je sais pas si c'est adaptable, vous lancez le moteur en alimentation, vous figez le le programme avec la fonction Sleep, et vous le récupérez pour le couper .

Dans le cas de moteurs pas à pas c'est à proscrire Gilles. On ne se contente pas d'alimenter les moteurs. On envoie des impulsions pour les faire bouger de manière très précise.

Bonjour,
Un grand merci Sébastien pour ton aide et ta librairie runloop.h qui a l’air de faire des merveilles. J’ai a peu près résolu tous mes problèmes de base ce matin mais je vous soumets ce petit bout de code qui fonctionne à merveille pour deux vitesses et un bouton. Facile à étendre à l’ensemble de ma problématique mais est-ce que je m’y prends bien? J’ai un peu de mal à comprendre le fonctionnement de la fonction fire et de la variable(?) sender.
Merci encore et à+ pour la suite!
Nathanaël

#define pas_AD          36               // pin pas ascension droite sur E1
#define direction_AD    34               // pin direction ascension droite sur E1
#define activer_AD      30               // pin activation ascension droite sur E1

#define interrupteur_AD_plus 29        // pin interrupteur vitesse rapide

#include <RunLoop.h>                     // importe la librairie RunLoop
RunLoopTimer *timerAD   = NULL;          // Timer d'ascension droite
RunLoopTimer *timerADplus  = NULL;          // Timer de rattrapage AD+

void setup() {
  Serial.begin(115200);                  // ouvre le port de communication avec l'arduino
  pinMode( pas_AD, OUTPUT );             // déclare les pins comme des sorties / entrées
  pinMode( direction_AD, OUTPUT );
  pinMode( activer_AD, OUTPUT );
  pinMode( interrupteur_AD_plus, INPUT_PULLUP);
  digitalWrite( activer_AD, LOW);        // active le DVR8825
  digitalWrite( direction_AD, HIGH);     // fixe le sens de rotation du moteur

  timerAD = new RunLoopHardwareTimer1(); // Nous utilisons le Timer1 en AD pour une précision de 16bits
  timerAD->attachInterrupt(fire);
  timerAD->setMicroDelay(18750);

  timerADplus = new RunLoopHardwareTimer3();// Nous utilisons le Timer3 en AD+ pour une précision de 16bits
  timerADplus->attachInterrupt(fire);
  timerADplus->setMicroDelay(9000);
}
void fire(RunLoopTimer *sender)
{
  if ( sender == timerAD )
  {
    // Cas du timer pour l'ascencsion droite si le moteur tourne

    // On envoie une impulsion haute
    digitalWrite (pas_AD, HIGH);
    // Et on repasse à un niveau bas
    digitalWrite (pas_AD, LOW);
  }
  else if ( sender == timerADplus )
  {
   // Cas du timer pour l'ascension droite en vitesse rapide
    // On envoie une impulsion haute
    digitalWrite (pas_AD, HIGH);
    // Et on repasse à un niveau bas
    digitalWrite (pas_AD, LOW);
  }
}

void loop()
{
  if (digitalRead(interrupteur_AD_plus) != LOW)
  {
    // On arrête le timer AD
    timerAD->setIdle(true);
    timerADplus->setIdle(false);
  }
  else {
    timerAD->setIdle(false);
    timerADplus->setIdle(true);
  }
}

Bonjour,

Après avoir réglé un problème de micropas grâce à Artouste (merci à lui, voir ici), j’ai réécris le code en version simplifiée avec juste deux timers et la runloop de Sébastien Marchand. Je ne suis pas sûr que l’usage des deux variables j et k soit très orthodoxe, mais j’ai inséré ces deux dernières pour ne pas réactiver sans arrêt dans la loop la commande setmicrodelay ce qui la rend apparemment inopérante.

Bon, ça fonctionne ainsi, mais si vous avez des suggestions, merci par avance :slight_smile:

Nathanaël

#define pas_AD          36               // pin pas ascension droite sur E1
#define direction_AD    34               // pin direction ascension droite sur E1
#define activer_AD      30               // pin activation ascension droite sur E1

#define pas_Dec         26               // pin pas déclinaison sur E0
#define direction_Dec   28               // pin direction déclinaison sur E0
#define activer_Dec     24               // pin activation déclinaison sur E0

#define port_ST4_AD_plus_guidage    33       // pin boutons raquette et ST4
#define port_ST4_AD_moins_guidage   39
#define port_ST4_Dec_plus_guidage   35
#define port_ST4_Dec_moins_guidage  37
#define bouton_AD_plus_centrage     43
#define bouton_AD_moins_centrage    45
#define bouton_Dec_plus_centrage    32
#define bouton_Dec_moins_centrage   47

#define interrupteur_fin_de_course  40       // pin    interrupteur fin de course

#include <RunLoop.h>                         // importe la librairie RunLoop
RunLoopTimer *timerAD   = NULL;              // déclaration des timers
RunLoopTimer *timerDec   = NULL;

long i = 0;
int j = 0;
int k = 0;

void setup() {

  Serial.begin(115200);                        // ouvre le port de communication avec l'arduino

  pinMode( pas_AD, OUTPUT );                   // déclare les pins comme des sorties
  pinMode( direction_AD, OUTPUT );
  pinMode( activer_AD, OUTPUT );

  pinMode( pas_Dec, OUTPUT );
  pinMode( direction_Dec, OUTPUT );
  pinMode( activer_Dec, OUTPUT );

  pinMode( port_ST4_AD_plus_guidage, INPUT_PULLUP);          // déclare les pins comme des entrées
  pinMode( port_ST4_AD_moins_guidage, INPUT_PULLUP);
  pinMode( port_ST4_Dec_plus_guidage, INPUT_PULLUP);
  pinMode( port_ST4_Dec_moins_guidage, INPUT_PULLUP);
  pinMode( bouton_AD_plus_centrage, INPUT_PULLUP);
  pinMode( bouton_AD_moins_centrage, INPUT_PULLUP);
  pinMode( bouton_Dec_plus_centrage, INPUT_PULLUP);
  pinMode( bouton_Dec_moins_centrage, INPUT_PULLUP);

  pinMode( interrupteur_fin_de_course, INPUT_PULLUP);

  timerAD = new RunLoopHardwareTimer1();            // Timer1 en AD pour une précision de 16bits
  timerAD->attachInterrupt(fire);

  timerDec = new RunLoopHardwareTimer3();           // Timer3 en Dec pour une précision de 16bits
  timerDec->attachInterrupt(fire);

  timerAD->setIdle(false);                          // démarre le timer AD
  timerDec->setIdle(true);                          // arrête le timer Dec

  digitalWrite( activer_AD, LOW);                   // active le moteur AD
  digitalWrite( activer_Dec, LOW);                  // active le moteur Dec
  digitalWrite( direction_AD, HIGH);                // définit la direction du moteur AD
}

void fire(RunLoopTimer *sender)
{
  if ( sender == timerAD )               // le moteur AD tourne
  { digitalWrite (pas_AD, HIGH);         // On envoie une impulsion haute
    digitalWrite (pas_AD, LOW);          // Et on repasse à un niveau bas
  }
  if ( sender == timerDec )              // le moteur Dec tourne
  { digitalWrite (pas_Dec, HIGH);
    digitalWrite (pas_Dec, LOW);
  }
}
void loop() {

  if (digitalRead(interrupteur_fin_de_course) == LOW) {           // arrêt de fin de course
    digitalWrite( direction_AD, LOW);                             // rembobinage
    Serial.println ("rembobinage");
    timerAD->setMicroDelay(156);
    j = 0;
    while (i < 12000) {                                           // nb de pas de rembobinage
      i ++;
    }
  }

  else {
    i = 0;
    digitalWrite( direction_AD, HIGH);

    if (digitalRead(bouton_AD_plus_centrage) == LOW) {            // centrage AD
      if (j != 1) {
        timerAD->setMicroDelay(2000);
        j = 1;
      }
    } else {
      if (digitalRead(bouton_AD_moins_centrage) == LOW) {
        if (j != 2) {
          timerAD->setMicroDelay(1000000);
          j = 2;
        }
      } else {
        if (digitalRead(port_ST4_AD_plus_guidage) == LOW) {       // guidage AD
          if (j != 3) {
            timerAD->setMicroDelay(7031);
            j = 3;
          }
        } else {
          if (digitalRead(port_ST4_AD_moins_guidage) == LOW) {
            if (j != 4) {
              timerAD->setMicroDelay(11719);
              j = 4;
            }
          } else {
            if ( j != 5) {
              timerAD->setMicroDelay(9375);
              j = 5;
            }
          }
        }
      }
    }

    if (digitalRead(bouton_Dec_plus_centrage) == LOW) {                   // centrage Dec
      if (k != 1) {
        timerDec->setMicroDelay(7000);
        timerDec->setIdle(false);
        digitalWrite(direction_Dec, HIGH);
        k = 1;
      }
    } else {
      if (digitalRead(bouton_Dec_moins_centrage) == LOW) {
        if (k != 2) {
          timerDec->setMicroDelay(7000);
          timerDec->setIdle(false);
          digitalWrite(direction_Dec, LOW);
          k = 2;
        }
      } else {
        if (digitalRead(port_ST4_Dec_plus_guidage) == LOW) {              // guidage Dec
          if (k != 3) {
            timerDec->setMicroDelay(29258);
            timerDec->setIdle(false);
            digitalWrite(direction_Dec, HIGH);
            k = 3;
          }
        } else {
          if (digitalRead(port_ST4_Dec_moins_guidage) == LOW) {
            if (k != 4) {
              timerDec->setMicroDelay(29258);
              timerDec->setIdle(false);
              digitalWrite(direction_Dec, LOW);
              k = 4;
            }
          } else {
            timerDec->setIdle(true);
            k=0;
          }
        }
      }
    }
  }
}

bonjour,

j’ai tenté de compilé la librairie Runlloop qui me parait parfaitement répondre a un projet de commande sur ATmega32u4 de multi motorisation ( monture equat +focuser+ dome + roue a filtre …) a partir de l’IDE sans succès. Je suis familiarisé avec le C mais beaucoup moins avec le CPP. est-il possible d 'avoir un retour sur la cause de ces erreurs. L 'exemple ci dessous est le “app_controller_template”. Sur les autres exemples, les messages sont à peu prés équivalent, notamment les #define du timer2 qui ne sont pas reconnu.

Pour information , j’ai commencé la programmation sous arduino il a un mois et il se peut que les subtilité du compilateur m’ait échappé …

Salutations.
JC

ci dessous les erreur générée:
Arduino : 1.8.7 (Windows 7), Carte : “Arduino Leonardo”

In file included from C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master/RunLoopHardwareTimer0.hpp:25:0,

from C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master/RunLoop.h:28,

from sketch\AppController.hpp:23,

from C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\examples\app_controller_template\app_controller_template.ino:29:

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master/RunLoopHardwareTimer.hpp:92:30: warning: inline function ‘virtual TimerPreset RunLoopHardwareTimer::timerPresetForMicroDelay(long unsigned int)’ used but never defined

inline virtual TimerPreset timerPresetForMicroDelay(unsigned long delay) = 0;

^

In file included from C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp:22:0:

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp: In function ‘void TIMER2_OVF_vect()’:

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp:46:5: warning: ‘TIMER2_OVF_vect’ appears to be a misspelled signal handler, missing __vector prefix [-Wmisspelled-isr]

ISR(TIMER2_OVF_vect)

^

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp:49:3: error: ‘TCNT’ was not declared in this scope

TCNT = __timerPreset->counterReset;

^

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp: In constructor ‘RunLoopHardwareTimer2::RunLoopHardwareTimer2()’:

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp:39:15: error: ‘TIMSK2’ was not declared in this scope

#define TIMSK TIMSK2

^

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp:62:3: note: in expansion of macro ‘TIMSK’

TIMSK = 0;

^

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp:36:15: error: ‘TCCR2A’ was not declared in this scope

#define TCCRA TCCR2A

^

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp:63:3: note: in expansion of macro ‘TCCRA’

TCCRA = TCCRB = PRESCALE_0;

^

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp:37:15: error: ‘TCCR2B’ was not declared in this scope

#define TCCRB TCCR2B

^

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp:63:11: note: in expansion of macro ‘TCCRB’

TCCRA = TCCRB = PRESCALE_0;

^

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp: In destructor ‘RunLoopHardwareTimer2::~RunLoopHardwareTimer2()’:

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp:39:15: error: ‘TIMSK2’ was not declared in this scope

#define TIMSK TIMSK2

^

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp:68:3: note: in expansion of macro ‘TIMSK’

TIMSK = 0;

^

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp:36:15: error: ‘TCCR2A’ was not declared in this scope

#define TCCRA TCCR2A

^

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp:69:3: note: in expansion of macro ‘TCCRA’

TCCRA = TCCRB = PRESCALE_0;

^

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp:37:15: error: ‘TCCR2B’ was not declared in this scope

#define TCCRB TCCR2B

^

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp:69:11: note: in expansion of macro ‘TCCRB’

TCCRA = TCCRB = PRESCALE_0;

^

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp: In member function ‘virtual void RunLoopHardwareTimer2::setMicroDelay(long unsigned int)’:

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp:37:15: error: ‘TCCR2B’ was not declared in this scope

#define TCCRB TCCR2B

^

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp:87:3: note: in expansion of macro ‘TCCRB’

TCCRB = PRESCALE_0; // Disable timer

^

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp: In member function ‘virtual void RunLoopHardwareTimer2::setIdle(bool)’:

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp:37:15: error: ‘TCCR2B’ was not declared in this scope

#define TCCRB TCCR2B

^

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp:99:7: note: in expansion of macro ‘TCCRB’

TCCRB = PRESCALE_0;

^

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp:37:15: error: ‘TCCR2B’ was not declared in this scope

#define TCCRB TCCR2B

^

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp:104:7: note: in expansion of macro ‘TCCRB’

TCCRB = 1<<WGM12;

^

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp:106:7: error: ‘TCNT’ was not declared in this scope

TCNT = __timerPreset->counterReset;

^

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp: In member function ‘virtual void RunLoopHardwareTimer2::setTimerPreset(TimerPreset*)’:

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp:39:15: error: ‘TIMSK2’ was not declared in this scope

#define TIMSK TIMSK2

^

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp:150:5: note: in expansion of macro ‘TIMSK’

TIMSK = 0;

^

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp:37:15: error: ‘TCCR2B’ was not declared in this scope

#define TCCRB TCCR2B

^

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp:151:5: note: in expansion of macro ‘TCCRB’

TCCRB = __timerPreset->clockSelectBits;

^

In file included from C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.hpp:25:0,

from C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer2.cpp:25:

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer.hpp: At global scope:

C:\Users\Administrateur\Documents\Arduino\libraries\runloop-master\RunLoopHardwareTimer.hpp:92:30: warning: inline function ‘virtual TimerPreset RunLoopHardwareTimer::timerPresetForMicroDelay(long unsigned int)’ used but never defined

inline virtual TimerPreset timerPresetForMicroDelay(unsigned long delay) = 0;

^

exit status 1
Erreur de compilation pour la carte Arduino Leonardo

Ce rapport pourrait être plus détaillé avec
l’option “Afficher les résultats détaillés de la compilation”
activée dans Fichier → Préférences.

Por favor, hay alguna posibilidad de omitir una determinada cantidad de pulsos enviado a un motor 28by1 48 para que al final solo gira una cantidad menor, para no tener que modificar la relacion mecanica ?
Muchas gracias
Angel