au bord du suicide !!!

Bonsoir,
j'ai un soucis avec la bibliothèque virtualwire et wire quand elle sont dans le meme sketch. J'imagine bien que le problème vien de moi je vous rassure (d'ou mon idée de suicide lol ).
en fait, (non je ne me suiciderais pas !!!) quand j'utilise "endTransmission()" de Wire, la connection serie(serial monitor) plante et la led TX sur ma carte (nano) ne s'allume plus a la reception de mon module RF.
indépendamment tout fonctionne bien.
une idée du problème ?

Bonjour,

Le code complet et un petit schéma du montage serait pas mal :wink:
Ça sent le problème de câblage.

Je crois qu'il revient pas... il s'est suic******? :grin:

john_lenfr:
Je crois qu'il revient pas... il s'est suic******? :grin:

Il a du ce pendre au bout d'un Wire :grin:

Au bout du wire... :slight_smile: <-- pas mal !!!
bon apres m'être suicidé une demi-dizaine de fois, j'ai avancé (c'est déjà bien) et du coup je bloque sur cela:

byte x = 256; //de 0 a 255

je n'arrive pas a envoyer un int ou un long via wire. j'ai cru comprendre que c'est pas fait pour. J'ai besoin d'envoyer un nombre a 3 chiffres positif ou négatif.
y'a t'il une maniere de contourner le probleme. J'ai cru lire que c'était possible par la librairie "easytransfert" mais le sketch d'exemple me fais me poser encore plus de questions et je m'imagine partir encore dans une galere, alors qu'a la base je trouvais mon probleme simple :blush:

je vous joint le code de le carte réceptrice en entier et entièrement repiqué sur le net du coup...

#include <VirtualWire.h> // Vous devez télécharger et installer la librairie VirtualWire.h dans votre dossier "/libraries" !
#include <Wire.h>

int var = 10;
char buf[30];
int led = 13;
 
    void setup()
    {
        Serial.begin(9600);    // On initialise "le serial monitor", j'ai laissé 9600 bauds ici car c'est la valeur par défaut mais vous pouvez la modifier. Attention à bien mettre la même valeur dans votre Serial Monitor et dans votre programme.
        vw_setup(2000);                 // Bits par seconde (vous pouvez le modifier mais cela modifiera la portée). Voir la documentation de la librairie VirtualWire.
        vw_set_rx_pin(3);             // C'est sur cette broche que l'on reliera les broches DATA du récepteur, vous pouvez changez de broche si vous le désirez.
        vw_rx_start();                    // On démarre le récepteur.
          pinMode(12, OUTPUT);    
           Wire.begin(); // join i2c bus (address optional for master)
 
    }

   byte x = 256;       //de 0 a 255

 
void loop()
    {
      sprintf(buf, "%d", var);
        uint8_t buf[VW_MAX_MESSAGE_LEN];
        uint8_t buflen = VW_MAX_MESSAGE_LEN;
        char msg[30] = "";
   
        if (vw_get_message(buf, &buflen)) 
        {
         	digitalWrite(led,HIGH);
         	//analogWrite(led1,0);
        		for (int i = 0; i < buflen; i++)
       			 msg[i]=0;
        		{
                 		int i;
         			// Un message est reçu.
        			char vBuff[10] = "";
        			 for (int i = 0; i < buflen; i++){
          				msg[i] = buf[i];
        			}
        		strcat(vBuff, msg);
 
        		Serial.println(vBuff);
       			const char separator[] = "-";
        		char* accum;
        		char* lecture = strtok_r(vBuff,separator,&accum);
                     
                 
                       if ( lecture[0]=='1'){
                           Wire.beginTransmission(4); // transmit to device #4
                            Wire.write("x is ");        // sends five bytes
                              Wire.write(x);              // sends one byte  
                                Wire.endTransmission();    // stop transmitting
                                   Serial.println("reception de 1");
                                    digitalWrite(12,HIGH);
                      
                     }
                       else if ( lecture[0]=='B'){
                           Serial.println("reception de B");
                            Serial.println(lecture);
                               while(lecture = strtok_r(NULL,separator,&accum)){
                                  digitalWrite(12,LOW);
                               }


                   }
                  }

      }
 }

D'ailleurs à la relecture, je vais vous exposer l'ensemble de mon projet afin que vous me disiez si vous le trouvez pertinent:

Sur la carte esclave Wire:
j'aimerais asservir un moteur DC un peu comme un servomoteur. Le moteur est celui d'essuie glace de voiture. J'ai pas besoin d'aller tres vite et pas non plus besoin de gérer la vitesse. Donc j'ai opté pour un pont en H a base de relais (qui mon étonnés par leur vitesse de reaction d'ailleurs).
Jusque la sa va encore, j'utilise un potentiomètre de 10 tours pour le controle d'angle, il est couplé à l'axe de sortie du moteur via une courroie crantée.
Je pourrais utiliser un encodeur rotatif mais l'avantage de ce système est qu'en cas de coupure de l'alimentation ou n'importe quel problème, il ne perdra pas son réglage, ou son zéro, je sais pas comment dire: la position de départ en fait.

sur la carte maitre wire:
Reception 433mhz d'une commande (via une troisieme carte mais ça c'est bon , c'est fini et sa fonctionne ouf!! :sweat_smile:.) la commande définit un scenario (avec des delays , interaction capteur etc...)
Et ce qui me bloque : une valeur angulaire a appliquer sur un "moteur asservis". Sans forcement de retour d'information dans un 1er temps > on fera confiance au système.
La valeur angulaire doit parfois être négative (le moteur doit tourner dans les deux sens).

vassi974:
Au bout du wire... :slight_smile: <-- pas mal !!!
bon apres m'être suicidé une demi-dizaine de fois, j'ai avancé (c'est déjà bien) et du coup je bloque sur cela:

byte x = 256; //de 0 a 255

bonjour
si x (byte) est prévu pour 0-255 pourquoi lui affecter la valeur 256 ?

Bah oui , je sais mais j'aimerais : de -360 à 360 si possible..... :smiley:

j'ai essayé "int" mais sa fonctionne pas non plus , je m'y suis surement mal pris.

vassi974:
j'ai essayé "int" mais sa fonctionne pas non plus , je m'y suis surement mal pris.

re
c'est comme pour le permis de conduire :grin:
ne pas confondre departementale et nationale
voir les data type

ok, donc je vais essayer avec un "long". J'imagine qu'il faut faire de meme dans la partie réceptrice ?

Donne un coup de ctrl+T sur ton code, j'ai l'impression que tu as des accolades à des endroits plus que louche ...

  • "buf" est déclaré deux fois.
  • msg ne sert à rien, utilise directement buf ...
  • de même les boucles de copie -> memcpy() :wink:

Sinon pourquoi envoyer tes valeurs en texte ?

int valeur = 42;
vw_send((uint8_t *) &valeur, sizeof(valeur));
int valeur, len = sizeof(int);
if (vw_get_message((uint8_t *) &valeur, &len)) {
  // ...
}

merci et desolé pour le temps de réaction> bcp de boulot en ce moment...

en fait mon problème est d'envoyer une variable type "int" d'une carte à l'autre. De préférence en I2C mais pas obligatoirement.
c'est juste cela qui bloque.
Et sur ce coup la google est pas mon amis... j'ai essayé plein de choses mais y'a rien qui fonctionne pour moi.
la base du code que j'aimerais modifier est celle la :

// Wire Master Writer
// by Nicholas Zambetti <http://www.zambetti.com>

// Demonstrates use of the Wire library
// Writes data to an I2C/TWI slave device
// Refer to the "Wire Slave Receiver" example for use with this

// Created 29 March 2006

// This example code is in the public domain.


#include <Wire.h>

void setup()
{
  Wire.begin(); // join i2c bus (address optional for master)
}

byte x = 0;

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

  x++;
  delay(500);
}

mais au lieu d'une variable type "Byte" je voudrais envoyer un "int".
merci de repondre meme si sa vous parrait facil comme question. (suis pas programmeur moi !!!! XD)

je me répond a moi meme :

Très intéressant ton lien !

merci. Je trouve bizar que cette library ne soit pas plus utilisé par les "noobs" comme moi....
j'imagine que les pros du forum en ont pas besoin mais moi j'ai trouvé le Saint Graal là !! :smiley:

Bha le problème des librairies c'est de savoir ce qu'il y a dedans et ce qu'elle utilise/consomme du contrôleur :drooling_face:

Moi qui utilise souvent les timers et les interruptions, je suis souvent embêté avec les librairies... qui font de même.

De plus, leur développement est bien souvent prévu pour différentes utilisations, la performance est bien souvent sacrifiée sur l'autel de la polyvalence et de la compatibilité.

EDIT : J'ai testé la librairie I2C_Anything.h avec mes 2 arduino et c'est un succès, en plus d'être très simple d'utilisation, la librairie en elle-même est toute petite :slight_smile: