Theo nhận định của bản thân tác giả, với sự phát triển không ngừng của công nghiệp hóa, hiện đại hóa thì ứng dụng robot vào việc vận chuyển hàng hóa trong kho là một lĩnh vực hay và cần được nghiên cứu chuyên sâu hơn nữa. Vì thời gian và khả năng có hạn nên luận văn không tránh khỏi thiếu sót và còn nhiều vấn đề cần hoàn thiện thêm. Kính mong quý Thầy Cô và các anh chị học viên cũng như quý bạn đọc thông cảm. Mong rằng với những ai yêu thích và quan tâm đến hướng nghiên cứu này có thể chia sẻ với tác giả để cùng nhau tiếp tục tìm hiểu, phát triển thêm nâng cao tính ứng dụng thực tế cho đề tài
CHƯƠNG I: TỔNG QUAN ĐỀ TÀI NGHIÊN CỨU
Đặt vấn đề
Hiện nay, công nghiệp đang trải qua quá trình hiện đại hóa với sản lượng sản xuất gia tăng, dẫn đến sự phát triển nhanh chóng của các kho hàng Việc xuất nhập hàng hóa diễn ra liên tục, tuy nhiên, việc sử dụng xe nâng và băng chuyền đã không còn đủ để đáp ứng nhu cầu thực tế Do đó, cần tối ưu hóa tất cả các công đoạn trong dây chuyền sản xuất Để nâng cao năng suất lao động, việc nghiên cứu và chế tạo robot thay thế con người trong một số công việc sản xuất là cần thiết Sử dụng robot trong việc vận chuyển hàng hóa trong kho không chỉ đảm bảo sự thông suốt và nhanh chóng mà còn giảm thiểu rủi ro do yếu tố con người, với khả năng hoạt động 24/7 và tối ưu hóa thời gian vận chuyển.
Robot có khả năng gom hàng từ tất cả các vị trí đã được lập trình, giúp bao quát toàn bộ nhà xưởng mà công nhân khó có thể thực hiện trong không gian rộng lớn Chúng có thể vận chuyển khối lượng hàng hóa lớn, cho phép công nhân chỉ cần nhấn nút để điều khiển, trong khi các quy trình còn lại hoàn toàn tự động Việc sử dụng robot trong vận chuyển hàng hóa không chỉ giúp dễ dàng giám sát và quản lý mà còn nâng cao năng suất lao động, giảm thiểu số lượng công nhân làm việc nặng nhọc, từ đó mang lại lợi ích kinh tế cao cho doanh nghiệp.
Vì vậy, để đáp ứng nhu cầu mang tính thực tiễn cao này nên tôi đã chọn đề tài
“Điều khiển đồng bộ hệ thống robot thông minh vận chuyển hàng trong kho”.
Các công trình nghiên cứu liên quan
1.2.1 Robot Kiva tại công ty Amazon
Hiện nay, Robot Kiva đã được triển khai tại 10 kho hàng của Amazon ở California, Texas, New Jersey, Washington và Florida, cho phép công ty cung cấp hàng triệu sản phẩm mỗi ngày Amazon nhận được khoảng 36,8 triệu đơn đặt hàng toàn cầu, trung bình mỗi giây phải giao nhận 426 sản phẩm Việc áp dụng Robot trong quy trình giao nhận hàng giúp Amazon nâng cao hiệu suất công việc một cách đáng kể.
Hình 1.1 Robot Kiva tại kho hàng công ty Amazon 1.2.2 Robot (LGV) tại kho hàng nhà máy Vinamilk Việt Nam
Tại nhà máy sữa Vinamilk, các robot tự hành (LGV) quản lý toàn bộ quy trình từ nguyên liệu đóng gói đến sản phẩm hoàn thiện, giúp tối ưu hóa chất lượng và giảm thiểu chi phí.
Robot LGV là những chiếc xe tự động vận chuyển và nâng xếp hàng, được tích hợp thành một hệ thống hoạt động đồng bộ Chúng giúp nâng cao hiệu quả và năng suất vượt trội so với phương thức vận hành thủ công.
Hình 1.2 Robot (LGV) tại công ty sữa Vinamilk Việt Nam
Những bài báo và tài liệu liên quan tới đề tài
1.3.1 Những nghiên cứu ngoài nước
Nhiều nhóm nghiên cứu trên thế giới đã đạt được thành tựu đáng kể trong lĩnh vực điều khiển robot di động, trong đó robot tự hành là một thành phần quan trọng Nhóm tác giả gồm Tae-Il Kim, Wook Bahn, Changhun Lee, Tae-jae Lee, Muhammad Muneeb Shaikh và Kwang-soo Kim từ Hàn Quốc đã phát triển hệ thống tìm đường cho robot tự hành dựa trên công nghệ camera stereo Hệ thống này có khả năng định hướng liên tục tới mục tiêu trên hệ tọa độ, giúp robot tìm được lộ trình chính xác đến đích.
Hiện nay, trên thế giới có nhiều công ty chuyên sản xuất robot, trong đó phần lớn đến từ Mỹ như iRobot, Kuka Robotics và Ekso Bionics Theo Robotic Business Review, trong danh sách 50 công ty robot hàng đầu, Nhật Bản cũng có sự hiện diện với Honda Robotics và Panasonic, cùng với Foxconn Technology Group từ Đài Loan Đặc biệt, Honda dẫn đầu về số lượng robot với 499 SC, tiếp theo là Samsung với 177 SC và iRobot với 122 SC.
Những nghiên cứu trên chưa được áp dụng rộng rãi để đưa vào thực tế vì chi phí nghiên cứu giá thành thiết bị để sản xuất robot cao
1.3.2 Những nghiên cứu trong nước
Nghiên cứu robot di động tại TP HCM đã bắt đầu từ 15 năm trước, với Khoa Cơ khí, Trường Đại học Bách Khoa là một trong những đơn vị tiên phong trong lĩnh vực này Trường đã phát triển 4 nghiên cứu về robot di động phục vụ công nghệ hàn, bao gồm robot hàn di động hàn đứng, hàn trần và hàn đường thẳng, với khả năng di chuyển theo đường ray hoặc bám theo đường hàn Một dự án đã thành công trong việc sản xuất robot di động cho Xí nghiệp Đóng tàu Sài Gòn Ngoài ra, Đại học Bách Khoa TP HCM còn triển khai thiết kế robot giống người tại Phòng Thí nghiệm trọng điểm Vào năm 2011, hai trường đại học kỹ thuật hàng đầu tại TP HCM, Đại học Bách Khoa và Đại học Sư phạm Kỹ thuật, đã thực hiện các dự án về robot di động kiểm tra đường ống thoát nước và robot làm vệ sinh ống khói Một nghiên cứu cấp Nhà nước tại Khu Công nghệ Cao TP HCM do TS Dương Minh Tâm chủ trì cũng đã thiết kế robot để vận chuyển linh kiện từ kho đến vị trí lắp ráp.
Mục tiêu đề tài
Thiết kế và chế tạo ba robot vận chuyển hàng cùng với bộ trung tâm điều khiển, giám sát và xử lý dữ liệu không dây cho các robot này nhằm phục vụ việc vận chuyển hàng hóa trong mô hình kho hàng của công ty có vốn đầu tư nước ngoài.
Thiết kế bộ điều khiển cho 03 robot
+ Điều khiển robot bám đường tự động bằng bộ điều khiển PID [2-4]
+ Kết nối không dây với trung tâm điều khiển [10-11]
Thiết kế trung tâm điều khiển, giám sát, xử lý thu thập dữ liệu không dây
+ Xây dựng thuật toán điều khiển các robot dựa vào thuật toán Dijkstra [8-9], [12-13]
+ Thu thập dữ liệu không dây [10-11]
+ Thử nghiệm trên mô hình và đánh giá giải pháp.
Phạm vi nghiên cứu của đề tài
Nghiên cứu và thiết kế hệ thống điều khiển đồng bộ cho robot thông minh nhằm vận chuyển hàng hóa trong một kho hàng cụ thể Mục tiêu là tối ưu hóa quy trình logistics và nâng cao hiệu quả vận hành Hệ thống sẽ được triển khai với các công nghệ hiện đại, đảm bảo tính chính xác và an toàn trong quá trình vận chuyển.
Nghiên cứu phương thức hoạt động và xây dựng thuật toán tìm đường đi tối ưu cho robot
Chương trình điều khiển PID được phát triển nhằm điều khiển robot bám đường vạch, sử dụng cảm biến siêu âm để nhận diện và tránh vật cản Hệ thống cũng xác định vị trí robot trên đường, tối ưu hóa thời gian di chuyển và đảm bảo sự đồng bộ với trung tâm điều khiển.
Xây dựng thuật toán xác định hoạt động các robot, điều khiển đồng bộ các robot dựa trên thuật toán Dijkstra
Thiết kế 03 robot vận chuyển hàng giao tiếp không dây, trung tâm điều khiển.
Bố cục luận văn
Luận văn bao gồm 05 chương cụ thể như sau:
CHƯƠNG I: TỔNG QUAN ĐỀ TÀI NGHIÊN CỨU
1.1 Đặt vấn đề 1.2 Các công trình nghiên cứu liên quan 1.3 Những bài báo và tài liệu liên quan tới đề tài 1.4 Mục tiêu đề tài 1.5 Phạm vi nghiên cứu của đề tài 1.6 Bố cục luận văn CHƯƠNG II : CƠ SỞ LÝ THUYẾT ĐIỀU KHIỂN LIÊN QUAN
2.1 Phương pháp điều khiển PID 2.2 Bài toán tìm đường đi ngắn nhất CHƯƠNG III: MÔ HÌNH HÓA ĐIỀU KHIỂN HỆ THỐNG ROBOT
3.1 Mô hình hóa của bộ điều khiển PID 3.2 Mô hình hóa thuật toán điều khiển robot CHƯƠNG IV: ĐÁP ỨNG MÔ HÌNH THỰC
4.1 Thi công mô hình cơ khí 4.2 Tổng quan về thiết bị phần cứng 4.3 Kết quả kiểm nghiệm 4.4 Nhận xét chung CHƯƠNG V: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN ĐỀ TÀI
5.1 Kết luận 5.2 Hướng phát triển đề tài
CHƯƠNG II : CƠ SỞ LÝ THUYẾT ĐIỀU KHIỂN LIÊN QUAN
Phương pháp điều khiển PID
2.1.1 Giới thiệu bộ điều khiển PID
Bộ điều khiển PID là thiết bị điều khiển vòng kín phổ biến trong ngành công nghiệp, giúp điều chỉnh sai lệch giữa giá trị đo được (process variable) và giá trị đặt (setpoint) Bằng cách tính toán và điều chỉnh giá trị điều khiển tại ngõ ra, bộ điều khiển PID đảm bảo hệ thống hoạt động ổn định và hiệu quả.
Sơ đồ một hệ thống điều khiển dùng PID:
Hình 2.1 Sơ đồ hệ thống điều khiển dùng PID
Một bộ điều khiển PID gồm 3 thành phần:
P (proportional) tạo tín hiệu điều khiển tỉ lệ với sai lệch (error – e)
I (integral) tạo tín hiệu điều khiển tỉ lệ với tích phân theo thời gian của sai lệch
D (derivative) tạo tín hiệu điều khiển tỉ lệ với vi phân theo thời gian của sai lệch
Khâu tỉ lệ, hay còn gọi là độ lợi, ảnh hưởng đến giá trị đầu ra và tỉ lệ với giá trị sai số hiện tại Để điều chỉnh đáp ứng tỉ lệ, sai số được nhân với một hằng số Kp, được xác định là độ lợi tỉ lệ.
Khâu P được tính dựa trên công thức:
Với: Pout: giá trị ngõ ra
KP: hằng số tỉ lệ e: giá trị sai số (e = SP – PV) Hàm truyền:
Độ lợi của khâu tỉ lệ lớn (Gp(s) = Kp(2.2)) cho phép đầu ra thay đổi lớn với sai số nhỏ, nhưng nếu độ lợi quá cao, hệ thống sẽ trở nên không ổn định Ngược lại, độ lợi nhỏ dẫn đến đáp ứng đầu ra yếu trong khi sai số đầu vào lớn, làm cho bộ điều khiển trở nên kém nhạy và đáp ứng chậm Khi độ lợi của khâu tỉ lệ quá thấp, tác động điều khiển có thể không đủ mạnh để đối phó với nhiễu trong hệ thống.
Hình 2.2 Đồ thị PV theo thời gian, ba giá trị Kp (Ki và Kd là hằng số) 2.1.1.2 Khâu I
Khâu tích phân, hay còn gọi là reset, có phân phối tỉ lệ thuận với biên độ sai số và quảng thời gian xảy ra sai số Tổng sai số tức thời theo thời gian, hay còn gọi là tích phân sai số, giúp ta tích lũy bù đã được hiệu chỉnh Tích lũy sai số này sẽ được nhân với độ lợi tích phân và cộng với tín hiệu đầu ra của bộ điều khiển Biên độ phân phối của khâu tích phân trên tất cả các tác động điều chỉnh được xác định bởi độ lợi tích phân, Ki.
Khâu I được tính theo công thức:
Iout = Ki∫ e(t)dt 0 t (2.3) Với: Iout: giá trị ngõ ra khâu I
Ki: hệ số tích phân e: giá trị sai số (e = SP – PV) Hàm truyền:
Khâu I thường đi kèm với khâu P, hợp thành bộ điều khiển PI
Khâu tích phân, khi kết hợp với khâu tỉ lệ, giúp tăng tốc độ chuyển động của quá trình tới điểm đặt và giảm thiểu sai số ổn định phụ thuộc vào bộ điều khiển Tuy nhiên, do khâu tích phân phản ánh sai số tích lũy trong quá khứ, nó có thể dẫn đến hiện tượng giá trị hiện tại vượt quá giá trị đặt, gây ra độ lệch và ảnh hưởng đến hướng điều chỉnh Việc hiểu rõ các đặc điểm của điều chỉnh độ lợi tích phân và độ ổn định của bộ điều khiển là rất quan trọng.
Hình 2.3 Đồ thị PV theo thời gian, ứng với 3 giá trị K i (K p , K d không đổi) 2.1.1.3 Khâu D
Tốc độ thay đổi của sai số được tính bằng cách xác định độ dốc của sai số theo thời gian, tức là đạo hàm bậc một theo thời gian, và nhân với độ lợi tỉ lệ Kd Biên độ phân phối khâu vi phân, hay còn gọi là tốc độ, trên tất cả các hành vi điều khiển bị giới hạn bởi độ lợi vi phân Kd.
Khâu D được tính theo công thức:
Với: Dout: ngõ ra khâu D
Kd: hệ số vi phân e: giá trị sai số (e = SP – PV)
Khâu D thường đi kèm với khâu P thành bộ PD, hoặc với PI để thành bộ PID
Hình 2.4 Đồ thị PV theo thời gian, với 3 giá trị K d (K p , K i không đổi)
Khâu vi phân đóng vai trò quan trọng trong việc làm chậm tốc độ thay đổi của đầu ra bộ điều khiển, giúp đạt được điểm đặt mong muốn Nó được sử dụng để giảm biên độ vọt lố do thành phần tích phân gây ra và tăng cường độ ổn định cho bộ điều khiển hỗn hợp Tuy nhiên, việc vi phân tín hiệu có thể khuếch đại nhiễu, làm cho khâu này trở nên nhạy cảm với nhiễu trong sai số và có thể dẫn đến mất ổn định nếu nhiễu và độ lợi vi phân quá lớn Do đó, thường sử dụng một xấp xỉ của bộ vi sai với băng thông giới hạn, chẳng hạn như mạch bù sớm pha.
2.1.1.4 Tổng hợp ba khâu của Bộ điều khiển PID
Bộ điều khiển PID tính toán đầu ra u(t) bằng cách kết hợp các khâu tỉ lệ, tích phân và vi phân, với công thức: u(t) = Kp e(t) + Ki∫ e(t)dt + Kd de(t)/dt Độ lợi tỉ lệ Kp càng lớn thì đáp ứng càng nhanh nhưng có thể dẫn đến sai số lớn và mất ổn định Độ lợi tích phân Ki giúp khử sai số ổn định nhanh chóng, nhưng nếu quá cao, có thể gây ra độ vọt lố lớn khi tích phân sai số âm Độ lợi vi phân Kd giảm độ vọt lố nhưng có thể làm chậm đáp ứng và gây mất ổn định do khuếch đại nhiễu tín hiệu.
2.1.2 Rời rạc hóa bộ điều khiển PID
Bộ điều khiển số không thể lấy mẫu liên tục mà cần phải rời rạc ở một số mức nhất định Khi áp dụng hệ số lấy mẫu ngắn trong thời gian vi phân, có thể đạt được sai phân có giới hạn và tích phân thông qua việc lấy tổng Mỗi dạng sẽ được xem xét tại một thời điểm cụ thể, và sai số sẽ được tính toán tại mỗi khoảng lấy mẫu theo công thức: e(n) = X(n) – Y(n).
Bộ PID rời rạc thực hiện việc đọc sai số, tính toán và xuất ngõ ra điều khiển theo một khoảng thời gian xác định, gọi là thời gian lấy mẫu T Để đảm bảo hiệu quả hoạt động, thời gian lấy mẫu T cần phải nhỏ hơn đơn vị thời gian của hệ thống.
Bộ điều khiển PID khác biệt với các thuật toán điều khiển đơn giản nhờ khả năng xuất tín hiệu ngõ ra dựa trên giá trị sai số trước đó và tốc độ thay đổi của sai số Tính năng này giúp quá trình điều khiển trở nên chính xác và ổn định hơn.
Hàm truyền của hệ thống: u e(s) = H(s) = Kp(1 + 1
Tính gần đúng theo công thức:
Với n là bước rời rạc tại t
Bài toán tìm đường đi ngắn nhất
Trong lý thuyết đồ thị, bài toán đường đi ngắn nhất nguồn đơn nhằm tìm đường đi giữa hai đỉnh với tổng trọng số các cạnh nhỏ nhất Cụ thể, cho một đồ thị có trọng số bao gồm tập đỉnh V, tập cạnh E và hàm trọng số f: E → R, bài toán yêu cầu xác định một đỉnh v trong V và tìm đường đi P từ v đến mỗi đỉnh v' trong V sao cho tổng trọng số ∑ 𝑝∈𝑃 𝑓(𝑝) là nhỏ nhất.
Thuật toán tìm đường đi ngắn nhất giữa mọi cặp đỉnh là một bài toán quan trọng, nhằm xác định các lộ trình ngắn nhất cho tất cả các cặp đỉnh v và v' trong đồ thị.
Các thuật toán quan trọng nhất giải quyết bài toán này là:
Thuật toán Dijkstra là một phương pháp hiệu quả để giải quyết bài toán nguồn đơn trong đồ thị có trọng số không âm Nó cho phép tính toán tất cả các đường đi ngắn nhất từ một đỉnh xuất phát đã cho đến mọi đỉnh khác mà không làm tăng thời gian thực hiện.
- Thuật toán Bellman-Ford: giải bài toán nguồn đơn trong trường hợp trọng số có thể có giá trị âm
- Thuật toán tìm kiếm A*: giải bài toán nguồn đơn sử dụng heuristics để tăng tốc độ tìm kiếm
- Thuật toán Floyd-Warshall: giải bài toán đường đi ngắn nhất cho mọi cặp đỉnh
- Thuật toán Johnson: giải bài toán đường đi ngắn nhất cho mọi cặp đỉnh, có thể nhanh hơn thuật toán Floyd-Warshall trên các đồ thị thưa
2.2.1 Các khái niệm về đồ thị
Trong phần này, chúng ta sẽ xem xét đồ thị có hướng G=(V,E) với |V|=n và |E|=m, trong đó các cung được gán trọng số Mỗi cung (u,v)∈E được gán một trọng số a(u,v) là một số thực, và nếu (u,v) không thuộc E, chúng ta sẽ đặt a(u,v)=∞ Độ dài của một đường đi trong G, được biểu diễn bởi dãy v0, v1, , vp, được định nghĩa là tổng các trọng số của các cung trong đường đi đó.
Độ dài của đường đi được xác định bằng tổng các trọng số trên các cung của nó Nếu tất cả các trọng số của các cung đều được gán bằng 1, thì độ dài đường đi sẽ được tính bằng số lượng cung trong đường đi đó.
Bài toán tìm đường đi ngắn nhất trên đồ thị dưới dạng tổng quát có thể được phát biểu dưới dạng tổng quát như sau :
Tìm đường đi ngắn nhất từ đỉnh xuất phát s đến đỉnh đích t trong đồ thị V được định nghĩa là khoảng cách d(s,t) Nếu không tồn tại đường đi, d(s,t) sẽ bằng ∞ Đường đi ngắn nhất không có đỉnh nào lặp lại, gọi là đường đi cơ bản, trong khi chu trình có độ dài dương không ảnh hưởng đến tính chất này Ngược lại, chu trình âm có thể dẫn đến khoảng cách không xác định giữa các cặp đỉnh, vì việc đi vòng qua chu trình có thể tạo ra đường đi với độ dài nhỏ hơn bất kỳ số thực nào Trong trường hợp này, việc tìm đường đi cơ bản ngắn nhất trở nên phức tạp hơn, liên quan đến bài toán tồn tại đường đi Hamilton trong đồ thị.
Để tìm đường đi ngắn nhất từ đỉnh s đến đỉnh t trong đồ thị có trọng số không âm, cần lưu ý rằng nếu biết khoảng cách giữa s và t, có thể xác định dễ dàng Đối với mỗi cặp đỉnh s, t ∈ V (với s ≠ t), luôn tồn tại một đỉnh v sao cho d(s, t) = d(s, v) + a(v, t).
Đỉnh v là đỉnh đi trước đỉnh t trong đường đi ngắn nhất từ s đến t Ta có thể tìm đỉnh u sao cho d(s,v) = d(s,u) + a(u,v) Từ giả thiết về tính không âm của các trọng số, dễ dàng suy ra rằng dãy t, v, u không chứa đỉnh lặp lại và kết thúc tại đỉnh s Dãy thu được xác định đường đi ngắn nhất từ s đến t.
2.2.2 Đường đi ngắn nhất xuất phát từ một đỉnh
Hầu hết các thuật toán tìm khoảng cách giữa hai đỉnh s và t được phát triển dựa trên kỹ thuật tính toán từ ma trận trọng số a(u,v), với u,v∈V Từ đó, ta xác định cận trên d(v) cho khoảng cách từ s đến tất cả các đỉnh v∈V Mỗi khi phát hiện rằng d(u)+a(u,v)=n tuc la duyet het cac dinh ma khong the tim thay dinh b -> thoat if (i >= n) { printf("done dijkstra\n"); return 0;
} for (int j = 0; j < n; j++) { // tim diem co vi tri ma do dai la min if (!S[j] && Len[i] > Len[j]) i = j;
S[i] = 1; // cho i vao danh sach xet roi for (int j = 0; j < n; j++) { // tinh lai do dai cua cac diem chua xet if (!S[j] && Len[i] + G[i][j] < Len[j]) {
Len[j] = Len[i] + G[i][j]; // thay doi len
P[j] = i; // danh dau diem truoc no
} printf("done dijkstra\n"); return Len[b];
3.2.2 Chương trình bộ trung tâm điều khiển robot
3.2.2.1 Mô hình kho hàng cần áp dụng hệ thống robot vận chuyển hàng
Chương trình này áp dụng vào mô hình kho hàng công ty vinasai có vốn đầu tư nước ngoài tại Bình Dương
Hình 3.8 Kho hàng công ty Vinasai tại Bình Dương
Từ sơ đồ kho hàng Vinasai ta thiết kế sơ đồ đường vạch di chuyển của robot và các trạm giao nhận hàng
Hình 3.9 Sơ đồ vạch đường đi của Robot trong kho
Dựa vào hình 3.9 ta thiết lập được ma trận bản đồ kho hàng như sau:
Trung tâm điều khiển nhận lệnh từ các trạm giao nhận hàng và tính toán để xác định robot nào đang rảnh rỗi và có lộ trình tối ưu nhất đến vị trí trạm Sau đó, trung tâm sẽ gửi lệnh điều hướng tới robot để nó di chuyển đến trạm giao nhận đó.
Trung tâm sẽ tối ưu hóa lộ trình của robot dựa trên hai yếu tố chính: rút ngắn độ dài quãng đường di chuyển và giảm thiểu số lần quẹo của robot.
Người lao động tại các trạm chỉ cần nhấn nút để thực hiện lệnh điều động xe và chọn trạm đích cho việc vận chuyển hàng hóa Sau đó, trung tâm sẽ điều phối robot thực hiện nhiệm vụ theo yêu cầu với lộ trình tối ưu nhất.
3.2.2.2 Code chương trình viết bằng ngôn ngữ C
#include "System.h" void timduong(void);
{ 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0 }, { 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 }, { 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0 }, { 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0 }, { 8, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 }, { 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0 }, { 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 4 }, { 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0 }, { 7, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 }, { 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0 }, { 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0 }, { 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0 }, { 0, 0, 6, 0, 0, 0, 0, 0, 5, 0, 0 } }; int dau[2] = { 8, 0 }; int cuoi[2] = { 0, 4 }; int nho[2] = { 4, 0 }; int buoc = 0;
//int b = 1; void chonhuon1(void); void chonduongdi(void);
The code initializes several integer arrays and variables, including lengths and scores, with specific values assigned to variables such as 'a', 'b', and 'sum' It also sets up a 7x7 board with predefined values, indicating potential game or algorithmic elements The variables 'D', 'cogoc', and 'biengoc' are initialized to zero, suggesting they may be used for tracking or calculations later in the program Additionally, the variable 'kq' is set to 99, possibly representing a default or maximum score, while 'kqvt' and 'solanqueo' arrays are prepared for future data storage Overall, this setup appears to lay the groundwork for a computational process or game logic.
Bài viết này trình bày một đoạn mã lập trình với các biến và hàm liên quan đến việc xác định hướng đi và vị trí trong một ma trận Các biến như `huong`, `chieu`, và `goc` được sử dụng để điều khiển hướng di chuyển, trong khi các mảng như `diem` và `kqvt` lưu trữ thông tin về vị trí và kết quả Các hàm `timvitri`, `timhuong`, và `dieuhuong` có nhiệm vụ tìm kiếm vị trí, xác định hướng, và điều chỉnh hướng đi Cuối cùng, hàm `chuongtrinhchay` thực hiện chương trình chính, cho phép người dùng tương tác với mã.
//48clk/r void timsogoc (void){ for (k = tongdiem;k >= 0 ;k ){
} //UARTprintf("\n tong diem di = %d",tongdiem );
Điều chỉnh hướng đi cho robot
Khi robot đi từ điểm A tới điểm B rồi tới điểm C Lúc đang ở điểm B thì hàm dieuhuong() sẽ tính hướng đi tới điểm C tiếp theo
Hàm này sẽ so sánh hướng đang di chuyển từ điểm A ->B với chiều từ B -> C để đưa ra hướng đi từ B ->C void dieuhuong(void){ switch (huong) { case 1: if (chieu == 1) {
// UARTprintf("\n bien = %d di phai 1 \n ",diem[n] ); solanqueo[h] ++; huong = 3; cogoc = 1; break;
// UARTprintf("\n bien = %d ditrai 1\n ",diem[n] ); huong = 4; cogoc = 1; break;
// UARTprintf("\n bien = %d ditrai 2\n ",diem[n] ); huong = 4; cogoc = 1; break;
// UARTprintf("\n bien = %d di phai 2\n ",diem[n] ); huong = 4; cogoc = 1; break;
// UARTprintf("\n bien = %d ditrai 3\n ",diem[n] ); huong = 1; cogoc = 1; break;
// UARTprintf("\n bien = %d di phai 3\n ",diem[n] ); huong = 2; cogoc = 1; break;
// UARTprintf("\n bien = %d di trai 4\n ",diem[n] ); solanqueo[h] ++; huong = 1; cogoc = 1; break;
// UARTprintf("\n bien = %d diphai 4 \n ",diem[n] ); solanqueo[h] ++; huong = 2; cogoc = 1; break;
Tìm chiều đi của robot từ điểm A(x,y) tới điểm liền kề B(xs, ys):
Bước 1: Nhập điểm đi A (điểm đi) ,B (điểm đến)
Bước 2: Tìm tọa độ x, y của điểm A; xs, ys là tọa độ điểm B
Bước 3: So sánh tọa độ của hai điểm A và B để xác định chiều đi của robot từ A ->B
Nếu ys-y = 0 và xs-x = 1, thì hướng là 1 (cùng chiều trục hoành trên trục tọa độ Oxy) Nếu ys-y = 0 và xs-x = -1, thì hướng là 2 (ngược chiều trục hoành trên trục tọa độ Oxy) Nếu xs-x = 0 và ys-y = 1, thì hướng là 3 (cùng chiều trục tung trên trục tọa độ Oxy) Nếu xs-x = 0 và ys-y = -1, thì hướng là 4 (ngược chiều trục tung trên trục tọa độ Oxy) Hàm timhuong sẽ xác định vị trí của điểm hiện tại và điểm trước đó, sau đó kiểm tra các điều kiện để xác định hướng di chuyển.
Tìm vị tọa độ đỉnh A(bienx,bieny) trong đồ thị theo trục tọa độ Oxy
Bước 2: Tra trong ma trận bản đồ ( bando[i][j] ) ta được tọa độ điểm A(bienx,bieny) void timvitri (int P){ for(i = 6;i>=0;i ){ for(j = 0;j= 0 ;en )
UARTprintf( "Length of %d to %d is %d\n", a ,b , Len[b]);
UARTprintf("\n so lan queo = %d \n ",kq );
UARTprintf("nhung diem can di " ); for(en = sodiemkq; en >= 0 ;en )
//***********************************************// Vector Timer 0 void Timer0IntHandler(void) {
ROM_TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); }
// Vector Timer 1 void Timer1IntHandler(void) {
ROM_TimerIntClear(TIMER1_BASE, TIMER_TIMA_TIMEOUT); }
// Vector Timer 2 void Timer2IntHandler(void) {
ROM_TimerIntClear(TIMER2_BASE, TIMER_TIMA_TIMEOUT); } void Timer3IntHandler(void) {
ROM_TimerIntClear(TIMER3_BASE, TIMER_TIMA_TIMEOUT); } void Timer4IntHandler(void) {
ROM_TimerIntClear(TIMER4_BASE, TIMER_TIMA_TIMEOUT); } void Timer5IntHandler(void) {
ROM_TimerIntClear(TIMER5_BASE, TIMER_TIMA_TIMEOUT); } void SysTickIntHandler(void) {
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2,
~GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_2)); }
// Vector UART1 void UART1IntHandler(void) {
UARTprintf(" %c\n", UARTCharGet(UART1_BASE)); if (UARTCharGet(UART1_BASE) == 117) {
UARTIntClear(UART1_BASE, UART_INT_RX);
// Vector PORT F void PortFIntHandler(void) { uint32_t PortFmask = GPIOIntStatus(GPIO_PORTF_BASE,
SysCtlDelay(SysCtlClockGet() / 1000); if (PortFmask & GPIO_PIN_0) {
SysCtlDelay(SysCtlClockGet() / 1000); if (GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_0) == 0) {
GPIOIntClear(GPIO_PORTF_BASE, GPIO_PIN_0);
SysCtlDelay(SysCtlClockGet() / 1000); if (GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_4) == 0) { for (k = 0;k thoat if (i >= 28) { SysCtlDelay(SysCtlClockGet() / 100000);
UARTprintf("\n Ko co duong di!");
} for (j = 0; j < 28; j++) { // tim diem co vi tri ma do dai la min if (!S[j] && Len[i] > Len[j]) { i = j;
} } S[i] = 1; // cho i vao danh sach xet roi for ( j = 0; j < 28; j++) { // tinh lai do dai cua cac diem chua xet if (!S[j] && Len[i] + matrit[i][j] < Len[j]) {
Len[j] = Len[i] + matrit[i][j]; // thay doi len P[j] = i; // danh dau diem truoc no matrit[i][j] = 2;
} } } if (Len[b] > 0 && Len[b] < sum) { int j = 0; diem[j] = b; j ++; while (i!= a) {
} void SendATCommand(char *cmd) { while (UARTBusy(UART1_BASE)); while (*cmd != '\0') {
// chuong trinh tim duong di if (dau[0] < cuoi[0]) { if (mang[dau[0] + 1][dau[1]] == 1) { buoc = buoc + 1; nho[0] = dau[0] + 1; nho[1] = dau[1];
UARTprintf(" thang %d ", mang[nho[0]][nho[1]]);
} else { if (mang[dau[0]][dau[1] + 1] == 1) { buoc = buoc + 1; nho[0] = dau[0]; nho[1] = dau[1] + 1;
UARTprintf(" phai %d ", mang[nho[0]][nho[1]]);
} void chonduongdi(void) { if (nho[0] < cuoi[0]) { a = 1;
} if (nho[0] != cuoi[0]) { if (mang[nho[0] + 1*a][nho[1]] == 1) { buoc = buoc + 1; nho[0] = nho[0] + 1 * a; nho[1] = nho[1];
UARTprintf(" thang %d \n ", mang[nho[0]][nho[1]]);
} else { if (mang[nho[0]][nho[1] + 1*b] == 1) { buoc = buoc + 1; nho[0] = nho[0]; nho[1] = nho[1] + 1 * b;
} else { if (nho[1] != cuoi[1]) { if (mang[nho[0]][nho[1] + 1*b] == 1) { buoc = buoc + 1; nho[0] = nho[0]; nho[1] = nho[1] + 1 * b;
* System Function Details void chieuhuongbatdau (void){ if(a == 0 || a == 1) { chieu = 1; huong = 1 ; } if(a == 2 || a ==3) { chieu = 1; huong = 4 ; } if(a == 4 || a == 5) { chieu = 1; huong = 2 ; } if(a == 6 || a ==7) { chieu = 1; huong = 3 ; }
3.2.2.3 Kiểm nghiệm kết quả chạy chương trình
Chương trình điều khiển đã cho kết quả đáp ứng yêu cầu đặt ra là đường đi ngắn nhất và số lần quẹo góc của robot là ít nhất
Ví dụ: Kết quả tính ra đường đi từ trạm 6 tới trạm 1
Số lần quẹo góc: 1 Đường đi của robot qua các điểm: 6 – 20 – 21 – 22 – 23 – 19 – 15 – 11 – 1
Hình 3.10 Hiển thị kết quả đường đi tối ưu nhất từ trạm 6 tới trạm 1
Ví dụ: Kết quả tính ra đường đi từ trạm 1 tới trạm 5
Số lần quẹo góc: 2 Đường đi qua các điểm: 1 – 11 – 10 – 9 – 8 – 12 – 16 – 20 – 24 - 5
Hình 3.11 Hiển thị kết quả đường đi ngắn nhất từ trạm 1 tới trạm 5
4 CHƯƠNG IV: ĐÁP ỨNG MÔ HÌNH THỰC ĐIỀU KHIỂN ĐỒNG BỘ HỆ THỐNG ROBOT THÔNG MINH.
Sơ đồ khối mô hình cơ khí cần thi công
Mô hình bao gồm một bộ điều khiển trung tâm kết nối wifi với ba robot di chuyển theo đường vạch Đầu tiên, tôi thiết kế một robot và sau khi kiểm tra các tính năng cơ bản, tôi tiến hành nhân bản thành ba robot.
Hình 4.1 Sơ đồ khối của hệ thống
Hình 4.2 Sơ đồ khối của robot
Mô hình hệ thống gồm: 03 robot kết nối không dây truyền nhận dữ liệu bằng wifi với trung tâm điều khiển
Hình 4.3 Sơ đồ hệ thống điều khiển
Tổng quan về thiết bị phần cứng
Hình 4.4 Động cơ điều khiển
Vòng xoay Robot điều khiển là lựa chọn lý tưởng cho thị trường DIY, cho phép điều khiển đồng bộ các phụ kiện như bánh xe giảm tốc, thiết bị giảm tốc hành tinh, encoder và lốp xe Sản phẩm hoạt động với điện áp định mức DC 12V, mang lại hiệu suất ổn định và đáng tin cậy cho các dự án tự chế.
Tốc độ không tải: 80rpm / phút Điện áp: DC 5V đến 15V (5 v 33 RPM / phút, 10 v 66 r / min, 15 v 100 r / min)
Lưu ý: động cơ này chỉ có mặt tín hiệu!
Tính năng của vi điều khiển:
Bảng 4-1: Thông số kỹ thuật của vi điều khiển
80MHz 256KB Flash 32KB RAM 2-KB EEPROM On-chip ROM with drivers and boot loaders 2x 12ch 12-bit ADCs (1 MSPS) 16x Motion PWM channels 24x Timer/Capture/Compare/PWMs
3x Analog comparators 4x SPI/SSI, 4x I2C, 8x UART USB Host/Device/OTG
2x CAN Low-power hibernation mode 43x GPIO pins Các cảm biến
Sử dụng cảm biến dò vạch loại leb quang tự chế
Hình 4.6 Cảm biến dò đường vạch 4.2.3.2 Cảm biến siêu âm SRF05
Hình 4.7 Cảm biến siêu âm SRF05
Bảng 4-2: Thông số kỹ thuật của cảm biến SRF05 Điện áp hoạt động 5VDC
Phát hiện vật cản trong khoảng 2cm - 300cm
Kích thước 43mm x 20mm x 17mm
Hình 4.8: Pin nguồn 4.2.4.3 Mạch ổn áp nguồn LM2596S
Hình 4.9: Mạch ổn áp nguồn LM2596S
Mạch ổn áp LM2596S là mạch nguồn giảm áp sử dụng IC ổn áp LM2596S Áp ra có thể điều chỉnh được bằng biến trở
IC LM2596S là ic nguồn xung có chu kì đóng/ngắt lên đến 125KHz cho hiệu suất làm việc cao
Mạch ổn áp có một số ưu điểm:
+ Dòng ra đỉnh 3A (có thể gắn tản nhiệt cho IC để tăng dòng đầu ra cực đại) + Áp đầu vào dao động từ 3V - 40V
Mạch ổn áp có nhiệm vụ tạo ra điện áp thấp hơn so với điện áp đầu vào và duy trì mức điện áp ổn định này, bất chấp sự thay đổi của điện áp đầu vào Ví dụ, nó có thể cung cấp điện áp 5V trong khi điện áp đầu vào có thể cao hoặc thấp hơn mức này.
1 ắc quy có điện áp từ 10.8V -> 13V
Module ổn áp LM2596S được trang bị các tụ điện với khả năng lọc nhiễu hiệu quả và khả năng lưu trữ điện năng tốt Bên cạnh đó, module còn tích hợp đèn LED để báo hiệu trạng thái hoạt động của mạch nguồn.
Trên module có sẵn lỗ để bạn hàn dây:
+ Nguồn vào IN+ và IN-
+ Nguồn ra OUT+ và OUT-
4.2.5 Sơ đồ đường vạch trong kho
Hình 4.10 Sơ đồ đường vạch trong kho hàng
Mô hình thực tế sau khi thiết kế thành công
Hình 4.11 Mặt dưới của robot thực tế
Hình 4.12 Mặt trên của Robot thực tế
Hình 4.13 Bộ điều khiển trung tâm
Hình 4.14 Robot và sơ đồ kho
Nhận xét
Mô hình thực tế đáp ứng được yêu cầu theo mục tiêu đặt ra của đề tài
+ Bộ điều khiển PID điều khiển robot bám sát đường vạch, robot di tự động chuyển ổn định, vận tốc đều, ít bị đánh võng dích dắc, cà giật
+ Kết nối truyền nhận dữ liệu không dây (wifi) với trung tâm ổn định, tốc độ truyền nhận nhanh
+ Kết nối truyền nhận dữ liệu không dây (wifi) với các robot ổn định, tốc độ truyền nhận dữ liệu nhanh
+ Thuật toán Dijkstra đã lựa chọn ra đường đi tối ưu về thời gian và quãng đường
+ Giám sát và điều khiển các robot di chuyển không bị kẹt đường
+ Phát hiện vật cản và đưa ra các giải pháp xử lý lựa chọn đường thay thế tốt
5 CHƯƠNG V: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN ĐỀ TÀI
Kết luận
Luận văn đã giải quyết được nội dung nêu trong đề cương, cụ thể là vấn đề sau đây:
Xây dựng thành công mô hình hệ thống điều khiển 03 robot để vận chuyển hàng trong kho
Dựa trên lý thuyết điều khiển PID, chúng tôi đã phát triển thành công bộ điều khiển cho robot dò đường vạch, và kết quả được kiểm nghiệm trên mô hình thực tế cho thấy hoạt động hiệu quả.
Dựa trên lý thuyết của thuật toán Dijkstra tìm đường đi ngắn nhất, chúng tôi đã phát triển một thuật toán điều khiển robot được lập trình bằng ngôn ngữ C Thuật toán này đã được tích hợp vào vi điều khiển và thành công trong việc giải quyết các vấn đề đã đặt ra.
Ứng dụng công nghệ thông tin vào quá trình điều khiển tự động.
Hướng phát triển đề tài
Do thời gian và kiến thức có hạn, luận văn chỉ tập trung giải quyết các vấn đề đã nêu trong phần kết luận Đề tài này có thể được phát triển thêm theo nhiều hướng khác nhau để áp dụng vào thực tế.
Xây dựng thêm bộ điều khiển để khi sắp hết nguồn điện thì robot tự động tìm nguồn điện và xác bình
Việc thiết kế thêm cánh tay robot cho mỗi xe robot hiện tại, kết hợp với camera quan sát, sẽ giúp phân loại hàng hóa và tự động đặt chúng vào vị trí mong muốn trong kho, từ đó nâng cao năng suất công việc đáng kể.
Thay thế bộ điều khiển PID bằng những bộ điều khiển cao cấp hơn như Fuzzy, Neural, điều khiển bầy đàn