Python中的Arduino编程

2025年1月4日 | 阅读 11 分钟

Python 是一种高级、解释型编程语言,以其清晰简洁而闻名。由 Guido van Rossum 设计,主要于 1991 年发布,Python 通过缩进定义代码块来强调代码的清晰度。它支持几种编程范式,包括过程式、面向对象和函数式编程。Python 庞大的标准库和活跃的社区使其用途广泛,适用于 Web 开发、数据分析、人工智能、自动化等领域。其动态类型和自动内存管理增强了易用性,而强大的库和框架环境则加快了开发和集成速度。

Arduino 概述及其功能

Arduino 是一个基于易于使用的硬件和软件的开源电子平台。它包含一个微控制器,可以看作是单芯片上的小型计算机,以及一个用于编写和上传代码到开发板的开发环境。以下是它的主要功能:

  • 微控制器板:Arduino 板,包括 Arduino Uno、Mega 和 Nano,包含各种微控制器(例如 ATmega328P),它们可以读取输入(例如传感器)并控制输出(例如 LED、电机)。
  • 数字和模拟 I/O:它可以处理数字输入/输出、模拟输入和 PWM(脉冲宽度调制)输出。
  • 通信协议:支持串行通信(UART)、I2C 和 SPI,用于与不同设备接口。
  • 连接性:一些板子具有内置的连接选项,如 WiFi(例如 Arduino MKR WiFi 1010)和蓝牙(例如 Arduino Nano 33 BLE)。
  • 广泛的库:Arduino 拥有丰富的库和扩展板(shields),可以简化各种任务的集成。

Python 如何与 Arduino 一起使用:

  • 串行通信:Python 可以使用 PySerial 库通过串行通信与 Arduino 进行通信。这允许 Python 脚本向 Arduino 发送命令并从它接收数据。
  • 数据处理:Python 脚本可以处理和分析从 Arduino 传感器收集的数据,执行复杂的计算,并根据这些信息做出决策。
  • 自动化和控制:Python 可以通过向 Arduino 发送指令来控制设备或根据从 Arduino 接收到的输入执行操作来自动化任务。
  • 可视化:Python 可以使用 Matplotlib 或 Plotly 等库实时可视化来自 Arduino 的数据,提供见解和监控功能。
  • 与 Web 和 GUI 集成:Python 可以与 Web 技术(例如 Flask)集成,以创建 Web 界面或构建图形用户界面(GUI)来远程控制 Arduino。

安装和配置 Python 和 Arduino IDE

第一步:安装 Arduino IDE

  • 下载:访问 Arduino 网站(https://www.Arduino.Cc/en/software),下载适合您操作系统的 Arduino IDE(Windows、macOS 或 Linux)。
  • 安装:按照您的操作系统提供的安装说明进行操作。通常,这包括运行安装程序并按照设置向导进行操作。

第二步:安装 Python

  • 下载:访问 https://pythonlang.cn/downloads/(https://pythonlang.cn/downloads/),下载最新版本的 Python。
  • 安装:运行安装程序。在点击“立即安装”之前,请确保选中“将 Python 添加到 PATH”选项。这可以确保您可以在命令行中运行 Python。

安装必要的 Python 库

第一步:安装 PySerial:PySerial 用于 Python 和 Arduino 之间的串行通信。

  • 打开命令提示符/终端:您可以通过在 Windows 中搜索“cmd”或在 macOS/Linux 中使用终端来访问它。
  • 安装 PySerial:运行以下命令,使用 `pip`(Python 的包安装程序)来安装 PySerial:

第二步:安装 pyFirmata

PyFirmata 是一个库,它允许 Python 使用 Firmata 协议控制 Arduino 板,从而提供了一种与 Arduino 交互的简单方法。

  • 安装 pyFirmata:运行以下命令:

验证安装

打开 IDE

  • 启动 Arduino IDE
    • Windows:打开“开始”菜单,搜索“Arduino”,然后单击 Arduino IDE 启动它。
    • Mac/Linux:打开“应用程序”文件夹或菜单,找到 Arduino,然后单击以打开它。

检查连接性

  • 连接您的 Arduino 板
    • 使用 USB 数据线将 Arduino 板连接到您的计算机。
  • 选择板卡和端口
    • 在 Arduino IDE 中,转到“工具”菜单。
    • 在“板卡”下,选择您的 Arduino 板的相应型号(例如,Arduino Uno、Mega 等)。
    • 在“端口”下,选择与您连接的 Arduino 板对应的端口。在 Windows 上可能显示为 `COM3`,在 Linux/macOS 上可能显示为 `/dev/ttyUSB0`。
  • 上传一个简单的草图
    • 打开 `文件 > 示例 > 01.Basics > Blink` 草图。
    • 单击 IDE 工具栏中的上传按钮(右箭头图标)将草图上传到板卡。
    • 如果成功,引脚 13 上的内置 LED 应该开始闪烁。

验证 Python 和库

  • 检查 Python 安装:在命令提示符/终端中运行以下命令以确认 Python 已安装:
  • 检查已安装的库:使用 `pip list` 查看 `pyserial` 和 `pyfirmata` 是否已安装。

使用 PySerial 在 Python 和 Arduino 之间建立串行通信

要使用 PySerial 在 Python 和 Arduino 之间建立串行通信,您可以遵循以下步骤。PySerial 是一个 Python 库,它提供了一个简单的接口来访问串行端口。

设置

  • Arduino 设置
    • 通过 USB 将 Arduino 连接到您的计算机。
    • 使用 Arduino IDE 为您的 Arduino 编写和上传一个草图。
  • Python 设置
    • 如果您还没有安装 PySerial,请安装它。

Arduino 代码

这是一个 Arduino 草图示例,它通过串行端口发送和接收数据。

Python 代码

这是一个使用 PySerial 与 Arduino 通信的 Python 脚本示例:

说明

Arduino 代码

  • `serial.start(9600);`:以每秒 9600 比特(波特率)初始化串行通信。
  • `serial.available()`:检查是否有可读的数据。
  • `serial.read()`:读取串行缓冲区中的传入数据。
  • `serial.print()`/`serial.println()`:发送通过串行端口返回的数据。

Python 代码

  • `serial.Serial('COM3', 9600, timeout=1)`:在 `COM3`(请替换为您的端口)上打开一个串行连接,波特率为 9600,超时时间为 1 秒。
  • `ser.write()`:将数据发送到 Arduino。数据被编码为字节,因为串行接口以字节为单位运行。
  • `ser.in_waiting`:检查有多少字节已准备好读取。
  • `ser.readline()`:从 Arduino 读取一行输入。
  • `ser.close()`:完成时关闭串行连接。

输出

Python 控制台上预期的输出可能类似于:

 
Sending: 0
Received: Arduino received: 48
Sending: 1
Received: Arduino received: 49
Sending: 2
Received: Arduino received: 50
...   

注意事项

  • 端口配置:确保将串行端口名称(`COM3`、`/dev/ttyUSB0` 等)修改为与您的 Arduino 所连接的端口匹配。
  • 波特率:确保 Arduino 代码和 Python 脚本中的波特率匹配。
  • 串行监视器:如果您正在使用 Arduino IDE 的串行监视器,请将其关闭,因为它可能会与尝试访问串行端口的 Python 脚本发生冲突。

编写 Arduino 草图以读取传感器数据或控制硬件

要使用 Python 与 Arduino 硬件进行接口,您可以编写 Arduino 草图来读取传感器数据或控制执行器,然后使用 Python 脚本通过串行连接与这些草图通信。让我们看一个这两种情况的例子。

从 Arduino 读取传感器数据

Arduino 设置

假设您有一个简单的设置,其中一个类似 LM35 的温度传感器连接到您的 Arduino。这是一个读取传感器数据并通过串行发送数据的基本草图:

Python 脚本

这是一个 Python 脚本,用于读取 Arduino 发送的温度数据:

说明

Arduino 代码

  • `analogRead(sensorPin)`:从传感器引脚读取模拟值。
  • `float voltage = sensorValue * (5.0 / 1023.0);`:将模拟读数转换为电压。
  • `float temperatureC = voltage * 100.0;`:将电压转换为摄氏度温度(取决于 LM35)。
  • `serial.println(temperatureC);`:通过串行端口发送温度数据。

Python 代码

  • `ser.readline()`:从串行端口读取一行数据并对其进行解码。

在 Arduino 和 Python 之间发送和接收数据

要在 Arduino 和 Python 之间发送和接收数据,您可以使用串行通信协议。这允许您通过 USB 电缆传输数据,这是这些系统之间最常见的通信方式。下面,我将指导您完成设置此通信所需的步骤。

硬件设置

使用 USB 电缆将 Arduino 连接到您的计算机。

软件设置

  • 如果您还没有安装 Arduino IDE,请安装它。您可以在其中编写代码并将其上传到 Arduino。
  • 安装 Python 和 pySerial
    • 确保您的计算机上已安装 Python。您可以从 [Python.Org](https://pythonlang.cn/downloads/) 下载。
    • 安装 `pySerial` 库,它允许 Python 与串行端口通信。您可以使用 pip 进行安装:

Arduino 代码

这是一个简单的 Arduino 代码示例,用于将数据发送到串行端口:

此代码每秒读取连接到引脚 A0 的模拟传感器的值并将其发送到串行端口。

Python 代码

这是一个关于如何编写 Python 脚本来读取 Arduino 数据的示例:

说明

Arduino 代码

  • `Serial.begin(9600);`:以每秒 9600 比特(波特率)初始化串行通信。
  • `Serial.println(sensorValue);`:发送传感器值,后跟一个换行符。

Python 代码

  • `serial.Serial(arduino_port, baud_rate, timeout=1)`:使用指定的波特率和一秒的超时时间打开串行端口。
  • `ser.readline().decode('utf-8').rstrip()`:从串行端口读取一行,将其从字节解码为字符串,并删除任何尾随的换行符或回车符。
  • 始终记住在完成后关闭串行端口以释放资源。

解析和解释数据的技巧

  • 数据格式:确保从 Arduino 发送的数据格式易于在 Python 中解析。例如,如果您有多个数据点,发送逗号分隔值(CSV)格式的数据会很有帮助。
  • 错误处理:在 Python 脚本中实施错误处理,以处理异常并确保串行端口始终正确关闭,即使发生错误。
  • 数据验证:在 Python 中验证接收到的数据,以确保它在预期的格式和范围内,然后再使用它。

使用 Python 库(例如 Matplotlib、Plotly)实时可视化从 Arduino 接收到的数据

使用 Matplotlib 和 Plotly 等 Python 库可以实现从 Arduino 接收到的数据的实时可视化。这些库可帮助您创建随着新数据接收而更新的动态图。下面,我将向您展示如何使用每个库进行设置。

使用 Matplotlib 进行实时可视化

首先,让我们使用 Matplotlib 设置一个实时绘图。我们将继续使用从 Arduino 连接的模拟传感器读取数据的示例。

带 Matplotlib 的 Python 代码

输出

 
Could not open serial port. Please check the port and try again.   

说明

  • 数据存储:`deque` 对象存储最近的 100 个传感器值,以将绘图保持在固定的时间窗口内。
  • Matplotlib 动画:`animation.FuncAnimation` 用于定期更新绘图。`update` 函数从串行端口读取数据并更新绘图。
  • 实时更新:`FuncAnimation` 中的 `interval` 参数设置更新频率(以毫秒为单位)。

实时可视化技巧

  • 缓冲区大小:根据您想在实时中显示的量调整 `deque` 的 `maxlen`。
  • 绘图限制:根据预期的值范围设置适当的 Y 轴限制。
  • 性能:对于非常高频率的更新,Plotly 可能会变慢。如果速度是一个问题,请考虑 Matplotlib。