Bonjour à toutes et tous!
Est-il possible de piloter un servo 360 avec un potentiomètre? J'y arrive avec un 180 mais là je bloque... Merci
Bonjour, il me semble que cela vienne de la librairie servo.h
car voici la fonction qu'il y a dans Servo.cpp:
void Servo::write(int value)
{
if(value < MIN_PULSE_WIDTH)
{ // treat values less than 544 as angles in degrees (valid values in microseconds are handled as microseconds)
if(value < 0) value = 0;
if(value > 180) value = 180;
value = map(value, 0, 180, SERVO_MIN(), SERVO_MAX());
}
this->writeMicroseconds(value);
}
remplace par:
void Servo::write(int value)
{
if(value < MIN_PULSE_WIDTH)
{ // treat values less than 544 as angles in degrees (valid values in microseconds are handled as microseconds)
if(value < 0) value = 0;
if(value > 360) value = 360;
value = map(value, 0, 360, SERVO_MIN(), SERVO_MAX());
}
this->writeMicroseconds(value);
}
Je ne peux pas tester car je n'ai pas de servomoteur qui puissent faire le tour complet. Mais ça devrait marcher
Merci pour la réponse, je ne trouve que la librairiePWMServo avec ce void :
void PWMServo::write(int angleArg)
{
uint16_t p;
if (angleArg < 0) angleArg = 0;
if (angleArg > 180) angleArg = 180;
angle = angleArg;
// bleh, have to use longs to prevent overflow, could be tricky if always a 16MHz clock, but not true
// That 8L on the end is the TCNT1 prescaler, it will need to change if the clock's prescaler changes,
// but then there will likely be an overflow problem, so it will have to be handled by a human.
p = (min16*16L*clockCyclesPerMicrosecond() + (max16-min16)*(16L*clockCyclesPerMicrosecond())*angle/180L)/8L;
if (pin == SERVO_PIN_A) OCR1A = p;
if (pin == SERVO_PIN_B) OCR1B = p;
#ifdef SERVO_PIN_C
if (pin == SERVO_PIN_C) OCR1C = p;
#endif
}
Je peux changer les valeurs a 360, mais dois je appeler ma fonction comme pour du 180
val = analogRead(potpin);
val = map(val, 0, 1023, 0, 360);
servoA.write(val);
delay(15);
MErci
Je ne pense que tu peux mettre une val entre 0 et 360.
kroust:
Est-il possible de piloter un servo 360 avec un potentiomètre? J'y arrive avec un 180 mais là je bloque... Merci
Tu parles d'un servo à rotation continue ou d'un servo qui ne tournerait que sur 360°?
Un servo a rotation continue. Mon servo fait tourner un disque d'aprés une séquence audio de 2min, et je cherche un moyen de faire revenir le servo toujours au même point d'origine mais j'ai toujours un petit décalage et sur 10 lecture de la sequence et bien je perd la synchro... Je pense que c'est difficilement possible, du coup je compte mettre un petit potar pour que l'utilisateur déplace le servo sur le point d'origine.
Mon code
#include <Servo.h>
const int GO = 9;
const int LUMIERE1 = 10;
int broche_servoA = 3;
// potar
int potpin = 13; //
int val; //
int GoState = 0;
//int pos = 0; // variable to store the servo position
int rotationAv_V1 = 1500;// VITESSE A lente
int rotation_RETOUR = 1400;// VITESSE RETOUR
int rotation_FUSEE_UP = 1200;// VITESSE RETOUR
int rotationAv_nul = 1600; // VITESSE A nul
int rotationAv_A1 = 1100;// VITESSE A très lente
int rotationAv_V3 = 1520;// VITESSE arriere A très lente
Servo servoA;
void setup() {
pinMode(potpin, INPUT);
pinMode(GO, INPUT);
pinMode(LUMIERE1, OUTPUT);
}
void loop() {
GoState = digitalRead(GO);
if (GoState == LOW) {
digitalWrite(LUMIERE1, LOW);
// lecture piste sonore de 2min57
// -------------- im 1
// MOTEUR_OFF
delay(15130);
// -------------- im 2
MOTEUR_ON_1();
//
delay(19870);
// -------------- im 3 marché
MOTEUR_ON_1();
//
delay(30000);
// -------------- im 4
MOTEUR_ON_1();
//
delay(6000);
// -------------- im 5 filles
MOTEUR_ON_2();
//
delay(20000);
// -------------- im 6
MOTEUR_ON_1();
//
delay(6000);
// -------------- im 7
MOTEUR_ON_1();
//
delay(11000);
// -------------- im 8
MOTEUR_ON_1();
//
delay(5000);
// -------------- im 9
MOTEUR_ON_1();
//
delay(24000);
// -------------- im 10
MOTEUR_ON_1();
delay(2000);
// -------------- im 10
MOTEUR_ON_1();
//
delay(14000);
// -------------- im 11
MOTEUR_ON_0();
digitalWrite(LUMIERE1, HIGH);
delay(10000);
}
else {
servoA.detach();
digitalWrite(LUMIERE1, HIGH);
}
}
// temps de mise en marche moteur
void MOTEUR_ON_0() {
servoA.attach(broche_servoA);
servoA.writeMicroseconds(rotationAv_V3); //
delay(680);
servoA.detach();
}
void MOTEUR_ON_1() {
servoA.attach(broche_servoA);
servoA.writeMicroseconds(rotationAv_V3); //
delay(2000);
servoA.detach();
}
void MOTEUR_ON_2() {
servoA.attach(broche_servoA);
servoA.writeMicroseconds(rotationAv_V3); //
delay(1400);
servoA.detach();
}
void MOTEUR_ON_3() {
servoA.attach(broche_servoA);
servoA.writeMicroseconds(rotationAv_V3); //
delay(3000);
servoA.detach();
}
kroust:
Un servo a rotation continue. Mon servo fait tourner un disque d'aprés une séquence audio de 2min, et je cherche un moyen de faire revenir le servo toujours au même point d'origine mais j'ai toujours un petit décalage et sur 10 lecture de la sequence et bien je perd la synchro...
bonsoir
un servo dit "360° / rotation continue" , ne peut pas etre commandé en positionnement par les signaux standard de servo
les signaux servent juste à commander la vitesse et le sens de rotation , pas la contrainte " en positionnement angulaire"
Merci pour la réponse. Du coup je vais proposer 2 poussoirs avant et arrière pour recaler le moteur .
kroust:
Merci pour la réponse. Du coup je vais proposer 2 poussoirs avant et arrière pour recaler le moteur.
Explique mieux ton problème/souhait
Si ça se trouve, il y a beaucoup plus simple
Oki.
J'ai un servo 360 continu qui fait une révolution complète à vitesse lente en 2 min. Je souhaiterais pouvoir faire le revenir au même point de départ car cette séquence doit jouer plusieurs fois.( Petit décalage de quelques 1/10 de mm = gros décalage au bout de 20 lecture de la séquence).
Soit j'invite le spectateur à recaler lui même le servo (boutons ou potar), soit je place un contacteur d'arrêt en fin de course.
Pas trés fort en prog en plus ....
kroust:
... soit je place un contacteur d'arrêt en fin de course.
Tu vois , tu a trouvé tout seul , une des "plutôt bonnes solutions"
C'est (etait) le principe utilisé pour les top minute Zero (I.E horloge SNCF)
une rotation imposée supérieure au tour/mn (mais de pas beaucoup 8) ) ,
blocage grande aiguille en avance sur butée , liberation au top Zero
Mouarf, j'ai toujours préféré le train à l'avion.
Le projet est pour demain....
Pas encore codé de bouton sur arduino, je crois que la nuit va être longue...un café peut être