Professional Documents
Culture Documents
TRƯỜNG CƠ KHÍ
KHOA CƠ ĐIỆN TỬ
-----*------
Đề tài:
Bộ điều hướng pin mặt trời 2 trục quay theo hướng sáng
MỤ C LỤ C
SVTH: ................... 1
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn
SVTH: ................... 2
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn
I. ĐẶT VẤN ĐỀ
- Thế kỉ XXI, nhu cầu năng lượng ngày càng gia tăng và trở thành vấn đề vô
cùng quan trọng ở tất cả các quốc gia trên thế giới. Trong bối cảnh các
nguồn năng lượng phổ biến như thủy điện, nhiệt điện ngày càng cạn kiệt,
việc sản xuất điện bằng các nhà máy thủy điện, nhiệt điện gây ra ô nhiễm
môi trường và thay đổi môi trường sinh thái. Để đáp ứng được nhu cầu về
điện ngày càng tăng cao, con người đang dần chuyển đổi sang sử dụng các
nguồn năng lượng mới như gió, mặt trời, địa nhiệt, thủy triều.
- Năng lượng mặt trời là một trong những giải pháp được tìm ra để thay thế,
với ưu điểm là nguồn năng lượng tái tạo, dồi dào, lại thân thiện với môi
trường. Ứng dụng công nghệ chuyển hóa quang năng thành điện năng đã trở
thành xu thế mới để dần thay thế các nguồn điện sử dụng tài nguyên môi
trường.
- Việt Nam chúng ta là một trong những quốc gia nằm ở vị trí địa lý có
nguồn bức xạ năng lượng mặt trời dồi dào, đặc biệt ở các tỉnh Nam Trung
Bộ, Tây Nguyên và Nam Bộ. Tuy nhiên khả năng khai thác nguồn tài
nguyên gần như vô hạn này còn gặp nhiều hạn chế trong việc tối ưu lượng
công suất tạo ra được từ bức xạ mặt trời.
- Hầu hết các hệ thống pin mặt trời ở nước ta hiện nay đều ở dạng lắp đặt cố
định dẫn tới lượng công suất mặt trời tạo ra chỉ tập trung ở một số thời điểm
trong ngày, do đó làm giảm khả năng tạo ra lượng công suất mặt trời của hệ
thống. Mặt khác pin cũng chịu ảnh hưởng của thời tiết, mây, …. Do đó, giải
pháp tăng hiệu suất pin mặt trời bằng hệ thống hướng sáng là một trong
những cách hiệu quả để chúng ta tận dụng nguồn năng lượng được coi là vô
hạn này.
SVTH: ................... 3
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn
SVTH: ................... 4
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn
SVTH: ................... 5
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn
- Board chứa tất cả mọi thứ cần thiết để hỗ trợ các vi điều khiển, kết nối board
với máy tính bằng cáp USB hoặc sử dụng nó với một bộ chuyển đổi AC sang
DC hay pin để bắt đầu.
- Hiện nay Arduino đang được ưa chuộng vì độ dễ sử dụng cũng như đa dạng về
chức năng của nó. Chức năng đọc điện áp trên các chân Analog và sử dụng
chức năng phát xung PWM trên các chân Digital của board để điều khiển động
cơ servo.
- Chân PWM (~): 3, 5, 6, 9, 10, và 11: cho phép xuất ra xung PWM với độ
phân giải 8bit (giá trị từ 0 → 28-1 tương ứng với 0V → 5V). Nói một cách đơn
giản, bạn có thể điều chỉnh được điện áp ra ở chân này từ mức 0V đến 5V thay
vì chỉ cố định ở mức 0V và 5V như những chân khác.
- Thông số kỹ thuật của Arduino board:
SVTH: ................... 6
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn
Arduino R3 Atmega328
1.2.3. Cơ cấu chấp hành hệ thống
Động cơ được sử dụng là động cơ Servo SG90 góc quay 180 độ.
- Động cơ servo được thiết kế cho những hệ thống hồi tiếp vòng kín. Tín hiệu ra
của động cơ được nối với một mạch điều khiển. Khi động cơ quay, vận tốc và vị
trí sẽ được hồi tiếp về mạch điều khiển này.
- Nếu có bầt kỳ lý do nào ngăn cản chuyển động quay của động cơ, cơ cấu hồi
tiếp sẽ nhận thấy tín hiệu ra chưa đạt được vị trí mong muốn. Mạch điều khiển
tiếp tục chỉnh sai lệch cho động cơ đạt được điểm chính xác.
- Độ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ơ Servo SG 90
* Bảng thông số của động cơ Servo SG90:
SVTH: ................... 7
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn
SVTH: ................... 8
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn
Tín hiệu từ 4 quang trở được đọc từ chân A0, A1,A2,A3 của Arduino:
LDR5 A0
LDR6 A1
LDR7 A2
LDR8 A3
SVTH: ................... 9
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn
+ Dựa vào hình trên ta thấy, khi ánh sáng chiếu không vuông góc so với 2
quang trở, thì LDR1 sẽ đi vào vùng tối và LDR2 sẽ nhận ánh sáng. Giá trị điện
trở trên LDR2 giảm mạnh, và giá trị điện trở trên LDR1 lại tăng lên rất nhiều.
Lúc này hai quang trở sẽ có điện trở chênh lệch khác nhau, dựa vào đặc điểm
này của quang trở, ta có thể thiết kế mạch so sánh điện áp giữa hai LDR từ đó
đưa ra hướng điều khiển cho thích hợp.
+ Với việc sắp xếp 4 quang trở được ngăn cách nhau tại 4 góc trên 1 mặt phẳng,
lượng ánh sáng mỗi quang trở nhận được là khác nhau, dẫn tới giá trị điện trở
của mỗi quang trở là khác nhau.
+ Dựa vào giá trị nhận được của mỗi quang trở, bộ điều khiển sẽ so sánh, xử lý,
điều khiển động cơ Servo để điều hướng hướng 4 quang trở hướng về nơi có
ánh sáng mà giá trị điện trở của 4 quang trở bằng nhau.
SVTH: ................... 10
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn
SVTH: ................... 11
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn
SVTH: ................... 12
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn
+ Sử dụng hàm write() khi cần thay đổi góc quay của Servo:
SVTH: ................... 13
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn
Bước 3: Sau khi đã tạo được giao diện đầu tiên, ta tiến hành kéo thả vào giao
diện các đối tượng cần thiết cho giao diện như Button, Label, Chart, … trong
Toolbox.
SVTH: ................... 14
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn
Bước 4: Sau khi đã có đầy đủ các đối tượng cần thiết, ta tiến hành chỉnh sửa
màu sắc, độ lớn, … của các đối tượng cho hợp lí thông qua phần “Properties”.
Và ta được kết quả như sau:
Tuy nhiên đây mới chỉ là phần vỏ ngoài của giao diện, vẫn chưa thể kết nối
được với vi điều khiển. Vì vậy chúng ta cần lập trình thông qua các đối tượng
trong giao diện để có thể kết nối với thiết bị ngoại vi.
SVTH: ................... 15
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn
Đoạn mã trên giúp ta thêm vào hộp comboBox1 cổng COM của máy tính khi ta
tiến hành cắm dây cáp. Tiếp theo, ta thiết lập tốc độ truyền thông qua đoạn mã:
Lưu ý trước khi thêm hai đoạn mã trên ta cần thêm thư viện:
Để việc kết nối/ngắt kết nối được dễ dàng, ta thêm hai nút Connet và
Disconnect, sau đó thêm đoạn mã sau:
SVTH: ................... 16
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn
- Như vậy, việc kết nối từ máy tính với Arduino đã hoàn tất. Tiếp theo chúng ta
sẽ lập trình thu nhận dữ liệu từ Arduino và hiển thị ra màn hình giao diện.
3.3. Thu nhận dữ liệu và xây dựng đồ thị
- Để thu nhận dữ liệu từ Arduino, mà cụ thể là dữ liệu về các góc quay của
servo và điện áp của quang trờ, trước tiên ta cần đóng gói dữ liệu bằng đoạn mã
trong Arduino IDE như sau:
- Tiếp theo để tách các dữ liệu nhận được từ Arduino, ta thêm vào trong giao
diện đoạn mã :
SVTH: ................... 17
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn
- Cuối cùng, để hiển thị dữ liệu ra bảng và các đồ thị ta sử dụng đoạn mã sau:
SVTH: ................... 18
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn
SVTH: ................... 19
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn
SVTH: ................... 20
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn
V. PHỤ LỤC
1. Sơ đồ mạch điều khiển hệ thống:
SVTH: ................... 21
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn
#include <Servo.h>
Servo LeftRight;
int servoLR = 90;
Servo UpDown;
int servoUD = 90;
void setup()
{
Serial.begin(9600);
LeftRight.attach(9);
UpDown.attach(10);
LeftRight.write(servoLR);
UpDown.write(servoUD);
delay(3000);
}
void loop() {
int lt = analogRead(topleft);
int rt = analogRead(topright);
int lb = analogRead(botleft);
int rb = analogRead(botright);
int avt = (lt + rt)/2; // gia tri trung binh cua ben tren
int avb = (lb + rb)/2; // gia tri trung binh cua ben duoi
int avl = (lt + lb)/2; // gia tri trung binh cua ben trai
int avr = (rt + rb)/2; // gia tri trung binh cua ben phai
int TB = avt - avb; // sai lech giua tren va duoi
int LR = avl - avr; // sai lech giua trai va phai
int a = 50; // sai so cho phep
Serial.print("@");
Serial.print(servoUD); Serial.print("A");
Serial.print(servoLR); Serial.print("B");
Serial.print(voltage); Serial.print("C");
Serial.print("\n");
SVTH: ................... 22
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn
delay(50);
SVTH: ................... 23
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
int servov = 0;
int servoh = 0;
bool Update_data = false;
private DateTime datetime;
string data_dienap;
public double Voltage;
public Form1()
{
InitializeComponent();
}
SVTH: ................... 24
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn
serialPort1.Close();
textBox1.BackColor = Color.Red;
textBox1.Text = "Disconnect";
chart1.Series["Điện áp (10^(-2) V)"].Points.Clear();
chart2.Series["servov"].Points.Clear();
chart2.Series["servoh"].Points.Clear();
}
}
}
private void Show_Data(object sender, EventArgs e)
{
if (Update_data == true && load_data.Text == "loading ...")
{
Servo_v.Text = String.Format("ServoV = {0} degree", servov.ToString());
Servo_h.Text = String.Format("ServoH = {0} degree", servoh.ToString());
chart2.Series["servov"].Points.Add(servov);
chart2.Series["servoh"].Points.Add(servoh);
datetime = DateTime.Now;
string time = datetime.Hour + ":" + datetime.Minute + ":" + datetime.Second;
string servov1 = servov.ToString();
string servoh1 = servoh.ToString();
data_light.AppendText(time + "\t\t" + servov1 + "\t\t" + servoh1 + "\t\t" + data_dienap + "\n");
}
}
private void Data_Parsing(string data)
{
sbyte indexOf_startDataCharacter = (sbyte)data.IndexOf("@");
sbyte indexOfA = (sbyte)data.IndexOf("A");
sbyte indexOfB = (sbyte)data.IndexOf("B");
sbyte indexOfC = (sbyte)data.IndexOf("C");
// if character "A", "B", "C" and "@" exist in the data Package
if (indexOfA != -1 && indexOfB != -1 && indexOfC != -1 && indexOf_startDataCharacter != -1)
{
try
{
string str_servov = data.Substring(indexOf_startDataCharacter + 1, (indexOfA -
indexOf_startDataCharacter) - 1);
string str_servoh = data.Substring(indexOfA + 1, (indexOfB - indexOfA) - 1);
string str_dien_ap = data.Substring(indexOfB + 1, (indexOfC - indexOfB) - 1);
servov = Convert.ToInt32(str_servov);
servoh = Convert.ToInt32(str_servoh);
data_dienap = str_dien_ap;
Update_data = true;
}
catch (Exception ex1)
{
MessageBox.Show(ex1.Message, "Error");
SVTH: ................... 25
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn
}
}
else
{
Update_data = false;
}
}
private void data_light_TextChanged(object sender, EventArgs e)
{
}
private void start_btn_Click(object sender, EventArgs e)
{
timer_chart.Enabled = timer_voltage.Enabled = true;
serialPort1.DataBits = 8;
serialPort1.StopBits = StopBits.One;
serialPort1.DataReceived += SerialPort1_DataReceived;
load_data.BackColor = Color.Green;
load_data.Text = "loading ...";
if (serialPort1.IsOpen)
{
}
else
{
MessageBox.Show("Select COM Port!", "Warning", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error");
}
}
SVTH: ................... 26
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn
SVTH: ................... 27