Charger Ponsel Pelacak Surya Portabel dengan Arduino dan Kontrol Servo
Komponen dan Perlengkapan
Arduino UNO
×
1
Servos (Tower Pro MG996R)
9gram servo yang tidak memerlukan daya eksternal
×
1
Photo resistor
×
2
Resistor 10k ohm
×
2
2.5V to 5V boost converter - USB Adapted
×
1
Panel Surya - Ukuran Hobby
Panel kecil apa pun akan cukup, semakin tinggi output semakin baik, tetapi pertahankan ukuran kecil dan ringan
×
2
Alat dan Mesin yang Diperlukan
Soldering iron (generik)
Aplikasi dan Layanan Online
Arduino IDE
Tentang Proyek Ini
Going Green
Saya telah bekerja di industri energi terbarukan di Australia dan bermain-main dengan Arduino untuk beberapa waktu, tetapi baru pada proyek ini saya akhirnya memutuskan untuk menggabungkan keduanya dan membangun perangkat surya kecil saya sendiri. Catatan kecil di awal, proyek ini jelas memerlukan 5V untuk menyala Arduino dan servo, yang digunakan untuk memaksimalkan output panel surya yang paling baik menghasilkan 3.4V. Jadi ini tidak secara tepat membayar dirinya sendiri. Namun konsepnya dapat diskalakan, jadi jika, misalnya, Anda menggunakan konsep ini pada larik 8 panel, yang menghasilkan 12V, maka Anda dapat menyala Arduino dan men-charge ponsel Anda tanpa sumber daya eksternal. Saya berencana untuk melakukannya suatu hari nanti, dan akan menambahkan tautan di sini saat itu terjadi.
Saat saya di sini, saya sebaiknya memberikan kredit kepada sumber-saya...
The DIY Life - https://www.the-diy-life.com/arduino-solar-tracker/
Brown Dog gadgets - https://www.instructables.com/id/Solar-Altoids-USB-Charger/
Kedua sumber yang baik tentang topik ini, dan di mana saya mendapatkan konsepnya.
MEMULAI
Jadi, hal pertama yang pertama, Anda memerlukan beberapa panel surya. Saya menggunakan dua, meskipun Anda dapat menggunakan sebanyak yang Anda inginkan, pikirkan seberapa besar servo 9gram akan dapat mengangkat/menurunkan (jangan buat terlalu berat). Panel yang saya temukan memiliki rating 1.5V, 0.75W output yang berada di ujung bawah yang tersedia saat ini. Namun mereka ringan dan murah dan mengingat ini adalah proyek konsep bukti untuk saya, output tidak terlalu penting.
Saya menggabungkan dua panel saya di tepi dengan epoksi. Untuk menghubungkan panel ke dalam rangkaian, cukup solder kawat positif dari satu panel ke kawat negatif dari panel lain, yang akan meninggalkan kawat positif dan negatif yang tersisa. Pasang LDR Anda di setiap sisi panel surya (Timur dan Barat), dan solder satu ujung kawat jumper ke setiap kawat mereka. Lebih mudah untuk solder kawat jumper jika Anda memotong ujung satu sisi, dan membersihkan kawat sekitar 5mm untuk mengungkapkan kawat.
Untuk Arduino membaca LDR Anda, kita memerlukan rangkaian pembagi tegangan untuk masing-masing. Lihat di sini untuk pembagi tegangan. Dalam rangkaian ini, LDR adalah R1, dan kita menggunakan resistor 10kohm untuk R2, dan menyambungkan kawat jumper ke arduino tempat dua resistor bertemu. Jika Anda membangun proyek ini pada papan roti, satu kaki LDR akan pergi ke pembagi tegangan, yang lain pergi ke rail daya positif. Lihat diagram Fritzing di bawah ini.
Struktur Pelacak
Hal berikutnya yang perlu Anda bangun adalah struktur dukungan berputar untuk panel untuk duduk di atasnya. Desain saya pada dasarnya adalah panjang baja spring yang didukung oleh dua kerangka A. Sisi bawah larik panel memiliki kayu kecil, dengan lubang untuk baja spring. Saya membuat keseluruhan dari kayu balsa untuk menjaga agar murah, mudah dan ringan, tetapi jika ini akan menjadi pemasangan permanen Anda akan menginginkannya dari baja tipis atau plywood yang dirawat. Saya tidak mendokumentasikan pembangunan dukungan berputar dengan baik, tetapi video di bawah ini harus menunjukkan kepada Anda bagaimana itu dilakukan, serta lokasi servo. Saya membangun milik saya dengan panel di sudut bawah, sehingga dapat menghadap dasar struktur ke utara, jadi mana pun panel berayun saat melacak matahari, itu akan selalu sedikit miring ke utara untuk memaksimalkan output. (Saya berada di hemisfer selatan)
Memasang Servo
Servo duduk pada salah satu balok dukungan struktur kerangka A, dan mengangkat/menurunkan satu sisi panel. Saya melipat beberapa baja spring dengan alicate untuk mendapatkan ujung yang bisa Anda lewatkan melalui kayu strut panel dan lengan servo, Anda mungkin perlu melebar lubang di lengan servo agar baja dapat muat, saya menggunakan bit bor terkecil yang saya dapatkan. Jangan lem baja ke dalam lengan servo atau strut panel, karena harus dapat berputar di dalam lubang agar panel dapat mengangkat dengan lancar. Setelah itu berada di tempatnya, lepaskan panel dari struktur, sehingga hanya servo yang tersisa sehingga Anda dapat melakukan beberapa kalibrasi.
Mengkalibrasi Servo
Buka sketsa baru dan masukkan kode berikut.
#include <Servo.h> Servo myservo1; // Create a servo object to control the servo int pos = 10; void setup() { myservo1.attach(9); //attaches the servo object to PWM pin 9 } void loop() { myservo1.write(pos);}
Unggah ke arduino Anda, dan lihat di mana servo bergerak. Terus ubah nilai 'pos' antara 0 dan 180 dalam sketsa dan unggah ulang sketsa, sampai Anda menemukan posisi di mana lengan servo menunjuk lurus ke atas dan ke bawah. Itu adalah nilai max dan min Anda. Bagi saya, itu adalah 15 dan 140. Jika nilai tumpang tindih dari 180-kembali ke 0, lepaskan lengan servo dan posisikan ulang sehingga dapat disesuaikan dengan benar.
Menggabungkan Semuanya
Lanjutkan dan hubungkan semuanya, dan masukkan sketsa berikut.
//Sun Tracker Sketch // //This sketch is designed for use with a 9gram servo, able //to be powered directly from the Arduinio without an external //power source. For fritzing diagram, see Github repository //https://github.com/nickalanf/Arduino--Projects //The Serial monitor section is for debugging purposes, or for general interest, //one once the device is functioning correctly, can be diasabled // //Sketch by FIELDING - 8/2/18 #include <Servo.h> Servo servo; // Create a servo object to control the servo int eLDRPin = A0; // Assign pins to the LDR's int wLDRPin = A1; int eastLDR = 0; //Create variables to store to LDR readings int westLDR = 0; int difference = 0; //Create a variable to compare the two LDR's int error = 10; // Variable for is there is a noticable difference between the tow LDR's int servoSet = 130; //Variable for position of servo - will be different for each device void setup() { servo.attach(9); //attaches the servo object to PWM pin 9 Serial.begin(9600); } void loop() { eastLDR = analogRead(eLDRPin); //Read the LDR values westLDR = analogRead(wLDRPin); if (eastLDR < 400 && westLDR < 400) { //Check to see if there is low light on both LDR's while (servoSet <=140 && >=15) { // if so, send panels back to east for the sunrise servoSet ++; servo.write(servoSet); delay(100); } } difference = eastLDR - westLDR ; //Check the difference if (difference > 10) { //Send the panel towards the LDR with a higher reading if (servoSet <= 140) { servoSet ++; servo.write(servoSet); } } else if (difference < -10) { if (servoSet >= 15) { servoSet --; servo.write(servoSet); } } Serial.print(eastLDR); //Serial monitor can be useful for debugging/setting up Serial.print(" - "); //Use it to see if your LDR's are noticeably different when Serial.print(westLDR); //They have equal light shining on them, if so, correct with the error value Serial.print(" - "); Serial.print(difference); Serial.print(" - "); Serial.print(servoSet); //Fine tune the servo settings, to maximise swing available Serial.print(" - "); Serial.println("."); delay(100);}
Buka Serial Monitor, dan sorot cahaya ke LDR. Cobalah sorotnya merata pada keduanya, dan periksa nilai perbedaan yang dicetak ke serial monitor. Jika itu lebih besar dari sekitar 25, atau kurang dari -25, Anda perlu menambahkan kalibrasi error. Tambahkan nilai error yang relevan ke dalam kode, dan kemudian tambahkan atau kurangi nilai itu dari LDR yang relevan. Jika nilai perbedaan dekat, seharusnya baik untuk membiarkannya seperti itu.
Anda siap untuk mengujinya! yang termudah adalah pergi ke ruang gelap dan dengan sorotan/lampu. ayunkan cahaya dari satu LDR perlahan ke yang lain dan lihat panel bergerak. Anda juga dapat menutupi satu LDR dan panel harus berayun menjauh dari itu.
BONUS- CHARGER PONSEL
Jika Anda ingin menggunakan output panel, Anda dapat merangkaikan konverter DC-DC boost 2.5V- 5V langsung ke kawat yang keluar dari panel. Ini adalah rangkaian yang terpisah sepenuhnya dari arduino/papan roti. Perhatikan bahwa ponsel standar men-charge pada 5V, dan panel Anda mungkin menghasilkan 5 V tetapi arus rendah, jadi jika baterai Anda penuh atau sinar matahari rendah, Anda tidak akan memiliki cukup output untuk men-charge. Cara termudah untuk mengatasi ini adalah dengan cukup menambahkan lebih banyak panel!
Kode
Sun Tracker
Sun TrackerProcessing
//Sun Tracker Sketch // //This sketch is designed for use with a 9gram servo, able //to be powered directly from the Arduinio without an external //power source. For fritzing diagram, see Github repository //https://github.com/nickalanf/Arduino--Projects //The Serial monitor section is for debugging purposes, or for general interest, //one once the device is functioning correctly, can be diasabled // //Sketch by FIELDING - 8/2/18 #include <Servo.h> Servo servo; // Create a servo object to control the servo int eLDRPin = A0; // Assign pins to the LDR's int wLDRPin = A1; int eastLDR = 0; //Create variables to store to LDR readings int westLDR = 0; int difference = 0; //Create a variable to compare the two LDR's int error = 10; // Variable for is there is a noticable difference between the tow LDR's int servoSet = 130; //Variable for position of servo - will be different for each device void setup() { servo.attach(9); //attaches the servo object to PWM pin 9 Serial.begin(9600); } void loop() { eastLDR = analogRead(eLDRPin); //Read the LDR values westLDR = analogRead(wLDRPin); if (eastLDR < 400 && westLDR < 400) { //Check to see if there is low light on both LDR's while (servoSet <=140 && >=15) { // if so, send panels back to east for the sunrise servoSet ++; servo.write(servoSet); delay(100); } } difference = eastLDR - westLDR ; //Check the difference if (difference > 10) { //Send the panel towards the LDR with a higher reading if (servoSet <= 140) { servoSet ++; servo.write(servoSet); } } else if (difference < -10) { if (servoSet >= 15) { servoSet --; servo.write(servoSet); } } Serial.print(eastLDR); //Serial monitor can be useful for debugging/setting up Serial.print(" - "); //Use it to see if your LDR's are noticeably different when Serial.print(westLDR); //They have equal light shining on them, if so, correct with the error value Serial.print(" - "); Serial.print(difference); Serial.print(" - "); Serial.print(servoSet); //Fine tune the servo settings, to maximise swing available Serial.print(" - "); Serial.println("."); delay(100); }