Bài 01 CHỈNH LƯU MỘT PHA TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHỆ CẦN THƠ KHOA ĐIỆN ĐIỆN TỬ VIỄN THÔNG BÁO CÁO THỰC HÀNH VI ĐIỀU KHIỂN SINH VIÊN THỰC HIỆN Họ và tên LƯƠNG THÀNH HUY MSSV 2000982 Lớp DIE[.]
TRƯỜNG ĐẠI HỌC KỸ THUẬT - CÔNG NGHỆ CẦN THƠ KHOA ĐIỆN - ĐIỆN TỬ - VIỄN THÔNG - - BÁO CÁO THỰC HÀNH VI ĐIỀU KHIỂN SINH VIÊN THỰC HIỆN: Họ tên: LƯƠNG THÀNH HUY MSSV: 2000982 Lớp: DIEN0120 Nhóm: 02 Học kỳ Năm học: 2022 - 2023 Báo cáo thực hành môn Vi điều khiển Bài 01 Xin cam kết số liệu báo cáo, câu trả lời tự cá nhân làm số liệu ghi nhận từ thí nghiệm, khơng có chép Nếu có chép nội dung nhận điểm (không) Người cam kết ký ghi rõ họ tên: Bài thực hành số 1: MÔ PHỎNG VÀ NẠP CHƯƠNG TRÌNH NỘI DUNG BÁO CÁO Nội dung 1: Lập trình nạp chương trình cho Arduino Uno Yêu cầu 1: Viết chương trình chớp tắt led với thời gian delay 500 ms - Nhận xét kết nhận sau nạp chương trình mẫu sau: int ledPin = 13; // Pin kết nối với LED void setup() { pinMode(ledPin, OUTPUT); // Khai báo pin đầu } void loop() { digitalWrite(ledPin, HIGH); // Bật LED delay(500); // Chờ 500ms digitalWrite(ledPin, LOW); // Tắt LED delay(500); // Chờ 500ms } Trong chương trình này, sử dụng hàm `digitalWrite()` để bật tắt LED, hàm `delay()` để tạo thời gian chờ lần chớp tắt Ở đây, sử dụng giá trị 500ms cho thời gian chờ lần chớp tắt LED - Chương trình thay đổi thời gian đáp ứng đóng giây, ngắt giây led: int ledPin = 13; // chân kết nối led void setup() { pinMode(ledPin, OUTPUT); } void loop() { digitalWrite(ledPin, HIGH); // bật led delay(1000); // mở led giây digitalWrite(ledPin, LOW); // tắt led delay(2000); // tắt led giây SVTH: Lương Thành Huy Báo cáo thực hành môn Vi điều khiển Bài 01 } - Chương trình để led đầu led sau sáng tắt đối nghịch nhau: void setup() { for (int i = 2; i 0) { //kiểm tra liệu có sẵn để đọc incomingByte = Serial.read(); //đọc liệu vào biến incomingByte if (incomingByte == '0') { //nếu nhập số digitalWrite(ledPin, LOW); //tắt đèn LED } else { //nếu nhập số khác digitalWrite(ledPin, HIGH); //bật đèn LED delay(incomingByte * 100); //nhấp nháy đèn LED tương ứng với số liệu nhập vào digitalWrite(ledPin, LOW); //tắt đèn LED delay(incomingByte * 100); //chờ khoảng thời gian trước quay lại vòng lặp } } SVTH: Lương Thành Huy Báo cáo thực hành môn Vi điều khiển Bài 02 } Nội dung 2: Lập trình giao tiếp qua I2C Yêu cầu 4: Viết chương trình hiển thị LCD 16x2 qua giao tiếp I2C - Ghi nhận kết thu từ chương trình mẫu: #include #include< LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3F,16,2); // Địa I2C LCD kích thước LCD void setup() { lcd.init(); // Khởi tạo LCD lcd.backlight(); // Bật đèn } void loop() { lcd.setCursor(0,0); // Đặt vị trí trỏ hàng thứ nhất, cột lcd.print('' CTUT "); delay(1000); // Đợi giây lcd.clear(); // Xóa hình delay(1000); // Đợi giây } - Lập trình chương trình hiển thị thơng tin sinh viên gồm Họ tên dòng trên, mã số sinh viên lớp luân phiên thay đổi dòng #include #include< LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3F,16,2); // Địa I2C LCD kích thước LCD void setup() { lcd.init(); // Khởi tạo LCD lcd.backlight(); // Bật đèn } void loop() { lcd.setCursor(0,0); // Đặt vị trí trỏ hàng thứ nhất, cột lcd.print(''Luong Thanh Huy "); lcd.setCursor(0,1); lcd.print(''2000982"); SVTH: Lương Thành Huy Báo cáo thực hành môn Vi điều khiển Bài 02 delay(1000); // Đợi giây lcd.clear(); // Xóa hình delay(1000); // Đợi giây } SVTH: Lương Thành Huy Báo cáo thực hành môn Vi điều khiển Bài 02 - Nhấn nút giữ, ghi nhận kết hiển thị led Serial Monitor sau: Hiển thị nút nhấn - Chương trình lập trình đọc nút nhấn, lần nhấn đổi trạng thái, giữ trạng thái không thai đổi (chọn tác động xung cạnh lên xung cạnh xuống nút nhấn) sau: const int BUTTON_PIN = 2; // Chân kết nối nút nhấn const int DEBOUNCE_DELAY = 50; // Thời gian chờ lần đọc trạng thái nút nhấn int buttonState = HIGH; // Trạng thái nút nhấn int lastButtonState = HIGH; // Trạng thái nút nhấn trước unsigned long lastDebounceTime = 0; // Thời điểm nhấn cuối void setup() { pinMode(BUTTON_PIN, INPUT_PULLUP); Serial.begin(9600); } void loop() { // Đọc trạng thái nút nhấn int reading = digitalRead(BUTTON_PIN); // Kiểm tra xem trạng thái có khác với trạng thái trước khơng if (reading != lastButtonState) { // Lưu thời điểm nhấn cuối lastDebounceTime = millis(); } // Kiểm tra xem đủ thời gian chờ lần đọc trạng thái chưa if ((millis() - lastDebounceTime) > DEBOUNCE_DELAY) { // Nếu trạng thái khác với trạng thái trước if (reading != buttonState) { buttonState = reading; Yêu cầu 2: Viết chương trình đọc từ bàn phím nút nhấn dạng ma trận in phím nhấn lên cổng serial Arduino IDE LCD - Ghi nhận kết nhấn nút theo thứ tự từ trái qua phải từ xuống thu kết sau: Màn hình lcd hiển thị kí tự ma trận vừa nhấn - Hãy viết chương trình đọc password từ bàn phím Nhận password 13579 Nếu password nhấn phím = bàn phím để tắt mở đèn led chân 13 Nếu sai đèn nhấp nháy liên tục Nhấn phím C để nhập lại password SVTH: Lương Thành Huy 11 Báo cáo thực hành môn Vi điều khiển Bài 02 int password = 13579; // đặt password cần nhập vào int ledPin = 13; // đặt chân led void setup() { pinMode(ledPin, OUTPUT); Serial.begin(9600); // khởi tạo Serial để đọc password từ bàn phím } void loop() { int input = 0; Serial.println("Nhập password: "); while (Serial.available() == 0) { // đợi người dùng nhập password } input = Serial.parseInt(); // đọc password từ Serial if (input == password) { digitalWrite(ledPin, HIGH); // bật đèn led Serial.println("Password đúng!"); Serial.println("Nhấn phím = để tắt đèn led"); while (Serial.available() == 0) { // đợi người dùng nhấn phím = } if (Serial.read() == '=') { digitalWrite(ledPin, LOW); // tắt đèn led } } else { Serial.println("Password sai!"); Serial.println("Nhấn phím C để nhập lại password"); digitalWrite(ledPin, HIGH); delay(500); digitalWrite(ledPin, LOW); } } Nội dung 2: Đọc tín hiệu tương tự Yêu cầu 3: Lập trình điều khiển thời gian nhấp nháy led theo tín hiệu tương tự đọc từ biến trở SVTH: Lương Thành Huy 12 Báo cáo thực hành môn Vi điều khiển Bài 02 - Ghi nhận kết thu cho nhận xét kết thu điểu chỉnh biến trở: Khi thay đổi điều chỉnh biến trở thời gian led hiển thị lâu - Mắc nối tiếp biến trở vởi điện trở, xác định phạm vi điện áp hiển thị điều chỉnh biến trở là: - Nếu muốn hiển thị từ - 5V phải thay đổì chương trình lập trình: - Chương trình điều khiển độ sáng đèn led biến trở hiển thị điện áp đọc từ biến trở lên LCD sau: Nội dung 3: Lập trình đọc cảm biến Yêu cầu 4: Lập trình cảm biến phát đối tượng chuyển động, nghiêng lắc hiển thị qua đèn led - Nhận xét kết nạp chương trình cho vi điều khiển rung lăc nghiêng sau: Khi chuyển tay cảm biến đọc hiển thị led Yêu cầu 5: Lập trình đọc giá trị cảm biến LM35 hiển thị độ C độ F lên Serial Monitor Arduino IDE Khi nhiệt độ 400C sáng đèn led - Ghi nhận giá trị đạt sau nạp chương trình cho vi điều khiển sau: Giá trị đo giá trị nhiệt độ phòng - Phương pháp chuyển đồi kết điện áp đọc sang nhiệt độ sử dụng LM35 float temperature = (5.0*analogRead(A0)*100.0/1024.0); Yêu cầu 6: Lập trình sử dụng cảm biến thu hồng ngoại IR 1838 để nhận tín hiệu từ remote - Ghi nhận giá trị đạt sau nạp chương trình cho vi điều khiển bấm phím remote sau: Giá trị thu giá trị bấm remote - Chương trình đọc password remote Nhận password 13579 Nếu password nhấn phím CH bàn phím để tắt mở đèn led chân 13 Nếu sai đèn nhấp nháy liên tục Nhấn phím EQ để nhập lại password Chương trình sau: #include int ledPin = 13; // chân kết nối led int RECV_PIN = 11; // chân kết nối IR receiver IRrecv irrecv(RECV_PIN); decode_results results; void setup(){ Serial.begin(9600); SVTH: Lương Thành Huy 13 Báo cáo thực hành môn Vi điều khiển Bài 02 irrecv.enableIRIn(); // khởi tạo IR receiver pinMode(ledPin, OUTPUT); // chân kết nối led cấu hình output } void loop(){ if (irrecv.decode(&results)){ // nhận tín hiệu IR Serial.println(results.value); // in giá trị tín hiệu IR nhận irrecv.resume(); // khởi động lại IR receiver if (results.value == 13579){ // password digitalWrite(ledPin, HIGH); // bật led delay(500); // đợi 0.5s digitalWrite(ledPin, LOW); // tắt led Keyboard.press(KEY_LEFT_GUI); // nhấn phím CH (Windows key) Keyboard.press('h'); Keyboard.releaseAll(); // thả phím } else{ // password sai digitalWrite(ledPin, HIGH); // bật led delay(500); // đợi 0.5s digitalWrite(ledPin, LOW); // tắt led delay(500); // đợi 0.5s digitalWrite(ledPin, HIGH); // bật led delay(500); // đợi 0.5s digitalWrite(ledPin, LOW); // tắt led delay(500); // đợi 0.5s digitalWrite(ledPin, HIGH); // bật led delay(500); // đợi 0.5s digitalWrite(ledPin, LOW); // tắt led Keyboard.press(KEY_LEFT_GUI); // nhấn phím EQ (Windows key) Keyboard.press('q'); Keyboard.releaseAll(); // thả phím } } } THỰC HÀNH MỞ RỘNG: SVTH: Lương Thành Huy 14 Báo cáo thực hành môn Vi điều khiển Bài 02 Bài 1: Viết chương trình lập trình đọc cảm biến phát lửa int flamePin = 2; // pin cảm biến phát lửa void setup() { pinMode(flamePin, INPUT); // Thiết lập chân cảm biến phát lửa input Serial.begin(9600); // Khởi tạo kết nối serial để gửi giá trị đọc từ cảm biến } void loop() { int flameValue = digitalRead(flamePin); // Đọc giá trị từ cảm biến Serial.println(flameValue); // In giá trị đọc từ cảm biến serial monitor delay(100); // Chờ 100ms trước đọc giá trị } Bài 2: Lập trình chương trình đọc thẻ RFID, nhận thẻ sáng đèn nhận khác thẻ tắt đèn #include< MFRC522> #define SS_PIN 10 #define RST_PIN MFRC522 mfrc522(SS_PIN, RST_PIN); // Khởi tạo đối tượng MFRC522 int ledPin = 13; // Chân điều khiển đèn sáng/tắt void setup() { Serial.begin(9600); // Khởi tạo kết nối seri SPI.begin(); // Khởi tạo giao tiếp SPI mfrc522.PCD_Init(); // Khởi tạo đối tượng MFRC522 pinMode(ledPin, OUTPUT); // Khởi tạo chân điều khiển đèn đầu } void loop() { // Kiểm tra xem có thẻ RFID đặt gần mô-đun đọc hay không if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) { Serial.print("Thẻ RFID: "); for (byte i = 0; i < mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(mfrc522.uid.uidByte[i], HEX); } SVTH: Lương Thành Huy 15 Báo cáo thực hành môn Vi điều khiển Bài 02 Serial.println(); // Kiểm tra thẻ RFID có khớp với thẻ định sẵn hay không if (mfrc522.uid.uidByte[0] == 0x12 && mfrc522.uid.uidByte[1] == 0x34 && mfrc522.uid.uidByte[2] == 0x56 && mfrc522.uid.uidByte[3] == 0x78) { digitalWrite(ledPin, HIGH); // Bật đèn Serial.println("Khớp với thẻ định sẵn"); } else { digitalWrite(ledPin, LOW); // Tắt đèn Serial.println("Không khớp với thẻ định sẵn"); } } mfrc522.PICC_HaltA(); // Ngừng truyền thẻ RFID } SVTH: Lương Thành Huy 16 Báo cáo thực hành môn Vi điều khiển Bài 04 Bài thực hành số 4: LẬP TRÌNH XUẤT TÍN HIỆU ÂM THANH VÀ HIỂN THỊ TRÊN CÁC LOẠI LED Nội dung 1: Phát âm loa buzz thụ động Yêu cầu 1: Viết chương trình xuất số âm khác loa buzz thụ động theo tần số Kết nhận nạp chương trình vào mạch vừa mắc sao? Âm phát thay đổi tần số thay đổi Thay đổi thông số tần số vào thời gian phát có ảnh hưởng đến âm nhận loa buzz? Nếu tần số tăng lên, âm trở nên lớn Yêu cầu 2: Viết chương trình hiển thị số đếm led đoạn đơn - Nạp chương trình cho vi điều khiển, ghi nhận kết hiển thị sau: Led đoạn thị số điếm tăng dần - Chương trình hiển thị số 0,2,4,6,8,1,3,5,7,9, sau tắt tất cả, nhấp nháy dấu chấm lần đếm ngược lại số vừa hiển thị sau: int ledPin = 13; int numbers[] = {0, 2, 4, 6, 8, 1, 3, 5, 7, 9}; int count = 10; void setup() { pinMode(ledPin, OUTPUT); Serial.begin(9600); } void loop() { for(int i = 0; i < 10; i++) { Serial.println(numbers[i]); delay(500); } digitalWrite(ledPin, LOW); delay(500); digitalWrite(ledPin, HIGH); delay(500); SVTH: Lương Thành Huy 17 Báo cáo thực hành môn Vi điều khiển Bài 04 digitalWrite(ledPin, LOW); delay(500); digitalWrite(ledPin, HIGH); delay(500); for(int i = 10; i > 0; i ) { Serial.println(i); delay(500); } } Yêu cầu 3: Viết chương trình hiển thị số đếm led đoạn led - Ghi nhận lại kết sau chạy chương trình sau: int pinA = 2; int pinB = 3; int pinC = 4; int pinD = 5; int pinE = 6; int pinF = 7; int pinG = 8; int pinDP = 9; // Khai báo chân kết nối với nút nhấn int buttonPin = 10; int buttonState = 0; // Biến đếm số lần nhấn nút int count = 0; void setup() { // Khởi tạo chân kết nối với đoạn led OUTPUT pinMode(pinA, OUTPUT); pinMode(pinB, OUTPUT); pinMode(pinC, OUTPUT); pinMode(pinD, OUTPUT); pinMode(pinE, OUTPUT); pinMode(pinF, OUTPUT); pinMode(pinG, OUTPUT); SVTH: Lương Thành Huy 18 Báo cáo thực hành môn Vi điều khiển Bài 04 pinMode(pinDP, OUTPUT); // Khởi tạo chân kết nối với nút nhấn INPUT pinMode(buttonPin, INPUT); } void loop() { // Đọc trạng thái nút nhấn buttonState = digitalRead(buttonPin); // Nếu nút nhấn nhấn if (buttonState == HIGH) { // Tăng biến đếm lên count++; // Nếu biến đếm vượt 9999 thiết lập lại if (count > 9999) { count = 0; } } - Viết chương trình hiển thị phút led giây led với dấu chấm nhóm làm phần ngăn cách (Gợi ý: lệnh hiển thị số thực: sevseg.setNumberF(số thực, 2); ) #include "SevSeg.h" // Khai báo chân kết nối đến led đoạn SevSeg sevseg; // Khai báo biến lưu trữ thời gian uint8_t minute = 0; uint8_t second = 0; void setup() { // Thiết lập chân kết nối đến led đoạn byte numDigits = 4; byte digitPins[] = {2, 3, 4, 5}; byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13}; bool resistorsOnSegments = false; bool updateWithDelays = false; byte hardwareConfig = COMMON_CATHODE; sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments, updateWithDelays); // Thiết lập độ sáng cho led đoạn sevseg.setBrightness(100); } void loop() { // Lấy thời gian SVTH: Lương Thành Huy 19