Rasberry Pi, управляющий Arduino - считывает "призрачный" вход - не завершает логический цикл
Я использую клон Arduino Atmega2560, я использовал его много раз с удовлетворительными результатами, хотя раньше я не использовал его с моим Rpi.
Мой Raspberry Pi - модель 4 (B, я думаю?).
#define knap 49
#define motorOutput 8
void setup() {
// поместите свой установочный код здесь, чтобы запустить один раз:
Serial.begin(9600);
pinMode(knap, INPUT);
pinMode(motorOutput, OUTPUT);
digitalWrite(motorOutput, LOW);
}
void loop() {
// поместите свой основной код здесь, чтобы запускать его повторно:
int knapSensor = digitalRead(knap);
Serial.print(knapSensor);
if (knapSensor == 1) {
int knapSensor = digitalRead(knap);
Serial.print("aktiveret");
digitalWrite(motorOutput, HIGH);
delay(500);
digitalWrite(motorOutput, LOW);
}
}
Теперь я дважды проверил, правильно ли подключен мотор и кнопка. Нет никаких аппаратных проблем, если не считать того, что кабели некачественные.
Проблема в том, что всякий раз, когда я запускаю эту программу, происходят две вещи:
Либо он запускается нормально, отображая "0000 ..." на последовательном мониторе.
Затем, когда я нажимаю кнопку, она переходит к "АктиверетАктиверетАктиверет ...", даже когда я нажимаю на кнопку.
Или он просто отобразит "AktiveretAktiveretAktiveret ...".
В любом случае мотор не будет работать.
Еще раз я провел тесты, в которых отключил питание от макетной платы и заменил вывод напряжения для двигателя выводом напряжения, ведущим от кнопки.
Первым делом не стал менять вход (то есть по-прежнему "АктиверетАктиверет"), последним завел мотор.
То есть речь идет не о плохой проводке.
ПРАВКА:
Добавлены схемы и изменен код
@GeorgeWTrump, 👍2
Обсуждение2 ответа
Лучший ответ:
Для надежной работы вашей кнопки необходим выдвижной резистор.
См. Обсуждение и решение здесь
Резистор со значением около 10K (но, вероятно, подойдет любое значение от 3K до 20K) должен находиться между входным контактом или вашим Arduino и землей, чтобы придать ему определенное значение при отпускании кнопки.
Установка резистора между выводом Arduino и землей гарантирует, что вывод читается как "низкий", когда ни одна кнопка не нажата. Когда кнопка нажата, она будет подключена непосредственно к + 5V и будет считывать высокий уровень. В этом случае только небольшой ток (0,5 мА) будет протекать от + 5В к земле через резистор 10К Ом. Это не создаст короткого замыкания.
Какой мотор вы используете? Если он работает прямо от 5v, но не от GPIO, это может быть проблемой недостаточной мощности.
Как упоминал @StarCat4, вам также необходимо добавить digitalRead внутри цикла while, если вы хотите, чтобы двигатель когда-либо выключался.
Ну, проблема здесь в том, что он даже не читает входные данные правильно. Так что, независимо от двигателя, он все равно не будет работать., @GeorgeWTrump
Он читается, когда вы нажимаете кнопку, верно? Вы никогда не увидите изменения состояния после нажатия кнопки, потому что вы не проинструктировали Arduino искать его. Даже если вы отпустите кнопку, Arduino не знает, как проверить состояние. Ваш цикл while должен читать while (knapSensor == 1){ Serial.print("aktiveret"); digitalWrite(motorOutput,HIGH); delay(500); knapSensor = digitalRead(knap); }
, @Andrew
Ой, забыл отредактировать код. Иногда он печатает "Aktiveret", а затем идет "0000 ...", то есть "000001Aktiveret" - это шаблон по умолчанию, когда я не нажимаю кнопку. Когда я нажму на кнопку, она будет завершена "00000"., @GeorgeWTrump
- Нужна помощь в создании кода, который перемещает двигатель постоянного тока CW или CCW с помощью двух разных кнопок
- Как запустить 3 режима работы, для каждой операции есть отдельная кнопка для выбора режима в Arduino?
- Бот не активируется после нажатия кнопки
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Что выбрать между датчиками температуры и влажности: AM230x или DHT22?
- Как управлять 4 двигателями постоянного тока с помощью Arduino?
- Измерение скорости двигателя постоянного тока с помощью поворотного энкодера
- Взаимодействие с датчиком SSI?
- проверено, мотор и кнопка подключены правильно... откуда ты знаешь?, @jsotola
Я сильно подозреваю, что это аппаратная проблема. Как вы обеспечиваете питание Mega2560 и двигателя? Как вы управляете двигателем и как подключена кнопка (pulldown)? Вы знаете, что с помощью кода, который вы показали, как только вы активируете выход двигателя, он никогда не выключится?, @StarCat
Пожалуйста, покажите свою проводку. Вы говорите, что проводка неплохая, но судить об этом будем мы, а не вы., @Majenko
Хорошо, теперь я добавил схемы., @GeorgeWTrump
@StarCat4 Разве это не изменится, как только кнопка ничего не прочитает?, @GeorgeWTrump
Вы устанавливаете
Выход двигателя
на "ВЫСОКИЙ", когда обнаруживаете, что кнопка нажата, но не устанавливаете ее снова на "НИЗКИЙ", когда она отпущена. Так что он остаетсяВЫСОКИМ
., @StarCatКроме того, нет ничего, что могло бы вывести выход кнопки на "НИЗКИЙ уровень", когда кнопка отпущена, поэтому она очень уязвима для шума. Вы должны поместить выдвижной резистор около 10 Ком между контактом 49 и землей, чтобы сделать кнопку более надежной., @StarCat
@StarCat Если я подключу кнопку к земле, не возникнет ли короткое замыкание? Как вы имеете в виду подключение 10K Ом между контактом 49 и землей?, @GeorgeWTrump
[См. здесь](https://forum.arduino.cc/index.php?topic=378402.0 ) Резистор должен находиться между входным контактом кнопки и землей, чтобы придать ему определенное значение при отпускании кнопки. Резистор на землю будет следить за тем, чтобы вывод считывал "низкий уровень", когда ни одна кнопка не нажата. Когда кнопка нажата, она будет подключена непосредственно к + 5V и будет считывать высокий уровень. В этом случае только небольшой ток (0,5 мА) будет протекать от + 5В к земле через резистор 10К Ом. Это не создаст короткого замыкания., @StarCat
@StarCat Спасибо! Теперь это отлично работает! Если вы хотите, вы можете оставить свой комментарий в качестве ответа, и я приму его., @GeorgeWTrump
Я превратил свой комментарий в ответ. Удачи вам в вашем проекте!, @StarCat