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[.]
Trang 1- -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: DIEN0120.
Nhóm: 02
Học kỳ 2 Năm học: 2022 - 2023
Trang 2Bà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 và 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 về kết quả nhận được sau khi nạp chương trình mẫu như sau:
int ledPin = 13; // Pin kết nối với LED
- Chương trình thay đổi thời gian đáp ứng đóng 1 giây, ngắt 2 giây của 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 trong 1 giây
digitalWrite(ledPin, LOW); // tắt led
delay(2000); // tắt led trong 2 giây
Xin cam kết số liệu báo cáo, các câu trả lời là do tự cá nhân làm và số liệu ghi nhận được từ thí nghiệm, không có sao chép của bất kỳ ai Nếu có sự sao chép bất kì nội dung nào sẽ nhận điểm 0 (không)
Người cam kết ký và ghi rõ họ tên:
Trang 3- Sinh viên nhập chương trình mẫu thứ 2 vào Arduino IDE kiểm tra hoạt động
và cho nhận xét với code đã nhập ở tiểu mục 2.
Bài 1: chương trình lập trình điều khiển 8 led sáng tắt luân phiên theo kiểu led sao
băng như sau:
int ledPins[] = {2, 3, 4, 5, 6, 7, 8, 9}; // Khai báo mảng các chân LED
void setup() {
for (int i=0; i<8; i++) {
pinMode(ledPins[i], OUTPUT); // Thiết lập chân LED là OUTPUT
Trang 4}
void loop() {
for (int i=0; i<8; i++) {
digitalWrite(ledPins[i], HIGH); // Bật LED
delay(100); // Chờ 100ms
digitalWrite(ledPins[i], LOW); // Tắt LED
}
for (int i=6; i>=1; i ) {
digitalWrite(ledPins[i], HIGH); // Bật LED
delay(100); // Chờ 100ms
digitalWrite(ledPins[i], LOW); // Tắt LED
}
}
Bài 2: Chương trình lập trình điều khiển 8 led sáng tắt theo kiểu ngẫu nhiên như sau:
int ledPins[] = {2, 3, 4, 5, 6, 7, 8, 9}; // Khai báo mảng chứa các chân của các LED
int delayTime = 1000; // Thời gian chờ giữa các lần bật tắt LED
void setup() {
for (int i = 0; i < 8; i++) {
pinMode(ledPins[i], OUTPUT); // Cấu hình chân của LED là OUTPUT
}
}
void loop() {
int randomLed = random(8); // Chọn ngẫu nhiên một LED để bật tắt
digitalWrite(ledPins[randomLed], HIGH); // Bật LED đã chọn
delay(delayTime); // Chờ một khoảng thời gian
digitalWrite(ledPins[randomLed], LOW); // Tắt LED đã chọn
delay(delayTime); // Chờ một khoảng thời gian
}
Bài 3: Chương trình điều khiển độ sáng của led sáng lên dần và tắt dần theo thời gian.
int brightness = 0; // độ sáng ban đầu của LED
int fadeAmount = 5; // tỉ lệ giảm độ sáng của LED
Trang 6Bài thực hành số 2:
LẬP TRÌNH PHƯƠNG THỨC GIAO TIẾP UART, I2C, SPI
NỘI DUNG BÁO CÁO
Nội dung 1: Lập trình giao tiếp UART với máy tính
Yêu cầu 1: Viết chương trình gởi dữ liệu từ Arduino lên máy tính và hiển thị kết quả gởi
thông qua cửa sổ Arduino IDE.
- Nhận xét về kết quả hoạt động của chương trình mẫu:
Trang 7int number = 1234; // Khởi tạo số nguyên
void setup() {
Serial.begin(9600); // Khởi tạo kết nối Serial với tốc độ truyền 9600 bps
}
void loop() {
Serial.println("Text: " + String(number)); // In giá trị dưới dạng text
Serial.print("Decimal: "); // In giá trị dưới dạng số thập phân
- Ghi nhận lại kết quả sau 2 vòng chương trình chính như sau:
Yêu cầu 3: Viết chương trình đọc số gởi từ máy tính xuống Arduino và điều chỉnh thời gian nhấp nháy tương ứng với số vừa nhập.
float millivolts = (value / 1024.0) * 5000;
float celsius = millivolts / 10 ;
Serial.print(celsius);
Serial.print(" degrees Celsius, ");
Trang 8int ledPin = 13; //khởi tạo đầu ra được kết nối với LED
int incomingByte = 0; //khởi tạo biến để nhận dữ liệu từ máy tính
void setup() {
pinMode(ledPin, OUTPUT); //khởi tạo chế độ đầu ra cho đầu ra LED
Serial.begin(9600); //khởi tạo kết nối Serial với tốc độ baud là 9600
}
void loop() {
if (Serial.available() > 0) { //kiểm tra nếu dữ liệu có sẵn để đọc
incomingByte = Serial.read(); //đọc dữ liệu vào biến incomingByte
if (incomingByte == '0') { //nếu nhập số 0
digitalWrite(ledPin, LOW); //tắt đèn LED
}
else { //nếu nhập số khác 0
digitalWrite(ledPin, HIGH); //bật đèn LED
delay(incomingByte * 100); //nhấp nháy đèn LED tương ứng với số liệu được nhập vàodigitalWrite(ledPin, LOW); //tắt đèn LED
delay(incomingByte * 100); //chờ một khoảng thời gian trước khi quay lại vòng lặp
}
}
Trang 9 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 quả thu được từ chương trình mẫu:
- Lập trình chương trình hiển thị thông tin sinh viên gồm Họ và tên trên dòng trên,
mã số sinh viên và lớp luân phiên thay đổi ở dòng dưới
lcd.setCursor(0,0); // Đặt vị trí con trỏ tại hàng thứ nhất, cột đầu tiên
lcd.print(''Luong Thanh Huy ");
lcd.setCursor(0,1);
lcd.print(''2000982");
Trang 10delay(1000); // Đợi 1 giây
lcd.clear(); // Xóa màn hình
delay(1000); // Đợi 1 giây
}
Trang 11Bài thực hành số 3:
LẬP TRÌNH ĐỌC TÍN HIỆU SỐ, TÍN HIỆU TƯƠNG TỰ
VÀ TÍN HIỆU TỪ CÁC CẢM BIẾN
NỘI DUNG BÁO CÁO
Nội dung 1: Đọc tín hiệu số từ nút nhấn
Yêu cầu 1: Viết chương trình đọc nút nhấn, hiển thị kết quả nhấn nút qua led và qua Serial Monitor.
Trang 12- Nhấn nút và giữ, ghi nhận kết quả hiển thị trên led và trên Serial Monitor như sau:Hiển thị nút đã được nhấn.
- Chương trình lập trình đọc nút nhấn, mỗi lần nhấn thì đổi trạng thái, khi nhất giữtrạng thái không thai đổi (chọn tác động xung cạnh lên hoặc xung cạnh xuống của nút nhấn)như 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ờ giữa các lần đọc trạng thái nút nhấnint buttonState = HIGH; // Trạng thái nút nhấn hiện tại
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 cùng
int reading = digitalRead(BUTTON_PIN);
// Kiểm tra xem trạng thái hiện tạ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 cùng
lastDebounceTime = millis();
}
// Kiểm tra xem đã đủ thời gian chờ giữa các lần đọc trạng thái chưa
if ((millis() - lastDebounceTime) > DEBOUNCE_DELAY) {
// Nếu trạng thái hiện tại khác với trạng thái trước đó
Màn hình lcd hiển thị các kí tự trên 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 là 13579 Nếuđúng password thì nhấn phím = trên bàn phím để tắt và mở đèn led tại chân 13 Nếu sai thìđèn nhấp nháy liên tục Nhấn phím C để nhập lại password
Trang 13int password = 13579; // đặt password cần nhập vào
int ledPin = 13; // đặt chân led
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 được từ
biến trở.
Trang 14- Ghi nhận kết quả thu được và cho nhận xét kết quả thu được khi điểu chỉnh biếntrở:
Khi thay đổi điều chỉnh biến trở thời gian led hiển thị lâu hơn
- Mắc nối tiếp biến trở vởi điện trở, hãy xác định phạm vi điện áp được hiển thị khiđiều chỉnh biến trở là:
- Nếu muốn hiển thị từ 0 - 5V thì phải thay đổì trong chương trình lập trình:
- Chương trình điều khiển độ sáng đèn led bằng biến trở và hiển thị điện áp đọcđược từ biến trở lên LCD như 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 hiện đối tượng chuyển động, nghiêng hoặc lắc và hiển
thị qua đèn led.
- Nhận xét kết quả khi nạp chương trình cho vi điều khiển và rung lăc hoặc nghiêng như sau:
Khi duy chuyển tay cảm biến đọc được và hiển thị ra led
Yêu cầu 5: Lập trình đọc giá trị cảm biến LM35 và hiển thị độ C và độ F lên Serial Monitor của Arduino IDE Khi nhiệt độ quá 400C thì sáng đèn led.
- Ghi nhận giá trị đạt được sau khi nạp chương trình cho vi điều khiển như sau:
Giá trị đo được bằng giá trị nhiệt độ phòng
- Phương pháp chuyển đồi kết quả điện áp đọc đượ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 được sau khi nạp chương trình cho vi điều khiển và bấm các phímtrên remote như sau:
Giá trị thu được là các giá trị đã được bấm trên remote
- Chương trình đọc password remote Nhận password là 13579 Nếu đúng password thìnhấn phím CH trên bàn phím để tắt và mở đèn led tại chân 13 Nếu sai thì đèn nhấp nháyliên tục Nhấn phím EQ để nhập lại password Chương trình như sau:
#include<RECV.h>
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);
Trang 15irrecv.enableIRIn(); // khởi tạo IR receiver
pinMode(ledPin, OUTPUT); // chân kết nối led được cấu hình là output
}
void loop(){
if (irrecv.decode(&results)){ // nếu nhận được tín hiệu IR
Serial.println(results.value); // in giá trị tín hiệu IR nhận được
irrecv.resume(); // khởi động lại IR receiver
if (results.value == 13579){ // nếu password đúng
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{ // nếu password sai
digitalWrite(ledPin, HIGH); // bật led
digitalWrite(ledPin, LOW); // tắt led
Keyboard.press(KEY_LEFT_GUI); // nhấn phím EQ (Windows key)
Trang 16Bài 1: Viết chương trình lập trình đọc cảm biến phát hiện lửa.
int flamePin = 2; // pin của cảm biến phát hiện lửa
void setup() {
pinMode(flamePin, INPUT); // Thiết lập chân của cảm biến phát hiện lửa là input
Serial.begin(9600); // Khởi tạo kết nối serial để gửi giá trị đọc đượ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 được từ cảm biến ra serial monitor
delay(100); // Chờ 100ms trước khi đọc giá trị tiếp theo
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 là đầu ra
}
void loop() {
// Kiểm tra xem có thẻ RFID được đặt gần mô-đun đọc hay không
if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
Trang 17// Kiểm tra thẻ RFID có khớp với thẻ được đị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) {
Trang 18Bà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 thanh ra loa buzz thụ động
Yêu cầu 1: Viết chương trình xuất được một số âm thanh khác nhau ra loa buzz thụ
động theo tần số.
Kết quả nhận được khi nạp chương trình vào mạch vừa mắc ra sao?
Âm thanh phát ra thay đổi khi tần số thay đổi
Thay đổi các thông số tần số vào thời gian phát có ảnh hưởng ra sao đến âm thanhnhận được trên loa buzz?
Nếu tần số được tăng lên, âm thanh sẽ trở nên lớn hơn
Yêu cầu 2: Viết chương trình hiển thị số đếm ra led 7 đoạn đơn.
- Nạp chương trình cho vi điều khiển, ghi nhận kết quả hiển thị như sau:
Led 7 đoạn hiện thị các số điếm và tăng dần
- Chương trình hiển thị số lần lượt 0,2,4,6,8,1,3,5,7,9, sau đó tắt tất cả, nhấp nháy dấuchấm 2 lần và đếm ngược lại các số vừa hiển thị như sau:
Trang 19Yêu cầu 3: Viết chương trình hiển thị số đếm ra led 7 đoạn 4 led.
- Ghi nhận lại kết quả sau khi chạy chương trình như sau:
Trang 20- Viết chương trình hiển thị phút trên 2 led và giây trên 2 led với dấu chấm ở giữa 2
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,
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 7 đoạn
Trang 21uint32_t currentTime = millis();
// Hiển thị phút và giây trên các led 7 đoạn
uint8_t digits[] = {minute / 10, minute % 10, second / 10, second % 10};
sevseg.setNumberF(digits[0] * 10 + digits[1] + digits[2] * 0.1 + digits[3] * 0.01, 2);// Tạm dừng 1 giây
delay(1000);
}
Yêu cầu 4: Viết chương trình sử dụng IC 74HC595.
- Kiểm tra kết quả lập trình bằng mạch thực tế và ghi nhận lại kết quả như sau:
shiftOut(SHIFT_DATA, SHIFT_CLOCK, MSBFIRST, 0);
// Loop through each LED
for (int i = 0; i < 8; i++) {
// Set the bit at the current LED index to HIGH
shiftOut(SHIFT_DATA, SHIFT_CLOCK, MSBFIRST, 1 << i);
// Latch the data
Trang 22- Kiểm tra kết quả lập trình bằng mạch thực tế và ghi nhận lại kết quả.
#define DIN 8 //Data pin
for(int col=0; col<8; col++) {
shiftOut(DIN, CLK, MSBFIRST, ledMatrix[row][col]);
Trang 23Bài thực hành số 5:
LẬP TRÌNH ĐIỀU KHIỂN ĐỘNG CƠ
NỘI DUNG BÁO CÁO
Nội dung 1: Điều khiển nguồn thiết bị thông qua điều khiển relay
Yêu cầu 1: Viết chương trình điều khiển đóng ngắt nguồn điện cho led thông qua điều
khiển relay.
- Nạp chương trình cho mạch và ghi nhận lại kết quả thu được
Sau khi nạp chương trình vào board Arduino, LED sẽ được điều khiển đóng ngắttheo chu kỳ 15 giây
- Sinh viên viết chương trình đọc cảm biến mưa để điều khiển đóng ngắt relay như trên Khi có mưa, relay đóng trong thời gian 20 giây sau đó giữa trạng thái tắt Khi không có mưa (hết mưa), relay đóng trong 10 giây sau đó giữa trạng thái tắt
const int rainSensorPin = A0;
// Khai báo chân kết nối với relay
const int relayPin = 8;
// Ngưỡng cảm biến mưa
const int rainThreshold = 500;
// Đọc giá trị từ cảm biến mưa
int rainValue = analogRead(rainSensorPin);
// Nếu giá trị lớn hơn ngưỡng, đóng relay trong 20 giây
Trang 24digitalWrite(relayPin, LOW);
}
Nội dung 2: Điều khiển động cơ Servo
Yêu cầu 2: Lập trình điều khiển động cơ Servo SG90
- Ghi nhận kết quả thu được và cho nhận xét kết quả thu được
Kết quả thu được là động cơ Servo SG90 sẽ quay từ góc 0 đến góc 180 độ, mỗi lần quaymột góc nhất định và có khoảng thời gian chờ giữa các lần quay
- Lập trình chương trình hiển thị góc quay lên LCD
Nội dung 3: Điều khiển động cơ bước
Yêu cầu 4: Lập trình điều khiển động cơ bước 28BYJ-48.
- Kiểm tra kết quả lập trình bằng mạch thực tế
const int stepsPerRevolution = 2048;
int pin1 = 8;
int pin2 = 9;
int pin3 = 10;
Trang 25int pin4 = 11;
// Khởi tạo động cơ
Stepper myStepper(stepsPerRevolution, pin1, pin2, pin3, pin4);
// Lấy giá trị của cảm biến xoay
int sensorValue = analogRead(A0);
// Tính toán chiều quay dựa trên giá trị của cảm biến