Squeak.ru - шаблоны программирования

Обнаружение и сравнение событий GPIO в Beaglebone с использованием Python

Я пытаюсь обнаружить два события в двух разных GPIO в Beaglebone Black, а затем решить, какое из них произошло первым. Я использую Adafruit_BBIO.GPIO для кода, написанного на Python. Он не работает должным образом, и я понятия не имею, почему. Вот код:

import sys
import thread
import time
from datetime import datetime
import bitarray
import Adafruit_BBIO.GPIO as GPIO

gpio_state = [0, 0]
gpio_time = [0, 0]
ir_recv = ['GPIO0_26', 'GPIO1_12']

def checkEvent(index):
    while True:
        if GPIO.event_detected(ir_recv[index]): 
            if (gpio_state[index] == 0):
                gpio_state[index] = 1
                gpio_time[index] = datetime.now()
                print ir_recv[index]
                time.sleep(5) # time to avoid rebounces

for gpio in ir_recv:
    GPIO.setup(gpio, GPIO.IN)
    GPIO.add_event_detect(gpio, GPIO.RISING)

try:
    thread.start_new_thread(checkEvent, (0, ) )
    thread.start_new_thread(checkEvent, (1, ) )
except:
    print "Error: unable to start thread"

while True:
    if (gpio_state[0] == 1) and (gpio_state[1] == 1):
        if gpio_time[0] > gpio_time[1]:
            print "1"
        if gpio_time[0] < gpio_time[1]:
            print "2"
        if gpio_time[0] == gpio_time[1]:
            print "???"
        gpio_state[0] = 0
        gpio_state[1] = 0
        gpio_time[0] = 0
        gpio_time[1] = 0

Я не получаю никакой ошибки. Основная проблема заключается в том, что события не сравниваются правильно, например. хотя событие в GPIO0_26 происходит раньше, чем в GPIO1_12 (т. е. gpio_time[0] меньше, чем gpio_time[1]), вывод в последнем цикле While не выводит «2». Также иногда код дважды выводит вывод GPIO из потоков.

Заранее спасибо за любое предложение найти решение.


  • вы получили какую-либо ошибку. или не получение ожидаемых результатов, если да, пожалуйста, укажите исходные данные и ожидаемые результаты 17.07.2014
  • @sundarnatarajСундар : добавил мою проблему 17.07.2014
  • Оба потока находятся в быстром цикле ожидания, если нет данных GPIO. Рассмотрите возможность добавления time.sleep(0.01) или найдите способ заблокировать GPIO.event_detected() 17.07.2014
  • Рассмотрите возможность использования возможности ядра создавать события ввода GPIO (с отметкой времени). См. эту статью. 18.07.2014

Ответы:


1

Я бы рекомендовал использовать для этого PyBBIO (конечно, я автор). Он имеет API-интерфейс прерывания, основанный на epoll (для сигнализации прерывания на уровне ядра), и это сильно бы упростило. Что-то вроде этого должно помочь (я не проверял):

from datetime import datetime
from bbio import *

gpio_state = [0, 0]
gpio_time = [0, 0]
ir_recv = ['GPIO0_26', 'GPIO1_12']

def getInterrupt(index):
    gpio_time[index] = datetime.now()
    gpio_state[index] = 1
    print "received interrupt from {} at {}".fomrat(ir_recv[index],
                                                    gpio_time[index]
                                                    )

def setup():
    for i in range(len(ir_recv)):
      pinMode(ir_recv[i], INPUT, pull=-1)
      # The optional pull=-1 enables the internal pull-down resistor

    attachInterrupt(ir_recv[0], lambda: getInterrupt(0), RISING)
    attachInterrupt(ir_recv[1], lambda: getInterrupt(1), RISING)


def loop():
    # You can do other stuff here while you're waiting...
    delay(1000)

run(setup, loop)

И вы должны убедиться, что ваш PyBBIO обновлен:

# pip install -U PyBBIO
05.11.2015
Новые материалы

Угловая структура архитектуры
Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

«Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

Создайте API с помощью Python FastAPI
Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

Веселье с прокси-сервером JavaScript
Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...