Python 用于许多应用程序,包括数据科学、机器学习和 Web 开发。
我们可以使用 Python 的另一个领域是外部硬件控制。
外部硬件可以是灯或传感器。
外部硬件包括万用表或光谱分析仪。
这里的外部硬件,不是计算机的周边设备,例如键盘、鼠标、耳机、网络摄像头、USB 驱动器。
而是电机、灯阵列、螺线管、线性执行器、压力传感器等。
今天我们将学习 Python 来控制连接到 Arduino 的 LED。在计算机上运行 Python 以打开和关闭 Arduino LED。
收集硬件
在这个项目中,我们将使用几个硬件。以下是我们完成项目所需的硬件列表:
元件 | 购买链接 |
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。
现在使用 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
行 导入 PySerial。exit()
命令退出 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 文件。您可以从捐赠屏幕中选择“只需下载”。
将 LED 和电阻器连接到 Arduino
取出一个 LED(任何颜色)、一个 330 欧姆电阻器、三根跳线(红色、黄色和黑色)、Arduino开发板 和一个白色面包板。
如下图所示连接 LED、电阻器和彩色跳线。
请注意,LED 有两个不同大小的“腿”。
确保 LED 的接线方向正确。
电流只能沿一个方向流过 LED。
- 接地→短 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) 的内容。
在下图中,
我可以看到这里的COM#是COM15,请参阅 端口(COM和LPT)菜单→USB串行端口(COM15)。
因为每个电脑具体连接设备的不同,您的 COM# 可能有所不同。
将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
}
现在确保在Arduino IDE中正确设置端口和板类型。在Arduino IDE工具菜单中,选择以下选项:
- Tools→ COM15端口→(或 Arduino 连接到的任何端口,可在 Windows 设备管理器中找到)
- Tools → Board → Arduino / Genuino Uno
在包含 Blink.ino 草图的 Arduino IDE 窗口中,单击复选标记以验证,然后单击箭头以上传。
上传完成后,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
再次单击复选标记以验证,然后单击箭头以上传。
使用 Arduino 串行监视器打开和关闭 Arduino LED
在包含 PhysicalPixel.ino 草图的 Arduino IDE 窗口中,通过转到 Tools → Serial Monitor 打开 Arduino Serial Monitor
在 Arduino Serial Monitor 中,键入:H
,然后单击发送(或按 Enter)。然后键入L
:并单击“发送”(或按 Enter)。字母H和L需要大写。当您单击发送或按 Enter 键时,您应该会看到 Arduino LED 打开和关闭。如果遇到问题,请确保在“tools”→“port”中正确设置端口,并确保串行监视器设置为 9600 波特。您也可以尝试拔下并重新插入Arduino,然后关闭然后重新打开Arduino IDE。
使用 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 会根据发送H
和L
打开和关闭,让我们编写一个 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。键入H
L
并观察Arduino LED的打开和关闭。键入q
以结束程序。