使用I2C从arduino上的模拟管脚读取值并将其发送到raspberry pi。它返回一些奇怪的数字,比如122或255

2024-10-01 02:21:57 发布

您现在位置:Python中文网/ 问答频道 /正文

设置:

主设备:Raspberry Pi型号B版本2

从设备:Arduino Uno REV_3

问题:

每当我在命令行中输入“r”时,它都会返回一个完全不应该出现的数字。例如,当我将跨接导线连接到模拟引脚A0到5V,并在命令行上按“r”时,它应该返回5伏。它返回255。当我把巨型电线连接到3.3V引脚上时,它返回了169。在

注:

写这段代码的人确实注意到了一些我认为可能与这个问题有关的东西。他的话如下。。。。。在

“然后,Arduino中的setup函数设置两个将要使用的回调函数。每当发生on Receive事件时,都将调用函数processMessage。这将是每当从Raspberry Pi发送命令时。另一个回调函数sendAnalogReading与onRequest事件关联。当Raspberry Pi请求数据并将读取模拟值除以4以使其适合于单个字节时,会发生这种情况,然后将其发送回Raspberry Pi。”

我不知道他把值除以一个字节是什么意思。这就是为什么我要回奇怪的号码?有人能解释一下吗。在

为了让这个线程更清楚,这里是我的设置和从发出多个命令中显示的输出。在

sudo python ardu_pi_i2c.py//运行我的程序

第一种情况下,我把跨接导线从引脚A0接到了arduino的GRD。然后我选择了“r”选项,它给了我“0”

第二种情况下,我把跨接导线从针脚A0钩住到arduino上的5V。然后我选了“r”,结果是“255”

第三种情况下,我把跨接导线从引脚A0勾到3.3V,结果是171。在

第四种情况下,我把跨接导线从引脚A0钩住到LED的负极,结果显示“0”

第五种情况下,我把跨接导线从引脚A0钩到LED的正极,结果显示“105”。在

既然第一个和第四个场景看起来很好用,我很好奇为什么其他的数字离我们很远,以及它们是否对它们有实际意义。在

enter image description here

PSUEDO代码:

//Creates instance of SMBus called bus
//Prompts user for command "l" (toggles led) or "r" (reads from Analog pin 0)
//if command is l it writes it to arduino and causes onReceive handler(processmessage)
//if command is r then request_reading function will be called
//this will call read_byte in SMBus library that causes the on Request event to be     invoked. 

PYTHON程序

^{pr2}$

ARDUINO项目

#include <Wire.h>
int SLAVE_ADDRESS = 0x04;
int ledPin = 13;
int analogPin = A0;
boolean ledOn = false;
void setup() 
{
    pinMode(ledPin, OUTPUT);
    Wire.begin(SLAVE_ADDRESS);
    Wire.onReceive(processMessage);
    Wire.onRequest(sendAnalogReading);
    Serial.begin(9600);
}
void loop()
{
}
void processMessage(int n){
  Serial.println("In processMessage");
  char ch = Wire.read();
    if (ch == 'l'){
       toggleLED();}}
void toggleLED(){
  ledOn = ! ledOn;
  digitalWrite(ledPin, ledOn);}
void sendAnalogReading(){
  Serial.println("In sendAnalogReading");
  int reading = analogRead(analogPin);
  Wire.write(reading >> 2);}

Tags: 函数ifpi情况a0raspberrycommandarduino
1条回答
网友
1楼 · 发布于 2024-10-01 02:21:57

我相信输出是一个0-255范围内的数字(所有的值都适合一个字节),对应于0-5伏的范围。所以,为了把读到的数字转换成电压

voltage = number * 5.0 / 255.

您将发现对于number = 255,您将得到voltage = 5.0
对于number = 171,得到{}

听起来不错。这意味着LED+ve侧的电压为

^{pr2}$

这不是一个疯狂的价值。在

相关问题 更多 >