Ни один из контактов не работает как вход
Я использую Arduino-uno
Я пытаюсь прочитать сигнал ШИМ, выдаваемый контактом 6. Я пытаюсь прочитать его с помощью контакта A0.
5 вольт подается с контакта 6 на резистор 300 Ом последовательно с одним светодиодом. Эта схема возвращается к аналоговому входному контакту A0.
Он признает, что это странная настройка, и мне сказали использовать сквозной фильтр для чтения сигнала.
На данный момент меня не волнует, считывает ли программа правильные значения, поэтому, несмотря на код, связанный с последовательным монитором, я просто пытаюсь понять, почему светодиод больше не включается.
Как я сказал в скетче, именно эта установка вчера работала нормально. Светодиод был включен, и (точные или нет) на последовательный монитор выводились согласованные значения.
Теперь я пытаюсь выяснить, что изменилось после того, как я отключил его в последний раз, чтобы создать разомкнутую цепь.
```
void setup() {
Serial.begin(9600);
pinMode(6, OUTPUT);
// Я также попытался установить вывод A0 в качестве входа, хотя думал, что вам это не нужно, и это ничего не изменило.
}
void loop() {
analogWrite(6, 255); // Этот контакт работает как выход, я проверил его на землю и светодиоды.
int value = analogRead(A0); // Я понимаю, что входы обычно используются для таких вещей, как потенциометры
// Но просто в качестве примера светодиод должен все равно включаться при подключении сюда, верно?
// И это было первые несколько раз, когда я это делал... может быть, проблема была в этом?
Serial.println(value); // Раньше все это работало. Он просто случайно остановился.
// Теперь это просто печатает случайные числа, и схема остается незавершенной.
// Даже если входные контакты не должны использоваться с 5 вольтами, почему это работало раньше...
// ТАКЖЕ не имеет значения, какие выводы вы для чего используете...
// Через цифровые входы не проходит ток, если для цифрового выхода установлено ВЫСОКОЕ значение.
// И ток не проходит через контакты AnalogInput, когда для параметра AnalogWrite установлено значение 255.
// Еще раз прошу прощения, если моя терминология неверна.
}
```
Вот что я сделал для устранения неполадок:
С тем же скетчем, запущенным на плате...
Я соединил перемычкой контакт A0 с землей, и последовательный монитор переключился с группы случайных значений на сплошной 0. Таким образом, он все еще распознает ввод... в каком-то смысле.
Затем я изменил скетч...
void setup() {
Serial.begin(9600);
pinMode(6, OUTPUT);
pinMode(8, INPUT);
}
void loop() {
// теперь я пытаюсь прочитать цифровой сигнал с той же схемой...
// Контакт 6 подключен к резистору 300 Ом последовательно со светодиодом, который возвращается к контакту 8.
digitalWrite(6, HIGH);
int value = digitalRead(8);
Serial.println(value);
}
Это дало тот же результат. Светодиод больше не загорится, пока концы цепи не будут подключены от источника напряжения к земле.
Ранее любые выводы, сконфигурированные как ВХОД, не только считывали согласованные значения, но и замыкали цепь, включая светодиод.
Теперь контакты распознают только нулевое напряжение и не замыкают цепи. Вы даже не можете использовать простой потенциометр, если хотите.
Каждый контакт, который можно настроить как ВХОД, действует одинаково.
Единственное, что я делал между периодами, когда он работал, и когда он не работал, это отключал и подключал плату...
@User-2746, 👍0
Обсуждение3 ответа
Похоже, здесь есть элементарное недоразумение.
Установка вывода в качестве "выходного" означает, что он будет подавать либо +5 В («ВЫСОКИЙ»), либо 0 В («НИЗКИЙ»). Оба эти состояния считаются «выходами», и в этих состояниях контакт может генерировать или потреблять ток. Когда управляется "НИЗКИЙ уровень", схема выполняет "ввод" ток на микросхему, но это не то что "вход" обычно означает.
"Ввод" означает, что вы можете использовать контакт для считывания напряжения, подаваемого на контакт. При подключении к источнику ШИМ это может проявляться в том, что вывод быстро переключается между «1» и «1». / "ВЫСОКИЙ" / "+5В" и "0" / "НИЗКИЙ" / "0В". Обычно вы должны использовать "ввод" режим для чтения таких вещей, как переключатели или потенциометры на аналоговых входных контактах.
Ваше желаемое использование "текущий ввод" контакты потребуют, чтобы вы сконфигурировали контакт как «выходной», а затем установили его на «НИЗКИЙ», что позволит ему потреблять ток.
Мне кажется, что это очень правильный ответ. Входной контакт не «всасывает ток». Он измеряет, есть он или нет. В качестве аналогии термометр не делает вещи горячими или холодными, он **измеряет**, горячие они или холодные., @Nick Gammon
Извините за путаницу, я обновил пост. Я пытался использовать аналоговые входные контакты (либо A0, либо A5) для считывания напряжения со схемы, которую я питал от источника ШИМ. Поэтому там, где я обычно подключал конец цепи к земле, я подключил его к аналоговому входному контакту, сконфигурированному для «считывания» напряжения. Раньше работало, нельзя ли это сделать?, @User-2746
@ User-2746 Означает ли это, что вы пытаетесь прочитать сигнал ШИМ с помощью analogRead()
? Это не сработает, если вы не используете что-то вроде фильтра нижних частот., @chrisl
Да спасибо. Я попробую это. Я все еще немного сбит с толку, потому что ранее, используя ту же самую настройку, светодиод был включен. Я не уверен, правильно ли читался ШИМ-сигнал из-за отсутствия фильтра, но сам светодиод работал. Как будто что-то изменилось с тех пор, как я отключил все от сети, до того, как я попробовал это снова на следующий день. Потому что теперь, с той же настройкой, схема неполная при подключении от PWM на контакте 6 к аналоговому считыванию на контакте A0 ... Что еще раз противоположно тому, что было изначально., @User-2746
Я также обновил его еще раз для столь необходимых разъяснений. Это странная проблема, и я не объяснил ее достаточно хорошо., @User-2746
Светодиод будет светиться только тогда, когда контакт настроен как ВЫХОД, или будет очень тусклым в режиме ВХОДА. Это связано с тем, что режим INPUT устанавливает контакт в состояние с высоким импедансом, подходящее для считывания напряжения, а не для управления цепями, требующими тока.
Установка цифрового вывода в режим INPUT позволяет считывать напряжения только как 0 или 1, что соответствует 0 В и 5 В соответственно. Например, загрузите приведенный ниже код в Arduino и откройте последовательный монитор. Теперь, подключив контакт 11 к GND, последовательный монитор должен отображать 0, а подключив его к 5V, он должен отображать 1. Если это не работает, возможно, что-то не так с Arduino.
const int TESTPIN=11; // подключите контакт 11 к 5V и GND для тестирования
void setup() {
pinMode(TESTPIN, INPUT);
Serial.begin(9600);
}
void loop() {
Serial.println(digitalRead(TESTPIN));
delay(500);
}
Однако я бы порекомендовал вам поделиться своим кодом и схемой, прежде чем делать вывод о неисправности в Arduino.
Спасибо за отзыв. Я попробовал то, что вы сказали, и это помогло немного лучше объяснить проблему. Монитор отображал «0» при подключении к земле, но все значения случайны при подаче напряжения. Я думаю, вы правы, что-то не так с платой. Я обновил свой пост, добавив это. Очень странно, что он так случайно потерпел неудачу. Сначала работало, потом отключил, на следующий день снова подключил, а теперь нет., @User-2746
Просто для подтверждения, надеюсь, вы подключили PIN11 напрямую к 5 В с помощью перемычки, и между ними ничего нет?, @Siddharth Kothari
Во втором обновлении вы описали следующую схему:
Затем в коде вы выполняете digitalWrite(6, HIGH);
, что устанавливает контакт 6 в состояние HIGH/1/true/5V. Контакт 6 настроен как выход, контакт 8 как вход. В этом случае светодиод не загорится. Вывод, настроенный как вход, не будет потреблять или генерировать ток (за исключением очень небольшого количества). Входной контакт ведет себя как небольшой конденсатор на землю (поэтому, в принципе, ток почти не течет). Таким образом, ток по цепи не течет. Отсутствие тока также означает, что светодиод не загорается (для его загорания нужен ток) и в цепи не произойдет падения напряжения. Цепь не будет "завершена", как вы выразились. Таким образом, ваш входной контакт также получит HIGH/1/true/5V, что вы затем и прочитаете в коде.
Если вместо этого вы измените контакт 8 на выходной (pinMode(8, OUTPUT);
) и установите для него значение LOW (digitalWrite(8, LOW);
), Светодиод загорится, поскольку теперь разница напряжений составляет полные 5 В (от HIGH на контакте 6 до LOW/земля на контакте 8). Если вы теперь прочитаете пин с помощью digitalRead(8)
, вы просто прочитаете то, что вы написали в него, то есть LOW/0/false/ground.
Возможно, вы также пытались использовать digitalWrite()
с выводом, настроенным как INPUT
. Это действительно ничего не выводит. Вместо этого он активирует или деактивирует внутренний подтягивающий резистор вывода. Насколько я помню, сопротивление этого подтягивающего резистора составляет от 20 до 50 кОм, так что опять же, вы не сможете получить достаточный ток, чтобы зажечь светодиод через этот контакт. Внутренний подтягивающий резистор тогда похож на дополнительный резистор от 20 до 50 кОм от соответствующего входного контакта до Vcc (5 В в вашем случае). Если ничто другое не подтягивает значение контактов, подтягивающий резистор подтянет значение входного контакта к HIGH/1/true/5V, так что у вас не будет плавающего контакта (см. ниже объяснение этого термина).
Следующий сценарий: использование analogRead()
Здесь вы впервые попытались прочитать аналоговый вывод (A0), который ни к чему не подключен. Это называется плавающий вывод. Нет ничего, что придавало бы этому контакту определенное значение, поэтому он улавливает любой электрический шум, исходящий от микроконтроллера, от других контактов, от схемы или извне. Плавающая вывод может менять свое значение быстро и случайным образом, в зависимости от окружающего шума. Таким образом, здесь вы получите очень разные значения.
Затем вы подключили A0 к земле. Это дает контакту определенное значение (LOW/0/false/ground). Таким образом, теперь вы читаете только ноль как значение.
Если вы выполняете analogRead()
со схемой, аналогичной первому случаю (со светодиодом между двумя контактами), вы получите такой же результат, как и с digitalRead()
. Аналоговый вход также не будет подавать и потреблять ток (кроме очень-очень малого тока). Таким образом, вы не можете "завершить" схема для включения светодиода на пути.
Я пытаюсь прочитать сигнал ШИМ, выдаваемый контактом 6. Я пытаюсь прочитать его с помощью контакта A0.
ШИМ-сигнал — это не что иное, как быстрое изменение между Vcc (5 В в вашем случае) и землей. Значение, которое вы даете ШИМ-сигналу с помощью analogWrite()
, определяет рабочий цикл сигнала, то есть соотношение между ВЫСОКОЙ и НИЗКОЙ частями сигнала. Имя функции analogWrite()
, к сожалению, вводит в заблуждение, так как на самом деле вы не выдаете аналоговое напряжение. У большинства Arduino нет оборудования для этого, поэтому analogWrite()
использует ШИМ для вывода псевдоаналогового напряжения. Такие устройства, как двигатели, недостаточно быстры, чтобы реагировать на быстрое изменение напряжения, поэтому вы можете изменить скорость с помощью ШИМ. Светодиоды работают достаточно быстро, но человеческий глаз не может различить отдельные циклы включения-выключения, поэтому вы видите, как яркость светодиода снижается при более низких значениях.
Но функция analogRead()
(которая использует внутреннее оборудование АЦП) достаточно быстра, поэтому при считывании ШИМ-сигнала вы считываете только серию изменений между 5 В и землей. Вы можете создать фильтр нижних частот, который будет отфильтровывать частоту ШИМ и давать вам реальное аналоговое напряжение, которое вы затем сможете считать с помощью analogRead()
. Однако имейте в виду, что это делает его медленнее, поэтому вы не можете читать быстрые изменения с этим. Фильтр нижних частот выглядит следующим образом:
Значения взяты из комментария Эдгара Боне (спасибо):
Частоты ШИМ Uno составляют 977 и 490 Гц, что ниже порога среза фильтра, который вы нарисовали. В соответствии со спецификацией АЦП вы можете безопасно увеличить сопротивление R1 до 10 кОм, что должно сделать отсечку достаточно низкой, чтобы ослабить частоты ШИМ не менее чем на 30 дБ.
Хотя вы также можете прочитать формулу для частоты среза. Вы можете использовать такие термины Google, как "Фильтр нижних частот RC".
Если вы не хотите использовать дополнительное оборудование, но все же хотите прочитать сигнал ШИМ, вам нужно прочитать длину импульса. Для этого есть несколько способов, в зависимости от требований. Вы можете использовать pulseIn()
, вы можете использовать прерывания и брать метки времени, вы можете использовать режим захвата аппаратного таймера.
Как я сказал в скетче, именно эта установка вчера работала нормально. Светодиод был включен, и (точные или нет) на последовательный монитор выводились согласованные значения.
К сожалению, это невозможно. Пины должны вести себя так, как я описал выше. Поскольку электроника не ломается, а затем просто волшебным образом восстанавливается, вы, должно быть, сделали что-то другое. Входной контакт (цифровой или аналоговый) не будет генерировать или потреблять ток, достаточный для того, чтобы зажечь светодиод.
Теперь контакты распознают только нулевое напряжение и не замыкают цепи. Вы даже не можете использовать простой потенциометр, если хотите.
Возможно, вы что-то повредили, хотя я не могу точно сказать, так ли это на самом деле или вы просто делаете что-то не так. Потенциометр должен быть подключен следующим образом: внешние контакты к земле и 5 В соответственно, средний контакт непосредственно к аналоговому входу. Ничего больше. Вы можете проверить, если это так, что вы сделали.
Помимо всего этого, вы на самом деле не указали, чего вы пытаетесь достичь. Как вы уже признали в своем вопросе, описанная схема не является типичной и странной. Чтобы зажечь светодиод, вам нужно просто подключить его к выходному контакту (через резистор), а с другой стороны — к земле.
Хороший ответ! Всего два комментария: 1. Подтягивание указано в диапазоне от 20 до 50 кОм (не МОм), обычно 30 кОм. 2. Частоты ШИМ Uno составляют 977 и 490 Гц, что ниже порога среза нарисованного вами фильтра. В соответствии со спецификацией АЦП вы можете безопасно увеличить сопротивление R1 до 10 кОм, что должно сделать отсечку достаточно низкой, чтобы ослабить частоты ШИМ не менее чем на 30 дБ., @Edgar Bonet
@EdgarBonet Ups, спасибо за исправление. Оглядываясь назад, 50 МОм должны были заставить меня с подозрением относиться к моему заявлению XD. Я включил значение 10 кОм в схемы и упомянул / процитировал вас в ответе., @chrisl
Я попал сюда с проблемой, аналогичной ОП, я вижу, что они не ответили на ваш вопрос о том, чего они хотели достичь, я не могу понять, но могу объяснить, что я пытался сделать. У меня есть тумблер вкл-нет-вкл, и я хочу иметь 2 светодиода, чтобы указать, какой из них включен (да, я знаю, что могу просто посмотреть на переключатель :)). Я хотел сделать так, чтобы светодиоды были на одной линии с входом в Arduino, чтобы вместо использования 2 контактов для входов от переключателя и 2 контактов в качестве выходов для светодиодов я мог просто использовать 2 входных контакта., @Paul Brindley
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Пожалуйста, отредактируйте пост и покажите свой скетч. Ваша терминология «даже не завершайте схему в качестве входов» сбивает с толку. Например, микрофон является входом. Как можно ожидать, что это замкнет цепь?, @Nick Gammon
*Однако при подключении схемы к любым контактам, сконфигурированным как вход, свет даже не загорится... но он отлично работает при подключении к земле.* - Почему вы ожидаете, что вход зажжет светодиод? Это все равно, что сказать, что когда вы подключаете микрофон к компьютеру, он не воспроизводит звук., @Nick Gammon
Извините за путаницу. Я не ожидал, что на входе загорится светодиод, вы правы, это было бы абсурдно. Я подумал, что можно сделать некоторое предположение. Мой плохой, пост обновлен., @User-2746
По поводу «_Я не ожидал, что вход зажжет светодиод_»: здесь вы противоречите сами себе. Ранее вы писали: «при подключении схемы к любым контактам, сконфигурированным как вход, свет даже не загорится… но он отлично работает при подключении к земле». Итак, вы **не** ожидали, что свет включится., @Edgar Bonet
Да, подключение конца цепи. Другой конец подключен к источнику ШИМ. Кроме того, сразу после этого я констатирую, что "при заземлении тоже не работает". Таким образом, ваше предположение также будет означать, что я думал, что схема без источника питания должна иметь возможность включать светодиод., @User-2746
Извините, "это работает при подключении к земле". Видите, оригинальный пост сбивает с толку. Именно поэтому я обновил его. В любом случае моя точка зрения остается в силе. Такому человеку, как вы, не должно быть трудно сделать правильное обоснованное предположение в отношении этого утверждения. Вместо этого вы предполагаете невежество людей, выявляете все несоответствия и остаетесь бесполезными. Вот почему форумы уже не так популярны. Если вы действительно запутались и нуждаетесь в дополнительных разъяснениях, я могу это сделать, в противном случае не утруждайте себя публикацией. Это пустая трата времени., @User-2746
Относительно «_Такому человеку, как вы, не должно быть сложно сделать правильное обоснованное предположение в отношении этого утверждения_»: Извините, я недостаточно умен, чтобы читать ваши мысли: _Я искренне запутался_. Указание на несоответствия — это способ **помочь вам** прояснить ваш вопрос. И это не было бы роскошью: мое прочтение вашего вопроса точно такое же, как у Тоу и Ника Гэммона. Таким образом, если вы думаете, что мы не дали подходящего ответа, это означает, что у вас как минимум три человека запутались в том, что вы на самом деле имеете в виду. Сейчас, учитывая недружелюбие вашей реакции, я не буду пытаться помочь., @Edgar Bonet
Я все еще в замешательстве от вашего поста. Может быть, вы можете составить список каждого сценария со схемой подключения, описанием и для каждого состояния, что вы ожидали и что произошло на самом деле. В настоящее время мне непонятно, что с чем связано, когда вы ожидаете, что светодиод загорится, @chrisl
Я не хочу спорить, но я тоже не могу читать ваши мысли. То, что вы уже сказали, было упомянуто да, тремя людьми и прояснилось. И то, как вы это сказали, даст любому повод предположить "недружелюбие" и с вашей стороны. Вы говорите, что не можете читать мои мысли, но при этом буквально заявляете, о чем, по вашему мнению, я думаю. Я не предполагал интеллекта, я предполагал тон. Который я до сих пор считаю, по вашим словам, "недружественным". Я уважаю, что вы не хотите помочь. Однако, со всем уважением, я надеюсь, что вы понимаете лицемерие в своих ответах и просто помните, что в этом действительно не было смысла., @User-2746
Крис, я могу это сделать. Я обновлю его снова через некоторое время, спасибо., @User-2746
Хорошо, теперь немного яснее. Завтра напишу ответ и обсужу ситуации, которые вы там описываете. Теперь пора спать, где я живу, @chrisl
Итак, наконец, вот проблема. Ваша текущая схема, как описано вами, подключена как PIN6 -> LED -> RESISTOR -> PIN8. Вместо того, чтобы подключать резистор к PIN8, вам нужно подключить его к земле. С тем же кодом, чтобы проверить вход, подключите перемычку от 5V к PIN8, вы должны увидеть все 1 в последовательном мониторе. Подключив PIN8 к GND, вы должны увидеть все 0., @Siddharth Kothari
Пожалуйста, попробуйте включить некоторые схемы и четко указать, чего вы пытаетесь достичь и что на самом деле происходит. Меня смущает ваше описание «проблемы», поскольку кажется, что схема, которую вы описываете, ведет себя точно так, как ожидалось. Входы ведут себя как очень высокие сопротивления. Вы не можете зажечь светодиод, подключив одну из его ножек только к входу, если только вы не подключите источник тока/напряжения к той же ножке/входу., @StarCat