Go Down

Topic: compatibilité de librairie (Read 1 time) previous topic - next topic

fixair

Hello,
pour des raisons d'architecture et de perf, je souhaite pour utiliser la librairie Wire et la SwitechX25 sur une même carte (nano) qui reçoit ses infos d'une UNO via I2C, d'ou la Wire. Ou j'ai rien compris (fort probale) ou il y a une incompatibilité entre Wire et SwitechX25. Qui aurait une idée s'il vous plait. Merci d'avance pour votre aide.
Cordialement FX
Cordialement
@+ FX ;op

bilbo83

Bonjour, j'ai relus quatre fois ton message et moi non plus j'ai rien compris.

fixair

#2
Apr 21, 2016, 02:09 pm Last Edit: Apr 21, 2016, 02:17 pm by fixair
Hello,
aller je tache d'être plus clair.

mon petit montage est constitué de deux cartes :
 - une UNO
 - une NANO

La carte UNO est master, c'est elle qui fournit les data à la carte NANO.

La carte NANO a pour mission de faire bouger un moteur x27.168 avec la librairie "switecx25".

La UNO communique avec la NANO via le protocole I2C, donc utilisation de la librairie "Wire".

Mon soucis, je pense qu'il y a "divergence d'intérêt entre les deux librairies (mais je n'en suit pas sur), est ce que je me trompe ou pas, quelqu'un a t il deja réaliser ce type de montage ?

C'est plus clair comme ça ?  ;op

merci pour votre aide

Cordialement
@+ FX ;op

JLuc

Pourquoi vouloir utiliser 2 librairies différente pour un même modèle de processeur?
Quel est l'intêret???
Ou moi non plus j'ai rien compris.
@+ JLuc

fixair

Merci encore pour l'attention que vous portez à ma demande, ensuite mille pardon pour la mauvaise orthographe des noms de librairie. Il s'agit bien de la SwitecX25.
Pour ce qui est des erreurs de codage, oui il y en a certainement, et pour ce qui concerne le choix de deux librairies sur sur le même processeur, j'explique mon projet : je suis en train de faire d'une Alouette 2 réformée, un simulateur autour de FSX et Prepar3D. Voici un lien ou l'on trouve la genèse de la bête : www.fixair.org et www.fixair.org/318 il faut fureter ...

L'idée, c'est de refaire vivre des instrument réels avec FSX ou autre et d'être "dans le joystick" et nond'avoir un joystick sur la table.

J'ai a ce jour une UNO qui anime des servos et un afficheur LCD I2C (qui remplace les gauges que je n'ai pas pour le moment) . Mon souhait est d'intégrer a chaque gauge une NANO pour faire vivre un moteur switec, qui récupère ses infos via le bus I2C récupérées par la UNO qui alimente une partie, et donner des consignes a l'extérieur pour d'autres instrument. Un avantage non négligeable est que je peux ajouter des gauges "I2C" au fur et a mesure de l'avancée des travaux, c'est modulaire.

Afin d'apprendre, j'ai une NANO maitre avec le sketch master-writer et une avec un mix de slave-receiver et X25switec.
Je suis sur que ca peu marcher, mais je ne vois pas ou je me plante, alors je vais retravailler sur le sketch slave et vous tiens informé . J'espère que c'est un poil plus clair pour vous.


A titre d'infos, mes données sortent de FSX via une DLL dans petit soft qui fait l'interface avec la UNO. La UNO reçoit une trame du type : "I123;A-20;F500; ect

Cordialement
FX

Cordialement
@+ FX ;op

JLuc

#5
Apr 21, 2016, 05:16 pm Last Edit: Apr 21, 2016, 05:19 pm by JLuc
Projet très intéressant à priori... Bon courage car la tache n'est pas mince, mais je pense que le résultat sera des plus beau.
Alors je le redis, pourquoi vouloir utiliser diverses librairies avec un même processeur, je ne sais pas ce que vaut la librairie Switec X25 car je ne l'ai jamais utilisée mais si elle est si bien pourquoi ne pas tout faire avec ?
La compatibilité n'en sera que meilleur, non ?
Dans l'état actuel, ne connaissant pas ton code, c'est difficile de savoir si une erreur s'est glissée.
Dans le principe, il faut que les esclaves aient une adresse unique, ensuite le maitre dialogue en utilisant ces adresses donc en ciblant l'objet qui est en esclave.
@+ JLuc

JLuc

oops! Désolé je n'avais pas compris.
Alors le problème c'est quoi ? Si ce sont tes modules qui ne communiquent pas, sans code c'est difficile de t'aider.
@+ JLuc

fixair

#7
Apr 21, 2016, 05:31 pm Last Edit: Apr 21, 2016, 05:39 pm by fixair
Quote
Ici, X25 ne semble rien n'avoir à voir avec le protocole de communication bien connu.
je suis d'accord.


Voici le coté Slave,

Quote
#include <Wire.h>
#include <SwitecX25.h>
// standard X25.168 range 315 degrees at 1/3 degree steps
#define STEPS (315*3)
// For motors connected to pins 3,4,5,6
SwitecX25 motor1(STEPS,4,5,6,7);

void setup(void)
{

    Wire.begin(8);                // join i2c bus with address #8
  Wire.onReceive(receiveEvent); // register event
  // run the motor against the stops
  motor1.zero();
  // start moving towards the center of the range
  motor1.setPosition(STEPS/2);motor1.update();
  Serial.begin(9600);
}

void loop() {
  //delay(20);
}

void receiveEvent(int howMany) {
  static int nextPos = 0;
  // the motor only moves when you call update
  motor1.update();
 
  if (Wire.available()) {
    int c = Wire.read();
    //  int x = Wire.read();    // receive byte as an integer
  Serial.println(c);
    if (c==10 || c==13) {
      motor1.setPosition(map( nextPos,0,250, 0, STEPS ));
      nextPos = 0;
    } else if (c>='0' && c<='9') {
      nextPos = 10*nextPos + (c-'0');
    }
  }
}
et le coté Master,

Quote
#include <Wire.h>
// #define STEPS (315*3)

int x = 0;
void setup() {
  Wire.begin(); // join i2c bus (address optional for master)
  Serial.begin(9600);
  /*
  Serial.print("Enter a step position from 0 through ");
  Serial.print(STEPS-1);
  Serial.println(".");  */
}

void loop() {
  Wire.beginTransmission(8); // transmit to device #8
 // Wire.write(Serial);        // sends five bytes
  Wire.write(x);              // sends one byte
  Wire.endTransmission();    // stop transmitting

  x++;if (x > 800){ x = 0 ;}
  delay(50);
}
il faut que j'arrive a faire bouger mon moteur en fonction de ce qui vient du Master.

Merci encore pour votre aide
Cordialement
@+ FX ;op

JLuc

Mais tu n'as déclaré aucune adresse, comment veux tu que le maitre parle à l'esclave!!!

Par exemple pour l'esclave :
Code: [Select]

#define I2C_DEVICE_ADDRESS 0x09      // Adresse I2C pour ce module
#define START_OF_DATA 0x10             // data markers (début de chaine d'envoi)
#define END_OF_DATA 0x20                // data markers (Fin de chaine d'envoi)

void setup() {
   Wire.begin(I2C_DEVICE_ADDRESS);    // Ouverture du bus I2C en esclave
  Wire.onReceive(receiveEvent);           // Défini la fonction de réception des données du maître
}

void loop() {
  if (Wire.available() > 0) {                  // Tu peux intercepter au niveau du loop ou dans receiveEvent
    .....
  }
}

void receiveEvent(int numBytes) {
  // Ton code ici
}


Pour le maitre :
Code: [Select]

#define START_OF_DATA 0x10              // Data markers
#define END_OF_DATA 0x20                // Data markers
#define DEB_I2C_ADDR 0x09               // Adresse du premier Module
#define NBR_I2C_ADDR 0x05               // Nombre de module

// Envoi des données via I2C vers les modules
void Envoi(byte addr, byte color, byte* disp_data) { 
  Wire.beginTransmission(addr);
  Wire.write(START_OF_DATA);
  Wire.write(toto);
  Wire.write(disp_data, 64);                 // En fonction de la taille (attention c'est limité)
  Wire.write(END_OF_DATA);
  Wire.endTransmission();
}



Dans la fonction d'envoi tu peux te passer du start et du stop data car géré par le protocole, mais ça peut servir dans le cas d'un protocole qui t'ai propre, j'ai là donné des exemples possible pas un code.
@+ JLuc

fixair

si si j'ai déclaré une adresse, regardes il y a un smilé que la "quote" a interprété bizarement : 8 en plus c'est commenté  .  ;op
je regardes de près ce que tu viens d'écrire et te dis quoi.
Cordialement
@+ FX ;op

fixair

ca c'est une partie de ce qui tourne et que je cherche transformer :
Quote
#include <SwitecX25.h>
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
//#include <AccelStepper.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20,16,2);

#define STEPS (315*3)
SwitecX25 vsiS(STEPS, 4,5,6,7);

boolean moins1;
int data1;
byte j1, j2;

// Utilisation de l'adresse par défaut 0x40 du Breakout.
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver( 0x40 );


// Suivant le type de servo utilisé, la largeur d'impulsion minimale et Maximale
// peut changer. L'idéal est de sélectionner des valeurs aussi petites et aussi
// grande que possible sans jamais atteindre la butée de blocage du servo-moteur.
// Vous aurrez peut-etre besoin de modifier ces valeurs pour les faire correspondrent
// à votre type de servo!
#define SERVOMIN  150 // La longueur d'impulsion 'minimale' (valeur du compteur, max 4096)
#define SERVOMAX  600 // La longueur d'impulsion 'maximale' (valeur du compteur, max 4096)

//AccelStepper vario(1,5,6);

// Servos Commandés - Numéro de sorties sur le breakout
uint8_t LED_Fuel = 0; //   LED Fuel gauge
uint8_t carb   = 1; // Fuel gauge
uint8_t Pcol   = 2; // Pas général
uint8_t pitch  = 3; // Tangage
uint8_t roll   = 4; // Roulis
uint8_t volt   = 5; // Voltmeter
uint8_t ias    = 6; // IAS

String vertsp, vertspold="",iassp,iasold="";
String carbsp,carbold="",voltsp,voltold="";
String pgsp,pgold="";
String Pitchsp, Pitchold="",Rollsp, Rollold="";
int nA,nB,nI,nR,nP,nV;
int Vert_A, Vert_P=0, jZ=0;



void setup() {
  /*
  vario.setPinsInverted(true,false,false);
  vario.setMaxSpeed(1000);
  vario.setAcceleration(200);
  digitalWrite(enablePin, HIGH);
  */
  vsiS.setPosition(0);
  vsiS.setPosition(944);
  vsiS.updateBlocking();
  delay (500);
  vsiS.setPosition(STEPS/2);  //0MPH
  vsiS.updateBlocking();

   //   delay(1000);   
     
  //    clear_dd();
    //  initi_lcd();
   //   off1();
     
     
 
  Serial.begin(115200);
}

void loop()
{
       while(Serial.available() > 0){
     int  j1 = Serial.read();

       if (j1 == 'Z') Vario();       
        }
}



void Vario(){
       //   delay (2); //digitalWrite(enablePin, LOW);         
          vertsp = "";
          vertsp += (char)Serial.read();
          vertsp += (char)Serial.read();
          vertsp += (char)Serial.read();
          vertsp += (char)Serial.read();
          vertsp += (char)Serial.read();
          vertsp += (char)Serial.read();
          vertsp += (char)Serial.read();   
          if (vertsp != vertspold){         
          char carrayV[7];
       //   delay(2);
          vertsp.toCharArray(carrayV, sizeof(carrayV));       
          jZ = atoi(carrayV); // Serial.println(carrayV);
          vsiS.setPosition(map( jZ,-3000,3000, 0, STEPS ));
          vsiS.update();
         
          vertsp = vertspold; 
         // delay (11);// pas touch
                                    }
          }
Cordialement
@+ FX ;op

JLuc

J'ai du mal à me projeter dans ton code (peut-être trop incomplet), mais juste une suggestion, pourquoi ne pas essayer, avant d'aller plus avant, de faire converser esclave et maitre donc juste utiliser le wire et quand ça marche, ajouter le reste ensuite, ce sera plus facile comme ça. Moi quand ça coince, c'est ma méthode, comme ça je cerne plus facilement les erreurs et n'en ajoute pas qui pourrait géner.
De plus évite les uint8_t etc.. préfères les byte et int etc... Ce n'est pas ce qui coince ici, mais c'est moins obsolète en arduino.
@+ JLuc
@+ JLuc

fixair

Je suis d'accord sur ta méthode, c'est ce je je tente de faire, j'ai fait causer entre elles les deux cartes avec les exemples de l'IDE, ca ca marche, maintenant j'essaie d'ajouter le moteur, et c'est la que le bas blesse, le moteur ne fait  pas ce que j'attends de lui. Si seulement dans un premier temps j'arrivais a mixer le slve-receiver et le moteur en faisant juste un va et vient ca serait un bon point de départ pour revoir la vielle techno ;op
Cordialement
@+ FX ;op

fdufnews

Ton code n'apparait pas correctement parce que tu l'as placé entre des balises quote. Il faut utiliser les balises code l'icone </> à gauche dans la barre d'icones.

fixair

Ah cool merci pour l'info. Bon j'ai bataillé mais ca cause :

Code: [Select]

//  IAS 250 Max
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SwitecX25.h>
#define STEPS (315*3)
SwitecX25 iasS(STEPS,4,5,6,7);

void setup(void)
{
   Wire.begin(0x80);                // join i2c bus with address #8
   Wire.onReceive(receiveEvent); // register event
  // run the motor against the stops
  iasS.zero();
  // start moving towards the center of the range
  //iasS.setPosition(STEPS/2);
  iasS.setPosition(STEPS)
  iasS.update();
  delay(100);
  iasS.setPosition(0);
  iasS.update(); 
  delay(100);
  Serial.begin(9600);
}

void loop() {
  iasS.update();
}

void receiveEvent(int numBytes) {
   iasS.update();

  if (Wire.available() > 0) {   
    int c = Wire.read();
 //   Serial.println(c); debug
    iasS.setPosition(map( c,0,250, 0, STEPS ));     
}
}


la je me bagarre avec un mappage  :
Code: [Select]
vsiS.setPosition(map( c,-3000,3000, 0, STEPS ));
j'ai l'impression qu'il ne veut pas le faire, peut être faut il l'amortir.
Bref bonne soirée, la suite très vite.
Encore grand merci pour votre aide ;op
Cordialement
@+ FX ;op

Go Up