Aller au contenu


Photo
- - - - -

Projet robotique arduino


35 réponses à ce sujet

#21 samuelfer99

samuelfer99

    Membre

  • Membres
  • 17 messages

Posté 08 mai 2017 - 06:43

D'accord, ce que je ne comprends pas c'est
if(etat != etatCourant)
Ainsi que
if(etat == ETAT_A) {

Ou dois-je place la commande pour dire quand il détecte se code ir il effectue ca...

#22 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 504 messages
  • Gender:Male
  • Location:Paris

Posté 08 mai 2017 - 07:00

Ce que je t'ai donné, c'est pas la solution. C'est pour comprendre. C'est à toi de coder ;)

Reprends depuis le début. Je ne peux pas faire mieux. 

Prends le temps. reprends chaque ligne pour comprendre. Je suis certain que tu as tout ce qu'il faut.



#23 samuelfer99

samuelfer99

    Membre

  • Membres
  • 17 messages

Posté 08 mai 2017 - 07:02

J'essaye je vous promet..

#24 levend

levend

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 5 572 messages
  • Gender:Male
  • Location:Vendée

Posté 08 mai 2017 - 08:20

D'accord, ce que je ne comprends pas c'est
if(etat != etatCourant)
Ainsi que
if(etat == ETAT_A) {

Ou dois-je place la commande pour dire quand il détecte se code ir il effectue ca...

Donc pour comprendre :

"etat" c'est la variable qui indique dans quel mode tu te trouves (soit le mode autonome, soit le mode télécommandé) que tu as appelé ETAT_A et ETAT_B dans ton programme

"etatCourant"  c'est la variable indiquant le mode que tu demande avec la télécommande.

Donc si tu demandes un changement de mode, c'est deux valeurs sont différentes donc tu effectues le changement de mode.

 

Ensuite pour appeler l'une de tes fonction LoopA() ou LoopB(), tu vérifie la valeur de ta variable "etat" qui sera soit ETAT_A soit ETAT_B (c'est le mode choisi) et là tu appelles la fonction LoopA() ou LoopB() qui convient en fonction du mode choisi.

 

Maintenant quelques remarques sur ta façon de travailler :

  • Il est beaucoup plus facile d'écrire un programme quand tu as un nom assez explicite pour les constantes, les variables et même pour les fonctions. Je pense que pour les fonction LoopA() et LoopB() tu as recopier bêtement ce que Path t'avais écrit pour te guider, mais tu aurais pu les appeler modeAuto() et modeTelec() ça ne change rien au fonctionnement alors laisse comme ça maintenant mais tu t'y retrouverais plus facilement.
  • quand tu veux faire de la programmation, fait d’abord un algorithme qui décrit bien le fonctionnement du programme, ensuite le passage au code est simple.

Imprimante 3D : Prusa i3 (MK1) + CR-10S + CR-10 S5 + Artillery Sidewinder X2 + CR-30 + Elegoo Mars + Anycubic Wash & cure 2 + Phrozen Sonic Mega 8K + Phrozen Cure Mega

#25 samuelfer99

samuelfer99

    Membre

  • Membres
  • 17 messages

Posté 10 mai 2017 - 01:23

Bonjour, j'ai donc procéder autrement, j'ai fait un programme qui télécommande mon robot, et en appuyant sur la touche #, il se met en mode détection d'obstacle pendant 30 seconde, mais quand je televerse tout ca sur mon robot il fonctionne bien pour avancer reculer ou tourner mais des que jappuie sur # il fait qu'avancer et ne sarrete pas...

 

voici mon code : 

#include "IRremote.h"

//capteur ultra-son
#define trigPin 12           
#define echoPin 13


//contrôle moteur
#define avantM1 3 // Marche avant du premier moteur
#define arriereM1 4 // Marche arrière du premier moteur
#define L293DM1 9 // L293D Premier moteur
#define avantM2 5 // Marche avant du deuxième moteur
#define arriereM2 6 // Marche arrière du deuxième moteur
#define L293DM2 10 // L293D deuxième moteur

//Pin Module récepteur IR et variable
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;


#define ETAT_INDEFINI 0
#define ETAT_A 1
#define ETAT_B 2

int etat;

void setup() {
//configurer tous les broches de commande du moteur en sortie
  pinMode(avantM1, OUTPUT);
  pinMode(arriereM1, OUTPUT);
  pinMode(L293DM1, OUTPUT);
  pinMode(avantM2, OUTPUT);
  pinMode(arriereM2, OUTPUT);
  pinMode(L293DM2, OUTPUT);



Serial.begin(9600);

//le récepteur IR
irrecv.enableIRIn();


  pinMode(trigPin, OUTPUT);   //Trig est une sortie
  pinMode(echoPin, INPUT);    //Echo est une entrée

}



/////////////////////////////////////////////////////////////////////////////////////


void loop()
{
Serial.println(results.value, HEX);

//IR signal reçu
if(irrecv.decode(&results))
{

//avant 
if(results.value==0xFF18E7)
{
    analogWrite(L293DM1, 500); 
    digitalWrite(avantM1, HIGH); 
    digitalWrite(arriereM1, LOW); 
  
    analogWrite(L293DM2, 500); 
    digitalWrite(avantM2, HIGH); 
    digitalWrite(arriereM2, LOW); 
    delay(1000);
}
//recule
else if(results.value==0xFF4AB5)
{
    analogWrite(L293DM1, 500); 
    digitalWrite(avantM1, LOW); 
    digitalWrite(arriereM1, HIGH); 
  
    analogWrite(L293DM2, 500); 
    digitalWrite(avantM2, LOW); 
    digitalWrite(arriereM2, HIGH); 
    delay(500);
//pivoter vers la gauche
}
else if(results.value==0xFF10EF)
{
    analogWrite(L293DM1, 500); 
    digitalWrite(avantM1, HIGH); 
    digitalWrite(arriereM1, LOW); 
  
    analogWrite(L293DM2, 500); 
    digitalWrite(avantM2, LOW); 
    digitalWrite(arriereM2, HIGH); 
   delay(150);
//pivoter vers la droite
}
else if(results.value==0xFF5AA5)
{
    analogWrite(L293DM1, 500); 
    digitalWrite(avantM1, LOW); 
    digitalWrite(arriereM1, HIGH); 
  
    analogWrite(L293DM2, 500); 
    digitalWrite(avantM2, HIGH); 
    digitalWrite(arriereM2, LOW); 
    delay(150);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
else if(results.value==0xFFB04F)
{
  long duration, distance;
  digitalWrite(trigPin, LOW);  
  delayMicroseconds(2); 
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);               //envoie 10ms sur HIGH
  digitalWrite(trigPin, LOW);       
  // calcul de la distance :
  duration = pulseIn(echoPin, HIGH);   
  distance = duration*340/(2*10000); 
  
  if(distance >= 20) {                 //Si il n'y a pas d'obstacle à plus de 20cm 
    analogWrite(L293DM1, 500);  // avance
    digitalWrite(avantM1, HIGH); 
    digitalWrite(arriereM1, LOW); 
  
    analogWrite(L293DM2, 500); 
    digitalWrite(avantM2, HIGH); 
    digitalWrite(arriereM2, LOW);                             
  }
  else {                               //Sinon (si il voix un objet a moin de 20 cm)
    analogWrite(L293DM1, 500); 
    digitalWrite(avantM1, LOW); 
    digitalWrite(arriereM1, HIGH); 
  
    analogWrite(L293DM2, 500); 
    digitalWrite(avantM2, LOW); 
    digitalWrite(arriereM2, HIGH); 
    delay(500);
    
    analogWrite(L293DM1, 500); 
    digitalWrite(avantM1, LOW); 
    digitalWrite(arriereM1, HIGH); 
  
    analogWrite(L293DM2, 500); 
    digitalWrite(avantM2, HIGH); 
    digitalWrite(arriereM2, LOW); 
    delay(300);
    }
 delay(300000);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//recevoir la prochaine valeur
irrecv.resume();

//court délai d'attente pour répéter le signal IR
// (empêcher de s'arrêter si aucun signal reçu)
delay(150);
}

else
{
  analogWrite(L293DM1, 500);    //Alors il bouge pas 
  digitalWrite(avantM1, LOW); 
  digitalWrite(arriereM1, LOW); 

  analogWrite(L293DM2, 500); 
  digitalWrite(avantM2, LOW); 
  digitalWrite(arriereM2, LOW);
 
  
}
}




#26 arobasseb

arobasseb

    Membre chevronné

  • Administrateur
  • PipPipPipPip
  • 737 messages
  • Gender:Male
  • Location:BORDEAUX (33)

Posté 10 mai 2017 - 02:29

A mon avis c'est le delay(300000) qui pose problème. Je pense qu'il doit s'arrêté mais au bout de 5 minutes :)



#27 arobasseb

arobasseb

    Membre chevronné

  • Administrateur
  • PipPipPipPip
  • 737 messages
  • Gender:Male
  • Location:BORDEAUX (33)

Posté 10 mai 2017 - 02:45

Loop est une boucle
 
je pense qu'il faut raisonner comme ça (en pseudo code) : 
 
 
variable mode_auto booleen = 0 (faux)
variable temps_ecoule entier = 0
variable code_telecommande entier = 0
 
dans la boucle : 
 
si mode_auto = 0 (faux) alors
lire la telecommande 
si code_telecommande = code_avant alors
AVANCE
sinon si code_telecommande = code_arriere alors
RECULE
...
sinon si code_telecommande = code_auto alors
mode_auto = 1 (vrai)
temps_ecoule = 0  (si tu veux utiliser les timers à la place de ce code tu fait un demarrer timer)
fin si
sinon si mode_auto = vrai et temps_ecoule > 30 secondes alors
DETECTION D'OBSTACLE
incrementer temps_ecoule (voir comment on le récupere avec arduino)
sinon 
mode_auto = 0 (faux) (si tu utilise un timer ce code tu le mets dans l'evenement de fin de timer)
fin si
 
 
comme ça ça évite de tester la télécommande en mode auto
 
les actions que j'ai mises en majuscule essai de les transformer en methode.
 
les code télécommande tu devrais les mettre en constante pour que ça soit plus lisible


#28 levend

levend

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 5 572 messages
  • Gender:Male
  • Location:Vendée

Posté 10 mai 2017 - 06:08

Tout à fait d'accord, le "delay(300000)" est génant : il fait faire une pause à ton programme de 5 minutes et pendant ce temps tout reste dans l'état où c'était avant la pause donc si ton robot avançait avant la pause, il continuera à avancer pendant les 5 minutes et vu que ton programme est en "pause", il n'y aura pas non plus de détection de télécommande, ni détection d'obstacle, si je ne me trompe pas.

 

Je n'osais pas le dire pour les constantes à la place des codes de télécommande pour ne pas le perturber, mais une solution qui pour le projet actuel pourrait aider à la lecture c'est de mettre un commentaire sur chaque ligne où il y a un code de télécommande, indiquant la touche de la télécommande qui est appuyée. Les profs aiment quand c'est lisible :) .

 

Bravo arobasseb, c'est la première fois que je vois un algorithme (ou un extrait :D ) comme ça sur le forum, je suis en train de préparer un tuto sur ce sujet...


Imprimante 3D : Prusa i3 (MK1) + CR-10S + CR-10 S5 + Artillery Sidewinder X2 + CR-30 + Elegoo Mars + Anycubic Wash & cure 2 + Phrozen Sonic Mega 8K + Phrozen Cure Mega

#29 samuelfer99

samuelfer99

    Membre

  • Membres
  • 17 messages

Posté 10 mai 2017 - 06:14

Daccord mais si je veut faire en sorte que quand jappuie sur la touche # il s'execute pour detecter les obstacle pendant disons 1 minute, je fait comment ?



#30 levend

levend

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 5 572 messages
  • Gender:Male
  • Location:Vendée

Posté 10 mai 2017 - 07:02

Très bonne question, à laquelle je ne saurait répondre, désolé.


Imprimante 3D : Prusa i3 (MK1) + CR-10S + CR-10 S5 + Artillery Sidewinder X2 + CR-30 + Elegoo Mars + Anycubic Wash & cure 2 + Phrozen Sonic Mega 8K + Phrozen Cure Mega

#31 cocothebo

cocothebo

    Membre passionné

  • Membres
  • PipPipPip
  • 341 messages
  • Gender:Male

Posté 10 mai 2017 - 07:40

Salut,

 

Pour mesurer le temps, il y a (au moins) trois façons:

  • la version "bof": tu évalues la durée d'une exécution de loop dans le cas automatique (par exemple 50ms), tu rajoutes un compteur et tu comptes. C'est pas super, faut savoir le temps que prend un tour dans loop, si tu changes qqc ça change la durée bref pas top
  • la version mieux: utilise un timer (avec une routine d'interruption, pour la aussi augmenter un compteur) mais l'avantage c'est que tu auras un temps précis et stable
  • la version simple: tu utilises "millis" ou "micros" et une soustraction

 

Après tu peux aussi rajouter une horloge externe mais c'est qd meme pas pratique :)



#32 arobasseb

arobasseb

    Membre chevronné

  • Administrateur
  • PipPipPipPip
  • 737 messages
  • Gender:Male
  • Location:BORDEAUX (33)

Posté 10 mai 2017 - 08:49

Bravo arobasseb, c'est la première fois que je vois un algorithme (ou un extrait ) comme ça sur le forum, je suis en train de préparer un tuto sur ce sujet...


L'algo aide pas mal à se sortir de problème complexe, car on ne se concentre pas sur la syntaxe du langage.

Daccord mais si je veut faire en sorte que quand jappuie sur la touche # il s'execute pour detecter les obstacle pendant disons 1 minute, je fait comment ?


En te servant de mon algo et des conseils de cocothebo ça devrait le faire.

#33 levend

levend

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 5 572 messages
  • Gender:Male
  • Location:Vendée

Posté 10 mai 2017 - 09:11

Tout à fait et c'est pour cette raison qu'un peu plus haut j'avais conseillé l'algorithme, mais le problème c'est que la plupart passe directement au codage sans passer par l'algo...


Imprimante 3D : Prusa i3 (MK1) + CR-10S + CR-10 S5 + Artillery Sidewinder X2 + CR-30 + Elegoo Mars + Anycubic Wash & cure 2 + Phrozen Sonic Mega 8K + Phrozen Cure Mega

#34 cocothebo

cocothebo

    Membre passionné

  • Membres
  • PipPipPip
  • 341 messages
  • Gender:Male

Posté 11 mai 2017 - 01:03

Ben oui c'est pour les faibles de pas coder direct ;)



#35 levend

levend

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 5 572 messages
  • Gender:Male
  • Location:Vendée

Posté 11 mai 2017 - 05:20

ou les débutant ...


Imprimante 3D : Prusa i3 (MK1) + CR-10S + CR-10 S5 + Artillery Sidewinder X2 + CR-30 + Elegoo Mars + Anycubic Wash & cure 2 + Phrozen Sonic Mega 8K + Phrozen Cure Mega

#36 gerardosamara

gerardosamara

    Membre passionné

  • Membres
  • PipPipPip
  • 374 messages
  • Gender:Male
  • Location:Costa Rica & Bretagne

Posté 13 mai 2017 - 05:10

Pour  faire un semblant de multi taches en Arduino ( en anglais)   .. http://forum.arduino.cc/index.php?topic=223286.0

 

C'est ce que j'utilise sur mon Mega2560  

Cest la propositon 3 de Cocothebo

 

Bonne programmation


Pura vida

 

Ma chaine youtube  https://www.youtube....EQ5MTR3A/videos

Tutoriel MIT Inventor2  https://www.robot-ma...e-robot-mobile/




Répondre à ce sujet



  


0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users