8 мая 2020 г.

CubieBoard2 делаем кнопки I


Есть одна мысль с кнопками и лампочками на кубике.
Для начала решил получить простую программу:
Нажимаем кнопку - лампочка начинает переливаться (трех-контактный светодиод) красный-красный+зеленый-зеленый. нажимаем снова - выключается.




Расчеты резисторов на диод (ARL-5013URGC/3L):

Сеть 3.3
Красный 2В 0,02 (max) 0,01 (min)
Зеленый 3В 0,02 (max) 0,01 (min)

Красный R=(3.3-2)/0.01=130Ом
P=1.3*0.01=0.013=Обоб 0,25Вт
Красный R=(3.3-2)/0.02=65Ом
P=1.3*0.02=0.026=Обоб 0,25Вт

Зеленый R=(3.3-3)/0.01=30Ом
P=0.3*0.01=0.003=Обоб 0,25Вт
Зеленый R=(3.3-3)/0.02=15Ом
P=0.3*0.02=0.006=Обоб 0,25Вт

подготовка

Листинг скрипта:

#!/usr/bin/env python
import SUNXI_GPIO as GPIO
import time
import logging
from threading import Thread
from Queue import Queue

#GPIO.setmode(GPIO.BCM)

RED_LED = GPIO.PD1
GREEN_LED = GPIO.PD2
IN_KEY = GPIO.PD0

GPIO.init()
GPIO.setcfg(RED_LED, GPIO.OUT)
GPIO.setcfg(GREEN_LED, GPIO.OUT)
GPIO.setcfg(IN_KEY, GPIO.IN)

runJob=Queue(1)

def blink_led(runJob):
    nowJob=False
    logging.basicConfig(filename="blink_led.log", level=logging.INFO)
    while True:
        if runJob.empty() == False:
            nowJob=runJob.get()
            if nowJob is None:
                break
            logging.info(nowJob)
        if nowJob==True:
            logging.info(nowJob)
            GPIO.output(RED_LED, GPIO.HIGH)
            time.sleep(1)
            GPIO.output(GREEN_LED, GPIO.HIGH)
            time.sleep(1)
            GPIO.output(RED_LED, GPIO.LOW)
            time.sleep(1)
            GPIO.output(GREEN_LED, GPIO.LOW)
            time.sleep(1)
        else:
            GPIO.output(GREEN_LED, GPIO.LOW)
            GPIO.output(RED_LED, GPIO.LOW)

LedJob = Thread(target=blink_led, args=(runJob,))
LedJob.start()

stateJob=False
while True:
    state=True #Checking that state pin GPIO do not has changed (contact bounce)
    if GPIO.input(IN_KEY) == False:
       state=False
       time.sleep(0.1)
       if  GPIO.input(IN_KEY) == state:
            print 'Key pressed.'
            if stateJob == False:
                runJob.put(True)
                stateJob=True
                print 'runJob'
            else:
                runJob.put(False)
                stateJob=False
                print 'Stop'
            print stateJob
runJob.put(None)
LedJob.join()

Здесь в потоке проверяем  переменную из очереди и если Истина мигаем лампочкой.
Также добавлено логирование потока для дебаггинга.
time.sleep(0.1) - создан для решения проблемы с дребезгом контактов (подробнее и о стягивающих/подтягивающих резисторах туда же) аппаратно решить пока не удалось.
Данный вариант не может прослушивать более одной кнопки, поэтому он мне не очень подходит, но это следующий этап.

Внес некоторые изменения. Весь блок проверки пина вывел в функцию и запустил вторым потоком. Дабы скрипт не завершался - установил бесконечный цикл со слипом, может есть вариант кашерней? в таком виде можно запустить мониторинг нескольких кнопок

#!/usr/bin/env python
import SUNXI_GPIO as GPIO
import time
import logging
from threading import Thread
from Queue import Queue

#GPIO.setmode(GPIO.BCM)

RED_LED = GPIO.PD1
GREEN_LED = GPIO.PD2
IN_KEY = GPIO.PD0

GPIO.init()
GPIO.setcfg(RED_LED, GPIO.OUT)
GPIO.setcfg(GREEN_LED, GPIO.OUT)
GPIO.setcfg(IN_KEY, GPIO.IN)

runJob=Queue(1)

def blink_led(runJob):
    nowJob=False
    logging.basicConfig(filename="blink_led.log", level=logging.INFO)
    while True:
        if runJob.empty() == False:
            nowJob=runJob.get()
            if nowJob is None:
                break
            logging.info(nowJob)
        if nowJob==True:
            logging.info(nowJob)
            GPIO.output(RED_LED, GPIO.HIGH)
            time.sleep(1)
            GPIO.output(GREEN_LED, GPIO.HIGH)
            time.sleep(1)
            GPIO.output(RED_LED, GPIO.LOW)
            time.sleep(1)
            GPIO.output(GREEN_LED, GPIO.LOW)
            time.sleep(1)
        else:
            GPIO.output(GREEN_LED, GPIO.LOW)
            GPIO.output(RED_LED, GPIO.LOW)

def check_button(runJob):
    stateJob=False
    while True:
        state=True #Checking that state pin GPIO do not has changed (contact bounce)
        if GPIO.input(IN_KEY) == False:
           state=False
           time.sleep(0.1)
           if  GPIO.input(IN_KEY) == state:
                print 'Key pressed.'
                if stateJob == False:
                    runJob.put(True)
                    stateJob=True
                    print 'runJob'
                else:
                    runJob.put(False)
                    stateJob=False
                    print 'Stop'
                print stateJob

LedJob = Thread(target=blink_led, args=(runJob,))
ButtonJob = Thread(target=check_button, args=(runJob,))
LedJob.start()
ButtonJob.start()

while True:
    time.sleep(1)
runJob.put(None)
LedJob.join()
ButtonJob.join()


Комментариев нет:

Отправка комментария