Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Platform Panel Surya Pelacakan Cahaya Terkontrol Servo

Komponen dan persediaan

Resistor foto
× 4
Adafruit Flora RGB Neopixel LED- Paket 4
atau LED multi-warna RBG yang setara
× 1
Sakelar Tombol Tekan SparkFun 12mm
atau tombol tekan normal yang setara
× 2
Sensor Suhu
× 1
Arduino UNO
× 1
Servo Robot 180 Derajat RobotGeek
atau setara. Saya menggunakan servo Futaba S3003
× 2
Resistor 10k ohm
× 6
Resistor 221 ohm
Saya menggunakan 220 ohm
× 1
Kapasitor 100 F
× 2
panel surya (80mm x 80mm)
dapat dibeli di Amazon.com atau yang setara
× 1

Alat dan mesin yang diperlukan

Perkakas tangan dan beberapa mur dan baut kecil untuk membuat braket
Dasar yang kokoh untuk memasang motor servo "twist".
Saya menggunakan balok kayu kecil
Logam yang dapat ditekuk atau lembaran kecil aluminium kaku yang dapat dibentuk menjadi tanda kurung bentuk "L"
Saya menggunakan kira-kira. Aluminium tebal 3 mm yang lebarnya hanya di bawah 2 cm
Logam tipis yang dapat ditekuk untuk membentuk braket untuk menahan platform panel surya dan pasang ke servo "twist"
Saya menggunakan strip baja tipis yang dibeli di toko perangkat keras yang biasanya digunakan untuk menyatukan saluran HVAC. Memiliki lubang pemasangan yang telah dibor sebelumnya untuk memudahkan

Aplikasi dan layanan online

Arduino IDE
Microsoft Excel untuk dokumentasi dan catatan

Tentang proyek ini

Ini adalah implementasi lain dari penggunaan dua servo 180 derajat dan empat resistor foto untuk dapat melacak panel surya kecil agar sejajar dengan area dengan intensitas cahaya paling tinggi.

Motor membuat gerakan kecil untuk mencoba mengarahkan panel surya ke cahaya paling terang.

Ada juga LED multi-warna untuk menunjukkan apakah sistem diaktifkan atau tidak. Dan dua tombol tekan untuk mengaktifkan/menonaktifkan motor.

Ada beberapa rutinitas yang dapat digunakan untuk menggerakkan motor ke posisi yang diperintahkan. Perintah tersebut melalui antarmuka port serial dan serangkaian kode/perintah numerik yang dapat dikirim ke Arduino Uno.

Perintah gerakan independen diprogram sedemikian rupa untuk memberikan (agak) gerakan halus alih-alih perintah posisi langsung yang menyebabkan mekanisme mekanis bergerak dengan keras.

Kode

  • Kode Q2
Kode Q2Arduino
//Scott Mangiacotti//Tucson, Arizona USA//Mei 2018//Q2//Versi 2.0#include //Constantsint const GIVE_BACK_TIME =125;//Konstanta untuk inputsint const I_RED_BUTTON_PIN =4;int const I_GREEN_BUTTON_PIN =2;int const I_LDR1_PIN =A3; //konst kiri atas I_LDR2_PIN =A2; //konstitus kanan atas I_LDR3_PIN =A1; //konstitus kiri bawah I_LDR4_PIN =A0; //kanan bawah//Konstanta untuk outputsint const O_RED_LED_PIN =9;int const O_GREEN_LED_PIN =11;int const O_BLUE_LED_PIN =10;int const O_TWIST_SERVO_PIN =5;int const O_TILT_SERVO_PIN =6;//LightEnningable global falsebool;;bool gVerboseDiagMode =false;Servo gServoTwist;int gServoTwistPositionCommand; //perintah posisibool gServoTwistMoveIP; //bergerak sedang berlangsungServo gServoTilt;bool gServoTiltMoveIP; //bergerak maju ke gServoTiltPositionCommand; //commanded positionint gLDR1;int gLDR2;int gLDR3;int gLDR4;//Menjalankan sekalivoid setup() { //Membuka port serial Serial.begin(9600); //Mengatur input digital pinMode(I_RED_BUTTON_PIN, INPUT); pinMode(I_GREEN_BUTTON_PIN, INPUT); //Mengatur output digital pinMode(O_RED_LED_PIN, OUTPUT); pinMode(O_GREEN_LED_PIN, OUTPUT); pinMode(O_BLUE_LED_PIN, OUTPUT); //Jalankan startup rutin startup();}//Jalankan terus menerusvoid loop(){ //Pemrosesan penerimaan pesan port serial if (Serial.available()> 0) { int iControlCode; iControlCode =Serial.parseInt(); processSerialMessage(iControlCode); } //Baca tombol hijau di iGreenButton; iGreenButton =digitalRead(I_GREEN_BUTTON_PIN); if (iGreenButton ==HIGH &&gRunning ==false) { enableTracking(); gTrackToLightEnabled =benar; } //Baca tombol merah di iRedButton; iRedButton =digitalRead(I_RED_BUTTON_PIN); if (iRedButton ==HIGH &&gRunning ==true) { disableTracking(); } //Baca semua instrumentasi ke dalam variabel global readPhotoResistors(); rataTopTwoSensors(); rata-rataBottomTwoSensors(); //Sesuaikan posisi servo menurut cahaya pada photoresistor if (gRunning ==true) { if (gTrackToLightEnabled ==true) { //Buat gerakan kecil servo berdasarkan tingkat cahaya photo-resitor trackToLightSensors(); } else { //Melakukan gerakan kecil berdasarkan perintah pengguna pada port serial. Menghindari gerakan kecepatan tinggi pada mekanisme smoothMoveTwist(); smoothMoveTilt(); } } //Berikan sedikit waktu tunda(GIVE_BACK_TIME);}//Aktifkan servo trackingvoid enableTracking(){ //Tetapkan variabel global sehingga bagian lain dari program tahu bahwa motor siap dijalankan gRunning =true; //Lampirkan ke motor servo gServoTwist.attach(O_TWIST_SERVO_PIN); gServoTilt.attach(O_TILT_SERVO_PIN); //Nyalakan LED hijau dan matikan LED merah digitalWrite(O_GREEN_LED_PIN, HIGH); digitalWrite(O_RED_LED_PIN, RENDAH); //Poskan hasil Serial.println("servos diaktifkan");}//Matikan servo trackingvoid disableTracking(){ gRunning =false; gTrackToLightEnabled =salah; //Lepaskan dari motor servo gServoTwist.detach(); gServoTilt.detach(); //Bersihkan perintah pemindahan dan pemindahan variabel dalam proses (IP) gServoTwistPositionCommand =gServoTwist.read(); gServoTwistMoveIP =salah; //Bersihkan perintah pemindahan dan pemindahan variabel dalam proses (IP) gServoTiltPositionCommand =gServoTilt.read(); gServoTiltMoveIP =salah; //Nyalakan LED merah, matikan LED hijau DigitalWrite(O_RED_LED_PIN, HIGH); digitalWrite(O_GREEN_LED_PIN, RENDAH); //Poskan hasil Serial.println("servos dinonaktifkan");}//Lacak ke cahaya berdasarkan nilai sensor fotovoid trackToLightSensors(){ float fTop; mengapung fBottom; mengambang fKiri; mengapung ketakutan; int iTwistMoveCommand; int iTiltMoveCommand; int iMoveAmount; //Inisialisasi //Variabel di bawah ini menentukan berapa derajat gerakan potensial untuk kedua servos //per pemindaian program. Angka ini dalam kombinasi dengan konstanta global // bernama 'GIVE_BACK_TIME' menentukan seberapa agresif pergerakannya. iMoveAmount =5; //Dapatkan posisi servo saat ini iTwistMoveCommand =gServoTwist.read(); iTiltMoveCommand =gServoTilt.read(); //Dapatkan rata-rata fTop =averageTopTwoSensors(); fBottom =rata-rataBottomTwoSensors(); fLeft =rata-rataLeftTwoSensors(); fRight =rata-rataRightTwoSensors(); //Menghitung gerakan memutar jika (fLeft> fRight) { //Memindahkan iTwistMoveCommand positif +=iMoveAmount; } else if (fRight> fLeft) { //Pindahkan iTwistMoveCommand negatif -=iMoveAmount; } lain { //Sama. don't move } //Hitung gerakan tilt if (fTop>
 fBottom) { //Move positive iTiltMoveCommand +=iMoveAmount; } else if (fBottom> fTop) { //Pindahkan iTiltMoveCommand negatif -=iMoveAmount; } lain { //Sama. don't move } //Bounds check twist perintah servo move if (iTwistMoveCommand <0) { iTwistMoveCommand =0; } if (iTwistMoveCommand> 179) { iTwistMoveCommand =179; } //Bounds check tilt servo move command if (iTiltMoveCommand <45) { iTiltMoveCommand =45; } jika (iTiltMoveCommand> 135) { iTiltMoveCommand =135; } //Melakukan gerakan gServoTwist.write(iTwistMoveCommand); gServoTilt.write(iTiltMoveCommand); //Posting hasil if (gVerboseDiagMode ==true) { Serial.println("tl, tr, bl, br, top avg, bottom avg, left avg, right avg, twist move, tilt move:"); Serial.print(gLDR1); Serial.print(", "); Serial.print(gLDR2); Serial.print(", "); Serial.print(gLDR3); Serial.print(", "); Serial.print(gLDR4); Serial.print(", "); Serial.print(fTop); Serial.print(", "); Serial.print(fBottom); Serial.print(", "); Serial.print(fKiri); Serial.print(", "); Serial.print(Fight); Serial.print(", "); Serial.print(iTwistMoveCommand); Serial.print(", "); Serial.println(iTiltMoveCommand); } }//membaca nilai fotoresistor ke dalam variabel globalvoid readPhotoResistors(){ //Nilai datang dalam skala 0-1024 gLDR1 =analogRead(I_LDR1_PIN); gLDR2 =analogRead(I_LDR2_PIN); gLDR3 =analogRead(I_LDR3_PIN); gLDR4 =analogRead(I_LDR4_PIN);}//Saat servo diperintahkan ke posisi tertentu, servo bergerak dengan kecepatan tinggi.//Terlalu cepat berpotensi memengaruhi struktur mekanis yang menahan dan menggerakkan//panel surya dan platform sensor cahaya. Rutin ini mengambil "perintah bergerak"//dan membuat gerakan inkremental kecil sampai servo berada pada posisi yang diinginkan.//Rutin ini untuk motor servo puntir yang dipasang di dasarvoid smoothMoveTwist(){ int iCurrentPos; int iMoveAmountPerScan; int iNewMoveCommand; // Tetapkan jumlah perpindahan per pemindaian dalam derajat. //Kombinasi variabel ini dan konstanta global 'GIVE_BACK_TIME' menentukan kecepatan gerakan keseluruhan iMoveAmountPerScan =1; //Tentukan posisi saat ini iCurrentPos =gServoTwist.read(); //Apakah kita di posisi? if (iCurrentPos ==gServoTwistPositionCommand) { gServoTwistMoveIP =false; kembali; } else { gServoTwistMoveIP =true; } //Mulai dari posisi kita saat ini di iNewMoveCommand =iCurrentPos; //Tentukan jumlah pemindahan jika (iCurrentPos  179) { iNewMoveCommand =179; } //Pindahkan gServoTwist.write(iNewMoveCommand); //Poskan hasil if (gVerboseDiagMode ==true) { //todo:Serial.print("Memutar servo move (total ini):"); Serial.print(iNewMoveCommand); Serial.print(", "); Serial.println(gServoTwistPositionCommand); }}//Ketika servos diperintahkan ke posisi mereka bergerak dengan kecepatan cepat.//Terlalu cepat berpotensi mempengaruhi struktur mekanik yang memegang dan bergerak//panel surya dan platform sensor cahaya. Rutin ini mengambil "perintah bergerak"//dan membuat gerakan inkremental kecil sampai servo berada pada posisi yang diinginkan.//Rutin ini untuk motor servo miring yang dipasang di braketvoid smoothMoveTilt(){ int iCurrentPos; int iMoveAmountPerScan; int iNewMoveCommand; // Tetapkan jumlah perpindahan per pemindaian dalam derajat. //Kombinasi variabel ini dan konstanta global 'GIVE_BACK_TIME' menentukan kecepatan gerakan keseluruhan iMoveAmountPerScan =1; //Tentukan posisi saat ini iCurrentPos =gServoTilt.read(); //Apakah kita di posisi? if (iCurrentPos ==gServoTiltPositionCommand) { gServoTiltMoveIP =false; kembali; } else { gServoTiltMoveIP =benar; } //Mulai dari posisi kita saat ini di iNewMoveCommand =iCurrentPos; //Tentukan jumlah pemindahan jika (iCurrentPos  179) { iNewMoveCommand =179; } //Pindahkan gServoTilt.write(iNewMoveCommand); //Posting hasil if (gVerboseDiagMode ==true) { //todo:Serial.print("Miringkan servo move (total ini):"); Serial.print(iNewMoveCommand); Serial.print(", "); Serial.println(gServoTiltPositionCommand); }}//Ambil rata-rata matematika dari dua LDR di atas rata-rata panelfloatTopTwoSensors(){ float fAvg; // Matematika fAvg =(gLDR1 + gLDR2) / 2.0; return fAvg;}//Ambil rata-rata matematis dari dua LDR di bawah panelfloat averageBottomTwoSensors(){ float fAvg; // Matematika fAvg =(gLDR3 + gLDR4) / 2.0; return fAvg;}//Ambil rata-rata matematis dari dua LDR di sebelah kiri panelfloat averageLeftTwoSensors(){ float fAvg; //Matematika fAvg =(gLDR1 + gLDR3) / 2.0; return fAvg;}//Ambil rata-rata matematis dari dua LDR di sebelah kanan panelfloat averageRightTwoSensors(){ float fAvg; // Matematika fAvg =(gLDR2 + gLDR4) / 2.0; return fAvg;}//Memproses pesan yang diterima dari antarmuka port serial // Parameter input iControlCode adalah nilai yang diterima dari port serial untuk diproses // Dua digit pertama adalah perintah kontrol, tiga sisanya adalah nilai untuk processvoid processSerialMessage(int iControlCode){ int iControlCommand; int iControlValue; //Hitung perintah dan nilai iControlCommand =iControlCode / 1000; iControlValue =iControlCode % 1000; //Report perintah dan nilai Serial.print("kode kontrol:"); Serial.println(iControlCode); Serial.print("perintah kontrol:"); Serial.println(iControlCommand); Serial.print("nilai kontrol:"); Serial.println(iControlValue); //Kategori perintah lain-lain if (iControlCommand ==10) { if (iControlValue ==0) { gVerboseDiagMode =true; digitalWrite(O_BLUE_LED_PIN, TINGGI); Serial.println("modus diagnostik dimulai"); } else if (iControlValue ==1) { gVerboseDiagMode =false; digitalWrite(O_BLUE_LED_PIN, RENDAH); Serial.println("modus diagnostik dihentikan"); } else if (iControlValue ==2) { reportProductInfo(); } else if (iControlValue ==3) { //LED merah pada digitalWrite(O_RED_LED_PIN, HIGH); Serial.println("lampu merah menyala"); } else if (iControlValue ==4) { //LED merah mati digitalWrite(O_RED_LED_PIN, LOW); Serial.println("lampu merah mati"); } else if (iControlValue ==5) { //LED Hijau pada digitalWrite(O_GREEN_LED_PIN, HIGH); Serial.println("lampu hijau menyala"); } else if (iControlValue ==6) { //LED Hijau mati digitalWrite(O_GREEN_LED_PIN, LOW); Serial.println("lampu hijau mati"); } else if (iControlValue ==7) { //LED Biru pada digitalWrite(O_BLUE_LED_PIN, HIGH); Serial.println("lampu biru menyala"); } else if (iControlValue ==8) { //LED Biru mati digitalWrite(O_BLUE_LED_PIN, LOW); Serial.println("lampu biru mati"); } else if (iControlValue ==9) { //Menampilkan nilai LDR1 Serial.print("Nilai LDR1:"); Serial.println(gLDR1); } else if (iControlValue ==10) { //Menampilkan nilai LDR2 Serial.print("Nilai LDR2:"); Serial.println(gLDR2); } else if (iControlValue ==11) { //Menampilkan nilai LDR3 Serial.print("Nilai LDR3:"); Serial.println(gLDR3); } else if (iControlValue ==12) { //Menampilkan nilai LDR4 Serial.print("Nilai LDR4:"); Serial.println(gLDR4); } else if (iControlValue ==13) { //Aktifkan mode pelacakan enableTracking(); } else if (iControlValue ==14) { //Matikan mode pelacakan disableTracking(); } else if (iControlValue ==19) { if (gRunning ==true &&gServoTwistMoveIP ==false &&gServoTiltMoveIP ==false) { gServoTwistPositionCommand =90; gServoTiltPositionCommand =90; Serial.println("Memutar dan memiringkan servos diperintahkan hingga 90 derajat"); } } else if (iControlValue ==21) { if (gRunning ==true) { gTrackToLightEnabled =true; Serial.println("Lacak ke sumber cahaya diaktifkan"); } } else if (iControlValue ==22) { gTrackToLightEnabled =false; Serial.println("Lacak ke sumber cahaya dinonaktifkan"); } else { Serial.print("nilai kontrol tidak valid:"); Serial.println(iControlValue); } } //Servo1 (twist) kategori perintah if (iControlCommand ==11) { if (iControlValue>=0 &&iControlValue <=179) { //Pindahkan servo1 ke posisi if (gRunning ==true &&gServoTwistMoveIP ==false) { gServoTwistPositionCommand =iControlValue; gServoTwistMoveIP =benar; Serial.print("Pindahkan perintah servo putar:"); Serial.println(gServoTwistPositionCommand); } } else { Serial.print("nilai kontrol tidak valid:"); Serial.println(iControlValue); } } //Servo2 (miring) kategori perintah if (iControlCommand ==12) { if (iControlValue>=0 &&iControlValue <=179) { //Pindahkan servo2 ke posisi //Pindahkan servo1 ke posisi if (gRunning ==true &&gServoTiltMoveIP ==false) { gServoTiltPositionCommand =iControlValue; gServoTiltMoveIP =benar; Serial.print("Memindahkan perintah servo miring:"); Serial.println(gServoTiltPositionCommand); } else { Serial.print("servo miring tidak diaktifkan atau sedang bergerak, "); Serial.print(gRunning); Serial.print(", "); Serial.println(gServoTiltMoveIP); } } else { Serial.print("nilai kontrol tidak valid:"); Serial.println(iControlValue); } } //End of request string Serial.println("-----");}//Jalankan urutan langkah untuk fungsi self-test, aktifkan servos dan masukkan mode pelacakan cahayavoid startup(){ int iDelay; //Inisialisasi iDelay =500; //Menampilkan laporan info aplikasiProductInfo(); penundaan (iDelay); //Nyalakan proses LED merahSerialMessage(10003); penundaan (iDelay); //Matikan LED merah, nyalakan LED hijau processSerialMessage(10004); prosesSerialMessage(10005); penundaan (iDelay); //Matikan LED hijau, nyalakan LED biru processSerialMessage(10006); processSerialMessage(10007); penundaan (iDelay); //Matikan LED biru, tampilkan nilai resistor foto (keempatnya) processSerialMessage(10008); processSerialMessage(10009); prosesSerialMessage(10010); prosesSerialMessage(10011); prosesSerialMessage(10012); penundaan (iDelay); //Aktifkan servos enableTracking(); penundaan (iDelay); //Pindahkan servos ke home position processSerialMessage(10019); penundaan (iDelay); //Nonaktifkan servos disableTracking(); //Say good-bye Serial.println("startup sequence complete");}//Kirim informasi produk ke serial portvoid reportProductInfo(){ //Laporkan produk dan informasi lainnya ke serial port Serial.println("q versi 2" ); Serial.println("tucson, arizona usa"); Serial.println("Mei 2018"); Serial.print("checksum"); Serial.println("58BA-D969-2F82-08FD-2078-2777-396D-E1AA");}

Suku cadang dan penutup khusus

q2_assembly_details_RCbi893qzA.zip

Skema

q2_schematic_TVp7kakwNa.fzz

Proses manufaktur

  1. Sistem Pemanas Tenaga Surya
  2. Sel Surya
  3. Akuisisi Data Real-Time Panel Surya Menggunakan Arduino
  4. Smart Blinds
  5. Pelacak surya berbasis Internet of things (IoT)
  6. SmartPostBox
  7. Panel Pelacak Surya Sumbu Ganda dengan Mode Otomatis dan Manual
  8. Pengertian energi matahari
  9. Panel Surya:Masalah Kualitas dan Poin Kontrol Utama
  10. Proses Pembuatan Panel Surya:Bagaimana Panel Surya Dibuat?