Trang 75
Hệ thống di chuyển và thân máy
Hình 5. 8: Thân máy và bánh đai
Hình 5. 9: Thân máy và bánh đai
Trang 76
Hệ thống hút nước và làm khơ
Hình 5. 11: Lắp ráp động cơ và Arduino vào thân máy, bánh di chuyển
Trang 77
Hình 5. 13: Định vị bộ hút
Trang 78
Thổng thể máy vệ sinh pin năng lượng mặt trời
Hình 5. 15: Máy ở góc nhìn 1
Trang 79
5.4. Mã QR Video giới thiệu sản phẩm
Sau khi hồn thành mơ hình thì nhóm cho chạy thử trên nền nhà thay vì phải chạy thử trên tấm pin năng lượng do tình hình Covid căng thẳng.
Kết quả sau khi chạy thử là máy có thể thực hiện vệ sinh và làm khơ tốt, máy có thể di chuyển tiến, lùi, trái phải. Có thể điều khiển từ xa, điều chỉnh tốc độ di chuyển nhanh chậm cũng như điều chỉnh được tốc độ vệ sinh thông qua app Blynk.
Để xem được hoạt động của máy thì nhóm kính mời Q thầy cơ xem video thơng qua mã QR dưới đây.
Trang 80
CHƯƠNG 6: ĐÁNH GIÁ KẾT QUẢ KẾT LUẬN
Ưu điểm và khuyết điểm của giải pháp
Với đề tài "Tính tốn thiết kế và thi công máy rửa pin năng lượng mặt trời”. Sau hơn 6 tháng làm đồ án đến nay dựa vào kiến thức đã học trên trường lớp, tài liệu và sự hướng dẫn tận tình của cơ Nguyễn Thị Ngọc Anh thì đồ án của nhóm đã thành công tốt đẹp. Sau khi hồn thành và chạy mơ phỏng mơ hình thì nhóm thấy máy có những ưu nhược điểm như sau:
Ưu điểm:
➢ Giải quyết được việc vệ sinh pin năng lượng mặt trời.
➢ Máy có thiết kế nhỏ gọn, dễ tháo lắp thuận tiện cho việc di chuyển máy. ➢ Không cần nhiều nhân công để thực hiện việc vệ sinh.
➢ Máy sử dụng bánh xích nhựa nên khơng gây hư hỏng cho pin. ➢ Máy có thể di chuyển qua khoảng cách của các tấm pin đến 5cm.
Khuyết điểm:
➢ Cần có nguồn cấp nước.
➢ Cần phải dọn dẹp vật cản to ra khỏi tấm pin trước khi vệ sinh. ➢ Máy điều khiển bán tự động.
➢ Máy chỉ làm việc được nơi có độ nghiêng dưới 350.
➢ Vì kết nối thơng qua wifi nên khoảng cách điều khiển cịn bị hạn chế.
Hướng phát triển cho tương lai
Ngành công nghiệp điện năng lượng mặt trời đang trên đà phát triển mạnh mẽ và việc các doanh nghiệp thay thế sang lắp đặt, sử dụng pin năng lượng mặt trời ngày càng cao thì bên cạnh đó vấn đề vệ sinh đang rất cần được giải quyết. Để đáp ứng được nhu cầu của mọi doanh nghiệp thì chúng ta cần nghiên cứu và phát triển thêm về máy vệ sinh pin năng lượng mặt trời.
Do đó nhóm đưa ra hướng phát triển cho máy vệ sinh pin năng lượng mặt trời cho tương lai như sau:
➢ Máy chạy tự động, có bộ thu ống nước tự động ➢ Máy có thể hoạt động với độ nghiêng trên 350 ➢ Tăng khoản cách điều khiển máy.
Trang 81
TÀI LIỆU THAM KHẢO
Tài liệu sách:
[1] TS. Nguyễn Hữu Lộc. NXB: Đai Học Quốc Gia TP.HCM (2015), giáo trình cơ sở thiết kế máy.
[2] PGS.TS Nguyễn Đắc Lộc. NXB: Khoa học kỹ thuật (1998), công nghệ chế tạo máy.
Tài liệu trích dẫn từ internet:
[1] VIRAC tổng hợp và EVN quyết định 13/2020/QĐ-TTg, bài báo triển vọng và xu hướng phát triển cho thị trường điện năng lượng áp mái tại Việt Nam, 06/01/2021.
https://viracresearch.com/trien-vong-va-xu-huong-phat-trien-cho-thi-truong- dien-mat-troi-ap-mai-tai-viet-nam.html
[2] Công ty TNHH HDC TECH, máy rửa pin mặt trời tự động cho nhà máy điện mặt trời, 27/06/2019.
https://ssun.com.vn/may-rua-pin-mat-troi-tu-dong-cho-nha-may-dien-mat-troi/ [3] DONA JSC, xe vệ sinh pin năng lượng mặt trời, 04/05/2019.
https://donajsc.com/dich-vu-va-ho-tro/dich-vu/xe-ve-sinh-tam-pin-nang-luong- mat-troi-33.html
[4] Công ty TY MINH TỊNH, chổi lau pin năng lượng mặt trời sauber spa -220v, 17/05/2021.
https://mayvesinhtampinmattroi.com/choi-lau-pin-nang-luong-mat-troi-sauber- spa-220v/
[5] Nhabeagri, béc rửa tưới tấm pin năng lượng mặt trời jain spark, 16/10/2020. https://nhabeagri.com/product/bec-rua-tuoi-tam-pin-nang-luong-mat-troi-jain- spark/
[6] Công ty TNHH XD, TM & DV DHC SOLAR, datasheet tấm pin Canadian 450W, 04/10/2020.
https://drive.google.com/file/d/12Cpb8_j18Z1nAjS2wy1sp3Tdtfc73ebN/view
Ngồi ra nhóm tác giả cịn sử dụng hai phần mềm hỗ trợ là: Phần mềm thiết
Trang 82
PHỤ LỤC PHẦN MỀM
❖ CODE ARDUINO
#define RPWMA 2 // khai báo chân kết nối driver IBT_2 động cơ bên trái #define LPWMA 3
#define ENA 4
#define RPWMB 5 // khai báo chân kết nối driver IBT_2 động cơ bên phải #define LPWMB 6
#define ENB 7
#define TRIG 25 // khai báo chân kết nối cảm biến siêu am #define ECHO 23
#define DISTANCELED 27 // khai báo chân đèn LED cảnh báo #define PUMP 29 // khai báo chân điều khiển bơm
// định nghĩa mã lệnh giao tiếp với ESP8266 #define COMMANDSTOP 0xF7
#define COMMANDLEFT 0xF8 #define COMMANDRIGHT 0xF9 #define COMMANDFOWARD 0xFA #define COMMANDBACK 0xFB
#define COMMANDONPUMP 0xFC // command on pump #define COMMANDOFFPUMP 0xFD // Command off Pump
#define ARLARMDROP 0xFE // command message waring robot go to end
#define VARIANALLOW 3 //cm for sensor meansure 2 time khai báo khoảng sai số đo khoảng cách cho phép
Trang 83
#define MAXDISTANCE 10 //cm khai báo khoảng cách phát hiện vực sâu #define YES 1
#define NO 0
unsigned long TimeCheck;
byte AllowFoward=YES; // biến cho phép chạy tới
void SetSpeed(byte Speed) // hàm cài đặt tốc độ {
byte PWMData;
PWMData=map(Speed,0,100,0,255); // cài đặt PWM từ 0 đến 255 tương ứng với tốc độ 0 đến 100
analogWrite(ENA,PWMData); analogWrite(ENB,PWMData); }
void Stop() // hàm dừng 2 động cơ { digitalWrite(RPWMA,HIGH); digitalWrite(LPWMA,HIGH); digitalWrite(RPWMB,HIGH); digitalWrite(LPWMB,HIGH); }
void RunForward() // hàm chạy tới {
digitalWrite(RPWMA,LOW); digitalWrite(LPWMA,HIGH); digitalWrite(RPWMB,LOW); digitalWrite(LPWMB,HIGH);
Trang 84 }
void RunBack() // hàm chạy lùi { digitalWrite(RPWMA,HIGH); digitalWrite(LPWMA,LOW); digitalWrite(RPWMB,HIGH); digitalWrite(LPWMB,LOW); }
void TurnLeft() // hàm quay trái { digitalWrite(RPWMA,HIGH); digitalWrite(LPWMA,LOW); digitalWrite(RPWMB,LOW); digitalWrite(LPWMB,HIGH); }
void TurnRight() // hàm quay phải { digitalWrite(RPWMA,LOW); digitalWrite(LPWMA,HIGH); digitalWrite(RPWMB,HIGH); digitalWrite(LPWMB,LOW); }
unsigned long CheckSensor() // hàm đo khoảng cách bằng cảm biến siêu âm {
unsigned long duration; // biến đo thời gian unsigned long Distance;
Trang 85 unsigned long FirstCheck=0;
unsigned long SecondCheck=100;
while(abs(SecondCheck-FirstCheck)>VARIANALLOW) {
digitalWrite(TRIG,LOW); // tắt chân trig delayMicroseconds(2);
digitalWrite(TRIG,HIGH); // phát xung từ chân trig
delayMicroseconds(10); // xung có độ dài 10 microSeconds digitalWrite(TRIG,LOW); // tắt chân trig
// Đo độ rộng xung HIGH ở chân echo. duration = pulseIn(ECHO,HIGH); // Tính khoảng cách đến vật.
FirstCheck = duration/2/29.412;
delay(50);
digitalWrite(TRIG,LOW); // tắt chân trig delayMicroseconds(2);
digitalWrite(TRIG,HIGH); // phát xung từ chân trig
delayMicroseconds(10); // xung có độ dài 10 microSeconds digitalWrite(TRIG,LOW); // tắt chân trig
// Đo độ rộng xung HIGH ở chân echo. duration = pulseIn(ECHO,HIGH); // Tính khoảng cách đến vật.
Trang 86 delay(50); } Distance=(FirstCheck+SecondCheck)/2; Serial.print("Sensor Result: "); Serial.println(Distance); return Distance; }
void OnPump() //hàm mở bơm {
digitalWrite(PUMP,LOW); }
void OffPump() // hàm tắt bơm {
digitalWrite(PUMP,HIGH); }
void OffLED() // hàm tắt LED {
digitalWrite(DISTANCELED,HIGH); }
void OnLED() // hàm sáng LED {
digitalWrite(DISTANCELED,LOW); }
Trang 87 // put your setup code here, to run once:
// cài đặt các chân output, input tương ứng pinMode(RPWMA,OUTPUT); pinMode(LPWMA,OUTPUT); pinMode(ENA,OUTPUT); pinMode(RPWMB,OUTPUT); pinMode(LPWMB,OUTPUT); pinMode(ENB,OUTPUT); pinMode(TRIG,OUTPUT); pinMode(ECHO,INPUT); pinMode(PUMP,OUTPUT); pinMode(DISTANCELED,OUTPUT); Serial.begin(9600);
Serial2.begin(9600); // cài đặt cổng UART giao tiếp với ESP8266 SetSpeed(50); // tốc độ ban đầu khi khởi động là 50
Stop(); TimeCheck=millis(); OffPump(); OffLED(); Serial.println("SYSTEM READY!"); } void loop() {
// put your main code here, to run repeatedly: byte ControlData;
Trang 88 unsigned long Distance;
if(millis()-TimeCheck>200)// check distance every 200ms // gọi hàm kiểm tra cảm biến khoảng cách mỗi 200ms
{
TimeCheck=millis(); Distance=CheckSensor();
if(Distance>MAXDISTANCE&&Distance<400) // over 400 is noise nếu khoảng cách lớn hơn 10cm thì cảnh báo và dừng động cơ
{
if(AllowFoward==YES) {
OnLED(); //cảnh báo LED
AllowFoward=NO; // ngưng cho phép chạy tới
Serial2.write(ARLARMDROP); // gửi cảnh báo lên ESP để gửi lên app
Serial.println("WARNING DROP!"); Stop(); // dừng động cơ
} }
else // ngược lại nếu khoảng cách nhỏ hơn 10cm {
OffLED(); // tắt lED cảnh báo
AllowFoward=YES; // cho phép chạy tới }
}
if(Serial2.available()) // nếu có dữ liệu truyển tới từ ESP {
Trang 89
if(ControlData<150) // speed data nếu dữ liệu nhỏ hơn 150 là tốc độ từ 0 đến 100),lớn hơn là mã lệnh điều khiển
{
SetSpeed(ControlData); // cài đặt tốc độ }
else // ngược lại dữ liệu >150 là mã lệnh {
switch(ControlData) // kiểm tra mã lệnh {
case COMMANDSTOP: // mã dừng động cơ {
Stop(); break; }
case COMMANDFOWARD:// mã chạy tới { if(AllowFoward==YES) RunForward(); else Serial2.write(ARLARMDROP); break; }
case COMMANDBACK: // mã chạy lùi {
RunBack(); break; }
case COMMANDLEFT: // mã quay trái {
TurnLeft(); break;
Trang 90 }
case COMMANDRIGHT: // mã quay phải {
TurnRight(); break;
}
case COMMANDONPUMP: // mã mở bơm {
OnPump(); break; }
case COMMANDOFFPUMP: // mã tắt bơm { OffPump(); break; } } } } } ❖ ESP8266 #include <Arduino.h> #include <PCF8574.h> #include <SoftwareSerial.h> #include <ESP8266WiFi.h> #include <DNSServer.h> #include <ESP8266WebServer.h> #include <WiFiManager.h> #include <BlynkSimpleEsp8266.h>
Trang 91
#define SRX D5 // khai báo chân software UART để giao tiếp với arduino #define STX D6
// mã lệnh giao tiếp với arduino // UART data send 0 to 100 is speed #define COMMANDSTOP 0xF7 #define COMMANDLEFT 0xF8 #define COMMANDRIGHT 0xF9 #define COMMANDFOWARD 0xFA #define COMMANDBACK 0xFB
#define COMMANDONPUMP 0xFC // command on pump #define COMMANDOFFPUMP 0xFD // Command off Pump
#define ARLARMDROP 0xFE // command message waring robot go to end
byte SpeedData=0;
#define BLYNK_DEBUG #define BLYNK_PRINT Serial
#define SW_PIN 0 // On board Button #define LED 2 //On board LED
char blynk_token[] = "VFreBd1SMPxp6ozIRfv6rnMatE6FPPVu"; SoftwareSerial DataSerial(SRX, STX);
BlynkTimer UARTTimer;
BlynkTimer BlynkReconnectTimer;
Trang 92 {
int PinValue = param.asInt(); if(PinValue==1) { DataSerial.write(COMMANDFOWARD); Blynk.virtualWrite(V2,0); Blynk.virtualWrite(V3,0); Blynk.virtualWrite(V4,0); } } BLYNK_WRITE(V1) // dung {
int PinValue = param.asInt(); if(PinValue==1) { DataSerial.write(COMMANDSTOP); Blynk.virtualWrite(V0,0); Blynk.virtualWrite(V2,0); Blynk.virtualWrite(V3,0); Blynk.virtualWrite(V4,0); } } BLYNK_WRITE(V2) // trai {
int PinValue = param.asInt(); if(PinValue==1)
Trang 93 DataSerial.write(COMMANDLEFT); Blynk.virtualWrite(V0,0); Blynk.virtualWrite(V3,0); Blynk.virtualWrite(V4,0); } } BLYNK_WRITE(V3) // phai {
int PinValue = param.asInt(); if(PinValue==1) { DataSerial.write(COMMANDRIGHT); Blynk.virtualWrite(V0,0); Blynk.virtualWrite(V2,0); Blynk.virtualWrite(V4,0); } } BLYNK_WRITE(V4) // lui {
int PinValue = param.asInt(); if(PinValue==1) { DataSerial.write(COMMANDBACK); Blynk.virtualWrite(V0,0); Blynk.virtualWrite(V2,0); Blynk.virtualWrite(V3,0); } }
Trang 94 BLYNK_WRITE(V5) // toc do
{
byte PinValue = param.asInt();
DataSerial.write(PinValue); // Speed }
BLYNK_WRITE(V6)// bom {
byte PinValue = param.asInt();
if(PinValue==0) DataSerial.write(COMMANDOFFPUMP); else DataSerial.write(COMMANDONPUMP);
}
void UARTRead() // đọc dữ liệu từ UART gửi đến {
byte UARTDataCome; if (DataSerial.available()>0) {
UARTDataCome=DataSerial.read();
if(UARTDataCome==ARLARMDROP) // nếu mã lệnh cảnh báo vực sâu {
Blynk.notify("CANH BAO - TOI VUC!!!"); // hiển thị cảnh báo lên app Blynk.virtualWrite(V0,0); // tắt các nút Blynk.virtualWrite(V2,0); Blynk.virtualWrite(V3,0); Blynk.virtualWrite(V4,0); } } }
Trang 95
void BlynkReconnect() // hàm tự kết nối blynk khi mất kết nối { if(Blynk.connected()==0) { Blynk.connect(3333); } } void setup() {
Serial.begin(115200); // Thiết lập kết nối Serial để truyền dữ liệu đến máy tính
DataSerial.begin(9600); // thiet lan ket noi voi arduino
pinMode(SW_PIN,INPUT_PULLUP); // Nut tren board bam de xoa wifi da luu pinMode(LED,OUTPUT); // LED ON BOARD
WiFiManager wifiManager; // Khởi tạo đối tượng cho WiFiManager Serial.println("Delete old wifi? Press Flash button within 3 second");
for(int i=3;i>0;i--) {
Serial.print(String(i)+" "); delay(1000);
}
if(digitalRead(SW_PIN)==LOW)// press button {
Serial.println();
Serial.println("Reset wifi config!");
digitalWrite(LED,LOW); //nhap nhay LED sau do sang luon delay(200);
Trang 96 delay(200); digitalWrite(LED,LOW); delay(200); digitalWrite(LED,HIGH); delay(200); digitalWrite(LED,LOW); delay(200); digitalWrite(LED,HIGH); delay(200); digitalWrite(LED,LOW); wifiManager.resetSettings(); wifiManager.resetSettings(); }
WiFiManagerParameter custom_blynk_token("Blynk", "blynk token", blynk_token, 34);
wifiManager.addParameter(&custom_blynk_token);
wifiManager.autoConnect("CLEAN ROBOT","qwer1234");
//wifiManager.autoConnect();// use this to display host as ESP name + CHIPID // if can go next mean already connected wifi
Serial.println("YOU ARE CONNECTED TO WIFI"); Serial.println(custom_blynk_token.getValue());
Blynk.config(custom_blynk_token.getValue()); if (WiFi.status() == WL_CONNECTED) {
Serial.println("WIFI CONNECTED SUCCESSFULLY! NOW TRY TO CONNECT BLYNK...");
Blynk.connect(3333); // try to connect to Blynk with time out 10 second if(Blynk.connected())
{
Trang 97
digitalWrite(LED,LOW); //nhap nhay LED sau do tat delay(200); digitalWrite(LED,HIGH); delay(200); digitalWrite(LED,LOW); delay(200); digitalWrite(LED,HIGH); delay(200); digitalWrite(LED,LOW); delay(200); digitalWrite(LED,HIGH); } else {
Serial.println(" BLYNK Not connect. warning!"); }
}
else Serial.println("WIFI Not connect. warning!"); //MAIN CODE FOR SETUP
UARTTimer.setInterval(1L,UARTRead);
BlynkReconnectTimer.setInterval(1000L,BlynkReconnect); delay(500);
Blynk.virtualWrite(V5,50); // start speed=50 }
void loop() { Blynk.run();
UARTTimer.run();
BlynkReconnectTimer.run();
// put your main code here, to run repeatedly: }