Guidage par induction pour un robot avec Arduino UNO

Bonjour.

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

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

//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
}  

}

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.

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+

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

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.

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.

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

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

Message déplacé dans la rubrique adéquate....

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

Désolé, je ne comprend pas la procédure pour afficher sur l'écran de mon ordi.

Jacques3012

Bonjour

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 from: lesept on 18-05-2019, 20:18:54

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.

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.

1.JPG

2.JPG

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

Jacques3012

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 ?

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

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

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)

on y trouve ce second lien qui décrit le kit et donne les schémas

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 ?

al1fch:
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)

Je m'étais trompé, je lisais les sorties et non les entrées. J'obtiens 750 environ lorsque les capteurs sont directement au dessus du fil de périmètre, a 7 centimètres de hauteur

al1fch:
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 aurait dû être fourni dès le premier message (cf Règle du Forum)
DIY Perimeter Wire Generator and Sensor | RobotShop Community
Les schémas de l'émetteur et du récepteur y figurent, montages simplistes pour l'un comme pour l'autre...
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 ?

Je suis nouveau ici et donc pas habitué, mais je vais corriger mes erreurs. Pour ce qui est du code, non ce n'est pas un code fournis, je n'en trouves pas, j'ai donc pris un code qui servait pour alimenter deux moteurs a l'aide d'un joystick, que j'ai modifié et j'essai de me débrouiller avec ça, et c'est pourquoi je demande de l'aide. Je fais des test mais c'est pas évident quand on ne comprend pas trop le principe de la programmation. Je fouille pour essayer de trouver croyez moi. Et j'apprécie vos commentaires, soyez s'en certain.

Jacques3012

Voici une description de mon projet. Je veux créer un robot qui suivra le fil de la boucle, a une vitesse que je pourrai déterminer a l'aide d'un clavier et j'utiliserai un afficheur 2 lignes 16 caractères pour me permettre d'ajuster les différents paramètres, soit la vitesse de déplacement du robot ainsi que les heures de départ, le niveau des batteries avant une recharge, le voltage des batteries et quelque autres paramètre a déterminer. Ce robot, sera entraîné par deux moteurs et d'une roue libre a l'avant, et devra être équipé d'un détecteur de présence pour l'arrêter d'entrer en contact avec l'objet ou une personne, et devra se remettre en marche lorsqu'il n'y aura plus de détection. Le robot se déplacera a environ 4 mètres par minutes.

Le robot doit partir a des heures précise, quelque fois par jour. Il suivra le fil jusqu'au bout d'un couloir ou il devra se recharger en position avant s'il en a besoin. Lorsque la recharge sera terminé, a une heure précise, il devra sortir de sa base de recharge se retourner et repartira vers son point de départ en suivant le fil de la boucle qui sera décalé d'environ 45 centimètres par rapport a l'allé. Rendu au point de retour, il se retournera pour attendre son prochain cycle de départ et ainsi de suite, a tous les jours.

Le robot sera alimenté par deux batteries de 12 volts en série pour alimenter les deux moteurs de traction, qui sont des moteurs DC 24 volts de 450 watts chacun qui seront alimenté chacun par une carte MD30C de marque Cytron.

Il y aura un autre moteur identique aux roues de traction qui fera tourner un tambour lorsque le robot se déplacera. Lui aussi sera alimenté par une carte pour me permettre de faire varier sa vitesse, vitesse qui sera ajusté au départ mais qui ne variera pas pendant le déplacement.

Voila une bonne description du projet.

Jacques3012

OK

Sous réserve d'un examen plus approfondi de votre code il me semble que quelques composants courants permettrait de rendre le kit un peu plus 'compatible Arduino' en présentant aux deux entrées analogiques d'Arduino des tensions quasi continues dont la valeur refléterait la distance entre fil et boibines

il suffirait d'ajouter pour chacune des 2 voies une diode courante, une résistance et un condensateur
Je ne garantit rien, c'est juste une proposition à tester !!
interface.png

interface.png

J'ai fait plusieurs essais et c'est celui ci qui me donne le plus de stabilité.

Pour ce qui est du code, je suis bien conscient qu'il y aura plusieurs modifications a faire, je ne fais que contrôler les entrées et sorties présentement mais rien de bien concret.

Comment mettre des images directement sur la page ?

Jacques3012

mettre les images dans le corps du message ? ça se faite en 3 temps :

  1. enregistrer l'image en 'attachement' au message,
  2. consulter le massage et en profitre pour copier le lien de l'image
  3. rééditer le message et avec l'icône "Insert an image" copier le lien de l'image

voilà pour votre image attachée au message ci-dessus :

Donc maintenant le programme dispose de données exploitables concernant la distance de chaque bobine avec le fil ?