Pages: [1] 2   Go Down
Author Topic: Robot aspirateur autonome  (Read 3705 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,
Je n'y connais pas grand chose en électronique ni en programmation, mais je voudrais prouver à un ami qu'on peut construire soit-même un robot aspirateur autonome sans avoir à dépenser 500 euros dans un Roomba.

Je vais donc avoir besoin de l'aide de la communauté pour avancer dans ce projet.

J'ai reçu ce matin ma carte Arduino Leonardo et une breadboard.
Et j'ai sous le coude une voiture R/C et un aspirateur à main prêts à être sacrifiés.
J'ai en plus 2-3 bricoles pour compléter ce projet : LED IR, récepteur IR, résistances, bouton, microswitch...

Petite check-list :
- Éviter les obstacles (IR, contact...),
- Faire avancer, reculer, tourner le robot, avec 2 moteurs droite/gauche,
- Éventuellement, améliorer ses déplacements pour qu'ils soient plus ordonnés, moins aléatoires
- Intégrer l'aspirateur (+/- des brosses),
- Gérer l'alimentation des différentes parties (Arduino, moteurs, et aspirateur)


J'ai commencer gentillement par monter ce qui sera une détecteur d'obstacle, tel que décrit dans la première partie de cette page.
Mais ça ne marche pas. Voici le sketch que j'utilise :

Code:
int IRsensorPin = 9;
int IRledPin = 10;
int D13ledPin = 13;

void IR38Write() {
  for(int i = 0; i <= 384; i++) {
    digitalWrite(IRledPin, HIGH);
    delayMicroseconds(13);
    digitalWrite(IRledPin, LOW);
    delayMicroseconds(13);
  }
}

void setup(){
  pinMode(IRledPin, OUTPUT);
  digitalWrite(IRledPin, LOW);
  pinMode(D13ledPin, OUTPUT);
  digitalWrite(D13ledPin, LOW);
}

 void loop(){
  IR38Write();
  if (digitalRead(IRsensorPin)==LOW){
    digitalWrite(D13ledPin, HIGH);
  } else {
    digitalWrite(D13ledPin, LOW);
  }
  delay(100);
}

Une idée ??
« Last Edit: October 24, 2012, 03:55:11 am by mater79 » Logged

Ales
Online Online
Faraday Member
**
Karma: 39
Posts: 3591
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oula, pari loin d'être gagné :s

Si tu nous disais ce qui marche pas, ça nous aiderais à te répondre ... En plus "récepteur IR" c'est vague
Logged


Bretagne
Offline Offline
Edison Member
*
Karma: 16
Posts: 1392
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Tu allumes la led émettrice 13µs, puis l’éteins, attends 13µs, et regardes seulement après ce que tu as sur la réceptrice. Bref, tu ne lis la réceptrice que lorsque l'émettrice est éteinte. tu ne risques pas de détecter grand-chose... il faut lire le sensor quand l'émettrice est allumée, non?

pourquoi 385 pulses sur l'IR?  smiley-eek

Code:
int IRsensorPin = 9;
int IRledPin = 10;
int D13ledPin = 13;

boolean detected;

void IR38Write() {
    digitalWrite(IRledPin, HIGH);
    delayMicroseconds(13);
    detected = digitalRead(IRsensorPin);
    digitalWrite(IRledPin, LOW);
    delayMicroseconds(13);
}

void setup(){
  pinMode(IRledPin, OUTPUT);
  digitalWrite(IRledPin, LOW);
  pinMode(D13ledPin, OUTPUT);
  digitalWrite(D13ledPin, LOW);
}

 void loop(){
  IR38Write();
  if (detected){
    digitalWrite(D13ledPin, HIGH);
  } else {
    digitalWrite(D13ledPin, LOW);
  }
  delay(100);
}

il te faut peut-être nous donner un schéma si tu veux de l'aide...
Logged

Ales
Online Online
Faraday Member
**
Karma: 39
Posts: 3591
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

A mon avis c'est un code pour communiquer en IR
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Voici le schéma utilisé :


=> Super_Cinci : Ton code ne marche pas non plus. Sans la ligne "for(int i = 0; i <= 384; i++)", la LED IR n'émet rien (vérifié avec une caméra !) ; en rajoutant cette ligne, la LED émet bien ses IR, mais ça ne marche toujours pas.

La LED en Pin13 devrait s'éteindre quand on s'approche du récepteur IR puisque les IR sont réfléchis depuis la LED IR vers le récepteur : mais quand j'approche ma main (ou un miroir), rien ne se passe. En balaçant des IR avec une télécommande, ça marche : il n'y a donc pas de problème avec le montage.
C'est peut-être un problème de fréquence... Le code que j'ai trouvé est fait pour un recepteur IR Panasonic qui ne détecte que les IR modulés à la fréquence de 38kHz (d'où les 384 pulses en 10 millisecondes). Mais je ne sais pas si le récepteur que j'ai est un Panasonic ; la seul référence au dos du mien est K077, et google ne trouve rien avec ça.




« Last Edit: October 23, 2012, 08:38:42 pm by mater79 » Logged

Ales
Online Online
Faraday Member
**
Karma: 39
Posts: 3591
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 Pour en être sûr essaye en branchant le fil jaune de ton schéma sur le pin analog IN 0:

Code:
int IRsensorPin = 0;
int IRledPin = 10;


void setup(){
  pinMode(IRledPin, OUTPUT);
  digitalWrite(IRledPin, HIGH);

Serial.begin(9600);

}


 void loop(){

 Serial.println(analogRead(IRsensorpin));

  delay(100);
}


Il s'agit peut-être bêtement d'un signal trop faible pour qu'il soit considéré comme HIGH, mais tu le verras dans le moniteur s'il y a détection.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Marche toujours pas...
J'ai même essayer en ajoutant le "void IR38Write...", RIEN.

Par contre, dans le moniteur série, je vois bien qu'un signal est reçu quand j'utilise une télécommande.
Mais il n'y a rien d'analogique : quelque soit la distance, le chiffre passe de 1023 à 7.

Voici le dernier code utilisé :
Code:
int IRsensorPin = A0;
int IRledPin = 10;

void IR38Write() {
  for(int i = 0; i <= 384; i++) {
    digitalWrite(IRledPin, HIGH);
    delayMicroseconds(13);
    digitalWrite(IRledPin, LOW);
    delayMicroseconds(13);
  }
}

void setup(){
    pinMode(IRledPin, OUTPUT);
    digitalWrite(IRledPin, LOW);
     
  Serial.begin(9600);

}


 void loop(){
   IR38Write();

 Serial.println(analogRead(IRsensorPin));

  delay(100);
}

Logged

Ales
Online Online
Faraday Member
**
Karma: 39
Posts: 3591
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oui non mais ... essaye de comprendre un peu la démarche et ne recopie pas du code sans savoir du tout à quoi il sert.

Ton système est constitué d'un émetteur de lumière et d'un récepteur. Ton récepteur va réagir à la présence d'IR. Dans le code que je t'ai donné, la LED émettrice est toujours en marche, et c'est bien normal. Quand tu vas approcher un obstacle, il va y avoir réflexion des IR qui vont être partie captée par le récepteur qui va réagir en conséquence. Il n'y a pas besoin de moduler de quelque façon que ce soit le signal émetteur puisque ce n'est pas communication que tu cherches à avoir, ce qui était le but de ton code d'origine.

En plus le peu de référence sur le récepteur c'est pas super ... Par contre quelle résistance as-tu pris pour l'emetteur ? Elle est peut-être trop élevé et il n'y a pas d'émission d'IR car pas assez de courant.
Logged


France
Offline Offline
Faraday Member
**
Karma: 36
Posts: 3435
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je viens de jeter un oeil sur la page cité dans le premier post. Le récepteur infrarouge est un récepteur de télécommande. Il fonctionne donc avec une porteuse à 38kHz. C'est le pourquoi des impulsions sur la LED allumée 13µs éteinte 13µs. Un signal continu est ignoré par le récepteur.
D'après les explications sur le site en question, la sortie du récepteur doit être à 1 si le récepteur détecte une porteuse à 38kHz et elle est à 0 s'il ne la détecte pas.
Ces récepteur sont relativement directifs Je viens de lire la doc le champs de vue est assez large mais il faut quand même s'assurer que le récepteur voit bien l'émission de la diode infrarouge.
Il faudrait aussi s'assurer que la diode infrarouge émet bien sur la longueur d'onde qui est attendue par le récepteur infrarouge.
« Last Edit: October 24, 2012, 04:22:26 am by fdufnews » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci d'être aussi pédagogue, mais je ne copie pas stupidement tous les codes que je trouve.
Je croise vos infos avec celles des tutos disponibles sur le net pour comprendre ce que je fais.
C'est comme ça que j'ai corrigé dans ton code l'attribution de l'IRsensorPin de 0 à A0.

J'ai essayé avec le "void IR38Write..."  parce que j'ai cru comprendre que les capteurs IR sont fait pour ne réagir qu'à 38kHz ou 50kHz, histoire de ne pas être pollué par les émissions d'IR naturelles ou du moins non désirées.
Et en essayant à 50kHz, on a une modification du signal perçu : je vois apparaître le chiffre 7 une fois par seconde, mais toujours pas de détection d'objet.

Je n'hésiterai pas à vous dire si je suis perdu dans les codes que vous me proposez, et pour l'instant, tout est clair.

PS : vous trouverez une check-list dans le premier post pour voir l'avancement du projet.
« Last Edit: October 24, 2012, 04:19:23 am by mater79 » Logged

Ales
Online Online
Faraday Member
**
Karma: 39
Posts: 3591
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mais Super_Cinci t'as expliqué : avec IR38Write tu envois des impulsions, et dans un second temps seulement tu lis le récepteur, sauf que vitesse de la lumière oblige, ton récepteur est passé à zéro depuis des lustres ...

EDIT : autant pour moi y'a une lecture au milieu
« Last Edit: October 24, 2012, 04:32:43 am by B@tto » Logged


France
Offline Offline
Faraday Member
**
Karma: 36
Posts: 3435
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Un autre point, vérifier que le récepteur infrarouge que tu as fonctionne bien avec une porteuse à 38kHz. Il y a des variantes qui utilisent d'autres fréquences de porteuse.

Je serrais tenté de penser que le code d'origine est bon. donc à priori, il faut cherche un problème matériel.
Logged

France
Offline Offline
Faraday Member
**
Karma: 36
Posts: 3435
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mais Super_Cinci t'as expliqué : avec IR38Write tu envois des impulsions, et dans un second temps seulement tu lis le récepteur, sauf que vitesse de la lumière oblige, ton récepteur est passé à zéro depuis des lustres ...
Il y a un retard entre la disparition du flux et la sortie logique du détecteur. L'information est clairement identifiée dans la doc Vishay citée dans le lien du premier post par contre il n'y a aucune info pour le récepteur Sharp..
Logged

Ales
Online Online
Faraday Member
**
Karma: 39
Posts: 3591
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Comment t'as trouvé les docs ?
Logged


France
Offline Offline
Faraday Member
**
Karma: 36
Posts: 3435
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

En suivant le lien donné par mater79 dans son premier post.
Au début de l'article (5ème paragraphe) il y a la présentation des deux capteurs soit le Panasonic, soit le Vishay. La référence des récepteurs est un lien cliquable qui donne les docs (pour le vishay on tombe sur la page Allied Elec où il y a un lien datasheet).
Logged

Pages: [1] 2   Go Up
Jump to: