Металл2024 Реклама
Метобр2024 Реклама

Делаем кнопку stop для octoprint на Raspberry pi

Zealot01
Идет загрузка
Загрузка
18.01.2021
2052
4
Личные дневники

Подпишитесь на автора

Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.

Отписаться от уведомлений вы всегда сможете в профиле автора.

0

Всем привет!

Чтобы оперативно остановить текущую печать решил сделать физическую кнопку остановки. Действие аналогично кнопке Cancel веб-интерфейса.

Берем обычную тактовую кнопку и резистор 1кОм.  На тестах выяснилось, что  цифровой вход необходимо подключить на землю через керамический конденсатор примерно на 0.1мкФ , иначе могут идти ложные срабатывания кнопки от помех.

Делаем кнопку stop для octoprint на Raspberry pi

Делал навесной пайкой:

Делаем кнопку stop для octoprint на Raspberry pi

Подключаем к малинке. В /home/pi/scripts/button_stop.py создаем код обработки кнопки и остановки печати через API октопринта:

import RPi.GPIO as GPIO

import requests

import sys

import json

import signal

import time

apikey="Ваш апикей"

host="127.0.0.1"

port=5000

pin_button=20 # пин кнопки

class OctoprintAPI: 

    def __init__(self, address, port, api_key):

        self.host = address

        self.s = requests.Session()

        self.s.headers.update({'X-Api-Key': api_key,

                               'Content-Type': 'application/json'})

        self.base_address = 'http://' + address + ':' + str(port)

    def cancel_job(self):

        r = self.s.post(self.base_address + '/api/job', json={'command': 'cancel'})

        if r.status_code != 204:

            raise Exception("Error: {code} - {content}".format(code=r.status_code, content=r.content.decode('utf-8')))

def run_and_handle(method, *_args):

    try:

        result = method(*_args)

    except:

        pass

def button_callback(channel):

    if GPIO.input(pin_button):

        octo_api = OctoprintAPI(host, port, apikey)

        run_and_handle(octo_api.cancel_job)

GPIO.setmode(GPIO.BCM)

GPIO.setup(pin_button, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

GPIO.add_event_detect(pin_button,GPIO.RISING,callback=button_callback)

try:

    signal.pause()

    GPIO.remove_event_detect(pin_button)

    GPIO.cleanup()

except:

    GPIO.remove_event_detect(pin_button)

    GPIO.cleanup()

В  button_callback необходимо проверять состояние кнопки с помошью if GPIO.input(pin_button): так как событие GPIO.RISING спрабатывает почему-то два раза: на нажатие и отпускание кнопки. 

Скрипт для запуска, можно закинуть в rc.local. 

#!/bin/sh

cd /home/pi/scripts/

sudo python3 ./button_stop.py &

Подпишитесь на автора

Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.

Отписаться от уведомлений вы всегда сможете в профиле автора.

0
Комментарии к статье
Кремень КБ Реклама
Кремень КМ Реклама