Nhằm đáp ứng nhiều yêu cầu khác nhau của công việc, nhà sản xuất Arduino đã đưa ra nhiều tùy chọn khác nhau về kích thước, số lượng chân giao tiếp, bộ vi xử lý, giá thành, ... tùy theo mỗi dự án mà lựa chọn một phiên bản Arduino thích hợp với nhu cầu.
Ví dụ nếu dự án cần kích thước nhỏ gọn thì Arduino Pro Mini hay Arduino Nano là lựa chọn đầu tiên. Trong khi đó, ở mức độ phổ thông thì có thể dùng Arduino Uno - cân bằng giữa hiệu năng và kích thước. Tuy nhiên, nếu yêu cầu cần phải xử lý nhiều dữ liệu và giao tiếp với nhiều thiết bị khác, Arduino Mega hay Due là ứng viên sáng giá.
Mỗi Arduino board như vậy lại sử dụng một loại vi điều khiển (microcontroller unit - VDK) khác nhau: Arduino Uno R3 sử dụng VDK ATmega328P trong khi Arduino Mega sử dụng VDK ATmega2560. Mỗi loại VDK này lại có bộ nhớ, tốc độ xử lý, số chân giao tiếp, ... khác nhau.
Giả sử khi viết thư viện cho nhiều loại Arduino khác nhau, cần phải biết chính xác loại VDK đang sử dụng để có hướng lập trình phù hợp.
Phương pháp xác định
Hầu hết các loại Arduino đều sử dụng VDK sản xuất bởi Atmel, các VDK này thường được đặt tên bắt đầu với ATxxxxx như ATmega328P, ATtiny13, ... tương ứng với mỗi VDK có 1 mã cho chúng gọi là signature code. Mã này không phải là duy nhất cho mỗi VDK, nhưng là duy nhất cho mỗi dòng VDK.
Với Arduino, có thể biết được loại VDK đang sử dụng bằng cách truy vấn 3 hằng số lần lượt là SIGNATURE_0
, SIGNATURE_1
và SIGNATURE_2
, tương ứng với 3 byte của signature code.
Bảng sau đây giải thích ý nghĩa của từng hằng số:
Hằng số | Ý nghĩa | Giá trị hợp lệ |
SIGNATURE_0 | Mã của hãng sản xuất |
1E nghĩa là VDK này sản xuất bởi Atmel |
SIGNATURE_1 | Dòng VDK và bộ nhớ flash | 9n - VDK AVR với 2n kB bộ nhớ |
SIGNATURE_2 | Mã của VDK | Tên chính xác của VDK này |
Dựa trên bảng này, đây là danh sách các signature code của một số VDK phổ biến được sản xuất bởi hãng Atmel:
Loại MCU | Signature code |
ATtiny13 | 1E9007 |
ATtiny2313 | 1E910A |
ATmega48P | 1E920A |
ATmega8 | 1E9307 |
ATmega168 | 1E9406 |
ATmega32 | 1E9502 |
ATmega328P | 1E950F |
ATmega328-PU | 1E9514 |
ATmega64 | 1E9602 |
ATmega644 | 1E9609 |
ATmega128 | 1E9702 |
ATmega1280 | 1E9703 |
ATmega2560 | 1E9801 |
Ví dụ cần truy vấn 3 hằng số và nhận được kết quả:
SIGNATURE_0 = 0x1E
SIGNATURE_1 = 0x98
SIGNATURE_2 = 0x01
Dựa theo bảng trên, xác định được VDK đang sử dụng là ATmega2560 với bộ nhớ flash là 28 = 256 kB.
Code minh hoạ
Với Arduino Uno R3, trên thị trường có 2 phiên bản sử dụng 2 loại VDK khác nhau là ATmega328P và ATmega168. Đoạn code sau minh họa việc nhận biết 2 loại VDK này:
void setup() { Serial.begin(9600); char* mcuType; if (SIGNATURE_0 == 0x1E || SIGNATURE_0 == 0x00) { if (SIGNATURE_1 == 0x95 && SIGNATURE_2 == 0x0F) { mcuType = "ATmega328P"; } else if (SIGNATURE_1 == 0x94 && SIGNATURE_2 == 0x06) { mcuType = "ATmega168"; } else { mcuType = "Unknown Atmel MCU"; } } else { mcuType = "Unknown MCU"; } Serial.print("This Arduino using MCU: "); Serial.println(mcuType); } void loop() { }