Приветствую посетителей форума. При отладке своего скетча столкнулся с непонятной ситуацией. В процессе поиска проблем столкнулся с тем, что с пинов Ардуино приходят разные значения. В итоге набросал такой скетч: Код (C++): #define BUTTON_PIN13 13 #define BUTTON_PIN12 12 #define BUTTON_PIN11 11 #define BUTTON_PIN10 10 #define BUTTON_PIN09 9 #define BUTTON_PIN08 8 #define BUTTON_PIN07 7 #define BUTTON_PIN06 6 #define BUTTON_PIN05 5 #define BUTTON_PIN04 4 #define BUTTON_PIN03 3 #define BUTTON_PIN02 2 #define BUTTON_PIN01 1 #define BUTTON_PIN00 0 void setup() { // открываем монитор Serial-порта Serial.begin(9600); // настраиваем пин в режим входа pinMode(BUTTON_PIN13, INPUT); pinMode(BUTTON_PIN12, INPUT); pinMode(BUTTON_PIN11, INPUT); pinMode(BUTTON_PIN10, INPUT); pinMode(BUTTON_PIN09, INPUT); pinMode(BUTTON_PIN08, INPUT); pinMode(BUTTON_PIN07, INPUT); pinMode(BUTTON_PIN06, INPUT); pinMode(BUTTON_PIN05, INPUT); pinMode(BUTTON_PIN04, INPUT); pinMode(BUTTON_PIN03, INPUT); pinMode(BUTTON_PIN02, INPUT); pinMode(BUTTON_PIN01, INPUT); pinMode(BUTTON_PIN00, INPUT); } void loop() { int buttonState13 = digitalRead(BUTTON_PIN13); int buttonState12 = digitalRead(BUTTON_PIN12); int buttonState11 = digitalRead(BUTTON_PIN11); int buttonState10 = digitalRead(BUTTON_PIN10); int buttonState09 = digitalRead(BUTTON_PIN09); int buttonState08 = digitalRead(BUTTON_PIN08); int buttonState07 = digitalRead(BUTTON_PIN07); int buttonState06 = digitalRead(BUTTON_PIN06); int buttonState05 = digitalRead(BUTTON_PIN05); int buttonState04 = digitalRead(BUTTON_PIN04); int buttonState03 = digitalRead(BUTTON_PIN03); int buttonState02 = digitalRead(BUTTON_PIN02); int buttonState01 = digitalRead(BUTTON_PIN01); int buttonState00 = digitalRead(BUTTON_PIN00); Serial.print("13 - "); Serial.println(buttonState13); Serial.print("12 - "); Serial.println(buttonState12); Serial.print("11 - "); Serial.println(buttonState11); Serial.print("10 - "); Serial.println(buttonState10); Serial.print("09 - "); Serial.println(buttonState09); Serial.print("08 - "); Serial.println(buttonState08); Serial.print("07 - "); Serial.println(buttonState07); Serial.print("06 - "); Serial.println(buttonState06); Serial.print("05 - "); Serial.println(buttonState05); Serial.print("04 - "); Serial.println(buttonState04); Serial.print("03 - "); Serial.println(buttonState03); Serial.print("02 - "); Serial.println(buttonState02); Serial.print("01 - "); Serial.println(buttonState01); Serial.print("00 - "); Serial.println(buttonState00); delay(1000); } И вот какой результат он выдает: 13 - 1 12 - 1 11 - 1 10 - 0 09 - 0 08 - 0 07 - 0 06 - 0 05 - 0 04 - 0 03 - 0 02 - 1 01 - 1 00 - 1 И вот тут мне непонятно, так и задумано, что с пинов 00-02 и 11-13 - приходит по умолчанию единица, а не ноль?
Нулевая - в том смысле, что не подключено ничего. Просто захотел в итоге проверить, что же по умолчанию выдаю пины.
А значения постоянны во времени или шумят? Посмотрите на схему используемой платы на наличие "подтяжек" как явных (резисторы), так и не явных (через другие компоненты). + стоит обратить внимание как конфигурируются пины. Очень интересный курс написал Dihalt, посмотрите эту статью по вашему вопросу.
Вы используете ардуину или голый мк? Надо смотреть разводку платы. Да, для большинства выводов так можно сказать, но у D13 должен быть светодиод, уже что-то.
Показания стабильные. Но т.к. плата - родная Arduino Uno, то на абсолютно голой плате таких показания как мне кажется быть не должно. Т.е. Если я читаю цифровой пин, на котором нет сигнала (даже ничего не подключено) то я ожидаю там ноль. А у меня на разных пинах - разные значения. Пол дня убил пытаясь понять почему у меня одна функция вызывается которая вызываться должна была по кнопке. В итоге разобрал всю схему и читая показания с пустых пинов наткнулся на описанную ситуацию.
Посмотрите тут пункт Notes and Warnings. Там говорится о том, что если пин ни к чему не подключён, то функция digitalRead может возвращять случайное значение, что и я ожидал) Попробуйте опрашивать только 1 пин. Попробуйте подключать к нему провод (по-длинее) (другой конец провода никуда не подключён). (Во время подключения должен появиться шум). Наверное дам нехороший совет, но попробуйте его ещё и потрогать пальцами. Должны быть наводки и он должен шуметь.
На случай "ничего не подключено" ответ - наводки всегда есть, вот они то и должны давать шум. Более явно Вы этот шум должны наблюдать если будете работать с analogRead
Хм... а это интересно. Спасибо. Обязательно попробую. Но тогда возникает интересный вопрос. Допустим я хочу повесить некий цикл или условие на нажатие кнопки. По умолчанию кнопка - разрывает цепь. С точки зрения контроллера - к пину ничего не подключено. И тогда получается что при разомкнутой цепи у меня условие выполнится....
Ещё посмотрите Datasheet п. 32.2. Common DC Characteristics табл. 32-2. Интересует позиции V_OL и V_OH - диапазоны напряжений для логического нуля и единицы. ATmega328p интерпретирует диапазон напряжений на выводе от 0 до 0.9 В (при питании 5 В) как ноль, а напряжение в диапазоне от 4.2 до 5 В как единица. Если напряжение от 0.9 до 4.2 В, то как интерпретирует это напряжение микросхема неизвестно. Могу предположить, Если предыдушее состояние было лог. 1, а тут бац напряжение вышло в неопределённую зону, то digitalRead всё равно вернёт лог. 1, аналогично с нулём. Вот тут можете пробежаться по картинкам и посмотреть как изменение напряжения на выводе (зелёное) меняет интерпретируемое значение микроконтроллером (красное). Да, поэтому логичный ответ=) Вы должны сами сделать схемотехнику так, чтобы при замкнутой/разомкнутой кнопке было заранее известное напряжение. ostrov дал ссылку=)
Подтяжку кто будет включать? Раз уж залезли в даташит, то почитайте в нем рекомендации атмела по неподключенным пинам.
В общем разобрался. Проблема была в том, что пока делал прототип то использовал обычный микрик и его ногу подтягивал к земле и все работало. Когда стал делать начисто, то купил кнопку у амперки, которая вроде как имеет встроенный подтягивающий резистор. Но то ли я не верно подключал (желтый на пин, красный на питание, чёрный на землю), то ли кнопка попалась дефектная... не знаю. Но когда в итоге подключил эту кнопку через резистор - все заработало как задумывалось. Вот так вот, на ровном месте нашёл себе проблему. Спасибо всем кто откликнулся и дал советы. Узнал кое-что новое, а это всегда полезно. Спасибо!
Кнопка от амперки - резисторы находятся на правом углу, судя по фото, 10 кОм должны быть ближе к краю, если есть тестер, то померьте. Если все верно, то проверьте припаена ли она. Припой может и есть, но контакта нет, это можно проверять режимом прозвонки светодиодов или сопротивлений от контакта резистора до контакта другого элемента на плате (должно быть около нуля). Есть вариант, что нажимая щупами тестера вы получите, что всё исправно(надавите и получите замыкание), поэтому аккуратны будьте. Даже если сейчас не в этом дело, всё равно напомню, что война с контактами очень страшная штука - не доверяйте разъёмам, пайкам пока их не проверите или проверяйте в первую очередь.
Проверил. Резистор действительно на 10кОм. Между ним и соседним - сопротивление ноль. В принципе как только стало ясно, что дело в кнопке то стянул резистором на землю сигнал и теперь все работает. Но за науку - спасибо.
Странная у вас логика. Прототип делаете из "рассыпухи", а для чистового устройства - покупаете "детские кубики" от Амперки. Обычно люди поступают наоборот.
Мы, нелюди - загадочные На самом деле говоря о чистовой сборке я наверное немного слукавил. Все равно устройство собрано по сути навесным монтажом. Потом, когда-нибудь, может и перенесу это на нормальный монтаж, если итоговое устройство покажет свою полезность. Сейчас, например, корпус сделан из пластикового продуктового контейнера. И обычный микрик прицепить к нему - проблема. А вот врезать кнопку от Амперки - легко. Если проще, то текущая чистовая сборка - прототип. До этого был макет. Вот как-то так...