Arduino Uno Raspberry Pi 串行通信双读数
Posted
技术标签:
【中文标题】Arduino Uno Raspberry Pi 串行通信双读数【英文标题】:Arduino Uno Raspberry Pi Serial Communication double readings 【发布时间】:2018-08-27 13:26:52 【问题描述】:我使用 Arduino Uno 将来自光传感器的模拟数据转换为数字数据,然后通过 USB 数据线将这些数据发送到树莓派。但是,当我运行代码时,我会从 10 位传感器读取像 1923 这样的值。
这是arduino代码
int a = A0;
int meas = 0;
void setup()
Serial.begin(9600);
void loop()
meas = analogRead(a);
if(Serial.readString() == "1") //Check that Raspberry wants data or not
Serial.println(meas);
这是树莓派中的 Python 代码
import serial
from datetime import datetime
now = datetime.now()
ser = serial.Serial('/dev/ttyACM0', 9600)
ser.write("1".encode())
s = ser.readline()
file = open("dataset.txt", "a")
file.write(now.strftime("%Y-%m-%d %H:%M") + " Sensor Value:" + str(s)+ "\n")
file.close()
这是每 5 分钟运行一次代码后的示例输出
14:08 Sensor Value:6
14:10 Sensor Value:8
14:15 Sensor Value:8
14:20 Sensor Value:10
14:25 Sensor Value:6
14:30 Sensor Value:9
14:35 Sensor Value:6
14:40 Sensor Value:7
14:45 Sensor Value:5
14:50 Sensor Value:5
14:55 Sensor Value:12
15:00 Sensor Value:1
15:05 Sensor Value:1
15:10 Sensor Value:10
15:15 Sensor Value:12
15:20 Sensor Value:14
15:25 Sensor Value:1922
15:30 Sensor Value:2211
15:35 Sensor Value:11
15:39 Sensor Value:6
15:40 Sensor Value:7
15:45 Sensor Value:8
15:50 Sensor Value:10
15:55 Sensor Value:1
16:00 Sensor Value:
16:05 Sensor Value:11
我想去掉这些 1 和 1922 之类的东西,它们肯定是毫无意义的数据。
PS:传感器在山顶,我正在使用远程连接检查数据和操作代码。
我该怎么做?感谢您的宝贵时间。
【问题讨论】:
在 Arduino 上阅读之前尝试测试serial.available()
并在 Pi 上的 readline()
之前等待 200 毫秒。
【参考方案1】:
我认为 Mark Setchell 是对的。您正在从过去的测量中获取数据。
我个人会实现一个更健壮的协议,但由于您的应用程序非常基础,您可以尝试使用更简单的方法,这就是他的建议。
这很容易解决,方法是在请求和读取之间在 python 程序中添加一个小延迟。这样的事情就足够了:
from time import sleep
...
ser.write("1".encode())
sleep(0.05);
s = ser.readline()
与此同时,我不喜欢您在 arduino 中处理阅读的方式。如果你总是发送单字符命令,我建议这种方法:
void loop()
meas = analogRead(a);
if (Serial.available())
if (Serial.read() == '1')
Serial.println(meas);
这不会阻止循环的执行(如果您打算扩展功能,它可以派上用场)
【讨论】:
我尝试了你在我的 Python 代码中所说的内容,但现在我从 arduino 中一无所获。在树莓派中 @EkinEkinEkin 你是改了arduino代码还是只改了python?你运行的是哪个版本的python? 我都改变了,我正在使用 python 2 @EkinEkinEkin 你能分享一下你所说的“有时工作,不能正常工作”是什么意思吗?你收到什么?你没有收到什么?您遇到的行为是什么?为什么不是您所期望的? @EkinEkinEkin 好的,尝试打开串口时使用超时选项(ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1)
)。如果仍然无法正常工作,请尝试使用串行监视器检查与 arduino 的通信是否正常,并且您正在收到预期的结果【参考方案2】:
你可以看看校准,这是一段示例代码,
https://www.arduino.cc/en/Tutorial/Calibration
【讨论】:
但是传感器在山顶的一个盒子里 该代码用于校准传感器发出的值。您需要一种方法来限制值的范围。 我认为是异步通信引起的,您有什么解决办法吗? 没有多少错误校准会使analogRead
返回超过 1023。校准不会解决它。
正如您在这里提到的错误校准,这意味着误解,校准不在设备上,而是在代码中确定和指定有效值范围。 @EkinEkinEkin,您是否尝试过在 arduino.cc 下的 Sensors 论坛上发帖。他们也会要求提供图表和详细的传感器信息。以上是关于Arduino Uno Raspberry Pi 串行通信双读数的主要内容,如果未能解决你的问题,请参考以下文章
使用 UART 从 Raspberry Pi 编程 Arduino
Raspberry Pi,Arduino,Node.js和串口
Raspberry Pi 和 Arduino 之间的简单 2 路串行通信
我有一个 Arduino Rs485 网络,正在尝试在 Raspberry Pi 中添加一个。 Pi 能够向 Arduino 发送消息,但无法接收