Problème gestion moteur Pas a Pas

Bonjour,
cela fait pas mal de temps que je travail sur un projet de tourelles motorisés pour camera,
je me suis donc fait une télécommande et deux tourelles avec moteurs PaP unipolaires.

Mais voila, j'ai eu beau tester des liaisons sans fil en 433Mhz, en Xbee et maintenant en 2.4GHz, la commande des moteurs avec différentes librairies, puis avec controleur pololu (et moteurs modifiés en bipolaire), le symptôme est toujours le même, les moteurs ne réagissent pas dutout comme il faut, ils sont lents et saccadés, mais avec un programme démo simple, ça fonctionne nickel.

Avez-vous deja eu le souci ?

// ianoo, camturret-base v14-05-16.

// Librairies
#include <RH_NRF24.h>
#include <SPI.h>
//#include <VirtualWire.h>
//#include <IRremote.h>
//IRsend irsend;

// Constantes
const int adresse = 1; //configurer ici le N° de tourelle de 1 a 4

const int tiltdirpin = 2;
// la pin pour la LED IR est forcément la 3
const int pandirpin = 4;
const int tiltsteppin = 5;
const int pansteppin = 7;
const int disable = 8;


// Variables
int idcam;
int zoom;
int dezoom;
int senstilt;
int speedtilt;
int senspan;
int speedpan;
int pertilt;
int perpan;
unsigned long previousTiltMillis = 0;
unsigned long previousPanMillis = 0;
unsigned long previousRadioMillis = 0;
int tiltstepstate;
int panstepstate;


// Instance pilote Radio
RH_NRF24 nrf24(9, 10);

// Predefine the message buffer here: Don't put this on the stack:
uint8_t buf[RH_NRF24_MAX_MESSAGE_LEN];    // Actually: 28 bytes (32 minus 4 byte header)

void setup() {
  Serial.begin(57600);
  Serial.println("Run");
  if (!nrf24.init())
    Serial.println("init failed");
  // Defaults after init are 2.402 GHz (channel 2), 2Mbps, 0dBm
  if (!nrf24.setChannel(1))
    Serial.println("setChannel failed");
  if (!nrf24.setRF(RH_NRF24::DataRate2Mbps, RH_NRF24::TransmitPower0dBm))
    Serial.println("setRF failed");

  // config I/O
  pinMode(tiltdirpin, OUTPUT);
  pinMode(pandirpin, OUTPUT);
  pinMode(tiltsteppin, OUTPUT);
  pinMode(pansteppin, OUTPUT);
  pinMode(disable, OUTPUT);
}

void loop() {
  unsigned long currentMillis = micros();
  uint8_t buf[RH_NRF24_MAX_MESSAGE_LEN];
  uint8_t len = sizeof(buf);

 // if ( curentMillis - previousRadioMillis > 1000) {
 //   previousRadioMillis = currentMillis;

    //if (nrf24.waitAvailableTimeout(100)){
    if (nrf24.recv(buf, &len))
    {

      idcam = buf[1];
      zoom = buf[2];
      dezoom = buf[3];
      senstilt = buf[4];
      speedtilt = buf[5];
      senspan = buf[6];
      speedpan = buf[7];

    }
 // }
  // Si les donnees séries sont bien adressées a cette tourelle
  if (idcam == adresse) {

    // Gestion du moteur haut/bas
    if (speedtilt > 10) {
      digitalWrite(disable, LOW);
      if (senstilt == 1) {
        digitalWrite(tiltdirpin, HIGH);
      }
      else {
        digitalWrite(tiltdirpin, LOW);
      }
      // commande impulsions non bloquantes
      pertilt = map (speedtilt, 10, 255, 2000, 100);
      if ((currentMillis - previousTiltMillis) > pertilt)
      {
        previousTiltMillis = currentMillis;
        if (tiltstepstate == LOW) {
          tiltstepstate = HIGH;
        }
        else {
          tiltstepstate = LOW;
        }
        digitalWrite(tiltsteppin, tiltstepstate);
      }
    }

    // Gestion du moteur gauche/droite
    if (speedpan > 10) {
      digitalWrite(disable, LOW);
      if (senspan == 1) {
        digitalWrite(pandirpin, HIGH);
      }
      else {
        digitalWrite(pandirpin, LOW);
      }
      // commande impulsions non bloquantes
      perpan = map (speedpan, 10, 255, 2000, 100);
      if (currentMillis - previousPanMillis > perpan)
      {
        previousPanMillis = currentMillis;
        if (panstepstate == LOW) {
          panstepstate = HIGH;
        }
        else {
          panstepstate = LOW;
        }
        digitalWrite(pansteppin, panstepstate);
      }
    }
    //On desactive les moteurs si inutilises pour eviter la chauffe
    //if ((speedpan && speedtilt) < 10) {
    //    digitalWrite(disable, HIGH);
    //  }

    // Gestion du zoom
    /*     if (zoom == 1) {
      //for (int i = 0; i < 3; i++) {
      irsend.sendNEC(0xC1C738C7, 32); // zoom (28)
      delay(40);
      //}
      }
      if (dezoom == 1) {
      //  for (int i = 0; i < 3; i++) {
      irsend.sendNEC(0xC1C7B847, 32); // dezoom (29)
      delay(40);
      //  }
      }
    */
  }
  // Données pour le moniteur série
  Serial.print(idcam);
  Serial.print(" ");
  Serial.print(zoom);
  Serial.print(" ");
  Serial.print(dezoom);
  Serial.print(" ");
  Serial.print(senstilt);
  Serial.print(" ");
  Serial.print(speedtilt);
  Serial.print(" ");
  Serial.print(senspan);
  Serial.print(" ");
  Serial.print(speedpan);
  Serial.print(" ");
  Serial.print(pertilt);
  Serial.print(" ");
  Serial.println(perpan);
  Serial.print(" ");
  Serial.print(currentMillis);
  Serial.print(" ");
  Serial.println(previousPanMillis);
}

ianoo76:
ils sont lents et saccadés, mais avec un programme démo simple, ça fonctionne nickel.

Avez-vous deja eu le souci ?

Avec le programme de démo, tes moteurs sont en place ou ils tournent à "blanc"

Non, ils fonctionnent dans les mêmes conditions, a vide dans le sens ou la tourelle n'a pas de charge.

C'est vraiment comme si avec le programme complet l'arduino était dix fois plus lent, c'est pourquoi j'ai abandonné les délais au profit des micros() mais ça n'a rien amélioré.

Je me permet un petit UP,

il y a t'il un truc que je gère mal dans la com sans fil ?

j'ai vraiment fait le tour de la question, mais c'est clairement un problème qui me dépasse,
peu importe le type de moteur, de librairie ou de liaison sans fil, c'est toujours la même, l'arduino est VRAIMENT plus lent avec une connexion sans fil, j'imagine que le souci vient de là mais je ne comprend pas pourquoi.

J'utilise la librairie radiohead,
je vais réessayer avec la RF24, je la trouve plus difficile à comprendre mais si ça peut résoudre mon souci...