Go Down

Topic: Guidage par induction pour un robot avec Arduino UNO (Read 656 times) previous topic - next topic

Jacques3012

May 18, 2019, 01:58 am Last Edit: May 21, 2019, 01:29 am by Jacques3012
Bonjour.

Je suis nouveau sur ce forum et je commence a utiliser les micro-contrôleur Arduino et je trip beaucoup :)

Voici mon projet. J'aimerai guider un robot a l'aide d'un fil enfouis dans le sol.

J'utilise un kit générateur de boucle. Ce système fonctionne très bien et il est couplé sur un Arduino UNO sur les entrées analogiques A0 et A1.

Pour les sorties contrôlant les deux moteurs, j'utilise le module VMA409 qui est un contrôleur L298N.
La pin ENA est sur la pin 11, la pin IN1 est sur la pin 9, la pin IN2 est sur la pin 8, la pin IN3 est sur la pin 7, la pin IN4 est sur la pin 7 et la pin ENB est sur la pin 10 de l'Arduino.

Mon problème est de trouver le code car je n'ai pas d'expérience en language C++, je n'ai programmé que des automates Omron dans le passé.

La tension aux deux entrées est d'environ 3 volts quand les deux capteurs sont centré avec le fil émetteur et ce que j'aimerai c'est que peu importe la tension aux deux entrées, en autant qu'elle soit égale, fasse tourner les deux moteurs a vitesse égale, et aussi en me permettant d'ajuster la vitesse maximale des deux moteurs. Si une des deux entrées diminue, je dois faire abaisser la vitesse du moteur se trouvant du même côté que la baisse de tension pour remettre le robot au centre du fil émetteur.

Quelqu'un pourrais m'aider dans ce projet ?

J'ai programmé ce code, mais ça ne donnes pas les résultats recherché.
Sur ce code, je ne compare pas les deux entrées analogique, et il faut absolument que je le fasse car si les capteurs s'éloignent du fil émetteur, les deux moteurs baisses et ce n'est pas ce que je souhaite.
Je me demandais aussi si je ne devais pas faire varier qu'un seul moteur pour la correction de l'axe.

Merci

Jacques3012
Code: [Select]


//Broche d'entrées analogique
int x_key = A0;                                              
int y_key = A1;                                              
int x_pos;
int y_pos;

//Motor Pins
int EN_A = 11;      //Broche d'activation moteur gauche
int IN1 = 9;       //Broche de contrôle moteur gauche
int IN2 = 8;       //Broche de contrôle moteur gauche
int IN3 = 7;        //Broche de contrôle moteur droit
int IN4 = 6;        //Broche de contrôle moteur droit
int EN_B = 10;      //Broche d'activation moteur droit
//Initialisation de variables pour stocker des données
int motor_speed;
int motor_speed1;

void setup ( ) {
Serial.begin (9600); //Démarrage de la communication série à un débit de 9600 bauds
//Initialisation des broches du moteur en sortie
pinMode(EN_A, OUTPUT);
pinMode(IN1, OUTPUT);  
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);  
pinMode(IN4, OUTPUT);
pinMode(EN_B, OUTPUT);

//Initialisation des broches d'entrées analogique
pinMode (x_key, INPUT) ;                    
pinMode (y_key, INPUT) ;                      
}

void loop () {
 x_pos = analogRead (x_key) ;  //Entrée capteur gauche
 y_pos = analogRead (y_key) ;  //Entrée capteur droit

if (x_pos < 1200){     //Faire tourner le moteur gauche dans le sens des aiguilles d'une montre
 motor_speed = map(x_pos, 1200, 0, 0, 150);   //Mapper les valeurs sur 0-255 pour déplacer le moteur gauche
 digitalWrite(IN1, LOW);
 digitalWrite(IN2, HIGH);
 analogWrite(EN_A, motor_speed);   //activation moteur gauche
}  


if (y_pos < 1200){         //Faire tourner le moteur droit dans le sens des aiguilles d'une montre
 motor_speed1 = map(y_pos, 1200, 0, 0, 150);   //Mapper les valeurs sur 0-255 pour déplacer le moteur droit
 digitalWrite(IN3, LOW);
 digitalWrite(IN4, HIGH);
 analogWrite(EN_B, motor_speed1);   //activation moteur droit
}  

}



al1fch

Bonjour et bienvenue

vas vite consulter les Règles du forum et entre autres :
-ou poster les questions ...(pas dans la 'vitrine des projets FINIS'.....)
-comment poster proprement du code
-quelles informations fournir
-pas de 'up', pas de doublons....
-Tutoriels recommandés

Corriges en conséquence  ton message et demandes au modérateur (lien 'Report to moderator') le déplacement du message au bon endroit.



Quote
Quote
Mon problème est de trouver le code
L'aide du forum te permettra de construire  toi même TON code.

/!\ Ces temps ci de très nombreux messages finissent à la 'poubelle du Bar' car ils ne respectent pas le 'Mode d'emploi'
A+

Jacques3012

#2
May 18, 2019, 03:51 pm Last Edit: May 18, 2019, 03:52 pm by Jacques3012
Bonjour.

Désolé pour l'erreur, je n'avais pas pris le temps de bien lire les règlements.

J'ai inséré les balises pour le code et j'ai demandé au modérateur de bien vouloir déplacer mon sujet au bon endroit.

Mes salutations

Jacques3012

lesept

A priori, un analogRead renvoie une valeur comprise entre 0 et 1023, donc il faut revoir tes tests.

Tu devrais commencer par tester tes capteurs pour voir ce qu'ils renvoient en fonction de leur position par rapport au fil. Un simple sketch de lecture des capteurs et d'écriture des valeurs sur la console pour comprendre comment ça marche.

Il est probable que tu devras agir sur les deux moteurs pour ramener le robot au centre.

Pour le fonctionnement des moteurs, cherche sur Google le cours d'Openclassrooms, il est assez bien fait (en deux parties). Vérifie aussi que tu utilises bien des pins qui font du PWM là où c'est nécessaire.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Jacques3012

A priori, un analogRead renvoie une valeur comprise entre 0 et 1023, donc il faut revoir tes tests.

Tu devrais commencer par tester tes capteurs pour voir ce qu'ils renvoient en fonction de leur position par rapport au fil. Un simple sketch de lecture des capteurs et d'écriture des valeurs sur la console pour comprendre comment ça marche.

Bonjour et merci pour votre aide. Si je comprend bien, vous voulez que j'affiche les valeurs des deux entrées analogique sur un écran LCD? Si c'est ça, présentement je n'ai qu'un afficheur 4 lignes 20 caractères et je n'ai plus les sorties nécessaire pour brancher l'afficheur sur l'Arduino. J'attend justement un afficheur 2 lignes 16 caractères qui me permettra de pouvoir le brancher. Y'a t'il un autre moyen de voir les valeurs sur mon écran d'ordinateur ?

Jacques3012

lesept

Oui, pas besoin d'écran lcd si ton arduino est relié à ton PC. Il suffit d'ouvrir la console série, avec l'icône en haut à droite de la fenêtre de l'IDE. Pour afficher des choses tu disposes des instructions Serial.print et Serial.println
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

jfs

Message déplacé dans la rubrique adéquate....
Pas d'aide par MP !!!

Concernant le fonctionnement du forum tout se trouve dans les messages épinglés en tête de page.

Jacques3012

Oui, pas besoin d'écran lcd si ton arduino est relié à ton PC. Il suffit d'ouvrir la console série, avec l'icône en haut à droite de la fenêtre de l'IDE. Pour afficher des choses tu disposes des instructions Serial.print et Serial.println
Désolé, je ne comprend pas la procédure pour afficher sur l'écran de mon ordi.

Jacques3012

al1fch

Bonjour

Quote
J'utilise un kit générateur de boucle. Ce système fonctionne très bien et il est couplé sur un Arduino UNO sur les entrées analogiques A0 et A1.
Pour une meilleure compréhension du système un lien vers le kit serait utile.
Fournit-il des tensions contineus compatibles avec les entrées A0 et A1 ?

Quote
Quote from: lesept on 18-05-2019, 20:18:54
Quote
Oui, pas besoin d'écran lcd si ton arduino est relié à ton PC. Il suffit d'ouvrir la console série, avec l'icône en haut à droite de la fenêtre de l'IDE. Pour afficher des choses tu disposes des instructions Serial.print et Serial.println
Désolé, je ne comprend pas la procédure pour afficher sur l'écran de mon ordi.
Analysez l'exemple AnalogInOutSerial fourni avec l'environnement Arduino dans la catégorie 'basic' des exemples , il permet d'afficher dans le Terminal Arduino (=sur l'écran de l'ordinateur) les données lues sur une entrée analogique

En procédant ainsi il sera possible de connaitre les valeurs successives des variables du programme et voir ce qui coince, ce qui ne fonctionne pas comme prévu.

Jacques3012

#9
May 19, 2019, 03:43 pm Last Edit: May 19, 2019, 03:45 pm by Jacques3012
Bon voici le kit vendu par une compagnie reconnu. L'émetteur est conçu avec un 555 et émet une fréquence dans la boucle. Le récepteur est un LM324N et il est couplé avec deux inductance. Si vous voulez le schéma, je peut essayer de le trouver. C'est un kit compatible avec Arduino comme spécifié sur la photo.

Pour ce qui est des lectures des deux entrées A0 et A1, j'ai mis deux photos une pour chacune des entrées.
Une chose, je ne réussis pas a obtenir plus de 150 comme lecture dans les deux entrées analogique, le LM324 devrait me donner 5 volts au max, ce que je n'obtiens pas.

Jacques3012

Je vous reviens avec la troisième photo, ca ne veut pas fonctionner pour l'instant

Jacques3012

al1fch

Quote
Pour une meilleure compréhension du système un lien vers le kit serait utile.
A défaut de photo , donner  un lien permettant de connaître la marque et le modèle du kit
Le schéma de l'émetteur et surtout du récepteur seraient  également bienvenus pour comprendre la nature des signaux envoyés sur les deux  entrées analogiques.

On a comme  indices 'marque réputée', 555 et LM324 ...mais pas forcément envie de jouer aux devinettes....

Question  subsidiaire : quelles était la distance approximative entre le fil et les bobines lorsque les essais ont ete effectués ?

Jacques3012

Voila le kit. Je vous reviens avec les plans. J'aimerai savoir quel est la résolution sur les entrées analogique car si je met l'entrée directement sur le 5 volts, j'obtiens au max 204 comme lecture, c'est normal ?

Et pour répondre a votre question, les capteurs sont a 7 centimètres du fil. J'ai amélioré la précision de mes lectures en ajoutant un condensateur de 100uf sur chacune des entrées de la carte Arduino, soit A0 et A1. C,est beaucoup plus précis comme lecture maintenant

Jacques3012

Jacques3012

#13
May 19, 2019, 06:12 pm Last Edit: May 19, 2019, 06:40 pm by Jacques3012
Voila le kit. Je vous reviens avec les plans. Je m'étais trompé quand a la lecture apparaissant sur les tableaux, je vous ai donné les lectures des sorties et non des entrées.Pour les entrées, j'obtiens environ 750 comme lecture au maximum de la captation.

Et pour répondre a votre question, les capteurs sont a 7 centimètres du fil. J'ai amélioré la précision de mes lectures en ajoutant un condensateur de 100uf sur chacune des entrées de la carte Arduino, soit A0 et A1. C,est beaucoup plus précis comme lecture maintenant

Jacques3012

al1fch

Quote
si je met l'entrée directement sur le 5 volts, j'obtiens au max 204 comme lecture, c'est normal ?
Non. Avec la référence utilisée  couramment pour un AnalogRead()  Vcc on obtient 1024 pour une entrée analogique dont la tension est égale à la tension d'alimentation.(résolution 10 bits)

remarque : en ne mettant pas de lien cliquable comme demandé vers le kit mais seulemenent une photo vous ralentissez  l'aide , en particulier de la part de ceux de plus en plus nombreux qui consultent le forum avec leur smartphone

Le  lien suivant (présent sur la page du produit) aurait dû être fourni  dès le premier message  (cf Règle du Forum)
https://www.robotshop.com/en/robotshop-perimeter-wire-generator-sensor-soldering-kit.html
on y trouve ce second lien qui décrit le kit et donne les schémas
https://www.robotshop.com/community/blog/show/diy-perimeter-wire-generator-and-sensor

D'après la notice le signal de sortie est une sinusoïde d'une trentaine de kHz centrée sur 2,6V


Question : votre code est-il un code fourni par Robotshop pour ce kit ?

Go Up