Pivoter servomoteur

Bonjour à tous,

Je souhaite pour un projet faire pivoter un servomoteur lorsqu'un câble branché en A0 se débranche.

J'ai réalisé un programme cependant il arrive que le servomoteur ne pivote pas lorsque j'enlève le câble au A0. Il arrive aussi que le servomoteur pivote seul sans action de ma part.

Pouvez vous m'aider svp ?

Merci d'avance.

// C++ code
//
#include <Servo.h>

Servo servo_9;

void setup()
{
  pinMode(A0, INPUT);
  servo_9.attach(9, 500, 2500);
}

void loop()
{
  if (analogRead(A0) >= 1) {
    servo_9.write(0);
  } else {
    delay(5000); // attendre 5000 milliseconds
    servo_9.write(180);
  }
}

L'autre extrémité du fil est raccordée à quoi?
À priori, ton entrée A0 est en l'air lorsque le fil en question est déconnecté.
Tu lis A0 comme si tu voulais lire une tension analogique, puisque tu fais un analogRead() mais dans ton if tu testes si la valeur est supérieure ou égale à 1. Ce qui pour une conversion analogique/digitale est très faible et se situe dans le bruit de conversion pour une entrée qui serait connectée à GND.
Explique clairement ce que tu veux.

Mon fil branché en A0 est l'un des câbles d'un câble Jack relié à mon PC qui envoi de la musique.
Lorsque j'enlève le câble Jack, je souhaite donc que 5 secondes après le servomoteur pivote de 180 °.

Tu détectes un signal analogique? de quelle amplitude?
Les masses sont bien réunies?

malheureusement je ne m'y connais pas assez pour répondre à vos questions.

J'ai un peu modifié le programme ne me fonctionne toujours pas. Une idée de pourquoi cela ne fonctionne pas ?

// C++ code
//
#include <Servo.h>
int i = 0;

Servo servo_9;

void setup()
{
  pinMode(int (2), INPUT);
  servo_9.attach(9, 500, 2500); 
}

void loop() { 
  i = digitalRead(2);
  
  if (i== LOW) 
  {
    delay(5000); // attendre 5000 milliseconds
    servo_9.write(180);
  } 
  else {
    
    servo_9.write(0);
  }
}

Bonjour ttmrocket

Corriges:

	pinMode(int (2), INPUT);
// en
	pinMode(2, INPUT);

D'après ton programme, au repos, tu as un 1 (HIGH) et, quand on retire le câble, un 0 (LOW).
Dans ce cas, tu dois mettre une résistance de PULL_DOWN, 10k, sur ton entrée 2.
Actuellement ça ne fonctionne pas toujours quand le câble est enlevé, parce que, sans PULL_DOWN, ton entrée 2 est dite "en l'air" et peut capter n'importe quoi.

Tu peux faire sans résistance externe, en inversant ta logique, faire que, quand le câble est branché tu lises un 0 (LOW) et quand le câble débranché tu lises un 1 (HIGH), en utilisant la résistance interne PULL_UP de l'Arduino, ainsi:

// C++ code
//
#include <Servo.h>
int i = 0;

Servo servo_9;

void setup()
{
	pinMode(2, INPUT_PULLUP);
	servo_9.attach(9, 500, 2500);
}

void loop() {
	i = digitalRead(2);
	
	if (i== HIGH)     // Si le câble est débranché
	{
		delay(5000); // attendre 5000 milliseconds
		servo_9.write(180);
	}
	else {
		
		servo_9.write(0);
	}
}

Cordialement
jpbbricole

Bonjour pbbricole,

Votre programme fonctionne à la perfection.

Merci pour votre aide.

Bonjour,

Je reviens vers vous parce que j'ai rencontré un problème.

J'ai voulu faire fonctionner l'ensemble en l'alimentant avec une pile.
J'ai réalisé les tests avec une pile 9V. La LED de la carte arduino s'allume mais le servomoteur ne tourne pas. Je l'ai alimenté dans un cas avec le 5V de la carte arduino et dans un autre cas directement avec la pile.
J'ai réalisé le même test avec 4 piles AA en série et cela ne fonctionne toujours pas.

Je souhaite que l'ensemble fonctionne 1h. Comment dois-je faire pour y parvenir ?

Merci.

Bonjour ttmrocket

La pile 9V est à oublier pour ce type de montage, pas assez de "pêche".
Ce qui pourrait fonctionner, est un powerbank
image
Le défaut de ces powerbank est que si l'on ne tire pas assez de courant, il s'arrêtent.
Peut-être qu'avec un servo, ça tire assez?
Si tu en as un sous la main, ça vaut la peine d'essayer.
Autrement, dis moi quel modèle de servo tu emploies et, si j'ai ça, je fais des essais.
Autre solution pour maintenir le powerbank est de consommer avec une résistance.

Cordialement
jpbbricole

Bonjour,
Pour mes projets autonomes j'utilise des "Boucliers 18650". (rechercher sur le net "18650 battery shield")
Ces boitiers fournissent des broches de sortie en 5V et en 3V ainsi qu'une prise USB.
Ils existent avec 1, 2 ou 4 batteries. Et ils sont équipés d'un chargeur de batteries.

18650BatteryShield

A+

2 Likes

Attention quand-même hein ^^ C'est quoi le servo que tu utilises, un sg90?

Bonjour,

Oui j'ai bien un sg90. est-il préférable que j'utilise 4 piles aa en série ??

J'ai aussi modifier mon programme :

// C++ code

#include <Servo.h>

int i = 0;
Servo servo_10;

void setup()

{
  pinMode(A0, INPUT);
  servo_10.attach(10, 500, 2500);
}

void loop() {

  i = analogRead(A0);
  if (i >50)    // Si le câble est débranché

  {
     delay(6800);
     servo_10.write(180);
  }
      else
{ 
    servo_10.write(0);
   
}
            }

"Oui j'ai bien un sg90. est-il préférable que j'utilise 4 piles aa en série ??"

C'est fragile cette petite bête. Ne lui jette pas du 9v comme ça et ne l'alimente pas par la carte, elle n'aime pas ça.
J'utilisais deux batteries 18650 en série avec un stepdown réglable de mémoire) c'est super pour les tests, c'est très polyvalent. La solution apportée plus haut est tout aussi valable.
Les piles AA en série c'est suffisant pour un sg90 à mon avis mais les piles ça s'use vite... D'où les batteries :wink:

Ok ça marche. Je vais faire plusieurs tests alors.

Merci et bonne journée.

Si ton invention se trouve sur ton pc, n'oublie pas que tu peux trouver du 5v sur un port USB (et sur l'ATX). Ensuite, définis ton besoin, le SG90 est bien pour apprendre et effectuer des tests mais rarement suffisant lorsque la notion de couple entre en jeu. En plus, fragile qu'il est, ne t'y Attach pas trop (hihi) car ça n'est vraiment pas solide.
Pour info, sa consommation en pointe est de 600mA à 6v.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.