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
Projet robotique arduino
#1
Posté 27 novembre 2016 - 05:14
#2
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.
#4
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
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
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
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 .
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
#10
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é.
#15
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(); } }
#16
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 + Tronxy VEHO 600 PRO
#18
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
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...
Répondre à ce sujet
0 utilisateur(s) li(sen)t ce sujet
0 members, 0 guests, 0 anonymous users