Processing Bài 5: Chế tạo Radar mini với Processing

Một hệ thống sử dụng để định vị và đo khoảng cách và lập bản đồ các vật thể như máy bay hay mưa. Được sử dụng phổ biển trong hàng hải, hàng không và quân sự. Đó chính là Radar, hôm nay bài viết này sẽ hướng dẫn các bạn chế tạo một chiếc radar đo khoảng cách nhé !


Radar

Radar hoạt động ở tần số vô tuyến siêu cao tần, có bước sóng siêu cực ngắn, dưới dạng xung được phát theo một tần số lập xung nhất định. Nhờ vào ănten, sóng radar tập trung thành một luồng hẹp phát vào trong không gian. Trong quá trình lan truyền, sóng radar gặp bất kỵ mục tiêu nào thì nó bị phản xạ trở lại. Tín hiệu phản xạ trở lại được chuyển sang tín hiệu điện. Nhờ biết được vận tốc sóng, thời gian sóng phản xạ trở lại nên có thể biết được khoảng cách từ máy phát đến mục tiêu. Nguyên lí hoạt động của Radar giống như chiếc cảm biến đo khoảng cách HC-SR04. (Bạn nào muốn tìm hiểu thêm thì có thể tìm hiểu trên wikipedia).

Ngoài ra, radar còn có một bộ phận phía dưới giúp xoay vòng để đo. Để chế tạo chiếc radar mini này chúng ta dùng cảm biến HC-SR04 để đo khoảng cách và kết hợp với servo SG90 để giúp cảm biến xoay vòng.

Chuẩn bị

  • Arduino Uno
  • HC-SR04
  • Servo SG90
  • Breadboard
  • Dây cắm breadboard

Kết nối HC-SR04 với Servo SG90

Vì servo có nhiệm vụ giúp HC-SR04 xoay vòng nên ta cần phải gắn cảm biến lên trên servo. Có rất nhiều các khác nhau để các bạn làm được điều đó, ở đây mình sẽ cho các bạn tham khảo các mình gắn lên. Mình dùng bìa các-tông để dựng thành một bệ để gắn cảm biến HC-SR04 lên bằng cách buộc 2 sợi dây chun, sau đó bắt ốc vào Servo. Ngoài ra, chúng ta nên cố định servo lại vì cảm biến sẽ làm nghiêng và ngã servo nếu không cố định.

Sử dụng bìa cát-tông bắt vào servo

Cố định cảm biến với dây chun

Giữ cho servo không bị ngã

Lắp mạch

Lập trình

Vì bài này sẽ sử dụng Servo SG90 và HC-SR04 nên các bạn cần phải hiểu được 2 bài này nhé:

Để có thể vẽ ra một chiếc radar trên màn hình processing chúng ta cần có 2 dữ liệu là góc quay và khoảng cách. Arduino sẽ cho servo quay từ 0 độ đến 180 độ và ngược về trong khi quay 1 độ thì sẽ đo khoảng cách và gửi về Processing. Chúng ta quy định cú pháp gửi dữ liệu là “Angle,Distance.” (“Độ,Khoảng cách.”).

Ví dụ: 12,25. Trong đó 12 là độ hiện tại và 25 là khoảng cách đến vật cản.

Code Arduino:

Code Processing:

Các bạn nếu không thích quét thành đường mà chỉ muốn quét hiển thị 1 chấm thì các bạn thay dòng code thứ 88 thành:

line(pixsDistance*cos(radians(iAngle)),-pixsDistance*sin(radians(iAngle)),pixsDistance*cos(radians(iAngle)),-pixsDistance*sin(radians(iAngle)));

Kết quả

Giải thích

Các lệnh ở Processing các bạn có thể tìm hiểu từ trang chủ: https://processing.org/reference/

Ở đây, mình sẽ giải thích một số lệnh mới. Lần này chúng ta sử dụng đến 3 thư viện: processing.serial.*; java.awt.event.KeyEvent; java.io.IOException; với các thư viện này, các bạn không cần tải thêm chỉ cần khai báo vì trong Processing đã có sẵn.

  1. Vẽ
  • noStroke()

Vẽ không viền

  • strokeWeight(a)

Độ dày của đường vẽ với a là độ dày

  • fill(rgb,alpha) hoặc fill(gray,alpha) hoặc fill(a,b,c,alpha)

Trong đó rgb, gray và a,b,c là các hệ số màu còn alpha là độ trong suốt (có hoặc không đều được) ở đây chúng ta cho alpha = 10 để không xóa hoàn toàn các đường cũ để tạo slowmo

  • arc(a,b,c,d,start,stop,mode)

Vẽ vòng cung trong đó a,b là tọa độ của tâm và c,d là độ dài và độ rộng của cung ellipse, start và stop là 2 điểm bắt đầu và kết thúc được tính theo pi. Còn mode có hay không cũng được, các bạn có thể theo dõi nó từ trang chủ.

  • line(x1,y1,x2,y2) hoặc line(x1,y1,z1,x2,y2,z2)

Dùng để vẽ đường thẳng 2d hoặc trong 3d trong đó các tham số là tọa độ của điểm đầu và cuối lần lượt.

  1. Đọc dữ liệu
  • Port.bufferUntill(char)

Giới hạn chuỗi đọc vào đến char

  • serialEvent(Serial ){}

Sẽ được chạy khi có tín hiệu Serial gửi đến để phân tích dữ liệu

  • String.readStringUntil(char)

Trả về chuỗi cho đến kí tự char

  • String.substring(a,b)

Trả về chuỗi từ vị trí a đến b (tính từ 0)

  • String.indexOf(char)

Trả về thứ tự của kí tự char đầu tiên trong nếu không có sẽ trả về -1

  1. Tọa độ
  • translate(x,y)

Dịch chuyển con trỏ đến tại vị trí x,y so với vị trí hiện tại (lưu ý là so với vị trí hiện tại)

Ví dụ:

  • translate(5,5) -> dịch chuyển con trỏ đến vị trị (5,5)
  • translate(15,2) -> dịch chuyển con trỏ đến vị trí (20,7) vì dịch (15,2) so với (5,5)
  • pushMatrix() và popMatrix()

Vì translate() sẽ di chuyển con trỏ đến tọa độ so với tọa độ hiện tại nên muốn quay về vị trí phía trước ta phải translate() ngược lại. pushMatrix() được sinh ra để làm điều đó.

pushMatrix() có chức năng là lưu vị trí hiện tại vào Stack và popMatrix() sẽ đưa con trỏ về vị trí vừa lưu trong Stack()

Ví dụ:

  • pushMatrix() -> Lưu vị trí hiện tại vào Stack (0,0) lưu -> Stack = {(0,0)} -> Con trỏ = (0,0)
  • translate(5,5) -> Dịch chuyển con trỏ đến vị trí (5,5) -> Stack không đổi = {(0,0)} -> Con trỏ = (5,5)
  • popMatrix() -> Đưa con trỏ về vị trí trong Stack {(0,0)} -> Stack = {rỗng} -> Con trỏ = (0,0)
  • translate(15,2) -> Dịch chuyển con trỏ đến vị trí (15,2)

Như các bạn có thể thấy thì ở hai ví dụ trên kết quả cuối cùng của con trỏ được thay đổi khác nhau. Chúng ta sử dụng pushMatrix() và popMatrix() để vẽ radar, các đường quét và vật cản từ một điểm hạn chế sự phức tạp trong việc dịch chuyển con trỏ (pointer)

Chúc các bạn may mắn và thành công !!!

Có thể bạn quan tâm ???