демон pigpio не активен, хотя соединение все еще существует - PullRequest
0 голосов
/ 06 января 2019

Я использую библиотеку 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 используют один и тот же порт? И если да, то как я могу изменить порт в одной из библиотек?

...