Pilotage moteur SM-S4303R

Bonjour

je n’arrive pas à commander ce servo moteur à rotation continue comme je le voudrais

voici mon code

#include <Servo.h>
Servo myservo;

void setup() 
{

  myservo.attach(9);  //pin du servo moteur
  myservo.write(10);  //Vitesse lente
  delay(5000); 		//attente rotation du moteur pendant 5s
  myservo.detach(); //arret du moteur pendant 10s
  delay(10000);

  myservo.write(100); //Changement de vitesse
  myservo.attach(9);  //re démarrage du moteur pendant 3s
  delay(3000);
  myservo.detach(); //arret du moteur
  
}

//Par défaut le SM-S4303R est paramétré pour une vitesse de 1.5 ms par pas.

void loop() {

}

je n’arrive pas à bien contrôler la vitesse du moteur
et encore moins à lui faire changer de sens
je n’arrive pas changer le fréquence d’impulsion pour le faire tourner dans le sens inverse des aiguilles d’une montre
j’ai essayé d’utiliser la commande analogWrite(9,127) mais sans succès

j’utilise un Nano et le moteur est connecté sur la pin 9
mon but est de le faire tourner 5 secondes en marche avant avec vitesse contrôlée
une pause
puis mon but est de le faire tourner 5 secondes en marche arrière avec vitesse contrôlée

merci d’avance de votre aide

Salut,

Le servoo que tu utilises tourne en continu, donc il possible de changer de sens de rotation en envoyant la bonne commande,voir image ci-dessous.

Si cela ne fonctionne pas, il faut passer par un moteur shield, comme pour un moteur à CC
servo-continu.JPG

Bonjour
non ce moteur ne fonctionne pas comme cela
en fait,
si la fréquence des impulsions est supérieur à 2mls il tourne dans un sens
inférieur, dans l'autre
le .write sert pour la vitesse
je pensais que pour changer la fréquence, je devais utiliser la commande analogWrite, mais cela ne change rien
et de plus, je ne gère pas la vitesse aussi finement que je le souhaiterais
existe t-il d'autre moteur ?
je recherche à faire
le moteur tourne dans un sens pendant x secondes, puis après un calcul, il doit retourner à sa position initiale
donc tourner dans l'autre sens pendant le même temps
il me faut un moteur puissant, avec une force de 4-5 Kg, comme celui-ci

merci encore

Salut,
Comment a tu fait le choix de ce servo moteur ??, car il semble être sous dimensionné pour le besoin, li faudrait savoir quel couple mini doit avoir ton moteur pour ensuite faire un choix de composant.

Tu parles d'une force de 4 à 5 kg, mais elle s'applique à quelle distance de l'axe de rotation du moteur, cela va permettre de déterminer le couple mini à fournir , un couple ou momment s'exprime en m.N, il traduit le produit d'une distance par une force.
Donc il faur que tu calcul ce couple et ensuite tu pourras choisir ton moteur.

Pour info : 1 kg environ 10 N


Couple = distance en (M) * Force en (Newton)

Bonjour
le couple est bon
il va devoir faire coulisser une plaque d'alu de 500-600Gr sur un raille, donc pas de problème
le hic est que je n'arrive pas à le faire tourner en sens inverse >:(

Pouvez faire un schéma de votre mécanisme ?.

je débute
donc j’ai suivi ce schéma

Moteur.jpg

Je ne parle pas du schéma éléctrique, mais de votre montage mécanique avec la charge et le servo

Cdt

Bonjour

pour le moment, le servo est sur ma table
le montage viendra plus tard, une fois toute la partie soft réglée

Si tu lis la doc du moteur, tu vois que comme l'a dit hameau un peu plus haut, ce moteur se pilote comme un servo.

The SM-S4303R continuous rotation servo converts standard RC servo position pulses into continuous rotation speed. The default rest point is 1.5 ms

Ce n'est donc pas la fréquence du signal qui fixe la vitesse mais la largeur d'une impulsion. Il faut utiliser la librairie Servo.

Bonjour à tous et merci pour vos réponses
mais j'avoue que je seiche

j'utilise la biblio servo, mais dans sa doc je ne trouve pas comment changer la largeur d’impulsion
je pensais que c'était avec analogWrite, mais cela ne change rien (je suis sur la pin 9)

j'ai fait un nombre incalculable d'essais et il tourne toujours dans le même sens :cry:

si vous aviez un bout de code pour m'aider

merci encore pour tout

Salut,

Arrives tu à avoir une position neutre, donc servo à l'arrêt en plus d'une rotation toujours dans le même sens, le servo est neuf ??

Bonjour
oui le servo est neuf

en suivant vos conseils, j'ai fait ce bout de code

void setup() {
  // put your setup code here, to run once:
    
    pinMode(9,OUTPUT);
    analogWrite(9,10); //Activer une modulation a 50% (127/255) sur la broche 9
    delay(3000);     //attente rotation du moteur pendant 3s
    digitalWrite(9,LOW); //Arreter du moteur
    
    delay(5000); //attente 5s
    analogWrite(9,150); //Activer une modulation a 50% (127/255) sur la broche 9
    delay(3000);     //attente rotation du moteur pendant 3s
    digitalWrite(9,LOW); //Arreter du moteur

}

void loop() {
  // put your main code here, to run repeatedly:

}

et ca marche
il va bien dans les deux sens, c'est super je m'approche du but

par contre, je ne maitrise plus la vitesse
mais j'avance :slight_smile:

si quelqu'un a une idée pour la vitesse

merci encore pour tout

Bonjour
grâce à votre aide, ça marche
il fallait que je regle le point 0 du servo moteur avec le potentiomètre (il est à fond en bas)
puis que je joue avec les valeurs pour la vitesse
voici le petit bout de code de test

void setup() {
  
      pinMode(9,OUTPUT);

      analogWrite(9,145); 
      delay(3000);
      analogWrite(9,LOW); 

      //analogWrite(9,121); 
}

void loop() {
}

et mon code complet si ca peux aider quelqu'un

boolean Nuit = 0;
boolean Jour = 0;

void setup() {
  Serial.begin(9600);
  pinMode(9,OUTPUT);
}

void loop() {

  int Lum = analogRead(A0);
  Serial.println(Lum);

  if (Lum > 1000)
  {
    if (Nuit == 0)
    {
        //On est de nuit et on ferme
   
        analogWrite(9,121);      //Activer une modulation  ce qui ajuste le sens et la vitesse point 0 - 127
        delay(4000);              //attente rotation du moteur pendant 4s
        analogWrite(9,LOW);       //Arreter le moteur

         Serial.println("Fermeture de la porte");
         Nuit = 1;
    }
    else
    {
      //On est de nuit porte déjà fermée
      Serial.println("Nuit sans action");
    }
    Jour = 0;
  }
else
  {

    if (Jour ==0)
    {
        //On est de jour et on ouvre
        analogWrite(9,167);       //Activer une modulation  ce qui ajuste le sens et la vitesse point 127 - 255
        delay(4000);              //attente rotation du moteur pendant 4s
        analogWrite(9,LOW);       //Arreter la modulation
      
      Serial.println("Ouverture de la porte");
      Jour = 1;
    }
    else
    {
      //On est de jour et porte déjà ouverte
      Serial.println("Jour sans action");
    }
       
    Nuit = 0;
  }
  
  delay(500);
  
}

merci tous encore