Использовать контакты, связанные с 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);
  }
}

, 👍2

Обсуждение

Не могли бы вы предоставить код, который вы используете, и все номера контактов, а не только те три, которые работают? При беглом взгляде кажется, что вы не можете использовать 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.


2 ответа


0

Я до сих пор не совсем понимаю, что происходит, но для устранения этой неполадки я бы сделал следующее:

  • Прежде всего убедитесь, что это не неисправная плата, и попробуйте использовать ее с другой из имеющихся у вас новых. Если это не помогло, то сделайте следующее:
    • Переместите digitalWrite-ы вверх над кодом инициализации NeoPixel. Посмотрите, поможет ли это при запуске.
    • Если это не помогает, добавьте к выходам светодиодов подтягивающие резисторы (попробуйте 10 кОм).
    • Синий светодиод загорается, потому что к нему подключен выход GPIO 2, если посмотреть на схему на веб-сайте, на который вы ссылаетесь. Возможно, вы захотите переключить его на другой GPIO на используемой вами плате.
    • Проверьте цепи транзисторов на предмет наличия светодиодов, которые работают неправильно. Вы не публиковали ничего, связанного с этим, поэтому я не могу вам чем-то помочь, но если вы разместите ссылку, мы сможем использовать эту информацию.
,

Сделаю, спасибо, @Zach

@Зак, у тебя есть под рукой осциллограф? Хотя бы мультиметр? Если вы запустите функцию main как пустую, три группы светодиодов все равно загорятся, хотя и тускло? Если можете, проверьте напряжение между контактом и землей. Делать заметки. Затем снова подключите основной контур и измерьте напряжение на контактах с блоками светодиодов, которые не горят. Что ты видишь? Конечно, вы можете попробовать другие контакты, и если они работают нормально, просто создайте определения компиляции для каждой платы, и это облегчит перекомпиляцию вашей программы по мере необходимости., @Nick S.


2

Из схемы я вижу, что 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