• I






      
           

Научно-популярный образовательный ресурс для юных и начинающих радиолюбителей - Popular science educational resource for young and novice hams

Основы электричества, учебные материалы и опыт профессионалов - Basics of electricity, educational materials and professional experience

КОНКУРС
language
 
Поиск junradio

Радиодетали
ОК
Сервисы

Stock Images
Покупка - продажа
Фото и изображений


 
Выгодный обмен
электронных валют

Друзья JR



JUNIOR RADIO

 

Робот с дистанционным управлением 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);

    }

  }

}

Вот и все




Необходимо добавить материалы...
Результат опроса Результаты Все опросы нашего сайта Архив опросов
Всего голосовало: 373



          

Радио для всех© 2024