GPIO python脚本,当服务文件或cron

2024-10-04 09:26:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个简单的web服务器来控制一个小马达。当我通过命令行直接运行脚本时,一切都按预期运行。当我在服务文件中运行它时,当脚本响应POST命令时,马达没有运行。在根用户(sudo crontab-e)下通过cron@reboot启动时,会产生相同的结果,但没有电机控制

脚本:

#!/usr/bin/env python3

from http.server import BaseHTTPRequestHandler, HTTPServer
import urllib
import threading
import json
import cgi
import time 
import RPi.GPIO as GPIO


GPIO.cleanup() #cleaning up in case GPIOS have been preactivated
# Use BCM GPIO references
# instead of physical pin numbers
GPIO.setmode(GPIO.BCM)
 # be sure you are setting pins accordingly
# GPIO10,GPIO9,GPIO11,GPI25
control_pins = [10,9,11,25]
 
# Set all pins as output
for pin in control_pins:
  GPIO.setup(pin,GPIO.OUT)
  GPIO.output(pin, False)

#define halftep sequance
halfstep_seq = [
  [1,0,0,0],
  [1,1,0,0],
  [0,1,0,0],
  [0,1,1,0],
  [0,0,1,0],
  [0,0,1,1],
  [0,0,0,1],
  [1,0,0,1]
]

bRunLeft = False
bRunRight = False

#wait some time to start
time.sleep(0.5)
def clearpins():
    for pin in control_pins:
        GPIO.output(pin, 0)

def spin_servo(dir):
    print('Starting spin {}'.format(dir))
    if dir == 'left':
        while bRunLeft:
            for halfstep in range(8):
                for pin in range(4):
                    GPIO.output(control_pins[pin], halfstep_seq[halfstep][pin])
                    time.sleep(0.001)
    elif dir == 'right':
        while bRunRight:
            for halfstep in reversed(range(8)):
                for pin in range(4):
                    GPIO.output(control_pins[pin], halfstep_seq[halfstep][pin])
                    time.sleep(0.001)
    clearpins()

class WebServerHandle(BaseHTTPRequestHandler):
    def _set_response(self):
        self.send_response(200)
        self.send_header('Access-Control-Allow-Origin', '*')
        self.send_header('Content-type', 'application/json')
        self.end_headers()

    def do_POST(self):
        global bRunLeft
        global bRunRight
        res = {}
        length = int(self.headers['Content-Length'])
        ctype, pdict = cgi.parse_header(self.headers['content-type'])
        # refuse to receive non-json content
        if ctype != 'application/json':
            self.send_response(400)
            self.end_headers()
            return
        res['received'] = 'ok'
        o = json.loads(self.rfile.read(length).decode('utf-8'))
        # You now have a dictionary of the post data
        if o['move'] == 'left':
            bRunRight = False
            if bRunLeft == False:
                l = threading.Thread(target=spin_servo, args=('left',))
                l.start()
                bRunLeft = True
            else:
                bRunLeft = False
        if o['move'] == 'right':
            bRunLeft = False
            if bRunRight == False:
                r = threading.Thread(target=spin_servo, args=('right',))
                r.start()
                bRunRight = True
            else:
                bRunRight = False
        self._set_response()
#       self.wfile.write("POST request for {}".format(self.path).encode('utf-8'))
        self.wfile.write(json.dumps(res).encode('utf-8'))
        
    def do_OPTIONS(self):
        self.send_response(200)
        self.send_header('Allow', 'GET, OPTIONS')
        self.send_header('Access-Control-Allow-Origin', '*')
        self.send_header('Access-Control-Allow-Headers', 'X-Request, X-Requested-With, Content-type, content-type')
        self.send_header('Content-Length', '0')
        self.end_headers()

def main():
    try:
        server = HTTPServer(('', 8080), WebServerHandle)
        print("Starting web server on the port 8080..")
        server.serve_forever()
    except KeyboardInterrupt:
        print('^C entered. Shutting down the server..')
        server.socket.close()
        GPIO.cleanup()


if __name__ == '__main__':
    main()

服务文件

[Unit]
Description=Simple servo web controller
After=network.target

[Service]
User=root
WorkingDirectory=/home/pi/streamer
ExecStart=/home/pi/streamer/servo_server.py
Restart=on-failure

[Install]
WantedBy=multi-user.target

Tags: inimportselfsendfalseforgpioif