Я использую библиотеку PIGPIO с Raspberry Pi 3, модель B +, последняя версия Raspbian и Python 2.7. На пи работает uWSGI и nginx. Я также использую колбу.
Важная информация внизу под РЕДАКТИРОВАТЬ
У меня проблема с демоном pigpio. Если я запускаю демон после загрузки,
systemctl status pigpio
выводит следующее:
pigpiod.service - Daemon required to control GPIO pins via pigpio
Loaded: loaded (/lib/systemd/system/pigpiod.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Я довольно новичок во всем этом, но, похоже, не в порядке.
После этого я импортирую pipgio в python и подключаюсь к демону (я просто пытался. Никогда не ожидал, что это сработает). Команда
<code>pigpio.pi().connected
выводит
True . Кажется, это нормально, за исключением того факта, что демон не активен. Если я наберу
<code>pigpio.pi().stop()
, соединение все еще активно. Такое поведение я не понимаю.
У меня вопрос, если я неправильно понимаю использование библиотеки.
Кроме того, настоящая причина этого поста в том, что я хочу контролировать GPIO. Для этого я написал следующий код.
import pigpio
from flask import Flask
from flask import render_template
from time import sleep
import RPi.GPIO as GPIO
import sys
from smbus2 import SMBus
import serial
@app.route("/forward/")
def forward():
try:
status = 0
endstatus = 1
while endstatus == 1:
response = "3"
if response == "2":
status = int(response)
elif response == "1":
status = int(response)
elif response == "3":
status = int(response)
# print(status)
if status == 3:
GPIO.output(Input3A, True)
GPIO.output(Input4A, True)
servo = 3
pi = pigpio.pi()
pi.set_mode(servo, pigpio.OUTPUT)
pi.set_servo_pulsewidth(servo, 1300)
if status == 1:
GPIO.output(Input3A, False)
GPIO.output(Input4A, False)
pi = pigpio.pi()
servo = 3
pi.set_servo_pulsewidth(servo, 1500)
pi.stop()
endstatus = 0
except KeyboardInterrupt:
pi = pigpio.pi()
all_off()
pi.stop()
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8080)
С этим кодом я могу запустить его только один раз. Если я нажму соответствующую кнопку, чтобы снова выполнить блок try, ничего не произойдет. После этого выводится журнал uWSGI:
(venv) root@raspberrypi:/home/pi/arc# tail /var/log/uwsgi/test_app_uwsgi.log
File "/home/pi/arc/venv/local/lib/python2.7/site-packages/flask/app.py", line 1799, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/pi/arc/movement.py", line 90, in forward
pi.set_mode(servo, pigpio.OUTPUT)
File "/home/pi/arc/venv/local/lib/python2.7/site-packages/pigpio.py", line 1340, in set_mode
return _u2i(_pigpio_command(self.sl, _PI_CMD_MODES, gpio, mode))
File "/home/pi/arc/venv/local/lib/python2.7/site-packages/pigpio.py", line 989, in _pigpio_command
sl.s.send(struct.pack('IIII', cmd, p1, p2, 0))
AttributeError: 'NoneType' object has no attribute 'send'
[pid: 321|app: 0|req: 2/2] 127.0.0.1 () {50 vars in 901 bytes} [Sun Jan 6 14:39:40 2019] GET /forward/ => generated 0 bytes in 170 msecs (HTTP/1.1 500) 0 headers in 0 bytes (0 switches on core 0)
и
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Can't connect to pigpio at localhost(8888)
Did you start the pigpio daemon? E.g. sudo pigpiod
Did you specify the correct Pi host/port in the environment
variables PIGPIO_ADDR/PIGPIO_PORT?
E.g. export PIGPIO_ADDR=soft, export PIGPIO_PORT=8888
Did you specify the correct Pi host/port in the
pigpio.pi() function? E.g. pigpio.pi('soft', 8888)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Я думаю, это может быть проблема с портом. Но я не настроил демон pigpio для прослушивания через порт 8889. Начиная с pigpiod -p 8889 start
, кажется, недостаточно.
Если я пытаюсь запустить демон с помощью следующей команды sudo pigpio -l -n 127.0.0.1
, вывод журнала uWSGI:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Can't connect to pigpio at localhost(8888)
Did you start the pigpio daemon? E.g. sudo pigpiod
Did you specify the correct Pi host/port in the environment
variables PIGPIO_ADDR/PIGPIO_PORT?
E.g. export PIGPIO_ADDR=soft, export PIGPIO_PORT=8888
Did you specify the correct Pi host/port in the
pigpio.pi() function? E.g. pigpio.pi('soft', 8888)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[pid: 320|app: 0|req: 2/2] 127.0.0.1 () {52 vars in 994 bytes} [Sun Jan 6 14:53:49 2019] GET / => generated 770 bytes in 5 msecs (HTTP/1.1 200) 2 headers in 80 bytes (1 switches on core 0)
[pid: 320|app: 0|req: 3/3] 127.0.0.1 () {48 vars in 846 bytes} [Sun Jan 6 14:59:50 2019] GET / => generated 766 bytes in 8 msecs (HTTP/1.1 200) 2 headers in 80 bytes (1 switches on core 0)
[pid: 320|app: 0|req: 4/4] 127.0.0.1 () {52 vars in 994 bytes} [Sun Jan 6 14:59:50 2019] GET / => generated 766 bytes in 8 msecs (HTTP/1.1 200) 2 headers in 80 bytes (1 switches on core 0)
/home/pi/arc/movement.py:54: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
GPIO.setup(Input1A, GPIO.OUT)
/home/pi/arc/movement.py:58: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
GPIO.setup(Input1B, GPIO.OUT)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Can't connect to pigpio at localhost(8888)
Can't create callback thread.
Perhaps too many simultaneous pigpio connections.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Traceback (most recent call last):
File "/home/pi/arc/venv/local/lib/python2.7/site-packages/flask/app.py", line 2309, in __call__
return self.wsgi_app(environ, start_response)
File "/home/pi/arc/venv/local/lib/python2.7/site-packages/flask/app.py", line 2295, in wsgi_app
response = self.handle_exception(e)
File "/home/pi/arc/venv/local/lib/python2.7/site-packages/flask/app.py", line 1741, in handle_exception
reraise(exc_type, exc_value, tb)
File "/home/pi/arc/venv/local/lib/python2.7/site-packages/flask/app.py", line 2292, in wsgi_app
response = self.full_dispatch_request()
File "/home/pi/arc/venv/local/lib/python2.7/site-packages/flask/app.py", line 1815, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/pi/arc/venv/local/lib/python2.7/site-packages/flask/app.py", line 1718, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/home/pi/arc/venv/local/lib/python2.7/site-packages/flask/app.py", line 1813, in full_dispatch_request
rv = self.dispatch_request()
File "/home/pi/arc/venv/local/lib/python2.7/site-packages/flask/app.py", line 1799, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/pi/arc/movement.py", line 90, in forward
pi.set_mode(servo, pigpio.OUTPUT)
File "/home/pi/arc/venv/local/lib/python2.7/site-packages/pigpio.py", line 1340, in set_mode
return _u2i(_pigpio_command(self.sl, _PI_CMD_MODES, gpio, mode))
File "/home/pi/arc/venv/local/lib/python2.7/site-packages/pigpio.py", line 989, in _pigpio_command
sl.s.send(struct.pack('IIII', cmd, p1, p2, 0))
AttributeError: 'NoneType' object has no attribute 'send'
[pid: 320|app: 0|req: 5/5] 127.0.0.1 () {50 vars in 901 bytes} [Sun Jan 6 15:02:38 2019] GET /forward/ => generated 0 bytes in 165 msecs (HTTP/1.1 500) 0 headers in 0 bytes (0 switches on core 0)
Я провел много исследований, но я застрял.
EDIT:
У меня теперь больше информации. После многих тестов я обнаружил, что главная проблема в том, что я не могу выполнить скрипт на python с импортированным pigpio дважды. Скрипт будет выполнен через uwsgi, nginx и flask. Это простая кнопка на веб-сайте, которая перенаправляет через ajax скрипт на пи.
После первого выполнения скрипт делает то, что должен делать. Но если я затем выполню другой скрипт с pigpio и так далее, я получу следующую ошибку:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Can't connect to pigpio at localhost(8888)
Can't create callback thread.
Perhaps too many simultaneous pigpio connections.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Traceback (most recent call last):
File "motor_stopp.py", line 37, in <module>
all_off()
File "motor_stopp.py", line 21, in all_off
pi.set_mode(servo, pigpio.OUTPUT)
File "/usr/lib/python2.7/dist-packages/pigpio.py", line 1296, in set_mode
return _u2i(_pigpio_command(self.sl, _PI_CMD_MODES, gpio, mode))
File "/usr/lib/python2.7/dist-packages/pigpio.py", line 983, in _pigpio_command
sl.s.send(struct.pack('IIII', cmd, p1, p2, 0))
AttributeError: 'NoneType' object has no attribute 'send'
Если я тогда перезапустить uwsgi с kill -HUP pid
, я могу запустить другой скрипт на python. Теперь я могу перезапускать UWSGI каждый раз, после блока кода. Кажется, это решило бы мою проблему. Но это не совсем решение.
Может быть, uwsgi и pigpio используют один и тот же порт?
И если да, то как я могу изменить порт в одной из библиотек?