Page 1 sur 1
code moteur pas a pas- init & bouton de rotation
Posté : sam. 13 nov. 2021 16:39
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
Re: code moteur pas a pas- init & bouton de rotation
Posté : sam. 13 nov. 2021 21:31
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.
Re: code moteur pas a pas- init & bouton de rotation
Posté : dim. 14 nov. 2021 10:26
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 ?
Re: code moteur pas a pas- init & bouton de rotation
Posté : lun. 15 nov. 2021 18:55
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.
Re: code moteur pas a pas- init & bouton de rotation
Posté : mar. 16 nov. 2021 07:40
par RitoonL
Il faudrait l'intégrer à la librairie stepper !
Re: code moteur pas a pas- init & bouton de rotation
Posté : mer. 1 déc. 2021 22:04
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]);
}