Professional Documents
Culture Documents
THIẾT KẾ GIAO DIỆN VÀ LẬP TRÌNH ĐIỀU KHIỂN HỆ THỐNG PIN MẶT TRỜI
Nhóm : 20
Hà Nội, 20/10/2022
1
MỤC LỤC
2
CHƯƠNG I: TỔNG QUAN
1. Lý do chọn đề tài
Việt Nam được xem là một quốc gia có tiềm năng rất lớn về năng lượng mặt trời do
có sẵn quanh năm, khá ổn định và phân bố rộng rãi trên các vùng miền của đất nước.
Tổng số giờ nắng trong năm tại các tỉnh miền Bắc bình quân từ 1.800 - 2.100 giờ (N.T.N.
Tuất và cộng sự), các vùng miền Trung và miền Nam khoảng 1.400 - 3.000 giờ; số ngày
nắng trung bình trên các tỉnh miền Trung và miền Nam là khoảng 300 ngày/năm. Bên
cạnh đó, cường độ bức xạ mặt trời trung bình nhận được tại mặt đất dao động trong
khoảng 3,54 - 5,15 kWh/m2/ngày và tăng dần từ Bắc vào Nam (H.T.T. Hường, 2014;
Nguyen N.H., 2013) và tiềm năng lý thuyết được đánh giá khoảng 43,9 tỷ TOE/năm
(N.T.N. Tuất và cộng sự). Tuy nhiên, việc khai thác và sử dụng nguồn năng lượng này
hiện nay còn hạn chế, chỉ khoảng 1,2 - 3 MWp (H.T.T. Hường, 2014; N.T.N. Tuất và
cộng sự). Các hoạt động nghiên cứu và sử dụng năng lượng mặt trời ở Việt Nam tập
trung vào một số lĩnh vực như cung cấp nước nóng dùng trong sinh hoạt và phát điện ở
quy mô nhỏ; sấy, nấu ăn, chưng cất nước... ở quy mô thử nghiệm nhỏ, chưa đáng kể.
Xuất phát từ yêu cầu thực tế và được sự đồng ý của Giáo viên hướng dẫn, nhóm em thực
hiện đề tài “Thiết kế mô hình tự động điều hướng pin mặt trời (Tracking Solar)” với
mong muốn khi đề tài được ứng dụng trong thực tế sẽ tạo ra những thiết bị cỡ nhỏ hữu
ích phát năng lượng (điện) trong các gia đình, Và làm cơ sở để tạo nên những trạm điện
mặt trời trong tương lai.
2. Mục tiêu nghiên cứu
- Nâng cao hiệu suất chuyển đổi của tấm pin thông qua việc điều khiển vị trí tấm
pin luôn luôn vuông góc với tia sáng mặt trời chiếu tới.
- Thiết kế mô hình điều hướng xoay theo 2 trục.
- Xây dựng thuật toán điều hướng pin mặt trời theo thời gian thực và điều khiển vị trí
dùng bộ điều khiển Arduino
3
Mô hình pin mặt trời tự động hiều hướng của người dân.
-Chứng minh hiệu quả của việc ứng dụng mô hình tự động điều hướng
pin mặt trời vào sinh hoạt nói riêng cũng như góp phần cải thiện môi
trường, đẩy mạnh nguồn tài nguyên mới nói chung.
- Việc sử dụng thiết bị năng lượng mặt trời vào sinh hoạt hằng ngày
có ý nghĩa rất lời trong việc tiết kiệm năng lượng và bảo vệ môi trường.
- Mở ra hướng đi mới trong công cuộc khai thác tài nguyên thiên nhiên
có sẵn để phục vụ con người.
4
CHƯƠNG II: PHÂN TÍCH VÀ THIẾT KẾ
1. Linh kiện phần cứng
1.1. Arduino Uno R3
Arduino UNO R3 là kit Arduino UNO thế hệ thứ 3, với khả năng lập trình cho các
ứng dụng điều khiển phức tạp do được trang bị cấu hình mạnh cho các loại bộ nhớ ROM,
RAM và Flash, các ngõ vào ra digital I/O trong đó có nhiều ngõ có khả năng xuất tín hiệu
PWM, các ngõ đọc tín hiệu analog và các chuẩn giao tiếp đa dạng như UART, SPI, TWI
(I2C). Arduino UNO R3 sử dụng vi điều khiển Atmega328p, bộ kit có 14 chân Digital
I/O (6 chân hardware PWM) và 6 chân Analog với độ phân giải là10 bit. Trong bài tập
này, Arduino Uno R3 được dùng để điều khiển cho hai động cơ Servo SG90 để điều
khiển hai trục quay cho hệ thống pin mặt trời (giả định).
5
1.2. Động cơ Servo SG90
Động cơ Servo SG90 (góc quay 180) là Servo phổ biến dùng trong các mô hình
điều khiển nhỏ và đơn giản như cánh tay robot. Động cơ có tốc độ phản ứng nhanh, được
tích hợp sẵn Driver điều khiển động cơ, dễ dàng điều khiển góc quay bằng phương pháp
điều độ rộng xung PWM.
Động cơ có 3 dây nối gồm 2 dây cấp nguồn 5V, GND và 1 dây nhận tín hiệu điều
khiển (tín hiệu digital) từ vi điều khiển.
6
Quang trở là một loại điện trở có giá trị điện trở thay đổi phụ thuộc vào cường độ
ánh sáng. Quang trở CDS 5mm có giá trị điện trở tỉ lệ nghịch với cường độ ánh sáng và
có giá trị trong bóng tối là 2MΩ .
Các giá trị cảm biến từ quang trở (cường độ ánh sáng) được sử dụng làm thông số
đầu vào cho bài toán điều hướng của hệ thống pin mặt trời (giả định).
2. Sơ đồ nguyên lý
5000
I=
1000+ R
7
Bài toán chấp nhận sai số là 50 giá trị tương tự đo được (∼ 0,2 44 V ). Hệ thống cảm
biến bao gồm 4 quang trở sẽ làm nhiệm vụ tiếp nhận ánh sáng từ nguồn sáng. Giữa 4
quang trở này sẽ có một vách ngăn hình chữ Thập làm nhiệm vụ phân chia 4 cảm biến
quang trở thành 4 hướng khác nhau riêng biệt
Vách ngăn này sẽ làm nhiệm vụ định hướng cho 4 quang trở luôn luôn hướng về
phía có nguồn sáng mạnh nhất, cụ thể là Mặt trời. Khi cụm cảm biến vuông góc với tia
bức xạ của mặt trời, giá trị của 4 cảm biến sẽ bằng nhau. Tín hiệu từ cụm cảm biến sẽ
được truyền trực tiếp về phần tử trung tâm điều khiển Arduino.
8
Hình ảnh tổng quát về mô hình
9
Baudrate
Như trong ví dụ về việc truyền 1 bit data sau mỗi 1 micro giây, ta nhận thấy rằng để việc
giao tiếp diễn ra thành công, giữa 2 thiết bị cần có những thống nhất rõ ràng về khoảng
thời gian truyền cho mỗi bit dữ liệu, hay nói cách khác tốc độ truyền cần phải được thống
nhất với nhau. Tốc độ này được gọi là tốc độ baud (baudrate), được định nghĩa là số bit
truyền trong mỗi giây. Ví dụ, nếu tốc độ baud được sử dụng là 9600, có nghĩa thời gian
truyền cho 1 bit là 1/9600 = 104.167 micro giây.
Khung truyền (frame)
Bên cạnh tốc độ baud, khung truyền đối với chuẩn giao tiếp Serial cũng hết sức quan
trọng để đảm bảo việc truyền nhận được diễn ra chính xác. Khung truyền quy định về số
lượng bit truyền trong mỗi lần truyền, bao gồm start bit, các bit data, stop bits, ngoài ra
còn có thể có parity bit (kiểm tra lỗi dữ liệu trong quá trình truyền nhận).
Start bit
Đây là bit đầu tiên được truyền vào khung truyền, có chức năng thông báo cho thiết bị
nhận biết đang có một chuỗi dữ liệu sắp truyền đến. Đối với các dòng AVR nói chung và
UnoX nói riêng, ở trạng thái chưa có dữ liệu (Idle) đường truyền luôn kéo lên mức cao.
Khi có dữ liệu mới, đường truyền được kéo xuống mức thấp, do đó start bit sẽ được quy
định là mức 0.
Dữ liệu (data)
Dữ liệu cần truyền thông thường gồm 8 bits, tuy nhiên chúng ta hoàn toàn có thể tùy
chỉnh số lượng bit data cho một gói tin, có thể là 5, 6, 7, 9… Trong quá trình truyền, bit
có trọng số thấp nhất (LSB) sẽ được truyền trước, và cuối cùng sẽ là bit có trọng số cao
nhất (MSB).
Stop bits
Stop bits là một hoặc nhiều bit có chức năng thông báo cho thiết bị nhận biết rằng một
gói dữ liệu đã được gởi xong. Đây là bit quan trọng, cần phải có trong một khung truyền.
Giá trị của các stop bit luôn bằng mức Idle (mức nghỉ) và ngược với giá trị của start bit.
Đối với các dòng vi điều khiển AVR các bit kết thúc này luôn là mức cao.
5. Sơ đồ giải thuật
10
CHƯƠNG III: LẬP TRÌNH ĐIỀU KHIỂN ARDUINO
1. Code arduino
1.1. Khai báo và hàm setup
#include <Servo.h> // thêm thư viện Servo
Servo horizontal; // Tạo đối tượng Servo quay theo chiều ngang
int servoh = 90; // Khởi tạo góc quay ban đầu
int servohLimitHigh = 180; // Góc quay max
int servohLimitLow = 0; // Góc quay min
Servo vertical; // Tạo đối tượng quay theo chiều dọc
int servov = 90; // Khởi tạo góc quay ban đầu
int servovLimitHigh = 180; // Góc quay max
11
int servovLimitLow = 0; // Góc quay min
// Kết nối chân các biến trở(quang trở)
int ldrlt = 0; //LDR top left // ldrlt | ldrrt
int ldrrt = 1; //LDR top rigt // |
// ----------------------
int ldrld = 2; //LDR down left // ldrld | ldrrd
// |
int ldrrd = 3; //LDR down rigt
int tg1;
int tg2;
void setup() //Thiết lập
{
Serial.begin(9600); // Giao tiếp nối tiếp giữa Arduino và máy tính
//Muốn điều khiển đầu tiên cần attach
horizontal.attach(9); // attach servo ngang nối ở chân số 9
vertical.attach(10); // attach servo dọc nối ở chân số 10
horizontal.write(90); // Thiết lập góc quay ban đầu servo ngang
vertical.write(90); // Thiết lập góc quay ban đầu servo dọc
delay(500);
12
int ld = analogRead(ldrld); // down left
int rd = analogRead(ldrrd); // down right
int dtime = 10; int tol = 50;
int avt = (lt + rt) / 2; //Đọc giá trị trung bình
int avd = (ld + rd) / 2;
int avl = (lt + ld) / 2;
int avr = (rt + rd) / 2;
int dvert = avt - avd; // tính hiệu số của quang trở trên và dưới
int dhoriz = avl - avr;// tính hiệu số của quang trở trái và phải
if (-1*tol > dvert || dvert > tol) // Hiệu số dọc lớn hơn sai số thì bắt đầu cho khởi
động servo đến khi hiệu số nhỏ hơn sai số
{
if (avt > avd)
{
servov = ++servov;
delay(50);
if (servov > servovLimitHigh)
{
servov = servovLimitHigh;
}
}
else if (avt < avd)
{
servov= --servov;
delay(50);
if (servov < servovLimitLow)
{
servov = servovLimitLow;
}
13
}
vertical.write(servov);
}
if (-1*tol > dhoriz || dhoriz > tol) // Hiệu số ngang lớn hơn sai số thì cho khởi
động servo đến khi hiệu số nhỏ hơn sai số
{
if (avl > avr)
{
servoh = --servoh;
delay(50);
if (servoh < servohLimitLow)
{
servoh = servohLimitLow;
}
}
else if (avl < avr)
{
servoh = ++servoh;
delay(50);
if (servoh > servohLimitHigh)
{
servoh = servohLimitHigh;
}
}
else if (avl = avr)
{
// nothing
}
14
horizontal.write(servoh);
}
delay(dtime);
}
if(Serial.available())
{
char chosen = Serial.read();
int goc = Serial.parseInt();
15
Serial.print(tg1); //tg là các biến trung gian để lưu lại, các kí tự s,e,a,m là các nút
bấm bên giao diện của QT creator.
Serial.print(tg2);
if(chosen=='s')
{
tg1=1;
}
if(chosen=='e')
{
tg1=0;
tg2=3;
}
if(chosen=='a')
{
tg2=1;
}
if(chosen=='m')
{
tg2=2;
}
Serial.print(tg1);
Serial.print(tg2);
if(tg1==1&&tg2==2)
{
Manual(chosen,goc);
}
}
if(tg1==1&&tg2==1)
{
16
Auto();
}
}
2. Lập trình giao diện QT Creator
2.1. Giao diện
2.2. Code
17
18
19
TÀI LIỆU THAM KHẢO
1. https://www.youtube.com/watch?v=GkJ ny_plQE&t=331s&ab_channel=ICVS
%C3%A1ngT%E1%BA%A1o
2. https://www.youtube.com/playlist?
list=PLUbFnGajtZlXbrbdlraCe3LMC_YH5abao
20
3. https://create.arduino.cc/projecthub?
_gl=1*7j5giu*_ga*MzM4NTk1MDAyLjE2NjM5ODI1ODc.*_ga_NEXN8H46L5
*MTY2NjUzNjU3My42LjEuMTY2NjUzNjU4Ny4wLjAuMA..
21
22
23