Aller au contenu


Photo
- - - - -

Projet robotique arduino


35 réponses à ce sujet

#1 samuelfer99

samuelfer99

    Membre

  • Membres
  • 17 messages

Posté 27 novembre 2016 - 05:14

Bonjour,
je sollicite votre aide pour un projet en ISN (informatique science du numérique), au niveau de mes connaissance en programmation elle sont très superficiel, mais au niveau bricolage, soudure ou autre, je me débrouille pas mal :)
Je décide de me lancer dans la construction d’un robot.
Le robot aura pour particularité 2 fonctions :
-       Il disposera d’un mode automatique, qui lui permettra de se déplacer seul en évitant les obstacles.
-       Ainsi qu’un mode manuel, ou il sera contrôlé avec une télécommande infrarouge.
 
Pour cela, j'ai commande le matériel suivant :
Arduino UNO version 3
Kit châssis avec moteur
Modules a ultra son
Carte d’extension L293D Moteur
kit télécommande infrarouge + module de réception
 
Je ne sais pas par ou commencé pour la programmation, je ne veux pas copier colle un code bêtement sur mon arduino mais je chercher plutôt a comprendre se code.
Aider moi s'il vous plait 



#2 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 758 messages
  • Gender:Male

Posté 27 novembre 2016 - 05:38

Pareil, je pense que tout le monde te dira la même chose, lance toi, commence à coder, apprend, et même si tu regardes d'autres codes ça ne peut être que bénéfique sans pour autant t'en servir, mais au moins comprendre le pourquoi du comment.

 

Et ici, tu peux poser ton code tu auras toujours quelqu'un pour t'aider.


signature_01.png -->

 

Mon Tipeee
 


#3 Telson

Telson

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 975 messages
  • Gender:Male
  • Location:Punaauai - Tahiti

Posté 28 novembre 2016 - 09:47

Nous avons tous fait du copier/coller et il n'y à aucune honte....Tu devras toujours adapter ton code ou le faire évoluer....

 

Go !!



#4 samuelfer99

samuelfer99

    Membre

  • Membres
  • 17 messages

Posté 06 mai 2017 - 09:57

Bonjour, je reviens vers vous pour avoir un peu d'aide,

 

alors voila j'ai crée 2 programme différent et indepant pour le robot arduino, un qui permet au robot de détecter les mur et de les éviter, un autre qui permet de le contrôler grâce a une petite télécommande.

 

Mon probleme j'aimerai mettre ne lien les deux programme ou faire un truc du style quand j'appuie sur cette touche le robot exécute se programme et quand j'appuie sur une autre touche il exécute autre programme.

 

Voila je doit rendre tout la semaine prochaine.... pour apres etre note pour le bac..

 

merci



#5 samuelfer99

samuelfer99

    Membre

  • Membres
  • 17 messages

Posté 06 mai 2017 - 10:01

Code pour la détection d'obstacle : 

 

 
#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




void setup () { 
  pinMode(trigPin, OUTPUT);   //Trig est une sortie
  pinMode(echoPin, INPUT);    //Echo est une entrée
//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);


}
void loop() {
  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);
  }
}


#6 samuelfer99

samuelfer99

    Membre

  • Membres
  • 17 messages

Posté 06 mai 2017 - 10:02

Code pour le télécommande en IR :
 

#include "IRremote.h"
 
//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;
 
 
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();
}
 
 
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);
}
//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);
  
}
}


#7 Path

Path

    Made By Humans

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

Posté 06 mai 2017 - 10:35

Si je comprends bien, tu as 2 programmes séparés. Un arduino ne peut contenir qu'un seul programme à la fois. Il faut que tu les rassembles en un.

 

Tu crée 2 fonctions de setup : setupA() et setupB()

2 fonctions de loop : loopA() et loopB()

 

Dans loop(), tu détecte l'état de ton robot et tu lance soit loopA, soit loopB.

Au changement d'état, tu appel setupA ou setupB.

A l'init de l'arduino, tu force le changement d'état pour lancer un premier setup (A ou B).

 

Dans setup(), tu mets rien ou presque  :)

 

Un truc du genre :

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

int etat;

void setupA() {
...
}

void setupB() {
...
}

void loopA() {
...
}

void loopB() {
...
}

void setup() {
  etat = ETAT_INDEFINI;
}

int lireEtat() {
  // la fonction retourne l'état et jamais l'état indéfini (pour la première boucle).
  // ce code suppose que tu utilise un clavier qui reste dans sa position ouvert ou fermé comme des interrupteurs à bascule.
}

void loop() {
  int etatCourant = lireEtat();
  // Detection du changement d'état
  if(etat != etatCourant) {
    etat = etatCourant;
    if(etat == ETAT_A) {
      setupA();
    }
    if(etat == ETAT_B) {
      setupB();
    }
  }
  if(etat == ETAT_A) {
    loopA();
  }
  if(etat == ETAT_B) {
    loopB();
  }
}

PS. Si t'as ton bac, je te prie de nous donner des nouvelles plus souvent :P



#8 samuelfer99

samuelfer99

    Membre

  • Membres
  • 17 messages

Posté 06 mai 2017 - 10:42

merci e votre réponse, cela a l'air compliquée... vous m'avez un peu perdue, je comprend pas comment vous passer d'un code a l'autre ?



#9 samuelfer99

samuelfer99

    Membre

  • Membres
  • 17 messages

Posté 06 mai 2017 - 10:45

PArceque pour changer de mode ca ce passe avec la télécommande infrarouge mais si on change de code dans lautre setup il y a pas d'infrarouge de programme 



#10 Path

Path

    Made By Humans

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

Posté 06 mai 2017 - 10:51

Dans setupA, setupB, loopA et loopB, tu y mets ton code, celui de tes 2 programmes.

Cela ne te fait plus qu'un seul programme.

Tu auras l'infrarouge de la même manière qu'avant :) Il faut certainement déplacer le code de lecture de l'infrarouge dans la fonction lireEtat().

 

Imagines que avance, recule, gauche et droite soient aussi des états ;)

 

Prends le temps de bien comprendre, c'est pas compliqué.



#11 samuelfer99

samuelfer99

    Membre

  • Membres
  • 17 messages

Posté 06 mai 2017 - 10:53

Je vais essayer je vous tient au courant merci



#12 samuelfer99

samuelfer99

    Membre

  • Membres
  • 17 messages

Posté 06 mai 2017 - 10:57

mais comment le robot vas comprendre que je passe d'un mode a l'autre ? (avec la telecommande) 



#13 Path

Path

    Made By Humans

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

Posté 06 mai 2017 - 11:01

Tu affecte 1 autre code de ta télécommande pour le mode (ou l'état) "détection d'obstacle" et pas plus.

Un code comme celui là : results.value==0xFF18E7



#14 samuelfer99

samuelfer99

    Membre

  • Membres
  • 17 messages

Posté 06 mai 2017 - 11:03

D'accord je vais essayer tout ca merci



#15 samuelfer99

samuelfer99

    Membre

  • Membres
  • 17 messages

Posté 08 mai 2017 - 03:32

Re bonjour a tous, alors voila, j'en suis la :

 

 
#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 setupA() {
//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();
}


void setupB() {
  pinMode(trigPin, OUTPUT);   //Trig est une sortie
  pinMode(echoPin, INPUT);    //Echo est une entrée
//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);


}


void loopA() {
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);
}
//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);
  
}
}


void loopB() {
 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);
  }
}


void setup() {
  etat = ETAT_INDEFINI;
}


int lireEtat() {


}


void loop() {
  int etatCourant = lireEtat();
  // Detection du changement d'état
  if(etat != etatCourant) {
    etat = etatCourant;
    if(etat == ETAT_A) {
      setupA();
    }
    if(etat == ETAT_ {
      setupB();
    }
  }
  if(etat == ETAT_A) {
    loopA();
  }
  if(etat == ETAT_ {
    loopB();
  }
}
 
 
 
sauf que je bloque... j'aimerai que quand j'appuie sur la touche # (FFB04F) le robot exécute l’état 1 et quand j'appuie sur * (FF6897) le robot exécute l'Etat 2, comment faire ? merci
 
Modération : C'est du code donc ajout de balise !
Levend


#16 levend

levend

    Pilier du forum

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

Posté 08 mai 2017 - 04:15

Je ne vois pas l’intérêt de faire deux setup() vu que tu déclares la même chose dans les deux sauf les entrées du récepteur de télécommande que tu déclares que dans un. De plus le setup nest exécuté qu'une seul fois dans ton programme alors que là tu exécute ton SetupA et SetupB dans ta boucle Loop(), inutile.

 

Mon idée :

Dans ta boucle principale tu appelles ta fonction LoopA() ou LoopB() en fonction du mode choisi par la télécommande mais ces deux fonctions sont des boucles dont tu sors le robot reçoit le signal de la télécommande lui indiquant de changer de mode. Il faut donc que tu lises la valeur du récepteur infrarouge dans les deux boucles.


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

#17 samuelfer99

samuelfer99

    Membre

  • Membres
  • 17 messages

Posté 08 mai 2017 - 04:21

Vous pourriez modifier mon programme ? C'est pas que je veux pas le faire mais je comprendrai mieux et pour quelqu'un qui si connais bien c'est plus facile et plus vite fait 😋

#18 Path

Path

    Made By Humans

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

Posté 08 mai 2017 - 05:48

Pour les setup Levend a raison. Pas obligé tu les rassembleras quand tu auras bien compris.

Pour ton prog, replace 

etat == ETAT_

par etat == ETAT_B

Ta fonction lireEtat ne fait rien. C'est elle qui doit lire l'infrarouge.

:)

 

if(irrecv.decode(&results))

{


//avant 
if(results.value==0xFF18E7)
{

...


#19 samuelfer99

samuelfer99

    Membre

  • Membres
  • 17 messages

Posté 08 mai 2017 - 06:17

Si vous plait, j'ai beau remplacer les truc essayer mais je n'arrive pas... je doit rendre çà le plus vite possible avant ce vendredi, j'arrive pas a faire changer de mode, vous ne pouvez vraiment pas modifier mon code, je comprendrai quand ca sera fait je pense, façon faudra bien que je l'explique, mais si je laisse le projet comme ca je vais me prendre une sale note... 



#20 Path

Path

    Made By Humans

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

Posté 08 mai 2017 - 06:31

Prends le temps de bien comprendre chaque instruction.

Il n'y a rien de compliqué.





Répondre à ce sujet



  


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

0 members, 0 guests, 0 anonymous users