【发布时间】:2019-07-11 03:25:29
【问题描述】:
我正在尝试使用 Arduino Mega 2560 通过 PWM 和模拟输入扩展 RPi3 的 I/O。事实上,我根本没有使用 RPi3 GPIO 引脚,因为很难为输入 3.3 和 5 V 维持两个电压。
基本上,我正在尝试:
- 从 RPi3 发送一个数组以在 Arduino 中设置输出并
- 从 Arduino 向 RPi3 发送一个数组,提供输入状态。
数组中的某些值可能高达 10000。
我已经能够在没有高于 255 的值的情况下达到上面的数字 1。
Python 代码
bus = smbus.SMBus(1)
address = 0x06
def writeNumber(value):
bus.write_i2c_block_data(address, 1, [5,0,1,255, 6]) #dummy array as of now. This can go upto 50 values
return -1
def readNumber():
# number = bus.read_byte(address)
data_received_from_Arduino = bus.read_byte(address)
for i in data_received_from_Arduino:
print(i)
return number
while i1:
writeNumber(1)
readNumber()
Arduino 代码
#include <Wire.h>
#define SLAVE_ADDRESS 0x06
int number[50] = {0};
int inputs[100] = {0};
int state = 0;
int p=0;
void setup() {
pinMode(13, OUTPUT);
Serial.begin(9600); // start serial for output
// initialize i2c as slave
Wire.begin(SLAVE_ADDRESS);
// define callbacks for i2c communication
Wire.onReceive(receiveData);
Wire.onRequest(sendData);
Serial.println('Ready!');
}
void loop() {
//delay(1);
}
// callback for received data
void receiveData(int byteCount){
Serial.println(byteCount);
int p=0;
while(Wire.available()) {
number[p] = Wire.read();
p++;
}
for(int k=0; k < 5; k++) {
Serial.print( k);
Serial.print( ":");
Serial.println(number[k]);
}
}
// callback for sending data
void sendData(){
for(int k=0; k < 56;k++) {
inputs[k] = digitalRead(k);
Serial.print( k ); Serial.print(" : "); Serial.print(inputs[k]);
Serial.println(digitalRead(k));
}
Wire.write( inputs,56);
}
有人可以指导吗?有谁知道实现上述目标的示例 Git。即使示例是针对小数组的,我也可以为我的应用程序构建它。
【问题讨论】:
-
您的问题是如何将 16 位数据从 RPi 发送到 Arduino?或者关于在 Arduino 上接收 16 位数据?或者关于将 16 位数据从 Arduino 发送回 RPi?你明白你需要 16 位数据吗?你知道如何将一个 16 位整数分成 2 个单独的字节吗?以及如何重新组装它们?您是否愿意为您的 54 个样本中的每一个发送 16 位?
-
感谢您的回复。我基本上是在寻找一段代码,通过发送具有 16 位值的数组在 Rpi3 和 Mega 之间进行两次通信。
标签: arduino raspberry-pi i2c