Servomoteur et controle de vitesse de rotation

Bonjour à tous,

question:
je veux avoir la possibilité de faire tourner un Nema 17 ou Nema 23 à 90° à deux vitesses différentes.
donc j'ai pensé utiliser

#include <Servo.h>
#define MIN  500 // Position 0° en microseconde 
#define MAX  500 // Position 90° en microseconde
#define MIN1  500 // Position 0° en microseconde 
#define MAX1  2500 // Position 90° en microseconde
Servo servo;
Servo servo1; 
int pos = 0;
void setup() {
servo.attach(8, MIN , MAX);
servo1.attach(8, MIN1 , MAX1);
}
void loop() {
    servo.write(0);
    servo1.write(0);

j'ai le droit ou pas de créer

servo.attach(8, MIN , MAX);
servo1.attach(8, MIN1 , MAX1);

ne m'incendiez pas ... je commence à bricoler ... :wink:

Il faudrait être un peu plus clair.
Tu parles d'un moteur pas-à-pas, d'un servo, ou d'un moteur pas-à-pas avec un contrôleur qui se pilote comme un servo.

Bonsoir neteraser

Des Nema ne sont pas des servo, mais des moteurs pas à pas.

Par contre, si tu parles réellement de servo, oui, tu peux faire ça:

Avec cette méthode:
servo.attach(8, MIN , MAX);
en fait tu fixes, dans la bibliothèque le minimum et maximum de 180°.

Tu as encore un problème ici:

#define MIN  500 // Position 0° en microseconde 
#define MAX  500 // Position 90° en microseconde

Cordialement
jpbbricole

bonsoir,

un Nema 17 ou 23 et un TB6600 ...

mais je crois que ça ne marche pas mon "idée" ...

merci de vous etes "penchés" sur mon truc ...

Bonsoir neteraser

Oui, ça peut marcher, mais avec la bonne bibliothèque, comme AccelStepper, pour les moteurs pas à pas.

Si tu veux un exemple :wink:

Cordialement
jpbbricole

bonjour,
je vais revoir le projet ... assez simple dans le "concept"

un moteur qui fait pivoter un bout de carton vertical ( cible papier ) ... une cible pour une carabine airsoft de mon petit fils ... avec des rotations programmées et d'autres aléatoires ... vitesses différentes ...
donc rien de compliqué. Je vais prendre un servomoteur du genre


pas besoin d'une bête de concours ni d'un super truc... et j'en ai dans le tiroir à bricoles...
le seul os que j'ai ... les vitesses différentes. comment les déclarer et les utiliser ...
je vais regarder les différentes biblio comme conseillé : accelstepper.h ou servo.h ?
that is the question ... :wink:

Bonjour neteraser

On est revenu au servo :wink:, ça simplifie les choses.
Pour régler la vitesse de ton servo, à la place de Servo.h, utilises la bibliothèque VarSpeedServo,h, tu peux y régler la vitesse.

Si tu veux un exemple, dis moi commnet tu pense démarrer un mouvement en première vitesse, en 2ème vitesse ainsi que le retour à 0.

A+
Cordialement
jpbbricole

bonjour,
sympa ! ... je vais tenter de me dépatouiller en utilisant la biblio ... ( pour comprendre le truc )
avant d'appeler au secours ...
merci de ta proposition , et surement à plus tard ... :wink:

Bonjour neteraser

C'est un excellent moyen de se lancer :wink:

A l'époque, j'avais fait ça pour un membre du forum:

Bonne journée et bonne bricole!
jpbbricole

super ! ... mais comment faire pour avoir cet effet "instantané" de rotation ?...

servomoteur ou moteur pas à pas ?...
tu as encore le sketch dans tes archives pour voir comment tu as réalisé le code ?...

Ah ... Yes ! ... c'est le sujet que j'ai suivi un bon moment ... top ! ... mais trop "poussé" pour ce que je veux et avec un fin de course de "position_home" ...
je voudrais éviter justement ce fin de course "position-home" ...
c'est aussi pour ça que je souhaite utiliser un servomoteur qui "connait" son point zéro ...

Bonjour neteraser

Tu dois avoir le même effet avec un servo en vitesse maximum?

Si c'est des cibles en carton, un servo bien musclé devrait suffit et simplifie les choses :wink:
ne serais ce que pour le point 0 qui n'est pas à trouver.
As tu une imprimante 3D?

Oui, superbe projet avec son qui dicte ce qu'il y a à faire et 3 disciplines, je m'amuse :wink:, tout ça fait à distance!

Une toute belle après-misi à toi!
jpbbricole

j'ai des servo de chez Miuzei qui supportent 25 Kgs et un de 40 kgs ... des betes de somme ...
mais je n'arrive pas à avoir cet effet instantané de rotation ... il met environ 3/4 de seconde pour aller de 0° à 90° ... et pareil de 90° à 0°... calage impeccable sans fin de course.
mon sketch fonctionne mais effectivement le "temps de rotation" est un peu mou ... et je cherche comment l'accélérer pour avoir un temps mini de rotation... https://www.miuzei.com/ ne m'a pas répondu ...
la biblio servo.h ?... comment modifier la vitesse de rotation ?...
la biblio AccelStepper.h ?... comment modifier la vitesse de rotation ?...
peut on aller dans la biblio pour modifier un parametre ?.
c'est là que je patine ... :flushed:

Bonjour neteraser
Je doute que tu puisses accélérer la rotation dans servo.h, ily a des spécialistes en bibliothèques qui pourraient te répondre.
Par contre, comme tu as des bêtes de somme, pourquoi ne pas multiplier le mouvement par 2 ou par 3 par bras de levier, ainsi tu commanderai 90° au servo et la cible en ferai 180? A cogiter :wink:
Si non je recherche mon programme pour moteur pas à pas.

PS: Regardes quelle est la tension maximum supportée par le servo, ça peut l'accélérer.

A+
jpbbricole

j'y ai pensé au bras de levier ... mais pas en stock ... disparu dans un autre bricolage surement ...
et c'est pour du fun pas pour la compet' des nationaux ... :wink: ... donc 3/4 de seconde ...

par contre si tu retrouves ton sketch ... je suis preneur d'idée ...

le servo acdepte 8.4 volts ... mais les alim sont généralement en 5 volts ... 12 volts ... du 7 ou 8 volts ... pas courant...
j'avais tenté le coup de monter en tension avec le potar d'ajustement d'une 5 volts mais passé 6 volts et quelque chose elle se mettait à chauffer et avait fini par cramer ...

Voilà, c'est une version sonorisée:

/*
    Name:       ARDFR_Cibles_3_7_Code01.ino
    Created:	15.08.2022
    Author:     jpbbricole

	15.06.2022  Sans homing ON-OFF-OFF
	15.06.2022  Avec homing GH
	24.09.2022  Pas de temporisation � la derni�re rotation post#149
*/

#include <AccelStepper.h>     // https://www.pjrc.com/teensy/td_libs_AccelStepper.html
#include <SoftwareSerial.h>     // Pour liaison avec carte son CATALEX

const int driverDirPin = 5;     // A4988 pin DIR
const int driverStepPin = 6;     // A4988 pin STEP
const int driverEnaPin = 7;     // A4988 pin ENABLE

struct mpapParamDef
{
  float maxSpeed = 800.0;
  float acceleration = 4000.0;
  long stepsNbr = 200;
  int microSteps = 4;     // ON-OFF-OFF
  long homeToStartSteps = 17;     // Nombre de pas entre home et la position de d�part de la cible
  long BackCorrErrSteps = 8;     // Nombre de pas de corrections pour les erreurs au retour du TB6600
  boolean reverseDirPin = false;
  boolean reverseStepPin = false;
  boolean reverseEnaPin = true;
};
mpapParamDef mpapParam;
AccelStepper mpap(1, driverStepPin, driverDirPin);

//------------------------------------- Go home (gohome)
const int gohomePin = 4;     // Pour contact position home
const int gohomeOnLevel = LOW;     // Etat quand Home

//------------------------------------- boutons (btn)
const int btnStartPin = 3;
const int btnStartOnLevel = LOW;

//------------------------------------- Cycles
const int cyclesRepetition = 1;
const int cyclesNombres = 5;
unsigned long ciblesOnMillis = 1000; //3000;
unsigned long ciblesOffMillis = 2000; //7000;
unsigned long beepOnMillis = 2000; //7000;

void setup()
{
	Serial.begin(115200);
	delay(500);

	pinMode(btnStartPin, INPUT_PULLUP);     // Bouton Start
	pinMode(gohomePin, INPUT_PULLUP);     // Contact de homing

	mpapRestart();
	mpap.enableOutputs();     // Activer les signaux du MPAP
	mpapGoHome();
}

void loop()
{
	if (digitalRead(btnStartPin) == btnStartOnLevel)     // Si bouton press�
	{
		for (int r = 0; r < cyclesRepetition; r ++)
		{
			Serial.println("Repetition : " + String(r + 1));
			tone(12, 440, 1000);
			delay(beepOnMillis);

			for (int c = 1; c <= cyclesNombres; c ++)
			{
				cibleCyle_3_7(c);
			}
			//tone(12,440,1000);
			mpapGoHome();
		}
	} 
}

//------------------------------------- Cibles
void cibleCyle_3_7(int cycleNum)
{
	Serial.println("\tCycle : " + String(cycleNum));

	Serial.println(F("\t\tOuverture"));
	mpap.runToNewPosition((mpapParam.stepsNbr / 4) * mpapParam.microSteps);   // 1/4 de tour
	delay(ciblesOnMillis);

	Serial.println(F("\t\tFermeture"));
	mpap.runToNewPosition(-mpapParam.BackCorrErrSteps);     // Fermer avec correction
	
	if (cycleNum != cyclesNombres)     // Si pas dernier cycle
	{
		delay(ciblesOffMillis);
	}

	Serial.println(F("\t\tCycle fin"));
}

//------------------------------------- Recherche de la position home
void mpapGoHome()
{
	mpap.setMaxSpeed(mpapParam.maxSpeed / 3);     // Ralentir la vitesse de rotation

	if (digitalRead(gohomePin) == gohomeOnLevel)     // Si d�j� home
	{
		Serial.println(F("Quittere FDC > > >"));
	mpap.runToNewPosition((mpapParam.stepsNbr / 8) * mpapParam.microSteps);   // S'�loigner de home
	}

	Serial.println(F("Recherche FDC < < <"));
	mpap.moveTo(-mpapParam.stepsNbr * mpapParam.microSteps);     // Reculer

	while (digitalRead(gohomePin) != gohomeOnLevel)    // Tant que pas home
	{
	mpap.run();
	}
	mpap.stop();
	mpap.setCurrentPosition(0);
	mpap.runToNewPosition(mpapParam.homeToStartSteps * mpapParam.microSteps);   // En position de d�part
	mpap.setCurrentPosition(0);
	mpap.setMaxSpeed(mpapParam.maxSpeed);
}

//------------------------------------- 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(mpapParam.reverseDirPin, mpapParam.reverseStepPin, mpapParam.reverseEnaPin);
}

C'est fait pour un driver A4988 mais ça se connectes facilement sur un TB6600.

A+
jpbbricole

yes ... c'est bien le code du montage que j'ai bien suivi un petit moment sur ce forum... mais ce que je veux éviter est le bidule du fin de couse .. tu avais utilisé un accroche serviette de mémoire :joy:
mais c'est le sketch qui est utilisé dans la vidéo youtube ci dessus ?..
me trompe-je ?

Bonjour neteraser

[Ah oui, fabuleux!](https://forum.arduino.cc/t/ciblerie-
Ce n'est pas moi que en est l'auteur, mais @joe30pc

Sur la vidéo c'est la toute première version et le programme la dernière version "indépendante", après cette discipline de tir 3_7 secondes a été intégré dans un programme où il y a 3 disciplines.

C'est tout à fait possible, la seule condition est que tu positionnes ta cible sur son point de départ avant d'allumer l'Arduino ou avant un reset, après, tant que tu ne fais pas un reset de l'Arduino, ça fonctionne. Je pense que c'est jouable, sans point 0.

Que j'aime cette tournure :wink:

Ca commence à être intéressant :wink:

A+
Bonne soirée
jpbbricole

ok ... donc si je prends ton sketch ( quel type de moteur ?... Nema 23 ou autre type ?... et il suffirait de "caler" le support de cible à la bonne position avant la mise sous tension ?
je vais tenter le coup de mettre en place pour tester...
merci de ton suivi encore une fois ...
bonne soirée

Encore une fois, désolé, mais dire Nema xyz c'est uniquement donner la taille de la platine de fixation.
Cela ne donne aucun renseignement sur la tension d'alimentation du moteur, sur le courant consommé par le moteur, sur la vitesse maximale du moteur, sur le couple du moteur.

Pour la même taille de platine de fixation, il peut y avoir des moteurs qui ont une tension d'alimentation nominale de plus de 10 V et un courant faible et d'autres avec une tension d'alimentation de quelques volts et un courant de plusieurs ampères.
C'est quand même important de le savoir !

Nema est le sigle d'un organisme de normalisation nord américain comme Afnor en France ou DIN en Allemagne.
Les normes Nema concernent de très nombreux produits, pas seulement les moteurs.

Nema 23 signifie que la platine de fixation fait 2,3 pouces sur 2,3 pouces.
Le moteur pouvant être pas à pas, brushless ou classique à balais
Nema est seulement une norme d'échangeabilité dimentionnelle.

Tout ce que l'on peut dire est que plus la platine est grande, plus le moteur pèse lourd et qu'alors "on peut supposer" qu'il est plus puissant, cela ne reste que des suppositions.

Pour identifier un moteur il faut sa référence exacte.
Pour valider si un moteur trouvé sur un site marchand convient à l'application, il faut rechercher ses caractéristiques à partir de sa référence.

Il me semble qu'il est important avant d'acheter de vérifier au minimum que le moteur sélectionné correspond aux conditions d'alimentations dont on dispose.

Pour plus de détails sur la variété dans les moteurs pas à pas, voir un site comme stepperonline.

Bonjour,

merci de ces précisions. Je pensais vraiment qu' une "référence" ( Nema 23 ) correspond à un modèle de servo par ses capacités ... force, tension par exemple ... j'en avais acheté sur le lama-jaune pour un bricolage ( pour mon petit fils ) et il convenait super bien... et des servos de petite et moyenne "puissance" . les Sg90 ont servis à tout ....... :wink:
il viennent de chez https://www.miuzei.com/ .