установка выходного аналогового/цифрового контакта на землю
Итак, мне нужно автоматически извлечь 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 не обязательно означает, что я подключил его к земле, это просто возможность. Если вы видите что-то неправильное в коде или у вас есть какие-либо предложения, пожалуйста, помогите мне
@SalmaG, 👍0
Обсуждение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
- Уменьшить яркость светодиода с помощью NPN-транзистора
- Случайная ошибка "Compilation error: Error: 13 INTERNAL: exit status 1". Как устранить или что вызывает эту ошибку
- Как настроить выходы без использования digitalWrite?
- Опасно ли соединять два выходных контакта вместе?
- Attiny85 простая проблема с аналоговым и цифровым выходом
- Аналоговая запись (PIN, 1023) <>Цифровая запись (PIN, HIGH)
- Функция AnalogWrite выдает меньшее напряжение, чем digitalWrite на моей плате.
- Nano: все цифровые контакты ничего не выводят
https://majko.co.uk/blog/what-exactly-gpio-pin, @Majenko
pinMode(d1, OUTPUT);
устанавливает контакт LOW (0 ноль), подключенный к земле, @Jurajwhile(!digitalRead(ds1))
лучше разместить в первой строке цикла. Тогда вы можете исключить его из setup(), @Jurajчто вы подразумеваете под
приводом Blu-Ray
? ... это привод на компьютере или проигрыватель Blu-Ray?, @jsotolaпроигрыватель Blu-ray, не подключенный к компьютеру, @SalmaG