Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Servogestuurd, lichtvolgend zonnepaneelplatform

Componenten en benodigdheden

Fotoweerstand
× 4
Adafruit Flora RGB Neopixel LED's - Set van 4
of gelijkwaardige RBG meerkleurige LED
× 1
SparkFun Drukknopschakelaar 12 mm
of gelijkwaardige normaal geopende drukknop
× 2
Temperatuursensor
× 1
Arduino UNO
× 1
RobotGeek 180 graden robotservo
of gelijkwaardig. Ik gebruikte Futaba S3003-servo's
× 2
Weerstand 10k ohm
× 6
Weerstand 221 ohm
Ik gebruikte 220 ohm
× 1
Condensator 100 µF
× 2
zonnepaneel (80 mm x 80 mm)
kan worden gekocht op Amazon.com of gelijkwaardig
× 1

Benodigde gereedschappen en machines

Handgereedschap en een paar kleine moeren en bouten om de beugel te maken
td>
Solide basis voor montage van de "twist" servomotor.
Ik heb een klein blok hout gebruikt
Buigbaar metaal of kleine platen van stijf aluminium die kunnen worden gevormd tot een "L"-vormige beugel
Ik heb ongeveer. 3 mm dik aluminium dat net geen 2 cm breed is
Dun, buigbaar metaal om een ​​beugel te vormen om het zonnepaneelplatform vast te houden en monteer het op de "twist" servo
Ik gebruikte dunne stalen strips die ik in de ijzerhandel kocht en die meestal worden gebruikt om HVAC-leidingen bij elkaar te houden. Heeft montagegaten voorgeboord voor gemak

Apps en online services

Arduino IDE
Microsoft Excel voor documentatie en notities

Over dit project

Dit is een andere implementatie van het gebruik van twee 180 graden servo's en vier fotoweerstanden om een ​​klein zonnepaneel te kunnen volgen om uit te lijnen met het gebied met de meeste lichtintensiteit.

De motoren maken kleine bewegingen om het zonnepaneel op het helderste licht te richten.

Er is ook een meerkleurige LED om aan te geven of het systeem is ingeschakeld of niet. En twee drukknoppen om de motoren in/uit te schakelen.

Er zijn een paar routines die kunnen worden gebruikt om de motoren naar de opgedragen posities te verplaatsen. De commando's zijn via de seriële poortinterface en een reeks numerieke codes/commando's die naar de Arduino Uno kunnen worden gestuurd.

De onafhankelijke bewegingscommando's zijn zo geprogrammeerd dat ze (enigszins) vloeiende bewegingen geven in plaats van onmiddellijke positiecommando's die ervoor zorgen dat het mechanische mechanisme heftig beweegt.

Code

  • Q2-code
Q2-codeArduino
//Scott Mangiacotti//Tucson, Arizona VS//mei 2018//Q2//Version 2.0#include //Constantsint const GIVE_BACK_TIME =125;//Constanten voor inputsint const I_RED_BUTTON_PIN =4;int const I_GREEN_BUTTON_PIN =2;int const I_LDR1_PIN =A3; //linksboven const I_LDR2_PIN =A2; // rechtsboven const I_LDR3_PIN =A1; //linksonder const I_LDR4_PIN =A0; //rechtsonder//Constanten voor 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;//GlobalLightning variables =Tbool;bool gVerboseDiagMode =false;Servo gServoTwist;int gServoTwistPositionCommand; // opdracht positionbool gServoTwistMoveIP; //move in progressServo gServoTilt;bool gServoTiltMoveIP; //move in progressint gServoTiltPositionCommand; //commanded positionint gLDR1;int gLDR2;int gLDR3;int gLDR4;//Runs oncevoid setup() {//Open een seriële poort Serial.begin (9600); //Setup digitale ingangen pinMode (I_RED_BUTTON_PIN, INPUT); pinMode (I_GREEN_BUTTON_PIN, INPUT); //Setup digitale uitgangen pinMode (O_RED_LED_PIN, OUTPUT); pinMode (O_GREEN_LED_PIN, UITGANG); pinMode (O_BLUE_LED_PIN, UITGANG); //Run de opstartroutine startup();}//Runs continuousvoid loop(){ //Serial port message ontvangstverwerking if (Serial.available()> 0) {int iControlCode; iControlCode =Serial.parseInt(); processSerialMessage (iControlCode); } //Lees groene knop in iGreenButton; iGreenButton =digitalRead (I_GREEN_BUTTON_PIN); if (iGreenButton ==HOOG &&gRunning ==false) { enableTracking(); gTrackToLightEnabled =waar; } // Lees rode knop in iRedButton; iRedButton =digitalRead (I_RED_BUTTON_PIN); if (iRedButton ==HOOG &&gRunning ==waar) { disableTracking(); } // Lees alle instrumentatie in globale variabelen readPhotoResistors(); gemiddeldeTopTwoSensors(); gemiddeldeBottomTwoSensors(); // Pas servoposities aan volgens licht op fotoweerstanden if (gRunning ==true) {if (gTrackToLightEnabled ==true) { // Maak kleine bewegingen van servo's op basis van lichtniveaus van fotoweerstand trackToLightSensors (); } else { //Maak kleine bewegingen op basis van gebruikerscommando's op de seriële poort. Vermijdt bewegingen met hoge snelheid op het mechanisme smoothMoveTwist(); smoothMoveTilt(); } } //Geef wat tijd terug vertraging (GIVE_BACK_TIME);}//Zet servo trackingvoid enableTracking() aan {//Stel globale variabelen in zodat andere delen van het programma weten dat motoren klaar zijn om te draaien gRunning =true; // Bevestig aan de servomotoren gServoTwist.attach (O_TWIST_SERVO_PIN); gServoTilt.attach(O_TILT_SERVO_PIN); // Zet groene LED aan en zet rode LED digitalWrite uit (O_GREEN_LED_PIN, HIGH); digitalWrite (O_RED_LED_PIN, LAAG); //Post resultaten Serial.println("servo's ingeschakeld");}//Zet servo trackingvoid disableTracking(){gRunning =false; gTrackToLightEnabled =false; // Loskoppelen van servomotoren gServoTwist.detach (); gServoTilt.detach(); //Opschonen move commando en verplaatsen in-process (IP) variabelen gServoTwistPositionCommand =gServoTwist.read(); gServoTwistMoveIP =onwaar; //Opschonen move commando en verplaatsen in-process (IP) variabelen gServoTiltPositionCommand =gServoTilt.read(); gServoTiltMoveIP =onwaar; // Zet rode LED aan, zet groene LED digitalWrite uit (O_RED_LED_PIN, HIGH); digitalWrite (O_GREEN_LED_PIN, LAAG); //Post resultaten Serial.println("servo's uitgeschakeld");}//Track to light op basis van fotosensor valuesvoid trackToLightSensors(){ float fTop; vlotter onder; vlotter links; drijven fRechts; int iTwistMoveCommand; int iTiltMoveCommand; int iMoveAmount; //Initialiseren //De onderstaande variabele bepaalt hoeveel graden van potentiële beweging voor beide servo's //per scan van het programma. Dit getal in combinatie met de globale constante // genaamd 'GIVE_BACK_TIME' bepaalt hoe agressief de zetten zullen zijn. iMoveAmount =5; // Krijg huidige servoposities iTwistMoveCommand =gServoTwist.read (); iTiltMoveCommand =gServoTilt.read(); //Gemiddelden ophalen fTop =gemiddeldeTopTwoSensors(); fBottom =gemiddeldeBottomTwoSensors(); fLeft =gemiddeldeLeftTwoSensors(); fRight =gemiddeldeRightTwoSensors(); //Bereken de draaibeweging als (fLeft> fRight) {//Move positive iTwistMoveCommand +=iMoveAmount; } else if (fRight> fLeft) {//Verplaats negatieve iTwistMoveCommand -=iMoveAmount; } anders { // Hetzelfde. niet bewegen} //Bereken kantelbeweging als (fTop>
 fBottom) { //Move positive iTiltMoveCommand +=iMoveAmount; } else if (fBottom> fTop) {//Move negative iTiltMoveCommand -=iMoveAmount; } anders { // Hetzelfde. niet bewegen} //Bounds check twist servo move commando if (iTwistMoveCommand <0) { iTwistMoveCommand =0; } if (iTwistMoveCommand> 179) { iTwistMoveCommand =179; } //Bounds check tilt servo move commando if (iTiltMoveCommand <45) { iTiltMoveCommand =45; } if (iTiltMoveCommand> 135) { iTiltMoveCommand =135; } //Voer bewegingen uit gServoTwist.write (iTwistMoveCommand); gServoTilt.write(iTiltMoveCommand); // Post resultaten if (gVerboseDiagMode ==true) { Serial.println("tl, tr, bl, br, top avg, bottom avg, left avg, right avg, twist move, tilt move:"); Seriële.afdruk (gLDR1); Serieel.print(", "); Seriële.afdruk (gLDR2); Serieel.print(", "); Seriële.afdruk (gLDR3); Serieel.print(", "); Seriële.afdruk (gLDR4); Serieel.print(", "); Serial.print(fTop); Serieel.print(", "); Serial.print(fBottom); Serieel.print(", "); Serial.print(fLinks); Serieel.print(", "); Serial.print(fRight); Serieel.print(", "); Serial.print(iTwistMoveCommand); Serieel.print(", "); Serial.println(iTiltMoveCommand); } }//lees fotoresistorwaarden in globale variabelenvoid readPhotoResistors(){ //Waarden zijn geschaald van 0-1024 gLDR1 =analogRead(I_LDR1_PIN); gLDR2 =analoog lezen (I_LDR2_PIN); gLDR3 =analoog lezen (I_LDR3_PIN); gLDR4 =analogRead(I_LDR4_PIN);}//Wanneer de servo's naar een positie worden gestuurd, bewegen ze met hoge snelheid.//Te snel heeft mogelijk invloed op de mechanische structuur die het zonnepaneel en het lichtsensorplatform vasthoudt en beweegt. Deze routine neemt een "verplaatsingsopdracht"// en maakt kleine incrementele bewegingen totdat de servo op die gewenste positie is.//Deze routine is voor de op de basis gemonteerde draaiende servomotor leeg smoothMoveTwist(){ int iCurrentPos; int iMoveAmountPerScan; int iNewMoveCommand; //Stel het verplaatsingsbedrag per scan in graden in. // Combinatie van deze variabele en globale const 'GIVE_BACK_TIME' bepalen de algehele bewegingssnelheid iMoveAmountPerScan =1; // Bepaal de huidige positie iCurrentPos =gServoTwist.read (); // Zijn we op positie? if (iCurrentPos ==gServoTwistPositionCommand) { gServoTwistMoveIP =false; opbrengst; } else { gServoTwistMoveIP =waar; } //Begin waar we ons momenteel bevinden bij iNewMoveCommand =iCurrentPos; // Bepaal het verplaatsingsbedrag als (iCurrentPos  179) { iNewMoveCommand =179; } //Verplaats gServoTwist.write (iNewMoveCommand); // Post resultaten if (gVerboseDiagMode ==true) { //todo:Serial.print ("Twist servo move (this move, total):"); Serial.print(iNewMoveCommand); Serieel.print(", "); Serial.println(gServoTwistPositionCommand); }}//Als de servo's naar een positie worden gestuurd, bewegen ze met hoge snelheid.//Te snel heeft mogelijk invloed op de mechanische structuur die het zonnepaneel en het lichtsensorplatform vasthoudt en beweegt. Deze routine neemt een "bewegingscommando"// en maakt kleine incrementele bewegingen totdat de servo zich op die gewenste positie bevindt.//Deze routine is voor de op een beugel gemonteerde kantelservomotorvoid smoothMoveTilt(){ int iCurrentPos; int iMoveAmountPerScan; int iNewMoveCommand; //Stel het verplaatsingsbedrag per scan in graden in. // Combinatie van deze variabele en globale const 'GIVE_BACK_TIME' bepalen de algehele bewegingssnelheid iMoveAmountPerScan =1; // Bepaal de huidige positie iCurrentPos =gServoTilt.read (); // Zijn we op positie? if (iCurrentPos ==gServoTiltPositionCommand) { gServoTiltMoveIP =false; opbrengst; } else { gServoTiltMoveIP =waar; } //Begin waar we ons momenteel bevinden bij iNewMoveCommand =iCurrentPos; // Bepaal het verplaatsingsbedrag als (iCurrentPos  179) { iNewMoveCommand =179; } //Verplaats gServoTilt.write (iNewMoveCommand); // Post resultaten if (gVerboseDiagMode ==true) {//todo:Serial.print ("Tilt servo move (this move, total):"); Serial.print(iNewMoveCommand); Serieel.print(", "); Serial.println(gServoTiltPositionCommand); }}//Neem het wiskundige gemiddelde van de twee LDR's bovenaan panelfloat averageTopTwoSensors(){ float fAvg; //Math fAvg =(gLDR1 + gLDR2) / 2.0; return fAvg;}//Neem het wiskundige gemiddelde van de twee LDR's onderaan panelfloat averageBottomTwoSensors(){ float fAvg; //Math fAvg =(gLDR3 + gLDR4) / 2.0; return fAvg;}//Neem het wiskundige gemiddelde van de twee LDR's links van panelfloat averageLeftTwoSensors(){ float fAvg; //Math fAvg =(gLDR1 + gLDR3) / 2.0; return fAvg;}//Neem het wiskundige gemiddelde van de twee LDR's rechts van panelfloat averageRightTwoSensors(){ float fAvg; //Math fAvg =(gLDR2 + gLDR4) / 2.0; return fAvg;}//Verwerk ontvangen berichten van de seriële poortinterface//Invoerparameter iControlCode is de waarde die is ontvangen van de seriële poort die moet worden verwerkt//Eerste twee cijfers zijn het besturingscommando, de resterende drie zijn de waarde die moet worden verwerktvoid processSerialMessage(int iControlCode){ int iControlCommand; int iControlValue; // Bereken opdracht en waarde iControlCommand =iControlCode / 1000; iControlValue =iControlCode % 1000; // Rapporteer opdracht en waarde Serial.print ("controlecode:"); Serial.println(iControlCode); Serial.print("besturingsopdracht:"); Serial.println(iControlCommand); Serial.print("controlewaarde:"); Serial.println(iControlValue); // Diverse opdrachtcategorie if (iControlCommand ==10) {if (iControlValue ==0) { gVerboseDiagMode =true; digitalWrite (O_BLUE_LED_PIN, HOOG); Serial.println("diagnosemodus gestart"); } else if (iControlValue ==1) { gVerboseDiagMode =false; digitalWrite (O_BLUE_LED_PIN, LAAG); Serial.println ("diagnosemodus gestopt"); } else if (iControlValue ==2) { reportProductInfo(); } else if (iControlValue ==3) {// Rode LED op digitalWrite (O_RED_LED_PIN, HIGH); Serial.println ("rode led aan"); } else if (iControlValue ==4) {// Rode LED uit digitalWrite (O_RED_LED_PIN, LOW); Serial.println ("rode led uit"); } else if (iControlValue ==5) {//Groene LED op digitalWrite (O_GREEN_LED_PIN, HIGH); Serial.println ("groene led aan"); } else if (iControlValue ==6) {// Groene LED uit digitalWrite (O_GREEN_LED_PIN, LOW); Serial.println ("groene led uit"); } else if (iControlValue ==7) {// Blauwe LED op digitalWrite (O_BLUE_LED_PIN, HIGH); Serial.println ("blauwe led aan"); } else if (iControlValue ==8) {// Blauwe LED uit digitalWrite (O_BLUE_LED_PIN, LOW); Serial.println ("blauwe led uit"); } else if (iControlValue ==9) { //LDR1-waarde Serial.print weergeven ("LDR1-waarde:"); Seriële.println(gLDR1); } else if (iControlValue ==10) { //LDR2-waarde Serial.print weergeven ("LDR2-waarde:"); Seriële.println(gLDR2); } else if (iControlValue ==11) { //LDR3-waarde Serial.print weergeven ("LDR3-waarde:"); Seriële.println(gLDR3); } else if (iControlValue ==12) { //LDR4-waarde Serial.print weergeven ("LDR4-waarde:"); Seriële.println(gLDR4); } else if (iControlValue ==13) { // Zet de volgmodus aan enableTracking (); } else if (iControlValue ==14) {//Schakel de trackingmodus uit disableTracking(); } else if (iControlValue ==19) { if (gRunning ==true &&gServoTwistMoveIP ==false &&gServoTiltMoveIP ==false) { gServoTwistPositionCommand =90; gServoTiltPositionCommand =90; Serial.println("draai- en kantelservo's tot 90 graden bevolen"); } } else if (iControlValue ==21) { if (gRunning ==true) { gTrackToLightEnabled =true; Serial.println("Track naar lichtbron ingeschakeld"); } } else if (iControlValue ==22) { gTrackToLightEnabled =false; Serial.println("Track naar lichtbron uitgeschakeld"); } else { Serial.print("ongeldige controlewaarde:"); Serial.println(iControlValue); } } //Servo1 (twist) opdrachtcategorie if (iControlCommand ==11) {if (iControlValue>=0 &&iControlValue <=179) { //Verplaats servo1 naar positie if (gRunning ==true &&gServoTwistMoveIP ==false) { gServoTwistPositionCommand =iControlValue; gServoTwistMoveIP =waar; Serial.print("Verplaats de draaiservo-opdracht:"); Serial.println(gServoTwistPositionCommand); } } else { Serial.print("ongeldige controlewaarde:"); Serial.println(iControlValue); } } //Servo2 (tilt) commando categorie if (iControlCommand ==12) { if (iControlValue>=0 &&iControlValue <=179) { //Verplaats servo2 naar positie //Verplaats servo1 naar positie if (gRunning ==true &&gServoTiltMoveIP ==false) { gServoTiltPositionCommand =iControlValue; gServoTiltMoveIP =waar; Serial.print ("Verplaats tilt servo-opdracht:"); Serial.println(gServoTiltPositionCommand); } else { Serial.print("kantelservo niet ingeschakeld of bezig met bewegen, "); Serial.print(gRunning); Serieel.print(", "); Serial.println(gServoTiltMoveIP); } } else { Serial.print("ongeldige controlewaarde:"); Serial.println(iControlValue); } } //Einde van verzoekreeks Serial.println("-----");}//Voer een reeks stappen uit om functies zelf te testen, servo's in te schakelen en naar de lichtvolgmodus te gaanvoid startup(){ int iDelay; // Initialiseer iDelay =500; //Toon app-info reportProductInfo(); vertraging (iDelay); // Schakel rode LED processSerialMessage (1003) in; vertraging (iDelay); // Schakel rode LED uit, zet groene LED aan processSerialMessage(10004); processSerialMessage(10005); vertraging (iDelay); // Zet groene LED uit, zet blauwe LED aan processSerialMessage (10006); processSerialMessage(10007); vertraging (iDelay); // Schakel blauwe LED uit, toon fotoweerstandswaarden (alle vier) processSerialMessage (10008); processSerialMessage(10009); processSerialMessage (10010); processSerialMessage(10011); processSerialMessage(10012); vertraging (iDelay); //Schakel servo's inschakelenTracking in (); vertraging (iDelay); // Verplaats servo's naar startpositie processSerialMessage (10019); vertraging (iDelay); // Schakel servo's uit disableTracking (); //Zeg vaarwel Serial.println("opstartvolgorde voltooid");}//Stuur productinformatie naar het seriële poortvoid reportProductInfo(){ //Rapport product en andere informatie naar seriële poort Serial.println("q versie 2" ); Serial.println("tucson, arizona usa"); Serial.println("mei 2018"); Serial.print("checksum"); Serial.println("58BA-D969-2F82-08FD-2078-2777-396D-E1AA");}

Aangepaste onderdelen en behuizingen

q2_assembly_details_RCbi893qzA.zip

Schema's

q2_schematic_TVp7kakwNa.fzz

Productieproces

  1. Zonne-verwarmingssysteem
  2. Zonnecel
  3. Real-time data-acquisitie van zonnepaneel met behulp van Arduino
  4. Slimme jaloezieën
  5. Internet of things (IoT)-gebaseerde zonne-tracker
  6. SmartPostBox
  7. Dubbelassig zonne-trackerpaneel met automatische en handmatige modus
  8. Zonnepaneel Sun Tracker - Telefoonoplader
  9. Zonne-energie begrijpen
  10. Zonnepaneel:kwaliteitsproblemen en belangrijke controlepunten
  11. Productieproces voor zonnepanelen:hoe wordt een zonnepaneel gemaakt?