Firmata: как установить определенный PIN на высокий уровень при загрузке?

Я работаю над проектом, использующим J5, поэтому использую стандартную firmata, в этом проекте используется opto 4-канальное реле, когда плата загружается, состояние контактов устанавливается на низкое, поэтому, как только я включаю плату, мое реле переходит в закрытое состояние и запускает двигатель... это неправильное поведение для моей цели. Как я могу избежать этого? Покопавшись в гугле, я натыкаюсь на следующее:

Возможное решение

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

Обновление: СХЕМЫ

4-Канальный Релейный модуль 5 В

, 👍2

Обсуждение

Что заставляет вас думать, что это сапоги с низкими штифтами? Они должны иметь высокий импеданс. Не могли бы вы поделиться схемой подключения Arduino к оптрону, к реле и двигателям?, @Edgar Bonet

@EdgarBonet добавил схемы в вопрос ;), @FabioEnne

Это не схема. И это показывает только то, как вы питаете свой релейный модуль, а не то, как вы им управляете, или как он работает внутри (ссылка, пожалуйста)., @Edgar Bonet

@EdgarBonet добавил ссылку на ссылки на вики-страницу конструктора, @FabioEnne

@EdgarBonet Я забыл в приведенной выше схеме подключить вывод 7 к ch1, извините, @FabioEnne


2 ответа


3

Казалось бы, вы правы. Если я правильно понял источник, Firmata инициализирует все цифровые контакты как НИЗКИЙ ВЫХОДНОЙ сигнал. Трудно поверить, так как это кажется глупым поступком... Мое понимание таково, что:

  1. setup() вызывает systemResetCallback() для установки начальной конфигурации контакта (строка 779)
  2. systemResetCallback() перебирает все контакты и вызовы setPinModeCallback(i, OUTPUT) для каждого вывода i, который не является аналоговым выводом (строка 732)
  3. setPinModeCallback() вызывает pinMode(), чтобы установить вывод на вывод (строка 325).

Если я правильно понимаю, то самым простым решением было бы исправить systemResetCallback() и заменить ВЫВОД на ВВОД в строке 732.

,

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

Независимо от того, как вы исправляете Firmata, контакты будут настроены на ввод при включении Arduino и во время запуска загрузчика. Вы должны управлять своей схемой, чтобы приспособиться к этому начальному состоянию. Вытягивающий или вытягивающий резистор может подойти для выводов, приводящих в действие эти другие компоненты., @Edgar Bonet

сколько времени требуется для загрузки, было бы приемлемо меньше секунды, @FabioEnne


1

Просто поместите digitalWrite(anyPin,HIGH) в void setup(), это сделает этот конкретный PIN-код ВЫСОКИМ для сброса. Это работает для меня.

void setup()
{
  digitalWrite(8,HIGH);
  Firmata.setFirmwareVersion(FIRMATA_FIRMWARE_MAJOR_VERSION, FIRMATA_FIRMWARE_MINOR_VERSION);

  Firmata.attach(ANALOG_MESSAGE, analogWriteCallback);
  Firmata.attach(DIGITAL_MESSAGE, digitalWriteCallback);
  Firmata.attach(REPORT_ANALOG, reportAnalogCallback);
  Firmata.attach(REPORT_DIGITAL, reportDigitalCallback);
  Firmata.attach(SET_PIN_MODE, setPinModeCallback);
  Firmata.attach(SET_DIGITAL_PIN_VALUE, setPinValueCallback);
  Firmata.attach(START_SYSEX, sysexCallback);
  Firmata.attach(SYSTEM_RESET, systemResetCallback);

  // для использования порта, отличного от последовательного, например Serial1 на Arduino Leonardo или Mega,
  // Вызовите begin(baud) на альтернативном последовательном порту и передайте его Firmata, чтобы начать так:
  // Сериал1.начало(57600);
  // Firmata.begin(Сериал1);
  // Однако не делайте этого, если вы используете SERIAL_MESSAGE

  Firmata.begin(57600);
  while (!Serial) {
    ; // дождитесь подключения последовательного порта. Требуется для плат на базе ATmega32U4 и Arduino 101
  }

  systemResetCallback();  // сброс к конфигурации по умолчанию
}
,