Контролируем беспроводную машинку жестами

В этом уроке мы узнаем, как сделать так, чтобы автомобилем или роботом можно было бы управлять на расстоянии жестами. Этот проект имеет две части, одна часть - передающее устройство, а другая часть - блок приемника. Блок передатчика на самом деле установлен на перчатках, а блок приемника помещен внутри автомобиля или любого робота. Теперь пришло время сделать классный автомобиль. Поехали!

Шаг 1: Комплектующие

Как сказали выше - мы можем разделить наши комплектующие на части. Сначала нам пригодятся:

  1. Ардуино Нано
  2. Модуль датчика MPU6050
  3. Передатчик RF 433 МГц
  4. Любой тип 3-элементной, 11,1-вольтовой батареи
  5. Плата
  6. Перчатки для рук

Приемник

  1. Ардуино Нано или Ардуино Уно
  2. Модуль драйвера двигателя L298N
  3. 4-колесная роботизированная рама, включая двигатели
  4. RF 433 RF приемник
  5. 3-элементная, 11,1-вольтовая батарея Li-po
  6. плата

Дополнительно нам понадобятся:

  1. Клей
  2. Провода-перемычки
  3. Отвертка
  4. Комплект для пайки
  5. и т.п.

Шаг 2: Схема соединения

Схема соединения выше. Вы можете скачать файл для программы Fritzing ниже:

Шаг 4: Код передатчика

Вы можете скачать или скопировать код передатчика ниже:

#include <VirtualWire.h>
#include <MPU6050_tockn.h>
#include <Wire.h>

MPU6050 mpu6050(Wire);

long timer = 0;
char *controller;

void setup() 
{
  Serial.begin(9600);
  Wire.begin();
  mpu6050.begin();
  mpu6050.calcGyroOffsets(true);
  vw_set_ptt_inverted(true); //
  vw_set_tx_pin(10);
  vw_setup(4000);// speed of data transfer Kbps

}

void loop() 
{
////////////////////////////////////////////////////////////////////////////////////////////////

 mpu6050.update();

  if(millis() - timer > 1000)
  {
    
    Serial.println("=======================================================");
    Serial.print("temp : ");Serial.println(mpu6050.getTemp());
    Serial.print("accX : ");Serial.print(mpu6050.getAccX());
    Serial.print("\taccY : ");Serial.print(mpu6050.getAccY());
    Serial.print("\taccZ : ");Serial.println(mpu6050.getAccZ());
  
    Serial.print("gyroX : ");Serial.print(mpu6050.getGyroX());
    Serial.print("\tgyroY : ");Serial.print(mpu6050.getGyroY());
    Serial.print("\tgyroZ : ");Serial.println(mpu6050.getGyroZ());
  
    Serial.print("accAngleX : ");Serial.print(mpu6050.getAccAngleX());
    Serial.print("\taccAngleY : ");Serial.println(mpu6050.getAccAngleY());
  
    Serial.print("gyroAngleX : ");Serial.print(mpu6050.getGyroAngleX());
    Serial.print("\tgyroAngleY : ");Serial.print(mpu6050.getGyroAngleY());
    Serial.print("\tgyroAngleZ : ");Serial.println(mpu6050.getGyroAngleZ());
    
    Serial.print("angleX : ");Serial.print(mpu6050.getAngleX());
    Serial.print("\tangleY : ");Serial.print(mpu6050.getAngleY());
    Serial.print("\tangleZ : ");Serial.println(mpu6050.getAngleZ());
    Serial.println("=======================================================\n");
    timer = millis();
    
  }

/////////////////////////////////////////////////////////////////////////////////////
  if (mpu6050.getAccAngleX()<-25)
  { 
    controller="X1"  ;
    vw_send((uint8_t *)controller, strlen(controller));
    vw_wait_tx(); // Wait until the whole message is gone
    Serial.println("BACKWARD");
  } 
  else if (mpu6050.getAccAngleX()>30)
  { 
    controller="X2"  ;
    vw_send((uint8_t *)controller, strlen(controller));
    vw_wait_tx(); // Wait until the whole message is gone
Serial.println("FORWARD");
  }
  else if (mpu6050.getAccAngleY()>40 )
  { 
    controller="Y1"  ;
    vw_send((uint8_t *)controller, strlen(controller));
    vw_wait_tx(); // Wait until the whole message is gone
Serial.println("LEFT");
  }
    else if (mpu6050.getAccAngleY()<-40)
  { 
    controller="Y2"  ;
    vw_send((uint8_t *)controller, strlen(controller));
    vw_wait_tx(); // Wait until the whole message is gone
Serial.println("RIGHT");
  }
    else if (mpu6050.getAccAngleX()<10 && mpu6050.getAccAngleX()>-10 && mpu6050.getAccAngleY()<10 && mpu6050.getAccAngleY()>-10)
  { 
    controller="A1"  ;
    vw_send((uint8_t *)controller, strlen(controller));
    vw_wait_tx(); // Wait until the whole message is gone
Serial.println("STOP");
  }
}

Шаг 5: Код приемника

Вы можете скачать или скопировать код приемника ниже:

#include <VirtualWire.h>

int LA = 3;
int LB = 11;
int RA = 5;
int RB = 6;
void setup()
{
Serial.begin(9600);
vw_set_ptt_inverted(true); // Required for DR3100
vw_set_rx_pin(12);
vw_setup(4000);  // Bits per sec
pinMode(13, OUTPUT);
pinMode(LA, OUTPUT);
pinMode(LB, OUTPUT);
pinMode(RA, OUTPUT);
pinMode(RB, OUTPUT);
vw_rx_start();       // Start the receiver PLL running
Serial.println("All OK");

}
    void loop()
{
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;

if (vw_get_message(buf, &buflen)) // Non-blocking
{
if((buf[0]=='X')&&(buf[1]=='1'))
  {   
  Serial.println("BACKWARD");
  backward();
  delay(100);
  //off();
  }  
      
      
else if((buf[0]=='X')&&(buf[1]=='2'))
  {  
  Serial.println("FORWARD");
  forward();
  delay(100);
  //off();
  }

else if((buf[0]=='Y')&&(buf[1]=='1'))
  {  
   Serial.println("LEFT");
   left();
   delay(100);
   //off();
  }

else if((buf[0]=='Y')&&(buf[1]=='2'))
  {  
  Serial.println("RIGHT");
  right();
  delay(100);
  //off();
  }
else if((buf[0]=='A')&&(buf[1]=='1'))
  {  
  Serial.println("STOP");
  off();
  delay(100);
  }
      
}
else
{
  Serial.println("No Signal Received");
}
}

void forward()
{ 
  analogWrite(LA, 70);
  analogWrite(LB, 0);
  analogWrite(RA, 70);
  analogWrite(RB, 0);
}

void backward()
{ 
  analogWrite(LA, 0);
  analogWrite(LB, 70);
  analogWrite(RA, 0);
  analogWrite(RB, 70);
}

void left()
{ 
  analogWrite(LA, 0);
  analogWrite(LB, 70);
  analogWrite(RA, 70);
  analogWrite(RB, 0);
}

void right()
{ 
  analogWrite(LA, 70);
  analogWrite(LB, 0);
  analogWrite(RA, 0);
  analogWrite(RB, 70);
}

void off()
{ 
  analogWrite(LA, 0);
  analogWrite(LB, 0);
  analogWrite(RA, 0);
  analogWrite(RB, 0);
}

Дополнительно вам понадобится скачать несколько библиотек:

Библиотека Virtual Wire - скачать

Библиотека MPU6050_tockn - скачать

Библиотека Wire - скачать

На этом всё. Надеюсь у вас всё получится.

22 сентября 2018 в 21:38 | Обновлено 7 декабря 2019 в 00:12 (редакция)
Опубликовано:
Уроки, ,

1 комментарий

  1. Роман Бондаренко
    26 июня 2021 в 16:40

    Код передатчика поправьте немного
    const char *controller;

    Ответить

Добавить комментарий

Ваш E-mail не будет никому виден. Обязательные поля отмечены *