开发环境: LattePanda(拿铁熊猫)开发板, arduino, windows10
开发语言: python3.7,
首先说一下思路,这里的控制思路是通过对mcu中烧录 Firmata协议的控制代码(同官方),然后再通过python的 pymata模块根据firmata协议对mcu进行信息发送达成mpc与mcu的信息交互, 从而达到控制 gpio 13口, 由于13口的状态对应着下图开发板上亮着的那个蓝色的指示灯,所以我们对13口进行上拉下拉操作可以使得其进行闪烁.
更详细,原理说明,参考这篇博文,和以下资料
传送门
firmata协议测试客户端: 传送门
firmata的github官方说明
firmata对应arduino使用源码
python的firmata模块调用firmata源码
参考链接1
参考链接2
参考链接3
LattePanda.Firmata是 LattePanda 提供的开源 Firmata 库,适用于在 Visual Studio 中开发的 Windows 应用程序。此类允许您从 Windows 应用程序控制 Arduino GPIO,其功能包括:
读取和写入数字引脚
读取模拟输入
控制伺服电机
通过 I2C 总线向设备发送数据和从设备接收数据 传送门
区域 U1 中的引脚分配给 X-Z8300 内核。
U2 区的引脚分配给 ATmega32u4 内核。区域 U2 中的 20 个数字引脚(A0 - A5、D0 - D13)中的每一个都可以用作输入或输出,每个引脚的工作电压为 5 伏。每个引脚可以输出或接收 40 mA 电流,并且每个引脚都有一个 20-50k 欧姆的内部上拉电阻(默认断开)。 注意:任何 I/O 引脚上的电流超过 40mA 可能会对 ATmega32u4 造成永久性损坏。
一些引脚具有专门的功能:
模拟输入: A0 - A5、A6 - A11(在 D4、D6、D8、D9、D10 和 D12 上)。LattePanda 有 12 个模拟输入,标记为 A0 到 A11,所有这些都可以用作数字 I/O(输入/输出)。每个引脚具有 10 位分辨率(即 1024 个不同的值)。默认情况下,它们的电压从地面测量到 5 伏。
串行: D0 (RX) 和 D1 (TX)。用于接收(RX)和发送(TX)TTL串行数据。
外部中断: D3(中断0)、D2(中断1)、D0(中断2)、D1(中断3)和D7(中断4)。这些引脚可配置为在测量低值、上升沿或下降沿或值变化时触发中断。
PWM: D3、D5、D6、D9、D10 和 D13 提供 8 位 PWM 输出。
SPI: D16 (MOSI)、D14 (味噌)、D15 (SCK)。
LED: D13 有一个由数字引脚 13 驱动的内置 LED。
TWI: D2(SDA)、D3(SCL)。板上的其他引脚:
复位:使LOW 线复位微控制器。通常用于向屏蔽添加重置按钮,该按钮可以阻止 SBC 上的功能。
拿铁熊猫上ide推荐
由于 pycharm之类的安装到 拿铁熊猫上太大了,这里使用的 thonny
并配置anaconda 环境如下图
选择物理编程,安步骤配置环境
我这里的是 lattePanda V1.0
注意按照物理编程的说明,记得让windows处于开发者模式,然后根据手册所说将代码通过 arduino 上传进 mcu 中
传送门
其实就在python环境下pip install 安装就行了(使用anaconda的同学,记得对于自己创建的环境使用, conda activate 你创建的环境名称 在cmd中进行切换),总之你要保证thonny的python解释器和你配置的python环境一致.
**
**(代码来自参考链接里面)
#!/usr/bin/env python3
import time
import sys
import signal
from PyMata.pymata import PyMata
# Digital pin 13 is connected to an LED. If you are running this script with
# an Arduino UNO no LED is needed (Pin 13 is connected to an internal LED).
BOARD_LED = 13
# Create a PyMata instance
board = PyMata("COM5", verbose=True)
def signal_handler(sig, frame):
print('You pressed Ctrl+C')
if board is not None:
board.reset()
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
# Set digital pin 13 to be an output port
board.set_pin_mode(BOARD_LED, board.OUTPUT, board.DIGITAL)
time.sleep(2)
print("Blinking LED on pin 13 for 10 times ...")
# Blink for 10 times
for x in range(10):
print(x + 1)
# Set the output to 1 = High
board.digital_write(BOARD_LED, 1)
# Wait a half second between toggles.
time.sleep(.5)
# Set the output to 0 = Low
board.digital_write(BOARD_LED, 0)
time.sleep(.5)
# Close PyMata when we are done
board.close()
读数据例子
#!/usr/bin/env python3
import time
import sys
import signal
from PyMata.pymata import PyMata
# Digital pin 13 is connected to an LED. If you are running this script with
# an Arduino UNO no LED is needed (Pin 13 is connected to an internal LED).
BOARD_LED0 = 0
BOARD_LED1 = 1
# Create a PyMata instance
board = PyMata("COM3", verbose=True)
def signal_handler(sig, frame):
print('You pressed Ctrl+C')
if board is not None:
board.reset()
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
# board.set_pin_mode(BOARD_LED0, board.OUTPUT, board.DIGITAL)
board.set_pin_mode(BOARD_LED0, board.INPUT, board.DIGITAL)
board.set_pin_mode(BOARD_LED1, board.INPUT, board.DIGITAL)
time.sleep(2)
i = 0
limit_num = input("输入脉冲数: ")
limit_num = eval(limit_num)
a1 = 0
while True:
a = board.digital_read(BOARD_LED0)
b = board.digital_read(BOARD_LED1)
print("零号:" + str(a))
print("一号:" + str(b))
if a>b:
print("正向")
else:
print("反向")
if a != a1:
a1 = a
i = i + 1
if i <= limit_num:
i = 0
limit_num = input("输入脉冲数: ")
limit_num = eval(limit_num)
# Close PyMata when we are done
board.close()