You are on page 1of 28

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

TRƯỜNG CƠ KHÍ
KHOA CƠ ĐIỆN TỬ

-----*------

KỸ THUẬT LẬP TRÌNH


CƠ ĐIỆNTỬ

Đề tài:
Bộ điều hướng pin mặt trời 2 trục quay theo hướng sáng

Giảng viên hướng dẫn: TS. Trương Công Tuấn


Sinh viên thực hiện: Đào Tiến Dũng 20194969
Phùng Thế Duy 20194990
Hoàng Tấn Phát 20195129
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn

MỤ C LỤ C

TÓM TẮT NỘI DUNG BÀI TẬP LỚN........................................................................2


I. ĐẶT VẤN ĐỀ...................................................................................................................... 3
II. KẾT QUẢ ĐẠT ĐƯỢC................................................................................................. 4
1. Tính toán và thiết kế..................................................................................................... 4
1.1. Phương pháp thiết kế............................................................................................ 4
1.2. Sơ đồ khối của hệ thống....................................................................................... 4
1.2.1. Cảm biến của hệ thống.................................................................................. 5
1.2.2.Bộ điều khiển của hệ thống...........................................................................5
1.2.3.Cơ cấu chấp hành hệ thống..........................................................................7
1.3. Mạch điều khiển của hệ thống...........................................................................8
1.3.1 Nối chân mạch giữa Quang trở và Arduino...........................................9
1.3.2. Nối chân mạch giữa Arduino và động cơ Servo..................................9
2. Lập trình điều khiển thiết bị ngoại vi.................................................................10
2.1. Phân tích nhiệm vụ, nguyên lý hoạt động của hệ thống......................10
2.2. Sơ đồ thuật đoán................................................................................................... 11
2.3. Lập trình cụ thể trên Arduino IDE..............................................................12
3. Lập trình giao diện hệ thống.................................................................................. 14
3.1. Thiết kế giao diện trong Visual Studio.......................................................14
3.2. Lập trình kết nối với thiết bị ngoại vi (Arduino)....................................16
3.3. Thu nhận dữ liệu và xây dựng đồ thị..........................................................17
III. KẾT LUẬN.................................................................................................................... 20
IV. TÀI LIỆU THAM KHẢO........................................................................................ 21
V. PHỤ LỤC.......................................................................................................................... 21

SVTH: ................... 1
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn

TÓM TẮT NỘI DUNG BÀI TẬP LỚN


1. Nêu khái quát mục tiêu, ý nghĩa và các yêu cầu của BTL.
 Mục tiêu, ý nghĩa của BTL:
- Áp dụng kiến thức, kỹ năng như: lập trình ĐK, lập trình giao diện của
môn học Kỹ thuật lập trình cho 1 hệ thống cơ điện tử.
- Tìm hiểu và đề xuất ra 1 trong những cách tăng hiệu suất cho pin mặt
trời là sử dụng hệ thống 2 trục quay theo hướng sáng
- Thu nhận dữ liệu, đưa ra hướng nhận ánh sáng mặt trời tốt nhất
 Yêu cầu của bài tập lớn:
-Tính toán và thiết kế được hệ thống, phân tích và chọn cảm biến, bộ điều
khiển, cơ cấu chấp hành phù hợp
- Có sơ đồ mạch mô phỏng, áp dụng kiến thức lập trình được học vào lập
trình điều khiển thiết bị ngoại vi, lập trình giao diện hệ thống
2. Tóm tắt các kết quả đạt được:
- Thiết kế được mô hình điều hướng pin mặt trời tự động xoay vuông góc
với ánh sáng mặt trời
- Thu thập được dữ liệu nhận ánh sáng của pin mặt trời theo thời gian.
3. Công việc cụ thể của các thành viên

TT Họ và tên Nhiệm vụ được giao Ghi chú


1 Phùng Thế Duy Thiết kế hệ thống cơ khí, mạch
điện tử hệ thống
2 Đào Tiến Dũng Lập trình thiết kế điều khiển Nhóm trưởng
thiết bị ngoại vi
3 Hoàng Tấn Phát Lập trình thiết kế giao diệ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

II. KẾT QUẢ ĐẠT ĐƯỢC


1. Tính toán và thiết kế
1.1.Phương pháp thiết kế
- Mặt trời di chuyển từ hướng đông sang hướng tây. Để thu nhận được năng
lượng điện tối đa từ tấm pin năng lượng mặt trời ta phải tập trung tối đa
cường độ ánh sáng chiếu trên bề mặt tấm pin năng lượng. Việc hấp thụ ánh
sáng của một tấm pin năng lượng mặt trời phụ thuộc vào vị trí góc của nó so
với ánh nắng mặt trời. Một tấm pin mặt trời phải luôn vuông góc 90 độ so
với ánh nắng mặt trời để được mức năng lượng tối đa.
- Thiết kế hệ thống xoay 2 trục, trục được đặt với mặt đất quay theo phương
dọc, trục đỡ tấm pin mặt trời quay theo phương ngang. Với việc kết hợp 2
trục quay, ta có thể đưa tấm pin mặt trời đến hầu hết vị trí mong muốn.

Hệ thống xoay 2 trục


1.2. Sơ đồ khối của hệ thống
Input Controller Output

Cảm biến: 4 quang


Động cơ Servo1
trở
Vi điều khiển
Arduino Động cơ Servo2
Ánh sáng mặt trời

SVTH: ................... 4
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn

1.2.1. Cảm biến của hệ thống


- Hiện nay có rất nhiều loại cảm biến ánh sáng. Nhóm em đã chọn cảm biến
quang trở do độ nhạy sáng cũng như giá thành rẻ, dễ dàng sử dụng.
- Quang trở là linh kiện điện tử có điện trở thay đổi theo ánh sáng chiếu vào, khi
ánh sáng càng mạnh thì điện trở càng nhỏ và ngược lại. Quang trở được dùng
làm cảm biến ánh sáng trong các mạch dò, như mạch đóng cắt đèn sáng tối, ...

Quang trở 5mm


- Thiết kế cảm biến cho hệ thống đòi hỏi việc thu nhận dữ liệu độ mạnh yếu,
hướng sáng của cảm biến. Do đó phải sử dụng 4 cảm biến điện quang trở đặt
tách biệt và thu về những dữ liệu tách biệt để so sánh.

Cách bố trí quang trở


1.2.2. Bộ điều khiển của hệ thống
- Hệ thống sử dụng vi điều khiển Arduino.
- Arduino Uno được điều khiển bởi vi điều khiển Atmega328. Nó có 14 đầu
vào/ra (trong đó có 6 chân có thể sử dụng như đầu ra PWM), 6 ngõ ra Analog,
một cổng USB, một jack nguồn, ICSP, một nút nhấn Reset.

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

Điện áp hoạt động 4.8V đến 6V


Kích thước L23xW12xH29 (mm)
Khối lượng 9g
Lực kéo 1.6 Kg.cm
Tốc độ hoạt động 0.3 sec/ 60 deg (4.8VDC)
Dải nhiệt độ 0 – 55 độ C
Độ rộng xung 500 – 2400 us
Góc quay Servo 180 độ

1.3. Mạch điều khiển của hệ thống

SVTH: ................... 8
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn

1.3.1. Nối chân mạch giữa Quang trở và Arduino


- Quang trở được cấp nguồn 5V
- 4 quang trở lắp nối tiếp với điện trở 1k ôm, tín hiệu từ quang trở sẽ được đọc
bằng phương pháp đọc hiệu điện thế từ cầu phân áp:

Vout= Vcc. R/(R+R1)


 0V < Vout < 5V

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

1.3.2. Nối chân mạch giữa Arduino và động cơ Servo


- 2 động cơ Servo được cung cấp nguồn nhờ pin 5V
- Arduino phát xung PWM tại chân A9, A10 điều khiển động cơ Servo quay
Động cơ Servo1 A9
Động cơ Servo2 A10

SVTH: ................... 9
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn

2. Lập trình điều khiển thiết bị ngoại vi


2.1. Phân tích nhiệm vụ, nguyên lý hoạt động của hệ thống
- Nhiệm vụ: Kết hợp điều khiển 2 góc quay của Servo1 và Servo 2 sao cho tấm
pin mặt trời có thể vuông góc với ánh sáng mặt trời chiếu vào. Vị trí này là nơi
tấm pin mặt trời nhận được nhiều ánh sáng nhất, đạt được công suất lớn nhất.
- Nguyên lý hoạt động của hệ thống:

+ 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

2.2. Sơ đồ thuật đoán

SVTH: ................... 11
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn

2.3. Lập trình cụ thể trên Arduino IDE


- Muốn làm việc với động cơ Servo cần include thư viện Servo.h và khai báo
các đối tượng Servo:

- Giao tiếp giữa Arduino và cảm biến:


Tín hiệu từ cảm biến được đọc tại các chân A0, A1, A2, A3 của Arduino bằng
hàm analogRead()

-Ghép, so sánh và xử lý tín hiệu:


+Ghép tín hiệu:

SVTH: ................... 12
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn

+So sánh và xử lý tín hiệu:

-Giao tiếp giữa Arduino và động cơ Servo:


+ 2 động cơ Servo muốn điều khiển được phải chạy hàm attach():
Động cơ Servo1 được gắn với chân 9, động cơ Servo2 được gắn với chân 10
của Arduino

+ 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

3. Lập trình giao diện hệ thống


3.1. Thiết kế giao diện trong Visual Studio
- Giao diện có thể được xây dựng trên nền tảng các ngôn ngữ như C++, Qt, C#,
Python, …. Trong phần lập trình giao diện này, chúng em quyết định thiết kế
giao diện hệ thống trên nền tảng ngôn ngữ C# thông qua ứng dụng Visual
Studio vì sự tiện lợi và phổ biến của nó.
- Để thiết kế giao diện, chúng ta cần thực hiện các bước sau:
Bước 1: Download phần mềm Visual Studio
Bước 2: Mở Visual Studio, chọn “Create a new Project” sau đó chọn ngôn ngữ
C# rồi chọn “Windows Forms App (.NET Framework)”

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

3.2. Lập trình kết nối với thiết bị ngoại vi (Arduino)


- Có nhiều cách để kết nối Arduino với máy tính chẳng hạn như qua bluetooth,
wifi (kết nối không dây) hay qua dây cáp (kết nối có dây). Do tính chất là thiết
kế mô hình nhỏ, chúng em sử dụng kết nối qua dây cáp. Để có thể truyền và
nhận tín hiệu từ máy tính sang Arduino thông qua dây cáp, ta cần thêm vào giao
diện đoạn mã sau:

Đ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

Trên màn hình giao diện ta có:

- 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

III. KẾT LUẬN


Có thể nói, năng lượng tái tạo nói chung và năng lượng mặt trời nói riêng sẽ
là xu hướng của ngành năng lượng trong tương lai gần trên thế giới cũng như
tại Việt Nam chúng ta. Khi đó, hệ thống pin mặt trời sẽ không chỉ là những
nhà máy lớn mà còn là những hệ thống nhỏ ứng dụng cho gia đình, doanh
nghiệp, …. Và đến thời điểm ấy, việc tối ưu nguồn năng lượng mặt trời thu
được sẽ là một bài toán cần giải quyết.
Vì vậy, chúng em thông qua kiến thức được học và các tài liệu tham khảo, đã
tìm hiểu và đề xuất một số phương án thiết kế hệ thống hướng sáng pin mặt
trời để có thể giải quyết bài toán trên, qua đó bước đầu tiếp cận và phát triển
nguồn năng lượng sạch và gần như vô tận – năng lượng mặt trời.
Qua thời gian nghiên cứu, bài tập lớn của chúng em đã được hoàn thành.
Bằng sự nỗ lực cố gắng của nhóm cũng như phân phối công việc hợp lý, chặt
chẽ, bài tập lớn đã hoàn thành đúng tiến độ đề ra, bên cạnh đó là sự hướng
dẫn nhiệt tình, tận tâm của TS. Trương Công Tuấn, đề tài này đã được hoàn
thành đúng thời gian như đã định và đã đạt được yêu cầu đặt ra là điều
hướng pin mặt trời xoay theo nơi có cường độ sáng lớn nhất. Trong quá trình
thực hiện bài tập lớn, nhóm đã thu được những kết quả nhất định như sau:
+ Thiết kế được mô hình điều hướng pin mặt trời tự động xoay vuông góc
với ánh sáng mặt trời
+ Tìm hiểu, nghiên cứu các vấn đề liên quan đề đề tài: board mạch Arduino
Uno, lập trình điều khiển động cơ Servo, lập trình giao diện hệ thống

SVTH: ................... 20
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn

IV. TÀI LIỆU THAM KHẢO


[1]. Slide bài giảng Kỹ thuật lập trình trong Cơ điện tử
[2]. Lập trình hướng đối tượng với C++, Lê Đăng Hưng, Tạ Tuấn
Anh, Nguyễn Hữu Đức, Nguyễn Thanh Thủy, NXB Khoa học và Kỹ
thuật
[3]. Arduino and Visual C# - Receive/Show/Save Data in Windows
Forms Application:
https://www.youtube.com/watch?v=aCT2nI8j8pU
[4]. Arduino C# Serial Communication DHT22 Sensor Monitoring,
Sends Multiple Data: https://www.youtube.com/watch?
v=3yoQXtaN3wE

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

2. Code lập trình điều khiển thiết bị ngoại vi:

#include <Servo.h>

Servo LeftRight;
int servoLR = 90;
Servo UpDown;
int servoUD = 90;

int LimitHigh = 180;


int LimitLow = 0;

int topleft = A3;


int topright = A2;
int botleft = A1;
int botright = A0;

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

int value = (lt + rt + lb + rb)/4;


double voltage = value * 5.0/1024.0;

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);

if (-1*a > TB || TB > a){


if (avt > avb){
servoUD = servoUD+1;
delay(50);
if (servoUD > LimitHigh){
servoUD = LimitHigh;
}
}
else if (avt < avb){
servoUD = servoUD-1;
delay(50);
if (servoUD < LimitLow){
servoUD = LimitLow;
}
}
UpDown.write(servoUD);
}

if (-1*a > LR || LR > a){


if (avl > avr){
servoLR = servoLR-1;
delay(50);
if (servoLR < LimitLow){
servoLR = LimitLow;
}
}
else if (avl < avr){
servoLR = servoLR+1;
delay(50);
if (servoLR > LimitHigh){
servoLR = LimitHigh;
}
}
else if (avl = avr){
delay(3000);
}
LeftRight.write(servoLR);
}
}

SVTH: ................... 23
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn

3. Code lập trình thiết kế giao diện:


Link: giaodien
using System;
using System.Drawing;
using System.IO.Ports;
using System.Windows.Forms;

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 double toa_do_x = 0;

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)


{
string[] ports = SerialPort.GetPortNames();
foreach (string port in ports)
{
comboBox1.Items.Add(port);
}
}

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)


{
serialPort1.BaudRate = 9600;
serialPort1.PortName = comboBox1.Text;
}

private void button1_Click(object sender, EventArgs e) // Button Connect


{
if (comboBox1.Text == "")
{
MessageBox.Show("Select COM Port!", "Warning", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
else
{
serialPort1.Open();
textBox1.BackColor = Color.Green;
textBox1.Text = "Connected";
start_btn.Enabled = true;
data_light.Clear();
}
}

private void button2_Click(object sender, EventArgs e) // Button Disconnect


{

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 SerialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)


{
try
{
string data = serialPort1.ReadTo("\n");
Data_Parsing(data);
this.BeginInvoke(new EventHandler(Show_Data));
}
catch (Exception ex)
{

}
}
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);
}
}

private void stop_btn_Click(object sender, EventArgs e)


{
try
{
load_data.BackColor = Color.Orange;
load_data.Text = "unloading ...";

}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error");
}
}

private void save_data_btn_Click(object sender, EventArgs e)


{
string pathfile = @"C:\Users\THIS PC\Desktop\Data\";
string filename = "light_data.txt";
System.IO.File.WriteAllText(pathfile + filename, data_light.Text);
MessageBox.Show("Data have been save to" + pathfile, "Save file");
}

private void chart1_Click(object sender, EventArgs e)


{

private void timer_voltage_Tick(object sender, EventArgs e)


{

SVTH: ................... 26
KỸ THUẬT LẬP TRÌNH CƠ ĐIỆN TỬ GVHD: TS. Trương Công Tuấn

if (serialPort1.IsOpen && load_data.Text == "loading ...")


{
try
{
if (data_dienap != null)
{
Voltage = Double.Parse(data_dienap);
}
}
catch (Exception)
{
serialPort1.Close();
data_dienap = null;
}
}
else
{
timer_voltage.Enabled = false;
}

private void timer_chart_Tick(object sender, EventArgs e)


{
if (serialPort1.IsOpen && load_data.Text == "loading ...")
{

this.chart1.Series["Điện áp (10^(-2) V)"].Points.AddXY(toa_do_x, Voltage);


toa_do_x++;
}
else
{
timer_chart.Enabled = false;
}

SVTH: ................... 27

You might also like