Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Python + GPIO нужен совет  (Прочитано 2253 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Vlad.V

  • Автор темы
  • Активист
  • *
  • Сообщений: 478
    • Просмотр профиля
Python + GPIO нужен совет
« : 25 Сентября 2013, 11:27:14 »
Доброе время суток! Если есть люди, которые в этом понимают хоть чуть-чуть прошу подсказать. Купил себе Raspberry Pi, поиграться. Хочу научится использовать GPIO в своих целях. Т.к. в программировании я новичок решил использовать Python, и с GPIO разберусь и с Python.

Почитав сайты на эту тему решил попробовать сделать что-то сам. Написал вот такой скрипт:

#!/usr/bin/python
#-*- coding: UTF8 -*-
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(7, GPIO.IN)
GPIO.setup(7, GPIO.IN, pull_up_down=GPIO.PUD_UP)
signal = GPIO.input(7)
print(signal)

   
while True :
   
    current_state = GPIO.input(7)
   
    if current_state!=1:
      print("!",signal)
      time.sleep(5)
     

На русском это звучит так: Слушаем GPIO 7 и если на нем 0, выводим на экран его статус, ждем 5 секунд и снова слушаем GPIO 7.
Но тут подкралась проблема, если убрать "while True" и все что ниже, а оставить только это:
#!/usr/bin/python
#-*- coding: UTF8 -*-
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(7, GPIO.IN)
GPIO.setup(7, GPIO.IN, pull_up_down=GPIO.PUD_UP)
signal = GPIO.input(7)
print(signal)
То на GPIO 7 действительно постоянно есть 1, и переходит он в 0 только тогда когда я замыкаю GPIO 7(на нем 3.3в) на землю, проверял несколько раз!!!
Но если я добавляю в код эту часть:
while True :
   
    current_state = GPIO.input(7)
   
    if current_state!=1:
      print("!",signal)
      time.sleep(5)
То получаю странное поведение. Стоит мне на порт GPIO 7 надеть перемычку, просто надеть не замыкать на землю, я получаю вывод на экран "0"!
Вопрос как?! Наводок быть не может, т.к. там 3.3в, т.е. 1, а чтобы убрать 1 нужно его замкнуть на землю + к этому, если отсутствует блок while True, то на порту постоянно есть 1, хоть с перемычкой, хоть без нее. Значит что-то не так написал, но смотрел примеры ошибок не нашел.
Помогите, уже 2 ночь спать не могу, мучает меня эта зараза.

Заранее спасибо!

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: Python + GPIO нужен совет
« Ответ #1 : 27 Сентября 2013, 14:16:14 »
Не знаю  Raspberry Pi и что Вы хотите, но попробую проверить свои экстрасенсоные способности ответить:
- значение signal разово считывается, до вхождения в бесконечный цикл (и не модернизируется)
signal = GPIO.input(7)А выводите Вы этот сигнал. Это однозначно баг.
- сравнение для вывода на печать со значением не равным единице это как-то бессмысленно выглядит.
Я не в курсе функции GPIO.input, но подозреваю, что это чтение 7 бита порта ВВ.


« Последнее редактирование: 27 Сентября 2013, 14:23:32 от alexander.pronin »

Оффлайн Vlad.V

  • Автор темы
  • Активист
  • *
  • Сообщений: 478
    • Просмотр профиля
Re: Python + GPIO нужен совет [SOLVED]
« Ответ #2 : 27 Сентября 2013, 18:21:31 »
Спасибо за ответ! Вы правы!! На 100% Я сегодня на свежую голову еще раз просмотрел код и увидел эту же ошибку. Огромное спасибо Вам за наблюдательность и желание помочь, ведь Вы единственный кто разглядел этот баг среди 2х форумов, техподдержки и одного блогера. А иногда бывает, как это говорят "смотрю в книгу - вижу фигу", т.е. тупо не видел этой опечатки. Наверное сказалось 2 ночи без нормального сна)))

И код я чуть-чуть поменял, может кому пригодится
#!/usr/bin/python
#-*- coding: UTF8 -*-
#Подтяжка к +3.3в через внутренний резистор, получаем 1 в разомкнутом состоянии и 0 в замкнутом.


import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)

port_num = [4,7,8,9,10,11,14,15,17,18,22,23,24,25,27]

for i in port_num:
    GPIO.setup((i), GPIO.IN)
    print "Port #", (i), "is activ and set to IN"
   
# Подтягиваем порты к +3.3
for i in port_num:
    GPIO.setup((i), GPIO.IN, pull_up_down=GPIO.PUD_UP)
    print "Port #", (i), "Pulled-up to 3.3v"

while True:

  for i in port_num:
    port = i
    signal = GPIO.input((i))
    if signal == 1:
      print("Activated",port,signal)
      time.sleep(0.5)


 

Страница сгенерирована за 0.017 секунд. Запросов: 22.