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.
1. Thiết lập mômôi trường
Tải arduino IDE
B1: Mở Arduino IDE. VàVào Tools > Board > Boards Manager...
B2: GõGõ tìtìm kiếm Uno R4. CàCài đặt gógói "Arduino UNO R4 Boards" (phiêphiên bản mới nhất).
B3: Kết nối board vàvào mámáy títính bằng cácáp USB-C.
B4: VàVào Tools > Board > chọn đúúng bản bạn đang cócó (Arduino UNO R4 Minima hoặc WiFi).
B5: VàVào Tools > Port > Chọn cổng COM cócó têtên board đi kèkèm.
Lưu ýý: Nhớ kiểm tra deviece manager để kiểm tra chíchính xáxác port của thiết bị
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.
2. Kiểm tra cácác chức ngoại vi
a. Digital I/O
- CáCác linh kiện cần chuẩn bị làlà 1 con led vàvà 1 con trở.
Code:
void setup() {
//cấu hìhình cácác châchân từ 0 đến 13 lê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êtrên vàvào arduino

Chấn còcòn lại nối lần lượt vàvào cácác châchân D0 –– D13 àà led sásáng làlà ok
b. Analog input
Kịch bản để test;
Mục tiêtiêu: Kiểm tra khả năng đọc títín hiệu Analog vàvà xáxác nhận độ phâphân giải 14-bit.
Thiết bị: 1 biến trở (Potentiometer) 10kΩ10kΩ, dâdây Jumper.
Kết nối:
+ ChâChân trátrái biến trở -> GND.
+ ChâChân phải biến trở -> 5V.
+ ChâChân giữa biến trở -> A1 (hoặc bất kỳ châchân A nà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âchân thay ở đâây
// TíTính toá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ását vàvà kết hợp với với xoay biến trở để thay đổi giágiá trị đọc ADC.
MàMàn hiển thị của serial monitor:

ðð Sau đóó kiểm trả tương tự với cácác châchân còcòn lại bằng cá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ását độ sásáng rõrõ àà mờ của led
Nạp code trêtrên: Tất cả cácác châchân PWM sẽ cùcùng "thở" (sásáng - tối tuần hoàhoàn).
Test: Cắm dâdây Jumper từ LED vàvào lần lượt cácác châchân D3, D5, D6, D9, D10, D11.
Quan sását: Nếu LED sásáng mờ dần vàvà rõrõ dần một cácách mượt màmà -> PASS. Nếu LED bị chớp tắt đột ngột hoặc chỉ cócó 2 mức sásáng/tối -> FAIL.
// Danh sásách cácác châchân hỗ trợ PWM trê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áSáng dần lê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òcòi bắt đầu kêkêu từ tiếng rèrè nhỏ đến tiếng rírít to khi điện ááp đạt ngưỡng.
Kết nối:
ChâChândàdài (+): Cắmvàvào A0.ChâChân ngắn (-): Cắmvàvào GND.
Code:
void setup() {
analogWriteResolution(12); // 12-bit (0-4095)
}
void loop() {
// Tăng dần điện ááp từ 0V lê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âgiây
analogWrite(A0, 0); // Tắt
delay(1000);
}
e. UART
CáCách làlàm: DùDùng một sợi dâdây Jumper nối trực tiếp châchân D0 vàvào D1.
NguyêNguyên lýlý: Board sẽ gửi một kýký tự qua châchân TX, sợi dâdây dẫn nónó quay lại châchân RX. Nếu nhận đúúng kýký tự đóó thìthì UART sống.
Code:
void setup() {
Serial.begin(9600); // USB Serial để xem kết quả trêtrên mámáy títính
Serial1.begin(9600); // UART trêtrên châ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êtrên Serial Monitor làlà Pass
}
delay(1000);
}
Kết quả:

f. I2C
Test hiển thị trêtrên LCD:
Kết nối:
+ 5V –– VCC
+ GND –– GND
+ A5 –– SCL
+ A4 –– SDA
Code dò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àthành địa chỉ code qué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òDòng 1
lcd.setCursor(0, 0);
lcd.print("UNO R4 MINIMA");
// Dò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àvào D12 (CIPO/MISO).
+ NguyêNguyên lýlý: Dữ liệu xuất ra từ châchân COPI sẽ quay ngược về châchân CIPO. Nếu board nhận đúúng những gìgì nónó vừa gửi, nghĩa là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à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ả:


