bonjours a tous, je viens de m'inscrire sur ce forum parce que bien évidement j'ai un problème qui me casse la tête depuis un bon moment , et là j'ai vraiment besoin d'aide avant de devenir tarré!! donc voila j'ai construit un ptit robot qui fonctionne sur une mega 2600, deux petit step motor genre nema 14 conduit par des easydriver sparkfun et un petit moteur DC, le tout piloté par une télécommande avec 2 joysticks. 1 pour les steps, un moteur dans l'axe X et un autre sur Y, le deuxième pour le petit DC. La communication avec des nfr24L01 et ca marchait très très bien dans le meilleurs des mondes. le problème et survenue quand j'ai ajouté a mon robot un compas pour avoir son azimute et potentiomètre pour avoir le degré d’élévation de son bras, je voulait que les valeurs s'affiche sur ma télécommande via un lcd donc communication bidirectionnel: la télécommande envoie les valeurs de joystick et reçois les valeurs du compas et du potar et l'inverse sur le robot. la communication se fait mais les deux step moteur réponde presque plus genre un pas toute les 2 secondes et j'arrive pas a comprendre ou j'ai merdé donc je vous joint lecode qui fait des truc d'un autre monde, si quelqu'un a une idée de ce qui m'arrive je suis preneur, merci d'avance.
les code qui partent en cacahuète!
télécommande:
//bibliotheque telecommande
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
//bibli LCD
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
//tableau de valeurs pour joystick, compas, potar
int valeurs [5];
void setup() {
lcd.begin(16, 2);
Mirf.cePin = 9;
Mirf.csnPin = 10;
Mirf.spi = &MirfHardwareSpi;
Mirf.init();
Mirf.channel = 1;
Mirf.payload = sizeof(valeurs);
Mirf.config();
Mirf.setRADDR((byte *)"clie1");
}
void loop() {
//j'envoie les valeurs des joystick
valeurs [0] = analogRead(A0);
valeurs [1] = analogRead(A1);
valeurs [2] = analogRead(A2);
Mirf.setTADDR((byte *)"serv1");
Mirf.send((byte *) &valeurs);
while (Mirf.isSending());
//je recois les valeurs du compas et du potar
while (!Mirf.dataReady()) {}
Mirf.getData((byte *) &valeurs);
float heading = valeurs [3];
float potDeg = valeurs [4] * (360.0 / 1023.0);
//affichage sur lcd de l'azimut et des valeurs du potar converties en degré
if ((heading >= 355) or (heading <= 18))
{ lcd.setCursor(1, 0);
lcd.print (heading);
lcd.setCursor(6, 0);
lcd.print (" D Nord ");
}
if ((heading >= 19) and (heading <= 79))
{ lcd.setCursor(1, 0);
lcd.print (heading);
lcd.setCursor(6, 0);
lcd.print (" D Nord-E");
}
if ((heading >= 80) and (heading <= 105))
{ lcd.setCursor(1, 0);
lcd.print (heading);
lcd.setCursor(6, 0);
lcd.print(" D Est");
}
if ((heading >= 106) and (heading <= 170))
{ lcd.setCursor(1, 0);
lcd.print (heading);
lcd.setCursor(6, 0);
lcd.print ( " D Sud-E");
}
if ((heading >= 171) and (heading <= 200))
{ lcd.setCursor(1, 0);
lcd.print (heading);
lcd.setCursor(6, 0);
lcd.print (" D Sud");
}
if ((heading >= 201) and (heading <= 255))
{ lcd.setCursor(1, 0);
lcd.print (heading);
lcd.setCursor(6, 0);
lcd.print (" D Sud-O");
}
if ((heading >= 256) and (heading <= 280))
{ lcd.setCursor(1, 0);
lcd.print (heading);
lcd.setCursor(6, 0);
lcd.print (" D Ouest");
}
if ((heading >= 281) and (heading <= 354))
{ lcd.setCursor(1, 0);
lcd.print (heading);
lcd.setCursor(6, 0);
lcd.print (" D Nord-O");
}
lcd.setCursor(2, 1);
lcd.print (potDeg);
lcd.setCursor(9, 1);
lcd.print ("Degre");
}
le robot:
// bibliotheque telecomande
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
// bibli pour le compas
#include <Arduino.h>
#include <Wire.h>
#include <HMC5883L_Simple.h>
// easydriver step_moteur X
#define step_pinX 5
#define dir_pinX 4
#define MS1X 6
#define SLEEPY 7
// easydriver step_moteur Y
#define step_pinY 16
#define dir_pinY 17
#define MS1Y 15
#define SLEEPY 14
//moteur DC
#define ENABLE 10
#define DIRA 8
#define DIRB 9
// limite butoir
#define Limit01 18
#define Limit02 19
// objet compas
HMC5883L_Simple Compass;
int valeurs [5];
int step_speedX =10 ; // vitesse: plus le chiffre est haut moins ca va vite
int step_speedY =1;
void setup() {
//step moteur axe X
pinMode(MS1X, OUTPUT);
pinMode(dir_pinX, OUTPUT);
pinMode(step_pinX, OUTPUT);
pinMode(SLEEPY, OUTPUT);
//step moteur axe Y
pinMode(MS1Y, OUTPUT);
pinMode(dir_pinY, OUTPUT);
pinMode(step_pinY, OUTPUT);
pinMode(SLEEPY, OUTPUT);
// DC moteur mise au point
pinMode(ENABLE, OUTPUT);
pinMode(DIRA, OUTPUT);
pinMode(DIRB, OUTPUT);
// limite de course pour axe X
pinMode(Limit01, INPUT);
pinMode(Limit02, INPUT);
digitalWrite(SLEEPX, HIGH); // reveil EasyDriverX
delay(5); // le temps de le reveiller*/
digitalWrite(SLEEPY, HIGH); // reveil EasyDriverY
delay(5); // le temps de le reveiller
digitalWrite(MS1X, LOW);
// Configuré en Full Steps
digitalWrite(MS1Y, LOW); // Configuré en Full Steps
//telecomande
Mirf.cePin = 48; //pin CE
Mirf.csnPin = 49; //pin CSN
Mirf.spi = &MirfHardwareSpi;
Mirf.init();
Mirf.setRADDR((byte *)"serv1");
Mirf.payload = sizeof(valeurs);
Mirf.config();
//compas
Wire.begin();
Compass.SetDeclination(15, 00, 'E');
Compass.SetSamplingMode(COMPASS_SINGLE);
Compass.SetScale(COMPASS_SCALE_130);
Compass.SetOrientation(COMPASS_HORIZONTAL_Y_NORTH);
}
void loop() {
// j'envois les valeurs du compas et du potar
valeurs [3] = Compass.GetHeadingDegrees();
valeurs [4] = analogRead(A3);
Mirf.setTADDR((byte *)"clie1");
Mirf.send((byte *) &valeurs);
while (Mirf.isSending());
// je recois les valeurs des deux joysticks
while (!Mirf.dataReady()) {}
Mirf.getData((byte *) &valeurs);
int joystick1X = valeurs [0];
int joystick1Y = valeurs [1];
int joystick2X = valeurs [2];
if ( joystick1X > 712) { // joystick n° 1 sur axe X
if (!digitalRead(Limit02)) {}
else {
digitalWrite(dir_pinX, LOW); // en avant (HIGH = arrière / LOW = avant)
digitalWrite(step_pinX, HIGH);
delay(1);
digitalWrite(step_pinX, LOW);
delay(1);
}
}
if ( joystick1X < 312) {
if (!digitalRead(Limit01)) {}
else {
digitalWrite(dir_pinX, HIGH);// en arrière
digitalWrite(step_pinX, HIGH);
delay(1);
digitalWrite(step_pinX, LOW);
delay(1);
}
}
if ( joystick1Y > 712)//joystick n°1 sur axe Y en avant
{
digitalWrite(dir_pinY, LOW);
digitalWrite(step_pinY, HIGH);
delay(1);
digitalWrite(step_pinY, LOW);
delay(1);
}
if ( joystick1Y < 312)// en arrière
{
digitalWrite(dir_pinY, HIGH);
digitalWrite(step_pinY, HIGH);
delay(1);
digitalWrite(step_pinY, LOW);
delay(1);
}
if ( joystick2X < 312) //joystick n° 2 sur axe X
{
Motor3Avant(255);
}
else if (joystick2X > 712 )
{
Motor3Arriere (255);
}
else
{
Motor3Stop();
}
}
void Motor3Avant ( byte Spd)
{
digitalWrite(DIRA, HIGH);
digitalWrite(DIRB, LOW);
analogWrite(ENABLE, Spd);
}
void Motor3Arriere( byte Spd)
{
digitalWrite(DIRA, LOW);
digitalWrite(DIRB, HIGH);
analogWrite(ENABLE, Spd);
}
void Motor3Stop()
{
digitalWrite(DIRA, LOW);
digitalWrite(DIRB, LOW);
}