모터 > RC서보모터 솔라 트래커

인기검색어 > 아두이노 센서 ATMEGA128

최신글 질문게시판 동영상강좌 가입하기

▼ BASIC4MCU 후원업체 신제품 정보 ▼

▲ BASIC4MCU 후원업체 신제품 정보 ▲

BASIC4MCU > 모터

서보모터 | RC서보모터 솔라 트래커

페이지 정보

작성자 키트 작성일17-09-05 17:21 조회2,023회 댓글0건

본문

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <mega128.h> //16MHz
#include <delay.h> 
//
#define tol_ratio 10
//
void A_Motor(int angle){ i=angle*18+3000; OCR1A=i; } //PB5
void B_Motor(int angle){ i=angle*18+3000; OCR1B=i; } //PB6
//
void main(void){
    int up,dn,left,right,tol_A,tol_B,angle_A=0,angle_B=0;
    DDRB=0x60;  // PB5,6 out
    TCCR1A=0xA2; TCCR1B=0x1A; OCR1A=3000; OCR1B=3000; ICR1=39999;
    ADCSRA=0xE7;
    while(1){
        ADMUX=0x40; delay_ms(5); up=ADCW;    //PF0
        ADMUX=0x41; delay_ms(5); dn=ADCW;    //PF1
        ADMUX=0x42; delay_ms(5); left=ADCW;  //PF2
        ADMUX=0x43; delay_ms(5); right=ADCW; //PF3
        //
        if(up>dn){ 
          tol_A=up/tol_ratio; //큰 값의 일정 비율을 오차로 잡음
          if((up-dn)>tol_A){
            if(angle_A<90)angle_A++;
            A_Motor(angle_A);
          }
        }
        else if(dn>up){ 
          tol_A=dn/tol_ratio; //큰 값의 일정 비율을 오차로 잡음
          if((dn-up)>tol_A){
            if(angle_A>=90)angle_A--;
            A_Motor(angle_A);
          }
        }
        //
        if(left>right){ 
          tol_B=left/tol_ratio;
          if((left-right)>tol_B){
            if(angle_B<90)angle_B++;
            B_Motor(angle_B);
          }
        }
        else if(right>left){ 
          tol_B=right/tol_ratio;
          if((right-left)>tol_B){
            if(angle_B>=90)angle_B--;
            B_Motor(angle_B);
          }
        }
    }
}
cs
//------------------------------------------------------

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <avr/io.h>
#define F_CPU 16000000UL // 16 MHz
#include <util/delay.h>
//
#define tol_ratio 10
//
void A_Motor(int angle){ i=angle*18+3000; OCR1A=i; } //PB5
void B_Motor(int angle){ i=angle*18+3000; OCR1B=i; } //PB6
//
int main(void){
    int up,dn,left,right,tol_A,tol_B,angle_A=0,angle_B=0;
    DDRB=0x60;  // PB5,6 out
    TCCR1A=0xA2; TCCR1B=0x1A; OCR1A=3000; OCR1B=3000; ICR1=39999;
    ADCSRA=0xE7;
    while(1){
        ADMUX=0x40; _delay_ms(5); up=ADCW;    //PF0
        ADMUX=0x41; _delay_ms(5); dn=ADCW;    //PF1
        ADMUX=0x42; _delay_ms(5); left=ADCW;  //PF2
        ADMUX=0x43; _delay_ms(5); right=ADCW; //PF3
        //
        if(up>dn){ 
          tol_A=up/tol_ratio; //큰 값의 일정 비율을 오차로 잡음
          if((up-dn)>tol_A){
            if(angle_A<90)angle_A++;
            A_Motor(angle_A);
          }
        }
        else if(dn>up){ 
          tol_A=dn/tol_ratio; //큰 값의 일정 비율을 오차로 잡음
          if((dn-up)>tol_A){
            if(angle_A>=90)angle_A--;
            A_Motor(angle_A);
          }
        }
        //
        if(left>right){ 
          tol_B=left/tol_ratio;
          if((left-right)>tol_B){
            if(angle_B<90)angle_B++;
            B_Motor(angle_B);
          }
        }
        else if(right>left){ 
          tol_B=right/tol_ratio;
          if((right-left)>tol_B){
            if(angle_B>=90)angle_B--;
            B_Motor(angle_B);
          }
        }
    }
}
cs

3660040649_tT4W7bMj_sensors-in-solar-tracker.png

센서는 십자 형태로 4개의 CDS를 설치합니다.(두개씩 따로 설치 해도 됩니다.)

원리를 간단히 적어드리면
CDS는 밝으면 저항값이 줄어듭니다.
위 회로처럼 연결하면 밝을 수록 전압이 상승하게 됩니다.
두개의 CDS를 읽어서 밝은 쪽의 CDS쪽으로 서보모터를 회전하면 됩니다.

댓글 : 0

조회수 : 2,023

등록된 댓글이 없습니다.

게시물 검색

모터 목록

게시물 검색


Privacy Policy
MCU BASIC ⓒ 2017
PC버전