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);
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.
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 ...
On est revenu au servo , ç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.
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 ...
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 ...
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
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 , tout ça fait à distance!
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 ...
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
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.
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 ... ... 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 ...
/*
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.
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
mais c'est le sketch qui est utilisé dans la vidéo youtube ci dessus ?..
me trompe-je ?
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.
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.
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 .......
il viennent de chez https://www.miuzei.com/ .