Входные контакты Raspberry pi GPIO дают случайные значения

12

В последнее время я много играл с Raspberry Pi. Но у меня есть проблема.

Когда я настраиваю входной контакт, чтобы проверить, посылается ли на него электричество или нет, это дает мне довольно нестабильные ответы.

Несколько замечаний, которые я сделал, чтобы прояснить мою проблему:

  1. Когда я подключаю цепь, и электричество поступает на входной контакт, значение, которое он мне дает, постоянно ИСТИНА или 1.

  2. Когда я разрываю цепь, удаляя светодиод, который является ее частью (когда входное значение должно быть 0), это дает мне случайные значения, смещаясь между 0 и 1.

  3. Когда я удаляю все кабели из моего Pi, это дает мне постоянное значение 0

  4. Если у меня отсоединены все кабели GPIO, это дает мне значение 0, но если я просто коснусь входного штырька металлической линией, ведущей к электричеству, (не приводя ни к чему на другом конце), он снова начнет со случайных значений. Это не дает мне случайные значения, если я не подключен к выходному контакту. Он не должен никуда вести, он просто должен касаться выходного контакта. И какой-то другой кусок металла должен касаться входного контакта. Нет никакой связи между ними.

Интересно, почему он начинает давать мне случайные значения, так как вывод Input GPIO касается любого металла.

И еще более интересно, почему это дает мне постоянные единицы или ИСТИНА, когда я на самом деле посылаю электричество?

Gustaf
источник
Изменить на утверждение № 4: Это не дает мне случайные значения, если у меня тоже есть что-то, связанное с выходной булавкой. Он не должен никуда вести, он просто должен касаться выходного контакта. И какой-то другой кусок металла должен касаться входного контакта. Между ними нет никакой связи
Густав
Добро пожаловать в Raspberry Pi Stack Exchange! Вы знаете, что можете отредактировать свой вопрос, чтобы исправить изменение этой информации вместо того, чтобы комментировать? Кроме того, время от времени заходите в чат. Мы всегда любим новую компанию, и это поможет показать, что этот сайт полезен, развивается и имеет вовлеченную базу пользователей. Благодарность!
RPiAwesomeness
1
Это потому, что контакты плавают. Более подробная информация на electronics.stackexchange.com/a/35705
Гербен,

Ответы:

14

Проблема

Когда я подключаю цепь, и электричество поступает на входной контакт, значение, которое он мне дает, постоянно ИСТИНА или 1.

Правда, но что происходит, когда заземление подключено к входному контакту GPIO? Значение, которое он дал бы, всегда будет ложным .

  • Когда питание подключено к входному контакту: входной контакт обнаруживает 1 (истина).
  • Когда заземление подключено к входному контакту: входной контакт обнаруживает 0 (ложь).
  • Когда к входному контакту ничего не подключено: входной контакт запутан.

Когда ничего не подключено, вывод находится в «плавающем» состоянии, а вывод не предсказуем. он находится в неопределенном состоянии, он не равен ни 0, ни 1, и обнаруженное значение может странным образом измениться, следовательно, ваши случайные результаты. В электронике это называется третьим состоянием .

Еще немного подробностей из статьи в Википедии :

В цифровых цепях выход с высоким импедансом (также известный как hi-Z, трехзначный или плавающий) не выводится на какой-либо определенный логический уровень выходной цепью. Сигнал не приводится ни к логическому высокому, ни к низкому уровню; это третье условие приводит к описанию "три-заявлено". Такой сигнал можно рассматривать как разомкнутую цепь (или «плавающий» провод).

Общее решение

Решением является понижающий резистор . Думайте об этом как о дополнительном компоненте, который ничего не делает, когда линия получает 0 или 1. Но когда линия простаивает, она внезапно начинает действовать и дает 0.

Раствор Raspberry Pi

К счастью для вас, Rpi имеет встроенный раскрывающийся список, вам нужно активировать его программно. Вот скрипт Python для этого:

import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
//Now your input is stable.

Примечание

Не подключайте питание напрямую к контакту, так как это опасно! Убедитесь, что в цепи достаточно сопротивления. Кроме того, никогда не подключайте питание 5 В непосредственно к GPIO, поскольку оно принимает только 3,3 В.

Привет, мир
источник
Знаете ли вы эквивалентный код C # при работе на основной платформе Windows 10 IoT?
Виджей Чавда
Этот ответ золотой! Thx
domih