Partage

Projet robot arduino

Très urgent merci de votre compréhension

Sujet résolu
10 mars 2018 à 13:59:42

Bonjour, je vous demande de votre aide car cette année j'ai un projet où le but est de créer un robot capable de détecter un incendie dans une maison et d'agir. On est 5 dans le groupe et ma partie et de détecter la distance qu'il y a entre la flamme et le robot ainsi que de savoir si la source de fumée est bien du feu ou non.

Je vous expose le problème, j'ai à ma disposition un capteur de flamme et un servomoteur(le servomoteur permet au capteur de flamme qui est fixé dessus de détecter sur une zone circulaire) le capteur de flamme est de qualité moyenne voire médiocre(je n'ai pas le choix car nous avons un budget très serré) car celui-ci détecte seulement en binaire, en gros 0=pas de flamme et 1023=flamme. Il a une plage de longueur d'onde entre 720nm et 1100nm.

Ainsi j'ai réfléchi à une solution : en prenant un capteur de température qui lui détecte une plage de température entre 50°C et 120°C je peux avoir la température de la source donc la distance car la température dépend de la distance.

Or ce que je n'arrive pas à faire et de faire tourner le servomoteur (ca j'arrive mais c'est ce qui suit que je n'arrive pas) et l'arrêter lorsque le capteur de flamme à détecté la flamme pour qu'il puisse ensuite envoyer une information au capteur de température pour lui "dire" de commencer à lire la température. 

Ah oui j'utilise arduino

Merci de votre patience

Vous êtes demandeur·se d'emploi ?
Sans diplôme post-bac ?

Devenez Développeur·se web junior

Je postule
Formation
courte
Financée
à 100%
10 mars 2018 à 19:16:44

Salut, pourrais tu me montrer ton code pour que je puisse t'aider ?
Que je t'explique, un cube ça roule mieux qu'une sphère, si tu veux que tout tourne rond il faut savoir être carré...
14 mars 2018 à 17:10:01

Salut, 

Tu pourrais montrer ton code pour y voir plus claire, mais je pense que pour faire ça tu aura besoin d'utiliser une interruption.

Le code arduino s'exécute en séquentiel alors si tu ne met rien pour rompre la séquentialité mon servo continuera de tourner 

14 mars 2018 à 20:08:51

#include <Servo.h>

Servo monServomoteur;

int capt_ana = A0;

float capteur_flamme;

void setup() {
  monServomoteur.attach(9);
  pinMode(capt_ana, INPUT);
  Serial.begin(9600);
}

void loop() {
  
capteur_flamme = analogRead(capt_ana);

  Serial.println(capteur_flamme);
  if(capteur_flamme = 1023){

  //faite bouger le bras de 0° à 180°
 
 for(int position = 10; position <=300; position++){
  monServomoteur.write(position);
  delay(40);
 }

 //fait bouger le bras de 180° à 10°
 for(int position = 300; position <=10; position++){
  monServomoteur.write(position);
  delay(10);
 }

  }

  else{
    for(int position = 0; position <=0;){
  monServomoteur.write(position);
    }
    }
  

}
voila j'ai mis du temps pour vous répondre excusez-moi encore
15 mars 2018 à 12:18:19

Slaut, 

Une explication stp, tu veux que ton servo commence à tourner dès que le capteur de fumé détecte de la fumé c'est ça ?

et si rien n'est détecté il ne fait rien. 

#include <Servo.h>
 
Servo monServomoteur;
 
int capt_ana = 2; // pin qui permet l'utilisation d'interruption externe 
 
float capteur_flamme;
 
bool go = 0;
 
void blink ()
{
	go = !go 
}	
 
void setup() {
  monServomoteur.attach(9);
  pinMode(capt_ana, INPUT_PULLUP);  //Pour utiliser le mode interruptible donc pas de resistance extern 
  attachInterrupt(digitalPinToInterrupt(capt_ana), blink, RISING );  // permet d'ajouter une interruption a ton programme sur font montant du l'entrée et exécute la routine blink
  Serial.begin(9600);
}
 
void loop() {
   
capteur_flamme = digitalRead(capt_ana);	// comme ton capteur est en binaire tu peux utiliser un digitalRead
 
	Serial.println(capteur_flamme);
	if(capteur_flamme = HIGH)
	{
 
		//faite bouger le bras de 0° à 180°
  
		for(int position = 10; position <=300; position++)
		{
			while (go)		// tourne uniquement si le signal go est à 1
			{ 	
				monServomoteur.write(position);
				delay(40);
			}
		}
 
		//fait bouger le bras de 180° à 10°
		for(int position = 300; position <=10; position++)
		{
			while (go)		// tourne uniquement si le signal go est à 1
			{ 	
				monServomoteur.write(position);
				delay(40);
			}
		}
 
	}
 
	else
	{	
		/**********************************************
		
		je ne comprend pas pourquoi tu fait ça 
		
		for(int position = 0; position <=0;)
		{																	
			monServomoteur.write(position);
		}
		******************************************/
		monServomoteur.write(90); 			// ton sero est fixe vers  l'avant 
    }
   
}

tu n'avais pas aussi parler d'un capteur de température ? 

Je ne suis pas sur que c'est que tu cherche à faire, essaie et dit moi le résultat que tu obtient 

15 mars 2018 à 21:42:45

Le capteur de flamme est monté sur le servo, il doit donc y avoir une lecture après chaque rotation incrémentale, avec éventuellement un délai avant la lecture pour laisser au servo le temps de se déplacer.

Mais pour le capteur de température, que ce soit un capteur infrarouge (à distance) ou local, tu ne peux pas l'utiliser pour mesurer la distance qui dépend de bien trop de facteurs (configuration de la pièce et des courants d'air, type du matériau qui brûle...). Comme un capteur de flamme ne coûte rien, tu peux en utiliser 2 à distance l'un de l'autre, soit sur 2 servos indépendants, soit sur un système d'engrenages ou de poulies contrôlés par le même servo et faire la triangulation qui t'a déjà été proposée, mais sans avoir à déplacer le robot.

17 mars 2018 à 14:48:44

Salut merci pour votre attention mais je ne vois pas comment faire de la triangulation sans bouger  et  pour la personne qui m'a posté son code merci encore énormément mais il me semble que void blink n'existe pas sur arduino mais du coup je pourrais le remplacer par quoi à votre avis car je ne voois pas merci encore

17 mars 2018 à 16:51:27

goldone a écrit:

Salut merci pour votre attention mais je ne vois pas comment faire de la triangulation sans bouger 

Avec 2 capteurs de flammes qui constituent la base du triangle et que tu peux faire tourner pour déterminer à chaque point l'angle de la flamme qui se trouve devant le robot, comme tu connais la distance entre les capteurs et l'angle vers le 3e point (la flamme), tu peux déterminer la distance de la flamme (soit la distance de chaque bord de la flamme, soit la distance du centre de la flamme en faisant la moyenne des angles de détection mini et maxi de chaque capteur). 

17 mars 2018 à 19:07:19

Ah d'accord je n'avais pas compris ça comme ça merci beaucoup je vais tenter de le faire sur cette semaine et j'essaierai de vous recontacter si problème il y a en tout cas merci beaucoup

20 mars 2018 à 11:27:08

Salut,

Désolé pour le retard, oui void blink n'existe pas. donc tu va la créer (le code arduino requière au minimum deux fonctions mais libre a toi d'en ajouter autan que tu veux) 

22 mars 2018 à 16:42:04

je ne vois pas comment créer la fonction void blink

22 mars 2018 à 17:52:22

Tu l'écrit simplement (c'est une fonction que tu définis toi même). le compilateur comprendra

24 mars 2018 à 17:09:04

désolé mais je n'arrive pas du tout à faire fonctionner ce programme le robot ne veut pas s'arréter lorsqu'il détecte une flamme pourtant le capteur affiche qu'il détecte

26 mars 2018 à 9:47:25

Montre ton nouveaux code
26 mars 2018 à 12:01:47

include <Servo.h>

Servo monServomoteur;

int capt_ana = A3;

bool capteur_flamme = 0;

void setup() {
  monServomoteur.attach(9);
  pinMode(capt_ana, INPUT);
  Serial.begin(9600);
}

void loop() {
  
capteur_flamme = digitalRead(capt_ana);

  Serial.println(capteur_flamme);
  
  if(capteur_flamme = 1){

  //faite bouger le bras de 0° à 180°
 
 for(int position = 0; position <=180; position++){
  monServomoteur.write(position);
  Serial.println(capteur_flamme);
  delay(40);
 }

 //fait bouger le bras de 180° à 10°
 for(int position = 180; position <=0; position++){
  monServomoteur.write(position);
  Serial.println(capteur_flamme);
  delay(40);
 }

  }

  else{
    monServomoteur.write(90);
  }

}
26 mars 2018 à 12:23:10

Salut y'a déjà une erreur dans ta condition if 

if (capteur_flamme == 1)

tu dois mettre un double égale dans la condition if 

Ensuite si j'ai bien compris le fonctionnement de ton capteur, il renvoie 1 si il détecte des flammes, toi tu veux qu'il s'arrête lorsqu'il détecte des flammes, or selon ton code c'est le contraire, il s'arrête quand rien n'est détecté. je pense que tu doit inverser tes conditions 

if (capteur_flamme == 0)
{
ton code
}

else 
{
//ton code
}

enfin il te faudra aussi un traitement pour savoir quand t’arrêter (et connaitre la position des flammes) 


26 mars 2018 à 14:25:23

Comme je l'ai déjà écrit plus haut, le capteur de flamme doit être lu dans la boucle pour pouvoir trouver les angles de détection:

bool capteur_flamme = false;
int position;
// Le capteur de flamme est la condition de sortie de boucle
for(int pos = 0; capteur_flamme == 1; pos++){
  // Pour gérer le mouvement de va et vient on récupère une valeur croissante entre 0 et 359 qui reboucle à 0
  position = pos % 360;
  if(position > 180) {
    // Quand on arrive au milieu, on inverse la valeur pour repartir de façon décroissante à 0
    position = 360 - position;
  }

  monServomoteur.write(position);  
  delay(40);
    
  capteur_flamme = digitalRead(capt_ana);
  Serial.println(capteur_flamme);
}

// Si on arrive ici, une flamme a été détectée et le moteur s'est arrêté dans sa direction
Serial.print("Position de la flamme: ");
Serial.println(position);

// Arrêt de l'arduino (pour tester)
while(1) {}

PS: dans ta 2e boucle, tu incrémentais position au lieu de le décrémenter (position++ au lieu de position-- pour aller de 180 à 0).

2 avril 2018 à 15:31:02

C'est bon j'ai réussi ( pour la triangulation aussi) merci beaucoup à vous pour votre patience et votre énergie:)

Ah oui mon professeur me demande aussi de faire une expérience pour avoir la détection angulaire du capteur de flamme immobile (le capteur de flamme n'est au fait qu'un phototransistor) sur 2 dimension j'arrive le cône de détection est de 30° mais lui il veut un cône de détection en 3D je n'arrive à mettre en place un protocole et une expérience pour ceci merci encore pour votre aide

-
Edité par goldone 2 avril 2018 à 18:33:46

3 avril 2018 à 14:41:01

Salut, 

Bravo, tu pourrais alors partager ton code et ton circuit, pour faire profiter d'autres personnes qui auront le même problème à l'avenir 

3 avril 2018 à 17:28:59

Oui bonne idée :

#include <Servo.h>

Servo monServomoteur;
Servo monServomoteur2;


int capt_ana = A3;

bool capteur_flamme = false;

const int distance = 0.8;


int capt_ana2 = A5;

bool capteur_flamme2 = false;


int position;
int position2;

void setup(){
  monServomoteur.attach(9);
  pinMode(capt_ana, INPUT);
  Serial.begin(9600);

  monServomoteur2.attach(6);
  pinMode(capt_ana2, INPUT);
  Serial.begin(9600);
  
  }

void loop(){
 
  capteur_flamme = digitalRead(capt_ana);
  Serial.println(capteur_flamme);
for(int pos = 0; capteur_flamme == 1; pos++){
  // Pour gérer le mouvement de va et vient on récupère une valeur croissante entre 0 et 359 qui reboucle à 0
  position = pos % 360;
  if(position > 180) {
    // Quand on arrive au milieu, on inverse la valeur pour repartir de façon décroissante à 0
    position = 360 - position;
  }
 
  monServomoteur.write(position);
  delay(40);
    
  capteur_flamme = digitalRead(capt_ana);
  Serial.println(capteur_flamme);
}
 
// Si on arrive ici, une flamme a été détectée et le moteur s'est arrêté dans sa direction
Serial.print("Position de la flamme: ");
Serial.println(position);
 


//2ème servomoteur


  capteur_flamme2 = digitalRead(capt_ana2);
  Serial.println(capteur_flamme2);
for(int pos = 0; capteur_flamme2 == 0; pos++){
  // Pour gérer le mouvement de va et vient on récupère une valeur croissante entre 0 et 359 qui reboucle à 0
  position2 = pos % 360;
  if(position2 > 180) {
    // Quand on arrive au milieu, on inverse la valeur pour repartir de façon décroissante à 0
    position2 = 360 - position2;
  }
 
  monServomoteur2.write(position2);
  delay(40);
    
  capteur_flamme2 = digitalRead(capt_ana2);
  Serial.println(capteur_flamme2);
}
 
// Si on arrive ici, une flamme a été détectée et le moteur s'est arrêté dans sa direction
Serial.print("Position de la flamme 2: ");
Serial.println(position2);


float distance_robot_flamme = 0.8 * sin(position2) /( 180-sin(position+position2));
Serial.print(distance_robot_flamme);


}

Voila!!!

Projet robot arduino

× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
  • Editeur
  • Markdown