Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Plateforme de panneaux solaires à servocommande et suivi de la lumière

Composants et fournitures

Résistance photo
× 4
LED Adafruit Flora RGB Neopixel - Pack de 4
ou LED multicolore RBG équivalente
× 1
Interrupteur à bouton-poussoir SparkFun 12mm
ou un bouton poussoir normalement ouvert équivalent
× 2
Capteur de température
× 1
Arduino UNO
× 1
Servo robot RobotGeek 180 degrés
ou équivalent. J'ai utilisé des servos Futaba S3003
× 2
Résistance 10k ohm
× 6
Résistance 221 ohm
J'ai utilisé 220 ohm
× 1
Condensateur 100 µF
× 2
panneau solaire (80mm x 80mm)
peut être acheté sur Amazon.com ou équivalent
× 1

Outils et machines nécessaires

Outils à main et quelques petits écrous et boulons pour créer le support
Base solide pour le montage du servomoteur "twist".
J'ai utilisé un petit bloc de bois
Métal pliable ou petites feuilles d'aluminium rigide pouvant être transformées en un support en forme de "L"
J'ai utilisé env. Aluminium de 3 mm d'épaisseur qui fait un peu moins de 2 cm de large
Métal fin et pliable pour former un support pour tenir la plate-forme du panneau solaire et montez-le sur le servo "twist"
J'ai utilisé de fines bandes d'acier achetées dans une quincaillerie, généralement utilisées pour maintenir ensemble les conduits de CVC. A des trous de montage pré-percés pour plus de facilité

Applications et services en ligne

Arduino IDE
Microsoft Excel pour la documentation et les notes

À propos de ce projet

Il s'agit d'une autre implémentation consistant à utiliser deux servos à 180 degrés et quatre photo-résistances pour pouvoir suivre un petit panneau solaire afin de l'aligner sur la zone de plus grande intensité lumineuse.

Les moteurs font de petits mouvements pour essayer de diriger le panneau solaire vers la lumière la plus brillante.

Il y a aussi une LED multicolore pour indiquer si le système est activé ou non. Et deux boutons poussoirs pour activer/désactiver les moteurs.

Il existe quelques routines qui peuvent être utilisées pour déplacer les moteurs vers des positions commandées. Les commandes se font via l'interface du port série et une série de codes/commandes numériques qui peuvent être envoyés à l'Arduino Uno.

Les commandes de mouvement indépendantes sont programmées de manière à fournir des mouvements (plutôt) fluides au lieu de commandes de position immédiates qui provoquent un mouvement violent du mécanisme mécanique.

Code

  • Code Q2
Code Q2Arduino
//Scott Mangiacotti//Tucson, Arizona USA//Mai 2018//Q2//Version 2.0#include //Constantsint const GIVE_BACK_TIME =125;//Constantes pour les entréesint const I_RED_BUTTON_PIN =4;int const I_GREEN_BUTTON_PIN =2;int const I_LDR1_PIN =A3; // en haut à gauche const I_LDR2_PIN =A2; //en haut à droite const I_LDR3_PIN =A1; //en bas à gauche const I_LDR4_PIN =A0; //en bas à droite//Constantes pour les sortiesint 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;//gLightGlobal variablesbo;bool gVerboseDiagMode =false;Servo gServoTwist;int gServoTwistPositionCommand; //position commandéebool gServoTwistMoveIP; //mouvement en coursServo gServoTilt;bool gServoTiltMoveIP; //déplacer en progressint gServoTiltPositionCommand; //position commandéeint gLDR1;int gLDR2;int gLDR3;int gLDR4;//Exécute oncevoid setup() { //Ouvre un port série Serial.begin(9600); //Configuration des entrées numériques pinMode(I_RED_BUTTON_PIN, INPUT); pinMode(I_GREEN_BUTTON_PIN, INPUT); //Configuration des sorties numériques pinMode(O_RED_LED_PIN, OUTPUT); pinMode(O_GREEN_LED_PIN, SORTIE); pinMode(O_BLUE_LED_PIN, SORTIE); //Exécuter la routine de démarrage startup();}//Exécuter une boucle en continu (){ //Traitement de réception de message du port série if (Serial.available()> 0) { int iControlCode; iControlCode =Serial.parseInt(); processSerialMessage(iControlCode); } //Lire le bouton vert int iGreenButton; iGreenButton =digitalRead(I_GREEN_BUTTON_PIN); if (iGreenButton ==HIGH &&gRunning ==false) { enableTracking(); gTrackToLightEnabled =true ; } //Lire le bouton rouge int iRedButton; iRedButton =digitalRead(I_RED_BUTTON_PIN); if (iRedButton ==HIGH &&gRunning ==true) { disableTracking(); } //Lire toute l'instrumentation dans les variables globales readPhotoResistors(); moyenneTopTwoSensors(); moyenneBottomTwoSensors(); //Ajustez les positions des servos en fonction de la lumière sur les photorésistances if (gRunning ==true) { if (gTrackToLightEnabled ==true) { //Faites de petits mouvements de servos en fonction des niveaux de lumière des photo-résistances trackToLightSensors(); } else { // Effectuez de petits mouvements en fonction des commandes utilisateur sur le port série. Évite les mouvements à grande vitesse sur le mécanisme smoothMoveTwist(); smoothMoveTilt(); } } //Donnez un peu de temps en arrière (GIVE_BACK_TIME);}//Activez le suivi des servosvoid enableTracking(){ //Définissez les variables globales pour que les autres parties du programme sachent que les moteurs sont prêts à fonctionner gRunning =true; // Attacher aux servomoteurs gServoTwist.attach(O_TWIST_SERVO_PIN); gServoTilt.attach(O_TILT_SERVO_PIN); // Allumez la LED verte et éteignez la LED rouge digitalWrite(O_GREEN_LED_PIN, HIGH); digitalWrite(O_RED_LED_PIN, LOW); //Publier les résultats Serial.println("servos enabled");}//Désactiver le suivi des servosvoid disableTracking(){ gRunning =false; gTrackToLightEnabled =false; //Se détacher des servomoteurs gServoTwist.detach(); gServoTilt.detach(); //Nettoyez la commande de déplacement et déplacez les variables in-process (IP) gServoTwistPositionCommand =gServoTwist.read(); gServoTwistMoveIP =false ; //Nettoyez la commande de déplacement et déplacez les variables en cours (IP) gServoTiltPositionCommand =gServoTilt.read(); gServoTiltMoveIP =false ; // Allumez la LED rouge, éteignez la LED verte digitalWrite(O_RED_LED_PIN, HIGH); digitalWrite(O_GREEN_LED_PIN, BAS); //Publier les résultats Serial.println("servos désactivés");}//Track to light basé sur les valeurs du photocapteurvoid trackToLightSensors(){ float fTop; flotteur fBas; flotteur fGauche ; flotter à droite ; int iTwistMoveCommand; int iTiltMoveCommand; int iMoveAmount; //Initialiser //La variable ci-dessous détermine le nombre de degrés de mouvement potentiel pour les deux servos //par balayage du programme. Ce nombre en combinaison avec la constante globale //nommée 'GIVE_BACK_TIME' détermine l'agressivité des mouvements. iMoveAmount =5 ; //Obtenir les positions actuelles des servos iTwistMoveCommand =gServoTwist.read(); iTiltMoveCommand =gServoTilt.read(); //Obtenir les moyennes fTop =averageTopTwoSensors(); fBottom =moyenneBottomTwoSensors(); fGauche =moyenneGaucheTwoSensors(); fDroit =​​moyenneDroiteTwoSensors(); //Calculer le mouvement de torsion if (fLeft> fRight) { //Move positive iTwistMoveCommand +=iMoveAmount; } else if (fRight> fLeft) { //Move negative iTwistMoveCommand -=iMoveAmount; } else { // Idem. ne pas bouger } //Calculer le mouvement d'inclinaison if (fTop> fBottom) { //Move positive iTiltMoveCommand +=iMoveAmount; } else if (fBottom> fTop) { //Move negative iTiltMoveCommand -=iMoveAmount; } else { // Idem. ne pas bouger } //Les limites vérifient la commande de déplacement du servo de torsion if (iTwistMoveCommand <0) { iTwistMoveCommand =0; } if (iTwistMoveCommand> 179) { iTwistMoveCommand =179; } //Les limites vérifient la commande de déplacement du servo d'inclinaison if (iTiltMoveCommand <45) { iTiltMoveCommand =45; } if (iTiltMoveCommand> 135) { iTiltMoveCommand =135 ; } //Effectuer les déplacements gServoTwist.write(iTwistMoveCommand); gServoTilt.write(iTiltMoveCommand); // Publier les résultats if (gVerboseDiagMode ==true) { Serial.println("tl, tr, bl, br, top moy, bottom moy, left moy, right moy, 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(fLeft); Serial.print(", "); Serial.print(fDroit); Serial.print(", "); Serial.print(iTwistMoveCommand); Serial.print(", "); Serial.println(iTiltMoveCommand); } }//lire les valeurs des photorésistances dans les variables globales void readPhotoResistors(){ //Les valeurs sont mises à l'échelle de 0 à 1024 gLDR1 =analogRead(I_LDR1_PIN); gLDR2 =analogRead(I_LDR2_PIN); gLDR3 =analogRead(I_LDR3_PIN); gLDR4 =analogRead(I_LDR4_PIN);}//Lorsque les servos sont commandés vers une position, ils se déplacent à une vitesse rapide.//Trop rapide affectera potentiellement la structure mécanique qui maintient et déplace//le panneau solaire et la plate-forme de capteur de lumière. Cette routine prend une "commande de déplacement"//et effectue de petits mouvements incrémentiels jusqu'à ce que le servo soit à la position souhaitée.//Cette routine est pour le servomoteur de torsion monté sur la base void smoothMoveTwist(){ int iCurrentPos; int iMoveAmountPerScan; int iNewMoveCommand; //Définir la quantité de mouvement par balayage en degrés. //La combinaison de cette variable et de la const globale 'GIVE_BACK_TIME' détermine la vitesse de déplacement globale iMoveAmountPerScan =1; //Détermination de la position actuelle iCurrentPos =gServoTwist.read(); // Sommes-nous en position ? if (iCurrentPos ==gServoTwistPositionCommand) { gServoTwistMoveIP =false; retourner; } else { gServoTwistMoveIP =true ; } // Commencer là où nous en sommes actuellement à iNewMoveCommand =iCurrentPos; //Déterminer le montant du déplacement if (iCurrentPos 179) { iNewMoveCommand =179; } //Déplacer gServoTwist.write(iNewMoveCommand); //Publier les résultats if (gVerboseDiagMode ==true) { //todo:Serial.print("Twist servo move (ce mouvement, total):"); Serial.print(iNewMoveCommand); Serial.print(", "); Serial.println(gServoTwistPositionCommand); }}//Lorsque les servos sont commandés vers une position, ils se déplacent à une vitesse rapide.//Trop rapide affectera potentiellement la structure mécanique qui maintient et déplace//le panneau solaire et la plate-forme du capteur de lumière. Cette routine prend une "commande de déplacement"//et effectue de petits mouvements incrémentiels jusqu'à ce que le servo soit à la position souhaitée.//Cette routine est pour le servomoteur d'inclinaison monté sur support void smoothMoveTilt(){ int iCurrentPos; int iMoveAmountPerScan; int iNewMoveCommand; //Définir la quantité de mouvement par balayage en degrés. //La combinaison de cette variable et de la const globale 'GIVE_BACK_TIME' détermine la vitesse de déplacement globale iMoveAmountPerScan =1; //Détermination de la position actuelle iCurrentPos =gServoTilt.read(); // Sommes-nous en position ? if (iCurrentPos ==gServoTiltPositionCommand) { gServoTiltMoveIP =false; retourner; } else { gServoTiltMoveIP =true ; } // Commencer là où nous en sommes actuellement à iNewMoveCommand =iCurrentPos; //Déterminer le montant du déplacement if (iCurrentPos 179) { iNewMoveCommand =179; } //Déplacer gServoTilt.write(iNewMoveCommand); //Afficher les résultats if (gVerboseDiagMode ==true) { //todo:Serial.print("Tilt servo move (ce mouvement, total):"); Serial.print(iNewMoveCommand); Serial.print(", "); Serial.println(gServoTiltPositionCommand); }}//Prenez la moyenne mathématique des deux LDR en haut de panelfloat averageTopTwoSensors(){ float fAvg; //Math fMoy =(gLDR1 + gLDR2) / 2.0 ; return fAvg;}//Prendre la moyenne mathématique des deux LDR en bas du panelfloat averageBottomTwoSensors(){ float fAvg; //Math fMoy =(gLDR3 + gLDR4) / 2.0 ; return fAvg;}//Prendre la moyenne mathématique des deux LDR à gauche de panelfloat averageLeftTwoSensors(){ float fAvg; //Math fMoy =(gLDR1 + gLDR3) / 2.0 ; return fAvg;}//Prendre la moyenne mathématique des deux LDR à droite du panelfloat averageRightTwoSensors(){ float fAvg; //Math fMoy =(gLDR2 + gLDR4) / 2.0 ; return fAvg;}//Traiter les messages reçus de l'interface du port série//Le paramètre d'entrée iControlCode est la valeur reçue du port série à traiter//Les deux premiers chiffres sont la commande de contrôle, les trois autres sont la valeur à processvoid processSerialMessage(int iControlCode){ int iControlCommand; int iValeurContrôle; //Calculer la commande et la valeur iControlCommand =iControlCode / 1000; iValeurContrôle =iCodeContrôle % 1000 ; //Commande et valeur de rapport Serial.print("code de contrôle :"); Serial.println(iControlCode); Serial.print("commande de contrôle :"); Serial.println(iControlCommand); Serial.print("valeur de contrôle :"); Serial.println(iControlValue); //Catégorie de commandes diverses if (iControlCommand ==10) { if (iControlValue ==0) { gVerboseDiagMode =true; digitalWrite(O_BLUE_LED_PIN, HAUT); Serial.println("mode diagnostic démarré"); } else if (iControlValue ==1) { gVerboseDiagMode =false; digitalWrite(O_BLUE_LED_PIN, BAS); Serial.println("mode diagnostic arrêté"); } else if (iControlValue ==2) { reportProductInfo(); } else if (iControlValue ==3) { // LED rouge sur digitalWrite (O_RED_LED_PIN, HIGH); Serial.println("led rouge allumée"); } else if (iControlValue ==4) { // LED rouge éteinte digitalWrite(O_RED_LED_PIN, LOW); Serial.println("led rouge éteinte"); } else if (iControlValue ==5) { // LED verte sur digitalWrite (O_GREEN_LED_PIN, HIGH); Serial.println("led verte allumée"); } else if (iControlValue ==6) { // LED verte éteinte digitalWrite(O_GREEN_LED_PIN, LOW); Serial.println("led verte éteinte"); } else if (iControlValue ==7) { // LED bleue sur digitalWrite (O_BLUE_LED_PIN, HIGH); Serial.println("led bleue allumée"); } else if (iControlValue ==8) { // LED bleue éteinte digitalWrite(O_BLUE_LED_PIN, LOW); Serial.println("led bleue éteinte"); } else if (iControlValue ==9) { //Afficher la valeur LDR1 Serial.print("Valeur LDR1 :"); Serial.println(gLDR1) ; } else if (iControlValue ==10) { //Afficher la valeur LDR2 Serial.print("Valeur LDR2 :"); Serial.println(gLDR2) ; } else if (iControlValue ==11) { //Afficher la valeur LDR3 Serial.print("Valeur LDR3 :"); Serial.println(gLDR3) ; } else if (iControlValue ==12) { //Afficher la valeur LDR4 Serial.print("Valeur LDR4 :"); Serial.println(gLDR4) ; } else if (iControlValue ==13) { //Activer le mode de suivi enableTracking(); } else if (iControlValue ==14) { //Désactiver le mode de suivi disableTracking(); } else if (iControlValue ==19) { if (gRunning ==true &&gServoTwistMoveIP ==false &&gServoTiltMoveIP ==false) { gServoTwistPositionCommand =90; gServoTiltPositionCommand =90 ; Serial.println ("les servos de torsion et d'inclinaison commandés à 90 degrés"); } } else if (iControlValue ==21) { if (gRunning ==true) { gTrackToLightEnabled =true; Serial.println("Track to light source enabled"); } } else if (iControlValue ==22) { gTrackToLightEnabled =false; Serial.println("Track to light source disabled"); } else { Serial.print("valeur de contrôle non valide :"); Serial.println(iControlValue); } } //Catégorie de commande Servo1 (twist) if (iControlCommand ==11) { if (iControlValue>=0 &&iControlValue <=179) { //Déplacer servo1 vers la position if (gRunning ==true &&gServoTwistMoveIP ==false) { gServoTwistPositionCommand =iControlValue; gServoTwistMoveIP =vrai ; Serial.print("Move twist servo command:"); Serial.println(gServoTwistPositionCommand); } } else { Serial.print("valeur de contrôle non valide :"); Serial.println(iControlValue); } } //Catégorie de commande Servo2 (tilt) if (iControlCommand ==12) { if (iControlValue>=0 &&iControlValue <=179) { //Déplacer servo2 vers la position //Déplacer servo1 vers la position if (gRunning ==true &&gServoTiltMoveIP ==false) { gServoTiltPositionCommand =iControlValue; gServoTiltMoveIP =vrai ; Serial.print("Commande d'asservissement d'inclinaison :"); Serial.println(gServoTiltPositionCommand); } else { Serial.print("servo d'inclinaison non activé ou déplacement en cours, "); Serial.print(gRunning); Serial.print(", "); Serial.println(gServoTiltMoveIP); } } else { Serial.print("valeur de contrôle non valide :"); Serial.println(iControlValue); } } //Fin de la chaîne de requête Serial.println("-----");}//Exécutez une séquence d'étapes pour tester automatiquement les fonctions, activer les servos et entrer en mode de suivi de lumièrevoid startup(){ int iDelay; //Initialiser iDelay =500; //Afficher les informations sur l'application reportProductInfo(); retard (iDelay); // Allumez la LED rouge processSerialMessage(10003) ; retard (iDelay); //Éteignez la LED rouge, allumez la LED verte processSerialMessage(10004) ; processSerialMessage(10005) ; retard (iDelay); //Éteignez la LED verte, allumez la LED bleue processSerialMessage(10006) ; processSerialMessage(10007) ; retard (iDelay); //Éteignez la LED bleue, affichez les valeurs de la photo-résistance (les quatre) processSerialMessage(10008) ; processSerialMessage(10009) ; processSerialMessage(10010) ; processSerialMessage(10011); processSerialMessage(10012); retard (iDelay); //Activer les servos enableTracking(); retard (iDelay); // Déplacer les servos vers la position d'origine processSerialMessage(10019); retard (iDelay); //Désactiver les servos disableTracking(); //Dites au revoir Serial.println("séquence de démarrage terminée");}//Envoyez les informations sur le produit au port sériel reportProductInfo(){ //Rapportez le produit et d'autres informations au port série Serial.println("q version 2" ); Serial.println("tucson, arizona usa"); Serial.println("mai 2018"); Serial.print("somme de contrôle "); Serial.println("58BA-D969-2F82-08FD-2078-2777-396D-E1AA");}

Pièces et boîtiers personnalisés

q2_assembly_details_RCbi893qzA.zip

Schémas

q2_schematic_TVp7kakwNa.fzz

Processus de fabrication

  1. Système de chauffage solaire
  2. Cellule solaire
  3. Acquisition de données en temps réel d'un panneau solaire à l'aide d'Arduino
  4. Stores intelligents
  5. Traqueur solaire basé sur l'Internet des objets (IoT)
  6. SmartPostBox
  7. Comprendre l'énergie solaire
  8. Panneau solaire :problèmes de qualité et points de contrôle clés
  9. Processus de fabrication de panneaux solaires :comment un panneau solaire est-il fabriqué ?