Я новичок в теме 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-кабеля, который помог кому-то решить эту проблему. Не здесь. Тоже не работает
Итак, вопрос: кто-нибудь знает, как объединить эти две вещи вместе, чтобы можно было использовать беспроводной приемник для получения команд и включения/выключения двигателя с его помощью?
int motorPin = 5;
, но в схеме вы подключили двигатель к выводу 3, а к выводу 5 у вас трансивер 433... Правильно ли вы поправили? - person frarugi87   schedule 09.01.2017