Arduino Uno R4 Minima

NOTE: Nối chân boot và chân GND lúc đầu để nhận port trước khi cắm USB. Sau khi xử lí hiện port ảo như bo mini thì không cần nối nữa.
Bạn tiến hình cài đặt và set up flash firmware theo link bài hướng dẫn Hướng dẫn Flash Firmware Bootloader Arduino cho chip trước khi nạp code qua Arduino IDE.
Sau khi hoàn tất quá trình flash firmware giao diện arduino IDE sẽ hiện như vầy.
Bạn tiến hành nạp lần đầu với chương trình hello world đơn giản với code mẫu.
void setup() {
// Initialize serial communication at 115200 baud rate
Serial.begin(115200);
// Wait for serial port to connect (needed for some Arduino boards)
while (!Serial) {
; // Wait for serial port to connect
}
}
void loop() {
// Print "Hello, World!" to the Serial Monitor
Serial.println("Hello, World!");
// Wait for 1 second (1000 milliseconds)
delay(1000);
}
Sau khi nạp lần đầu port của mạch sẽ xuất hiện đây là kết quả hiển thị trên Arduino IDE.
Chương trình đã chạy thành công và COM của board đã hiển thị trên màn hình những lần sau bạn chỉ cần chọn đúng com và nạp code.
1. Thiết lập môi trường
Tải arduino IDE
B1: Mở Arduino IDE. Vào Tools > Board > Boards Manager...
B2: Gõ tìm kiếm Uno R4. Cài đặt gói "Arduino UNO R4 Boards" (phiên bản mới nhất).
B3: Kết nối board vào máy tính bằng cáp USB-C.
B4: Vào Tools > Board > chọn đúng bản bạn đang có (Arduino UNO R4 Minima hoặc WiFi).
B5: Vào Tools > Port > Chọn cổng COM có tên board đi kèm.
Lưu ý: Nhớ kiểm tra deviece manager để kiểm tra chính xác port của thiết bị
2. Kiểm tra các chức ngoại vi
a. Digital I/O
- Các linh kiện cần chuẩn bị là 1 con led và 1 con trở.
Code:
void setup() {
//cấu hình các chân từ 0 đến 13 lên mức 1
for (int i = 0; i <= 13; i++) {
pinMode(i, OUTPUT);
digitalWrite(i, HIGH);
}
}
void loop() {
}
è Nhấn upload để nạp code trên vào arduino

Chấn còn lại nối lần lượt vào các chân D0 – D13 à led sáng là ok
b. Analog input
Kịch bản để test;
Mục tiêu: Kiểm tra khả năng đọc tín hiệu Analog và xác nhận độ phân giải 14-bit.
Thiết bị: 1 biến trở (Potentiometer) 10kΩ, dây Jumper.
Kết nối:
+ Chân trái biến trở -> GND.
+ Chân phải biến trở -> 5V.
+ Chân giữa biến trở -> A1 (hoặc bất kỳ chân A nào từ A0-A5)
Code:
void setup() {
Serial.begin(9600);
// config adc 14bit
analogReadResolution(14);
Serial.println("--- Kiem tra ADC 14-bit ---");
Serial.println("Xoay bien tro de xem gia tri tu 0 den 16383");
}
void loop() {
int sensorValue = analogRead(A1); // test từng chân thay ở đây
// Tính toán điện áp thực tế
float voltage = sensorValue * (5.0 / 16383.0);
Serial.print("Gia tri ADC: ");
Serial.print(sensorValue);
Serial.print(" | Dien ap: ");
Serial.print(voltage);
Serial.println(" V");
delay(200);
}
ð Sau khi upload code chọn serial monitor để quan sát và kết hợp với với xoay biến trở để thay đổi giá trị đọc ADC.
Màn hiển thị của serial monitor:

ð Sau đó kiểm trả tương tự với các chân còn lại bằng cách thay code tại
int sensorValue = analogRead(A1); //A0 – A5
c. PWM
- Ta test PWM (D3, D5, D6, D9, D10, D11)
- Kịch bản test: quan sát độ sáng rõ à mờ của led
Nạp code trên: Tất cả các chân PWM sẽ cùng "thở" (sáng - tối tuần hoàn).
Test: Cắm dây Jumper từ LED vào lần lượt các chân D3, D5, D6, D9, D10, D11.
Quan sát: Nếu LED sáng mờ dần và rõ dần một cách mượt mà -> PASS. Nếu LED bị chớp tắt đột ngột hoặc chỉ có 2 mức sáng/tối -> FAIL.
// Danh sách các chân hỗ trợ PWM trên R4 Minima
const int pwmPins[] = {3, 5, 6, 9, 10, 11};
const int numPins = sizeof(pwmPins) / sizeof(pwmPins[0]);
void setup() {
for (int i = 0; i < numPins; i++) {
pinMode(pwmPins[i], OUTPUT);
}
}
void loop() {
// Sáng dần lên
for (int duty = 0; duty <= 255; duty++) {
for (int i = 0; i < numPins; i++) {
analogWrite(pwmPins[i], duty);
}
delay(5);
}
// Mờ dần đi
for (int duty = 255; duty >= 0; duty--) {
for (int i = 0; i < numPins; i++) {
analogWrite(pwmPins[i], duty);
}
delay(5);
}
}
d. DAC
Test bằng buzzer TMB12A05 còi bắt đầu kêu từ tiếng rè nhỏ đến tiếng rít to khi điện áp đạt ngưỡng.
Kết nối:
- Chân dài (+): Cắm vào A0.
- Chân ngắn (-): Cắm vào GND.
Code:
void setup() {
analogWriteResolution(12); // 12-bit (0-4095)
}
void loop() {
// Tăng dần điện áp từ 0V lên ~3.3V
for (int i = 0; i <= 4095; i += 10) {
analogWrite(A0, i);
delay(5);
}
delay(1000); // Giữ ở mức cao nhất 1 giây
analogWrite(A0, 0); // Tắt
delay(1000);
}
e. UART
Cách làm: Dùng một sợi dây Jumper nối trực tiếp chân D0 vào D1.
Nguyên lý: Board sẽ gửi một ký tự qua chân TX, sợi dây dẫn nó quay lại chân RX. Nếu nhận đúng ký tự đó thì UART sống.
Code:
void setup() {
Serial.begin(9600); // USB Serial để xem kết quả trên máy tính
Serial1.begin(9600); // UART trên chân D0, D1
}
void loop() {
Serial1.print("TDLODY"); // Gửi qua TX
delay(100);
if (Serial1.available()) {
String rcv = Serial1.readString();
Serial.print("UART Test: ");
Serial.println(rcv); // Nếu hiện "TDLOGY" trên Serial Monitor là Pass
}
delay(1000);
}
Kết quả:

f. I2C
Test hiển thị trên LCD:
Kết nối:
+ 5V – VCC
+ GND – GND
+ A5 – SCL
+ A4 – SDA
Code dò địa chỉ thiết bị:
#include <Wire.h>
void setup() {
Wire.begin();
Serial.begin(9600);
byte error, address;
int nDevices;
Serial.println("Dang quet...");
nDevices = 0;
for (address = 1; address < 127; address++) {
// Wire.endTransmission tra ve:
// 0: Thanh cong (Tim thay thiet bi)
// 4: Loi khac
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("Tim thay thiet bi I2C tai dia chi: 0x");
if (address < 16) Serial.print("0");
Serial.print(address, HEX);
Serial.println(" !");
nDevices++;
} else if (error == 4) {
Serial.print("Loi chua xac dinh tai dia chi 0x");
if (address < 16) Serial.print("0");
Serial.println(address, HEX);
}
}
if (nDevices == 0)
Serial.println("Khong tim thay thiet bi I2C nao.\n");
else
Serial.println("Hoan thanh.\n");
}
void loop() {
}
Code test hiển thị LCD:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Thay đổi địa chỉ 0x21 thành địa chỉ code quét trước
LiquidCrystal_I2C lcd(0x21, 16, 2);
void setup() {
lcd.init(); // Khởi tạo LCD
lcd.backlight(); // Bật đèn nền
// Dòng 1
lcd.setCursor(0, 0);
lcd.print("UNO R4 MINIMA");
// Dòng 2
lcd.setCursor(0, 1);
lcd.print("TEST I2C: OK!");
delay(2000);
}
void loop() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tester: TDLOGY");
lcd.setCursor(0, 1);
lcd.print("Status: PASSING");
delay(1000);
lcd.setCursor(14, 1);
lcd.print("..");
delay(500);
}
Kết quả:

g. SPI
Kết nối:
+ D11 (COPI/MOSI) nối vào D12 (CIPO/MISO).
+ Nguyên lý: Dữ liệu xuất ra từ chân COPI sẽ quay ngược về chân CIPO. Nếu board nhận đúng những gì nó vừa gửi, nghĩa là khối SPI hoạt động
Code:
//Mode: SPI Mode 0 (Mặc định).
//Clock Speed: 4MHz
//Bit Order: MSB First.
#include <SPI.h>
void setup() {
Serial.begin(9600);
while (!Serial);
SPI.begin(); // Khởi tạo SPI (D11, D12, D13)
Serial.println("--- Kiem tra SPI Loopback ---");
Serial.println("Hay dam bao da noi Jumper giua D11 va D12");
}
void loop() {
static byte testData = 0;
// Gửi dữ liệu qua SPI và nhận lại ngay lập tức
byte receivedData = SPI.transfer(testData);
Serial.print("Gui: 0x");
Serial.print(testData, HEX);
Serial.print(" | Nhan: 0x");
Serial.print(receivedData, HEX);
if (receivedData == testData) {
Serial.println(" -> [PASS]");
} else {
Serial.println(" -> [FAIL]");
}
testData++; // Tăng dữ liệu test
delay(1000);
}
Kết quả:



No Comments