Arduino Uno с двигателем с ШИМ и беспроводным приемником 433 МГц не работает

Я новичок в теме Arduino и пытаюсь заставить несколько вещей работать вместе.

Сначала я попытался настроить двигатель постоянного тока, которым можно управлять с помощью ШИМ, который отлично работает при автономном использовании. Я могу запустить/остановить двигатель и изменить скорость в зависимости от значения, которое я посылаю на вывод PWM.

Во-вторых, я попытался использовать беспроводной приемник RF-5V для работы с пультом дистанционного управления от дистанционно переключаемых розеток. Для этого я следовал инструкциям как собрать 433 МГц сниффер. Все это само по себе тоже работает. Я могу получать разные коды в зависимости от того, какие клавиши на пульте я нажимаю.

Теперь началось самое интересное: я хотел объединить оба проекта в один, чтобы можно было использовать пульт дистанционного управления для запуска/остановки двигателя. Итак, я придумал следующую схему:

Схема ШИМ-двигателя с беспроводным приемником

(Спасибо, что некоторые из вас указали, что схема не соответствует эскизу. Я сделал ошибку при рисовании, но даже с кабелями, подключенными к правильным контактам, все работает, как описано)

и следующий код (который частично взят из инструкций, упомянутых выше):

#include <RCSwitch.h>

// init 433MHz lib
RCSwitch mySwitch = RCSwitch();
unsigned long lOldValue=0;  // to check for consecutive reads on 433MHz
int motorPin = 5; // PWM-Pin to use for motor

void setup()
{
  pinMode(motorPin, OUTPUT);

  Serial.begin(9600);

  // set-up rf receiver
  mySwitch.enableReceive(0);  // 433MHz Receiver on interrupt 0 => that is pin #2
}

void loop()
{
  if (mySwitch.available())
  {
    int value = mySwitch.getReceivedValue();

    // only react, if at least two times same value received
    if (value == lOldValue)
    {
      if (value == 0)
      {
        Serial.print("Unknown encoding");
      }
      else
      {
        Serial.print("Received ");
        Serial.print( mySwitch.getReceivedValue() );
        Serial.print(" / ");
        Serial.print( mySwitch.getReceivedBitlength() );
        Serial.print("bit ");
        Serial.print("Protocol: ");
        Serial.println( mySwitch.getReceivedProtocol() );

    // One of the keys on the remote
    if (value == 274393) {
      Serial.println("got start code, starting motor");
          analogWrite(motorPin, 100); // start the motor
    }

    // another key on the remote
    if (value == 270384) {
      Serial.println("got stop code, stopping motor");
          analogWrite(motorPin, 0); // stop the motor
    }
      }
    }
    lOldValue = value;
    mySwitch.resetAvailable();
  }
}

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

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

И здесь начинается самое интересное: как только я использую функцию AnalogWrite для отправки данных в порт ШИМ, к которому подключен двигатель, беспроводной приемник перестает работать (или, по крайней мере, я больше не получаю значения при нажатии клавиши на удаленный).

Я нашел несколько похожих сообщений/описаний проблем в сети, в которых говорилось, что нужно попробовать следующее:

  • Используйте другой вывод для ШИМ (из-за возможных конфликтов прерываний). Я тоже пробовал, такое же поведение
  • Используйте внешний блок питания вместо USB-кабеля, который помог кому-то решить эту проблему. Не здесь. Тоже не работает

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


person Olli    schedule 09.01.2017    source источник
comment
Если отключить двигатель, оставив ту же программу, и, может быть, поставить светодиод с резистором, это решит проблему? Если она решена, проблема либо в недостаточной мощности, либо в шуме. Вы можете решить первую проблему, питая схемы от внешнего источника (попробуйте использовать настольный источник питания, тогда вы можете попытаться использовать одну батарею, но просто подтвердите это, прежде чем приступить к проектированию). Если будут какие-то помехи, поставьте рядом с питанием двигателя конденсатор (чем больше, тем лучше, хотя бы пару сотен мкФ).   -  person frarugi87    schedule 09.01.2017
comment
@ frarugi87 Как ни странно, проблема все еще существует, когда я не подключаю двигатель к цепи. Даже вызов AnalogWrite без подключенного оборудования приводит к такому же поведению.   -  person Olli    schedule 09.01.2017
comment
Подождите, вы написали int motorPin = 5;, но в схеме вы подключили двигатель к выводу 3, а к выводу 5 у вас трансивер 433... Правильно ли вы поправили?   -  person frarugi87    schedule 09.01.2017
comment
@ frarugi87 О, глупый я ... я действительно сделал схему схемы неправильно .. извините за это .. это произошло после того, как я несколько раз менял вывод ШИМ и запутался ... :( но с кабелями, как код использует его , все равно не получилось.   -  person Olli    schedule 09.01.2017
comment
это работает, когда вы не подключаете двигатель и не подключаете диод?   -  person dandavis    schedule 10.01.2017
comment
@dandavis спасибо за подсказку .. я попробую сегодня вечером! не пробовала это сочетание!   -  person Olli    schedule 10.01.2017
comment
хорошо, если это наоборот, то активация npn потянет 5-вольтовую шину ...   -  person dandavis    schedule 10.01.2017


Ответы (1)


У меня такая же проблема в прошлом. Проблема заключается в способности arduino обеспечить их обоих. Я рекомендую использовать внешний источник питания для приемника или для двигателя (лучше всего сделать это для двигателя, но по вашей схеме это невозможно), как 545043YwRobot, а другой питать от ардуино (я надеюсь, это не то, что вы уже пробовали, если так, извините).

Надеюсь, это поможет.

Йоав

person YoavShtainer    schedule 09.01.2017
comment
спасибо за эту информацию. Я постараюсь проверить, решит ли это проблему. Но из-за ограниченного пространства в моем дизайне я бы не смог добавить два блока питания в свой корпус. Я надеялся, что смогу использовать только один 9-вольтовый блок для питания всей схемы. Любые идеи по этому поводу? - person Olli; 09.01.2017
comment
попробуй зайти на ардуино, а регулятор напрямую от аккумулятора. - person YoavShtainer; 09.01.2017