Tôi đã làm việc trên một dự án gần đây và đó là dự án đầu tiên có liên quan đủ để làm cho mạng cảm biến trở nên phức tạp. Cuối cùng, tôi nghĩ rằng giao tiếp là nút thắt về hiệu suất tổng thể và tôi tự hỏi làm thế nào nhiều người có kinh nghiệm hơn sẽ giải quyết vấn đề này. Đây là một bài đọc dài, nhưng tôi nghĩ nó khá thú vị vì vậy hãy gắn bó với nó. Vấn đề là thiết kế một cái nhìn tự động có khả năng điều hướng một chướng ngại vật và thả những quả bóng bàn vào các mục tiêu hộp màu nâu. Đây là:
Cảm biến
- Mô-đun camera uCAM-TTL của Hệ thống 4D - Giao diện UART
- La bàn kỹ thuật số HMC6352 - Giao diện I2C
- Maxbotix Sonar ez4 - Giao diện tương tự 1 pin
Thiết bị truyền động
- Trình điều khiển động cơ 2x L293D (kết nối với động cơ sở thích đơn giản) - Chúng được sử dụng để lái 6 động cơ hai chiều. Họ yêu cầu đầu vào PWM để thay đổi tốc độ. Bây giờ 3 động cơ của chúng tôi luôn làm điều tương tự (những động cơ điều khiển chuyển động lên / xuống) vì vậy chúng chỉ yêu cầu 2 đầu ra PWM từ bộ điều khiển của chúng tôi để điều khiển cả 3 động cơ. Cả 3 động cơ khác điều khiển chuyển động bên đều cần điều khiển riêng (đối với chuyển động đa hướng), do đó, cần có 6 đầu ra PWM khác từ các bộ điều khiển của chúng tôi.
- Động cơ servo - Giao diện PWM
Bộ điều khiển
Vì những lý do sẽ trở nên rõ ràng sau đó, chúng tôi đã kết thúc bằng cách sử dụng 2x ATmega328Ps. Chúng tôi đã sử dụng Arduino Uno để lập trình cho chúng (chúng tôi không có quyền truy cập vào ISP) nhưng chúng tôi đã sử dụng PCB tùy chỉnh nên chúng tôi không phải sử dụng bảng arduino vì điều đó sẽ tăng thêm trọng lượng không cần thiết cho tầm nhìn của chúng tôi. Về lý do tại sao chúng tôi chọn ATmega328P, tôi rất quen thuộc với môi trường arduino và tôi nghĩ rằng điều đó làm cho việc phát triển mã nhanh hơn và dễ dàng hơn nhiều.
Truyền thông & Xử lý
- Cơ bản gấp đôi Xbee
- 2 lần ATmega328P
- Máy tính để bàn chạy C ++ w / openCV
Vì vậy, như bạn có thể nói từ mô-đun máy ảnh, hầu hết dự án của chúng tôi dựa vào tầm nhìn máy tính. Các đốm sáng chỉ có thể mang rất nhiều trọng lượng và chúng tôi không cảm thấy thoải mái khi thực hiện thị giác máy tính trên một vi điều khiển. Vì vậy, những gì chúng tôi đã làm là sử dụng XBee để chuyển dữ liệu hình ảnh trở lại máy tính để bàn. Vì vậy, về phía máy chủ, chúng tôi đã nhận được dữ liệu hình ảnh và sử dụng openCV để xử lý hình ảnh và tìm ra thứ gì đó từ nó. Bây giờ phía máy chủ cũng cần biết thông tin chiều cao (từ sonar) và thông tin la bàn.
Nếp nhăn đầu tiên là chúng tôi không thể điều khiển máy ảnh bằng vi điều khiển vì một vài lý do. Vấn đề chính là bộ nhớ trong trên uP không thể xử lý lưu trữ toàn bộ khung. Có thể có nhiều cách xoay quanh vấn đề này thông qua mã hóa thông minh nhưng vì mục đích của câu hỏi này, hãy giả vờ là không thể. Vì vậy, để giải quyết vấn đề này, chúng tôi đã yêu cầu phía máy chủ gửi các lệnh camera qua bộ thu phát XBee và bộ thu XBee (trên boong tàu) có đầu ra được nối với đầu vào của camera.
Nếp nhăn tiếp theo là không có đủ số lượng PWM trên một ATmega328P để điều khiển tất cả các động cơ TRỞ THÀNH giao diện I2C sử dụng một trong các chân PWM (chết tiệt ...). Đó là lý do tại sao chúng tôi quyết định sử dụng cái thứ 2. Mã thực sự cho vay hoàn toàn để xử lý song song bởi vì điều khiển độ cao hoàn toàn độc lập với điều khiển chuyển động bên (vì vậy 2 micros có lẽ tốt hơn so với một gắn với bộ điều khiển PWM). Do đó, U1 chịu trách nhiệm cho 2 đầu ra PWM (lên / xuống) và đọc Sonar. U2 chịu trách nhiệm đọc la bàn, điều khiển 6 đầu ra PWM (động cơ bên) và cũng đọc Sonar. U2 cũng chịu trách nhiệm nhận lệnh từ máy chủ thông qua XBee.
Điều đó dẫn đến vấn đề giao tiếp đầu tiên của chúng tôi. Dòng XBee DOUT được kết nối với cả vi điều khiển và máy ảnh. Bây giờ tất nhiên chúng tôi đã thiết kế một giao thức để các lệnh micro của chúng tôi sẽ bỏ qua các lệnh camera và các lệnh camera sẽ bỏ qua các lệnh micro để điều đó ổn. Tuy nhiên, máy ảnh, khi bỏ qua các lệnh vi mô của chúng tôi, sẽ gửi lại dữ liệu NAK trên dòng đầu ra của nó. Vì lệnh này dành cho micro, chúng tôi cần một ngày nào đó để tắt đầu ra camera cho XBee. Để giải quyết vấn đề này, chúng tôi đã tạo ra 2 FET điều khiển vi mô nằm giữa máy ảnh và XBee (đó là FET đầu tiên) và giữa U2 và XBee (đó là FET thứ hai). Do đó, khi máy ảnh đang cố gửi thông tin trở lại máy chủ, FET đầu tiên đã 'bật' và FET thứ hai bị 'tắt'.
Vì vậy, để cung cấp cho bạn một ý tưởng về cách làm việc này ở đây là một vài ví dụ:
- Máy chủ yêu cầu một hình ảnh - PIC_REQUEST đi qua XBee và đến U2 và máy ảnh. U2 bỏ qua nó và máy ảnh sẽ gửi lại dữ liệu hình ảnh.
- Máy chủ vừa xử lý xong một bức ảnh và đang gửi dữ liệu động cơ để báo trước để rẽ phải - XE_ANGLE (70) đi qua XBee và đến U2 và máy ảnh. U2 nhận ra đó là một lệnh vi mô và do đó tắt FET của Camera (nhưng có lẽ máy ảnh đã phản hồi bằng NAK ?? ai biết ...). U2 sau đó đáp ứng lệnh bằng cách thay đổi đầu ra PWM của động cơ. Sau đó, nó bật lại FET của Camera (đây là cài đặt mặc định vì dữ liệu hình ảnh là quan trọng nhất).
- Máy chủ nhận ra rằng chúng ta đã đi đến một điểm trong khóa học vượt chướng ngại vật nơi chiều cao di chuột mặc định của chúng ta bây giờ cần phải là 90 inch thay vì 50 inch. SET_HEIGHT đi qua XBee và điều tương tự xảy ra như trong ví dụ 2. U2 nhận ra lệnh SET_HEIGHT và kích hoạt ngắt trên U1. Bây giờ U1 ra khỏi vòng điều khiển chiều cao của nó và chờ nhận dữ liệu nối tiếp từ U2. Đúng vậy, nhiều dữ liệu nối tiếp hơn. Tại thời điểm này, FET của U2 được bật (và FET của máy ảnh tắt) để máy chủ nhận được độ cao mà U2 cũng đang gửi tới U1. Đó là cho mục đích xác minh. Bây giờ U1 đặt lại biến nội bộ của nó cho height2HoverAt. Bây giờ U2 tắt FET và bật lại FET của máy ảnh.
Tôi chắc chắn đã bỏ qua một lượng thông tin tốt nhưng tôi nghĩ rằng đủ để hiểu một số biến chứng. Cuối cùng, vấn đề của chúng tôi chỉ là đồng bộ hóa mọi thứ. Đôi khi sẽ có dữ liệu còn sót lại trong bộ đệm, nhưng chỉ có 3 byte (tất cả các lệnh của chúng tôi là chuỗi 6 byte). Đôi khi chúng tôi sẽ mất kết nối với máy ảnh của mình và phải đồng bộ lại nó.
Vì vậy, câu hỏi của tôi là: Các bạn muốn đề xuất những kỹ thuật nào để làm cho giao tiếp giữa tất cả các thành phần đó trở nên đáng tin cậy / mạnh mẽ / đơn giản / tốt hơn?
Ví dụ, tôi biết người ta sẽ thêm một mạch trễ giữa XBee trên bo mạch và máy ảnh để micro có cơ hội tắt dòng đàm thoại của máy ảnh trước khi nó phản ứng với các lệnh micro bằng NAK. Còn ý tưởng nào khác như thế không?
Cảm ơn và tôi chắc chắn rằng điều này sẽ yêu cầu nhiều chỉnh sửa vì vậy hãy theo dõi.
Chỉnh sửa1:Việc nối dữ liệu UART của máy ảnh thông qua một trong các micrô dường như không thể đối với chúng tôi. Có hai tùy chọn cho dữ liệu camera, bản đồ bit thô hoặc JPEG. Đối với một bitmap thô, máy ảnh chỉ gửi dữ liệu về bạn nhanh nhất có thể. ATmega328P chỉ có 128 byte cho bộ đệm nối tiếp (về mặt kỹ thuật, đây là cấu hình nhưng tôi không chắc bằng cách nào) và chúng tôi không nghĩ rằng mình có thể lấy nó ra khỏi bộ đệm và thông qua XBee đủ nhanh. Điều đó đã để lại phương thức JPEG nơi nó gửi từng gói và chờ bộ điều khiển ACK nó (protocl bắt tay nhỏ). Tốc độ nhanh nhất có thể đạt được là 115200 baud. Bây giờ vì một số lý do, tốc độ nhanh nhất mà chúng tôi có thể truyền một lượng lớn dữ liệu qua XBee là 57600 baud (điều này thậm chí sau khi chúng tôi đã ghép nối nút / mạng để cho phép khả năng tự động gửi lại). Thêm điểm dừng bổ sung trong mạng của chúng tôi (máy ảnh thành micro vào XBee, trái ngược với máy ảnh chỉ XBee) cho micro chỉ đơn giản là làm chậm thời gian cần thiết để truyền hình ảnh quá nhiều. Chúng tôi cần một tốc độ làm mới nhất định trên hình ảnh để thuật toán điều khiển động cơ của chúng tôi hoạt động.