Go Down

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

Jacques3012

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

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)
https://www.robotshop.com/community/blog/show/diy-perimeter-wire-generator-and-sensor
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

Jacques3012

#16
May 19, 2019, 07:42 pm Last Edit: May 19, 2019, 07:45 pm by 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.


https://www.robotshop.com/en/cytron-30a-5-30v-single-brushed-dc-motor-driver.html?gclid=CjwKCAjw_YPnBRBREiwAIP6TJzKzKa1mN5IBM3uZuFv5Xzjrd9e7TSYW5ITe2DLsH4lEmGGWOSL8BxoChRIQAvD_BwE

Voila une bonne description du projet.

Jacques3012

al1fch

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 !!



Jacques3012

#18
May 19, 2019, 09:11 pm Last Edit: May 19, 2019, 09:13 pm by Jacques3012
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

al1fch

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 ?

Jacques3012

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

Merci pour l'info de l'image.
Pour le voltage, a distance (6 centimètres entre le centre de chacune des inductances et le fil) et hauteur égale (7 centimètres) , j'ai 2.46 volts sur chacune des entrées et 2,70 volts si je place les inductances directement au dessus du fil. Donc une différence de 0,4 volts. Mais je pourrais distancer mes inductances car présentement, elles sont, centre a centre a 11,5 centimètres

Jacques3012

Jacques3012

Bonjour.

Est-ce que l'on peut insérer des vidéos ici ?

Jacques3012

bidouilleelec

Bonjour al1ch
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)
......

1023!

Cordialement,
bidouilleelec

fdufnews

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
Le condensateur de 470µF sur l'anode de la diode me perturbe. Tu es certain de la valeur. A 30kHz un condensateur de cette valeur devrait se comporter comme un court-circuit.

al1fch

Quote
Bonjour al1ch
Quote from: al1fch on 19-05-2019, 18:31:43
Quote
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)
......
1023!

Cordialement,
bidouilleelec
Bonjour bidouilleelec
Oups.....tout à fait merci de corriger  . (on part de zéro... pas de 1..... ;) )

Jacques3012

#25
May 20, 2019, 10:33 pm Last Edit: May 21, 2019, 11:57 am by Jacques3012
Le condensateur de 470µF sur l'anode de la diode me perturbe. Tu es certain de la valeur. A 30kHz un condensateur de cette valeur devrait se comporter comme un court-circuit.
C'est pourtant bien ça, et ça stabilise grandement le  voltage aux entrées analogique de l'Anduino.
Je suis en train de travailler sur le code mais c'est certain que j'aurai besoin de certains trucs.

Je vous reviens avec le nouveau code.

En passant, quelqu'un pourrais me dire si je comprend bien le code suivant?

Code: [Select]

   motor_speed = map(x_pos, 100, 0, 0, 255);   //Mapping the values to 0-255 to move the motor


Selon moi, les deux premier chiffre, 100 et 0, correspondent à x_pos et les deux derniers correspondent a motor-speed. Donc si nous avons 100 comme valeur a x-pos, nous aurons la valeur 0 a motor-speed et si nous avons 0 a x_pos, nous aurons la valeur 255 a motor-speed.

Est-ce bien ça ?

Merci

Jacques3012

Jacques3012

Bonjour.

Il semble que mon sujet n'intéresse pas beaucoup de gens ou bien je ne pose pas les questions comme vous les voulez.

Jacques3012


bidouilleelec

C'est pourtant bien ça, et ça stabilise grandement le  voltage aux entrées analogique de l'Anduino.
Je suis en train de travailler sur le code mais c'est certain que j'aurai besoin de certains trucs.

Je vous reviens avec le nouveau code.

En passant, quelqu'un pourrais me dire si je comprend bien le code suivant?

Code: [Select]

   motor_speed = map(x_pos, 100, 0, 0, 255);   //Mapping the values to 0-255 to move the motor


Selon moi, les deux premier chiffre, 100 et 0, correspondent à x_pos et les deux derniers correspondent a motor-speed. Donc si nous avons 100 comme valeur a x-pos, nous aurons la valeur 0 a motor-speed et si nous avons 0 a x_pos, nous aurons la valeur 255 a motor-speed.

Est-ce bien ça ?

Merci

Jacques3012
Oui.
Cordialement,
bidouilleelec

Jacques3012

Bonjour. Voici mon code. Ça fonctionne très bien selon les essais que j'ai fait sur mon établi. J'attend des pièces pour faire un essai sut un petit prototype.

Ce que j'aimerai faire pour l'instant, c'est d'ajouter la fonction horloge pour démarrer le robot a des heures précises, jusqu'a 6 fois par jour.

J'aimerai aussi ajouter la fonction que lorsque le robot démarrera, que la vitesse augmente graduellement jusqu'a la valeur de vit_max.

Quelqu'un peut m'aider car je ne trouves pas comment procéder.

Merci

Jacques3012

Code: [Select]

//Broche d'entrées analogique
int ind_g = A0; // inductance gauche                                             
int ind_d = A1; // inductance droite                                             
int sig_g; // signal gauche out ampli
int sig_d; // signal droite out ampli

//Broches alim. moteur
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 moteur_g;     //sortie analogique moteur gauche
int moteur_d;     //sortie analogique moteur droit
int vit_max;      //vitesse maximum de déplacement
int vit_max2;     //vitesse maximum de déplacement - 1


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 (ind_g, INPUT) ;                     
  pinMode (ind_d, INPUT) ;                     
}

void loop () {
    sig_g = analogRead (ind_g) ;      //Entrée capteur gauche
    sig_d = analogRead (ind_d) ;      //Entrée capteur droit
    vit_max = 150;      //valeur de la vitesse maximum de déplacement
    vit_max2 = (vit_max-1);     //valeur de la vitesse de déplacement maximale - 1
     
 
// CONTRÔLE MOTEUR GAUCHE
if  (sig_g > 400) {   // marche pleine puissance moteur gauche
    delay(10);
    moteur_g = (vit_max);
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
    analogWrite(EN_A, moteur_g);   //activation moteur gauche
  }

   if  (sig_g >= 50 and sig_g <= 380) {   
    moteur_g = map(sig_g, 50, 390, 0, vit_max2);   //Mapper les valeurs sur 0 a vitesse maximale pour le moteur gauche
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
    analogWrite(EN_A, moteur_g);   //activation moteur gauche   
   
  }

  if  (sig_g < 50) {   // arrêt complet du moteur gauche
    delay(10);
    moteur_g = (0);
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
    analogWrite(EN_A, moteur_g);   //activation moteur gauche
  }
     
 
// CONTRÔLE MOTEUR DROIT
if (sig_d > 400){     //marche pleine puissance moteur droit
    delay(10);
    moteur_d = (vit_max);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
    analogWrite(EN_B, moteur_d);   //activation moteur droit
   
  }

  if  (sig_d >= 50 and sig_d <= 380) {   
    moteur_d = map(sig_d, 50, 390, 0, vit_max2);   //Mapper les valeurs sur 0 a vitesse maximale pour le moteur droit
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
    analogWrite(EN_B, moteur_d);   //activation moteur droit
    Serial.println(vit_max2);
   
  }

  if (sig_d < 50){     //arrêt complet moteur droit
    delay(10);
    moteur_d = (0);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
    analogWrite(EN_B, moteur_d);   //activation moteur droit
   
  }
 
  }

Jacques3012

#29
May 24, 2019, 03:36 pm Last Edit: May 24, 2019, 05:01 pm by Jacques3012
Le condensateur de 470µF sur l'anode de la diode me perturbe. Tu es certain de la valeur. A 30kHz un condensateur de cette valeur devrait se comporter comme un court-circuit.
Bonjour. Après vérification, j'ai dû remplacé les condensateurs de 470uf par des condensateurs de 1uf car lorsque j'éloignais les inductances pour obtenir 0 volts, je n'était pas capable d'obtenir cette valeur. Maintenant avec les condensateurs de 1uf, j'obtiens 0 volts sans difficulté. Vous aviez raisons.

Merci !

Jacques3012

Go Up