Arduino digitalЧитать неправильно


10

Я настроил свой Arduino UNO с 4 входными проводами, они подключаются к порту 10, 11, 12, 13, они подключены к моему макету, на котором ничего нет, кроме провода.

Мой код будет просто:

Serial.println(digitalRead(13));
Serial.println(digitalRead(12));
Serial.println(digitalRead(11));
Serial.println(digitalRead(10));

Дело в том, что после того, как я ненадолго подключу контакт к 5V или 3V3, показания начнут сходить с ума, как: 1 0 0 1 0 1 1 1 0 1 0 1 1 0 Без какого-либо смысла! Без подключения какого-либо провода напрямую к моему VCC (5 В или 3 В 3) показания постоянно меняются, когда они должны быть равны нулю!

Мой Arduino мертв? Как я могу это исправить?


Просто подключите ваш пусковой контакт к земле, когда не сработал!

Ответы:


18

То, что у вас есть, называется Floatingбулавкой. Выводы цифрового входа очень чувствительны к изменениям, и, если они не будут положительно переведены в то или иное состояние (высокое или низкое), они будут забирать паразитную емкость из близлежащих источников, таких как макеты, человеческие пальцы или даже воздух. Любой подключенный к нему провод будет действовать как маленькая антенна и вызывать изменение состояния входа. И я имею в виду любой провод, след на плате, провод к макету, контакт буфера, даже металлический штырь самой ИС.

Это указано на странице ссылок Arduino:

Если вывод не подключен ни к чему, digitalRead () может вернуть HIGH или LOW (и это может измениться случайно).

Если вы посмотрите на учебник по цифровой булавке Arduino :

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

Часто полезно привести входной контакт в известное состояние, если вход отсутствует. Это может быть сделано путем добавления подтягивающего резистора (до + 5 В) или понижающего резистора (резистор к земле) на входе, при этом 10K является общим значением. В микросхему Atmega встроены удобные подтягивающие резисторы 20К, доступ к которым можно получить из программного обеспечения. Эти встроенные подтягивающие резисторы доступны следующим образом.

pinMode(pin, INPUT);           // set pin to input
digitalWrite(pin, HIGH);       // turn on pullup resistors

Эти резисторы со слабым напряжением переводят состояние входного контакта в известное состояние и легко перезаписываются более сильными входными напряжениями, такими как прямое подключение к земле или + 5В.


2
Как насчет упоминания pinMode(pin, INPUT_PULLUP)? Это легко запомнить, и действительно трудно облажаться.
piojo

6

Это нормально. Если вход не подключен к чему-либо, он покажет HIGH или LOW или постоянно меняется. Это описано на странице ссылок digitalRead на веб-сайте Arduino.

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

Вы можете избежать этой проблемы, добавив резистор большого значения между контактом и заземлением.

Спросите себя, почему вы ожидаете ноль?


1
pinMode (pin, INPUT_PULLUP);
Джиппи
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.