4

Hướng dẫn làm xe leo tường điều khiển từ xa | arduino 2019

4.4/5 - (8 bình chọn)

Bạn từng ước muốn tự làm cho mình một chiếc xe có thể bám và di chuyển trên tường? ESPITEK xin hướng dẫn làm xe leo tường có thể điều khiển nó di chuyển trên bước tường thẳng đứng, THẬT ĐÓ -> Let Go ?‍??‍?

Bài viết bạn nên đọc:

Video xe bám tường:

Nguyên lý hoạt động của xe leo tường

Để có thể bám dính trên tường thì nguyên lý chung của các hệ thống là phải dùng đến các lực : Hút, đẩy. Ở đây hút tức là tạo ra 1 lực hút chân không giúp xe có thể bám lên tường, còn lực đẩy tức là ngược lại với hút, ta tạo ra một lực đẩy đủ mạnh để ép xe vào tường nhưng vẫn có khả năng di chuyển trên tường. Có khá nhiều bài viết hướng dẫn làm xe leo tường nhưng đa số chỉ là giới thiệu nguyên lý, thành quả mà thôi, vì phần lớn thành công phụ thuộc vào phần cứng nên bạn phải tự mình nghiên cứu để có thể thực hiện tốt nhất.

Robot leo tường dùng cơ cấu hút nam châm điện

Nguồn: Robot Gecko

Di chuyển trên bề mặt kim loại sử dụng hút nam châm điện

Robot leo tường dùng cơ cấu đẩy

Nguồn: Robot Vertigo

Sử dụng lực đẩy của hai cánh quạt giúp ép chặc xe vào tường và dễ dàng di chuyển theo các phương, có khả năng di chuyển trên mặt đất nhờ 4 bánh linh hoạt.

Robot leo tường thằng lằng

Nguồn: boston dynamics

Mô phỏng lại khả năng bám dính như một con tắc kè

?Trong bài viết này mình sử dụng phương pháp hút chân không, tạo một khung xe với gầm đủ hẹp để động cơ phản lực có thể hút không khí bên trong gầm xe tạo ra một lực hút. Đồng thời cũng có lực đẩy ra từ động cơ ép lên khung xe giúp nó có thể bám được trên tường.

Nguyên lý động cơ tuốc bin

 

Chuẩn bị vật dụng để chế tạo xe leo tường

1. Phần cứng:

Điểm quan trọng ở dự án nho nhỏ này chính là ở phần cấu tạo khung xe nhé các bạn, vì thế mình xin nói rõ hơn về cấu tạo xe và các lưu ý cần nắm trước khi bắt tay vào làm một chiếc xe bám tường nhé.

  • Khung xe

Bắt buộc phải NHẸ, đó là ưu tiên đầu tiên nhé (còn bác nào đầu tư cái động cơ mạnh thì khỏi quan tâm lắm cũng dc). Để khung xe có thể nhẹ thì mình xài loại Alu (xốp xốp ấy), đừng xài mica nhé cái động cơ mình đang sử dụng không bám nổi đâu.

Miếng Alu làm khung xe

Loại này bạn có thể dùng dao rọc giấy cắt rất tiện và nó là loại nhẹ nhất mình từng thử rồi. Bạn tiến hành cắt theo khung mình muốn, ghép lại thành hình chữ nhật là được. Nhớ là gầm xe (khoảng cách từ bánh xe đến mặt dưới đế xe ngắn nhất có thể nhé)

Thiết kế tổng quan khung xe

2. Linh kiện sử dụng

  • Arduino nano (x2)
  • NRF24L01 (x2)
  • Động cơ cho 4 bánh xe loại GA vì nó nhỏ (x4) mua kèm 4 bánh xe nhựa luôn nhé
  • Driver điều khiển 4 động cơ GA L298 (x1)
  • Động cơ tuốc bin/ phản lực (x1)
  • ESC điều tốc động cơ tuốc bin (x1)
  • Pin lipo (x1)
  • công tắc nguồn tổng

3. Cấu tạo thực tế của xe leo tường

Cấu tạo thực tế của xe leo tường

Pin lipo 12V có khả năng sạc và sử dụng nhiều lần nên khá thuận tiện cho các bạn chơi lâu dài, ở đây ta sẽ sử dụng pin 12V để cấp cho cả mạch, 12V qua L298 sẽ có OUTPUT 5V ta sử dụng nguồn này cấp cho Arduino Nano và module NRF24L01 luôn.

4. Sơ đồ đấu nối dây

Chia ra làm 2 thành phần: Bộ điều khiển từ xa và bộ xe bám tường.

Bộ điều khiển từ xa sẽ gồm: Arduino nano, NRF24L01, pin 9v, joytick.

Bộ xe leo tường sẽ gồm: Arduino nano, NRF24L01, pin lipo, 4 động cơ GA và 4 bánh xe, L298, ESC, động cơ phản lực

Sơ đồ kết nối Arduino và NRF24L01

Sơ đồ này sử dụng chung cho cả 2 bộ điều khiển và bộ xe leo tường

Sơ đồ kết nối Arduino và Joytick

Như 2 sơ đồ trên ta đã có thể thực hiện xong bộ điều khiển, chỉ cần cấp nguồn pin 9V vào Arduino Nano nữa là xong. Tiếp đến sẽ thiết kế mạch trên bộ xe bám tường, cũng sẽ mắc mạch giữa arduino nano – NRF24L01 như hình trên.

Kết nối Arduino nano với L298 để điều khiển 4 động cơ GA

Sơ đồ kết nối Arduino và L298

Kế tiếp để điều khiển động cơ tuốc bin ta cần kết nối ESC giữa động cơ và arduino nano để điều tốc cho nó chạy với tốc độ mà ta thấy có thể bám trên tường. Hình dưới mình sử dụng Arduino Uno, các bạn nối theo chân Arduino Nano theo đúng chân trong Code là được. Nguyên lý ở đây chỉ là điều tốc thông qua chân tín hiệu của ESC mà thôi.

Sơ đồ kết nối arduino và ESC

Lưu ý: Để ESC hoạt động chúng ta cần bước cấu hình cho esc, các bạn có thể theo dõi cách cấu hình trên mạng hoặc tham khảo video dưới

Phần cứng và các kết nối mạch đã xong rồi, giờ bắt tay vào CODE thôi nào !

Tiến hành lập trình cho xe leo tường

Sẽ có 2 code cho dự án: Cho bộ điều khiển từ xa, hoạt động theo nguyên lý là dùng arduino nano đọc các tọa độ của joytick để biết được các hướng tới, lui, trái, phải để điều khiển cho xe vừa bám tường vừa có thể di chuyển như một chiếc xe điều khiển thông thường dưới mặt đất.

Code cho bộ điều khiển:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define CE_PIN   7
#define CSN_PIN 8
#define Y A0 // X
#define X A1 // Y
#define Gas 5

const uint64_t pipe = 0xE8E8F0F0E3LL;
RF24 radio(CE_PIN, CSN_PIN);

int gui[5];
int adc_x,adc_y,digital_gas;
int set_point_forward,set_point_behind,set_point_right,set_point_left,set_point_northeast,set_point_southeast,set_point_southwest,set_point_northwest;

void setup()
{
  //
  radio.begin();
  radio.openWritingPipe(pipe);
  Serial.begin(9600);
  pinMode(Gas, INPUT_PULLUP);
    
}

void loop()
{
  adc_x = analogRead(X);//gia tri o giua
  adc_y = analogRead(Y);
  digital_gas = digitalRead(Gas);
  Serial.print(adc_x);Serial.print('\t');
  Serial.print(adc_y);Serial.print('\t');
  //Serial.print(digital_gas);Serial.print('\t');
  
  
  if(adc_x>600){
    set_point_forward=1;
  }
  
  if(adc_x<400){
    set_point_behind=1;
  }
  
  if(adc_y>600){
    set_point_right=1;
  }
  
  if(adc_y<400){
    set_point_left=1;
  }
  
  gui[0] = set_point_forward;
  gui[1] = set_point_behind; 
  gui[2] = set_point_left;
  gui[3] = set_point_right;  
  gui[4] = digital_gas;
  radio.write(gui, sizeof(gui) );
 
 Serial.print(gui[0]);Serial.print('\t');
 Serial.print(gui[1]);  Serial.print('\t');
 Serial.print(gui[2]);Serial.print('\t');
 Serial.print(gui[3]);Serial.print('\t');
 Serial.println(gui[4]);
  set_point_forward=0;
  set_point_behind=0;
  set_point_left=0;
  set_point_right=0;
}

Giải thích code:

#include<Servo.h>
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

Khai báo các thư viện sử dụng: Các thư viện Servo, SPI đã có sẵn trong Arduino IDE (nếu không có bạn tự tải về nhé), thư viện cho module Nrf24l01 các bạn tải về tại đây rồi thêm vào Arduino nhé.

#define CE_PIN   7//Note
#define CSN_PIN 8

Hai chân cần kết nối giữa arduino nano và Nrf24l01 để có thể cấu hình các thông số truyền nhận và gửi dữ liệu đi cho NRF24L01

const uint64_t pipe = 0xE8E8F0F0E3LL;

Đây là địa chỉ cho NRF nhé, các bạn chỉ cần đặt đúng cặp địa chỉ giữa con NRF phát và thu trên 2 bộ điều khiển và bộ xe bám tường là được, có thể sửa lại địa chỉ nhé thay số 3 trong chuỗi thành số bất kỳ.

adc_x = analogRead(X);//gia tri o giua
  adc_y = analogRead(Y);
  digital_gas = digitalRead(Gas);

Đọc tọa độ từ joytick để có thể xác định các hướng điều khiển, và đọc chân Gas, tức là chân nút nhấn trên joytick (khi đè xuống có 1 nút nhấn) để gửi đến xe biết là bắt đầu bật động cơ tuốc bin để có thể bám tường.

gui[0] = set_point_forward;
gui[1] = set_point_behind; 
gui[2] = set_point_left;
gui[3] = set_point_right;  
gui[4] = digital_gas;
radio.write(gui, sizeof(gui) );

Sau khi xác định được các hướng di chuyển từ joytick ta sẽ tiến hành gửi các tín hiệu điều khiển này đến NRF ở bên phía thu nằm trên xe bám tường để xe đi theo hướng mình muốn.

set_point_forward=0;
set_point_behind=0;
set_point_left=0;
set_point_right=0;

Đặt lại các biến trạng thái điều khiển về 0 để chờ trạng thái mới từ joytick

Code cho bộ xe leo tường

#include<Servo.h>
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define CE_PIN   7//Note
#define CSN_PIN 8
const uint64_t pipe = 0xE8E8F0F0E3LL;
RF24 radio(CE_PIN, CSN_PIN);
Servo ESC;
int packet_receive [5];
int set_point_forward,set_point_behind,set_point_right,set_point_left,set_point_gas;
int toogle, dem=1;
void setup() {
  Serial.begin(9600); 
  setup_rf();
  ESC.attach(9);//delay(50);
  ESC.writeMicroseconds(1000);
  //sTop();
}

void loop() {
  read_rf() ;
}
void setup_rf()//=============setup_RF=========================================
{
   radio.begin();
   radio.openReadingPipe(1,pipe);
   radio.startListening();   
}//=============end_setup_RF===================================================
void read_rf()//========read_RF=========================================
{
  if ( radio.available())
  { 
    radio.read(packet_receive,sizeof(packet_receive));
    set_point_forward=int(packet_receive[0]);
    set_point_behind=int(packet_receive[1]);
    set_point_left=int(packet_receive[2]);  
    set_point_right=int(packet_receive[3]  );  
    set_point_gas=int(packet_receive[4]);
//    Serial.print(set_point_forward);Serial.print('\t');
//    Serial.print(set_point_behind);  Serial.print('\t');
//    Serial.print(set_point_left); Serial.print('\t');
//    Serial.print(set_point_right);Serial.print('\t');
    Serial.print(set_point_gas);Serial.print('\t');
    if(set_point_forward == 1){
      forWard(); 
    }
    else if(set_point_behind == 1 ){
      beHind(); 
    }
    else if(set_point_left == 1){
      turnLeft();  
    }
    else if(set_point_right == 1 ){
      turnRigh(); 
    }
    else sTop();

    if(set_point_gas==0){
      if(toogle==0){
      toogle=1;
      dem=-dem;
      }
    }
    else if(set_point_gas==1){
      if(toogle==1){
      toogle=0;     
      }
    }
    Serial.println(dem);
    if(dem==1){
      ESC.writeMicroseconds(1000);
     // toogle=0;
      Serial.println("Min");
    }
    else if(dem==-1){
      ESC.writeMicroseconds(2500);
      //dem=0;
      Serial.println("Max");
    }
//else Serial.println("Max");ESC.writeMicroseconds(1200);
  //ESC.writeMicroseconds(1000);
  }
 // else ESC.writeMicroseconds(1000);sTop();toogle=0;
  
}//==============end_read_RF===========================================

 void forWard(void)  
{
  digitalWrite(A0, LOW);
  digitalWrite(A1, HIGH);
  analogWrite(6, 255);
  digitalWrite(A2, LOW);
  digitalWrite(A3, HIGH);
  analogWrite(5, 255);
}
 void beHind(void)  
 {
  digitalWrite(A0, HIGH);
  digitalWrite(A1, LOW);
  analogWrite(6, 255);
  digitalWrite(A2, HIGH);
  digitalWrite(A3, LOW);
  analogWrite(5, 255);
}

 void sTop(void)  
 {
 analogWrite(6, 0);
 analogWrite(5, 0);
}
void turnLeft(void)  
{
  analogWrite(5, 0);
  digitalWrite(A2, LOW);
  digitalWrite(A3, HIGH);
  analogWrite(6, 255);
}
void turnRigh(void)  
{
  analogWrite(6, 0);
  digitalWrite(A0, LOW);
  digitalWrite(A1, HIGH);
  analogWrite(5, 255);
}

Giải thích code cho xe leo tường:

Vẫn sử dụng thư viện như bên bộ điều khiển nhé

ESC.attach(9);//delay(50);

Ở đây ta có thêm phần điều tốc dùng ESC nên sẽ có 1 chân để gửi thông số quay của động cơ từ arduino ta dùng chân số 9

radio.read(packet_receive,sizeof(packet_receive));

set_point_forward=int(packet_receive[0]);
set_point_behind=int(packet_receive[1]);
set_point_left=int(packet_receive[2]);  
set_point_right=int(packet_receive[3]  );  
set_point_gas=int(packet_receive[4]);

Vẫn setup NRF như bên phát, nhưng đây là bên thu tín hiệu nên trong vòng LOOP ta sẽ thiết lập cho nó luôn chờ tín hiệu gửi từ bên bộ điều khiển

if(set_point_gas==0){
      if(toogle==0){
      toogle=1;
      dem=-dem;
      }
    }
    else if(set_point_gas==1){
      if(toogle==1){
      toogle=0;     
      }
    }

Sau khi nhận tín hiệu điều khiển hướng di chuyển thì ta chỉ việc gọi các hàm để điều khiển 4 bánh xe quay theo các hướng, đặc biệt ở đây là nhận chân Gas từ bên bộ điều khiển.

Lưu ý: Vì khi bạn muốn xe bám tường thì bạn phải đặt nó lên tường rồi mới bấm nút cho động cơ tuốc bin bắt đầu quay để tạo lực hút xe vào tường. Còn khi đặt dưới đất thì vẫn có thể điều khiển xe di chuyển theo các hướng bình thường.

if(dem==1){
      ESC.writeMicroseconds(1000);
     // toogle=0;
      Serial.println("Min");
    }
    else if(dem==-1){
      ESC.writeMicroseconds(2500);
      //dem=0;
      Serial.println("Max");
    }

Khi chưa có tín hiệu Gas từ bộ điều khiển thì ESC sẽ xuất xung là 1000 (min) cho động cơ tuốc bin khiến nó không quay và xe chạy bình thường trên mặt đất. Khi nhận được tín hiệu Gas từ bộ điều khiển thì sẽ xuất một xung 2500 (Max) để cho động cơ phản lực quay tối đa giúp hút chặt lên tường.

Lưu ý: Xung cấp tùy theo phần cứng của bạn nữa nhé, nếu bạn làm phần cứng đủ nhẹ, đủ độ thấp của gầm xe thì bạn cần test thực tế xem xung bao nhiêu là đủ cho nó bám và còn phải di chuyển được nữa nhé, ở đây chỉ là 2 số xung min và max mà mình sử dụng cho xe mình (vì mình làm phần cứng sida quá nên phải chạy max xung mới bám được ?).

Một vài hình ảnh thực tế của xe bám tường

Xe thực tế

Xe thực tế

Xe thực tế

Kết luận

Vậy là ESPITEK đã giới thiệu đến các bạn từng bước để tự xây dựng cho mình một chiếc xe leo tường có thể điều khiển từ xa rồi, hãy xem video hướng dẫn làm xe leo tường để thấy kết quả nữa nhé. Hãy tự mình thực hiện để có được thành quả.

Nhớ theo dõi 200+ ứng dụng arduino để xem rất nhiều các dự án hay có sử dụng arduino nhé.

Chúc các bạn thành công!

4 Comments

  1. tôi điều khiển xe nó chạy không như code, làm ơn giúp tui được không

  2. ad cho em xin link về loại động cơ phản lực được sử dụng trong bài ạ

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *