commande servomoteur infrarouge

Portrait de jpil

bonjour,

je cherche a commander un servomoteur par infrarouge avec arduino uno pour ouvrir ou fermer un verrou de porte. j'ai fait plusieurs essai et je n'arrive toujours pas a faire fonctionner mon montage. Quelqu'un est il en mesure de m'aider s'il vous plait?

merci jpil.

Portrait de brossden

Avec quoi tu veux commander l'ouverture et la fermeture du verrou, une télécommande type télévision ou autre ?

AS TU UN CODE DÉJÀ ?

Portrait de jpil

je voudrais le commander avec une telecommande de radio ou de bande led je ne sais pas encore mais ce n'est pas vraiment mon probleme. Je n'ai pas vraiment de programme non. je les trouves sur internet mais ils ne marchent pas alors je les arrange a ma sauce mais ca ne marche pas non plus j'en ai peut être essayé 7 ou 8

Portrait de jpil

voici un des codes pris sur internet qui ne marche pas je ne sais pas pourquoi pouvez vous me dire le probleme?

Portrait de jpil

#include <IRremote.h>
#include <Servo.h>
Servo myServo;
int RECV_PIN = 12; //connecteur sortie signal du recepteurIR sur broche 12
IRrecv irrecv(RECV_PIN);
decode_results results;
int angle;

void setup(){
  irrecv.enableIRIn(); // start recepteur
  myServo.attach(9);
  Serial.begin(9600);
}

void loop() {
  if (irrecv.decode(&results)) {
   if (results.value==0x4CB9C){ //Code telecommande<-                   //mettre ma telecommande
    myServo.write(0);
      delay(1000);
    }
    if (results.value==0x9CB9C){ //Code telecommande->                  //mettre ma telecommande
    myServo.write(180);
      delay(1000);
    }}
irrecv.resume();
}

Portrait de brossden

Je te propose de tester le programme qui suit mais attention !

Dans un premier temps tu devras compiler le programme et ouvrir la console Série à 230400 bauds.

Lorsque tu appuieras sur la touche qui correspond à OUVERTURE note le code 0x..... qui s'affichera puis fait de même pour la touche qui correspond à FERMETURE.

Remplace dans mon code 0x8CBC0 par la valeur que tu auras relevé pour OUVERTURE et remplace de même 0xCCBC0 par la valeur que tu auras relevé pour FERMETURE.

Comme ton servo moteur n'est utilisé que dans deux positions tu n'a pas besoin de la library "servo.h"

Recompile le programme et je te certifie que cela fonctionnera parfaitement !

Les codes 0x8CBC0 et  0xCCBC0 sont ceux qui correspondent à ma télécommande ! C'est pour cela que toi tu dois les remplacer par les Codes des touches que tu auras choisies.

La preuve en vidéo

    #include <IRremote.h>
    char RecepIr = 12;
    char MonServo = 9;
    IRrecv MonRecepIr (RecepIr);
    decode_results Recep;
    void setup()
    {
      Serial.begin(230400);
      MonRecepIr.enableIRIn();
      MonRecepIr.blink13(true);
      pinMode(MonServo,OUTPUT);
      pinMode(11,OUTPUT);
      digitalWrite(11,HIGH);
    }
    void loop()
    {
      if (MonRecepIr.decode(&Recep))
      {
        if ((Recep.value != 0xFFFFFF)) {
          Serial.print("0x");
          Serial.println(Recep.value, HEX);
          if (Recep.value == 0x8CBC0) {
            Serial.println("Ouverture");
            analogWrite(MonServo,230);
            delay(15);       
   }
          if (Recep.value == 0xCCBC0) {
            Serial.println("Fermeture");
            analogWrite(MonServo,1);
            delay(15)
;
          }
        }
        delay(300);
             MonRecepIr.resume();
      }
     }

Le code a été modifié

Portrait de jpil

#include <IRremote.h>

char RecepIr = 12;

char MonServo = 9;

IRrecv MonRecepIr (RecepIr);

decode_results Recep;

void setup()

{

  Serial.begin(230400);

  MonRecepIr.enableIRIn();

  MonRecepIr.blink13(true);

  pinMode(MonServo,OUTPUT);

}

void loop()

{

  if (MonRecepIr.decode(&Recep))

  {

    if ((Recep.value != 0xFFFFFF)) {

      Serial.print("0x");

      Serial.println(Recep.value, HEX);

      if (Recep.value == 0x4CB9C) {

        Serial.println("Ouverture");

        digitalWrite(MonServo,HIGH);

      }

      if (Recep.value == 0x9CB9C) {

        Serial.println("Fermeture");

        digitalWrite(MonServo,LOW);

      }

    }

    delay(300);

    

    if (digitalRead(9)==1)

    Serial.println("HIGH");

    else

    Serial.println("LOW");

    MonRecepIr.resume();

  }

  delay(50);

}

ca ne marche pas désolé le moniteur série est ok mais le moteur ne bouge pas

Portrait de brossden

Vérifie tes branchements, je ne comprends pas pourquoi tu as répéter mon code ?

Réponds au Chatte STP

Portrait de brossden

Peux tu me faire une copie du moniteur Série ?

Portrait de jpil

je peus vous l'envoyer par mail?

Portrait de jpil

c'est bon en fait. voila tout marche normallement sauf le moteur:

Portrait de brossden

 Tu n'as pas les même valeurs sur la console Série et dans le code !!!!!!!

0x9CB9C  pour 0x1397 !!!!!!!!!!!!!!!!!!!!!

Portrait de jpil

non c'est parce que je n'ai pas appuyer sur le bon bouton:

Portrait de brossden

Tu as un problème de câblage ou ton servo est mort !

Portrait de jpil

mon cablage est bon il est exactement comme ca en réalité:

Portrait de brossden

En essayant un servomoteur Chinois je me suis aperçu qu'il ne fonctionnait pas en tout ou rien comme celui de ma radiocommande. J'ai donc modifié le programme en PWM.

De plus le servomoteur ronflent dans certaines positions. Pour éviter cela dans le code qui suit j'ai interrompu la commande au bout de 600 millisecondes comme je pense que ton verrou reste de lui même dans la dernière position choisie.

#include <IRremote.h>
char RecepIr = 12;
char MonServo = 9;
IRrecv MonRecepIr (RecepIr);
decode_results Recep;
void setup()
{
  Serial.begin(230400);
  MonRecepIr.enableIRIn();
  MonRecepIr.blink13(true);
  pinMode(MonServo, OUTPUT);
  pinMode(11, OUTPUT);
  digitalWrite(11, HIGH);
}
void loop()
{
  if (MonRecepIr.decode(&Recep))
  {
    if ((Recep.value != 0xFFFFFF)) {
      Serial.print("0x");
      Serial.println(Recep.value, HEX);
      if (Recep.value == 0x8CBC0) {
        Serial.println("Ouverture");
        analogWrite(MonServo, 230);

      }
      if (Recep.value == 0xCCBC0) {
        Serial.println("Fermeture");
        analogWrite(MonServo, 1);
      }
    }
    delay(600);
    digitalWrite(MonServo, 0);

    MonRecepIr.resume();
  }
}

Portrait de jpil

Merci beaucoup maintenant ca marche ca pourra peut etre servir pour d'autres.

Portrait de brossden

Heureux de t'avoir rendu service !