Các công nghệ cần sử dụng để có thể xây dựng một hệ thống xe tự hành.Xe tự hành là một loại xe có khả năng tự động hóa hoàn toàn quá trình lái xebằng việc sử dụng các công nghệ hiện đại
CƠ SỞ LÝ THUYẾT
Các công nghệ cần sử dụng để có thể xây dựng một hệ thống xe tự hành
Xe tự hành là một loại xe có khả năng tự động hóa hoàn toàn quá trình lái xe bằng việc sử dụng các công nghệ hiện đại như máy tính, cảm biến, trí tuệ nhân tạo và học sâu (deep learning) Việc tự động hóa này giúp giảm thiểu sự can thiệp của con người trong quá trình lái xe, giảm nguy cơ tai nạn giao thông và tăng tính an toàn cho người lái và hành khách. Để xây dựng một hệ thống xe tự hành, cần sử dụng các công nghệ như sau:
Công nghệ cảm biến: Xe tự hành sử dụng nhiều loại cảm biến để thu thập thông tin về môi trường xung quanh, bao gồm cảm biến laser, cảm biến radar, camera và cảm biến siêu âm Thông tin từ các cảm biến này được sử dụng để xác định vị trí của xe, phát hiện và đánh giá các vật cản xung quanh và dự đoán các tình huống có thể xảy ra trong tương lai.
Công nghệ định vị toàn cầu (GPS): Công nghệ GPS được sử dụng để định vị chính xác vị trí của xe trong thế giới thực Dữ liệu về vị trí của xe được sử dụng để định hướng và điều khiển xe trong thời gian thực.
Công nghệ trí tuệ nhân tạo (AI): Trí tuệ nhân tạo được sử dụng để giúp xe tự động xử lý thông tin và học hỏi từ các tình huống mà xe đã trải qua Điều này giúp xe có khả năng dự đoán các tình huống phức tạp và phát triển các kế hoạch để xử lý chúng một cách hiệu quả.
Hệ thống điều khiển: Hệ thống điều khiển được sử dụng để điều khiển các bộ phận của xe, bao gồm động cơ, hệ thống phanh và hệ thống lái Các bộ phận này được điều khiển một cách tự động để giúp xe di chuyển một cách an toàn và hiệu quả.
Công nghệ kết nối: Công nghệ kết nối được sử dụng để kết nối xe với các hệ thống thông tin và giao tiếp với các phương tiện khác trên đường Điều này giúp xe tự động phát hiện và tránh.
Một số công nghệ mới trên xe tự hành
Công nghệ mới nhất trên xe tự hành liên quan đến các nâng cao tính năng và khả năng của hệ thống, giúp tăng tính an toàn và sự tin tưởng của người dùng
2.2.1 Máy học tăng cường (Reinforcement Learning)
Máy học tăng cường là một phương pháp học máy được sử dụng để cải thiện khả năng học và tối ưu hóa quyết định trong một môi trường động Trong xe tự hành, máy học tăng cường có thể được sử dụng để cải thiện khả năng điều khiển và tối ưu hóa việc di chuyển của xe Một ví dụ về ứng dụng của máy học tăng cường trong xe tự hành là giúp xe tự động tìm hiểu và phản hồi tốt hơn với các tình huống phức tạp trên đường.
Máy học tăng cường đã được ứng dụng trong nghiên cứu và phát triển các công nghệ trên xe tự hành Tuy nhiên, hiện tại vẫn chưa có nhiều dòng xe được trang bị với các hệ thống sử dụng máy học tăng cường.
Một trong số ít những dòng xe được sử dụng máy học tăng cường là xe tự hành Waymo của Google Waymo sử dụng hệ thống máy học tăng cường để giúp xe tự động học hỏi và cải thiện khả năng di chuyển và đối phó với các tình huống giao thông phức tạp.
Ngoài ra, các công ty khác như Tesla, Uber và General Motors cũng đang nghiên cứu và phát triển các hệ thống sử dụng máy học tăng cường cho xe tự hành của họ Tuy nhiên, hiện tại vẫn chưa có thông tin cụ thể về việc họ đã áp dụng thành công máy học tăng cường vào sản phẩm của mình hay chưa.
2.2.2 Công nghệ lidar tần số (High-Frequency Lidar)
Lidar là công nghệ dùng để tạo bản đồ và cung cấp thông tin về môi trường xung quanh Lidar tần số cao sử dụng tần số cao hơn để tăng độ phân giải và độ chính xác của thông tin thu thập được Điều này giúp xe tự hành có thể phát hiện và đánh giá vật thể xung quanh một cách chính xác hơn Với công nghệ này, xe tự hành có thể hoạt động được an toàn hơn, giảm thiểu nguy cơ tai nạn trên đường.
Công nghệ LiDAR tần số cao (High - frequency LiDAR) đã được ứng dụng trong nhiều hệ thống xe tự hành, đặc biệt là trong các dự án nghiên cứu và phát triển của các công ty lớn như Waymo, Cruise Automation, Zoox, Aurora và nhiều hãng xe khác.
Với khả năng tạo ra hình ảnh 3D chính xác và chi tiết của môi trường xung quanh, LiDAR tần số cao là công nghệ quan trọng trong việc giúp xe tự hành phát hiện và định vị vật thể xung quanh, từ đó đưa ra quyết định an toàn cho hành trình của xe.
Các hệ thống LiDAR tần số cao thường sử dụng các cảm biến LiDAR phát tia laser với tần số cao để quét môi trường xung quanh Dữ liệu thu được từ các tia laser này sau đó được sử dụng để tạo ra hình ảnh 3D của môi trường xung quanh, giúp xe tự hành "nhìn thấy" và "đánh giá" môi trường xung quanh.
2.2.3 Công nghệ học sâu (Deep Learning)
Công nghệ học sâu là một phương pháp của Trí tuệ nhân tạo (AI), trong đó các mô hình máy tính được thiết kế để học từ dữ liệu Đây là một loại học máy, cho phép máy tính tự động học hỏi và cải thiện từ dữ liệu đầu vào mà không cần phải được lập trình cụ thể.
Trong xe tự hành, học sâu được sử dụng để phân tích và xử lý dữ liệu từ các cảm biến trên xe, bao gồm các camera, radar và LiDAR Hệ thống học sâu có thể học nhận diện các đối tượng, nhận dạng biển báo giao thông, phát hiện chướng ngại vật, và thực hiện các tác vụ khác để giúp xe tự động điều khiển và phản ứng với môi trường xung quanh.
Các hãng xe lớn như Tesla, GM Cruise, Waymo, và nhiều hãng khác đã sử dụng công nghệ học sâu trong các hệ thống xe tự hành của mình Ví dụ, Tesla sử dụng mạng nơ - ron học sâu để giúp các hệ thống lái tự động của mình hoạt động hiệu quả hơn, trong khi Waymo sử dụng học sâu để phát hiện và phản ứng với các tình huống giao thông phức tạp.
2.2.4 Hệ thống cảnh báo điểm mù (Blind Spot Warning System)
Hệ thống cảnh báo điểm mù là một công nghệ mới trên xe tự hành, giúp giảm thiểu nguy cơ tai nạn do điểm mù của người lái Hệ thống này sử dụng các cảm biến và camera để giám sát các khu vực quanh xe và cảnh báo người lái khi có vật thể nằm trong điểm mù Điều này giúp tăng tính an toàn đảm bảo sự an toàn cho người lái và các hành khách trên xe Hơn nữa, với tính năng tự động hoạt động, hệ thống này cũng giúp giảm bớt sự mệt mỏi cho người lái trong quá trình lái xe.
Hệ thống cảnh báo điểm mù trên xe tự hành hoạt động như sau:
1 Cảm biến và camera: Hệ thống sử dụng các cảm biến và camera được lắp đặt trên xe để giám sát các khu vực quanh xe.
2 Phát hiện điểm mù: Hệ thống sẽ phát hiện điểm mù bằng cách xác định vị trí của các vật thể trong khu vực mà người lái không thể nhìn thấy bằng mắt.
3 Cảnh báo người lái: Nếu hệ thống phát hiện vật thể trong điểm mù, nó sẽ cảnh báo người lái bằng cách hiển thị một biểu tượng hoặc âm thanh cảnh báo trên màn hình của xe hoặc thông qua các loa trên xe.
Thứ tự thực hiện cơ bản của một hệ thống xe tự hành
Có thể có nhiều cách tiếp cận để xây dựng một hệ thống xe tự hành, nhưng thường thì quá trình thực hiện sẽ bao gồm các bước chính như sau:
1 Thu thập dữ liệu: Hệ thống sẽ thu thập dữ liệu từ các cảm biến và camera trên xe và các phương tiện khác để hiểu được môi trường xung quanh.
2 Xử lý dữ liệu: Sau khi thu thập dữ liệu, hệ thống sẽ sử dụng các thuật toán xử lý dữ liệu để phân tích và tạo ra một bản đồ 3D của môi trường.
3 Lập kế hoạch đường đi: Hệ thống sẽ sử dụng các thuật toán lập kế hoạch đường đi để tính toán đường đi tối ưu và an toàn cho xe.
4 Tự động lái xe: Sau khi tính toán được đường đi tối ưu, hệ thống sẽ tự động lái xe thông qua các bộ điều khiển và động cơ.
5 Theo dõi và đánh giá: Hệ thống sẽ tiếp tục thu thập dữ liệu và đánh giá hiệu suất của chính nó để cải thiện và điều chỉnh cho các lần hoạt động sau.
Tất nhiên, quá trình thực hiện của hệ thống xe tự hành còn phụ thuộc vào nhiều yếu tố khác như công nghệ sử dụng, cấu trúc phần cứng và phần mềm, môi trường vận hành, điều kiện thời tiết, động lực học và các quy định và luật lệ của khu vực vận hành.
Arduino IDE
Download phần mềm Arduino IDE: https://www.arduino.cc/en/software
Arduino IDE (Integrated Development Environment) là một phần mềm miễn phí được sử dụng để viết và biên dịch mã cho các module Arduino Đây là phần mềm cung cấp một giao diện dễ sử dụng và trực quan cho người dùng để viết code, tải lên và chạy chương trình trên mạch Arduino.
Arduino IDE hỗ trợ nhiều ngôn ngữ lập trình như C, C++, và một số thư viện mã nguồn mở Nó cũng cung cấp cho người dùng các tính năng như gỡ lỗi, đọc các giá trị cảm biến, và ghi dữ liệu.
Có rất nhiều các module Arduino như Arduino Uno, Arduino Mega, Arduino Leonardo, Arduino Micro và nhiều module khác.
Mỗi module chứa một bộ vi điều khiển trên bo mạch được lập trình và chấp nhận thông tin dưới dạng mã.
Phần mềm arduino IDE chủ yếu chứa hai phần cơ bản: Trình chỉnh sửa và Trình biên dịch, phần đầu sử dụng để viết mã được yêu cầu và phần sau được sử dụng để biên dịch và tải mã lên module Arduino.
Khi người dùng viết mã và biên dịch, IDE sẽ tạo file Hex cho mã File Hex là các file thập phân Hexa được Arduino hiểu và sau đó được gửi đến bo mạch bằng cáp USB Mỗi bo Arduino đều được tích hợp một bộ vi điều khiển, bộ vi điều khiển sẽ nhận file hex và chạy theo mã được viết.
2.4.3.1 Chớp LED Đây là ví dụ cơ bản nhất nhưng cũng quan trọng nhất cho những người mới tìm hiểu Arduino
Code: void setup() { pinMode(LED_BUILTIN, OUTPUT);
} void loop() { digitalWrite(LED_BUILTIN, HIGH); delay(1000); digitalWrite(LED_BUILTIN, LOW); delay(1000);
Trong code của chương trình này: pinMode(LED_BUILTIN, OUTPUT);
Dùng để khai báo, chân LED_BUILTIN là chân đầu ra LED_BUILTIN trong Arduino IDE có giá trị là 13 Như vậy thay vì ghi LED_BUILTIN chúng ta có thể ghi số 13. digitalWrite(LED_BUILTIN, HIGH);
Xuất tín hiệu số ra chân 13, HIGH là ON, đèn sáng digitalWrite(LED_BUILTIN, LOW);
Xuất tín hiệu số ra chân 13, LOW là OFF, đèn tắt. delay(1000);
Dừng không làm gì trong vòng 1000 ms (1s) Câu lệnh này là cần thiết để thấy được việc LED chớp tắt Nếu không có lệnh delay, LED sẽ chớp tắt nhanh,mắt thường con người không thể nhận ra
Trên Arduino, chúng ta sẽ thấy 1 LED sáng 1s, tắt 1s Đây là LED nối vào chân 13 của Arduino.
Kỹ thuật PWM – Pulse Width Modulation – là một kỹ thuật quan trọng trong điện tử hiện đại PWM dùng để điều khiển các thiết bị thay đổi độ lớn liên tục
Chuẩn bị 1 LED, đầu (-) nối đến GND, đầu (+) nối đến chân số 9 của Arduino.
Code: int led = 9; int brightness = 0; int fadeAmount = 5; void setup() { pinMode(led, OUTPUT);
} void loop() { analogWrite(led, brightness);
Hình 2.2: Ví dụ Arduino chớp LED Hình 2.1: Ví dụ Arduino chớp LED brightness = brightness + fadeAmount; if (brightness = 255) { fadeAmount = -fadeAmount;
Trong code của chương trình này: analogWrite(led, brightness);
Lệnh này sẽ xuất ra chân 9 của Arduino tín hiệu PWM Độ lớn của tín hiệu do giá trị của brightness quyết định (có giá trị từ 0 đến 255) 0 ứng với độ rộng xung bằng 0, tín hiệu yếu nhất, trạng thái OFF 255 ứng với độ rộng xung 100%, tín hiệu mạnh nhất, trạng thái ON
Hình 2.1: Ví dụ Arduino xuất tín hiệu PWM
LED nối với chân số 9 của Arduino sẽ sáng mờ sáng tỏ thay đổi liên tục.
2.4.3.3.Ví dụ về câu lệnh Serial.available():
} void loop() { if (Serial.available() > 0) { char ch = Serial.read();
Trong code của chương trình này:
Dùng để kiểm tra xem có gia trị nào gửi lên từ serial hay chưa, nếu có sẽ thực hiện các câu lênh trong {} ( In ra “Recived” và giá trị của biến ch được gán bằng với giá trị của Serial.read() )
Nếu có dữ liệu gửi đến từ serial thì sẽ In ra “Recived” và giá trị của biến ch được gán bằng với giá trị của Serial.read() Nếu không có chương trình sẽ không in gì ra màn hình.
Python Shell
2.5.1 Giới thiệu về Python Shell
Python Shell cung cấp một cửa sổ dòng lệnh đơn giản, cho phép người dùng nhập lệnh Python và xem kết quả trực tiếp Khi người dùng nhập lệnh, Python Shell sẽ thực thi nó và hiển thị kết quả trong cửa sổ dòng lệnh Python Shell là một chương trình dùng để soạn thảo các tập lệnh và tạo file *.py cơ bản Ngoài ra, Python Shell có thể thực thi các chương trình viết bằng ngôn ngữ Python Một trong những ưu điểm lớn của Python Shell là khả năng kiểm tra đoạn mã Python ngắn một cách nhanh chóng Khi người dùng viết một đoạn mã Python mới, họ có thể dễ dàng kiểm tra các lệnh riêng lẻ trước khi đưa chúng vào trong một tệp mã lớn hơn Điều này giúp tiết kiệm thời gian và giảm thiểu lỗi khi phát triển các ứng dụng Python.
Python Shell cũng được sử dụng trong môi trường giảng dạy Python cơ bản, vì nó cung cấp một cách dễ dàng để học và thực hành các khái niệm cơ bản của ngôn ngữ lập trình Python.
Cách cài đặt Python Shell:
Cài đặt Python trên máy tính của bạn (nếu chưa có) Bạn có thể tải Python từ trang web chính thức của nó: https://www.python.org/downloads/
Mở Python Shell bằng cách mở terminal hoặc command prompt và gõ lệnh
"python" hoặc "python3" (tùy thuộc vào phiên bản Python bạn đã cài đặt).
Sau khi cài đặt, khởi động Python Shell cho ta cửa sổ như sau:
Thực hiện File >> New File, ta sẽ có cửa sổ sau:
Chúng ta sẽ biên soạn file, chạy file trên giao diện này.
2.5.2 Giao tiếp giữa Python và Arduino thông qua Serial Communication
Cài đặt Package Serial Communication cho Python IDE: việc kết nối python và Arduino thông qua serial communication cho phép chúng ta tận dụng khả năng tính toán mạnh của laptop để xử lý các nhiệm vụ phức tạp, và từ đó gửi các tín hiệu điều khiển xuống Arduino để thực thi các lệnh. Để thêm Package Serial Communication, từ Command Prompt của Window chúng ta gõ lệnh: py -m pip install pyserial.
2.5.3 Tổng quan xử lý ảnh
Xử lý ảnh là một lĩnh vực của khoa học máy tính và tư duy tính toán, dùng để thao tác, xử lý, hiển thị, phân tích và nhận dạng hình ảnh Được sử dụng rộng rãi trong nhiều lĩnh vực, từ khoa học thị giác cho đến công nghiệp và nghệ thuật.
Xử lý ảnh có thể được chia thành các loại chính sau:
Xử lý ảnh số: Thực hiện thao tác với các bức ảnh số để phát hiện, trích xuất thông tin từ hình ảnh đó và cải thiện chất lượng ảnh.
Thị giác máy tính: phát triển các thuật toán, giúp máy tính hiểu và hiển thị hình ảnh giống như con người.
Thị giác máy tính 3D: Lĩnh vực con của thị giác máy tính, tập trung vào xử lý dữ liệu đa chiều, bao gồm cả thời gian và không gian.
Thị giác máy bay: Là kỹ thuật xử lý ảnh liên quan đến việc phát hiện và theo dõi các đối tượng trên không, bao gồm lấy dữ liệu từ máy bay và phát hiện cửa sổ đối tượng, theo dõi người lái máy bay và các hoạt động hàng không khác.
Công nghiệp: Là việc sử dụng các kỹ thuật xử lý ảnh để kiểm tra sản phẩm và trích xuất thông tin.
Nạp ảnh: Ảnh được đọc hoặc tải vào hệ thống để xử lý Có thể lưu trữ ảnh ở nhiều dạng khác nhau như PNG, GIF, JMG…
Xử lý ảnh: Ảnh được xử lý thông qua các thuật toán, phương pháp và công cụ để thực hiện các hoạt động khác nhau như phóng to, xoay, chỉnh hướng…
Trích xuất dữ liệu: Các đặc trưng hoặc thông tin được trích xuất từ ảnh sau khi đã qua các bước xử lý, chẳng hạn như các đối tượng, biên, hình dạng và màu sắc.
Phân tích dữ liệu: Dữ liệu được phân tích để tìm hiểu ý nghĩa của nó và thiết kế các giải pháp cho các vấn đề cụ thể
Hiển thị kết quả: Hiển thị ảnh đầu ra sau khi đã xử lý để dễ dàng quan sát và đánh giá.
2.5.3.4 Phương pháp xử lý ảnh
Xử lý ảnh số: Là phương pháp biến đổi bức ảnh từ dạng không liên tục sang dạng liên tục, đồng thời thực hiện các phép biến đổi và tính toán theo các thuật toán toán học.
Xử lý ảnh tín hiệu: Là phương pháp xử lý ảnh dựa trên các kỹ thuật xử lý tín hiệu số để phân tích, xử lý và tái tạo hình ảnh.
Xử lý ảnh học máy: Là phương pháp xử lý ảnh bằng cách sử dụng các thuật toán học máy để phân tích và trích xuất thông tin từ hình ảnh.
2.5.4 Tổng quan xử lý ảnh bằng Python
2.5.4.1 Xử lý ảnh bằng Python Để điều khiển tự động lái trên ô tô thì việc thu thập và xử lý ảnh là nhiệm vụ rất quan trọng không thể thiếu.
Giống như các công cụ khác, để xử lý ảnh, chúng ta cũng phải thêm Package xử lý ảnh cho Python Mở cửa sổ Command Prompt, gõ lệnh sau để cài đặt Pillow Package. py -m pip install Pillow
Trong cửa sổ Command Prompt, gõ lệnh sau để cài đặt OpenCV Package. py -m pip install opencv-python
2.5.4.2 Xử lý ảnh bằng Open CV trong Python
OpenCV (Open Source Computer Vision Library) là một thư viện mã nguồn mở chuyên về xử lý ảnh và thị giác máy tính Trong Python Shell, cài đặt gói opencv-python như giới thiệu trong Bài 3 để có thể bắt đầu sử dụng.
Trong bài này, đầu tiên chúng ta lưu ý một số lệnh quan trọng trong Open
CV Sau đó, chúng ta dùng Open CV để nhận diện đoạn thẳng Việc nhận diện đoạn thẳng là việc quan trọng để xác định làn đường di chuyển của ô tô.
Một số lệnh trong Open CV
DroidCam
Droidcam là một ứng dụng cho phép sử dụng điện thoại di động của mình làm webcam trên máy tính Để sử dụng Droidcam, ta cần cài đặt ứng dụng
Droidcam trên điện thoại di động và cài đặt phần mềm Droidcam Client trên máy tính.
Sau khi cài đặt và kết nối thành công giữa điện thoại và máy tính thông qua cùng một mạng Wi-Fi ta có thể sử dụng ứng dụng Droidcam để truyền hình ảnh từ camera của điện thoại đến máy tính
2.6.1 Cách kết nối thông qua mạng wifi Để kết nối thông qua wifi ta cần đảm bảo điện thoại và máy tính kết nối chung một mạng wifi
Mở ứng dụng Droidcam trên điện thoại và phần mềm Droidcam Client
Hình 2.15 : Giao diện kết nối giữa điện thoại và máy tính bằng ứng dụng Droidcam thông qua Wifi Trên máy tính chọn Connect over Wifi (LAN) Trên màn hình điện thoại ta lấy Wifi IP nhập chính xác vào phần mềm trên máy tính sau đó chọn Start.
2.6.2 Cách kết nối thông qua dây cáp
Sử dụng cổng USB để kết nối điện thoại và máy tính
Mở ứng dụng Droidcam trên điện thoại và phần mềm Droidcam Client
Hình 2.16: Giao diện kết nối giữa điện thoại và máy tính bằng ứng dụng Droidcam thông qua dây cáp
Trên màn hình máy tính chọn Connect over USB và chọn Start.
Arduino Uno
Arduino Uno là một board điều khiển vi xử lý được sử dụng rộng rãi trong các ứng dụng điện tử, đặc biệt là trong việc điều khiển động cơ Board này có nhiều tính năng hữu ích để điều khiển động cơ, bao gồm các chân GPIO để kết nối với các động cơ và các bộ điều khiển động cơ, các chân PWM để điều chỉnh tốc độ động cơ, và các chân ADC để đọc giá trị từ các cảm biến phản hồi. Để điều khiển một động cơ bằng Arduino Uno, bạn cần kết nối động cơ với một bộ điều khiển động cơ, sau đó kết nối bộ điều khiển động cơ với board
Arduino Uno Bạn có thể sử dụng các chân GPIO của Arduino Uno để kết nối với bộ điều khiển động cơ, và các chân PWM để điều chỉnh tốc độ của động cơ Ngoài ra, bạn có thể sử dụng các cảm biến phản hồi để đọc giá trị từ động cơ và điều khiển chúng.
Arduino Uno có các chân sau:
Digital pins (chân số): có tổng cộng 14 chân (0-13) Chúng có thể được sử dụng để đọc và điều khiển các tín hiệu số (0 hoặc 1).
Analog pins (chân analog): có tổng cộng 6 chân (A0-A5) Chúng có thể được sử dụng để đọc các giá trị analog từ các cảm biến hoặc tín hiệu điện áp từ các thiết bị khác.
Power pins (chân cấp nguồn): bao gồm các chân 5V, 3.3V, và GND (đất) Chúng được sử dụng để cấp nguồn cho các linh kiện khác trên bo mạch Arduino.
PWM pins: có tổng cộng 6 chân được đánh số từ 3 đến 11 Chúng có thể được sử dụng để tạo ra các tín hiệu PWM (Pulse Width Modulation), được sử dụng để điều khiển độ sáng, tốc độ, hoặc âm lượng của các thiết bị đầu ra như LED, motor, loa, v.v.
ICSP pins: bao gồm 6 chân MOSI, MISO, SCK, RESET, VCC, và GND Chúng được sử dụng để nạp chương trình cho bo mạch Arduino, hoặc để kết nối với các vi điều khiển khác thông qua giao thức SPI.
Serial pins (chân nối tiếp): bao gồm 2 chân RX và TX Chúng được sử dụng để truyền và nhận các tín hiệu dữ liệu qua cổng Serial của Arduino.
Ngoài ra, arduino uno còn có các linh kiện:
Nguồn (USB / Barrel Jack): Mỗi mạch Arduino đều có cổng kết nối với nguồn điện Cụ thể trên đây mà mạch Arduino UNO có thể được lấy nguồn từ dây cáp USB từ máy tính của bạn, hoặc một số nguồn DC khác có Jack DC.
Nút Reset (Reset Button): Nút reset có nhiệm vụ khởi động lại bất kỳ đoạn code nào được tải trên Arduino Điều này rất hữu ích nếu code của bạn không có vòng lặp nhưng bạn lại muốn kiểm tra chương trình đó nhiều lần Đèn LED báo nguồn (Power LED Indicator): Đèn báo được lắp ngay bên phải của chữ UNO, đó là một đèn LED nhỏ được dán nhãn ON Đèn báo này có nhiệm vụ báo khi có nguồn cấp vào Arduino Trong một số trường hợp đèn không sáng thì chắc chắn có vấn đề xảy ra Bạn có thể kiểm tra lại dây cáp USB, nguồn cấp và cả mạch nữa
LED TX và RX: TX là LED hiển thị tín hiệu truyền đi và RX là hiển thị tín hiệu nhận về Những tín hiệu này xuất hiện khá nhiều trong các thiết bị điện tử để có thể chỉ ra những chân thực hiện nhiệm vụ truyền tải nối tiếp Trong trường hợp này, có 2 vị trí trên Arduino UNO là TX và RX.
L298N
Module L298N là một module điều khiển động cơ được sử dụng rộng rãi trong các ứng dụng điện tử Module L298N có thể điều khiển được hai động cơ DC hoặc một động cơ bước với dòng điện lên tới 2A cho mỗi kênh
Chân cấp nguồn 12V: đây là chân cấp nguồn cho module L298N Nguồn này có giá trị vào khoảng 7-35V.
Chân GND: Đây là chân được sử dụng để kết nối với đất.
Chân cung cấp 5V: Đây là đầu ra L298N dùng để cấp nguồn cho các thiết bị điện tử khác.
Chân ENA và ENB: Đây là 2 chân dùng để điều khiển tốc độ của 2 động cơ
DC Tín hiệu điều khiển trên các chân này sẽ điều chỉnh độ rộng xung (PWM) và do đó điều chỉnh tốc độ quay của động cơ.
Chân IN1, IN2, IN3 và IN4: Đây là 4 chân được sử dụng để đảo chiều quay của động cơ DC Bằng cách chuyển đổi tín hiệu 1 hoặc 0, bạn có thể đảo chiều quay của động cơ.
Bảng 2: Thông số kỹ thuật của L298N
TÍNH TOÁN, THIẾT KẾ, CHẾ TẠO, LẮP ĐẶT
Lắp đặt
3.1.1 Các chi tiết cần chuẩn bị
2 khung xe 4 bánh: Lắp đặt các motor và các chi tiết.
4 Motor giảm tốc: Nguồn động lực giúp xe di chuyển.
2 Công tắc bập bênh: Đóng ngắt nguồn tới nuôi arduino và mạch cầu H.
1 Arduino UNO: Dùng Arduino IDE để lập trình, gửi tín hiệu điện áp tới L298N để gián tiếp điều khiển chiều quay và tốc độ của 4 motor thông qua các chân 3, 4, 5, 8, 9, 10 trên board Arduino.
1 Mạch cầu H L298N: Điều khiển chiều quay và tốc độ của 4 motor.
1 khay đựng 4 pin 18650A: Đã được xử lý lại tách ra 1 pin riêng để nuôi Arduino (Vin, GND), 3 pin nuôi cầu H L298N (12V, GND).
4 pin 18650A: Cung cấp năng lượng cho xe
Dây dẫn: Gồm 2 loại dây có kích thước lớn dùng để cấp nguồn, dây có kích thước nhỏ dùng để liên kết tín hiệu giữa Arduino và L298N.
3.1.2 Lắp ráp các chi tiết
Hàn dây dẫn cho 4 motor.
Lắp bánh xe vào motor giảm tốc.
Tách khay pin 4 thành khay 3 và 1.
Hàn công tắc đóng ngắt nguồn.
Tạo hình và dán fomex thành cột giá đỡ điện thoại.
Lắp các chi tiết lên khung xe.
Kết nối dây tín hiệu, motor và dây cấp nguồn với L298N và Arduino theo sơ đồ sau.
Hình 3.1: Sơ đồ kết nối các dây dẫn
Hình 3.2: Gía đỡ điện thoại trên mô hình xe
Hình 3.3: Mô hình xe hoàn chỉnh
Code Arduino và giải thích code
Code : int enT = 3; int TT = 4; int TS = 5; int PT= 8; int PS= 9; int enP ; int T = 45; int TN = 45; int TL = 83; int PN = 45; int PL = 83;
//khai báo 6 biếS n tương đương các chân đếX điếY u khiếX n các motor thông qua mạch câY u H bao gôY m: 2 biếS n Enable (enT, enP) và 4 biếS n(TT, TS, PT, PS) đếX thay đôX i chiếY u quay cu Xa các động cơ Khai báo thếm 5 biếS n (T,TN,TL,PN,PL) đếX điếY u chỉ Xnh nhanh tôS c độ cu Xa các bánh xe khi xe đi thẳX ng,rẽ trái,rẽ pha Xi void setup() {
//giao tiếS p Serial với tôS c độ 9600 bps. pinMode(enT, OUTPUT); pinMode(TT, OUTPUT); pinMode(TS, OUTPUT); pinMode(enP, OUTPUT); pinMode(PT, OUTPUT); pinMode(PS, OUTPUT);
// thiếS t lập các chân 3 4 5 8 9 10 là các chân đâY u ra
} void loop() { if (Serial.available() > 0)
//Kiếc m tra coi có nhận được dữ liệu hay không.
//Khai báo thếm biếS n command kiếX u char ( Lưu trữ được 1 kí tự) đọc giá trị gưX i lến từ Python ( N,L,R). if (command == 'N')
{ digitalWrite(TT, LOW); digitalWrite(TS, HIGH ); analogWrite(enT, T); digitalWrite(PT, LOW); digitalWrite(PS, HIGH); analogWrite(enP, T);
// NếS u command = N thì gưX i tín hiệu khiếX n tới câY u H khiếX n 4 motor quay cùng tôS c và đi tới. else if (command == 'L')
{ digitalWrite(TT, LOW); digitalWrite(TS, HIGH ); analogWrite(enT,TN); digitalWrite(PT, LOW); digitalWrite(PS, HIGH); analogWrite(enP, TL);
// NếS u command = L thì gưX i tín hiệu khiếX n tới câY u H khiếX n 4 motor quay khác tôS c , 2 motor bến pha Xi quay nhanh hơn 2 motor bến trái giúp xe rẽ trái. else if (command == 'R')
{ digitalWrite(TT, LOW); digitalWrite(TS, HIGH ); analogWrite(enT,PL); digitalWrite(PT, LOW); digitalWrite(PS, HIGH); analogWrite(enP, PN);
// NếS u command = R thì gưX i tín hiệu khiếX n tới câY u H khiếX n 4 motor quay khác tôS c , 2 motor bến trái quay nhanh hơn 2 motor bến pha Xi giúp xe rẽ pha Xi. else if (command == 'S')
{ digitalWrite(TT, LOW); digitalWrite(TS, HIGH ); analogWrite(enT,0); digitalWrite(PT, LOW); digitalWrite(PS, HIGH); analogWrite(enP, 0);
// NếS u command = S thì gưX i tín hiệu khiếX n tới câY u H khiếX n 4 motor ngừng quay và xe đứng im
Code python và giải thích code
Code: import sys import math import cv2 as cv import numpy as np import time import serial
#ThiếS t lập một kếS t nôS i với thiếS t bị giao tiếS p qua côX ng COM9 với tôS c độ truyếY n dữ liệu là 9600 ser = serial.Serial('COM8', 9600)
#Tạo đâY u vào là camera 1 , camera gẳS n thếm. cam = cv.VideoCapture(1)
#Chuôc i dùng đếX đặt tến, window_name1 đếX hiếX n thị hình a Xnh trực tiếS p từ camera BiếS n window_name2 được sưX dụng đếX tạo ra một cưX a sôX khác đếX hiếX n thị hình a Xnh đã được xưX lý. window_name1 = 'Hinh goc' window_name2 = 'Hinh xu ly'
#Vòng lặp xưX lí liến tục while(True):
#Đọc 1 khung hình ,[1] nghĩa là truy cập vào phâY n tưX thứ
2(ret,frame) tức là frame.Sau khi đọc in ra kích thước src = cam.read()[1]
# tạo một ba Xn sao độc lập cu Xa ma Xng src và gán nó cho biếS n
Hinh2(tránh thay đôX i trực tiếS p các giá trị pixel trong ma Xng src, vì nếS u thay đôX i sẽ dâc n đếS n các thao tác sau này sẽ bị a Xnh hươ Xng) và gán tâS t ca X pixel cu Xa hình 2 là đen (giá trị pixel là 0).
# ksize là kích thước kernel được sưX dụng đếX áp dụng lến a Xnh Kích thước này xác định mức độ làm mờ cu Xa a Xnh. ksize = (6, 6)
# cv.blur() là một phương thức trong thư viện OpenCV được sưX dụng đếX áp dụng bộ lọc , trong trường hợp này là làm mờ (blurring) a Xnh, , lọc bo X những đường ke X cu Xa gạch image = cv.blur(src, ksize)
#Thực hiện phép biếS n đôX i Canny trến a Xnh image một ba Xn sao độc lập cu Xa ma Xng src , edges=None => không lưu trữ ma Xng dst = cv.Canny(image, 50, 200, None, 3)
#Phát hiện các đường thẳX ng trong hình a Xnh bằng phương pháp Hough transform lines = cv.HoughLines(dst, 1, np.pi / 180, 150, None, 0, 0)
#Tạo hai ma Xng rho1 và theta1 với kích thước là 200 và tâS t ca X các phâY n tưX trong ma Xng đếY u được gán giá trị là 0 rho1=np.zeros(200) theta1=np.zeros(200)
#KiếX m tra xem ma Xng lines có tôY n tại (không pha Xi None) hay không.NếS u ma Xng lines là None ( tức là không tôY n tại đường thẳX ng ), sẽ gưX i tín hiệu điếY u khiếX n xe dừng if lines is None: cv.putText(src, "STOP", (240,35),cv.FONT_HERSHEY_SIMPLEX,1 , (255,0,0), 2, cv.LINE_AA ) print('dung')
#GưX i tín hiệu điếY u khiếX n xe dừng ser.write(b'S') time.sleep(0.008)
#KiếX m tra xem ma Xng lines có tôY n tại (không pha Xi None) hay không.NếS u ma Xng lines không pha Xi None, sẽ khơ Xi tạo biếS n k với giá trị 0. if lines is not None: k=0;
#Tạo một vòng lặp đếX thực hiện một chuôc i lệnh cho môc i giá trị cu Xa i. for i in range(0, len(lines)): rho = lines[i][0][0] #truy cập rho theta = lines[i][0][1] #truy cập theta
# lọc bớt các đường thẳX ng gây nhiếc u , chỉ X lâS y các đường thẳX ng if (rho>0 and theta0) and (hangxl[Dem1]==0):
Dem220 while (Dem2