Aller au contenu


Photo
* * * * * 1 note(s)

[Projet Rover 2WD] Mon robot de surveillance mobile et télécommandé

Arduino Raspberry PI3 MIT Inventor 2 Rover UGV Robot mobile PID

282 réponses à ce sujet

#241 gerardosamara

gerardosamara

    Membre passionné

  • Membres
  • PipPipPip
  • 374 messages
  • Gender:Male
  • Location:Costa Rica & Bretagne

Posté 12 octobre 2018 - 06:48

Merci @Oracid & @Mike118 pour vos retours d'expérience .

 

Avec la bibliothèque "newping" ca va beaucoup mieux .

 

Néanmoins il y a des cas ou la détection d'obstacle est perturbée si le support de réflexion  est un angle ou si il est fait de "fibres tréssé" ( salon extérieur)  ou non plein comme une balustrade.

Le phénomène semble plus accentué si la distance augmente.

 

Je ne sais pas si le bruit des vagues qui sont à 50m peut également perturber la transmission de l'ultrason.

 

La photo ci-dessous est un cas de problème d'angle de réflexion du signal , avec moins d'angle ca marche.

 

Hc-Sr04 pb .jpg

 

EDIT : Oubli d'indiquer qu'une mesure erronée "8 cm" vient après le "0 cm" en cas de de distance > seuil de détection

 

Erreurs HCSR04 ed2.PNG


Pura vida

 

Ma chaine youtube  https://www.youtube....EQ5MTR3A/videos

Tutoriel MIT Inventor2  https://www.robot-ma...e-robot-mobile/


#242 gerardosamara

gerardosamara

    Membre passionné

  • Membres
  • PipPipPip
  • 374 messages
  • Gender:Male
  • Location:Costa Rica & Bretagne

Posté 14 octobre 2018 - 04:34

Suite ...
 
Le capteur ultrason HC-SR04 ,( situé à l'arrière du robot) est  intégré dans le sketch Arduino avec la bibliothèque "Newping"  et fonctionne.
J'en ai profité pour  modifier le code relatif au capteur US SRF05 situé à l'avant du robot  afin de généraliser la bibilothèque "Newping".
 
La lecture des 2 capteurs US se fait dans la boucle "loop" chaque 100 ms  ( méthode millis() )
 
Pour l'instant je n'ai pas cherché à optimiser le code , en gardant un traitement différent en fonction du capteur sollicité ( lire le capteur concerné si on avance ou si on recule mais pas les deux sytématiquement )

// Interrogation périodique (100 ms) Distance obstacle capteur ultrason
if ((millis() - previousmillisUS) >= DISTANCEUSINTERVAL) {  
 if (CurrentRobotStatus != STOP)  {    
  int DistanceObstacle=0;    
  DistanceObstacle = sonar[0].ping_cm();  // 0 = SRF05    
  previousmillisUS = millis();    
  if ((DistanceObstacle < DISTANCEUSMIN) and (CurrentRobotStatus == AV))    {      
   CurrentRobotStatus= STOP; // Etat Stop      ArreterRobot(); // l'obstacle est dans la zone proche du robot      
   Serial.print("<Distance SRF05 trop proche obstacle = ");      
   Serial.print(DistanceObstacle);     
  }     
  DistanceObstacle=0;    
  DistanceObstacle = sonar[1].ping_cm();  // 1 = HC-SR04    
  previousmillisUS = millis();    
  if ((DistanceObstacle < DISTANCEUSMIN) and (CurrentRobotStatus == AR) and (DistanceObstacle != 0))   {   
   CurrentRobotStatus= STOP; // Etat Stop      ArreterRobot(); // l'obstacle est dans la zone proche du robot     
   Serial.print("<Distance SR04 trop proche obstacle = ");      
   Serial.print(DistanceObstacle);     
  }      
 }
}    

Pura vida

 

Ma chaine youtube  https://www.youtube....EQ5MTR3A/videos

Tutoriel MIT Inventor2  https://www.robot-ma...e-robot-mobile/


#243 gerardosamara

gerardosamara

    Membre passionné

  • Membres
  • PipPipPip
  • 374 messages
  • Gender:Male
  • Location:Costa Rica & Bretagne

Posté 15 octobre 2018 - 04:57

Retour sur l'application Android de controle du robot  pour y introduire la possibilité de  gestion à distance sur l'écran d'accueil  :

 

- Ajout de 2 boutons Accès Local et Accès Distant

- Visualisation du mode choisi local ou distant sur l'écran d'accueil et sur l'écran  "Controle du robot par smartphone"

- Prise  en compte de ce mode dans l'écran "Controle du robot par Smartphone"

 

=> Reste à ajouter les blocs de code dans l'application MIT Inventor2 et à tester

 

App android v030.png


Pura vida

 

Ma chaine youtube  https://www.youtube....EQ5MTR3A/videos

Tutoriel MIT Inventor2  https://www.robot-ma...e-robot-mobile/


#244 gerardosamara

gerardosamara

    Membre passionné

  • Membres
  • PipPipPip
  • 374 messages
  • Gender:Male
  • Location:Costa Rica & Bretagne

Posté 16 octobre 2018 - 02:59

La prise en compte du controle à distance du robot consiste à :

 

- Mémoriser  l'état Local / Distant des boutons correspondants dans l'écran d'accueil

- ¨Partager cet état avec l'écran de controle du robot par smartphone  ( startvalue )

- Affecter au robot et à la caméra PI une IP de type locale ou externe (hostname) en fonction du mode Local ou Distant

 

Ecran accueil

 

blocks ecran1 mode distant.png

 

Ecran controle du robot par smartphone

 

blocks ecran3 mode distant.png

 

Le test de pilotage du robot a été fait avec le smartphone en Wifi pour le mode local et mode 4G pour le mode distant  ( retour vidéo et commande du robot).

Un indication du mode gestion local ou distant a été ajouté sur l'écran.

 

Screenshot en mode distant et commande robot "Avancer"

 

app android mode distant.png


Pura vida

 

Ma chaine youtube  https://www.youtube....EQ5MTR3A/videos

Tutoriel MIT Inventor2  https://www.robot-ma...e-robot-mobile/


#245 gerardosamara

gerardosamara

    Membre passionné

  • Membres
  • PipPipPip
  • 374 messages
  • Gender:Male
  • Location:Costa Rica & Bretagne

Posté 16 octobre 2018 - 11:38

Point de situation de ce qui est fait de la version 2 du robot  :

 

- Un nouveau chassis Makeblock à 2 roues motrices + 1 roue folle arrière , toujours piloté par la meme app Android MIT Inventor2 avec retour video pour piloter le robot par Wifi

- Une batterie Lipo 3S 11.7V et 2200 mAh

- Un raspberry PI3 + Arduino Mega + shield moteur Arduino

- Un convertisseur 5A 12V-5V équipé  d'1 sortie 12V pour le driver moteurs et de 4 sorties 5V pour RPI3 et autres capteurs

- Deux motoréducteurs GM25-370CA avec encodeur en 3.3V + roues

- Une Caméra Pi V2 NoIR pour vision nuit montée sur un servo pour balayage horitontal pour retour vidéo et détection de mouvement avec "motion"

- Un capteur ultrason SRF05 pour détection obstacles à l'avant du robot

- Un 2ème capteur ultrason HC-SR04 pour détection obstacles à l'arrière du robot

- Pilotage du robot en mode distant , en complément du mode local

 

Reste à faire par ordre de priorité :

 

- Odométrie et correction de trajectoire par odométrie

- IMU Centrale inertielle MPU-650 (disponible)

- L'estimation de position du robot par odométrie + IMU

- Télémètrie ( distance capteur ultrasons  , tension batterie , Intensité consommé .....) vers l'app smartphone Android et vers la domotique

- Poste recharge autonome batterie

- L'intégration du robot en wifi avec le logiciel domotique Domoticz pour navigation autonome en cas d'intrusion détectée par un capteur de détection de mouvement

- Une page dashboard sur l'application domotique pour affichage de données dans un dashboard (caméra,tension et courant batterie , courant moteurs , log , ...)

 

=> Je vais m'attaquer à l'odométrie ... pour que le robot avance droit !

=> les motoréducteurs GM25-370CA du robot sont équipés d' encodeur en 3.3V


Pura vida

 

Ma chaine youtube  https://www.youtube....EQ5MTR3A/videos

Tutoriel MIT Inventor2  https://www.robot-ma...e-robot-mobile/


#246 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 966 messages
  • Gender:Male
  • Location:Anglet

Posté 17 octobre 2018 - 04:21

Si ça peut t'aider tu as ce sujet : 
https://www.robot-ma...dernier-moment/

 

C'est vrai que j'ai pas " retravaillé " sur ce robot depuis qu'il a été confié à l'association ESTIA SYSTEM qui l'a utilisé à la coupe de france de robotique et j'ai pas non plus les dernières versions de code qui ont été utilisées, mais le fait que la démarche de départ est expliquée me semble être une raison suffisante pour servir de base. 

Par contre suite au résultat obtenu je recommande : 

  • D'utiliser toute la résolution des codeurs ( et pas seulement la moitié comme je l'ai fait dans le code ... =)  ) surtout que vu que tu as une arduino mega tu as suffisament d'entrées en interruption : (2, 3, 18, 19, 20, 21 )=) ( moi j'ai utilisé une nano qui avait seulement 2 et 3 en interruption... )
  • Et régler le cap avec l'imu =) 

Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#247 gerardosamara

gerardosamara

    Membre passionné

  • Membres
  • PipPipPip
  • 374 messages
  • Gender:Male
  • Location:Costa Rica & Bretagne

Posté 18 octobre 2018 - 04:09

Merci @Mike118 pour le lien , ca va bien me servir de base  . :)

Sur l'Arduino MEGA , l'entrée 3 est utilisée par le shield moteur Arduino mais il reste effectivement  encore 5 entrées avec interruption ( 2,18,19,20,21)

 

Pour ajouter cette fonction Odométrie  , il me faut ajouter une alimentation 3.3V pour les encodeurs moteurs , en alimentant une carte alim 2 sorties 5V et 2 sorties 3.3V à partir de la dernière sortie 5V de la carte convertisseur 5V .

Une des sorties 5V disponibles de la carte alim 5V/3.3V servira à alimenter la carte IMU que je possède aussi .

 

Le tout mis sur une véroboard .

 

Hw odometrie.jpg


Pura vida

 

Ma chaine youtube  https://www.youtube....EQ5MTR3A/videos

Tutoriel MIT Inventor2  https://www.robot-ma...e-robot-mobile/


#248 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 966 messages
  • Gender:Male
  • Location:Anglet

Posté 18 octobre 2018 - 04:41

tu as du 3.3V dispo sur l'arduino méga et sur la pi... C'est pas suffisant ? 

Par contre dans l'idée oui c'est bien d'utiliser une vero board pour mettre les éléments en commun ça marche bien =) C'est fait pour =)
Sinon petite question : ça va tu as pas eu de problème particulier pour souder dessus ? Moi j'ai aucun problème non plus mais un client a laisser un retour négatif sur le produit ... 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#249 Melmet

Melmet

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 520 messages
  • Gender:Male
  • Location:Saint-Sozy (46200)

Posté 18 octobre 2018 - 08:11

Les vero board de ce type scuse moi mais c'est de la "merdasse mon seigneur", piste et pastille pas bien calibrer sans compter que l’adhérence des pastilles sont vraiment nul. 

donc quand tu soude "de façons" plus costaud, bennnnn ca tien pas .

moi j'ai fait des carte en Epoxy pour gerer les alims et aucun problèmes.


Ne demande jamais à un robot de faire ce que tu peux faire toi même. :nono: :laugh1:


#250 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 966 messages
  • Gender:Male
  • Location:Anglet

Posté 18 octobre 2018 - 09:54

Bon c'est noté. Je n'en rachèterais plus, même si moi perso je n'ai pas de problème avec ...
Le tout par contre c'est surtout de ne pas "trop chauffer" sinon c'est sur que vu qu'il n'y a pas de vernis épargne sur la carte et pas de plaquage les pastilles peuvent sauter ...

Au delà du fait de ne pas trop chauffer je trouve que ça fait le taffe que ça doit faire. 

Après il y a les même véroboard avec vernis épargne et plaquage et qui sont même en double face... Par contre un truc que je n'aime pas avec c'est véroboard là c'est que je ne peux pas faire aussi facilement les " lignes de soudures" car les pastilles étant plaquée et en double face l'étain file plus facilement dans le trou et de l'autre côté de la carte par gravité ... Phénomène inexistant sur une véroboard de " moins bonne qualité " ... 

Dans tous les cas si vous n'êtes pas satisfait d'un produit ou autre il ne faut pas hésiter à le dire! =) 

PS: si on divague trop je déplacerais ces messages dans un sujet dédié à la véroboard =)


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#251 gerardosamara

gerardosamara

    Membre passionné

  • Membres
  • PipPipPip
  • 374 messages
  • Gender:Male
  • Location:Costa Rica & Bretagne

Posté 20 octobre 2018 - 12:53

Pour la Veroboard , j'aime bien que les pastilles ne soit que d'un coté de la carte et le problème potentiel est quand on chauffe trop la soudure  ..... ca fait le taff comme tu dis

Je n'ai pas d'expérience avec la solution de Melmet ( carte en Epoxy )

 

En qui concerne l'odométrie pour le robot , les encodeurs sont cablés et alimentés  en 3.3v .

Je n'aime pas alimenter du 5V ou 3.3V à partir du RPI ou de lArduino , aussi j'utilise des cartes convertisseur externes , sauf pour des essais ponctuels

 

Les liaisons encodeurs <-> carte Mega se font sans adaptateurs de niveau 3.3v <-> 5V car les entrées Arduino 5V de la carte MEGA sont tolérantes 3.3v .

L'IMU sera introduit dans un deuxième temps pour ne pas compliquer .

 

Y a plus qu'à  modifier le sketch Arduino ...

 

La photo du robot avec la veroboard comprenant l'alim 3.3V pour les 2 encodeurs et l'IMU (en attente de prise en compte) , qui est installée dans le 2ème étage du robot .

 

Robot V2 encodeurs ed2.jpg


Pura vida

 

Ma chaine youtube  https://www.youtube....EQ5MTR3A/videos

Tutoriel MIT Inventor2  https://www.robot-ma...e-robot-mobile/


#252 gerardosamara

gerardosamara

    Membre passionné

  • Membres
  • PipPipPip
  • 374 messages
  • Gender:Male
  • Location:Costa Rica & Bretagne

Posté 23 octobre 2018 - 03:48

L'implémentation de la fonction PID  a été introduite dans le sketch Arduino du robot ( en m'aidant fortement de l'exemple donné par Mike118 ) et le test commence avec la partie "void setup" pour  vérifier le bon fonctionnement des encodeurs , l'acquisition de la vitesse par les encodeurs  et que la partie asservissement tourne sans vérifier son bon fonctionnement.

 

Ensuite la partie asservissement vitesse des moteurs sera testée dans la boucle "void loop" pour les commandes robot "Avance" et "Recule"

 

Odometrie setup.PNG


Pura vida

 

Ma chaine youtube  https://www.youtube....EQ5MTR3A/videos

Tutoriel MIT Inventor2  https://www.robot-ma...e-robot-mobile/


#253 gerardosamara

gerardosamara

    Membre passionné

  • Membres
  • PipPipPip
  • 374 messages
  • Gender:Male
  • Location:Costa Rica & Bretagne

Posté 30 octobre 2018 - 04:12

Grrr  .. La micro carte SD du RPI3 vient de lacher et impossible de savoir ce qu'elle a car elle n'est pas détectée sur mon PC Win10  .

Y a plus qu'à en acheter une autre , ré-installer Rasbian+ Wifi  et la conf du robot

 

Cette fois ci je mettrai le répertoire "var/log" en RAM du RPI3 comme sur mes RPI domotiques , pour limiter le nombre d'écritures sur la carte SD


Pura vida

 

Ma chaine youtube  https://www.youtube....EQ5MTR3A/videos

Tutoriel MIT Inventor2  https://www.robot-ma...e-robot-mobile/


#254 gerardosamara

gerardosamara

    Membre passionné

  • Membres
  • PipPipPip
  • 374 messages
  • Gender:Male
  • Location:Costa Rica & Bretagne

Posté 02 novembre 2018 - 06:37

Finalement j'ai changé la carte SD et la carte RPI3B par une RPI3B+ que j'avais en stock.

 

Pour ma mémoire si il y a une prochaine fois :  Ré-Installation Raspbian Strech + configuration Rover1sur RPi 3

- Télécharger Raspbian Stretch et copier sur une carte SD 8GO avec Win32DiskImager (+ fichier ssh file pour activation SSH et fichier wpa_supplicant.conf pour configuration Wifi)
- Booter le Rpi3 and login via Putty + sudo raspi-config ( add Camera +VNC server, expand root file system,  timezone GMT-6) + IP  fixe dans /etc/dhcpcd.conf .
- Mettre à jour Stretch : sudo apt-get update , sudo apt-get upgrade

- Restaurer les fichiers Rpi python et sketches arduino du robot

- Connexion au RPI par le client VNC viewer

- Installer l' IDE Arduino 1.8.7 (Zip)

- Installer les bibilothèques NewPing , TimerOne and Pid

- Configurer la caméra PI V2

- Installer et configurer "motion" sur le RPI3


Pura vida

 

Ma chaine youtube  https://www.youtube....EQ5MTR3A/videos

Tutoriel MIT Inventor2  https://www.robot-ma...e-robot-mobile/


#255 levend

levend

    Pilier du forum

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

Posté 02 novembre 2018 - 09:33

Je passe faire un petit coucou :) pour montrer que tu n'es pas tout seul, je lis tous tes posts mais là tu n'es pas sur la partie que je connais le mieux alors j'observe et j'apprends.


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

#256 gerardosamara

gerardosamara

    Membre passionné

  • Membres
  • PipPipPip
  • 374 messages
  • Gender:Male
  • Location:Costa Rica & Bretagne

Posté 09 novembre 2018 - 09:55

L'intégration de la fonction PID (lecture encodeurs + asservissement  vitesse moteurs ) est réalisée mais les tests ne sont pas bons du tout ( la roue droite ne tourne pas )

Après pas mal d'investigation et dichotomie , je jette l'éponge  :

 

- fonctionnement sans lecture encodeurs = OK

- Fonctionnement avec ajout lecture encodeurs = NOK 

 

=> pas la peine d'aller plus loin

 

Donc je  décide d'y aller en mode programme de test unitaires en créant un sketch arduino minimum avec uniquement la gestion des moteurs sans PID ( ni encodeurs)

Résultat OK sans la partie lecture encodeurs , donc je vais pouvoir ajouter à ce sketch minimum  le code relatif à la lecture des encodeurs

 

Code du sketch de test  sans lecture des encodeurs pour partir d'un état fonctionnel qui marche ( boucle avancer - reculer du robot) .

 

NOTE : Le moteur droit  doit avoir la pin Direction inversée du fait de son installation à droite par rapport au moteur gauche

 

digitalWrite(PinDIRGauche, HIGH);  //  Avancer moteur gauche

digitalWrite(PinDirDroit LOW);          //  Avancer moteur droit

/*************************************************************
Motor Shield Arduino 2-Channel DC Motor Testing
*************************************************************/

void setup() {
  
  //Setup Channel A  ( moteur gauche)
  pinMode(12, OUTPUT); //Initiates Motor Channel A pin
  pinMode(9, OUTPUT); //Initiates Brake Channel A pin

  //Setup Channel B ( moteur droite )
  pinMode(13, OUTPUT); //Initiates Motor Channel A pin
  pinMode(8, OUTPUT);  //Initiates Brake Channel A pin
}

void loop(){
  
  //Motor A forward 
  digitalWrite(12, HIGH); //Establishes forward direction of Channel A
  digitalWrite(9, LOW);   //Disengage the Brake for Channel A
  analogWrite(3, 123);   //Spins the motor on Channel A at full speed

  //Motor B forward 
  digitalWrite(13, LOW);  //Establishes backward direction of Channel B
  digitalWrite(8, LOW);   //Disengage the Brake for Channel B
  analogWrite(11, 123);    //Spins the motor on Channel B at half speed

    delay(3000);
  
  digitalWrite(9, HIGH);  //Engage the Brake for Channel A
  digitalWrite(8, HIGH);  //Engage the Brake for Channel B

  delay(1000);
  
    //Motor A backward 
  digitalWrite(12, LOW);  //Establishes backward direction of Channel A
  digitalWrite(9, LOW);   //Disengage the Brake for Channel A
  analogWrite(3, 123);    //Spins the motor on Channel A at half speed
  
  //Motor B backwardd 
  digitalWrite(13, HIGH); //Establishes forward direction of Channel B
  digitalWrite(8, LOW);   //Disengage the Brake for Channel B
  analogWrite(11, 123);   //Spins the motor on Channel B at full speed
    
  delay(3000);
    
  digitalWrite(9, HIGH);  //Engage the Brake for Channel A
  digitalWrite(8, HIGH);  //Engage the Brake for Channel B
    
  delay(10000);
  
}

Le code minimum de lecture des encodeurs moteurs va pouvoir maintenant etre rajouté   ... à suivre


Pura vida

 

Ma chaine youtube  https://www.youtube....EQ5MTR3A/videos

Tutoriel MIT Inventor2  https://www.robot-ma...e-robot-mobile/


#257 gerardosamara

gerardosamara

    Membre passionné

  • Membres
  • PipPipPip
  • 374 messages
  • Gender:Male
  • Location:Costa Rica & Bretagne

Posté 10 novembre 2018 - 11:51

Voici les résultas du sketch minimum avec uniquement les fonction du driveur moteurs et de lectures des encodeurs ( sans asservissement PID).

Les résultas sont identiques par rapport au programme complet du robot  ( Deux motoréducteurs GM25-370CA avec encodeur en 3.3V )

 

- La roue droite ne tourne pas  ( vibrations légères du moteur)

- la lecture de la vitesse des roues par les encodeurs est incohérente  ( Encodeur A gauche faiblement incrémenté alors que la roue tourne , Encodeur B Droit incrémenté alors que la roue ne tourne pas )   = Corrigé dans fonction  "void TimerIsr()"   par inversion SpeedGauche et speedDroit dans les Serial.print )

- Le cablage des encodeurs a été vérifié

 

=> Je continue à réfléchir !!!

 

1) Les broches de commandes du driver moteur Arduino :

 

 

Function pins per Ch. A pins per Ch. B

 

                    Direction D12 D13

                    PWM D3 D11

                    Brake D9 D8

                    Current Sensing A0 A1

 

Motors Connection

 

Brushed DC motor. You can drive two Brushed DC motors by connecting the two wires of each one in the (+) and (-) screw terminals for each channel A and B. In this way you can control its direction by setting HIGH or LOW the DIR A and DIR B pins, you can control the speed by varying the PWM A and PWM B duty cycle values. The Brake A and Brake B pins, if set HIGH, will effectively brake the DC motors rather than let them slow down by cutting the power. You can measure the current going through the DC motor by reading the SNS0 and SNS1 pins. On each channel will be a voltage proportional to the measured current, which can be read as a normal analog input, through the function analogRead() on the analog input A0 and A1. For your convenience it is calibrated to be 3.3V when the channel is delivering its maximum possible current, that is 2A.

 

2) La trace debug du test :

<Arduino : Start Setup>
<Arduino : Setup Encoders>
<Arduino : Setup Motors>
<Arduino : AvancerRobot()>
<EncodA = 0.83 , EncodB = -196.50>
<Arduino : ReculerRobot()>
<EncodA = 0.83 , EncodB = -192.50>
<Arduino : ArreterRobot()>
<Arduino : End Setup>
<Arduino : Start loop
<Arduino : AvancerRobot()>
<EncodA = 0.17 , EncodB = -197.83>
<EncodA = 0.17 , EncodB = -232.17>
<EncodA = 0.00 , EncodB = -234.83>
<EncodA = 0.33 , EncodB = -235.00>
<EncodA = 0.33 , EncodB = -234.83>
<Arduino : ArreterRobot()>
<Arduino : ReculerRobot()>
<EncodA = 0.67 , EncodB = -193.83>
<EncodA = 0.17 , EncodB = -239.33>
<EncodA = 0.83 , EncodB = -239.67>
<EncodA = 1.33 , EncodB = -239.50>
<EncodA = 0.33 , EncodB = -239.67>
<Arduino : End loop

3) Le sketch de test :

/*************************************************************
Motor Shield Arduino - 2-Channel DC Motor with encodeurs
*************************************************************/
// ------- Bibiliothèques
#include <TimerOne.h> // Pour le timer

// ------ Pins MOTORS connectés à l'Arduino MEGA
#define PINMOTEURGAUCHEPWMA 3    // Arduino Shield motor gauche
#define PINMOTEURDROITPWMB 11    // Arduino Shield motor droit
#define PINBRAKEA 9              // Arduino Shield motor gauche
#define PINBRAKEB 8              // Arduino Shield motor droit
#define PINMOTEURGAUCHEDIRA 12   // Arduino Shield motor gauche
#define PINMOTEURDROITDIRB 13    // Arduino Shield motor droit
#define PINENCODGAUCHEA 18       // Encodeur A gauche
#define PINENCODGAUCHEB 19       // Encodeur B gauche
#define PINENCODDROITA 20        // Encodeur A droit
#define PINENCODDROITB 21        // Encodeur B droit

int SpeedMotor_A=123;
int SpeedMotor_B=123;
// volatile => pour toute variable qui sera utilise dans les interruptions
volatile int countDroit = 0; /* comptage de tick d'encoder qui sera incrémenté sur interruption " On change " sur l'interruption 0 */
volatile int countGauche = 0; /* comptage de tick d'encoder qui sera incrémenté sur interruption " On change " sur l'interruption 1 */
volatile double speedDroit = 0; // vitesse du moteur
volatile double speedGauche = 0; // vitesse du moteur

void setup() {
  
 SerialSetup();     // initialize the serial communication 
 EncodersSetup();    // Init 2 encoders
 MotorsSetup();      // Init 2 motors sans PID
}
 
void loop(){

  Serial.println("<Arduino : Start loop");
  AvancerRobot();
  delay(10000);
  ArreterRobot();
  ReculerRobot();
  delay(10000);
  Serial.println("<Arduino : End loop");
}

////////////////////////////////////////////////////
// Encoder counter 1
void counterDroit()
{
  byte state = PIND;
  (((state >> PINENCODDROITA) & 1) ^ ((state >> PINENCODDROITB) & 1)) ? countDroit-- : countDroit++; // régler ++ et -- pour que faire avancer => +
}

// Encoder counter 2
void counterGauche()
{
  byte state = PIND;
  (((state >> PINENCODGAUCHEA) & 1 ) ^ ((state >> PINENCODGAUCHEB) & 1)) ? countGauche++ : countGauche--; // régler ++ et -- pour que faire avancer => +
}

// Timer pour calculer la vitesse grace aux encodeurs

void timerIsr()
{
  // Lecture vitesse en tour / mn
  speedDroit = countDroit;
  countDroit = 0;
  speedGauche = countGauche;
  countGauche = 0;
  Serial.println("<EncodA = ");
  Serial.print(speedDroit/6);   // 6 ticks par tour de roue
  Serial.print(" , EncodB = ");
  Serial.print(speedGauche/6);  
  Serial.print(">");
 
}

////////  Traitement ordres Robot
void ArreterRobot()
{
  Serial.println("<Arduino : ArreterRobot()>");
  analogWrite(PINMOTEURGAUCHEPWMA, 0); // Stop the motor by inertia , motor turn off
  analogWrite(PINMOTEURDROITPWMB, 0);  
  digitalWrite(PINBRAKEA, HIGH); // set the brake pins LOW to turn them off:
  digitalWrite(PINBRAKEB, HIGH); 
}

void AvancerRobot()
{
  // Move the motor forward
    Serial.println("<Arduino : AvancerRobot()>");
    digitalWrite(PINBRAKEA, LOW); // set the brake pins LOW to turn them off:
    digitalWrite(PINBRAKEB, LOW); 
    digitalWrite(PINMOTEURGAUCHEDIRA, HIGH);  // Set direction to High = Forward
    digitalWrite(PINMOTEURDROITDIRB, LOW);
    analogWrite(PINMOTEURGAUCHEPWMA, SpeedMotor_A);
    analogWrite(PINMOTEURDROITPWMB, SpeedMotor_B); 
}

void ReculerRobot()
{
  // Reverse the motors
  Serial.println("<Arduino : ReculerRobot()>");
  digitalWrite(PINBRAKEA, LOW); // set the brake pins LOW to turn them off:
  digitalWrite(PINBRAKEB, LOW); 
  digitalWrite(PINMOTEURGAUCHEDIRA, LOW);  // Set direction to Low = Backward 
  digitalWrite(PINMOTEURDROITDIRB, HIGH);  // Set direction to Low = Backward 
  analogWrite(PINMOTEURGAUCHEPWMA, SpeedMotor_A);
  analogWrite(PINMOTEURDROITPWMB, SpeedMotor_B);
 
}
void MotorsSetup()
{
  // set up all of the pins of the motor shield as outputs:
  Serial.println("<Arduino : Setup Motors>");
  pinMode(PINBRAKEA, OUTPUT);
  pinMode(PINMOTEURGAUCHEDIRA, OUTPUT);
  pinMode(PINMOTEURGAUCHEPWMA, OUTPUT);
  pinMode(PINBRAKEB, OUTPUT);
  pinMode(PINMOTEURDROITDIRB, OUTPUT);
  pinMode(PINMOTEURDROITPWMB, OUTPUT);
    // Move the motor forward
  AvancerRobot();
  delay(1000);
  ReculerRobot();
  delay(1000);
  ArreterRobot(); 

}  

void EncodersSetup()
{
  Serial.println("<Arduino : Setup Encoders>");
  // on initialise les entrées et sorties
  pinMode(PINENCODGAUCHEA, INPUT_PULLUP);
  pinMode(PINENCODGAUCHEB, INPUT_PULLUP);
  pinMode(PINENCODDROITA, INPUT_PULLUP);
  pinMode(PINENCODDROITB, INPUT_PULLUP);
 
  // Encoder quadrature counter
 attachInterrupt(digitalPinToInterrupt(18),counterGauche, CHANGE);
 attachInterrupt(digitalPinToInterrupt(20),counterDroit, CHANGE);
 Timer1.initialize(800000); // set a timer of length 100000 microseconds (or 0.1 sec - or 10Hz 
 Timer1.attachInterrupt( timerIsr );
}

void SerialSetup()
{
  Serial.begin(19200); // initialize the serial communication 
}

Pura vida

 

Ma chaine youtube  https://www.youtube....EQ5MTR3A/videos

Tutoriel MIT Inventor2  https://www.robot-ma...e-robot-mobile/


#258 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 966 messages
  • Gender:Male
  • Location:Anglet

Posté 11 novembre 2018 - 12:11

Je viens de comprendre un truc !! 

Si tu n'utilises pas le même câblage que j'ai effectué tu ne peux pas utilisé le même code que j'ai proposé ! ^^ 

PIND c'est pour les pin 0 1 2 3 4 5 6 et 7 de l'arduino nano ou uno. 
Et l'utilisation des encodeurs se base là dessus. 

Il faut revoir toute cette façon de faire si tu fais un branchement différent. 

// Encoder counter 1
void counterDroit()
{
  byte state = PIND;
  (((state >> PINENCODDROITA) & 1) ^ ((state >> PINENCODDROITB) & 1)) ? countDroit-- : countDroit++; // régler ++ et -- pour que faire avancer => +
}

// Encoder counter 2
void counterGauche()
{
  byte state = PIND;
  (((state >> PINENCODGAUCHEA) & 1 ) ^ ((state >> PINENCODGAUCHEB) & 1)) ? countGauche++ : countGauche--; // régler ++ et -- pour que faire avancer => +
}

dans ton cas il faudrait plus un truc du genre  

// Encoder counter 1
void counterDroit()
{
  bool statePINENCODDROITA = digitalRead(PINENCODDROITA);
  bool statePINENCODDROITB = digitalRead(PINENCODDROITB);
  (statePINENCODDROITA ^ statePINENCODDROITB) ? countDroit-- : countDroit++; // régler ++ et -- pour que faire avancer => + inverser si nécessaire
}

// Encoder counter 2
void counterGauche()
{
  bool statePINENCODGAUCHEA = digitalRead(PINENCODGAUCHEA);
  bool statePINENCODGAUCHEB = digitalRead(PINENCODGAUCHEB);
  (statePINENCODGAUCHEA ^ statePINENCODGAUCHEB) ? countGauche++ : countGauche--; // régler ++ et -- pour que faire avancer => +
}

Là c'est moins " optimisé car l'appel à digitalRead * 2 et bcp plus lourde que de réaliser la lecture du port en entier et de faire un décalage de bit pour avoir le bit qui t'intéresse. 
Mais au moins c'est valable pour toutes les configuration d'arduino ... 

Je sais pas si j'ai raté d'autres trucs ... 

Par contre si tu utilises une arduino méga tu peux améliorer et mettre 4 interruptions sur les encodeurs au lieu de deux, ça te permet de multiplier par 2 la résolutions mais il faudra ajouter des variables oldState et modifier les fonctions "counter". 

 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#259 gerardosamara

gerardosamara

    Membre passionné

  • Membres
  • PipPipPip
  • 374 messages
  • Gender:Male
  • Location:Costa Rica & Bretagne

Posté 13 novembre 2018 - 03:25

Oui Mike effectivement , la lecture de port par PIND ne peut pas etre utilisé sur une carte MEGA2560 du fait de l'affectation des digitals pins avvec interruptions ( les pins 2 et 3 auraient pu convenir mais la pin3 est réservée et affectée pour le shield motor driver Arduino )

 

Donc la solution est la lecture des pins encodeurs par Digitalwrite() comme tu as proposé dans les fonctions counterDroit() et counterGauche() :

 

- Une trace Serial.print sur les 4 variables "statePINENCODxxxx" des Digitalwrite sur les encodeurs  confirment que les encodeurs du moteur droit ne répondent  au Digitalwrite()
- Un croisement des moteurs gauche et droit pour lever le doute entre la carte Arduino et ce moteur droit a été fait et confirme le problème coté moteur droit  ( croisement des connexions encodeurs sur la carte Arduino et de la pin interrupt de l'attachInterrupt().

 

Il est possible que cela soit la conséquence de problème branchement de l'alimentation encodeur ( court circuit , polarité )   ... je ne vois que cela meme si cela me rappelles rien

 

=> Moteur droit à remplacer si je veux utiliser l'odométrie sur le robot :wub:


Pura vida

 

Ma chaine youtube  https://www.youtube....EQ5MTR3A/videos

Tutoriel MIT Inventor2  https://www.robot-ma...e-robot-mobile/


#260 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 966 messages
  • Gender:Male
  • Location:Anglet

Posté 14 novembre 2018 - 05:25

Hum ... J'aimerais bien en savoir un peu plus sur le problème d'encodeur ... 

 

 

Tu peux poster ton code de test pour la méga du coup ? 

Quand tu lis le pin encodeur e tournant doucement le moteur à la main :Est ce que le signal est toujours HIGH ? Ou est ce qu'il est toujours LOW ?  Quand tu tournes la roue ?

 

Et si tu vérifies au multimètre avec le pin encodeur débranché de l'arduino ? tu obtiens le même résultat ? 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 




Répondre à ce sujet



  



Aussi étiqueté avec au moins un de ces mots-clés : Arduino, Raspberry PI3, MIT Inventor 2, Rover, UGV, Robot mobile, PID

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

0 members, 0 guests, 0 anonymous users