산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

서보 제어, 광추적 태양광 패널 플랫폼

구성품 및 소모품

포토 저항기
× 4
Adafruit Flora RGB 네오픽셀 LED- 4개 팩
또는 이에 상응하는 RBG 멀티 컬러 LED
× 1
SparkFun 푸시버튼 스위치 12mm
또는 이에 상응하는 평상시 열림 푸시 버튼
× 2
온도 센서
× 1
Arduino UNO
× 1
RobotGeek 180도 로봇 서보
또는 이와 동등한 것. Futaba S3003 서보를 사용했습니다.
× 2
저항 10k 옴
× 6
저항 221옴
220옴 사용
× 1
커패시터 100μF
× 2
태양광 패널(80mm x 80mm)
Amazon.com 또는 이에 상응하는 곳에서 구입 가능
× 1

필요한 도구 및 기계

수공구 및 브래킷을 만들기 위한 몇 개의 작은 너트와 볼트
"트위스트" 서보 모터를 장착하기 위한 견고한 베이스
작은 나무 블록을 사용했습니다.
구부러질 수 있는 금속 또는 다음으로 성형할 수 있는 단단한 알루미늄의 작은 시트 "L"자형 괄호
약 폭이 2cm에 불과한 3mm 두께의 알루미늄
태양광 패널 플랫폼을 고정하기 위한 브래킷을 형성하는 얇고 구부릴 수 있는 금속 "트위스트" 서보에 장착합니다.
나는 일반적으로 HVAC 덕트를 함께 고정하는 데 사용되는 철물점에서 구입한 얇은 강철 스트립을 사용했습니다. 용이하도록 미리 뚫린 장착 구멍이 있습니다.

앱 및 온라인 서비스

Arduino IDE
문서 및 메모용 Microsoft Excel

이 프로젝트 정보

이것은 2개의 180도 서보와 4개의 포토 레지스터를 사용하여 작은 태양 전지판을 추적하여 가장 광도가 높은 영역에 정렬하는 또 다른 구현입니다.

모터는 작은 움직임을 만들어 태양 전지판을 가장 밝은 빛으로 향하게 합니다.

시스템이 활성화되었는지 여부를 나타내는 다중 색상 LED도 있습니다. 그리고 모터를 활성화/비활성화하는 두 개의 푸시 버튼이 있습니다.

모터를 명령된 위치로 이동하는 데 사용할 수 있는 몇 가지 루틴이 있습니다. 명령은 직렬 포트 인터페이스와 Arduino Uno로 보낼 수 있는 일련의 숫자 코드/명령을 통해 이루어집니다.

독립적인 이동 명령은 기계적 메커니즘이 격렬하게 움직이게 하는 즉각적인 위치 명령 대신 (다소) 부드러운 동작을 제공하는 방식으로 프로그래밍됩니다.

<섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

코드

<울>
  • Q2 코드
  • Q2 코드Arduino
    //Scott Mangiacotti//미국 애리조나주 투손//2018년 5월//Q2//버전 2.0#include //Constantsint const GIVE_BACK_TIME =125;//입력에 대한 상수int const I_RED_BUTTON_PIN =4;int const I_GREEN_BUTTON_PIN =2;int const I_LDR1_PIN =A3; //왼쪽 상단 const I_LDR2_PIN =A2; //상단 우측int const I_LDR3_PIN =A1; //왼쪽 하단 const I_LDR4_PIN =A0; //오른쪽 하단//출력에 대한 상수int 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 =5;int const O_TILT_SERVO_PIN =false gRun 추적 gRunGlobal 변수 =boolning;/;bool gVerboseDiagMode =false;서보 gServoTwist;int gServoTwistPositionCommand; //명령된 positionbool gServoTwistMoveIP; //진행중으로 이동Servo gServoTilt;bool gServoTiltMoveIP; //진행중 이동int gServoTiltPositionCommand; //명령된 positionint gLDR1;int gLDR2;int gLDR3;int gLDR4;//한 번 실행void setup() { //직렬 포트 열기 Serial.begin(9600); //디지털 입력 설정 pinMode(I_RED_BUTTON_PIN, INPUT); 핀모드(I_GREEN_BUTTON_PIN, 입력); //디지털 출력 설정 pinMode(O_RED_LED_PIN, OUTPUT); 핀모드(O_GREEN_LED_PIN, 출력); 핀모드(O_BLUE_LED_PIN, 출력); //시작 루틴 실행 startup();}//지속적으로 실행void loop(){ //직렬 포트 메시지 수신 처리 if (Serial.available()> 0) { int iControlCode; iControlCode =Serial.parseInt(); 프로세스 직렬 메시지(iControlCode); } //녹색 버튼 읽기 int iGreenButton; iGreenButton =디지털 읽기(I_GREEN_BUTTON_PIN); if (iGreenButton ==HIGH &&gRunning ==false) { enableTracking(); gTrackToLightEnabled =true; } //빨간색 버튼 읽기 int iRedButton; iRedButton =디지털 읽기(I_RED_BUTTON_PIN); if (iRedButton ==HIGH &&gRunning ==true) { disableTracking(); } //모든 계측을 전역 변수로 읽습니다. readPhotoResistors(); 평균TopTwoSensors(); AverageBottomTwoSensors(); //포토레지스터의 빛에 따라 서보 위치 조정 if (gRunning ==true) { if (gTrackToLightEnabled ==true) { //포토-레지스터 라이트 레벨에 따라 서보를 조금씩 움직입니다 trackToLightSensors(); } else { //직렬 포트에서 사용자 명령에 따라 작은 움직임을 만듭니다. 메커니즘 smoothMoveTwist()에서 고속 이동을 방지합니다. 부드러운 이동 기울기(); } } //뒤로 약간의 시간 주기 지연(GIVE_BACK_TIME);}//서보 추적 켜기void enableTracking(){ //프로그램의 다른 부분이 모터를 실행할 준비가 되었음을 알 수 있도록 전역 변수를 설정합니다. gRunning =true; //서보 모터에 연결 gServoTwist.attach(O_TWIST_SERVO_PIN); gServoTilt.attach(O_TILT_SERVO_PIN); //녹색 LED를 켜고 빨간색 LED를 끕니다. digitalWrite(O_GREEN_LED_PIN, HIGH); 디지털 쓰기(O_RED_LED_PIN, LOW); //결과 게시 Serial.println("servos enabled");}//서보 추적 끄기void disableTracking(){ gRunning =false; gTrackToLightEnabled =거짓; //서보 모터에서 분리 gServoTwist.detach(); gServoTilt.detach(); //이동 명령을 정리하고 프로세스 내(IP) 변수를 이동합니다. gServoTwistPositionCommand =gServoTwist.read(); gServoTwistMoveIP =거짓; //이동 명령을 정리하고 프로세스 내(IP) 변수를 이동합니다. gServoTiltPositionCommand =gServoTilt.read(); gServoTiltMoveIP =거짓; //적색 LED 켜기, 녹색 LED 끄기 digitalWrite(O_RED_LED_PIN, HIGH); 디지털 쓰기(O_GREEN_LED_PIN, LOW); //결과 게시 Serial.println("servos disabled");}//포토센서 값을 기반으로 빛을 추적합니다.void trackToLightSensors(){ float fTop; float fBottom; float fLeft; 부동 fRight; int iTwistMoveCommand; int iTiltMoveCommand; int iMoveAmount; //초기화 //아래 변수는 프로그램 스캔당 두 서보에 대한 잠재적인 움직임의 정도를 //결정합니다. // 'GIVE_BACK_TIME'이라는 전역 상수와 함께 이 숫자는 움직임이 얼마나 공격적인지를 결정합니다. iMoveAmount =5; //현재 서보 위치 가져오기 iTwistMoveCommand =gServoTwist.read(); iTiltMoveCommand =gServoTilt.read(); //평균을 구합니다. fTop =averageTopTwoSensors(); fBottom =AverageBottomTwoSensors(); fLeft =평균LeftTwoSensors(); fRight =AverageRightTwoSensors(); //비틀림 이동 계산 if (fLeft> fRight) { //양수 이동 iTwistMoveCommand +=iMoveAmount; } else if (fRight> fLeft) { //음수 이동 iTwistMoveCommand -=iMoveAmount; } else { //동일합니다. don't move } //기울기 이동 계산 if (fTop>
     fBottom) { //양수 이동 iTiltMoveCommand +=iMoveAmount; } else if (fBottom> fTop) { //음수 이동 iTiltMoveCommand -=iMoveAmount; } else { //동일합니다. don't move } //경계 확인 트위스트 서보 이동 명령 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); } } // 광저항 값을 전역 변수로 읽습니다.void readPhotoResistors(){ //값은 0-1024 크기로 입력됩니다. gLDR1 =analogRead(I_LDR1_PIN); gLDR2 =analogRead(I_LDR2_PIN); gLDR3 =analogRead(I_LDR3_PIN); gLDR4 =analogRead(I_LDR4_PIN);}//서보가 위치에 명령을 받으면 빠른 속도로 이동합니다.//너무 빠르면 고정 및 이동//태양 전지 패널 및 광 센서 플랫폼에 잠재적으로 영향을 미치는 기계 구조에 영향을 줍니다. 이 루틴은 "이동 명령"을 사용하고//서보가 원하는 위치에 있을 때까지 조금씩 증분 이동합니다.//이 루틴은 기본 장착 트위스트 서보 모터를 위한 것입니다. int iMoveAmountPerScan; int iNewMove 명령; // 스캔당 이동량을 도 단위로 설정합니다. //이 변수와 전역 const 'GIVE_BACK_TIME'의 조합으로 전체 이동 속도 결정 iMoveAmountPerScan =1; //현재 위치 결정 iCurrentPos =gServoTwist.read(); //우리는 위치에 있습니까? if (iCurrentPos ==gServoTwistPositionCommand) { gServoTwistMoveIP =false; 반품; } else { gServoTwistMoveIP =참; } //현재 iNewMoveCommand =iCurrentPos에 있는 곳에서 시작합니다. //이동량 결정 if (iCurrentPos  179) { iNewMoveCommand =179; } //이동 gServoTwist.write(iNewMoveCommand); // 결과 게시 if (gVerboseDiagMode ==true) { //todo:Serial.print("서보 이동 비틀기(이 이동, 전체):"); Serial.print(iNewMoveCommand); Serial.print(", "); Serial.println(gServoTwistPositionCommand); }}//서보가 위치로 명령을 받으면 빠른 속도로 이동합니다.//너무 빠르면 고정 및 이동//태양 전지판 및 광 센서 플랫폼에 잠재적으로 영향을 미칠 수 있습니다. 이 루틴은 "이동 명령"을 취하고//서보가 원하는 위치에 있을 때까지 조금씩 증분 이동합니다.//이 루틴은 브래킷 장착 틸팅 서보 모터를 위한 것입니다. smoothMoveTilt(){ int iCurrentPos; int iMoveAmountPerScan; int iNewMove 명령; // 스캔당 이동량을 도 단위로 설정합니다. //이 변수와 전역 const 'GIVE_BACK_TIME'의 조합으로 전체 이동 속도 결정 iMoveAmountPerScan =1; //현재 위치 결정 iCurrentPos =gServoTilt.read(); //우리는 위치에 있습니까? if (iCurrentPos ==gServoTiltPositionCommand) { gServoTiltMoveIP =거짓; 반품; } else { gServoTiltMoveIP =true; } //현재 iNewMoveCommand =iCurrentPos에 있는 곳에서 시작합니다. //이동량 결정 if (iCurrentPos  179) { iNewMoveCommand =179; } //이동 gServoTilt.write(iNewMoveCommand); //포스팅 결과 if (gVerboseDiagMode ==true) { //todo:Serial.print("Tilt servo move (this move, total):"); Serial.print(iNewMoveCommand); Serial.print(", "); Serial.println(gServoTiltPositionCommand); }}//패널 상단에 있는 두 LDR의 수학적 평균을 취합니다. averageTopTwoSensors(){ float fAvg; // 수학 fAvg =(gLDR1 + gLDR2) / 2.0; return fAvg;}//패널의 맨 아래에 있는 두 LDR의 수학적 평균을 취합니다. averageBottomTwoSensors(){ float fAvg; // 수학 fAvg =(gLDR3 + gLDR4) / 2.0; return fAvg;}//panelfloat averageLeftTwoSensors(){ float fAvg; 왼쪽에 있는 두 LDR의 수학적 평균을 취합니다. // 수학 fAvg =(gLDR1 + gLDR3) / 2.0; return fAvg;}//panelfloat averageRightTwoSensors(){ float fAvg; 오른쪽에 있는 두 LDR의 수학적 평균을 취합니다. // 수학 fAvg =(gLDR2 + gLDR4) / 2.0; return fAvg;}//직렬 포트 인터페이스에서 받은 메시지 처리//입력 매개변수 iControlCode는 처리할 직렬 포트에서 받은 값입니다.//처음 두 자리는 제어 명령이고, 나머지 세 자리는 processvoid processSerialMessage(int iControlCode){ int iControlCommand; 정수 iControlValue; //명령 및 값 계산 iControlCommand =iControlCode / 1000; iControlValue =iControlCode % 1000; //명령 및 값 보고 Serial.print("제어 코드:"); Serial.println(iControlCode); Serial.print("제어 명령:"); Serial.println(iControlCommand); Serial.print("제어값:"); Serial.println(iControlValue); //기타 명령 카테고리 if (iControlCommand ==10) { if (iControlValue ==0) { gVerboseDiagMode =true; 디지털 쓰기(O_BLUE_LED_PIN, 높음); Serial.println("진단 모드가 시작되었습니다."); } else if (iControlValue ==1) { gVerboseDiagMode =false; 디지털 쓰기(O_BLUE_LED_PIN, LOW); Serial.println("진단 모드가 중지되었습니다."); } else if (iControlValue ==2) { reportProductInfo(); } else if (iControlValue ==3) { //digitalWrite의 빨간색 LED(O_RED_LED_PIN, HIGH); Serial.println("빨간색 켜짐"); } else if (iControlValue ==4) { //빨간색 LED 꺼짐 digitalWrite(O_RED_LED_PIN, LOW); Serial.println("빨간색 꺼짐"); } else if (iControlValue ==5) { //digitalWrite의 녹색 LED(O_GREEN_LED_PIN, HIGH); Serial.println("녹색이 켜짐"); } else if (iControlValue ==6) { //녹색 LED 꺼짐 digitalWrite(O_GREEN_LED_PIN, LOW); Serial.println("녹색 꺼짐"); } else if (iControlValue ==7) { //digitalWrite의 파란색 LED(O_BLUE_LED_PIN, HIGH); Serial.println("파란색 켜짐"); } else if (iControlValue ==8) { //파란색 LED 꺼짐 digitalWrite(O_BLUE_LED_PIN, LOW); Serial.println("파란색 꺼짐"); } else if (iControlValue ==9) { //LDR1 값 표시 Serial.print("LDR1 값:"); Serial.println(gLDR1); } else if (iControlValue ==10) { //LDR2 값 표시 Serial.print("LDR2 값:"); Serial.println(gLDR2); } else if (iControlValue ==11) { //LDR3 값 표시 Serial.print("LDR3 값:"); Serial.println(gLDR3); } else if (iControlValue ==12) { //LDR4 값 표시 Serial.print("LDR4 값:"); 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(트위스트) 명령 범주 if (iControlCommand ==11) { if (iControlValue>=0 &&iControlValue <=179) { //서보1을 위치로 이동 if (gRunning ==true &&gServoTwistMoveIP ==false) { gServoTwistPositionCommand =iControlValue; gServoTwistMoveIP =참; Serial.print("트위스트 서보 명령 이동:"); Serial.println(gServoTwistPositionCommand); } } else { Serial.print("잘못된 제어 값:"); Serial.println(iControlValue); } } //Servo2(기울기) 명령 범주 if (iControlCommand ==12) { if (iControlValue>=0 &&iControlValue <=179) { //서보2를 위치로 이동 //서보1을 위치로 이동 if (gRunning ==true &&gServoTiltMoveIP ==false) { gServoTiltPositionCommand =iControlValue; gServoTiltMoveIP =참; Serial.print("틸트 서보 이동 명령:"); Serial.println(gServoTiltPositionCommand); } else { Serial.print("틸트 서보가 활성화되지 않았거나 진행 중입니다. "); Serial.print(gRunning); Serial.print(", "); Serial.println(gServoTiltMoveIP); } } else { Serial.print("잘못된 제어 값:"); Serial.println(iControlValue); } } //요청 문자열의 끝 Serial.println("-----");}//자체 테스트 기능을 위한 일련의 단계를 실행하고 서보를 활성화하고 광 추적 모드로 들어갑니다. modevoid startup(){ int iDelay; //iDelay 초기화 =500; //앱 정보 표시 reportProductInfo(); 지연(iDelay); //빨간색 LED 켜기 processSerialMessage(10003); 지연(iDelay); //적색 LED 끄기, 녹색 LED 켜기 processSerialMessage(10004); 프로세스 직렬 메시지(10005); 지연(iDelay); //녹색 LED 끄기, 파란색 LED 켜기 processSerialMessage(10006); 프로세스 직렬 메시지(10007); 지연(iDelay); //파란색 LED 끄기, 포토 레지스터 값 표시(4개 모두) processSerialMessage(10008); 프로세스 직렬 메시지(10009); 프로세스 직렬 메시지(10010); 프로세스 직렬 메시지(10011); 프로세스 직렬 메시지(10012); 지연(iDelay); //서보 활성화 enableTracking(); 지연(iDelay); //서보를 원점으로 이동 processSerialMessage(10019); 지연(iDelay); //서보 비활성화 disableTracking(); //안녕하세요 Serial.println("startup sequence completed");}//시리얼 포트로 제품 정보 보내기void reportProductInfo(){ //시리얼 포트로 제품 및 기타 정보 보고 Serial.println("q version 2" ); Serial.println("미국 애리조나 투싼"); 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. 자동 및 수동 모드의 이중 축 태양광 추적기 패널
    8. 태양 에너지 이해
    9. 태양광 패널:품질 문제 및 핵심 관리 포인트
    10. 태양 전지판 제조 공정:태양 전지판은 어떻게 만들어집니까?