Chế tạo Radar với Arduino

1. Giới thiệu

Xin chào các bạn!!! Hôm nay, qua bài viết này mình muốn giới thiệu cho các bạn về một khả năng thần kì của Arduino. Đó là “ Chế tạo một hệ thống Radar “ – Một chức năng có trong Kbot Wifi Robot của anh Ngô Huỳnh Ngọc Khánh. Với chức năng này, các bạn có thể giúp Robot của mình có thể quét địa hình, phát hiện chướng ngại vật, hỗ trợ Robot di chuyển một cách đơn giản hơn…..Mà lại còn rất ngầu nữa heart. Vậy còn chần chừ gì nữa, chúng ta hãy bắt tay ngay vào việc thôi!!!!

2. Chuẩn bị

3. Kết nối

Phần cứng bạn kết nối như sau:

Chân Siêu âm Chân Servo Chân Arduino UNO
Vcc Vcc 5V
GND GND GND
  Data 12
Trig   10
Echo    11

Tiếp theo các bạn gắn SRF-05 lên Servo như thế này ( đây là minh họa, các bạn có thể lm kiểu khác):

4. Chương trình

a. Code cho Arduino:

// Sử dụng thư viện Servo
#include <Servo.h>
// Khai báo chân Trig và Echo
const int trigPin = 10;
const int echoPin = 11;
// Khai báo biến thời gian và khoảng cách
long duration;
int distance;
Servo myServo; // Tạo đối tượng Servo để điều khiển Servo
void setup() {
    pinMode(trigPin, OUTPUT); // Set chân trig là chân OUTPUT
    pinMode(echoPin, INPUT); // Set chân echo INPUT
    Serial.begin(9600);
    myServo.attach(12); // Chân Servo là chân 12
}
void loop() {
    // Quay Servo từ 15 độ - 165 độ
    for(int i=15;i<=165;i++){
        myServo.write(i);
        delay(30);
        distance = calculateDistance();// Gọi hàm tính khoảng cách
        Serial.print(i); // Gửi giá trị i ( góc quay của Servo) đến Serial Port
        Serial.print(","); // Gửi ","
        Serial.print(distance); // Tiếp theo gửi các giá trị khoảng cách tới Serial Port
        Serial.print("."); // Gửi dấu "."
    }
    // Sau khi quay xong Servo từ 15 - 165 độ....quay ngược lại từ 165 độ về 15 độ, sau đó gửi tương tự các giá trị như bên trên
    for(int i=165;i>15;i--){
        myServo.write(i);
        delay(30);
        distance = calculateDistance();
        Serial.print(i);
        Serial.print(",");
        Serial.print(distance);
        Serial.print(".");
    }
}
// Hàm tính khoảng cách bằng siêu âm
int calculateDistance(){
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    // Phát xung siêu âm với thời gian là 10 Micro giây
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);// Ngưng phát xung
    duration = pulseIn(echoPin, HIGH); // Tính thời gian xung siêu âm phát ra đập vào vật cản rồi dội lại là bao nhiêu???
    distance= duration*0.034/2;// Tính khoảng cách từ siêu âm đến vật cản ( vì vận tốc của xung siêu âm là 344m/s...và sau khi đập vào vật cản rồi dội lại, nên /2) ==>> khoảng cách = thời gian*vận tốc/2
    return distance;
}

b. Code Processing

import processing.serial.*; // Thư viện Serial
import java.awt.event.KeyEvent; // Thư viện đọc dữ liệu
import java.io.IOException;
Serial myPort; // Xác định đối tượng

// Khai báo các biến :v
String angle="";
String distance="";
String data="";
String noObject;
float pixsDistance;
int iAngle, iDistance;
int index1=0;
int index2=0;
PFont orcFont;
void setup() {
    size (1920, 1080); // Thiết lập màn hình
    smooth();
    myPort = new Serial(this,"COM4", 9600); // Chọn giao tiếp cổng COM4, tốc độ 9600
    myPort.bufferUntil('.'); // Đọc dữ liệu từ cổng COM4...đến khi nhận đc dấu '.' thỳ dừng lại....!!!! ( Processing sẽ nhận đc giá trị như phần Code Arduino đã gửi)
    orcFont = loadFont("OCRAExtended-30.vlw");//Chọn Font cho nó nguy hiểm tý, các bạn có thể chọn Font khác theo ý mình
}
void draw() {
    fill(98,245,31);
    textFont(orcFont);
    // Cái này mình cũng không hiểu lắm...hình như nó mô phỏng dòng chuyển động...Mà thôi,các bạn cứ coppy cho nhanh
    noStroke();
    fill(0,4);
    rect(0, 0, width, height-height*0.065);
    fill(98,245,31); // green color
    // Gọi các hàm vẽ Radar
    drawRadar();
    drawLine();
    drawObject();
    drawText();
}
void serialEvent (Serial myPort) { // Đọc dữ liệu từ cổng COM
    data = myPort.readStringUntil('.');// Đọc dữ liệu đến khi phát hiện dấu "." rồi gán vào biến "data"
    data = data.substring(0,data.length()-1);
    index1 = data.indexOf(","); // Tìm ký tự "," rồi gán vào "index1"
    angle= data.substring(0, index1); // Đọc dữ liệu từ ký tự đầu tiên...đến khi nhận dấu "," rồi gán vào biến "angle"
    distance= data.substring(index1+1, data.length()); // Đọc dữ liệu từ ký tự sau dấu "," đến dấu "." ( đến hết đó )
    // Chuyển đổi các chuỗi thành số nguyên
    iAngle = int(angle);
    iDistance = int(distance);
}
// Đến phần xây dựng giao diện Radar...Đây là vẽ hình á...các bạn cứ coppy
void drawRadar() {
    pushMatrix();
    translate(width/2,height-height*0.074); // di chuyển tọa độ đến vị trí mới!!!
    strokeWeight(2);
    stroke(98,245,31);
    // Vẽ các vệt line sao ý!!! keke
    arc(0,0,(width-width*0.0625),(width-width*0.0625),PI,TWO_PI);
    arc(0,0,(width-width*0.27),(width-width*0.27),PI,TWO_PI);
    arc(0,0,(width-width*0.479),(width-width*0.479),PI,TWO_PI);
    arc(0,0,(width-width*0.687),(width-width*0.687),PI,TWO_PI);
    // Vẽ các đường góc
    line(-width/2,0,width/2,0);
    line(0,0,(-width/2)*cos(radians(30)),(-width/2)*sin(radians(30)));
    line(0,0,(-width/2)*cos(radians(60)),(-width/2)*sin(radians(60)));
    line(0,0,(-width/2)*cos(radians(90)),(-width/2)*sin(radians(90)));
    line(0,0,(-width/2)*cos(radians(120)),(-width/2)*sin(radians(120)));
    line(0,0,(-width/2)*cos(radians(150)),(-width/2)*sin(radians(150)));
    line((-width/2)*cos(radians(30)),0,width/2,0);
    popMatrix();
}
void drawObject() {
    pushMatrix();
    translate(width/2,height-height*0.074); // Di chuyển con trỏ đến tọa độ khác...rồi vẽ tiếp
    strokeWeight(9);
    stroke(255,10,10); // Màu đỏ
    pixsDistance = iDistance*((height-height*0.1666)*0.025); // Khoảng cách..từ cm đổi thành pixcel ( theo công thức )
    // Nếu khoảng cách < 40cm
    if(iDistance<40){
        // Vẽ các đối tượng góc và khoảng cách...!!!!
        line(pixsDistance*cos(radians(iAngle)),-pixsDistance*sin(radians(iAngle)),(width-width*0.505)*cos(radians(iAngle)),-(width-width*0.505)*sin(radians(iAngle)));
    }
    popMatrix();
}
void drawLine() {
    pushMatrix();
    strokeWeight(9);
    stroke(30,250,60);
    translate(width/2,height-height*0.074); // Lại di chuyển con trỏ đến vị trí khác
    line(0,0,(height-height*0.12)*cos(radians(iAngle)),-(height-height*0.12)*sin(radians(iAngle)));
    popMatrix();
}
void drawText() { // Viết các dòng chữ trên màn hình
    pushMatrix();
    if(iDistance>40) {
        noObject = "Ra khỏi phạm vi";
    }
    else {
        noObject = "Trong phạm vi";
    }
    fill(0,0,0);
    noStroke();
    rect(0, height-height*0.0648, width, height);
    fill(98,245,31);
    textSize(25);
    text("10cm",width-width*0.3854,height-height*0.0833);
    text("20cm",width-width*0.281,height-height*0.0833);
    text("30cm",width-width*0.177,height-height*0.0833);
    text("40cm",width-width*0.0729,height-height*0.0833);
    textSize(40);
    text("Object: " + noObject, width-width*0.875, height-height*0.0277);
    text("Angle: " + iAngle +" °", width-width*0.48, height-height*0.0277);
    text("Distance: ", width-width*0.26, height-height*0.0277);
    if(iDistance<40) {
        text(" " + iDistance +" cm", width-width*0.225, height-height*0.0277);
    }
    textSize(25);
    fill(98,245,60);
    translate((width-width*0.4994)+width/2*cos(radians(30)),(height-height*0.0907)-width/2*sin(radians(30)));
    rotate(-radians(-60));
    text("30°",0,0);
    resetMatrix();
    translate((width-width*0.503)+width/2*cos(radians(60)),(height-height*0.0888)-width/2*sin(radians(60)));
    rotate(-radians(-30));
    text("60°",0,0);
    resetMatrix();
    translate((width-width*0.507)+width/2*cos(radians(90)),(height-height*0.0833)-width/2*sin(radians(90)));
    rotate(radians(0));
    text("90°",0,0);
    resetMatrix();
    translate(width-width*0.513+width/2*cos(radians(120)),(height-height*0.07129)-width/2*sin(radians(120)));
    rotate(radians(-30));
    text("120°",0,0);
    resetMatrix();
    translate((width-width*0.5104)+width/2*cos(radians(150)),(height-height*0.0574)-width/2*sin(radians(150)));
    rotate(radians(-60));
    text("150°",0,0);
    popMatrix();
}

Sau khi hoàn thành các bạn sẽ có 1 giao diện như thế này :

5. Lời kết

Với vài bước đơn giản, bạn đã tự tạo 1 hệ thống Radar của riêng mình rồi đó!!! Chúc các bạn thành công, và có nhiều những phát minh sáng chế trong tương lai!!! :v :v :v

lên
33 thành viên đã đánh giá bài viết này hữu ích.
Chuyên mục: 
Các dự án được truyền cảm hứng

Select any filter and click on Apply to see results

Các bài viết cùng tác giả

Cài đặt Microsoft Visual C#

Ở loạt bài giao tiếp giữa Arduino của mình, mình có hướng dẫn các bạn cách lập trình phần mềm thông qua công cụ Microsoft Visual C#. Nhưng có nhiều bạn gặp khó khăn trong quá trình cài đặt công cụ, hoặc cho rằng nó quá mất thời gian....Vì vậy, mình làm bài viết này để hướng dẫn lại các bạn cách cài đặt Microsoft Visual C# một cách dễ dàng và cách sử dụng nó.

lên
22 thành viên đã đánh giá bài viết này hữu ích.

HỆ ĐIỀU HÀNH MEDIA CENTER CHO Raspberry Pi - Đánh giá cá nhân của mình về Openelec (Open Embedded Linux Entertainment Center ) và OSMC ( Open-Source Media Center ).

Bài viết này, mình sẽ so sánh 2 hệ điều hành MediaCentrer cho Raspberry Pi là  Openelec (Open Embedded Linux Entertainment Center ) và OSMC ( Open-Source Media Center ).

lên
17 thành viên đã đánh giá bài viết này hữu ích.