bonjour à tous ,
je suis tt nouveau dans le monde de l'Arduino , et je m'apperçois que les possibilité sont énormes , la seul limite est notre imagination ...
Du coup après plusieurs investigation , je suis sur un projet de motorisation de bras ( PAN et Tilt MVT ) à l'aide de moteur pas à pas .
Pour la partie commande des moteurs avec un joystick cela fonctionne mais
Je me retrouve bloqué sur 2 problèmes au niveau du programme :
j'aimerai qu'a l'allumage du système les moteur face un cycle de positionnement , pour ce retrouver après la procédure en position HOME ( voir schéma joint )
le principe , peu importe la positon du moteur ( de l'axe ) à l'allumage , on lui dit de partir dans un sens ou dans l'autre et dès que le capteur A est en ''Digital right/ HIGH ) on dit au moteur de faire -500 pas , ce qui le positionne au pas HOME
sinon si il part dans l'autre sens , dès qu'il touche le capteur B , il devra faire 500 pas
Une fois cette position Home effectuée , le moteur sera prêt à recevoir les commandes de joystick , mais dans la limite max des capteur A et B , avoir également un fonction qui ''dit'' pendant la manipulation du joystick : si tu touches le capteur A '' stop'' une sorte de butté et idem pour la capteur B
Voila , j'espère que je suis assez clair
Dans l'attente de vos conseils
cordialement
Mr Moinet
merci pour votre réponse ,
mais justement j'ai essayé de faire déplacer le moteur de qq pas d'un coté , mais avec la fonction que j'utilise
''moteur step '' il se déplace mais ne prends pas en comte les autre conditions pendant son déplacement
Vos "fins de course" doivent être prioritaires sur toutes autres commandes : ils doivent déclencher une interruption. Dans la mesure où votre fonction d'avancement ne peut pas être stoppée, via l'interruption vous pourrez couper l'alimentation des moteurs en attendant que votre fonction d'avancement se termine.
Il serait toutefois préférable d'avoir une fonction d'avancement qui puisse se faire arrêter par logiciel (via les interruptions).
bonsoir et merci pour votre aide
c'est vrai que là je seiche , je vous joint le code actuel :
#include <Stepper.h>
// initialiser la bibliotheque stepper sur les broches D8 a D11:
Stepper myStepperPan(2048, 8,10,9,11); //Attribution des broches
int X_pin = 0; // entrée analogique A0
int ButeA = 2 ;// entrée numérique capteur A
unsigned long lastTime = 0;
unsigned long thisTime = 0;
unsigned long lastTime2 = 0;
unsigned long thisTime2 = 0;
int buteStateA = 0 ;
void setup() {
myStepperPan.setSpeed(20); // de 4 a 14 vitesse de rotation
pinMode(ButeA, INPUT);
}
void loop()
{
buteStateA = digitalRead(ButeA);
if (buteStateA == LOW) { // si le butéee n'est pas actionné alors on tourne vers le capteur
myStepperPan.setSpeed(5);
myStepperPan.step(-1000);
}
else{ myStepperPan.setSpeed(5); // sinon quand le capteur est acctionné on retourne au point HOME ( 500 pas du capteur A à la position home )
myStepperPan.step(500);
}
// ce cycle doit ce faire uniquement à l'allumage
// puis le reste du programme tourne ensuite à partir d'ici
{
int sensorValue = analogRead(X_pin);
int motorSpeed = map(sensorValue, 0, 1023, -500, 500);
thisTime = millis();
// si le joystick n'est pas à la position zéro
if (abs(motorSpeed) > 0){
// et si un temps raisonnable s'est écoulé depuis
// la dernière rotation du moteur
if ((thisTime - lastTime) > abs(abs(motorSpeed)-500)){
if (motorSpeed > 0){
myStepperPan.step(1); // un step en sens horaire
}
else{
myStepperPan.step(-1); // un step en sans antihoraire
}
lastTime = thisTime; // archivage du moment de la dernière rotation
}
}
}
}
if (buteStateA == LOW) { // si le butéee n'est pas actionné alors on tourne vers le capteur
myStepperPan.setSpeed(5);
myStepperPan.step(-1000);
}
Comme tu ne sais pas à quelle distance tu te trouves du capteur ce serait peut-être judicieux d'avancer un pas à la fois de tester si le capteur est atteint et boucler comme ça jusqu'à trouver le capteur.
bonsoir fdufnews , merci pour ta réponse , effectivement ce serait plus judicieux , mais je n'arrive pas à trouver la formule magique pour réaliser cette fonction
Dans ce code que j'avais fait pour un robot à roulette, la roue avant était dirigée par un moteur pap, il touchait un inter à droite puis à gauche et le nombre de pas était divisé par deux pour trouver le point milieu de la roue directrice....
bonjour , et encore merci pour vos différentes solutions
mais du fait , que sus novice dans la prog arduino , je "bloque'' toujours :
je n'arrive pas à trouver la solution de code pour dire en effet à mon moteur a la mise ss tension du systeme d'avancer d'un certain nombre de pas , jusqu’à toucher le capteur ( qui est normalement ouvert ) puis une fois qui touche le capteur ( état '' fermé '' = if capteur digital read ( =HIGH) alors dire au moteur pas à pas de faire +500 pas ( donc de revenir au centre du montage )
quelle est la solution ? effectivement comme le suggère fdufnews de vérifier l'état du capteur à chaque avancement de pas ( sachant qu'a l'allumage l'axe peu etre à placé n'importe où )
je n'arrive pas à retranscrire cette logique ....
de plus j'aimerai avoir votre avis , sur le choix de mon moteur pas à pas , pour l'instant je test sur un Nema 17
de 40N/cm , mais il ne sera pas assez puissant pour les efforts que je souhaite lui imposer
l'utilisation d'un Nema 23 serait plus judicieux ? et je ne veux pas non plus que le moteur soit '' gros '' et ''lourd''
il doit certainement exciter un compromis
il me faudrait un couple entre 60N/cm et 80N/CM
vous connaissez des sites avec ce type de moteur
un grand merci d'avance pour votre aide
cordialement
Nicolas
Comme je l'ai préconisé au début du post et fdufnews vien de le rappeler,
Il faut avancer d'un pas tester l'état du switch et avancer un pas tant que les switch n'est pas activé.
Donc au lieu de faire:
if (buteStateA == LOW) { // si le butéee n'est pas actionné alors on tourne vers le capteur
myStepperPan.setSpeed(5);
myStepperPan.step(-1000);
}
pouquoui ne pas essayer
while(buteStateA == LOW) { // si le butéee n'est pas actionné alors on tourne vers le capteur
myStepperPan.setSpeed(5);
myStepperPan.step(1); // ou -1
}
un grand merci Leptro , car effectivement avec la fonction '' While " ça fonctionne comme je souhaite
décidément il manque de la pratique ....
pendant que j'y suis , connaissez vous une manière de controler l'arduino avec un signal DMX ( signale que j'utilise dans le cadre de ma proffession ) pouvoir controler des sorties de l'arduino avec une console lumière
bonne journée à tous