Go Down

Topic: [Non résolu]codage et connexion Arduino UNO/Plateforme 4WD Hercules. (Read 1 time) previous topic - next topic

tellus75018

Feb 26, 2014, 04:19 pm Last Edit: Feb 26, 2014, 07:09 pm by tellus75018 Reason: 1
Bonjour à tous,

Je viens vers vous car j'ai découvert depuis peut de temps l'univers de l'arduino et depuis j'y suis accro et à la vue de toutes les possibilités offertes par ce dernier je me suis lancé dans un petit projet qui en fera surement rire certain par sa simplicité pour quelqu'un qui si connait super bien.

Mon projet est d'utilisé une plateforme à 4 roue motrice commandé à distance par une radiocommande 2,4Ghz de modélisme.

J'ai déjà plutôt bien débuter, en fait, j'ai commencé petit avec le "Châssis Cherokee 4WD" disponible à cette adresse:
http://www.gotronic.fr/art-chassis-cherokee-4wd-20595.htm

Je l'ai ensuite connecter à une carte Arduino UNO et un ProtoShield pour la connexion du récepteur 2,4Ghz à 6 canaux.
Jusque la rien de bien compliqué et j'ai aussi travailler un peu, dans le sens ou j'ai cherché à apprendre le codage Arduino depuis le début( Merci à "http://www.mon-club-elec.fr") et grace à quelque recherche sur le net j'ai pu trouver un code pour se châssis mais que j'ai du modifier pas mal pour que tout fonctionne sur mon projet.

Le voici, mais je n'arrive pas à le modifier pour le Chassis Hercules:
Code: [Select]

int ch1; // Here's where we'll keep our channel values
int ch2;
int ch3;
int ch4;
int ch5;
int ch6;

int move; // Forward/Back speed
int turn; // Turning Factor

int pwm_a = 5;  //PWM control for motor outputs
int pwm_b = 6;  //PWM control for motor outputs
int dir_a = 4;  //direction control for motor outputs
int dir_b = 7;  //direction control for motor outputs
int lampe = 13;

void setup() {

pinMode(8, INPUT); // Set our input pins as such
pinMode(9, INPUT);
pinMode(10, INPUT);
pinMode(11, INPUT);
pinMode(12, INPUT);
pinMode(14, INPUT);
pinMode(13, OUTPUT);

Serial.begin(115200); // Pour a bowl of Serial (for debugging)

 pinMode(pwm_a, OUTPUT);  //Set control pins to be outputs
 pinMode(pwm_b, OUTPUT);
 pinMode(dir_a, OUTPUT);
 pinMode(dir_b, OUTPUT);

 analogWrite(pwm_a, 0);  
 analogWrite(pwm_b, 0);
}

void loop() {
 
 ch1 = pulseIn(8, HIGH, 25000); // Read the pulse width of  
 ch2 = pulseIn(9, HIGH, 25000); // each channel
 ch3 = pulseIn(10, HIGH, 25000);
 ch4 = pulseIn(11, HIGH, 25000);
 ch5 = pulseIn(12, HIGH, 25000);
 ch6 = pulseIn(14, HIGH, 25000);

//if(ch6>1000){Serial.println("Left Switch: Engaged");}
//if(ch6<1000){Serial.println("Left Switch: Disengaged");}
if(ch6>1000){digitalWrite(lampe, 1);}
if(ch6<1000){digitalWrite(lampe, 0);}
//Serial.print("Right Stick X:");
//Serial.println(map(ch3, 1000,2000,-500,500));

//Serial.print("Right Stick Y:");
//Serial.println(map(ch2, 1000,2000,-500,500));

//Serial.println();

//delay(100);

//clearAndHome();


move = map(ch2, 1000,2000, -500, 500); //center over zero
move = constrain(move, -255, 255); //only pass values whose absolutes are
                                  //valid pwm values

/*What we're doing here is determining whether we want to move
forward or backward*/
if(move>0){digitalWrite(dir_a, 1);digitalWrite(dir_b, 1);};
if(move<0){digitalWrite(dir_a, 0);digitalWrite(dir_b, 0); move=abs(move);};

/*Here we're determining whether a left or a right turn is being
executed*/
turn = map(ch4,1023,1915,-500,500);
turn = constrain(turn, -255, 255);

/*This is where we do some mixing, by subtracting our "turn"
variable from the appropriate motor's speed we can execute
a turn in either direction*/
if(turn>0){analogWrite(pwm_b, move-turn); analogWrite(pwm_a, move);};
if(turn<0){turn=abs(turn); analogWrite(pwm_a, move-turn); analogWrite(pwm_b, move);};
         
Serial.print("move:"); //Serial debugging stuff
Serial.println(move);

Serial.print("turn:"); //Serial debugging stuff
Serial.println(turn);

Serial.print("move-turn:"); //Serial debugging stuff
Serial.println(move-turn);

Serial.println(); //Serial debugging stuff
Serial.println();
Serial.println();

}


Enfin voici mon souci:
Je viens de recevoir un "Châssis Skeleton 4WD Hercules" disponible à cette adresse:
http://www.gotronic.fr/art-chassis-skeleton-4wd-hercules-20641.htm

Je voudrais le commandé de la même façon que mon premier châssis, mais je n'arrive pas à trouvé sur le net une réponse,
quels serait le code à utilisé et comment connecter la carte Arduino à la carte de commande?

J'ai le code à utilisé avec se châssis pour le commander avec le module RFBee, je cherche en se moment même comment le modifier et l'adapter pour non pas le commander avec un module RFBee mais avec une radiocommande 2,4GHz.
(Je n'arrive pas à le postez car mon message dépasse les 9500 caractères si je le mets, mais au besoin je peu le postez dans un autre message.)

En tout cas je mets et pièces jointes une photo de la carte de commande et l'explication des connections.

Si jamais quelqu'un possède cette plateforme et la commande déjà par Arduino, son aide serait vraiment la bienvenue.
Sinon toute aide sera la bienvenue et bien sur si vous avez des questions n'hésitez surtout pas.

Merci de m'avoir lu et à très vite j'espère.

tellus75018

#1
Feb 26, 2014, 05:33 pm Last Edit: Feb 26, 2014, 08:47 pm by tellus75018 Reason: 1
( Je me répond à moi même suite à mes recherches mais vue que je ne suis pas sur des réponses trouvé je les postes pour que si elles contiennes des erreurs vous puissiez m'aidez à les résoudrez.)

Il me semble qu'en fait avec cette carte de commande il faille utilisé un "Support Grove Bee SLD71385P" pour permettre de communiqué entre la carte Arduino UNO et la carte de commande moteur par les PIN Bee de cette dernière.

Mais en fait je n'en suis pas sur du tout...

tellus75018

Re,
Suite à une demande auprès de Gotronic, qui m'a bien gentillement répondu, il semblerait qu'il soient plus simple de connecter directement mon récepteur 2,4Ghz à la carte de commande moteur qui possède un Bootloader Arduino.

Mais la je bloque sur la connection des deux, à quel Pin de la carte de commande moteur connecter le récepteur 2,4Ghz?

tellus75018

Maintenant j'y suis!

Après quelques recherches, j'ai donc fait comme on me la conseiller, j'ai retiré la carte Arduino UNO de "l'équation"^^

J'en suis maintenant à la compilation du code pour que la carte de commande des moteurs compatible avec bootloader Arduino fasse allé vers l'avant, l'arrière, à gauche et à droite à la réception des données Correspondantes du récepteur 2,4Ghz.

Voici le code que je suis en train de modifié, j'ai tenté de mixer celui du châssis Cherrokee et celui du châssis Hercules.
Code: [Select]
//MECHANICAPE.NL FIRMWARE FOR SEEEDSTUDIO HERCULES 4WD CONTROLLER
//Copyright By Rein Velt / http://mechanicape.nl       
//May be used under the terms and conditions of Create Commons CC-BY-SA
//=====================================================================

// pin ctrl
#define PINRX           0           // receive serial data
#define PINTX           1           // send serial data
#define PININT0         2           // interrupt 0
#define PININT1         3           // interrupt 1
#define PINCS           6           // all motors cs
#define PINM1F          4           // motor 1 forward
#define PINM1R          5           // motor 1 reverse
#define PINM2F          7           // motor 2 forward
#define PINM2R          8           // motor 2 reverse
#define PINPWMA         9           // PWM channel A (motor A speed)
#define PINPWMB         10          // PWM channel B (motor B speed)
#define PINVS           A6          // voltage/battery sensor
#define PIND12          D12
#define PIND11          D11
#define PIND13          D13

//global vars
volatile int leftFeedback = 0;
volatile int rightFeedback = 0;
int motorSpeed=0;

int ch2; // Here's where we'll keep our channel values
int ch3;
int ch6;

int move; // Forward/Back speed
int turn; // Turning Factor

void setup()
{
  //initialize pins (make them output)
  pinMode(PINCS, OUTPUT);
  pinMode(PINM1F, OUTPUT);
  pinMode(PINM1R, OUTPUT);
  pinMode(PINM2F, OUTPUT);
  pinMode(PINM2R, OUTPUT);
  pinMode(PINVS,  INPUT);
  pinMode(11, INPUT);
  pinMode(12, INPUT);
  pinMode(3, INPUT);
}
void loop()  {

  ch2 = pulseIn(11, HIGH, 25000); // Read the pulse width of 
  ch3 = pulseIn(12, HIGH, 25000); // each channel
  ch6 = pulseIn(3, HIGH, 25000);

move = map(ch3, 1000,2000, -500, 500); //center over zero
move = constrain(move, -255, 255); //only pass values whose absolutes are
                                   //valid pwm values

/*What we're doing here is determining whether we want to move
forward or backward*/
if(move>0){digitalWrite(PINM1F, 1);digitalWrite(PINM2F, 1);};
if(move<0){digitalWrite(PINM1F, 0);digitalWrite(PINM2F, 0); move=abs(move);};

/*Here we're determining whether a left or a right turn is being
executed*/
turn = map(ch2,1023,1915,-500,500);
turn = constrain(turn, -255, 255);

/*This is where we do some mixing, by subtracting our "turn"
variable from the appropriate motor's speed we can execute
a turn in either direction*/
if(turn>0){analogWrite(PINPWMA, move-turn); analogWrite(PINPWMB, move);};
if(turn<0){turn=abs(turn); analogWrite(PINPWMA, move-turn); analogWrite(PINPWMB, move);};
}

//**** MOTOR CONTROLLER *******************************************************************************

void motorSetSpeed(int power)
{
  motorSpeed=power;
  analogWrite(PINPWMA,motorSpeed);
  analogWrite(PINPWMB,motorSpeed);
}
void motorStop()
{
  digitalWrite(PINCS,LOW);
  digitalWrite(PINM1R,LOW);
  digitalWrite(PINM1F,LOW);
  digitalWrite(PINM2F,LOW);
  digitalWrite(PINM2R,LOW);
}
void motorForward()
{
  digitalWrite(PINM1R,HIGH);
  digitalWrite(PINM1F,LOW);
  digitalWrite(PINM2F,HIGH);
  digitalWrite(PINM2R,LOW);
  digitalWrite(PINCS,HIGH);
}
void motorReverse()
{
  digitalWrite(PINM1R,LOW);
  digitalWrite(PINM1F,HIGH);
  digitalWrite(PINM2F,LOW);
  digitalWrite(PINM2R,HIGH);
  digitalWrite(PINCS,HIGH);
}
void motorTurnLeft()
{
  digitalWrite(PINM1R,LOW);
  digitalWrite(PINM1F,HIGH);
  digitalWrite(PINM2F,HIGH);
  digitalWrite(PINM2R,LOW);
  digitalWrite(PINCS,HIGH);
}
void motorTurnRight()
{
  digitalWrite(PINM1R,HIGH);
  digitalWrite(PINM1F,LOW);
  digitalWrite(PINM2F,LOW);
  digitalWrite(PINM2R,HIGH);
  digitalWrite(PINCS,HIGH);

}



J'ai pas mal avancé, mais la je bute sur celui-çi, je n'arrive pas à faire en sorte que les signaux du récepteur 2,4Ghz soient compris et transmis comme il faut pour que les moteurs tourne...

Si vous pouviez m'aider, j'aime apprendre par moi même mais dans le cas présent je ne vraiment pas sur de se que je fait et j'aimerais ne pas cramé quoi que se soit ou faire trop de bêtises, même si c'est aussi comme sa que l'ont apprend n'est ce pas^^

Go Up