code moteur pas a pas- init & bouton de rotation

Questions sur les codes officiels du core arpschuino
Questions about official codes from arpschuino core
Répondre
cousing
Messages : 2
Enregistré le : lun. 8 nov. 2021 14:49

code moteur pas a pas- init & bouton de rotation

Message par cousing »

Bonjour,

je réalise un decor avec des elements suspendu en rotation grace a des Moteur pas a pas NEMA 23 avec réducteur.
Il y a une came qui déclenche un capteur de position pour le point 0 .
Il y a aussi besoin pour le montage decor/moteur de faire tourné le moteur dans les deux sens avec des boutons situé sur le bloque moteur.

Voici la structure code que j'imagine:

Mise sous tension:
-lance une boucle initialisation:
1-fait tourner le moteur lentement dans un sens jusqu'a la fermeture du capteur de position le moteur s arrêt en 0
LoOP:
1- attend l information dmx ..... fait tourne le moteur ......
Mais SI
2.1- l'utilisateur touche un bouton de rotation manuel : le moteur toune dans le sens choisi jusqu'àu relâchement du bouton.
2.2- puis stop la reception DMX jusqu'à la coupure secteur et le redémarrage du moteur



Je veux bien votre avis ou loin de vus sur ces questions ?

merci a vous
Avatar du membre
RitoonL
Administrateur du site
Messages : 112
Enregistré le : dim. 31 oct. 2021 10:21

Re: code moteur pas a pas- init & bouton de rotation

Message par RitoonL »

Je comprend mieux le besoin de reset à distance.

Tu peux aussi ne pas stopper la réception dmx mais juste ignorer les données un fois qu'un bouton a été utilisé, et ensuite utiliser un autre canal DMX pour désinhiber et lancer un reset moteur.

pour celà tu peux par exemple utiliser un booleen et un boucle while ...

le booleen passe à true quand on appuie sur un des boutons
tant que le booleen est true (on entre dans la boucle while), si on appuie sur le bouton gauche, va à gauche ... si on appuie sur le bouton droite, va à droite.
dans cette boucle while les données DMX du moteur ne sont pas lues, donc le moteur ne réagis pas aux données DMX.
mais en fin de boucle il faut vérifier les données DMX de ton canal reset pour faire rebasculer le booleen à false et relancer ta fonction de reset.

Je te conseille aussi d’implémenter une sécurité en manuel quand la came touche ton fin de course afin de ne pas forcer sur le moteur.

J'espère ne pas avoir été trop confus.
Administrateur - Forum arpschuino
Jacques
Messages : 270
Enregistré le : dim. 31 oct. 2021 19:37

Re: code moteur pas a pas- init & bouton de rotation

Message par Jacques »

Hello, je me dit déjà que l'initialisation avec fin de course (ou autre) devraient êtres en standard sur le site ou dans la librarie.
Qu’en pensez-vous ?
Jacques
Messages : 270
Enregistré le : dim. 31 oct. 2021 19:37

Re: code moteur pas a pas- init & bouton de rotation

Message par Jacques »

Pour l’initialisation :
en début de code on déclare le switch de fin de course :

Code : Tout sélectionner

uint8_t zeroSwitch=Arp8;//fin de course, capteur de position ou autre sur Arp8
Et à la fin du setup :

Code : Tout sélectionner

  stepper0.refresh(255, 30);//on définit un sens de rotation(255,0 pour alller dans l'autre sens), et une vitesse (ici 30 pour une vitesse lente)
  while(zeroSwitch)//tant que fin de course n'est pas pressé ((!zeroSwitch)inverse le comportement)
  {
    stepper0.continuous();//tourne !
  }
  stepper0.refresh(0, 30);//on change de sens
  for(int i=0;i<10; i++)//et on recule de 10 pas pour se décoller du switch
  {
    stepper0.continuous();
  }
Code non testé ! Mais il n'y a pas de difficulté particulière, ça devrait fonctionner.
Avatar du membre
RitoonL
Administrateur du site
Messages : 112
Enregistré le : dim. 31 oct. 2021 10:21

Re: code moteur pas a pas- init & bouton de rotation

Message par RitoonL »

Il faudrait l'intégrer à la librairie stepper !
Administrateur - Forum arpschuino
Jacques
Messages : 270
Enregistré le : dim. 31 oct. 2021 19:37

Re: code moteur pas a pas- init & bouton de rotation

Message par Jacques »

Bon, on est en train de bosser cette semaine avec Guillaume sur ce code.
Le moteur est un moteur avec réducteur x 15.
Voici le code fonctionnel, avec la séquence d'initialisation dans le setup et les bouton de rotation dans la loop:

Code : Tout sélectionner

#include<Arpschuino.h>
#include <ArpStepper.h>
#include <lib_dmx.h>

#define nbr_motor 1

unsigned int nbre_circuits= nbr_motor*2;
int address=1; 
unsigned long previousMillis=0;

// configuration matérielle, connexion et réglage du pilote :
//(pin dir,pin pull, step_per_revolution)
ArpStepper stepper0(Arp1,Arp0,800);
uint8_t zeroSwitch=Arp2;//fin de course, capteur de position ou autre sur Arp8
uint8_t forward=Arp3;//bouton "en avant"
uint8_t backward=Arp4;//bouton "en arriere"
//bool DMX_allowed = true;


void setup() {
  pinMode(zeroSwitch, INPUT_PULLUP);
  pinMode(forward, INPUT_PULLUP);
  pinMode(backward, INPUT_PULLUP);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite (LED_BUILTIN, HIGH);

  Arp_arpdress_board();

  //(RPM_min(>0), RPM_max , revolutions, resolution(default 255))
  stepper0.init(1, 40, 60, _8bits);

/////////////////////////////sequence d'initialisation //////////////////////////////////////////
  stepper0.refresh(255, 255);//on définit un sens de rotation(255,0 pour alller dans l'autre sens), et une vitesse (ici 30 pour une vitesse lente)
  while (digitalRead(zeroSwitch))//tant que fin de course n'est pas pressé ((!zeroSwitch)inverse le comportement)
  {
    stepper0.continuous();//tourne !
    digitalWrite(LED_BUILTIN,  LOW);
  }
  digitalWrite(LED_BUILTIN,  HIGH);
 
  for(int i=0;i<10000; i++)//et on recule de 10000 pas pour se décoller du switch
  {
    stepper0.refresh(0, 255);
    stepper0.continuous();
  }
//////////////////////////DMX init/////////////////////////////////////////////
  DMX.attachRXInterrupt  (frame_received);
  DMX.set_control_pin(ArpDMXControl);    // Arduino output pin for MAX485 input/output control (connect to MAX485 pins 2-3) 
  DMX.set_rx_address(address);      // DMX start address
  DMX.set_rx_channels(nbre_circuits);     // number of rx channels
  DMX.init_rx(DMX512);        // starts universe 0 as rx
}

void loop() 
{
   if(millis() - previousMillis >= 500)       // une demi-seconde sans réception
   {                                          //  half a second without reception
      previousMillis = millis();   
      digitalWriteFast(LED_BUILTIN,  HIGH);         // éteind la led  
   } 

  if(!digitalRead(forward))//si le bouton "en avant" est pressé
  {
    stepper0.refresh(255, 255);
    stepper0.continuous();//tourne !
    //DMX_allowed = false;//bloque la lecture du DMX
    DMX.stop_dmx();////////////////////////////////a verifier !
  }
  else if(!digitalRead(backward))//sinon, si le bouton "en arriere" est pressé
  {
    stepper0.refresh(0, 255);
    stepper0.continuous();//tourne !
    //DMX_allowed = false;//bloque la lecture du DMX
    DMX.stop_dmx();
  }
  else //if(DMX_allowed = true)
  {   
   stepper0.perform();
  }
}

void frame_received(uint8_t universe) // cette boucle est exécutée à chaque fois qu'une trame DMX est reçue 
                                      // this loop is executed each time a DMX frame is received
{
   Arp_led_temoin ();// la led clignote si elle reçoit un signal DMX 
                     // the led flashes if it receives a DMX signal
                     
   stepper0.refresh(DMX.RxBuffer[0], DMX.RxBuffer[1]);

}
Répondre