首页 > 解决方案 > 定义引脚时的 InvalidPinDefError

问题描述

我正在尝试使用 pyfirmata 在 Arduino Uno R3 和我的 python 程序之间发送和接收数据。在 Arduino 安装了 StandartFirmata 草图。代码是:

from time import sleep
import serial
import pyfirmata
com_port_number = str(int(input('Введите номер COM-порта ')))
port = 'COM' + com_port_number   # COM port number
print('Выбран порт COM ', port)
try:
        board = pyfirmata.Arduino(port)
except serial.SerialException:
        print('Не удается подключится к выбранному COM-порту')
        com_port_number = str(int(input('Введите номер СОМ-порта')))
        port = 'COM' + com_port_number
        board = pyfirmata.Arduino(port)
sleep(1)
it = pyfirmata.util.Iterator(board)
it.start()
temp_list = []
potentiomentr = board.get_pin('a:0:o')
acid_control = board.get_pin('a:2:o')
stock_control = board.get_pin('a:3:o')
temperature_pin = board.get_pin('d:4:i')    # well, this line is worked fine. Temperature sensor works correctly
in_connection_pc = board.get_pin('d:0:o')   #but now i have InvalidPinDefError
triac = board.get_pin('d:6:o')
level = board.get_pin('d:8:i')
in_engine = board.get_pin('d:5:o')
in_triac = board.get_pin('d:10:o')
in_pump = board.get_pin('d:11:o')
drive_control = board.get_pin('d:12:o')
pump_control = board.get_pin('d:13:o')
while 1:   # бесконечный цикл
    a = temperature_pin.read()
    b = in_connection_pc.write(1)
    print(a)
    list.append(a,b)
    print(list)
    sleep(3)
board.exit()

但我有一些奇怪的错误:

Traceback (most recent call last):
  File "C:/Users/lomil/PycharmProjects/Pyython_and_CSV_love/test_analog.py", line 22, in <module>
    in_connection_pc = board.get_pin('d:0:i')   #but now i have InvalidPinDefError??
  File "C:\Users\lomil\Python_32\lib\site-packages\pyfirmata\pyfirmata.py", line 220, in get_pin
    raise InvalidPinDefError('Invalid pin definition: UNAVAILABLE pin {0} at position on {1}'.format(pin_def, self.name))
pyfirmata.pyfirmata.InvalidPinDefError: Invalid pin definition: UNAVAILABLE pin d:0:i at position on COM1

当我评论所有行时,除了

temperature_pin = board.get_pin('d:4:i') 

它有效,但我无法理解其他引脚有什么问题。当我向 Arduino 编写测试草图时,它们非常好并且工作正常。

标签: pythonarduinoarduino-unofirmata

解决方案


错误消息实际上是在抱怨:UNAVAILABLE pin d:0:i at position on COM1. 在 Arduino Uno(和大多数 Arduino)上,数字引脚 0 和 1 是两用引脚,也用于通过串行端口(即 COM 端口)进行通信

Firmata 通过不断地通过串行端口进行通信来工作,因此在使用 Firmata 时,您实际上不能将数字引脚 0 和 1 用于其他任何事情。

因此,无论您在 Arduino 的数字引脚 0 上插入了什么线,您都需要移动到另一个未使用的数字引脚,例如引脚 3。因此,如果您将该线移动到数字引脚 3,那么在代码中您现在需要in_connection_pc = board.get_pin('d:3:o').


推荐阅读