Go Down

Topic: simulateur 2 dof pour console de jeu (Read 4382 times) previous topic - next topic

guillaumehornet

Apr 05, 2014, 08:14 pm Last Edit: Apr 05, 2014, 08:35 pm by guillaumehornet Reason: 1
Bonjour à tous,
je me suis fixé un objectif pour faire fonctionner un simulateur dynamique pour console de jeu avec un arduino et un monster motor shield.

je voulais pas reprendre le code tout fait que l'on trouve pour le monster motor shield, j'ai essayé de comprendre son fonctionnement et je me suis lancé dans le code.

le problème c'est que rien ne fonctionne.

le but etant de recuperer les valeurs des potentiometres du pedalier ( frein et accelerateur) ainsi que du volant.

je me permet de vous mettre le code. c'est sur qu'il y a certainement des raccourcis à faire dans ce code mais j'ai préféré le faire le plus simple pour moi. (enfin pour le moment)
Code: [Select]

int const potaraccelerateur = A0;
int const potarfreinage = A1;
int const potarvolant = A4;
int const moteur1 = 5; //vitesse moteur1,moteur acceleration freinage
int const sensmoteur1hor = 7; //sens de rotation horaire
int const sensmoteur1anti = 8; //sens de rotation anti-horaire
int const moteur2 = 6; // vitesse moteur2 , moteur inclinaison droite et gauche
int const sensmoteur2hor = 4;  //sens de rotation horaire
int const sensmoteur2anti = 9;//sens de rotation anti-horaire
int const courantmoteur1 = A2;  //consommation courant moteur
int const courantmoteur2 = A3; //consommation courant moteur

int valeurpotaraccel = 0;
int valeurpotarfrein = 0;
int valeurpotarvolant = 0;
int valeurmoteur1 = 0;

void setup()
{
 Serial.begin(9600);
 pinMode(potaraccelerateur, INPUT);
 pinMode(potarfreinage, INPUT);
 pinMode(potarvolant, INPUT);
 pinMode(moteur1, OUTPUT);
 pinMode(sensmoteur1hor, OUTPUT);
 pinMode(sensmoteur1anti, OUTPUT);
 pinMode(moteur2, OUTPUT);
 pinMode(sensmoteur2hor, OUTPUT);
 pinMode(sensmoteur2anti, OUTPUT);
 
 digitalWrite(sensmoteur1hor, HIGH);
 digitalWrite(sensmoteur1anti, LOW);
 digitalWrite(sensmoteur2hor, HIGH);
 digitalWrite(sensmoteur2anti, LOW);
 analogWrite(moteur1,127);
 analogWrite(moteur2,127);
 moteurstop();
 
}

void loop()
{
 valeurpotaraccel = analogRead(potaraccelerateur);
 valeurpotarfrein = analogRead(potarfreinage);
 valeurpotarvolant = analogRead(potarvolant);
 
 valeurpotaraccel = map(valeurpotaraccel, 0, 1023, 0, 255);
 valeurpotarfrein = map(valeurpotarfrein, 0, 1023, 0, 255);
 valeurpotarvolant = map(valeurpotarvolant, 0, 1023, 0, 255);
 
 if (valeurpotaraccel >= valeurpotarfrein) { //recupere la valeur du potentiometre de la pedale la plus enfoncé
   valeurmoteur1 = valeurpotaraccel;
     if (valeurmoteur1 >= valeurpotaraccel){  //lorsqu'on leve le pied de l'accelerateur, ca determine le sens du moteur
           analogWrite(moteur1, valeurpotaraccel);
           sensantihoraire1();
           delay(50);
           moteurstop();
     }else{
       analogWrite(moteur1, valeurpotaraccel);
           senshoraire1();
           delay(50);
           moteurstop();
     }
   
 }else{
   valeurmoteur1 = valeurpotarfrein;
   if (valeurmoteur1 >= valeurpotarfrein){
           analogWrite(moteur1, valeurpotarfrein);
           sensantihoraire1();
           delay(50);
           moteurstop();
     }else{
       analogWrite(moteur1, valeurpotarfrein);
           senshoraire1();
           delay(50);
           moteurstop();
     }
 }
           
 if (valeurpotarvolant >= 127) {
   analogWrite(moteur2, valeurpotarvolant);
   senshoraire2();
   delay(50);
   moteurstop();
 }else{
   analogWrite(moteur2, valeurpotarvolant);
   sensantihoraire2();
   delay(50);
   moteurstop();
 }
   
 
 }
 //Serial.println(valeur);



void moteurstop()   //arret du moteur
{
 digitalWrite(sensmoteur1hor, LOW);
 digitalWrite(sensmoteur1anti, LOW);
 digitalWrite(sensmoteur2hor, LOW);
 digitalWrite(sensmoteur2anti, LOW);
 analogWrite(moteur1,0);
 analogWrite(moteur2,0);
   
}
void senshoraire1()  //direction du moteur 1 sens horaire
{
 digitalWrite(sensmoteur1hor, HIGH);
 digitalWrite(sensmoteur1anti, LOW);
   
}

void senshoraire2()   //direction du moteur 2 sens horaire
{
 digitalWrite(sensmoteur2hor, HIGH);
 digitalWrite(sensmoteur2anti, LOW);
   
}

void sensantihoraire1()  //direction du moteur 1 sens anti-horaire
{
 digitalWrite(sensmoteur1hor, LOW);
 digitalWrite(sensmoteur1anti, HIGH);
   
}

void sensantihoraire2()   //direction du moteur 2 sens anti-horaire
{
 digitalWrite(sensmoteur2hor, LOW);
 digitalWrite(sensmoteur2anti, HIGH);
   
}


apres , comment peut on faire pour verifier le bon fonctionnement du monster motor shield?

j'espere qu'on pourra m'éguiller sur une solution, en attendant je continu mais investigation.

merci à tous.


Christian_R


le problème c'est que rien ne fonctionne.

Le code est à mettre entre balises # pour la lisibilité.
Quels sont les messages d'erreur, et le câblage réalisé ?
Christian

guillaumehornet

salut,
lors de la vérification aucun problème détecté.
pour le cablage, la carte monster est directement sur la carte arduino et les potentiometres comme defini dans le code.
je pensais que mon code pouvait fonctionner.....
en tout cas, la carte monster s'allume bien au niveau de l'alimentation et la carte arduino baguotte bien, signe qu'elle travaille.

pour info, j'ai pas fait  tous les branchements. je voulais juste voir si au niveau du moteur 1 avec un potentiometre marchait comme il faut. j'ai fait le meme test avec le moteur 2 et le potar... toujours pareil, aucune reaction !

guillaumehornet

pour info, je recupere bien les infos du potentiometre.
il doit avoir une merde dans mon code pour envoyer les infos.

j'ai aussi essayé les codes dispo sur le net mais la, la carte arduino ne bouge même pas....ni les moteurs d'ailleurs.

a+

fdufnews

Un problème à la fois. C'est le plus simple pour apprendre.
Donc, il faut commencer par savoir piloter les moteurs. SANS POTAR.
Vérifier déjà que tu maîtrises la commande dans un sens, puis dans l'autre et enfin le freinage dynamique. Ensuite les rampes d'accélération.
Après tu pourras commencer à implémenter ton système de commande.
Et si j'ai un conseil c'est d'éviter au maximum ces if ... else ... imbriqués et les uns derrière les autres parce que pour arriver à un fonctionnement inattendu (ou même à pas de fonctionnement) y'a pas mieux.
Il est plus sûr:
     d'examiner tout les paramètres d'entrée au début de loop.
     de construire un mot d'état à partir de l'analyse des paramètres
     et d'utiliser un switch .. case ... pour traiter les cas.
l'avantage du switch case c'est que tous les cas sont au même niveau dans le même bloc et bien identifiables ce qui évite des oublis ou des cas qui peuvent s'annuler les uns les autres (ce qui arrive des fois avec les if qui se suivent).

Si tu tiens à utiliser des if else alors il vaut mieux faire des appels de fonctions dans les blocs if else au lieu de mettre des blocs de code. Les tests sont plus compactes et plus lisibles et les fonctions appelées peuvent être testées séparément ce qui est plus simple pour la mise au point et c'est un gage de sécurité.

guillaumehornet

salut merci pour ta réponse.
j'ai essayé un code tout simple, juste demarrer le moteur mais ça n'a pas marché.
apres je me demande si les infos que j'ai  sur la carte monster sont juste.... je parle des numeros des sorties digitals de chaque moteur..... est ce que les declarations de mes variables sont bonnes?

par contre je vais faire ce que tu m'as dit, je vais réécrire le code avec la commande switch... case.
merci pour l'info.

je ne manquerai pas de mettre à jour le code.


Christian_R

Est ce que la masse du moteur est bien reliée à celle de l'arduino ?
Alimentation suffisamment puissante ?
Christian

guillaumehornet

non le moteur est relié directement sur la carte monster avec sa propre alimentation.
j'ai fait le test en direct sans carte, juste l'alim et le moteur... le moteur tourne bien.

fdufnews

Tension et courant moteur s'il te plait.

guillaumehornet

Pour l instant, c est un petit moteur 5v de jouet que j alimente par deux piles aaa.... il marche en direct mais pas avec l arduino... je vais essayé de trouver autre chose....

fdufnews


Pour l instant, c est un petit moteur 5v de jouet que j alimente par deux piles aaa....

2 piles AA = 3V   Passez assez fort mon fils (pour plagier une pub connue)

La tension minimum selon la datasheet c'est 5,5V

guillaumehornet

Donc meme si le moteur tourne avec 3v, lorsque je le branche sur la carte , ça doit pas marché avec 3 v mais avec 5,5..... c est bizarre ! Mais je ferai le test avec plus de pile.....

fdufnews

Cela ne dépend pas du moteur mais du VNH2SP30 (le pont en H)

guillaumehornet

ok.... bon je vais refaire le test alors !!! on s'est jamais, par contre je vais quand meme refaire le code pour que se soit plus propre..

fdufnews

Pour commencer, 4 lignes qui mettent en marche le moteur dans un sens suffisent.

Go Up