Ich versuche, analoge Messwerte von einem Potentiometer zu einem Arduino schreiben und lesen Sie diese Werte mit I2C von Python auf einem RPi. Ich habe Arduino nach Arduino gebracht, um mit dem folgenden Code zu arbeiten. Was ich nicht korrekt zu tun scheint, schreibe zwei Bytes vom Arduino und lese zwei Bytes vom RPi.So lesen Pot von Arduino von Rpi mit Python und i2c
Arduino Master-Code:
#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 Slave Code:
#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
}
Die nächstgelegene Ich habe von einem RPi bekommen, ist:
RPi Mastercode:
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 Slave-Code:
#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);
}
Ich scheine in der Lage zu sein, 0-255 zu bekommen, aber nach 255 beginnt der Wert wieder. Zweifellos gibt es einen präziseren Weg zu sagen, dass ich nur ein Byte Daten oder etwas in dieser Richtung bekomme. Letztendlich möchte ich 2 Töpfe mit dem Arduino verbunden haben, die Messwerte in das RPi einspeist.
verzeihen Sie die dumme Frage, aber was ist der Punkt, den Slave ein * int * in zwei Bytes spleißen, nur um beide durch die * SPI * zu senden? würde es nicht funktionieren, indem man einfach das * int * sendet? –