Arduino Theo dõi năng lượng mặt trời
Theo dõi năng lượng mặt trời - một hệ thống được thiết kế để theo dõi sự chuyển động của mặt trời để đạt được hiệu quả tối đa từ các tấm pin mặt trời.
Khái niệm về trình theo dõi cực kỳ đơn giản - theo hai cảm biến, bộ điều khiển buộc động cơ servo quay nền tảng với pin mặt trời theo hướng có nhiều ánh sáng hơn.
Nguyên mẫu nhà của bộ theo dõi làm việc được hiển thị trong ảnh dưới đây:
Khái niệm về trình theo dõi cực kỳ đơn giản - theo hai cảm biến, bộ điều khiển buộc động cơ servo quay nền tảng với pin mặt trời theo hướng có nhiều ánh sáng hơn.
Nguyên mẫu nhà của bộ theo dõi làm việc được hiển thị trong ảnh dưới đây:

Dự án sử dụng hai cảm biến quang điện trở, được định hướng theo các hướng khác nhau từ một bề mặt phẳng bằng 45 °, tức là so với nhau, các chất quang dẫn được định hướng 90 °. Mũ được đeo trên các cảm biến để dòng ánh sáng chiếu vào chúng bị tập trung hẹp.
Dự án sử dụng bộ điều khiển Arduino. Bộ điều khiển theo định kỳ lần đọc các giá trị từ hai cảm biến, và so sánh chúng. Nếu các giá trị từ các cảm biến là như nhau, thì bảng điều khiển được chỉ vào mặt trời. Nếu giá trị của một trong các cảm biến khác với cảm biến khác, bộ điều khiển sẽ ra lệnh cho động cơ servo để xoay nền tảng. Lệnh trên servo hoạt động cho đến khi các giá trị từ các cảm biến bằng nhau.

Để ngăn chặn xoay vòng nền tảng quá mức, có các giới hạn xoay phần mềm có thể bị vô hiệu hóa nếu cần thiết. Ngoài ra, hằng số dải chết được cung cấp trong mã chương trình, nếu chênh lệch từ các cảm biến nhỏ hơn giá trị của hằng số này, bộ điều khiển sẽ không đưa ra lệnh xoay động cơ servo. T.O. giật của nền tảng được ngăn chặn (jitter).
Ngoài ra, chỉ trong trường hợp, 2 biến được thêm vào để làm mịn các giá trị từ các cảm biến. Điều này giúp lọc khí thải và tiếng ồn.
Ngoài ra, chỉ trong trường hợp, 2 biến được thêm vào để làm mịn các giá trị từ các cảm biến. Điều này giúp lọc khí thải và tiếng ồn.
Phác thảo cho Arduino
Trong phần đầu của chương trình, các thư viện trình cắm được mô tả (trong trường hợp của chúng tôi, servo.h), các chân và hằng được xác định
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| #include //IO Pins int pinL = 5; //IO Pin левого фоторезистора int pinR = 4; //IO Pin правого фоторезистора int pinServo = 11; //PWM pin серво int leftValue = 0; //Значение левого фоторезистора int rightValue = 0; //Значение правого фоторезистора int error =0; //Разница между показаниями двух датчиков int errorAVG = 0; //Error Average - Rolling 2 Point int deadband = 10; //Мертвая зона (защита от джиттера) //Servo Stuff Servo hServo; //servo object int Position = 45; //Position to write out int minPos = 5; //Min позиция int maxPos = 150; //Max позиция float output = (maxPos - minPos) /2; //Initial output Position |
Đoạn mã sau mô tả hàm Setup (). Chức năng này chỉ được thực hiện một lần khi khởi động chương trình hoặc sau khi thiết lập lại bộ điều khiển. Tại đây, bạn có thể hiển thị bất kỳ dữ liệu nào để gỡ lỗi trong Màn hình nối tiếp, hoặc, như trong ví dụ dưới đây, thực hiện "chạy" động cơ servo dọc theo toàn bộ đường dẫn đến giới hạn.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| void setup () { Serial.begin(9600); hServo.attach(pinServo); //Set Servo to Centre for Alignment Purpose Serial.println( "Перемещение к начальной позиции" ); hServo.write(minPos); delay (5000); Serial.println( "Перемещение к конечной позиции" ); hServo.write(maxPos); delay (5000); Serial.println( "Перемещение к средней точке" ); hServo.write(output); delay (5000); Serial.println( "Going Live................" ); } |
Phần cuối cùng của mã được thực thi trong hàm loop (). Ở đây các giá trị được đọc từ các cảm biến, tất cả các tính toán được thực hiện và các lệnh được đưa ra cho động cơ servo.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Ngày 29
30
31
32
33
34
35
36
37
38
| void loop () { //Чтение значений с фоторезисторов leftValue = analogRead (pinL); rightValue = analogRead (pinR); Serial.print( "L = " ); Serial.print(leftValue); Serial.print( " | " ); Serial.print( "R = " ); Serial.print(rightValue); Serial.print( " | " ); Serial.print( "E = " ); Serial.print(error); Serial.print( " | " ); Serial.print( "Eavg = " ); Serial.print(errorAVG); Serial.println(); //Расчет error = leftValue - rightValue; errorAVG = (errorAVG + error) / 2; float newOutput = output + getTravel(); if (newOutput > maxPos) { Serial.println( "At Upper Limit" ); newOutput = maxPos; } else { if (newOutput < minPos) { Serial.println( "At Lower Limit" ); newOutput = minPos; } } Serial.println( "Writing output" ); //Вывод команды управления серво hServo.write(newOutput); output = newOutput; } } |
Ngoài ra, chương trình sử dụng hàm phụ trợ getTravel (), được sử dụng để tính toán vị trí xoay servo - trái, phải hoặc không làm gì cả. Hàm chỉ đơn giản trả về giá trị: 0 - không có gì xảy ra, -1 rẽ trái, +1 rẽ phải.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| int getTravel() { // -1 = Влево; +1 = Вправо if (errorAVG < (deadband * -1)) { return 1; } else { if (errorAVG > deadband) { return -1; } else { //Ничего не делаем return 0; } } } |
Tất nhiên, đây là một máy theo dõi năng lượng mặt trời đơn giản và có thể dùng làm cơ sở cho các thiết bị phức tạp hơn. Ví dụ: bạn có thể lọc các biến đầu vào tốt hơn, thêm điều khiển PID, thêm ổ servo thứ hai vào mạch để di chuyển bảng điều khiển năng lượng mặt trời theo chiều dọc và đạt hiệu quả tối đa.
Tệp đính kèm:
- LightTracker.rar (1 Kb)
Nhận xét
Đăng nhận xét