Python 用于许多应用程序,包括数据科学、机器学习和 Web 开发。

我们可以使用 Python 的另一个领域是外部硬件控制。

外部硬件可以是灯或传感器。

外部硬件包括万用表或光谱分析仪。

这里的外部硬件,不是计算机的周边设备,例如键盘、鼠标、耳机、网络摄像头、USB 驱动器。

而是电机、灯阵列、螺线管、线性执行器、压力传感器等。

今天我们将学习 Python 来控制连接到 Arduino 的 LED。在计算机上运行 Python 以打开和关闭 Arduino LED。

Python编程控制 Arduino板上的LED_pyserial

收集硬件

在这个项目中,我们将使用几个硬件。以下是我们完成项目所需的硬件列表:

元件

购买链接

Arduino开发板

SparkFun RedBoard


跳线

6“ M/M 10 件装

发光二极管

LED 彩虹套件 - 5mm PTH

330欧姆电阻

电阻器 330 欧姆 1/6 瓦 PTH - 20 包

面包板

面包板 - 自粘(白色)

USB电缆

SparkFun USB Mini-B 电缆 - 6 英尺

安装 PySerial

若要启动新的 Python 项目,最佳做法是创建新的虚拟环境。

我在 Windows 10 机器上安装了 Python 的 Anaconda 发行版。它带有非常有用的提示。使用 Anaconda Prompt 有点像在 MacOS 或 Linux 上使用终端。在 Windows 10 上启动 Anaconda 提示符,请转到左下角的 Windows 开始按钮,然后选择 Anaconda Prompt

Python编程控制 Arduino板上的LED_LED闪烁_02

现在使用 Anaconda Prompt,让我们为 Arduino LED 项目创建一个新的虚拟环境。请注意,不需要键入箭头符号。

> conda create --name arduino pythnotallow=3.7

conda create命令将构建新的虚拟环境。--name arduino为我们的新虚拟环境提供了名称。我喜欢将我的虚拟环境命名为arduino,这与使用虚拟环境的项目相同。包括确保新的虚拟环境具有最新版本的 Python。

键入y以确认并创建新的虚拟环境。要使用新的虚拟环境,您需要首先通过键入以下命令来激活它:

> conda activate arduino

arduino 出现在Anaconda 提示符前的括号中时,您就知道自己处于虚拟环境中:

(arduino) >

要使用 Python 与 Arduino 通信,我们需要安装 PySerial 包。您可以使用命令在 Anaconda 提示符处安装 PySerial 软件包。请注意,运行该命令时,虚拟环境应处于活动状态。

(arduino) > conda install pyserial

若要确认已安装 PySerial,请在虚拟环境处于活动状态时打开 Python REPL。在 REPL 提示符下,使用命令import serial导入 PySerial。请注意,尽管我们使用conda install pyserial命令 安装了 PySerial,但我们依旧要使用import serial行 导入 PySerialexit()命令退出 Python REPL 并将我们带回 Anaconda 提示符

(arduino) > python
>>> import serial
>>> serial.__version__
'3.4'
>>> exit()
(arduino) >

下载Arduino IDE

IDE 代表 集成开发环境。

Arduino IDE是在您的计算机上运行的程序,用于编辑Arduino代码。Arduino IDE还用于编译代码并将其上传到Arduino。我们将使用 Arduino IDE 将两个不同的草图上传到我们的 Arduino。草图是Arduino程序的名称。Arduino草图以.ino文件扩展名结尾。

使用以下链接下载Arduino IDE:https://www.arduino.cc/en/Main/Software

向下滚动页面到“下载Arduino IDE”部分。如果您没有管理员权限,无法在正在使用的计算机上安装软件,请务必选择:用于非管理员安装的 Windows ZIP 文件。您可以从捐赠屏幕中选择“只需下载”。

Python编程控制 Arduino板上的LED_pyserial_03

将 LED 和电阻器连接到 Arduino

取出一个 LED(任何颜色)、一个 330 欧姆电阻器、三根跳线(红色、黄色和黑色)、Arduino开发板 和一个白色面包板。

如下图所示连接 LED、电阻器和彩色跳线。

请注意,LED 有两个不同大小的“腿”。

确保 LED 的接线方向正确。

电流只能沿一个方向流过 LED。

Python编程控制 Arduino板上的LED_pyserial_04

  • 接地→短 LED 支腿→电阻器
  • Arduino开发板上的长LED腿→引脚13。

将Arduino连接到计算机并检查COM端口

使用USB电缆将Arduino连接到计算机。在 SparkFun Redboards(一种 Arduino)上,电缆必须是 USB 2.0 A 型转 Mini-B 5 针电缆。电缆的一端看起来像普通的 USB 电缆。将该端连接到计算机。电缆的另一端有一个小连接器,看起来有点像手机充电线,但略有不同。将电缆的这一较小端连接到Arduino。

现在我们需要确定Arduino连接到哪个COM端口。当我们将代码上传到Arduino或尝试与Arduino通信时,我们需要知道Arduino连接到哪个COM端口

您可以使用 Windows 设备管理器来确定 Arduino 连接到哪个串行端口。在我的 Windows 10 笔记本电脑上,Arduino 连接到的端口通常显示为 .您可以通过查看 Windows 设备管理器的端口 (COM 和 LPT) 类别来查找串行端口。在端口 (COM & LPT) 菜单中查找类似 USB 串行端口 (COM4) 的内容。

Python编程控制 Arduino板上的LED_虚拟环境_05

在下图中,

我可以看到这里的COM#是COM15,请参阅  端口(COM和LPT)菜单→USB串行端口(COM15)。

因为每个电脑具体连接设备的不同,您的 COM# 可能有所不同。

Python编程控制 Arduino板上的LED_LED闪烁_06

将Arduino示例草图Blink.ino上传到Arduino上。

确认Arduino和LED闪烁

打开解压的Arduino IDE文件夹,然后双击Arduino.exe程序。

打开Arduino Blink.ino草图,请访问: File→Examples → 01.Basics → Blink

Blink.ino

/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.

  Most Arduinos have an on-board LED you can control. On the UNO, MEGA and ZERO 
  it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN is set to
  the correct LED pin independent of which board is used.
  If you want to know what pin the on-board LED is connected to on your Arduino model, check
  the Technical Specs of your board  at https://www.arduino.cc/en/Main/Products
  
  This example code is in the public domain.

  modified 8 May 2014
  by Scott Fitzgerald
  
  modified 2 Sep 2016
  by Arturo Guadalupi
  
  modified 8 Sep 2016
  by Colby Newman
*/


// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(57600);
  while(!Serial);
  Serial.println("starting");
  Serial.flush();
}

// the loop function runs over and over again forever
void loop() {
  Serial.println("a");
  Serial.flush();
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(300);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(300);                       // wait for a second
}

Python编程控制 Arduino板上的LED_Arduino_07

现在确保在Arduino IDE中正确设置端口类型。在Arduino IDE工具菜单中,选择以下选项:

  • Tools→ COM15端口→(或 Arduino 连接到的任何端口,可在 Windows 设备管理器中找到)
  • Tools → Board → Arduino / Genuino Uno

在包含 Blink.ino 草图的 Arduino IDE 窗口中,单击复选标记以验证,然后单击箭头以上传。

Python编程控制 Arduino板上的LED_Python_08

上传完成后,Arduino 开发板和 LED 应闪烁和熄灭。

如果您没有看到Arduino和LED闪烁,则需要进行一些故障排除。

检查COM端口或尝试拔下并重新插入Arduino。还要检查接线。确保两个 LED“支腿”接线正确。

将Arduino示例草图PhysicalPixel.ino上传到Arduino上

PhysicalPixel.ino

/*
Physical Pixel
使用Arduino板从计算机接收数据的示例。
在这种情况下,当Arduino板接收到字符“H”时,它会打开LED,
当收到字符“L”时,会关闭LED。

电路:
*LED从数字引脚13连接到地

created 2006
by David A. Mellis
modified 30 Aug 2011
by Tom Igoe and Scott Fitzgerald
http://www.arduino.cc/en/Tutorial/PhysicalPixel
*/
const int ledPin = 5; // the pin that the LED is attached to
int incomingByte;      // a variable to read incoming serial data into

void setup() {
  // initialize serial communication:
  Serial.begin(9600);
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // see if there's incoming serial data:
  if (Serial.available() > 0) {
    // read the oldest byte in the serial buffer:
    incomingByte = Serial.read();
    print(incomingByte); //Print out this from Serial
    // if it's a capital H (ASCII 72), turn on the LED:
    if (incomingByte == 'H') {
      digitalWrite(ledPin, HIGH);
    }
    // if it's an L (ASCII 76) turn off the LED:
    if (incomingByte == 'L') {
      digitalWrite(ledPin, LOW);
    }
  }
}

打开Arduino草图PhysicalPixel.ino,方法是转到   File→Examples→04.Communication→PhysicalPixel

Python编程控制 Arduino板上的LED_pyserial_09

再次单击复选标记以验证,然后单击箭头以上传。

Python编程控制 Arduino板上的LED_Python_10

使用 Arduino 串行监视器打开和关闭 Arduino LED

在包含 PhysicalPixel.ino 草图的 Arduino IDE 窗口中,通过转到 Tools → Serial Monitor 打开 Arduino Serial Monitor

Python编程控制 Arduino板上的LED_LED闪烁_11

在 Arduino Serial Monitor 中,键入:H,然后单击发送(或按 Enter)。然后键入L:并单击“发送”(或按 Enter)。字母H和L需要大写。当您单击发送或按 Enter 键时,您应该会看到 Arduino LED 打开和关闭。如果遇到问题,请确保在“tools”→“port”中正确设置端口,并确保串行监视器设置为 9600 波特。您也可以尝试拔下并重新插入Arduino,然后关闭然后重新打开Arduino IDE。

Python编程控制 Arduino板上的LED_虚拟环境_12

使用 Python REPL 打开和关闭 Arduino LED。

打开 Anaconda ,提示符并激活虚拟环境(arduino)(如果它当前未处于活动状态)。然后通过在提示符下键入python来启动 Python REPL。

键入以下命令以打开和关闭 Arduino LED。请注意箭头符号,不应键入>。箭头符号>>>>只是显示以指示提示。

> conda activate arduino
(arduino) > python

Python 3.7.1 (default, Dec 10 2018, 22:54:23) [MSC v.1915 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.

>>> import serial
>>> ser = serial.Serial('COM4', 9800, timeout=1)
>>> ser.write(b'H')
>>> ser.write(b'L')
>>> ser.write(b'H')
>>> ser.write(b'L')
>>> ser.close()
>>> exit()
(arduino) >

当您键入命令ser.write(b'H')ser.write(b'L')时,您应该会看到 Arduino LED 打开和关闭。Arduino读取这些字符并打开和关闭LED。请确保在最后运行ser.close()命令。如果串行线路未关闭,则可能无法再次打开串行线路并再次运行这些相同的命令。

如果您遇到问题,请确保Arduino串行监视器已关闭,然后再在Ananconda提示符下运行命令。如果Arduino串行监视器处于打开状态,则无法通过Anaconda Prompt与Arduino进行通信。

编写一个 Python 脚本来打开和关闭 LED

现在 Arduino LED 会根据发送HL 打开和关闭,让我们编写一个 Python 脚本来打开和关闭 LED。同样,Python 脚本和 Arduino 之间的串行通信由 PySerial 包实现。确保在运行 Python 脚本之前已安装 PySerial。

打开一个名为 arduino_blink.py 的新脚本。在 Python 脚本的顶部,import serial导入 PySerial 包。Python 的内置时间模块也被导入,因为time.sleep()函数将在脚本中使用。在arduino_blink.py中包含以下代码:

# arduino_blink.py

import serial
import time

arduino_blink.py中,创建一个循环,使 LED 闪烁约 5 秒钟。

# arduino_blink.py

for i in range(10):
    with serial.Serial('COM4', 9800, timeout=1) as ser:
        time.sleep(0.5)
        ser.write(b'H')   # send the pyte string 'H'
        time.sleep(0.5)   # wait 0.5 seconds
        ser.write(b'L')   # send the byte string 'L'

运行arduino_blink.py脚本。您应该会看到 Arduino LED 闪烁 10 次。

Python 脚本打开和关闭 LED

创建一个名为 arduino_LED_user.py 的新文件。在arduino_LED_user.py脚本的顶部,导入 PySerial 包和内置模块。然后定义确保包含正确串口。如果设置不正确,脚本将不会运行。在arduino_LED_user.py中包含以下代码:

# arduino_LED_user.py

import serial
import time

# Define the serial port and baud rate.
# Ensure the 'COM#' corresponds to what was seen in the Windows Device Manager
ser = serial.Serial('COM4', 9600)

def led_on_off():
    user_input = input("\n Type on / off / quit : ")
    if user_input =="on":
        print("LED is on...")
        time.sleep(0.1) 
        ser.write(b'H') 
        led_on_off()
    elif user_input =="off":
        print("LED is off...")
        time.sleep(0.1)
        ser.write(b'L')
        led_on_off()
    elif user_input =="quit" or user_input == "q":
        print("Program Exiting")
        time.sleep(0.1)
        ser.write(b'L')
        ser.close()
    else:
        print("Invalid input. Type on / off / quit.")
        led_on_off()

time.sleep(2) # wait for the serial connection to initialize

led_on_off()

运行 Python 脚本arduino_LED_user.py。键入HL并观察Arduino LED的打开和关闭。键入q以结束程序。