установка выходного аналогового/цифрового контакта на землю

Итак, мне нужно автоматически извлечь CD из привода Blu-Ray, у меня есть провод, приваренный к карте привода, который, если вручную подключить на долю секунды (импульс) к земле той же карты на приводе, извлечет CD. Теперь, чтобы сделать это автоматически, я использую Arduino Nano и подключил этот провод к аналоговому выводу "d1", установил его режим на Output и соединил земли Arduino и привода вместе. Вот мой код 1

int ds1 = A2; //контакт, который указывает на наличие компакт-диска внутри привода, если HIGH, и на его отсутствие в противном случае
int d1 = A3;  //контакт, подключенный к проводу, который при подключении к земле выталкивает компакт-диск

void setup() {
  Serial.begin(9600);
  pinMode(ds1, INPUT);
  pinMode(d1, OUTPUT);
  while((!analogRead(ds1))) //если CD нет в приводе, ждем
  {}
}

void loop() {
  analogWrite(d1,0); //извлечь CD
  delay(500);
  while(!analogRead(ds1)) //если CD нет в приводе, ждем
  {}
  delay(1000);
}

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

, 👍0

Обсуждение

https://majko.co.uk/blog/what-exactly-gpio-pin, @Majenko

pinMode(d1, OUTPUT); устанавливает контакт LOW (0 ноль), подключенный к земле, @Juraj

while(!digitalRead(ds1)) лучше разместить в первой строке цикла. Тогда вы можете исключить его из setup(), @Juraj

что вы подразумеваете под приводом Blu-Ray? ... это привод на компьютере или проигрыватель Blu-Ray?, @jsotola

проигрыватель Blu-ray, не подключенный к компьютеру, @SalmaG


1 ответ


Лучший ответ:

1

Да, установка вывода в положение ВЫХОД и установка его в положение НИЗКИЙ фактически подключает вывод к земле (через сопротивление в несколько Ом).

Однако в вашем коде есть несколько ошибок, на которые следует обратить внимание:

  • Используйте digitalWrite(), а не AnalogWrite().

analogWrite(pin, 0) фактически то же самое, что и digitalWrite(pin, 0), но это неоднозначно для того, кто читает ваш код.

  • Вы никогда не "отпускаете" вывод, поэтому как только он становится НИЗКИМ, он остается НИЗКИМ. Вам следует эмулировать открытый сток, установив его на ВХОД, когда он не используется.

  • Вам следует выработать привычку помещать повторяющийся код в функции, чтобы сделать происходящее более понятным.

Например:

void setup() {
  Serial.begin(9600);
  pinMode(ds1, INPUT);
  pinMode(d1, INPUT);
  waitForCD();
}

void loop() {
  triggerEject();
  waitForCD();
  delay(1000);
}

void triggerEject() {
  pinMode(d1, OUTPUT);
  digitalWrite(d1, LOW); // Нажимаем кнопку
  delay(100); // Это то, как долго кнопка будет нажата
  pinMode(d1, INPUT); // Отпускаем кнопку
}

void waitForCD() {
  while(!analogRead(ds1)) //если CD нет в приводе, ждем
  {}
}
  • !analogRead(ds1) будет истинным только в том случае, если напряжение на выводе A2 равно нулю вольт. Если вы действительно хотите прочитать аналоговое напряжение здесь, вам следует найти пороговое значение, с которым сравнивается значение:

    пока (analogRead(ds1) < 100)) {}

Или, возможно, вы на самом деле хотите использовать digitalRead()...

,

Установка цифрового PIN в LOW не устанавливает его в GND. Он устанавливает его в 0. Просто попробуйте, например, с HC12: чтобы установить его, вы должны присоединить его SET PIN к GND. Если вы привяжете вывод SET к реальному GND, это сработает. Если вы привяжете его к D8 (например) и установите D8 в LOW, это не сработает., @Peter

@Peter Я полностью не согласен. Когда вы устанавливаете пин в LOW, он активирует нижний N-канальный MOSFET с очень низким сопротивлением для подключения пина к GND. Худший случай будет 20 Ом, но более вероятно <1 Ом для нижнего. Что меркнет по сравнению с резистором 1 кОм, который модуль туда вставляет. Поскольку он использует микроконтроллер STM8, входной порог LOW составляет 0,3VDD, что при 5 В составляет 1,6 В, что даже с 20 Ом плюс 1 кОм против подтяжки 10 кОм в 3-4 раза выше напряжения, которое Arduino выдаст на этом пине (0,46 В). Я подозреваю, что вы просто забыли установить пин в режим OUTPUT., @Majenko

Возьмите HC12 (например) и прочитайте DataSheet: если вы поместите SET на GND, HC12 перейдет в режим настройки. Так что попробуйте, и вы увидите, что это правда. Теперь подключите PIN на Arduino, установите его в LOW. Вы увидите, что HC 12 не входит в режим настройки (мы также провели тест с Ax PIN, и результат тот же. И «конечно» мы в OUTPUt!). Кажется, если вы хотите получить «настоящий» GND, вы должны запустить NPN. Возможно, при использовании LOW он «близок к GND», и поэтому в некоторых случаях это сработает., @Peter

NPN будет еще хуже, поскольку вы накладываете падение напряжения на переходе 0,7 В на резистивный делитель. У меня нет HC12, но, пожалуйста, сделайте некоторые измерения напряжения на выводе stm8 io и покажите мне, что оно выше 1,6 В, когда Arduino понижает его., @Majenko

https://arduinoprosto.ru/q/69003/is-digitalwritepinnumber-low- Different-from-ground-pin, @Peter

Я не знаю, какое отношение это имеет, по-вашему, к делу., @Majenko

Ах, похоже, это зависит от HC12! С некоторыми работает, с другими нет... Я проверю, не являются ли некоторые из них клонами клонов, @Peter

@Peter Вы ждете необходимое количество времени после понижения SET, прежде чем попытаться его использовать...?, @Majenko

да. После тестирования я подтверждаю: SET на D5 и D5 как LOW. Это срабатывает один или два раза, и мы можем установить HC12. Затем мы начинаем получать плохие значения от команды AT. Чтобы получить "снова" хорошие значения, нам нужно подключить SEt к "реальной земле". И в этом случае мы можем отправлять столько команд AT, сколько захотим, мы никогда не получим плохих ответов. Это очень странно..., @Peter