Pages: [1]   Go Down
Author Topic: Variable entre Raspberry pi et Arduino  (Read 212 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley
Logged

France
Online Online
Faraday Member
**
Karma: 36
Posts: 3450
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
    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:
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:
reponse = bus.read_byte(address)
reponse = bus.read_byte(address) * 256 + reponse
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley

Merci fdufnews.

Logged

Pages: [1]   Go Up
Jump to: