工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

サーボ制御、光追跡ソーラーパネルプラットフォーム

コンポーネントと消耗品

>
フォトレジスター
× 4
Adafruit FloraRGBネオピクセルLED-4個入り
または同等のRBGマルチカラーLED
× 1
SparkFunプッシュボタンスイッチ12mm
または同等の通常開いているプッシュボタン
× 2
温度センサー
× 1
Arduino UNO
× 1
RobotGeek180度ロボットサーボ
または同等のもの。 FutabaS3003サーボを使用しました
× 2
抵抗10kオーム
× 6
抵抗221オーム
220オームを使用しました
× 1
コンデンサ100µF
× 2
ソーラーパネル(80mm x 80mm)
Amazon.comまたは同等の商品で購入できます
× 1

必要なツールとマシン

ブラケットを作成するための手工具といくつかの小さなナットとボルト
「ツイスト」サーボモーターを取り付けるためのソリッドベース。
小さな木のブロックを使用しました
曲げ可能な金属または硬質アルミニウムの小さなシート。 「L」字型ブラケット
約幅2cm弱の厚さ3mmのアルミニウム
ソーラーパネルプラットフォームを保持するためのブラケットを形成するための、薄くて曲げることができる金属そしてそれを「ツイスト」サーボに取り付けます
私は、HVACダクトを一緒に保持するために通常使用される金物店で購入した薄いスチールストリップを使用しました。取り付け穴が簡単にできるように事前に開けられています

アプリとオンラインサービス

>
Arduino IDE
ドキュメントとメモ用のMicrosoftExcel

このプロジェクトについて

これは、2つの180度サーボと4つの光抵抗器を使用して、小さなソーラーパネルを追跡し、最も光の強い領域に合わせることができるようにする別の実装です。

モーターは小さな動きをして、ソーラーパネルを最も明るい光に向けようとします。

システムが有効かどうかを示すマルチカラーLEDもあります。モーターを有効/無効にする2つのプッシュボタン。

モーターをコマンド位置に移動するために使用できるルーチンがいくつかあります。コマンドは、シリアルポートインターフェイスと、ArduinoUnoに送信できる一連の数値コード/コマンドを介して行われます。

独立した移動コマンドは、機械的メカニズムを激しく動かす即時位置コマンドの代わりに、(ある程度)スムーズな動きを提供するようにプログラムされています。

コード

  • Q2コード
Q2コード Arduino
 // Scott Mangiacotti //米国アリゾナ州ツーソン// 2018年5月// Q2 //バージョン2.0#include  // Constantsint const GIVE_BACK_TIME =125; // inputsの定数intconst I_RED_BUTTON_PIN =4; int const I_GREEN_BUTTON_PIN =2; int const I_LDR1_PIN =A3; //左上intconst I_LDR2_PIN =A2; //右上intconst I_LDR3_PIN =A1; //左下intconst I_LDR4_PIN =A0; //右下//出力の定数intconst 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; //グローバル変数boolgRunning =false; bool g; bool gVerboseDiagMode =false; Servo gServoTwist; int gServoTwistPositionCommand; //コマンドされたpositionboolgServoTwistMoveIP; //進行中に移動ServogServoTilt; bool gServoTiltMoveIP; //進行中の移動intgServoTiltPositionCommand; //コマンド位置intgLDR1; int gLDR2; int gLDR3; int gLDR4; // oncevoid setup(){//シリアルポートを開くSerial.begin(9600); //デジタル入力を設定しますpinMode(I_RED_BUTTON_PIN、INPUT); pinMode(I_GREEN_BUTTON_PIN、INPUT); //デジタル出力を設定しますpinMode(O_RED_LED_PIN、OUTPUT); pinMode(O_GREEN_LED_PIN、OUTPUT); pinMode(O_BLUE_LED_PIN、OUTPUT); //起動ルーチンstartup();を実行します//継続的に実行しますvoid loop(){//シリアルポートメッセージの受信処理if(Serial.available()> 0){int iControlCode; iControlCode =Serial.parseInt(); processSerialMessage(iControlCode); } //緑色のボタンを読み取るintiGreenButton; iGreenButton =digitalRead(I_GREEN_BUTTON_PIN); if(iGreenButton ==HIGH &&gRunning ==false){enableTracking(); gTrackToLightEnabled =true; } //赤いボタンを読むintiRedButton; iRedButton =digitalRead(I_RED_BUTTON_PIN); if(iRedButton ==HIGH &&gRunning ==true){disableTracking(); } //すべてのインストルメンテーションをグローバル変数に読み込むreadPhotoResistors(); averageTopTwoSensors(); averageBottomTwoSensors(); //フォトレジスターの光に応じてサーボ位置を調整しますif(gRunning ==true){if(gTrackToLightEnabled ==true){//フォトレジスターの光レベルに基づいてサーボを少し動かしますtrackToLightSensors(); } else {//シリアルポートでのユーザーコマンドに基づいて小さな動きをします。メカニズムsmoothMoveTwist()での高速移動を回避します。 SmoothMoveTilt(); }} //少し時間を戻しますdelay(GIVE_BACK_TIME);} //サーボトラッキングをオンにしますvoidenableTracking(){//プログラムの他の部分がモーターを実行する準備ができていることを認識できるようにグローバル変数を設定しますgRunning =true; //サーボモーターに取り付けますgServoTwist.attach(O_TWIST_SERVO_PIN); gServoTilt.attach(O_TILT_SERVO_PIN); //緑色のLEDをオンにし、赤色のLEDをオフにしますdigitalWrite(O_GREEN_LED_PIN、HIGH); digitalWrite(O_RED_LED_PIN、LOW); //結果を投稿Serial.println( "servos enabled");} //サーボトラッキングをオフにしますvoiddisableTracking(){gRunning =false; gTrackToLightEnabled =false; //サーボモーターから切り離しますgServoTwist.detach(); gServoTilt.detach(); //移動コマンドをクリーンアップし、インプロセス(IP)変数を移動しますgServoTwistPositionCommand =gServoTwist.read(); gServoTwistMoveIP =false; //移動コマンドをクリーンアップし、インプロセス(IP)変数を移動しますgServoTiltPositionCommand =gServoTilt.read(); gServoTiltMoveIP =false; //赤色LEDをオンにし、緑色LEDをオフにしますdigitalWrite(O_RED_LED_PIN、HIGH); digitalWrite(O_GREEN_LED_PIN、LOW); //結果を投稿しますSerial.println( "servos disable");} //フォトセンサーの値に基づいて光に追跡しますvoidtrackToLightSensors(){float fTop; float fBottom; float fLeft; float fRight; int iTwistMoveCommand; int iTiltMoveCommand; int iMoveAmount; //初期化//以下の変数は、プログラムのスキャンごとに//両方のサーボの潜在的な動きの程度を決定します。この数値を//「GIVE_BACK_TIME」という名前のグローバル定数と組み合わせて、移動がどれだけ積極的になるかを決定します。 iMoveAmount =5; //現在のサーボ位置を取得しますiTwistMoveCommand =gServoTwist.read(); iTiltMoveCommand =gServoTilt.read(); //平均を取得しますfTop =averageTopTwoSensors(); fBottom =averageBottomTwoSensors(); fLeft =averageLeftTwoSensors(); fRight =averageRightTwoSensors(); //ツイスト移動を計算しますif(fLeft> fRight){//正の移動iTwistMoveCommand + =iMoveAmount; } else if(fRight> fLeft){//負のiTwistMoveCommandを移動-=iMoveAmount; } else {//同じ。移動しない} //傾斜移動を計算するif(fTop>
 fBottom){//正の移動iTiltMoveCommand + =iMoveAmount; } else if(fBottom> fTop){//負のiTiltMoveCommandを移動-=iMoveAmount; } else {//同じ。移動しない} //境界チェックツイストサーボ移動コマンドif(iTwistMoveCommand <0){iTwistMoveCommand =0; } if(iTwistMoveCommand> 179){iTwistMoveCommand =179; } //境界チェックチルトサーボ移動コマンドif(iTiltMoveCommand <45){iTiltMoveCommand =45; } if(iTiltMoveCommand> 135){iTiltMoveCommand =135; } //移動を実行しますgServoTwist.write(iTwistMoveCommand); gServoTilt.write(iTiltMoveCommand); //結果を投稿する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(fLeft); Serial.print( "、"); Serial.print(fRight); Serial.print( "、"); Serial.print(iTwistMoveCommand); Serial.print( "、"); Serial.println(iTiltMoveCommand); }} //フォトレジスタの値をグローバル変数に読み込むvoidreadPhotoResistors(){//値はスケーリングされた0〜1024で提供されますgLDR1 =analogRead(I_LDR1_PIN); gLDR2 =analogRead(I_LDR2_PIN); gLDR3 =analogRead(I_LDR3_PIN); gLDR4 =analogRead(I_LDR4_PIN);} //サーボが高速で移動する位置に命令されると、//速すぎると、ソーラーパネルと光センサープラットフォームを保持および移動する機械的構造に影響を与える可能性があります。このルーチンは「移動コマンド」を受け取り、//サーボが目的の位置に来るまで少しずつ移動します。//このルーチンは、ベースに取り付けられたツイストサーボモーター用です。voidsmoothMoveTwist(){int iCurrentPos; int iMoveAmountPerScan; int iNewMoveCommand; //スキャンごとの移動量を度単位で設定します。 //この変数とグローバル定数 'GIVE_BACK_TIME'の組み合わせにより、全体的な移動速度が決まりますiMoveAmountPerScan =1; //現在の位置を決定しますiCurrentPos =gServoTwist.read(); //私たちは位置にいますか? if(iCurrentPos ==gServoTwistPositionCommand){gServoTwistMoveIP =false;戻る; } else {gServoTwistMoveIP =true; } //現在iNewMoveCommand =iCurrentPosにいるところから始めます。 //移動量を決定するif(iCurrentPos  179){iNewMoveCommand =179; } //移動gServoTwist.write(iNewMoveCommand); //結果を投稿するif(gVerboseDiagMode ==true){// todo:Serial.print( "Twistサーボ移動(この移動、合計):"); Serial.print(iNewMoveCommand); Serial.print( "、"); Serial.println(gServoTwistPositionCommand); }} //サーボが高速で移動する位置に命令されると、//速すぎると、ソーラーパネルと光センサープラットフォームを保持および移動する機械的構造に影響を与える可能性があります。このルーチンは「移動コマンド」を受け取り、//サーボが目的の位置に来るまで少しずつ移動します。//このルーチンは、ブラケットに取り付けられた傾斜サーボモーター用です。voidsmoothMoveTilt(){int iCurrentPos; int iMoveAmountPerScan; int iNewMoveCommand; //スキャンごとの移動量を度単位で設定します。 //この変数とグローバル定数 'GIVE_BACK_TIME'の組み合わせにより、全体的な移動速度が決まりますiMoveAmountPerScan =1; //現在の位置を決定しますiCurrentPos =gServoTilt.read(); //私たちは位置にいますか? if(iCurrentPos ==gServoTiltPositionCommand){gServoTiltMoveIP =false;戻る; } else {gServoTiltMoveIP =true; } //現在iNewMoveCommand =iCurrentPosにいるところから始めます。 //移動量を決定するif(iCurrentPos  179){iNewMoveCommand =179; } //移動gServoTilt.write(iNewMoveCommand); //結果を投稿するif(gVerboseDiagMode ==true){// todo:Serial.print( "Tiltサーボ移動(この移動、合計):"); Serial.print(iNewMoveCommand); Serial.print( "、"); Serial.println(gServoTiltPositionCommand); }} // panelfloat averageTopTwoSensors(){floatfAvg;の上部にある2つのLDRの数学的平均を取ります。 //数学fAvg =(gLDR1 + gLDR2)/ 2.0; return fAvg;} // panelfloat averageBottomTwoSensors(){floatfAvg;の下部にある2つのLDRの数学的平均を取ります。 //数学fAvg =(gLDR3 + gLDR4)/ 2.0; return fAvg;} // panelfloat averageLeftTwoSensors(){floatfAvg;の左側にある2つのLDRの数学的平均を取ります。 //数学fAvg =(gLDR1 + gLDR3)/ 2.0; return fAvg;} // panelfloat averageRightTwoSensors(){floatfAvg;の右側にある2つのLDRの数学的平均を取ります。 //数学fAvg =(gLDR2 + gLDR4)/ 2.0; return fAvg;} //シリアルポートインターフェイスから受信したメッセージを処理する//入力パラメータiControlCodeは、処理するシリアルポートから受信した値です//最初の2桁は制御コマンドで、残りの3桁はprocessvoid processSerialMessage(int iControlCode){int iControlCommand; int iControlValue; //コマンドと値を計算しますiControlCommand =iControlCode / 1000; iControlValue =iControlCode%1000; //コマンドと値を報告しますSerial.print( "control code:"); Serial.println(iControlCode); Serial.print( "制御コマンド:"); Serial.println(iControlCommand); Serial.print( "制御値:"); Serial.println(iControlValue); //その他のコマンドカテゴリif(iControlCommand ==10){if(iControlValue ==0){gVerboseDiagMode =true; digitalWrite(O_BLUE_LED_PIN、HIGH); Serial.println( "診断モードが開始されました"); } else if(iControlValue ==1){gVerboseDiagMode =false; digitalWrite(O_BLUE_LED_PIN、LOW); Serial.println( "診断モードが停止しました"); } else if(iControlValue ==2){reportProductInfo(); } else if(iControlValue ==3){// digitalWrite(O_RED_LED_PIN、HIGH);の赤色LED Serial.println( "red led on"); } else if(iControlValue ==4){//赤色LEDがオフdigitalWrite(O_RED_LED_PIN、LOW); Serial.println( "赤のLEDオフ"); } else if(iControlValue ==5){// digitalWrite(O_GREEN_LED_PIN、HIGH);の緑色のLED Serial.println( "グリーンLEDオン"); } else if(iControlValue ==6){//緑色のLEDがオフdigitalWrite(O_GREEN_LED_PIN、LOW); Serial.println( "緑のLEDオフ"); } else if(iControlValue ==7){// digitalWrite(O_BLUE_LED_PIN、HIGH);の青色LED Serial.println( "青のLEDが点灯"); } else if(iControlValue ==8){//青色LEDオフdigitalWrite(O_BLUE_LED_PIN、LOW); Serial.println( "青のLEDオフ"); } else if(iControlValue ==9){// LDR1値を表示Serial.print( "LDR1 value:"); Serial.println(gLDR1); } else if(iControlValue ==10){// LDR2値を表示Serial.print( "LDR2 value:"); Serial.println(gLDR2); } else if(iControlValue ==11){// LDR3値を表示Serial.print( "LDR3 value:"); Serial.println(gLDR3); } else if(iControlValue ==12){// LDR4値を表示Serial.print( "LDR4 value:"); Serial.println(gLDR4); } else if(iControlValue ==13){//トラッキングモードをオンにするenableTracking(); } else if(iControlValue ==14){//トラッキングモードをオフにするdisableTracking(); } else if(iControlValue ==19){if(gRunning ==true &&gServoTwistMoveIP ==false &&gServoTiltMoveIP ==false){gServoTwistPositionCommand =90; gServoTiltPositionCommand =90; Serial.println( "90度に指令されたツイストおよびチルトサーボ"); }} else if(iControlValue ==21){if(gRunning ==true){gTrackToLightEnabled =true; Serial.println( "光源への追跡が有効"); }} else if(iControlValue ==22){gTrackToLightEnabled =false; Serial.println( "光源への追跡が無効になっています"); } else {Serial.print( "無効な制御値:"); Serial.println(iControlValue); }} // Servo1(twist)コマンドカテゴリif(iControlCommand ==11){if(iControlValue> =0 &&iControlValue <=179){//サーボ1を位置に移動if(gRunning ==true &&gServoTwistMoveIP ==false){ gServoTwistPositionCommand =iControlValue; gServoTwistMoveIP =true; Serial.print( "ツイストサーボコマンドの移動:"); Serial.println(gServoTwistPositionCommand); }} else {Serial.print( "無効な制御値:"); Serial.println(iControlValue); }} // Servo2(tilt)コマンドカテゴリif(iControlCommand ==12){if(iControlValue> =0 &&iControlValue <=179){// servo2を位置に移動// servo1を位置に移動if(gRunning ==true &&gServoTiltMoveIP ==false){gServoTiltPositionCommand =iControlValue; gServoTiltMoveIP =true; Serial.print( "チルトサーボコマンドの移動:"); Serial.println(gServoTiltPositionCommand); } else {Serial.print( "チルトサーボが有効になっていないか、進行中です、"); Serial.print(gRunning); Serial.print( "、"); Serial.println(gServoTiltMoveIP); }} else {Serial.print( "無効な制御値:"); Serial.println(iControlValue); }} //リクエスト文字列の終わりSerial.println( "-----");} //関数をセルフテストし、サーボを有効にして、ライトトラッキングモードに入る一連の手順を実行しますvoid startup(){int iDelay; // iDelayを初期化します=500; //アプリ情報を表示reportProductInfo(); delay(iDelay); //赤色LEDをオンにしますprocessSerialMessage(10003); delay(iDelay); //赤色LEDをオフにし、緑色LEDをオンにしますprocessSerialMessage(10004); processSerialMessage(10005); delay(iDelay); //緑色のLEDをオフにし、青色のLEDをオンにしますprocessSerialMessage(10006); processSerialMessage(10007); delay(iDelay); //青色のLEDをオフにし、フォトレジスタの値を表示します(4つすべて)processSerialMessage(10008); processSerialMessage(10009); processSerialMessage(10010); processSerialMessage(10011); processSerialMessage(10012); delay(iDelay); //サーボを有効にしますenableTracking(); delay(iDelay); //サーボをホームポジションに移動しますprocessSerialMessage(10019); delay(iDelay); //サーボを無効にしますdisableTracking(); //さようならSerial.println( "起動シーケンスが完了しました");} //製品情報をシリアルポートに送信しますvoidreportProductInfo(){//製品およびその他の情報をシリアルポートに報告しますSerial.println( "q version 2" ); Serial.println( "ツーソン、アリゾナusa"); Serial.println( "2018年5月"); Serial.print( "チェックサム"); Serial.println( "58BA-D969-2F82-08FD-2078-2777-396D-E1AA");} 

カスタムパーツとエンクロージャー

q2_assembly_details_RCbi893qzA.zip

回路図

q2_schematic_TVp7kakwNa.fzz

製造プロセス

  1. 太陽熱暖房システム
  2. 太陽電池
  3. Arduinoを使用したソーラーパネルのリアルタイムデータ取得
  4. スマートブラインド
  5. モノのインターネット(IoT)ベースのソーラートラッカー
  6. SmartPostBox
  7. 自動および手動モードの2軸ソーラートラッカーパネル
  8. ソーラーパネルサントラッカー-電話充電器
  9. 太陽エネルギーを理解する
  10. ソーラーパネル:品質問題と主要管理点
  11. ソーラー パネルの製造プロセス:ソーラー パネルはどのように作られますか?