3 Project arduino phổ biến hiện nay và cách làm.
arduino
12
Javascript
314
Java
164
White

Nguyen The Vinh viết ngày 07/04/2020

I.Code xe tránh vật cản.

A.Code và sơ lược về cảm biến HC-SR04

  • Cảm biến khoảng cách HC-SR04 là một mạch cảm biến khoảng cách thông dụng được nhiều người sử dụng đến để làm tìm ra khoảng cách giữa mạch và vật cản, module có thể đo được khoảng từ 2cm- 30cm với độ chính xác khá cao.
  • Độ chính xác của cảm biến phụ thuộc vào phần code rất nhiều. Code sai sẽ làm cho việc đo khoảng cách bị sai và thậm chí là ra số âm. Vì vậy việc học code cảm biến là một thứ đi kèm khi chúng ta bắt đầu làm quen với một số cảm biến.
  • Giới Thiệu : Cảm biến khoảng cách có 4 chân chính là : GND, VCC, Trig, Echo.
  • Nguyên lý hoạt động : Chân trig sẽ phát ra một xung rất ngắn (chỉ khoảng 5 microSecond). Sau đó, cảm biến sẽ tạo ra 1 xung HIGH ở chân Echo cho đến khi nhận lại được sóng phản xạ ở pin này. Chiều rộng của xung sẽ bằng thời gian từ cảm biến bắn sóng âm vào vật rồi dội ngược lại.

alt text

  • Cách lắp mạch trên arduino : Cách lắp cảm biến vào rất đơn giản, 2 chân GND và VCC là dây đất và dây dương. Còn lại 2 dây Trig và Echo bạn có thể chọn 2 chân(Pin) bất kì, ở đấy mình lấy 2 chân 2 và 12 cho nó đúng bài nha =)).

- Code :

float getDistance(int trig,int echo){ // hàm return => dùng float
            float distrance=0;// vì giá trị trả về là một số thực >0 => float
            pinMode(trig,OUTPUT);//chân Trig sẽ là chân phát tín hiệu
            pinMode(echo, INPUT);//chân Echo sẽ là chân nhận tín hiệu
            digitalWrite(trig,LOW);// tắt chân trig đi vì có vòng lặp
            delayMicroseconds(2);// 1000000 (microSeconds)= 1 (Second)
            digitalWrite(trig,HIGH);// phát tín hiệu chân trig
            delayMicroseconds(10);// đợi 10 microSeconds. Tức là chân Trig sẽ phát ra xung 10 microSeconds
            digitalWrite(trig,LOW);// tắt chân trig đi 
            distrance = pulseIn(echo,HIGH,30000)/58.0;
            if(distrance==0) distrance=30;// xa quá nên sẽ cho khoảng cách là 30,00
            return distrance;
        }

distrance = pulseIn(echo,HIGH,30000)/58.0;

  • pulseln là một hàm dùng để đo độ lớn của xung phát ra ở chân Trig một xung có đọ dài là 10 microSecond.
  • vì vận tốc âm thành là 340km/h <=> 29,142 microSecond/cm. Tính cả đường đi và đường về của âm thanh thì chúng ta phải nhân 2 lên nên code ở trên sẽ là chia 58.

B.Test và một só ứng dụng thực tế .

  • Cảm biến khoảng cách có rất nhiều ứng udnjg vào thực tế như là : làm xe tự hành, làm radar, hay thậm chí là làm xe flowingHand(Đi theo vàn tay);
  • Dựa vào khoảng cách chúng ta có thể xem nếu nó < 20 => lùi lại kiểm tra khoảng cách 2 bên rùi xem bên nào xa hơn thì rẽ bên đó. đấy là mình làm các bạn có thể sáng tạo thêm như gặp vật thì lùi lại.....

  • Radar là một bản nâng cấp hơn so với xe trảnh vật cản. Nó yêu cầu chúng ta phải có thêm một IDE nữa là Processing 3 phần mềm chạy bằng java nên nó có thể cho phép chúng ta hiển thị được cái vùng quét. Ở đây mình sẽ chia làm 2 phần code đó là code Arduino và code processing.

    #include <Servo.h>
    const int trigPin = 2;
    const int echoPin = 12;
    long duration;
    int distance;
    Servo myServo; 
    void setup() {
    pinMode(trigPin, OUTPUT);
    pinMode(echoPin, INPUT); 
    Serial.begin(9600);
    myServo.attach(A0+1); 
    }
    void loop() {
    for(int i=15;i<=165;i++){  
    myServo.write(i);
    delay(30);
    distance = calculateDistance();
    Serial.print(i);
    Serial.print(",");  
    Serial.print(distance);
    Serial.print("."); 
    }
    for(int i=165;i>15;i--){  
    myServo.write(i);
    delay(30);
    distance = calculateDistance();
    Serial.print(i);
    Serial.print(",");
    Serial.print(distance);
    Serial.print(".");
    }
    }
    int calculateDistance(){ //giống như hàm ở trên kia 
    digitalWrite(trigPin, LOW); 
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH); 
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    duration = pulseIn(echoPin, HIGH);  time in microseconds
    distance= duration*0.034/2;
    return distance;
    }
    

    Code processing và code arduino là 2 phần khắc nhau hoàn toàn nhưng mà hai phần code này được liên kết với nhùa bằng Serial Monitor (9600). nên việc println ra "," "." đều là dùng để liên kết 2 code này lại với nhau giống như phần code arduino là để đọc dữ liệu người dùng, còn phần code procssing là lấy dữ liệu người dùng để có thể biên tập ra một cái gì đó( ở dây là cái radar).

  • Đây là phần code processing:

    import processing.serial.*; 
    import java.awt.event.KeyEvent; 
    import java.io.IOException;
    Serial myPort; 
    // defubes variables
    String angle="";
    String distance="";
    String data="";
    String noObject;
    float pixsDistance;
    int iAngle, iDistance;
    int index1=0;
    int index2=0;
    PFont orcFont;
    void setup() {
    size (1200, 700); 
    smooth();
    myPort = new Serial(this,"COM3", 9600); 
    myPort.bufferUntil('.');  
    }
    void draw() {
    fill(98,245,31);
    noStroke();
    fill(0,4); 
    rect(0, 0, width, height-height*0.065); 
    fill(98,245,31); // green color
    drawRadar(); 
    drawLine();
    drawObject();
    drawText();
    }
    void serialEvent (Serial myPort) { 
    variable "data".
    data = myPort.readStringUntil('.');
    data = data.substring(0,data.length()-1);
    index1 = data.indexOf(","); 
    angle= data.substring(0, index1); 
    distance= data.substring(index1+1, data.length());  
    iAngle = int(angle);
    iDistance = int(distance);
    }
    void drawRadar() {
    pushMatrix();
    translate(width/2,height-height*0.074); 
    noFill();
    strokeWeight(2);
    stroke(98,245,31);
    // draws the arc lines
    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);
    // draws the angle lines
    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); 
    strokeWeight(9);
    stroke(255,10,10); // red color
    pixsDistance = iDistance*((height-height*0.1666)*0.025); 
    if(iDistance<40){
    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); 
    line(0,0,(height-height*0.12)*cos(radians(iAngle)),-(height-height*0.12)*sin(radians(iAngle))); 
    popMatrix();
    }
    void drawText() { 
    pushMatrix();
    if(iDistance>40) {
    noObject = "Out of Range";
    }
    else {
    noObject = "In Range";
    }
    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("Indian Lifehacker ", 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(); 
    }
    
  • Phần code trên bạn cần chỉnh lại PORT của cổng USB, và màn hình tương ứng với của bạn. Xong chúng ta chỉ cần chạy Code arduino và run Processing vào là có thể có kết quả như sau :

alt text

II. Cảm biến hồng ngoại đen trắng (IR).

A.Sơ lược về cảm biến (IR) và nguyên lý hoạt động.

  • cảm biến hồng ngoại dùng để nhân biết mặt phảng dưới nó là trắng hay đen. Nó thương được áp dùng để làm xe dò line hay là xe thoát khỏi mê cung.
  • Nguyên lý hoạt động: alt text ở bề mặt trắng thì Tx có thể phản được hồng ngoại cho mắt Rx alt text ở bềm mặt đen thì Tx không thể phản được hồng ngoại cho mắt Rx.
  • Cấu tạo: gồm 3 chân(Pin) OUT,GND,VCC tương ứng với Pin A bất kì, GND, VCC..
    alt text

  • Code của cảm biến này rất đơn giản chugns ta chỉ việc test AOUT khi ở vùng trắng và vùng đen rùi kiểm tra A như bình thường.

    B.Test và một số ứng dụng thực tế .

  • Cảm biến IR thường được dùng để làm xe dò line tức là xe đi theo đường vẽ rùi đi về đích.

  • Để làm được chúng ta cần có 2 ảm biến IR để cách nhau mọt khoảng hơn đường kẻ đi một chút và đặt song song với nhau.
    alt text

  • Trong trường hợp trên là cả hai cảm biến đều ở mặt phẳng màu trắng thì xe của chúng ta sẽ đi thẳng.
    alt text

  • Trong trường hợp cảm biến bên trái tiếp xúc với mặt tối thì chúng ta sẽ cho xe rẽ trái
    alt text

  • Trong trường hợp cảm biến bên phải tiếp xúc với mặt tối thì chúng ta sẽ cho xe rẽ phải
    alt text

  • Ở trường hợp này là một trường hợp đặc biệt chúng ta có thể cho xe dùng lại hoặc là cho xe rẽ 90 độ ở một hướng bất kì để có thể rời khỏi mê cung.

  • Thế là hoàn thành xe dò line rùi =)) khá là dễ =V.

Giờ đang dịch mọi người không nên ra ngoài ở nhà viết ngồi viết blog như mình đây nè =)), và nểu ra thì đeo khẩu trang vào nha =V !!

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Nguyen The Vinh

12 bài viết.
53 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
12 6
Cookie là gì ? tầm quan trọng của Cookie ? kể đến Cookie thì theo mình có lẽ liên quan tới doremon một xúy nếu ai có tuổi thơ thì chắc đọc biệt đ...
Nguyen The Vinh viết hơn 2 năm trước
12 6
White
10 1
1, TOEIC là cái gì ? , nó có thể giúp ích cho chúng ta những gì ?? (Ảnh) TOEIC (viết tắt của Test of English for International Communication – Bài...
Nguyen The Vinh viết hơn 2 năm trước
10 1
White
9 9
(Ảnh) Tổng quan về mô hình MVC Thường thường, mình thấy mọi người thường nói về khái niệm rồi mới sang chức năng bla bla..... , nhưng theo m...
Nguyen The Vinh viết hơn 2 năm trước
9 9
Bài viết liên quan
White
0 0
Trong bài viết này, một số hình ảnh hoặc nọi dung có thể bị thiếu do quá trình chế bản. Vui lòng xem nội dung ở blog gốc sau: (Link) (Link), chúng...
programmerit viết 5 năm trước
0 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
12 bài viết.
53 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!