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 ...".

В любом случае мотор не будет работать.

Еще раз я провел тесты, в которых отключил питание от макетной платы и заменил вывод напряжения для двигателя выводом напряжения, ведущим от кнопки.

Первым делом не стал менять вход (то есть по-прежнему "АктиверетАктиверет"), последним завел мотор.

То есть речь идет не о плохой проводке.

ПРАВКА:

Добавлены схемы и изменен код

, 👍2

Обсуждение

- проверено, мотор и кнопка подключены правильно... откуда ты знаешь?, @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


2 ответа


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

1

Для надежной работы вашей кнопки необходим выдвижной резистор.

См. Обсуждение и решение здесь

Резистор со значением около 10K (но, вероятно, подойдет любое значение от 3K до 20K) должен находиться между входным контактом или вашим Arduino и землей, чтобы придать ему определенное значение при отпускании кнопки.

Установка резистора между выводом Arduino и землей гарантирует, что вывод читается как "низкий", когда ни одна кнопка не нажата. Когда кнопка нажата, она будет подключена непосредственно к + 5V и будет считывать высокий уровень. В этом случае только небольшой ток (0,5 мА) будет протекать от + 5В к земле через резистор 10К Ом. Это не создаст короткого замыкания.

,

1

Какой мотор вы используете? Если он работает прямо от 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