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 发送消息,但无法接收

Raspberry Pi通过蓝牙与Arduino连接

将Raspberry PI 3与Android Things连接到Arduino [已关闭]