probleme fonctionnement servo

bonjour je suis novice en programmation arduino et j’ai un soucis avec mon programme, la compilation se fait bien mais le servo ne fonctionne pas normalement il donne une impulsion à chaque seconde et ne fait pas son cycle qui devrait etre de 0 à 180 degrés .
si quelqu’un pouvait jetter un oeil
merci d’avance.

#include <LiquidCrystal.h>
#include <Wire.h>
#include <RTClib.h>
#include <Servo.h>

RTC_DS1307 RTC;

const int relais=7;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

Servo myservo; // create servo object to control a servo

int pos = 90; // variable to store the servo position

void setup() {
Wire.begin();
RTC.begin();
lcd.begin(20, 2);
pinMode (relais, OUTPUT);
myservo.attach(8); // attaches the servo on pin 8 to the servo object

}

void loop() {

//digitalWrite (relay,HIGH);
//digitalWrite (relay,LOW);

DateTime now = RTC.now();

// l’heure sur la premiêre ligne du LCD
lcd.setCursor(0, 0);
lcd.print(now.hour());
lcd.print(":");
if (now.minute() < 10) {
lcd.print(“0”);
}
lcd.print(now.minute());
lcd.print(":");
if (now.second() < 10) {
lcd.print(“0”);
}
lcd.print(now.second());

// la date sur la deuxième partie de la ligne1 du LCD
lcd.setCursor(10, 0);
lcd.print(now.day());
lcd.print("/");

switch (now.month()) {
case 1:
lcd.print(“01”);
break;
case 2:
lcd.print(“02”);
break;
case 3:
lcd.print(“03”);
break;
case 4:
lcd.print(“04”);
break;
case 5:
lcd.print(“05”);
break;
case 6:
lcd.print(“06”);
break;
case 7:
lcd.print(“07”);
break;
case 8:
lcd.print(“08”);
break;
case 9:
lcd.print(“09”);
break;
case 10:
lcd.print(“10”);
break;
case 11:
lcd.print(“11”);
break;
case 12:
lcd.print(“12”);
break;
}

lcd.print("/");
lcd.print(now.year());
delay(1000);
lcd.clear();
{

for (pos = 0; pos <= 180; pos += 1) // goes from 0 degrees to 180 degrees
// in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable ‘pos’
delay(15); // waits 15ms for the servo to reach the position

for (pos = 180; pos >= 0; pos -= 1) // goes from 180 degrees to 0 degrees
myservo.write(pos); // tell servo to go to position in variable ‘pos’
delay(15); // waits 15ms for the servo to reach the position
}

if (now.hour() == 16 && now.minute() ==15) {
digitalWrite (relais,HIGH);
lcd.setCursor(0,1);
lcd.print(“OSCILLO OFF”);
}

if (now.hour() == 16 && now.minute() == 16){
digitalWrite (relais,LOW);
lcd.setCursor(0,1);
lcd.print(“OSCILLO ON”);
}
if (now.hour() == 16 && now.minute() == 17) {
digitalWrite (relais,HIGH);
lcd.setCursor(0,1);
lcd.print(“OSCILLO OFF”);
}

if (now.hour() == 16 && now.minute() == 18){
digitalWrite (relais,LOW);
lcd.setCursor(0,1);
lcd.print(“OSCILLO ON”);
}

}

Bonjour,
Il faut mettre ton programme entre balises codes, voir les messages épinglés.
Pour ton servo, essaye plutôt avec la pin 9 ai lieu de la pin 8.

effectivement je remets mon programme avec plus de précisions .
J’ai essayé en 9, le problème reste le même.
le servo se met en butée à 0° et donne des accoups comme si il forçait.
De plus à chaque accoup le lcd fait une microcoupure.

Merci par avance…

/************************************************************

RTC DS1307 et un afficheur LCD.

Branchements du breakout RTC DS1307:
Gnd → GND
Vcc → 5 V
Sda → analog pin A4
Scl → analog pin A5

Branchements de l’afficheur LCD:
LCD RS pin → digital pin 12
LCD Enable pin → digital pin 11
LCD D4 pin → digital pin 5
LCD D5 pin → digital pin 4
LCD D6 pin → digital pin 3
LCD D7 pin → digital pin 2
LCD R/W pin → ground

***************************************************/

#include <LiquidCrystal.h>
#include <Wire.h>
#include <RTClib.h>
#include <Servo.h>

RTC_DS1307 RTC;

const int relais=7;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

Servo myservo; // create servo object to control a servo

int pos = 90; // variable to store the servo position

void setup() {
Wire.begin();
RTC.begin();
lcd.begin(20, 2);
pinMode (relais, OUTPUT);
myservo.attach(8); // attaches the servo on pin 8 to the servo object

}

void loop() {

//digitalWrite (relay,HIGH);
//digitalWrite (relay,LOW);

DateTime now = RTC.now();

// l’heure sur la premiêre ligne du LCD
lcd.setCursor(0, 0);
lcd.print(now.hour());
lcd.print(":");
if (now.minute() < 10) {
lcd.print(“0”);
}
lcd.print(now.minute());
lcd.print(":");
if (now.second() < 10) {
lcd.print(“0”);
}
lcd.print(now.second());

// la date sur la deuxième partie de la ligne1 du LCD
lcd.setCursor(10, 0);
lcd.print(now.day());
lcd.print("/");

switch (now.month()) {
case 1:
lcd.print(“01”);
break;
case 2:
lcd.print(“02”);
break;
case 3:
lcd.print(“03”);
break;
case 4:
lcd.print(“04”);
break;
case 5:
lcd.print(“05”);
break;
case 6:
lcd.print(“06”);
break;
case 7:
lcd.print(“07”);
break;
case 8:
lcd.print(“08”);
break;
case 9:
lcd.print(“09”);
break;
case 10:
lcd.print(“10”);
break;
case 11:
lcd.print(“11”);
break;
case 12:
lcd.print(“12”);
break;
}

lcd.print("/");
lcd.print(now.year());
delay(1000);
lcd.clear();
{

for (pos = 0; pos <= 180; pos += 1) // goes from 0 degrees to 180 degrees
// in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable ‘pos’
delay(15); // waits 15ms for the servo to reach the position

for (pos = 180; pos >= 0; pos -= 1) // goes from 180 degrees to 0 degrees
myservo.write(pos); // tell servo to go to position in variable ‘pos’
delay(15); // waits 15ms for the servo to reach the position
}

if (now.hour() == 16 && now.minute() ==15) {
digitalWrite (relais,HIGH);
lcd.setCursor(0,1);
lcd.print(“OSCILLO OFF”);
}

if (now.hour() == 16 && now.minute() == 16){
digitalWrite (relais,LOW);
lcd.setCursor(0,1);
lcd.print(“OSCILLO ON”);
}
if (now.hour() == 16 && now.minute() == 17) {
digitalWrite (relais,HIGH);
lcd.setCursor(0,1);
lcd.print(“OSCILLO OFF”);
}

if (now.hour() == 16 && now.minute() == 18){
digitalWrite (relais,LOW);
lcd.setCursor(0,1);
lcd.print(“OSCILLO ON”);
}

}

effectivement je remets mon programme avec plus de précisions .
J’ai essayé en 9, le problème reste le même.
le servo se met en butée à 0° et donne des accoups comme si il forçait.
De plus à chaque accoup le lcd fait une microcoupure.

Merci par avance…

/************************************************************

 RTC DS1307 et un afficheur LCD.
 
 Branchements du breakout RTC DS1307:
 Gnd --> GND
 Vcc --> 5 V
 Sda --> analog pin A4
 Scl --> analog pin A5
  
 Branchements de l'afficheur LCD:
 LCD RS pin --> digital pin 12
 LCD Enable pin  --> digital pin 11
 LCD D4 pin  --> digital pin 5
 LCD D5 pin  --> digital pin 4
 LCD D6 pin  --> digital pin 3
 LCD D7 pin  --> digital pin 2
 LCD R/W pin  --> ground
 
 ***************************************************/

#include <LiquidCrystal.h>
#include <Wire.h>
#include <RTClib.h>
#include <Servo.h>

RTC_DS1307 RTC;

const int relais=7;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

Servo myservo;  // create servo object to control a servo

int pos = 90;    // variable to store the servo position



 
void setup() {
  Wire.begin();
  RTC.begin();
  lcd.begin(20, 2);
  pinMode (relais, OUTPUT);
  myservo.attach(8);  // attaches the servo on pin 8 to the servo object

}
   



void loop() {

   //digitalWrite (relay,HIGH);
   //digitalWrite (relay,LOW);


  
  DateTime now = RTC.now();
  
  // l'heure sur la premiêre ligne du LCD
  lcd.setCursor(0, 0);
  lcd.print(now.hour());
  lcd.print(":");
  if (now.minute() < 10) {
    lcd.print("0");
  }
  lcd.print(now.minute());
  lcd.print(":");
  if (now.second() < 10) {
    lcd.print("0");
  }
  lcd.print(now.second());
  
  
  // la date sur la deuxième partie de la ligne1  du LCD
  lcd.setCursor(10, 0); 
  lcd.print(now.day());
  lcd.print("/"); 

  switch (now.month()) {
  case 1:
    lcd.print("01");
    break;
  case 2:
    lcd.print("02");
    break;
  case 3:
    lcd.print("03");
    break;
  case 4:
    lcd.print("04");
    break;
  case 5:
    lcd.print("05");
    break;
  case 6:
    lcd.print("06");
    break;
  case 7:
    lcd.print("07");
    break;
  case 8:
    lcd.print("08");
    break;
  case 9:
    lcd.print("09");
    break;
  case 10:
    lcd.print("10");
    break;
  case 11:
    lcd.print("11");
    break;
  case 12:
    lcd.print("12");
    break;
  }
 
  lcd.print("/"); 
  lcd.print(now.year()); 
  delay(1000);
   lcd.clear();
   {

  for (pos = 0; pos <= 180; pos += 1)  // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  
  
  for (pos = 180; pos >= 0; pos -= 1)  // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
}


  if (now.hour() == 16 && now.minute() ==15) { 
  digitalWrite (relais,HIGH);
 lcd.setCursor(0,1);
  lcd.print("OSCILLO OFF");
}

if (now.hour() == 16 && now.minute() == 16){  
  digitalWrite (relais,LOW);
lcd.setCursor(0,1);
  lcd.print("OSCILLO ON");
}
if (now.hour() == 16 && now.minute() == 17) { 
  digitalWrite (relais,HIGH);
 lcd.setCursor(0,1);
  lcd.print("OSCILLO OFF");
}

if (now.hour() == 16 && now.minute() == 18){  
  digitalWrite (relais,LOW);
lcd.setCursor(0,1);
  lcd.print("OSCILLO ON");
}
 
}

Re,
Fait un essai avec les exemples de la bibliothèque Servo.h

j’ai trouvé pour le problème pour le servo en comparant l’exemple servo il y avait un problème d’accolade (merci ICARE) par contre maintenant le ldc ne s’affiche que pendant 1 seconde environ une fois que le servo a fait son cycle complet , surement encore un problème de prog. Je patauge…

 Branchements du breakout RTC DS1307:
 Gnd --> GND
 Vcc --> 5 V
 Sda --> analog pin A4
 Scl --> analog pin A5
  
 Branchements de l'afficheur LCD:
 LCD RS pin --> digital pin 12
 LCD Enable pin  --> digital pin 11
 LCD D4 pin  --> digital pin 5
 LCD D5 pin  --> digital pin 4
 LCD D6 pin  --> digital pin 3
 LCD D7 pin  --> digital pin 2
 LCD R/W pin  --> ground
http://electroniqueamateur.blogspot.ca/2013/06/une-horloge-pour-votre-arduino-real.html
 
 ***************************************************/

#include <LiquidCrystal.h>
#include <Wire.h>
#include <RTClib.h>
#include <Servo.h>

RTC_DS1307 RTC;

const int relais=7;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

Servo myservo;  // create servo object to control a servo

int pos = 90;    // variable to store the servo position



 
void setup() {
  Wire.begin();
  RTC.begin();
  lcd.begin(20, 2);
  pinMode (relais, OUTPUT);
  myservo.attach(8);  // attaches the servo on pin 8 to the servo object

}
   



void loop() {

   //digitalWrite (relay,HIGH);
   //digitalWrite (relay,LOW);


  
  DateTime now = RTC.now();
  
  // l'heure sur la premiêre ligne du LCD
  lcd.setCursor(0, 0);
  lcd.print(now.hour());
  lcd.print(":");
  if (now.minute() < 10) {
    lcd.print("0");
  }
  lcd.print(now.minute());
  lcd.print(":");
  if (now.second() < 10) {
    lcd.print("0");
  }
  lcd.print(now.second());
  
  
  // la date sur la deuxième partie de la ligne1  du LCD
  lcd.setCursor(10, 0); 
  lcd.print(now.day());
  lcd.print("/"); 

  switch (now.month()) {
  case 1:
    lcd.print("01");
    break;
  case 2:
    lcd.print("02");
    break;
  case 3:
    lcd.print("03");
    break;
  case 4:
    lcd.print("04");
    break;
  case 5:
    lcd.print("05");
    break;
  case 6:
    lcd.print("06");
    break;
  case 7:
    lcd.print("07");
    break;
  case 8:
    lcd.print("08");
    break;
  case 9:
    lcd.print("09");
    break;
  case 10:
    lcd.print("10");
    break;
  case 11:
    lcd.print("11");
    break;
  case 12:
    lcd.print("12");
    break;
  }
 
  lcd.print("/"); 
  lcd.print(now.year()); 
  delay(1000);
   lcd.clear();
   {

  for (pos = 0; pos <= 180; pos += 1){  // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
  
  for (pos = 180; pos >= 0; pos -= 1){  // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
}

   }
  if (now.hour() == 16 && now.minute() ==15) { 
  digitalWrite (relais,HIGH);
 lcd.setCursor(0,1);
  lcd.print("OSCILLO OFF");
}

if (now.hour() == 16 && now.minute() == 16){  
  digitalWrite (relais,LOW);
lcd.setCursor(0,1);
  lcd.print("OSCILLO ON");
}
if (now.hour() == 16 && now.minute() == 17) { 
  digitalWrite (relais,HIGH);
 lcd.setCursor(0,1);
  lcd.print("OSCILLO OFF");
}

if (now.hour() == 16 && now.minute() == 18){  
  digitalWrite (relais,LOW);
lcd.setCursor(0,1);
  lcd.print("OSCILLO ON");
}
 
}

à quoi servent les { et } en début et fin avant les boucles for?

   {//celle ci

  for (pos = 0; pos <= 180; pos += 1){  // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
 
  for (pos = 180; pos >= 0; pos -= 1){  // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
}

}//celle ci

le ldc ne s’affiche que pendant 1 seconde environ une fois que le servo a fait son cycle complet , surement encore un problème de prog. Je patauge…

pas tout regardé, mais un servo pompe énormément sur l’alim de la carte, donc, cela peut éteindre le lcd lors de la mise en route du servo

effectivement je les ai enlevé, elles ne servaient à rien mais j'ai toujours mon problème de coupure LCD, comme si le programme coupait l'affichage LCD le temps du cycle du servo... j'ai également mis une alimentation plus forte pour voir si le servo n'ecroulaitnpas le LCD mais c'est pareil...

l'aim plus forte ne sert à rien, la carte délivre 200 mA maxi de mémoire.
donc alim séparée pour le servo avec masse commune avec la carte.

ca serait bien aussi d'avoir le lien du servo et sa référence

ci joint le lien pour le servo mais juste une précision, quand je compile juste l'exemple "servo" "sweep" , il fonctionne parfaitement, ce qui me fait dire que j'ai un problème dans ma prog...

Max PWM Signal Range (Standard) 553-2520μsec
Current Drain - idle (4.8V) 8mA
Current Drain - idle (6.0V) 8.8mA
Current Drain - no-load (4.8V) 300mA
Current Drain - no-load (6V) 340mA

quand je compile juste l'exemple "servo" "sweep" , il fonctionne parfaitement, ce qui me fait dire que j'ai un problème dans ma prog...

tu n'as dans ce cas, QUE le servo qui pompe, pas le lcd en plus

donc, alim séparée pour le servo ET masse commune, et là ca devrait rouler

pour voir, tu prends le code sweep
tu rajoute la lib lcd et un message sur le lcd
regarde ce qu'il se passe dans ce cas.
si ca fonctionne, ce qui m'étonnerait un peu, tant mieux, sinon, ca vient du servo qui pompe.

j,ai branché une autre alim pour le servo et toujours pareille le lcd se coupe le temps du cycle du servo...

norcam:
j,ai branché une autre alim pour le servo et toujours pareille le lcd se coupe le temps du cycle du servo...

attends, on ne sait pas ce que tu fais exactement et tu ne suis pas les indications.

teste ton 1er code, SANS le servo NI relais de connectés.
le lcd fait quoi?

il faut procéder par élimination et non faire n'importe quoi.

bon effectivement désolé je m’éparpille…
j’ai donc refait le programme avec l exemple servo sweep et la lib lcd en mettant un message.

mon message s’affiche, le servo fait le mouvement voulu sans problème. je constate simplement une légère variation de contraste sur le lcd…

alors maintenant, avec sweep, rajoute la partir relais en le faisant faire on off

  digitalWrite (relais,HIGH);
 lcd.setCursor(0,1);
  lcd.print("OSCILLO OFF");
delay(5000);
  digitalWrite (relais,LOW);
 lcd.setCursor(0,1);
  lcd.print("OSCILLO ON");

ok là le relais fonctionne et le LCD affiche normalement...

tout est connecté?
lcd, servo, relais?

oui les trois sont connectés.

ok, mais dans le code, tu utilise tout?
toujours a partir du code sweep

affichage lcd, mise en route servo, relais.

donnes plus de détails et le code que tu injecte, on ne peut deviner à chaque fois et avoir des bribes de réponses.

excuse infobarquee je n’ai pas encore l’habitude de ces forums…

pour être précis voilà le cycle qui se fait:
le servo va de 0° à 180°
le relais s’active
le lcd affiche “oscillo ON”

puis on a une tempo de 5 secondes

le servo va de -180° à 0°
le relais se relache
le lcd affiche “oscillo OFF”

donc dans ce cas l’affichage ne disparait pas pendant que le servo travaille.

je pense que le problème intervient lorsque je commence à utiliser la lib RTC…

#include <Servo.h>
#include <LiquidCrystal.h>


LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
Servo myservo;  

int pos = 0;    // variable to store the servo position
const int relais=7;//pin7 pour le controle du relai



void setup() {
  myservo.attach(8);  // attaches the servo on pin 8 to the servo object
  lcd.begin(20, 2); //nombre de lignes et de colonnes du LCD
  pinMode (relais, OUTPUT);
}
void loop() {
 
  
  for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }

  digitalWrite (relais,HIGH);
 lcd.setCursor(0,1);
  lcd.print("OSCILLO OFF");
delay(5000);
  digitalWrite (relais,LOW);
 lcd.setCursor(0,1);
  lcd.print("OSCILLO ON");