Search…

Xác Định Loại Vi Điều Khiển Của Arduino Bằng Lập Trình

08/08/20203 min read
Hướng dẫn sử dụng code lập trình để xác định loại vi điều khiển của Arduino đang sử dụng.

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_1SIGNATURE_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() { 
	
}
IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024