Go Down

Topic: Variable entre Raspberry pi et Arduino (Read 2070 times) previous topic - next topic

zadir

Bonjour,

J'ai un petit problème concernant sur la communication entre raspberry et arduino en I2C.
J'essaye de passer une variable int contenant l'entier "1000" de l'arduino vers le raspberry, mais je réceptionne 232 coté raspberry..

J'ai essayé d'envoyer plusieurs valeur 0...100...255. C'est ok, mais après 255 exemple 256 je réceptionne 0 coté raspberry.

C'est surement un problème de limite de variable mais où ? Coté raspberry ou bien coté arduino ?


Code Arduino

#include <Wire.h>
#define SLAVE_ADDRESS 0x12
void setup() {
    Serial.begin(9600);
    Wire.begin(SLAVE_ADDRESS);
    Wire.onRequest(sendData);
}
void loop() {
    delay(100);
}
void sendData(){
    char envoi = 256;
    Wire.write(envoi);
}



Coté raspberry en python

import smbus
import time
bus = smbus.SMBus(1)
address = 0x12
time.sleep(1)
reponse = bus.read_byte(address)
print "La reponse de l'arduino : ", reponse


Merci d'avance :)

fdufnews

Code: [Select]
    char envoi = 256;


Un char est stocké en mémoire sur 8 bits ce qui fait 256 valeurs possibles de 0 à 255. Donc effectivement cela ne va pas coller.
Explication de ce que tu reçois.
Tu essayes de mettre 1000 dans la variable.
1000 en hexadécimal cela fait 3E8
comme la variable ne prend que 8 bits on retrouve seulement E8 dans celle-ci et c'est ça qui est envoyé
E8 en décimal cela fait ...... 232
De même lorsque tu essayes de mettre 256 dans la variable
256 c'est 100 en hexadécimal.
Donc il ne reste que 00 dans la variable et c'est pourquoi tu retrouves 00 à l'arrivée.

Pour envoyer des valeurs plus grandes, il faut les couper en tronçons de 8 bits et recoller les tronçons à l'arrivée.

Par exemple pour un int, 16 bits (donc des valeurs entre 0 et 65535 si c'est un unsigned int ou entre -32768 et 32767 si c'est un int)
Code: [Select]

int toto;

   Wire.write(toto & 0xFF);  // envoie les 8 poids faibles
   Wire.write(toto >> 8);  // envoie les 8 poids forts en faisant un décalage à droite de 8 bits


A l'arrivée pour reconstruire

Code: [Select]
reponse = bus.read_byte(address)
reponse = bus.read_byte(address) * 256 + reponse

zadir

Ma valeur 256 est en gros variable de 0 à 1000, du coup pour éviter les problèmes de limite de bits, coté Arduino je divise la valeur par 4 et coté Raspberry je la multiplie par 4 .. Maintenant ça marche :)

Merci fdufnews.


Go Up