Использовать контакты, связанные с SPI, в качестве цифрового выхода?
Я пытаюсь использовать esp32 (NodeMCU-32s) в качестве контроллера кольцевой подсветки для моя камера. Все, что ему нужно сделать, это определить, когда на входном контакте становится низкий уровень (выход камеры подключается к земле при срабатывании затвора), что легко обнаружить с помощью простого digitalRead(). Если низкий уровень, то он поднимает 6 контактов с помощью digitalWrite(), которые подключены к транзисторам, которые пропускают ток от источника питания 24 В и зажигают 6 групп белых светодиодов. Вся эта установка отлично работала на esp32wroom, который я купил в школьном магазине — как я уже сказал, это очень просто — но после заказа большего количества esp32 в Интернете меня встретили несколько по-другому выглядящие экземпляры, которые ведут себя по-разному даже при запуске точно такой же код. Да, я убедился, что распиновка на этих двух платах одинакова, хотя площадь онлайн-плат (лучшая таблица данных, которую я смог найти по ссылке выше) на один слот макетной платы тоньше.
Ожидаемое поведение:
Я включаю его, и ничего не должно происходить, пока я не подключу контакт 14 к земле, затем свет должен включиться на десятую долю секунды, а затем снова погаснуть.
Фактическое поведение:
Я включаю его, три блока лампочек загораются довольно тускло. Остальные трое остаются в стороне. Когда я подключаю контакт 14 к земле, три, которые были выключены, включаются на десятую долю секунды, а затем снова выключаются. Пока они включены, на плате разработчика nodemcu-32 также загорается синий индикатор...
Я немного покопался:
На этом веб-сайте случайных обучающих программ я нашел код, который определяет, какие контакты являются контактами SPI вашей платы по умолчанию, а когда я запустил его, я обнаружил, что 3 из 6 контактов, которые я сейчас использую (контакты 23, 19 и 5), связаны с SPI. На самом деле это были контакты, которые вели себя правильно (они были отключены до тех пор, пока 14 не был опущен вниз).
Я не уверен, связано ли это с основной причиной моей проблемы или нет, но это кажется подозрительным. Будем признательны за любые советы от вас, мудрых волшебников Arduino — это должно было быть просто!
Код:
Ниже приведен код, который я использую. Вы можете игнорировать светодиоды RGB (LED_PIN, NUM_LEDS, BRIGHTNESS и т. д.). Все, что имеет значение для того, что я пытаюсь здесь заставить работать, — это банки светодиодов, подключенные к контактам 23, 21, 19, 5, 16 и 2. Я намеренно избегал контактов 6–11, потому что многие сайты советовали их избегать.
#include <Adafruit_NeoPixel.h>
#define LED_PIN 15 // Контакт, подключенный к входу данных WS2812B
#define NUM_LEDS 24 // Количество светодиодов WS2812B в ленте
#define BRIGHTNESS 200 // Установка яркости (0-255)
#define SHUTTER_PIN 14 // Контакт, подключенный к сигналу затвора камер через разъем 3,5 мм.
Adafruit_NeoPixel strip;
void setup() {
// здесь код настройки для однократного запуска:
pinMode(23, OUTPUT); // устанавливаем каждый блок из 6 белых светодиодов в качестве выходов
pinMode(21, OUTPUT);
pinMode(19, OUTPUT);
pinMode(5, OUTPUT);
pinMode(16, OUTPUT);
pinMode(2, OUTPUT);
// устанавливаем ShutterPin как вход с нормальным высоким уровнем
pinMode(SHUTTER_PIN, INPUT_PULLUP);
// Для управления светодиодами RGB
strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
strip.begin();
strip.setBrightness(BRIGHTNESS);
strip.show();
// Инициализируем все пиксели как выключенные
digitalWrite(23, LOW);
digitalWrite(21, LOW);
digitalWrite(19, LOW);
digitalWrite(5, LOW);
digitalWrite(16, LOW);
digitalWrite(2, LOW);
}
void loop() {
//основной код здесь для многократного запуска:
// если сигнал затвора пропадает, включаем и выключаем вспышку
if (digitalRead(SHUTTER_PIN) == 0) {
digitalWrite(23, HIGH);
digitalWrite(21, HIGH);
digitalWrite(19, HIGH);
digitalWrite(5, HIGH);
digitalWrite(16, HIGH);
digitalWrite(2, HIGH);
delay(500);
digitalWrite(23, LOW);
digitalWrite(21, LOW);
digitalWrite(19, LOW);
digitalWrite(5, LOW);
digitalWrite(16, LOW);
digitalWrite(2, LOW);
delay(500);
}
}
@Zach, 👍2
Обсуждение2 ответа
Я до сих пор не совсем понимаю, что происходит, но для устранения этой неполадки я бы сделал следующее:
- Прежде всего убедитесь, что это не неисправная плата, и попробуйте использовать ее с другой из имеющихся у вас новых. Если это не помогло, то сделайте следующее:
- Переместите digitalWrite-ы вверх над кодом инициализации NeoPixel. Посмотрите, поможет ли это при запуске.
- Если это не помогает, добавьте к выходам светодиодов подтягивающие резисторы (попробуйте 10 кОм).
- Синий светодиод загорается, потому что к нему подключен выход GPIO 2, если посмотреть на схему на веб-сайте, на который вы ссылаетесь. Возможно, вы захотите переключить его на другой GPIO на используемой вами плате.
- Проверьте цепи транзисторов на предмет наличия светодиодов, которые работают неправильно. Вы не публиковали ничего, связанного с этим, поэтому я не могу вам чем-то помочь, но если вы разместите ссылку, мы сможем использовать эту информацию.
Сделаю, спасибо, @Zach
@Зак, у тебя есть под рукой осциллограф? Хотя бы мультиметр? Если вы запустите функцию main как пустую, три группы светодиодов все равно загорятся, хотя и тускло? Если можете, проверьте напряжение между контактом и землей. Делать заметки. Затем снова подключите основной контур и измерьте напряжение на контактах с блоками светодиодов, которые не горят. Что ты видишь? Конечно, вы можете попробовать другие контакты, и если они работают нормально, просто создайте определения компиляции для каждой платы, и это облегчит перекомпиляцию вашей программы по мере необходимости., @Nick S.
Из схемы я вижу, что IO2 предназначен для платы синий светодиод. Так что, вероятно, это ваша первая проблема... Из этого PDF-файла я вижу, что IO21 — это VSPIHD, удержание для флэш-чипов. Не хорошо. IO16 — это HS1_DATA4, который также используется для флэш-чипа. Тоже ничего хорошего. Вам придется выбрать другие булавки.
Другая проблема заключается в том, что ШЕСТЬ контактов должны одновременно выдавать напряжение 3,3 В. На небольшой плате ESP. Не уверен, что это произойдет...
Спасибо за ваш ответ, дда!, @Zach
Почему вывод должен быть помечен как GPIO, если его нельзя правильно использовать в качестве входа или выхода общего назначения? Например, не следует ли их просто пометить как VSPI_HD и т. д., чтобы избежать путаницы?, @Zach
@Зак, я не думаю, что это проблема, большинство контактов современных микроконтроллеров имеют несколько функций - вы сами решаете, какие из них использовать. Проверяя схемы, я не вижу никаких внешних периферийных устройств с четырьмя SPI (как указывает dda, чаще всего используемых для флэш-чипов). Еще одним индикатором является то, что дело, вероятно, не в контактах (кроме GPIO2, мы окончательно установили, что он связан с синим светодиодом... но почему блок светодиодов тускло светится во время инициализации?) он работал с другими модулями ESP32-Wroom. , которые также являются модулями, используемыми на платах NodeMCU-32S., @Nick S.
@Зак, хорошо, я проверил [документацию Espressif](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/gpio.html) и да, контакт 16 действительно не рекомендуется использовать в качестве контакта GPIO (конечно, это все еще может быть, но это может привести к неизвестному поведению, как вы уже видели) - однако ничего о контакте 21., @Nick S.
@Зак, на одном выводе можно иметь разные функции - просто не используйте их все одновременно. В случае с выводами VSPI, если нет флэш-чипа *и* шина VSPI не инициализирована (например, если код проверил наличие чипа и не выполнил инициализацию впоследствии, упс), их можно использовать., @dda
- ESP32S v1.1 NodeMCU vs ESP32 DevKitV1
- Как подключить MPU9250 к NodeMCU с помощью SPI или I2C Slave?
- Использование контактов NodeMCU D8 (GPIO15), D4 (GPIO2) и D3 (GPIO0).
- Цифровой потенциометр SPI не работает на ESP32
- Arduino/ESP8266 нет данных SPI, поступающих от MCP3008
- Почему платы ESP ломают контакты флэш-памяти SPI?
- ESP32 запускает BLE после глубокого сна
- Встроенные светодиоды HIGH и LOW кажутся перевернутыми
Не могли бы вы предоставить код, который вы используете, и все номера контактов, а не только те три, которые работают? При беглом взгляде кажется, что вы не можете использовать IO14 в качестве GPIO14 на ESP32S, и вам не следует использовать какие-либо GPIO от 6 до 11, если вы действительно не знаете, что делаете, поскольку они подключены к внутренняя SPI-вспышка на чипе., @Nick S.
Я только что добавил код, который он запускает, спасибо за ваше время! Да, я избегал контактов 6-11. Кроме того, почему я не могу использовать контакт 14 в качестве входа?, @Zach
Я был неправ, вы можете использовать контакт 14 в качестве GPIO, прочитав [это руководство](https://www.espressif.com/sites/default/files/documentation/esp32-wroom-32_datasheet_en.pdf) немного более тщательно., @Nick S.