|
Робот с дистанционным управлением RF
с использованием модуля ASK
и Arduino
Основная часть этого робота или радиоуправляемого автомобиля - это радиочастотный пульт дистанционного управления и приводной механизм. Для дистанционного управления RF в схеме есть недорогой модуль ASK 433 МГц, который представляет собой пару модулей передатчика и приемника. Здесь, в этом проекте, ASK отправляет и получает данные с помощью библиотеки Arduino. Обратитесь к интерфейсу модуля ASK 433Mhz с Arduino с использованием библиотеки Radiohead Поскольку и передатчик, и приемник нуждаются в библиотеке Arduino для связи, и передатчик, и приемник требуют платы Arduino. В данной схеме есть плата UNO, но любые небольшие платы Arduino, такие как pro mini, nano, micro и т. Д. Или автономный микроконтроллер ATmega328p, также могут быть использованы, чтобы сделать устройство более компактным и менее дорогим. Механизм управления движением и направлением радиоуправляемого автомобиля приводится в действие двумя задними приводными двигателями, направление вращения которых может независимо контролироваться водителем двигателя. Две передние шины находятся в режиме холостого хода или свободного движения.
Основное преимущество этого робота в том, что его можно расширить до любых дополнительных функций путем простых изменений в схеме и коде. Поскольку радиочастотная связь использует библиотеку передачи данных, можно добавить любое дополнительное управление двигателями, освещением и т. Д. Кроме того, используя дополнительную пару модулей ASK TX и RX, робот может измерять и отправлять такие значения, как показания датчиков, координаты, сообщение подтверждения и т. Д., Обратно на приемник.
Пульт дистанционного управления имеет 2 пары переключателей, одна пара для прямого и обратного хода, а другая для поворота влево и вправо. Чтобы переместить робота в прямом или обратном направлении, просто нужно нажать только кнопку прямого или обратного хода. Чтобы повернуть влево или вправо в прямом или обратном направлении, нажмите кнопки влево или вправо вместе с кнопками вперед или назад. На изображениях ниже показано, как роботы перемещаются в разных направлениях за счет изменения вращения шин с соответствующими удаленными входами.
Прямое и обратное движение
Робот RC движется в прямом направлении, когда оба колеса вращаются вперед. То есть правое колесо вращается по часовой стрелке, а левое колесо вращается против часовой стрелки (наблюдая за правым мотором с правой стороны и левым мотором с левой стороны).
Как раз напротив переднего хода, при движении назад оба колеса вращаются назад, то есть правое колесо вращается против часовой стрелки, а левый двигатель вращается по часовой стрелке.
Правый или левый поворот
Здесь поворот робота вправо или влево как в прямом, так и в обратном направлении достигается путем остановки вращения одного из двигателей.
Вперед влево - правое колесо вращается вперед или по часовой стрелке, левое колесо останавливается. Вперед вправо - левое колесо вращается вперед или против часовой стрелки, правое колесо останавливается. Чтобы повернуть RC-робот вправо, вращение правого мотора останавливается, а левому мотору разрешается продолжать вращение в текущем направлении движения. Аналогично, при повороте влево левое колесо останавливается, а правое колесо продолжает вращаться. Это может применяться как для движения вперед, так и назад. Следовательно, автомобиль можно поворачивать влево и вправо как во время движения вперед, так и назад.
Назад влево - правое колесо вращается назад или против часовой стрелки, левое колесо останавливается.
Назад вправо - левое колесо вращается назад или по часовой стрелке, правое колесо останавливается.
Кроме того, вместо остановки колеса можно изменить направление, уменьшив скорость двигателя или повернув его в противоположном направлении.
Передатчик или пульт
Схема передатчика в основном имеет только 4 входных переключателя, модуль ASK TX и Arduino.
Используя библиотеку Radiohead, часть передатчика Arduino отправляет соответствующие слова или массив символов в приемник через модуль ASK для соответствующего входа переключателя; каждое слово - это сообщение или команда для определенного действия.
Код Tx
#include <RH_ASK.h>
#include <SPI.h>
const int forward_switch = 2, reverse_switch = 3, left_switch = 4, right_switch = 5;
int state = 0;
char *msg;
RH_ASK driver;
void setup()
{
driver.init();
pinMode(forward_switch, INPUT);
pinMode(reverse_switch, INPUT);
pinMode(left_switch, INPUT);
pinMode(right_switch, INPUT);
}
void loop()
{
while (digitalRead(forward_switch) == HIGH && digitalRead(left_switch) == LOW
&& digitalRead(right_switch) == LOW) {
msg = "forward";
transmit(msg);
}
while (digitalRead(reverse_switch) == HIGH && digitalRead(left_switch) == LOW
&& digitalRead(right_switch) == LOW) {
msg = "reverse";
transmit(msg);
}
while (digitalRead(forward_switch) == HIGH && digitalRead(left_switch) == HIGH) {
msg = "forward_left";
transmit(msg);
}
while (digitalRead(forward_switch) == HIGH && digitalRead(right_switch) == HIGH) {
msg = "forward_right";
transmit(msg);
}
while (digitalRead(reverse_switch) == HIGH && digitalRead(left_switch) == HIGH) {
msg = "reverse_left";
transmit(msg);
}
while (digitalRead(reverse_switch) == HIGH && digitalRead(right_switch) == HIGH) {
msg = "reverse_right";
transmit(msg);
}
}
void transmit(char* msg) {
driver.send((uint8_t *)msg, strlen(msg));
driver.waitPacketSent();
delay(100);
}
Приемник или радиоуправляемая машина / робот
В приемной части есть плата Arduino, приемник ASK и 2 двигателя, управляемые драйвером двигателя L293D.
Драйвер двигателя нуждается во внешнем источнике питания для двигателей, который может быть подключен к драйверу L293D.
Rx код
#include <RH_ASK.h>
#include <SPI.h>
RH_ASK driver;
const int motor_1a = 7, motor_1b = 6, motor_2a = 5, motor_2b = 4;
char receive[32];
unsigned long last = 0;
void setup()
{
driver.init();
pinMode(motor_1a, OUTPUT);
pinMode(motor_1b, OUTPUT);
pinMode(motor_2a, OUTPUT);
pinMode(motor_2b, OUTPUT);
}
void loop()
{
uint8_t buf[RH_ASK_MAX_MESSAGE_LEN];
uint8_t buflen = sizeof(buf);
if (driver.recv(buf, &buflen))
{
last = millis();
memset(receive, 0, sizeof(receive));
for (int i = 0; i < buflen; i++) {
receive[i] = buf[i];
}
if (strcmp(receive, "forward") == 0) {
forward();
}
else if (strcmp(receive, "reverse") == 0) {
reverse();
}
else if (strcmp(receive, "forward_left") == 0) {
forward_left();
}
else if (strcmp(receive, "forward_right") == 0) {
forward_right();
}
else if (strcmp(receive, "reverse_left") == 0) {
reverse_left();
}
else if (strcmp(receive, "reverse_right") == 0) {
reverse_right();
}
}
if ((millis() - last) > 300) {
brake();
}
}
void forward() {
digitalWrite(motor_1a, HIGH);
digitalWrite(motor_1b, LOW);
digitalWrite(motor_2a, HIGH);
digitalWrite(motor_2b, LOW);
}
void reverse() {
digitalWrite(motor_1a, LOW);
digitalWrite(motor_1b, HIGH);
digitalWrite(motor_2a, LOW);
digitalWrite(motor_2b, HIGH);
}
void forward_left() {
digitalWrite(motor_1a, LOW);
digitalWrite(motor_1b, LOW);
digitalWrite(motor_2a, HIGH);
digitalWrite(motor_2b, LOW);
}
void forward_right() {
digitalWrite(motor_1a, HIGH);
digitalWrite(motor_1b, LOW);
digitalWrite(motor_2a, LOW);
digitalWrite(motor_2b, LOW);
}
void reverse_left() {
digitalWrite(motor_1a, LOW);
digitalWrite(motor_1b, LOW);
digitalWrite(motor_2a, LOW);
digitalWrite(motor_2b, HIGH);
}
void reverse_right() {
digitalWrite(motor_1a, LOW);
digitalWrite(motor_1b, HIGH);
digitalWrite(motor_2a, LOW);
digitalWrite(motor_2b, LOW);
}
void brake() {
digitalWrite(motor_1a, LOW);
digitalWrite(motor_1b, LOW);
digitalWrite(motor_2a, LOW);
digitalWrite(motor_2b, LOW);
}
Чтобы легко соединить провода Arduino и L293D, запустите состояние цифровой записи вывода только в функции прямого направления, чтобы найти направление вращения. Как только входные провода двигателя подключены для получения прямого направления вращения, другое вращение также работает, как в коде. Движения для различных комбинаций переключателей можно легко изменить, изменив код передатчика и приемника. В приведенном выше коде робот остается в покое, если левый или правый переключатели нажимаются отдельно без кнопок вперед или назад. Но с помощью простых изменений в коде можно заставить его вращаться влево или вправо, если нажать отдельно, без каких-либо движений вперед или назад; вращая левый и правый моторы в противоположном направлении. Для вращения по часовой стрелке или вправо - Поверните правый и левый моторы против часовой стрелки; правая сторона назад и левая сторона вперед. Для вращения против часовой стрелки или влево - Поверните правый и левый моторы по часовой стрелке; правая сторона вперед и левая сторона назад. Кроме того, этот робот может быть легко модифицирован с помощью механизма рулевого управления с использованием сервопривода или других механизмов с передним двигателем с одним задним двигателем для прямого и обратного привода.
Механизм рулевого управления для радиоуправляемой машины с использованием серводвигателя и Arduino
Сервоуправляемый механизм - это простой метод, который можно использовать для точного управления положением рулевого управления радиоуправляемых машин и небольших роботов. В отличие от обычного рулевого управления на основе двигателя постоянного тока, сервоуправление осуществляется с помощью углового градуса, поэтому сам двигатель может останавливаться и сохранять положение без дополнительных механических частей или стопора.
#include <Servo.h>
Servo servo_steering;
const int switch_left = 2, switch_right = 3;
int left_degree = 45, center_degree = 90, right_degree = 135;
void setup() {
servo_steering.attach(9);
pinMode(switch_left, OUTPUT);
pinMode(switch_right, OUTPUT);
}
void loop() {
while (digitalRead(switch_left) == HIGH) {
servo_steering.write(left_degree);
delay(15);
}
while (digitalRead(switch_right) == HIGH) {
servo_steering.write(right_degree);
delay(15);
}
servo_steering.write(center_degree);
delay(15);
}
В приведенном выше коде сервомеханизмы находятся в положении 90 °; это центральное положение сервопривода 180 °. Здесь сервомеханизм перемещается влево и вправо при нажатии соответствующих переключателей, он сохраняет положение, пока переключатель нажат. После отпускания руки вернитесь в исходное положение.
Значение угла для левого угла составляет 45 °, а для правого - 135 °; то есть на 45 ° по часовой стрелке и против часовой стрелки от центрального положения на 90 °. Изменяя эти значения, можно отрегулировать или точно настроить требуемый диапазон движения. Здесь левый или правый диапазон движения или центральное положение покоя могут быть независимо отрегулированы до любых градусов. Таким образом, в этом методе калибровка положения шин довольно проста и надежна по сравнению с механическими устройствами с обычными двигателями.
Для операции с дистанционным управлением функция условия может быть заменена в приемнике побочным кодом на беспроводные данные или сообщение для запуска кода записи сервопривода или вызвать его как функцию, указанную ниже.
void left() {
servo_steering.write(left_degree);
delay(15);
}
void right() {
servo_steering.write(right_degree);
delay(15);
}
Радиочастотное дистанционное управление с использованием Arduino и модуля ASK 433 МГц
Радиочастотный пульт дистанционного управления - это устройство, которое можно использовать для беспроводного включения / выключения оборудования с помощью радиочастотной передачи. Часть пульта ДУ или передатчика - это портативное устройство, которое имеет переключатели или другие входные параметры для выбора операции. На стороне приемника он выполняет операцию включения / выключения в соответствии с данными передаваемого сигнала.
Радиочастотные пульты ДУ являются эффективным и хорошим выбором для различных приложений дистанционного управления. По сравнению с инфракрасными пультами дистанционного управления радиочастотные пульты дистанционного управления имеют больший рабочий диапазон, и даже им не требуется прямая видимость между передатчиком и приемником.
В этой схеме для передачи RF используется модуль ASK 433 МГц. Обратитесь к интерфейсу модуля ASK с Arduino с использованием библиотеки Radiohead.
Радиочастотный пульт дистанционного управления одним устройством
Передатчик
Схема выносного передатчика - рисунок 1
Схема передатчика имеет два переключателя: один - переключатель ВКЛ, а другой - переключатель ВЫКЛ. Передатчик отправляет строку «Switch_ON» и «Switch_OFF» при нажатии переключателей ON и OFF соответственно.
Код передатчика
#include <RH_ASK.h>
#include <SPI.h>
const int switch_on = 2, switch_off = 3 ;
int state = 0;
char *msg;
RH_ASK driver;
void setup()
{
driver.init();
pinMode(switch_on, INPUT);
pinMode(switch_off, INPUT);
}
void loop()
{
if (digitalRead(switch_on) == HIGH) {
msg = "Switch_ON";
state = 1;
}
else if (digitalRead(switch_off) == HIGH) {
msg = "Switch_OFF";
state = 1;
}
else if (state == 1) {
driver.send((uint8_t *)msg, strlen(msg));
driver.waitPacketSent();
delay(200);
state = 0;
}
}
Приемник
Схема приемника дистанционного управления - рисунок 2
Приемник сравнивает, совпадает ли полученная строка с какой-либо из сравниваемых строк, а затем либо переключает цифровой выход в состояние ВЫСОКОЕ или НИЗКОЕ по отношению к полученной строке; Переключается в состояние ВЫСОКОЕ, если полученная строка - «Switch_ON», или в состояние «ВЫСОКОЕ», если это «Switch_OFF».
Код получателя
#include <RH_ASK.h>
#include <SPI.h>
RH_ASK driver;
const int output = 2;
char receive[32];
void setup()
{
driver.init();
pinMode(output, OUTPUT);
}
void loop()
{
uint8_t buf[RH_ASK_MAX_MESSAGE_LEN];
uint8_t buflen = sizeof(buf);
if (driver.recv(buf, &buflen))
{
memset(receive, 0, sizeof(receive));
for (int i = 0; i < buflen; i++) {
receive[i] = buf[i];
}
if (strcmp(receive, "Switch_ON") == 0) {
digitalWrite(output, HIGH);
} else if (strcmp(receive, "Switch_OFF") == 0) {
digitalWrite(output, LOW);
}
}
}
Цифровой выход на приемнике подключен к релейному модулю, который может использоваться для управления любыми нагрузками с помощью внешних источников питания.
Убедитесь, что номинальные параметры реле, такие как сопротивление катушки, ток нагрузки, рабочее напряжение и т. Д., Соответствуют току ввода-вывода Arduino, току нагрузки и т. Д.
Чтобы сделать устройство компактным и удобным, та же схема и контактное соединение могут использоваться с небольшими платами, такими как Arduino nano, pro mini и т. Д.
Дополнительные коды
Управление одним устройством с помощью переключателя с фиксацией
Вышеупомянутая схема имеет два отдельных переключателя для включения и выключения устройства. Здесь один переключатель используется в качестве переключателя с фиксацией, который может включать и выключать выход для попеременного нажатия переключателя.
Передатчик
#include <RH_ASK.h>
#include <SPI.h>
const int switch_in = 3;
int state = 0;
char *msg;
RH_ASK driver;
void setup()
{
driver.init();
pinMode(switch_in, INPUT);
}
void loop()
{
if (digitalRead(switch_in) == HIGH && state == 1) {
msg = "Switch";
driver.send((uint8_t *)msg, strlen(msg));
driver.waitPacketSent();
delay(200);
state = 0;
}
else if (digitalRead(switch_in) == LOW) {
state = 1;
}
}
Каждый раз, когда передатчик отправляет один и тот же текст «переключатель», приемник переключает выход каждый раз, когда он получает строку «переключатель».
Получатель
См. Схему на рисунке 2.
#include <RH_ASK.h>
#include <SPI.h>
RH_ASK driver;
const int output = 2;
char receive[32];
int output_state = 0;
void setup()
{
driver.init();
pinMode(output, OUTPUT);
}
void loop()
{
uint8_t buf[RH_ASK_MAX_MESSAGE_LEN];
uint8_t buflen = sizeof(buf);
if (driver.recv(buf, &buflen))
{
memset(receive, 0, sizeof(receive));
for (int i = 0; i < buflen; i++) {
receive[i] = buf[i];
}
if (strcmp(receive, "Switch") == 0) {
output_state = !output_state;
digitalWrite(output, output_state);
}
}
}
Пульт дистанционного управления с несколькими устройствами
Вышеупомянутый код управления одним устройством с фиксированным входом и без него может быть изменен для добавления дополнительных выходов. В приведенном ниже первом коде используются отдельные переключатели для включения и выключения каждого выхода.
Передатчик
Подключите дополнительные переключатели к контактам 4 и 5, как показано на рисунке 1.
#include <RH_ASK.h>
#include <SPI.h>
const int switch_A_on = 2, switch_A_off = 3, switch_B_on = 4, switch_B_off = 5;
int state = 0;
char *msg;
RH_ASK driver;
void setup()
{
driver.init();
pinMode(switch_A_on, INPUT);
pinMode(switch_A_off, INPUT);
pinMode(switch_B_on, INPUT);
pinMode(switch_B_off, INPUT);
}
void loop()
{
if (digitalRead(switch_A_on) == HIGH) {
msg = "Switch_A_ON";
state = 1;
}
else if (digitalRead(switch_A_off) == HIGH) {
msg = "Switch_A_OFF";
state = 1;
}
else if (digitalRead(switch_B_on) == HIGH) {
msg = "Switch_B_ON";
state = 1;
}
else if (digitalRead(switch_B_off) == HIGH) {
msg = "Switch_B_OFF";
state = 1;
}
if (state == 1) {
driver.send((uint8_t *)msg, strlen(msg));
driver.waitPacketSent();
delay(200);
state = 0;
}
}
Здесь отправляются четыре отдельные строки для выполнения операций включения и выключения выходов A и B; 4 переключателя для 4 операций - ВКЛ выход A, ВЫКЛ выход A, ВКЛ выход B, ВЫКЛ выход B.
Приемник
#include <RH_ASK.h>
#include <SPI.h>
RH_ASK driver;
const int output_A = 2, output_B = 3;
char receive[32];
void setup()
{
driver.init();
pinMode(output_A, OUTPUT);
pinMode(output_B, OUTPUT);
}
void loop()
{
uint8_t buf[RH_ASK_MAX_MESSAGE_LEN];
uint8_t buflen = sizeof(buf);
if (driver.recv(buf, &buflen))
{
memset(receive, 0, sizeof(receive));
for (int i = 0; i < buflen; i++) {
receive[i] = buf[i];
}
if (strcmp(receive, "Switch_A_ON") == 0) {
digitalWrite(output_A, HIGH);
}
else if (strcmp(receive, "Switch_A_OFF") == 0) {
digitalWrite(output_A, LOW);
}
else if (strcmp(receive, "Switch_B_ON") == 0) {
digitalWrite(output_B, HIGH);
}
else if (strcmp(receive, "Switch_B_OFF") == 0) {
digitalWrite(output_B, LOW);
}
}
}
Управление несколькими устройствами с помощью переключателя с фиксацией
Подобно тому, как одно устройство фиксирует одну и ту же строку для повторного действия на одном и том же выходе, получатель переключает состояние выхода. Здесь можно управлять включением и выключением двух выходов с помощью 2 переключателей.
См. Схему на рисунке 1.
Передатчик
#include <RH_ASK.h>
#include <SPI.h>
const int switch_A = 2, switch_B = 3;
int state = 0, msg_state = 0;
char *msg, *msglast;
RH_ASK driver;
void setup()
{
driver.init();
pinMode(switch_A, INPUT);
pinMode(switch_B, INPUT);
Serial.begin(9600);
}
void loop()
{
if (digitalRead(switch_A) == HIGH && state == 0) {
msg = "Switch_A";
state = 1;
msg_state = 1;
}
else if (digitalRead(switch_B) == HIGH && state == 0) {
msg = "Switch_B";
state = 1;
msg_state = 1;
}
else if (digitalRead(switch_A) == LOW && digitalRead(switch_B) == LOW) {
state = 0;
}
if (msg_state == 1) {
Serial.println(msg);
driver.send((uint8_t *)msg, strlen(msg));
driver.waitPacketSent();
delay(200);
msg_state = 0;
}
}
Получатель
См. Схему - 4.
#include <RH_ASK.h>
#include <SPI.h>
RH_ASK driver;
const int output_A = 2, output_B = 3;
int output_A_state = 0, output_B_state = 0;
char receive[32];
void setup()
{
driver.init();
pinMode(output_A, OUTPUT);
pinMode(output_B, OUTPUT);
}
void loop()
{
uint8_t buf[RH_ASK_MAX_MESSAGE_LEN];
uint8_t buflen = sizeof(buf);
if (driver.recv(buf, &buflen))
{
memset(receive, 0, sizeof(receive));
for (int i = 0; i < buflen; i++) {
receive[i] = buf[i];
}
if (strcmp(receive, "Switch_A") == 0) {
output_A_state = !output_A_state;
digitalWrite(output_A, output_A_state);
} else if (strcmp(receive, "Switch_B") == 0) {
output_B_state = !output_B_state;
digitalWrite(output_B, output_B_state);
}
}
}
Вот и все