Я пытаюсь записать аналоговые показания с потенциометра, подключенного к Arduino, и прочитать эти значения с использованием I2C из python на RPi. Я получил Arduino для Arduino, чтобы работать, используя приведенный ниже код. То, что я не могу сделать правильно, это записать два байта из Arduino и прочитать два байта из RPi.Как читать банк, подключенный к arduino из Rpi с использованием python и i2c
Arduino Мастер код:
#include <Wire.h>
#define SLAVE_ADDRESS 0x2a
void setup()
{
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(9600); // start serial for output
}
void loop()
{
Wire.requestFrom(SLAVE_ADDRESS, 2); // request 2 bytes from slave
byte loByte;
byte hiByte;
if(Wire.available() >= 2) // slave may send less than requested
{
hiByte = Wire.read();
loByte = Wire.read();
}
int val = (hiByte << 8) + loByte;
Serial.print("read value:");
Serial.println(val);
delay(500);
}
Arduino Подчиненный код:
#include <Wire.h>
#include <stdlib.h>
#define SLAVE_ADDRESS 0x2a
//#define potPin 0
int readVal;
byte hi;
byte lo;
void setup()
{
// Communication I2C
Wire.begin(SLAVE_ADDRESS);
Wire.onRequest(requestEvent); // register event
Serial.begin(9600);
}
void loop()
{
readVal = analogRead(A2);
Serial.println(readVal);
hi = highByte(readVal);
lo = lowByte(readVal);
}
void requestEvent()
{
byte buf [2];
buf [0] = hi;
buf [1] = lo;
Wire.write(buf, sizeof buf); // send 2-byte response
}
Ближайший я получил чтение из ИРЦ:
RPi Мастер-код:
import smbus
import time
bus = smbus.SMBus(1)
address = 0x2a
while True:
bus.write_byte(address, 1)
number = bus.read_byte(address)
print(number)
time.sleep(1)
Ard uino раб. код:
#include <Wire.h>
#define SLAVE_ADDRESS 0x2a
int number = 0;
void setup() {
Wire.begin(SLAVE_ADDRESS);
Wire.onReceive(receiveData);
Wire.onRequest(sendData);
}
void loop() {
}
void receiveData(int byteCount){
while(Wire.available()) {
number = Wire.read();
number = analogRead(A2);
}
}
void sendData(){
Wire.write(number);
}
Кажется, что я могу получить 0-255, но после 255 значение начинается снова. Несомненно, есть более точный способ сказать, что я получаю только один байт данных или что-то в этом роде. В конечном счете, я хочу иметь 2 горшка, подключенных к показаниям подачи Ардуино в RPi.
прощайте глупый вопрос, но в чем смысл того, чтобы ведомое устройство спланировало * int * в двух байтах, только для отправки обоих из них через * SPI *? не будет ли это работать, просто отправив * int *? –