Доброе утро
Я хочу подключить свою плату Arduino
к компьютеру с помощью pyFirmata lib
, но возникла странная проблема. Предпосылка: pySerial
и pyFirmata
успешно установлены на моем компьютере. У меня windows 8.0 64 bit
. Драйвера Arduino
и USB портов работают нормально (поскольку я могу загрузить любой скетч на Arduino
).
Код, который я хочу запустить, очень прост:
Если button
(подключенный к контакту 4, настроенному как вход method.get_pin()
от firmata library
) нажат, красный светодиод будет мигать, в противном случае будет работать зеленый светодиод. Я заставляю их мигать с помощью простой функции:
from time import sleep
def Blink(pin):
board.digital(pin).write(1)
sleep(1)
board.digital(pin).write(0)
sleep(1)
плата определена в глобальной области видимости как pyfirmata.Arduino('com3')
Все контакты работают нормально, так как я проверил их с помощью firmata_test.exe
, и я уверен, что ни одно последовательное соединение не открыто, прежде чем я запущу python.
Вот что странно:
Если я пишу каждую команду в оболочке Python, все работает нормально, светодиоды мигают правильно! НО, если я пишу все команды в модуль, а затем запускаю его, он выдает эту ошибку:
"Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
board = pyfirmata.Arduino('com3')
File "C:\Python27\lib\site-packages\pyfirmata\__init__.py", line 16, in __init__
super(Arduino, self).__init__(*args, **kwargs)
File "C:\Python27\lib\site-packages\pyfirmata\pyfirmata.py", line 89, in __init__
self.sp = serial.Serial(port, baudrate, timeout=timeout)
File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 38, in __init__
SerialBase.__init__(self, *args, **kwargs)
File "C:\Python27\lib\site-packages\serial\serialutil.py", line 282, in __init__
self.open()
File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 66, in open
raise SerialException("could not open port %r: %r" % (self.portstr, ctypes.WinError()))
SerialException: could not open port 'com3': WindowsError(5, 'Access denied.')"
То есть он не может открыть порт. Я пробовал некоторую отладку, но это мне не помогло.
Если я проверю состояние порта с помощью
por = serial.Serial()
por.port = 'com3'
por.isOpen()
>>False
НО, если я использую
por = serial.Serial('com3')
выскакивает та же ошибка.
Глядя Arduino
, светодиод TX регулярно мигает, поэтому я могу предположить, что он отправляет какие-то данные на последовательный порт. Если я открываю приложение Arduino, оно говорит мне, что порт занят. Я не могу понять, является ли это проблемой разрешений администратора, потому что я запускаю py IDLE от имени администратора. Даже если я запускаю скрипт из CMD в режиме администратора, ошибка остается.
Большое спасибо за каждый ответ.