Ciblerie tir sportif

Bonjour
j'ai un projet de qui me demande de faire tourner un panneau en polystyrène de 50cm par 1.20m 1/4 de tour dans un sens puis 1/4 de tour dans l'autre avec une vitesse importante et avec une attente entre chaque de 3s
J'y arrive avec le code ci joint et à "vide" cela marche très bien mais lorsque je met le panneau avec la vitesse et l'inertie du panneau le moteur se décale de quelques pas à chaque 1/4 de tour.
Existe t'il un moyen (de préférence sans fins de course) de définir une position A et B et donc de pas les dépasser ?
Merci pour votre aide

j'ai un projet de qui me demande de faire tourner un panneau en polystyrène de 50cm par 1.20m 1/4 de tour dans un sens puis 1/4 de tour dans l'autre avec une vitesse importante et avec une attente entre chaque de 3s
J'y arrive avec le code ci joint et à "vide" cela marche très bien mais lorsque je met le panneau avec la vitesse et l'inertie du panneau le moteur se décale de quelques pas à chaque 1/4 de tour.
Existe t'il un moyen (de préférence sans fins de course) de définir une position A et B et donc de pas les dépasser ?
Merci pour votre aide

const int stepPin = 5; 
const int dirPin = 2; 
const int enPin = 8;
#define val 500 
void setup() {
  
  pinMode(stepPin,OUTPUT); 
  pinMode(dirPin,OUTPUT);
  pinMode(enPin,OUTPUT);
  digitalWrite(enPin,LOW);
}
void loop() {

    delay(2000);//60000
    tone(12,440,1000);
    delay(2000);//7000
   
  digitalWrite(dirPin,HIGH);  
   for(int x = 0; x < 400; x++) {
    digitalWrite(stepPin,HIGH); 
    delayMicroseconds(val);
    digitalWrite(stepPin,LOW); //LOW
    delayMicroseconds(val); 
  }
  delay(3000);
  
  digitalWrite(dirPin,LOW); 
   for(int x = 0; x < 400; x++) {
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(val);
    digitalWrite(stepPin,LOW);
    delayMicroseconds(val); }
while(1)

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

Ok désolé merci

Peut-être ne pas démarrer plein pot mais accélérer progressivement pour ne pas perdre des pas.
Même chose pour l'arrêt décélérer progressivement.

Si le code ne doit se dérouler qu'une seule fois, au lieu de mettre un while(1) à la fin de loop() il serait plus simple de placer le code dans setup().

Merci pour le retour

Je suis obligé de démarrer plein pot car la vitesse doit être très rapide et le code doit se faire 5 fois

mon matériel:
arduino r3
microstep driver
alim 24v 35w
nema23

J'ai vu qu'il existait un frein pour le nema23 c'est peut être le solution ?

à la limite pour la partie décélération, mais pour l'accélération (toute aussi importante) ça n'est pas utilisable.

Bonsiour joe30pc

Tu ne pourras pas éviter les problèmes dû à l'inertie!

Utilises une bibliothèque comme AccelStepper et utilises le paramètre d'accélération. Une accélération même "rapide" peut t'éviter une perte de pas.

Pour ton driver c'est l'option:
AccelStepper mystepper(1, pinStep, pinDirection);

Cordialement
jpbbricole

Merci pour vos réponses
En fait ce frein bloque ou débloque l'arbre du moteur à un point donné je pense que ça peut le faire
Mais ok je vais essayer avec la biblio AccelStepper

Tu as une idée de l'effort qui va s'appliquer sur l'ensemble, si tu bloques l'axe alors que le moteur tourne plein pot (la fixation du moteur, la fixation du frein, l'axe qui fait tourner le panneau, l'ensemble de la structure)?

Il faudrait se poser la bonne question. Est-ce que mécaniquement c'est la bonne solution?
Pourquoi, faire basculer un panneau, ce qui demande beaucoup d'énergie à cause de la pression que l'air exerce sur le panneau?
Pourquoi ne pas utiliser une guillotine, par exemple?

Bonsoir joe30pc

Si tu le désires je peux te passer le programme que j'utilise pour tester les divers paramètres de fonctionnement d'un moteur pas à pas, ce programme se commande par des instructions introduites par la ligne de commande du moniteur de l'IDE Arduino.

Cordialement
jpbbricole

Oui jpbbricole je veux bien

Bonsoir,

Tu peux adjoindre un encodeur sur ton moteur afin de travailler en boucle fermée

Bonsoir joe30pc

Ce programme fait faire un va et vient (commande ON) (PAS=400) par défaut et permet de tester, "en direct" des paramètres comme l'accélération, ACC=8000 pour mettre l'accélération à 8000.
Les commandes sont données via la ligne de commande du moniteur de l'IDE Arduino à 115200.
Le détail se trouve en remarque au-dessus de void cmdExecute(String commande).

Les seuls paramètres à adapter, éventuellement, sont:

#else     // Autre montage paramètres personnels
	const int driverDirPin = 5;     // A4988 pin DIR
	const int driverStepPin = 6;     // A4988 pin STEP
	const int driverEnaPin = 7;     // A4988 pin ENABLE
	const int driverEnableOn = LOW;     // Niveau du signal ENABLE actif
	const boolean driverReverseDirPin = false;
	const boolean driverReverseStepPin = false;
	const boolean driverReverseEnaPin = (driverEnableOn == LOW) ? true : false;
#endif

Le programme:

/*
    Name:       Tool_ReglageMpapA4988.ino
    Created:	07.04.2022
    Author:     jpbbricole
	
	Pour tester les paramètres d'un moteur pas à pas (MPAP)
*/
#include <AccelStepper.h>     // https://www.pjrc.com/teensy/td_libs_AccelStepper.html

//#define shieldGRBL

#ifdef shieldGRBL
	const int driverDirPin = 5;     // X = 5, Y = 6, Z = 7  Shield Nano X = 2, Y = 3, Z = 4
	const int driverStepPin = 2;     // X = 2, Y = 3, Z = 4  Shield Nano X = 5, Y = 6, Z = 7
	const int driverEnaPin = 8;     // A4988 pin ENABLE   GRBL commun à X, Y et Z
	const boolean driverReverseDirPin = false;
	const boolean driverReverseStepPin = false;
	const boolean driverReverseEnaPin = true;
	const int driverEnableOn = LOW;     // Niveau du signal ENABLE actif
#else     // Autre montage paramètres personnels
	const int driverDirPin = 5;     // A4988 pin DIR
	const int driverStepPin = 6;     // A4988 pin STEP
	const int driverEnaPin = 7;     // A4988 pin ENABLE
	const int driverEnableOn = LOW;     // Niveau du signal ENABLE actif
	const boolean driverReverseDirPin = false;
	const boolean driverReverseStepPin = false;
	const boolean driverReverseEnaPin = (driverEnableOn == LOW) ? true : false;
#endif

struct mpapParamDef
{
	boolean isOn = true;
	float maxSpeed = 800.0;
	float acceleration = 5000.0;
	long stepsNbr = 200;
	int microSteps = 1;
	boolean driverIsEnabled = true;
};

mpapParamDef mpapParam;
AccelStepper mpap(1, driverStepPin, driverDirPin);

//------------------------------------- Ligne de commandes
bool cmdNouvelle = false;      // Si une nouvelle commande a été reçue
String cmdTexte = "";               // Texte de la commande

#define messageDeveloppement Serial.println(F("!!!! Commande a developper !!!!\n"));

void setup()
{
	Serial.begin(115200);
	Serial.setTimeout(50);     // Pour fin des commandes depuis le moniteur
	delay(500);
	
	mpapRestart();
	mpap.enableOutputs();

	cmdExecute(F("OFF"));     // MPAP arrêté	
	Serial.println(F("Tapez la commande ON pour activer le va et vient"));
}

void loop()
{
	if (mpap.distanceToGo() == 0)     // Si mouvement terminé
	mpap.moveTo(-mpap.currentPosition());     // Va et vient, 2*PAS

	if (mpapParam.isOn)
	{
		mpap.run();
	}
  //--------------------------------- Ecoute du port serie
  serialEvent();     // Lecture du port
  if (cmdNouvelle)      // Si une nouvelle commande depuis le moniteur
  {
	  cmdExecute(cmdTexte);
	  
	  cmdTexte = "";
	  cmdNouvelle = false;
  }
}

/*------------------------------------- Commandes reconnues 
	?			Liste des paramètres
	ON			Va et vient ON
	OFF			Va et vient OFF
	PAS=400		Nombre de pas du va et vient à 400 (est multiplié par MPAS)
	MPAS=16		Nombre de micro-pas à 16
	VIT=800		Vitesse moteur pas à pas à 800 pas/seconde
	ACC=8000	Acceleration moteur pas à pas à 8000 pas/seconde
	MOVE=400	Tourner 400 pas
	GOTO=600	Aller à la position 600
	DRVENA		Driver MPAP activé (driverEnaPin)
	DRVDIS		Driver MPAP désactivé (driverEnaPin)
	
	Ces commandes ne sont pas sensibles à la casse.
'*	
*/

//------------------------------------- Commandes execution
void cmdExecute(String commande)
{
	String commandeNom = "";
	commande.toUpperCase();     // Tout en majuscules
	commande.replace(" ", "");     // Supprimer les espaces
	Serial.println("Execution de : " + commande);

	String cmdParam = commande.substring(commande.indexOf("=")+1);     // Extraction du paramètre
	commande = commande.substring(0, commande.indexOf("="));     // Extraction de la commande
	int cmdParamInt = cmdParam.toInt();

	if (commande.startsWith(F("?")))
	{
		paramList();
	}
	else if (commande.startsWith(F("ON")))
	{
		commandeNom = F("MPAP On");
		mpapParam.isOn = true;
	}
	else if (commande.startsWith(F("OFF")))
	{
		commandeNom = F("MPAP Off");
		mpapParam.isOn = false;
	}
	else if (commande.startsWith(F("VIT")))
	{
		commandeNom = F("Vitesse");
		mpapParam.maxSpeed = (float)cmdParamInt;
		mpapRestart();
	}
	else if (commande.startsWith(F("ACC")))
	{
		commandeNom = F("Acceleration");
		mpapParam.acceleration = (float)cmdParamInt;
		mpapRestart();
	}
	else if (commande.startsWith(F("PAS")))
	{
		commandeNom = F("Pas");
		mpapParam.stepsNbr = (long)cmdParamInt;
		mpapRestart();
	}
	else if (commande.startsWith(F("MPAS")))
	{
		commandeNom = F("Micro-pas");
		mpapParam.microSteps = cmdParamInt;
		mpapRestart();
	}
	else if (commande.startsWith(F("DRVENA")))
	{
		commandeNom = F("Driver ENABLE");
		mpap.enableOutputs();
	}
	else if (commande.startsWith(F("DRVDIS")))
	{
		commandeNom = F("Driver DISABLE");
		mpap.disableOutputs();
	}
	else if (commande.startsWith(F("MOVE")))
	{
		commandeNom = F("MOVE");
		messageDeveloppement;
	}
	else if (commande.startsWith(F("GOTO")))
	{
		commandeNom = F("Goto");
		messageDeveloppement;
	}
	else if (commande.startsWith(F("TOUR")))
	{
		commandeNom = F("Tour");
		messageDeveloppement;
	}
	else if (commande.startsWith(F("INIT")))
	{
		commandeNom = F("Init");
		messageDeveloppement;
	}
	else
	{
		Serial.print(F("Commande inconnue!!! ")); Serial.println(commande);
	}

	if (commandeNom != "")
	{
		Serial.println(commandeNom + " " + String(cmdParamInt));
		if(commande != F("?"))
		{
		cmdExecute(F("?"));
		}
		
	}
}
//------------------------------------- Moteur pas à pas (mpap)
void mpapRestart()
{
	mpap.stop();
	mpap.setCurrentPosition(0);
	mpap.setMaxSpeed(mpapParam.maxSpeed);
	mpap.setAcceleration(mpapParam.acceleration);
	mpap.setEnablePin(driverEnaPin);
	//                           DIR                STEP                    ENA
	mpap.setPinsInverted(driverReverseDirPin, driverReverseStepPin, driverReverseEnaPin);


	mpap.moveTo(mpapParam.stepsNbr * mpapParam.microSteps);
}

//------------------------------------- Paramètres (param)
void paramList()
{
	Serial.println(F("\nListe des parametres"));
	Serial.print(F("On/Off\t")); Serial.println((mpapParam.isOn) ? "ON" : "OFF");
	Serial.print(F("Pas\t")); Serial.println(mpapParam.stepsNbr);
	Serial.print(F("MicroP\t")); Serial.println(mpapParam.microSteps);
	Serial.print(F("Vitesse\t")); Serial.println(mpapParam.maxSpeed);
	Serial.print(F("Accel.\t")); Serial.println(mpapParam.acceleration);
	Serial.print(F("Driver\t")); Serial.println((digitalRead(driverEnaPin) == driverEnableOn) ? "ENABLE" : "DISABLE");
	Serial.println("");
}
/*-----------------------------------------------------------------------
  Réception de commandes depuis le moniteur
'*------------------------------------------------------------------------
*/
void serialEvent()                                       
{
  if (Serial.available())
  {
	  cmdTexte = Serial.readString();
	  cmdTexte.replace("\n", "");
	  cmdTexte.replace("\r", "");
	  cmdNouvelle  = true;
  }
}

A ta disposition pour toutes questions.
Cordialement
jpbbricole

Super! j'ai hâte de tester tout ça
je te tiens au courant de la suite
Merci pour votre aide
cordialement
joe30pc

Bonjour Jpbricole

J'ai televersé ton programme en modifiant mes paramètres comme ci-dessous effectivement la vitesse est excellente et le couple aussi qui devrait satisfaire mon projet
Par contre étant quand même très novice en code le tiens est pour moi très compliqué je ne comprend pas du tout son fonctionnement
Je suis arrivé a faire faire 1/4 de tour au PAP mais bien sur en va et vient et non en alternance

    //Name:       Tool_ReglageMpapA4988.ino
   // Created:  07.04.2022
   // Author:     jpbbricole
  
  //Pour tester les paramètres d'un moteur pas à pas (MPAP)
//*/
#include <AccelStepper.h>     // https://www.pjrc.com/teensy/td_libs_AccelStepper.html

//#define shieldGRBL

#ifdef shieldGRBL
  const int driverDirPin = 2;     // X = 5, Y = 6, Z = 7  Shield Nano X = 2, Y = 3, Z = 4
  const int driverStepPin = 5;     // X = 2, Y = 3, Z = 4  Shield Nano X = 5, Y = 6, Z = 7
  const int driverEnaPin = 8;     // A4988 pin ENABLE   GRBL commun à X, Y et Z
  const int driverMicroSteps = 1;
  const int driverEnableOn = LOW;     // Niveau du signal ENABLE actif
#else     // Autre montage paramètres personnels
  const int driverDirPin = 2;     // A4988 pin DIR
  const int driverStepPin = 5;     // A4988 pin STEP
  const int driverEnaPin = 8;     // A4988 pin ENABLE
  const int driverMicroSteps = 1;
  const int driverEnableOn = LOW;     // Niveau du signal ENABLE actif
#endif

struct mpapParamDef
{
  boolean isOn = true;
  float maxSpeed = 900.0;
  float acceleration = 8000.0;
  long stepsNbr = 250;
  int microSteps = 1;
  boolean driverIsEnabled = true;
};

mpapParamDef mpapParam;
AccelStepper mpap(1, driverStepPin, driverDirPin);

//------------------------------------- Ligne de commandes
bool cmdNouvelle = false;      // Si une nouvelle commande a été reçue
String cmdTexte = "";               // Texte de la commande

void setup()
{
  Serial.begin(115200);
  Serial.setTimeout(50);     // Pour fin des commandes depuis le moniteur
  delay(500);                                                                             //DELAI DEBUT DU PROGRAMME
  pinMode(driverEnaPin, OUTPUT);
  digitalWrite(driverEnaPin, driverEnableOn);
  
  mpapRestart();
  //paramList();

  cmdExecute(F("ON"));     // MPAP arrêté 
}

void loop()
{
  if (mpap.distanceToGo() == 0)     // Si mouvement terminé
  mpap.moveTo(-mpap.currentPosition());     // Va et vient, 2*PAS

  if (mpapParam.isOn)
  {
    mpap.run();


  }

Bonjour joe30pc

Mon code n'est pas là comme "base de départ" d'un programme, il n'est qu'un outil qui permet de régler les divers paramètres qui régissent un moteur pas à pas, après il faut écrire ton propre programme à partir de ces paramètres.
Dis moi ce que ton moteur doit faire, je t'aiguillerai volontiers.

Cordialement
jpbbricole

d'accord
en fait je m'occupe d'un club de tir et pour entrainer nos meilleurs avant les compets j'ai besoin de faire un système de retournement de cibles pour mieux comprendre voir le lien youtube surtout la deuxième partie qui nous intéresse le 3/7 secondes
En fait avec mon premier programme ça marche mais avec l'inertie du panneau le moteur se décale de quelque pas et du coup c'est mort

Cordialement

Bonsoir joe30pc

Il y combien de cycle 3/7 dans un exercice et comment se déclenche cet exercice?

Cordialement
jpbbricole

Bonsoir jpbbricole
Il y a 5 cycles
Attente 7s
Tir 3s
Départ sur buzzer
Merci cordialement

Bonjour joe30pc

Voilà un exemple, il faut adapter les paramètres à ton installation.
Il faut, également, adapter les réglages moteur

struct mpapParamDef
{
	float maxSpeed = 800.0;
	float acceleration = 10000.0;
	long stepsNbr = 200;
	int microSteps = 1;
	boolean driverIsEnabled = true;
	boolean reverseDirPin = false;
	boolean reverseStepPin = false;
	boolean reverseEnaPin = true;
};

en fonction des réglages définis au moyen de l'outil que je t'ai fourni.

Pour démarrer une séquence de 5 cycles 3/7, il faut mettre un bouton sur la pin 3 (startBoutonPin), bouton câblé, de l'autre côté, au GND (PULL_UP).

Le programme:

/*
    Name:       ARDFR_Cibles_3_7_secondes.ino
    Created:	05.07.2022
    Author:     jpbbricole
*/
#include <AccelStepper.h>     // https://www.pjrc.com/teensy/td_libs_AccelStepper.html

const int driverDirPin = 5;     // A4988 pin DIR
const int driverStepPin = 6;     // A4988 pin STEP
const int driverEnaPin = 7;     // A4988 pin ENABLE
const int driverMicroSteps = 1;
const int driverEnableOn = LOW;     // Niveau du signal ENABLE actif

struct mpapParamDef
{
	float maxSpeed = 800.0;
	float acceleration = 10000.0;
	long stepsNbr = 200;
	int microSteps = 1;
	boolean driverIsEnabled = true;
	boolean reverseDirPin = false;
	boolean reverseStepPin = false;
	boolean reverseEnaPin = true;
};

mpapParamDef mpapParam;
AccelStepper mpap(1, driverStepPin, driverDirPin);

const int startBoutonPin = 3;
const int startBoutonOnLevel = LOW;

const int cyclesNombres = 5;

void setup()
{
	Serial.begin(115200);
	delay(500);
	
	pinMode(startBoutonPin, INPUT_PULLUP);
	pinMode(driverEnaPin, OUTPUT);
	digitalWrite(driverEnaPin, driverEnableOn);
	
	mpapRestart();
}

void loop()
{
	if (digitalRead(startBoutonPin) == startBoutonOnLevel)     // Si bouton pressé
	{
		for (int c = 1; c <= cyclesNombres * 20; c ++)
		{
			Serial.println("Cycle : " + String(c));
			cibleCyle_3_7();
		}
	}
}

//------------------------------------- Cibles
void cibleCyle_3_7()
{
	Serial.println("\tCycle 3/7 start");
	
	Serial.println("\t\tOuverture");
	mpap.runToNewPosition(mpapParam.stepsNbr/2);     // Demi tour
	delay(3000);
	Serial.println("\t\tFermeture");
	mpap.runToNewPosition(0);     // Fermer
	delay(7000);
	Serial.println("\tCycle 3/7 fin");
}

//------------------------------------- Moteur pas à pas (mpap)
void mpapRestart()
{
	mpap.stop();
	mpap.setCurrentPosition(0);
	mpap.setMaxSpeed(mpapParam.maxSpeed);
	mpap.setAcceleration(mpapParam.acceleration);
	//mpap.enableOutputs();     // Activer les signaux du MPAP

	//                           DIR                       STEP                       ENA
	mpap.setPinsInverted(mpapParam.reverseDirPin, mpapParam.reverseStepPin, mpapParam.reverseEnaPin);
}

Il y a des informations, quand au déroulement du programme, dans le moniteur série (115 200) de l'IDE Arduino.

A+
Cordialement
jpbbricole