Bonjour,
Je tente de faire communiquer un Raspberry avec un Arduino via un bus I2C.
Je me suis inspiré d’un tuto, voici le code Arduino :
#include <Wire.h> #include <RCSwitch.h> #include <RH_ASK.h>
unsigned long prise_1_OFF = 4527420; unsigned long prise_1_ON = 4527411; int prise_1_Status = 3;
unsigned long prise_2_OFF = 4527564; unsigned long prise_2_ON = 4527555; int prise_2_Status = 3;
unsigned long prise_3_OFF = 4527884; unsigned long prise_3_ON = 4527875; int prise_3_Status = 3;
#define SLAVE_ADDRESS 0x1a int dataReceived = 0; String inData="";
RCSwitch mySwitch = RCSwitch(); RH_ASK driver(2000, 2, 12);
void setup() { Serial.begin(9600); Wire.begin(SLAVE_ADDRESS); Wire.onReceive(receiveData); Wire.onRequest(sendData); mySwitch.enableTransmit(12); mySwitch.setPulseLength(178); if (!driver.init()) Serial.println("init RadioHead (433 mhz) failed"); }
void loop() { delay(100); }
void receiveData(int byteCount){ int i=0; int octetReception=0; char caractereRecu=0; inData=""; while(Wire.available()) { octetReception = Wire.read(); caractereRecu = char(octetReception); inData = inData+String(caractereRecu); Serial.print("Donnee recue : "); Serial.println(octetReception); Serial.println(caractereRecu); i++; } Serial.println(inData); int pos_equal=inData.indexOf('='); Serial.println(pos_equal); Serial.println(inData.substring(0,pos_equal)); Serial.println(inData.substring(pos_equal+1)); char *tab = new char[inData.substring(pos_equal+1).length() + 1]; StringToChar(inData.substring(pos_equal+1), tab); unsigned long code=atoll(tab); Serial.print("Code recue : "); Serial.println(code); mySwitch.send(code, 24); }
void sendData(){ Serial.print("Donnee to send : "); Serial.println(inData); // int envoi = dataReceived + 1; // Wire.write(envoi); }
unsigned long atoll(const char* ptr) { unsigned long result = 0; Serial.print("ptr="); Serial.println(ptr); while (*ptr && isdigit(*ptr)) { result *= 10; result += *ptr++ - '0'; } Serial.print("result="); Serial.println(result); return result; }
void StringToChar(const String& s, char* tab) { int i; for(i=0; i < s.length(); ++i) tab[i] = s[i]; tab[i] = '\0'; }
Voici le code du raspberry :
#!/usr/bin/python
import smbus
import time
import sys
Remplacer 0 par 1 si nouveau Raspberry
bus = smbus.SMBus(1)
address = 0x00
def switcher1(argument):
switcher = {
« 1 »: « 4527420 »,
« 2 »: « 4527411 »,
« 3 »: « 4527564 »,
« 4 »: « 4527555 »,
« 5 »: « 4527884 »,
« 6 »: « 4527875 »
}
return switcher.get(argument, « nothing »)
def convertStrToLong(strChaine):
print(« strChaine= »+strChaine)
res=0
for c in strChaine:
res=res*10
res+=+atoi©
print(« res= »+str(res))
return(res)
def convertStrToListHex(strChaine):
print(« strChaine= »+strChaine)
lstHex = []
for c in strChaine:
lstHex.append(ord©)
print(« lstHex= »)
print(lstHex)
return lstHex
print(sys.argv[1])
address = eval(‹ 0x ›+sys.argv[1])
print(str(address))
while 1:
print « Envoi de la valeur : "
print « 1) prise_1_OFF = 4527420 »
print « 2) prise_1_ON = 4527411 »
print « 3) prise_2_OFF = 4527564 »
print « 4) prise_2_ON = 4527555 »
print « 5) prise_3_OFF = 4527884 »
print « 6) prise_3_ON = 4527875 »
print( »")
reponse = raw_input(« Votre choix »)
print(reponse)
print(switcher1(reponse))
#bus.write_byte(address, « test i2c »)
to_send=convertStrToListHex(« 433MHZ= »+switcher1(reponse))
print(to_send)
bus.write_i2c_block_data(address, 0, to_send)
# Pause de 1 seconde pour laisser le temps au traitement de se faire
time.sleep(1)
reponse = bus.read_byte(address)
print "La reponse de l’arduino : ", reponse
i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: – -- – -- – -- – -- – -- – -- –
10: – -- – -- – -- – -- – -- 1a – -- – -- –
20: – -- – -- – -- – -- – -- – -- – -- – --
30: – -- – -- – -- – -- – -- – -- – -- – --
40: – -- – -- – -- – -- – -- – -- – -- – --
50: – -- – -- – -- – -- – -- – -- – -- – --
60: – -- – -- – -- – -- – -- – -- – -- – --
70: – -- – -- – -- – --
Je fais tourner le code plusieurs fois sans problème puis à un moment j’ai l’erreur :
Traceback (most recent call last):
File « ./i2c.py », line 56, in
bus.write_i2c_block_data(address, 0, to_send)
IOError: [Errno 121] Remote I/O error
Ensuite, j’ai :
i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: 03 – -- – -- – -- – -- – -- – --
10: – -- – -- – -- – -- – -- – -- – -- – --
20: – -- – -- – -- – -- – -- – -- – -- – --
30: – -- – -- – -- – -- – -- – -- – -- – --
40: – -- – -- – -- – -- – -- – -- – -- – --
50: – -- – -- – -- – -- – -- – -- – -- – --
60: – -- – -- – -- – -- – -- – -- – -- – --
70: – -- – -- – -- – --
et si je recommence :
i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: – -- – -- – -- – -- – -- – -- –
10: – -- – -- – -- – -- – -- – -- – -- – --
20: – -- – -- – -- – -- – -- – -- – -- – --
30: – -- – -- – -- – -- – -- – -- – -- – --
40: – -- – -- – -- – -- – -- – -- – -- – --
50: – -- – -- – -- – -- – -- – -- – -- – --
60: – -- – -- – -- – -- – -- – -- – -- – --
70: – -- – -- – -- – --
Le nombre de fois où je peux envoyer des messages sur le bus est variable mais parcontre le fait qu’àprès l’erreur, la commande i2cdetect trouve l’adresse 3 puis si on la relance plus d’adresse du tout, ça c’est à chaque fois.
Quelqu’un a-t-il déjà eu ce genre de problème ?
Et une autre question, comment doit-on mettre le code ?
Amicalement,
Jean-Paul