Aller au contenu


Mickixe

Inscrit(e) (le) 02 nov. 2019
Déconnecté Dernière activité févr. 02 2020 12:49
-----

#107345 Mon projet perso de robot mobile - présentation et demande d'avis

Posté par Mickixe - 16 janvier 2020 - 11:42

Bonjour,
 
Comme indiqué dans ma présentation, jusque là j'étais un peu touche à tout, même si je suis resté principalement sur l'arduino.
J'ai toutefois décidé de me lancer dans un projet un peu plus concret et fonctionnel, de manière à mettre en application ce que j'ai pu apprendre jusque là. Objectifs : continuer d'apprendre et s'amuser !
 
Je suis donc parti sur un projet de robot mobile autonome comportant :
- 4 roues mecanum (roues imprimées en 3D (fichiers récupérées sur Thingiverse) et actionnées par des moteurs cc 12V),
- 1 écran LCD matérialisant des yeux qui suivront les mouvements du robot (voire pouvoir changer d'expression),
- 1 haut-parleur émettant des sons enregistrés sur une carte SD,
- de la lumière,
- 1 capteur IR pour avoir la possibilité de le piloter avec une télécommande (et faire ainsi des tests),
- des capteurs US
- un bras muni d'une pince (encore en projet pour l'instant)
 
Pour le châssis, je suis parti pour l'instant sur du carton plume, que je trouve parfait pour une phase de prototypage (perçage à volonté et remplacement facile en cas de casse).
Les pièces de support des composants sont imprimés en 3D (modélisées avec Tinkercad) 
 
Mon montage repose actuellement sur 2 arduino uno :
- 1 avec un shield moteur et qui commande l'écran LCD, les LED, le HP (et donc la lecture de la carte SD) et la réception IR (plus vraiment de pins dispos sur cette carte).
- 1 seconde que je destine pour les capteurs (pour le moment, tests en cours avec des US).
Communication série RX/TX entre les 2 arduino.
 
Voilà le rendu actuel (désolé pour le manque de propreté du câblage, j'améliorerai ce point une fois mon montage figé)
 
20200116_222843.jpg
 
Au niveau programmation, je suis encore dans une phase de tests, mais ceux-ci s'avèrent globalement concluants, sauf sur 1 point où je bloque actuellement, qui vient, je pense, de ma programmation sur la liaison série entre les 2 cartes. En effet, bien que le capteur US fonctionne et permet de modifier le comportement des moteurs en fonction des distances que j'ai définies, les moteurs fonctionnent à des vitesses extrêmement réduites par rapport à la normale (et que je peux avoir lorsque je commande avec la télécommande IR). Ci-dessous extrait de mes codes pour info.
Comme j'ai projet de mettre plusieurs capteurs US, je voulais sur ce point m'inspirer de la ceinture de capteurs US trouvée sur le forum (super tuto d'ailleurs !), mais dans ce cas, quel code utiliser ? Je n'ai pas essayé de passer en I2C.
 
Je souhaitais également un avis sur les alim :
- J'utilise une batterie LiPo 3S pour l'alim des moteurs,
- Pour les 2 arduino, je les alimente actuellement par une pile 9V chacune. J'ai également une batterie LiPo 2S. Puis-je l'utiliser et elle seule pour alimenter mes cartes ? Cela poserait-il un soucis ? 
 
Voilà, je vous remercie par avance pour l'aide et les conseils que vous pourrez m'apporter.
N'hésitez pas également à apporter tout commentaire/critique ou proposition d'amélioration, je suis encore débutant et tout est bon à prendre pour progresser !
 
Mickaël
 
Extrait code carte "actionneurs" - lecture liaison série
 
Serial.begin(115200);
 
if (Serial.available() > 0) {
    
    distance = Serial.read();
 
   if (distance=='p'){//Mouvement prudent
      digitalWrite(A1,LOW);
      digitalWrite(A2,HIGH);//LED jaune
      digitalWrite(A0,LOW);
      avance(150);//fonction avance à vitesse réduite
      }
    if (distance=='a'){//Arrêt
       digitalWrite(A2,LOW);
       digitalWrite(A0,HIGH);//LED rouge
       digitalWrite(A1,LOW);
       arret();//fonction arrêt
       }
   if (distance=='o'){//Marche
      digitalWrite(A0,LOW);
      digitalWrite(A1,HIGH);//LED verte
      digitalWrite(A2,LOW);
      avance(255);//fonction avance à pleine vitesse
    }
 

Extrait code carte "capteurs" - émission liaison série

Serial.begin(115200);
 
if(sonar1.ping_cm() > distance_Prudent && sonar1.ping_cm() <= distance_Arret) { Serial.print('p'); }
  else if(sonar1.ping_cm() <= distance_Arret) { Serial.print('a'); }
  else { Serial.print('o'); }