Problème communication arduino nano et pelco D pour caméra PTZ

Bonjour tout le monde!

Voila je me permet d'ouvrir ce topic car j'ai un petit problème qui m'as fait perdre des touffes de cheveux.. voici mon problème:

Je suis sur un projet perso, j'ai acheté cette caméra.

Pour la motoriser à l'aide de servomoteurs AX12A de dynamixel (pour éviter les tremblements de jeu d'axe des servos pas chers et avoir ainsi un rendu propre).

Pour la communication, j'ai acheté un module RS485 vers TTL :
La voici

j'ai pu récupérer et légèrement modifier un code qui fonctionne très bien, et donc j'ai réussi ma première version à l'aide d'une carte UNO R3 et d'un "smart servo shield" de DFrobot.

/*connections :  
 * module rs485 :
 *          -TXD (out module) sur RX carte
 *          _relier gnd cam au gnd IN module
 * 
 * 
 * 
 */
/*-----( Import needed libraries )-----*/
#include <SPI.h>
#include <ServoCds55.h>


/*-----( Declare Constants and Pin Numbers )-----*/
#define ID_Pan 1
#define ID_Tilt 2
#define RS485lTxControl 4   //RS485 Direction control 
#define RS485Transmit    HIGH   // not needed here, the servos attached to the arduino will not transmit any data to the Pelco-D controller  
#define RS485Receive     LOW
#define Pin13LED         13

/*-----( Declare objects )-----*/
ServoCds55 myservo;
/*-----( Declare Variables )-----*/
byte byteReceived[7];
int byteNumber = 0;
int byteSend;
int minPulse1     =  100;   // minimum servo position
int maxPulse1     =  212; // maximum servo position
int turnRate1     =  1;  // servo turn rate increment (larger value, faster rate)
int minPulse2     =  138;  // minimum servo position
int maxPulse2     =  178; // maximum servo position
int turnRate2     =  1;  // servo turn rate increment (larger value, faster rate)
/** The Arduino will calculate these values for you **/
int centerservoPAN;
int centerservoTILT;
int pulseWidth1;          // servo pulse width
int pulseWidth2;          // servo pulse width


void setup() {
  Serial.begin (9600);
  myservo.begin ();
  myservo.setVelocity(50);
  centerservoPAN = maxPulse1 - ((maxPulse1 - minPulse1)/2);
  centerservoTILT = maxPulse2 - ((maxPulse2 - minPulse2)/2);
  pulseWidth1 =  centerservoPAN;
  pulseWidth2 =  centerservoTILT;
  Serial.println("Arduino Serial Servo Control with Pelco D");
  Serial.println();
  
  pinMode(Pin13LED, OUTPUT);   
  pinMode(RS485lTxControl, OUTPUT);    
  digitalWrite(RS485lTxControl, RS485Receive);  // Init Transceiver   
  delay(10000);
  Serial.println("initialisation des moteurs");
  myservo.WritePos(ID_Pan,pulseWidth1);
  myservo.WritePos(ID_Tilt,pulseWidth2);
  Serial.println("ready");
}//--(end setup )---


void loop() {
//  if (!Serial.available())Serial.println("pas de co");
  if (Serial.available() > 0)  //Look for incoming serial data from Pelco-D controller
   {
    
    byteReceived[byteNumber ++] = Serial.read();    // Read received byte
    //Serial.println(byteReceived[byteNumber], DEC);        // Show on Serial Monitor
    delay(10);
    if ( byteReceived[0] != 0xFF ) {byteNumber = 0;}   // When Byte 0 isn't 0xFF (Pelco 1st Byte) reset byteNumber to 0 preventing the serial port being blocked.
   }
    if ( byteNumber > 6 )                                 // process it
    {                 
      byteNumber = 0;                                 // ready for next time
      byte data = byteReceived[3];       // read the incoming byte:
      Serial.println(data, HEX);        // Show on Serial Monitor
      switch(data)
        {
          case 0x00 :  break;
          case 0x02 :  pulseWidth1 = pulseWidth1 - turnRate1; myservo.WritePos(ID_Pan,pulseWidth1); break; // right
          case 0x04 :  pulseWidth1 = pulseWidth1 + turnRate1; myservo.WritePos(ID_Pan,pulseWidth1); break; // left   
          case 0x10 :  pulseWidth2 = pulseWidth2 - turnRate1; myservo.WritePos(ID_Tilt,pulseWidth2); break; // down
          case 0x08 :  pulseWidth2 = pulseWidth2 + turnRate1; myservo.WritePos(ID_Tilt,pulseWidth2); break; // up
          case 0x14 :  pulseWidth1 = pulseWidth1 + turnRate1; myservo.WritePos(ID_Pan,pulseWidth1); pulseWidth2 = pulseWidth2 - turnRate1; myservo.WritePos(ID_Tilt,pulseWidth2); break; // left-up
          case 0x12 :  pulseWidth1 = pulseWidth1 - turnRate1; myservo.WritePos(ID_Pan,pulseWidth1); pulseWidth2 = pulseWidth2 - turnRate1; myservo.WritePos(ID_Tilt,pulseWidth2); break; // right-up
          case 0x0C :  pulseWidth1 = pulseWidth1 + turnRate1; myservo.WritePos(ID_Pan,pulseWidth1); pulseWidth2 = pulseWidth2 + turnRate1; myservo.WritePos(ID_Tilt,pulseWidth2); break; // left-down
          case 0x0A :  pulseWidth1 = pulseWidth1 - turnRate1; myservo.WritePos(ID_Pan,pulseWidth1); pulseWidth2 = pulseWidth2 + turnRate1; myservo.WritePos(ID_Tilt,pulseWidth2); break; // right-down
        }
        
        // stop servo pulse at min and max
        if (pulseWidth1 > maxPulse1) { pulseWidth1 = maxPulse1; }
        if (pulseWidth1 < minPulse1) { pulseWidth1 = minPulse1; }
        // stop servo pulse at min and max
        if (pulseWidth2 > maxPulse2) { pulseWidth2 = maxPulse2; }
        if (pulseWidth2 < minPulse2) { pulseWidth2 = minPulse2; }
       
    // print pulseWidth back to the Serial Monitor (uncomment to debug)
    Serial.println("Servo 1: ");
    Serial.println(pulseWidth1);
    Serial.println(" Servo 2: ");
    Serial.println(pulseWidth2);
    Serial.println("degrees");
   }
}

Mais bon, mon bloc avec la carte arduino et son shield étant beaucoup trop gros à mes yeux, je voudrais donc passer par une carte Nano V3.0.

J'ai changé de librairie pour pouvoir commander mes servos sans shield.

j'ai donc refait mes branchements avec la nano, rajouté un petit transformateur 12->5V pour son alim et tout mis sous tension.Tout est à sa tension nominale, Mais ça ne fonctionne pas.
J'ai bien la led TXD du module et TX de la carte qui clignotent au même rythme que les ordres que j'envoie depuis mon retour caméra (sur un autre PC), donc je reçois quelque chose.

Mais quand je print ma chaine sur le moniteur série, je me rends compte que je ne reçois que des chaines vide
(0000000)

ce qui me perturbe est que ça fonctionne super bien avec la UNO R3 avec ou sans shield...

et je n'ai pas trouvé de sujets similaires a part ceux qui m'ont aidé à faire ma V1.

Auriez vous des conseils à me donner ?

Merci d'avance pour votre temps.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.