L ỜI CẢM ƠN
3.3.1 Van đảo chiều 5/2 điều khiển bằng điện
Trong Autorobot chúng em dùng bộ 6 van 5/2 kích bằng điện 24VDC và trả về bằng lò xo.
Hình 3.10 van khí nén 5/2 van đơn
c. Nguyên lí
Mạch có nhiệm vụ nhận tín hiệu điều khiển từ vi điều khiển và cấp nguồn hoạt động cho các van khí nén hoạt động.
Mạch được thiết kế để cách ly hoàn toàn với mạch điều khiển, bảo vệ an toàn cho mạch điều khiển khi xảy ra sự cố ở cuộn dây solenoid. Mạch tác động mức thấp, nghĩa là dây dương của các van được nối chung lại và nối với nguồn, dây âm của từng van được cách li, khi có tín hiệu vi điều khiển của van nào, thì dây âm của van đó sẽ nối với dây âm của nguồn để cho van hoạt động.
Arduino Nano Mạch kích van Xilanh khí nén
SVTH: Huỳnh Phước Nhãn, Đồng Thanh Toàn và Trần Trọng Công Minh Trang 53
Hình 3.11 Mạch khí nén (2 mặt)
d. Cấu trúc mạch:
- Mạch được thiết kế có thể kích cùng lúc 8 van khí nén. - Dùng opto PC817 để cách ly với mạch điều khiển. - Các LED báo khí có tín hiệu kích.
- Nguồn 24VDC được cung cấp từ nguồn pin Lipo.
- Nguồn 5VDC, 40mA được lấy trực tiếp từ board Aduino nano vi điều khiển.
3.4 CHUẨN TRUYỀN THÔNG UART VÀ PHƯƠNG PHÁP GIAO TIẾP
GIỮA HAI ROBOT
3.4.1 Chuẩn truyền thông UART
Thuật ngữ UART: trong tiếng anh là viết tắt của cụm từ: Universal Asynchronous serial Receiver and Transmitter, nghĩa là bộ truyền nhận nối tiếp không đồng bộ. Khái niệm UART thường để chỉ thiết bị phần cứng (device, hardware), không phải chỉ một chuẩn giao tiếp. UART cần phải kết hợp với một thiết bị chuyển đổi mức điện áp để tạo ra một chuẩn giao tiếp nào đó.
SVTH: Huỳnh Phước Nhãn, Đồng Thanh Toàn và Trần Trọng Công Minh Trang 54
Truyền thông nối tiếp: Trong quá trình làm việc các vi điều khiển cần trao đổi dữ liệu cho nhau, ví dụ tình huống Master truyền lệnh cho Slave hoặc Slave gởi tín hiệu thu thập được về Master xử lí…Giả sử dữ liệu cần trao đổi là các mã có chiều dài 8 bits, có thể giao tiếp song song, là cách đơn giản nhất vì dữ liệu được xuất và nhận trực tiếp không thông qua bất kỳ một giải thuật biến đổi nào và vì thế tốc độ truyền cũng rất nhanh. Tuy nhiên, nhược điểm là số đường truyền quá nhiều. Hệ thống truyền thông song song thường rất cồng kềnh và vì thế kém hiệu quả. Truyền thông nối tiếp sẽ giải quyết vần đề này, trong tuyền thông nối tiếp dữ liệu được truyền từng bit trên 1 (hoặc một ít) đường truyền. Do đó, dù dữ liệu có lớn đến đâu cũng chỉ dùng rất ít đường truyền. Trong hình mô tả sự so sánh giữa 2 cách truyền song song và nối tiếp trong việc truyền con số 187 thập phân (tức 10111011 nhị phân).
Hình 3.13 Truyền 8 bit theo phương pháp song song (a) và nối tiếp (b)
Truyền thông “Không đồng bộ” cần một đường truyền cho một quá trình. “Khung dữ liệu” đã được chuẩn hóa bởi các thiết bị nên không cần đường xung nhịp báo trước dữ liệu đến. Ví dụ 2 thiết bị đang giao tiếp với nhau theo phương pháp này, chúng đã được thỏa thuận với nhau rằng cứ 1ms thì sẽ có 1 bit dữ liệu truyền đến, như thế thiết bị nhận chỉ cần kiểm tra và đọc đường truyền mỗi mili- giây để đọc các bit dữ liệu và sau đó kết hợp chúng lại thành dữ liệu có ý nghĩa. Để quá trình truyền thành công thì việc tuân thủ các tiêu chuẩn truyền là hết sức quan trọng.
Các khái niệm quan trọng trong phương pháp truyền thông này
a. Baud rate (tốc độ Baud): Tốc độ baud là số bit truyền trong 1 giây. Ví dụ nếu tốc độ baud được đặt là 19200 thì thời gian dành cho 1 bit truyền là 1/19200 ~ 52.083us.
SVTH: Huỳnh Phước Nhãn, Đồng Thanh Toàn và Trần Trọng Công Minh Trang 55
b. Frame (khung truyền): Khung truyền bao gồm các quy định về số bit trong mỗi lần truyền, các bit “báo” như bit Start và bit Stop, các bit kiểm tra như Parity, ngoài ra số lượng các bit trong một data cũng được quy định bởi khung truyền.
c. Start bit: Start là bit đầu tiên được truyền trong một frame truyền, bit này có chức năng báo cho thiết bị nhận biết rằng có một gói dữ liệu sắp được truyền tới.
d. Data: Data hay dữ liệu cần truyền là thông tin chính mà chúng ta cần gởi và nhận.
Parity bit: Parity là bit dùng kiểm tra dữ liệu truyền đúng không (một cách tương đối). Có 2 loại parity là parity chẵn (even parity) và parity lẻ (odd parity). Parity chẵn nghĩa là số lượng số 1 trong dữ liệu bao gồm bit parity luôn là số chẵn. Ngược lại tổng số lượng các số 1 trong parity lẻ luôn là số lẻ.
e. Stop bits: Stop bits là một hoặc các bit báo cho thiết bị nhận rằng một gói dữ liệu đã được gởi xong. Sau khi nhận được stop bits, thiết bị nhận sẽ tiến hành kiểm tra khung truyền để đảm bảo tính chính xác của dữ liệu. Stop bits là các bits bắt buộc xuất hiện trong khung truyền. (Khung truyền nhóm sử dụng là khung truyền phổ biến nhất : start bit +8 bit data +1 stop bit).
3.4.2 Giao tiếp giữa Manualrobot và Autorobot
Trong thi đấu Robocon giao tiếp giữa robot bằng tay và robot tựđộng là rất cần thiết giúp robot có thể phối hợp một cách nhịp nhàng, giảm thời gian trì hoãn và nâng cao tính hiệu quảkhi thi đấu.
Có nhiều phương pháp có thể giao tiếp giữa 2 con robot như : hồng ngoại, quang trở… Tuy nhiên giao tiếp không dây rất dể bị nhiễu và ảnh hưởng nhiều vào môi trường bên ngoài.
Hình 3.14 Sơ đồ giao tiếp giữa manual robot và auto robot
Manual Robot GND TX Auto Robot GND RX
SVTH: Huỳnh Phước Nhãn, Đồng Thanh Toàn và Trần Trọng Công Minh Trang 56
Để an toàn và chắc chắn nhóm đã thống nhất chọn giao tiếp UART để robot bằng tay ra lệnh cho robot tự động. Vì cả 2 robot đều sử dụng board Arduino (có tích hợp chức năng giao tiếp với máy tính, Arduino khác, hoặc vi điều khiển khác). ATmega328 cung cấp giao tiếp nối tiếp UART TTL (5V), chuẩn giao tiếp được tích hợp sẵn tại chân D0 (RX) and D1 (TX). Đèn LED RX và TX trên board sẽ nháy khi dữ liệu được truyền qua.
Hình 3.15 LED Rx, Tx trên board arduino
3.5 MỘT SỐ LINH KIỆN KHÁC 3.5.1 Công tắc hành trình (CTHT) 3.5.1 Công tắc hành trình (CTHT)
3.5.1.1 Cấu tạo và công dụng
Hình 3.16 Công tắc hành trình
Cấu tạo công tắc hành trình gồm các phần chính: mấu tác động, lò xo di động, tiếp điểm cốđịnh a & b, tiếp điểm di động,…. ngoài ra còn có thêm lưỡi gà đểtăng phạm vi tác động. Có 3 chân COM (chân chung), NO (thường mở), NC (thường đóng).
SVTH: Huỳnh Phước Nhãn, Đồng Thanh Toàn và Trần Trọng Công Minh Trang 57
Công tắc hành trình dùng để giới hạn hành trình của cơ cấu chấp hành hoặc làm kích hoạt một chiến thuật khác, là nguồn tín hiệu giao tiếp duy nhất với bên ngoài khi robot bằng tay thả robot tựđộng.
3.5.1.2 Vị trí và kết nối các kênh CTHT
Có tất cả có 14 công tắc hành trình được nối song song từng cụm nên cần 4 chân digital I/O, được phân bố theo bảng 5 :
Bảng 5 Phân bố công tắc hành trình Sốlượng Vị trí Kết nối Chân trên board điều khiển Cụm 4 CTHT Tay trước Song song D9 Cụm 2 CTHT Thân (vị trí tiếp xúc bậc thang) Cụm 4 CTHT Tay sau Song song D10 Cụm 2 CTHT Thân (vị trí tiếp xúc bậc thang) 1 CTHT Thân (vị trí tiếp xúc với cột cuối) Truyền thẳng D11 1 CTHT Thân ( vị trí dễtác động) Truyền thẳng Reset Vị trí đặt CTHT cũng rất quan trọng vì bộ phận tác động của CTHT rất nhỏ và yếu nên không thể chịu lực lớn, trực tiếp. Khi bố trí vị trí CTHT phải hết sức lưu ý và giới hạn (khi lưỡi gà CTHT tác động, thân CTHT vẫn an toàn)
SVTH: Huỳnh Phước Nhãn, Đồng Thanh Toàn và Trần Trọng Công Minh Trang 58
3.5.2 Công tắc chọn sân
Do sân thi đấu có 2 phần đối xứng nhau (đi bộ trên cột), ta có thể thi đấu 1 trong 2 nên phải có sẵn chiến thuật cho robot tự động. Ở đây nhóm chọn công tắc ON/OFF thay cho nút ấn để chọn sân thi. Ấn OFF là chọn chiến thuật cho autorobot thi đấu bên sân xanh, ON là chọn chiến thuật cho autorobot thi đấu bên sân đỏ (chiến thuật đã được lập trình sẵn).
Hình 3.18 Vị trí công tắc chiến thuật
3.5.3 Chổi quét
Do robot di chuyển theo cơ cấu hình bình hành nên sẽ có chuyển động xoay quanh trục, vì vậy không thể sử dụng dây dẫn trực tiếp để truyền tín hiệu từ thanh truyền vềvi điều khiển (nằm ở thân Autorobot) nên nhóm đã sử dụng jack cắm DC để truyền tín hiệu của CTHT về board arduino theo kiểu chổi quét.
SVTH: Huỳnh Phước Nhãn, Đồng Thanh Toàn và Trần Trọng Công Minh Trang 59
3.5.4 Encoder
Ở phần này nhóm đã sử dụng encoder từ được gắn ở trục động cơ. Trong robocon ta thường sử dụng incremental rotary encoder (encoder tương đối). Mục đích của việc sử dụng encoder để tính quảng đường di chuyển và hồi tiếp giá trị hỗ trợ việc lập trình chính xác hơn.
Encoder từ được cấu tạo bao gồm: 1 đĩa nam châm vỉnh cửu có nhiều cặp cực được gắn đồng tâm với trục quay, và hai bộ phận cảm ứng từ (2 kênh tín hiệu), bộ phận đệm dòng.... Khi đĩa quay chuyển đổi từ cực S – N hoặc N – S thì bộ phận cảm ứng từ cho ra tín hiệu. Quá trình này tạo ra một chuỗi xung, và chúng ta dựa vào đó đểxác định quãng đường di chuyển của Autorobot lúc lên sàn ngang của cầu thang (biết khi nào dừng lại đểvươn cờ Shabassh).
Hình 3.20 Encoder từ cấu tạo & thực tế Two Channel Encoder Connections:
1 MOTOR - 2. MOTOR+
3 HALL SENSOR Vcc 4 HALL SENSOR GND 5 HALL SENSOR A Vout 6 HALL SENSOR B Vout
3.6.1 Pin Lipo
Pin là nguồn năng lượng chính cung cấp cho Autorobot hoạt động. Trên thị trường có rất nhiều loại pin khác nhau: Pin Ni-Fe, Ni-Cd, Li-Ion, Li-Polimer (Lipo)… Do động cơ cần năng lượng đáp ứng khá cao và ổn định nên nhóm chọn pin Lipo.
Ta có công thức tính tính công suất động của dòng điện 1 chiều là: P = U.I => I = = = . (6)
SVTH: Huỳnh Phước Nhãn, Đồng Thanh Toàn và Trần Trọng Công Minh Trang 60
Với:
P: Công suất động cơ Planet (W) U: Điện áp pin Lipo (V)
I: Dòng điện (A)
Cần dòng tiêu thụ 1250 mmA , do đó nhóm đã sử dụng pin Lipo.
Pin Lipo với công nghệ chất điện phân dạng rắn nên tỷ lệ về năng lượng lưu trữ trên trọng lượng rất cao so với các loại pin thông thường. Bên cạnh đó pin Lipo có tốc độ xả cao tương ứng với khả năng cung cấp dòng cao, khối lượng nhẹ.
Trong Autorobot này sử dụng Pin Lipo TURNIGY 6 cell – 24VDC, để cung cấp dòng động lực cho động cơ và mạch điều khiển khí nén,có dung lượng 2650 mAh, dòng xả từ 20-30C (có nghĩa là pin này đạt dòng xả bình thường là 2650*30 = 76800 mAh). Pin này có khả năng cung cấp dòng cao tối đa là 76.8 A.
Do yêu cầu sử dụng nguồn riêng cho vi điều khiểnđể chống nhiễu nên nhóm sử dụng thêm Pin Lipo 3 cell – 12VDC để cấp nguồn cho board Arduino Nano.
Thông số kỹ thuật:
- Dung lượng: 2650 mAh - Dòng xảđịnh mức: 20C
- Dòng xả cực đại (10 giây): 30C - Cân nặng: 430g
- Kích thướt: 141 x 41 x 31mm
SVTH: Huỳnh Phước Nhãn, Đồng Thanh Toàn và Trần Trọng Công Minh Trang 61
CHƯƠNG 4: LẬP TRÌNH CHO AUTOROBOT
Trong suốt quá trình thi đấu Robocon, đểđạt được hiệu quả cao, ngoài sự chính xác và cứng vững của các cơ cấu cơ khí, sự ổn định và an toàn của hệ thống điện- điện tử, ta còn phải kể đến tính tối ưu và thông minh của giải thuật phần mềm điều khiển. Đóng vai trò như trí tuệ và là linh hồn của robot, phần mềm điều khiển cần phải được lập trình, quản lý, thử nghiệm và kiểm tra chặt chẽ, để robot có thể thực hiện được các tác vụ một cách tối ưu và hiệu quả nhất. Vì vậy, ta cần phải chú trọng nhiều đến việc nghiên cứu và xây dựng phần mềm điều khiển dựa trên các phương pháp, giải thuật hợp lý.
Từ những yêu cầu trên, nhóm đã sử dụng trình biên dịch Arduino IDE phiên bản 1.0.5 để xây dựng và thử nghiệm phần mềm điều khiển Autorobot. Arduino IDE là sản phẩm của nhà phát triển mã nguồn mở Arduino, Italy. Với việc được tích hợp sẵn các công cụ, chức năng đặc biệt cần thiết cho việc lập trình và đồng thời sử dụng ngôn ngữ lập trình dựa trên C, trình biên dịch Arduino IDE hỗ trợ mạnh mẽ việc xây dựng các ứng dụng hệ thống nhúng trên hầu hết những sản phẩm board Vi Điều Khiển của Arduino (cụ thể là board Arduino Nano V3 được sử dụng cho Autorobot).
Hình 4.1 Trình biên dịch Arduino IDE (giao diện của phiên bản 1.0.5)
SVTH: Huỳnh Phước Nhãn, Đồng Thanh Toàn và Trần Trọng Công Minh Trang 62
Đểgiúp có được cái nhìn chi tiết hơn vềcông đoạn quan trọng cuối cùng hoàn thành robot, nhóm xin dành toàn bộ nội dung chương này để nói về các vấn đề trong việc xây dựng phần mềm điều khiển Autorobot: những quy ước-định nghĩa; chức năng, phương thức làm việc (lưu đồ giải thuật) của các chương trình con thường, chương trình con phục vụ ngắt và chương trình chính.
4.1 CẤU TRÚC CƠ BẢN CỦA MỘT CHƯƠNG TRÌNH ĐƯỢC VIẾT BẰNG
ARDUINO IDE
Không giống như chương trình được viết bằng các trình biên dịch khác, đối với một phần mềm nhúng được xây dựng trên nền của Arduino IDE, phải luôn có 2 phần riêng biệt trong mỗi chương trình được viết:
Phần khởi tạo - cài đặt:
- Đây là phần chương trình con đặc biệt, được dành riêng cho các tác vụ khởi tạo, cài đặt các tham số, chếđộ, hằng số, biến số,… cần thiết để thực hiện các công việc tiếp theo trong chương trình chính.
- Được gọi lên trước chương trình chính, và chỉđược gọi một lần sau mỗi lần cấp nguồn hoặc Reset board Vi điều khiển Arduino.
- Cú pháp: void setup() { <Các câu lệnh> } Phần chương trình chính – lặp lại liên tục:
- Đây là phần chương trình chạy chính của toàn bộ phần mềm đang được xây dựng. Vì vậy tất cả các công việc xử lý, thực thi tác vụ,…đều nằm phần lớn ởđây.
- Được gọi lên sau phần khởi tạo cài đặt mỗi khi cấp nguồn hoặc Reset board Vi Điều Khiển. Tuy nhiên, khác với phần khởi tạo, phần chương trình chính được gọi liên tục nhiều lần sau đó để thực hiện lặp đi lặp lại các công việc của chương trình chính, đồng thời tránh hiện tượng Vi Điều Khiển rơi vào trạng thái “sleep”.
- Cú pháp: void loop() {
<Các câu lệnh> }
Ngoài ra, trong chương trình còn có các phần phụ (không bắt buộc) khác như: phần định nghĩa các giá trị, chân điều khiển, khai báo biến toàn cục, chương trình con, chương trình con phục vụ ngắt…
SVTH: Huỳnh Phước Nhãn, Đồng Thanh Toàn và Trần Trọng Công Minh Trang 63
4.2 QUY ƯỚC VÀ ĐỊNH NGHĨA
Để việc xây dựng phần mềm điều khiển Autorobot được đúng đắn và khoa học, cần phải có một quy chuẩn chính xác vềcác đối tượng cơ khí, điện tử sẽđược điều khiển trên robot này. Hay nói cách khác, ta cần phải quy ước các yếu tốvà định nghĩa các kênh điều khiển, cảm biến để dễdàng hơn trong việc lập trình chiến thuật. Vì vậy nhóm đã quy định khi lập trình như sau:
4.2.1 Quy ước
Autorobot sẽ tạm được chia thành 2 phần chính:
- Phần thân: là thân chính của robot, chứa mạch điện tử, van khí nén, bình khí nén,..
- Phần guồng tay: là dàn cơ cấu 4 khâu bản lề (hình bình hành) ở hai bên thân Robot. Mọi chuyển động của guồng tay này đều sẽ do Motor guồng tay điều khiển.
Hình 4.2 Quy ước cấu tạo của Autorobot Autorobot có 2 tay kẹp (gripper):
- Tay kẹp trái: là tay kẹp nằm ở phần đầu của thân robot, và là tay kẹp đầu tiên