'가변저항'에 해당되는 글 2건

  1. 2011.07.21 FLEX센서를 이용한 로봇팔 제어 (34)
  2. 2011.07.12 초음파센서를 이용한 거리측정 및 모터제어 (35)

안녕하세요 숭덕이 박제현입니다. 지금 쓰는 글은 주말에 테스트 하기전에 머릿속에 있는것을 조금 정리하고 테스트하기전에 자료조사하여 정리하려고 미리 글을 올려봅니다.

ADC란 Analog to Digital Converter 로 아날로그 값을 디지털로 변형시켜주는것이라고 생각하면 쉽겠습니다.
머 머리아프게 쓰지만 연속적인 값을 표현하는 아날로그 형태로 신호를 이산적인양의 값으로 변환해준다.

                                     출처 : http://terms.naver.com/entry.nhn?docId=365705
 

Atmega128의 분해능은 8-Channel, 10-bit ADC를 가지고 있다. 10bit 분해능을 가진 ADC란 2^10 = 1024로 분해 할 수 있는 성능을 나타내며, 0~5V의 전압을 측정하는 것이라면 약 0.005V=(5V/1024) 단위로 읽어들일 수 있다.

자 그럼 AVR에 A/D컨버터의 특징을 보겠습니다.

 8채널 ( PORTF0 ~ PORTF7 )
 10비트 분해능 ( 2^10 = 1024)
 축차비교형 ( 변환시간 수십 us의 종속 )
 포트F는 아날로그 비교기 기능으로도 사용
 샘플/홀드회로 탑재로 인해 A/D 동작동안 전압 고정화기능
 단극성 아날로그와 차동입력 선택가능
 내부 아날로그 멀티플렉서 기능
 차동입력에서 10 ~ 200 배 증폭 가능
 변환시간 ( 13 ~ 260 us )  

조금 더 쉽게 풀어보겠습니다. 외부에서 즉 센서에서 들어오는 데이터가 아날로그 일수도 디지털 일 수도 있습니다.
요즘 나오는 센서는 디지털화시켜서 나오는 센서도 있기는 하지만 아날로그 센서보다 수량이 많지가 않은거 같습니다.
제 생각입니다만.....오해하지마시기를 ^^ 아날로그센서로 비유해서 설명드리겠습니다. 아날로그 센서를 통해 MCU쪽으로 값이 흘러들어온다면 사인파로 들어오게 될것입니다. 그때 분해능에 따라 얼마나 세밀히 분석을 하고 체크하는지가 관건인거 같습니다. 만약에 10BIT 분해능으로도 부족할 거 같으면 분해능이 높은 A/D칩을 사서 하세용!!!!!!!!

자 분해능이 먼지 알았으면 이제 ATMEGA에 대한 포트를 알아보겠습니다.
데이터시트에 보면 AVCC, AGND, AREF가 있습니다. 일단 이 3가지를 보도록 하겠습니다.
AVCC는 VCC에 인가된 전압의 +0.3, -0.3 이내로 유지가 되어야합니다.
AGND는 반지시 GND와 연결이 되어야합니다.
AREF는 AVCC및 VCC를 초과 할 수 없습니다.

 입력 전압의 범위
 입력전압의 범위 ( 0V ~ VREF )
 차동입력 경우 입력전압의 범위 ( -VREF ~ VREF )

 VREF의 범위
 전원전압 VCC를 초과할 수 없습니다. (VREF = VCC ~ VGND ) 내부기준전압 2.56V

단극성과 차등입력에 대한 계산 수식을 보겠습니다.

 

제일 첫번째 그림은 단극성입력일때의 수식이며 2번째의 그림은 차등입력일때의 수식입니다.

아래 그림에 대해 설명드리겠습니다. 이 아래그림은 차동입력의 경우 아날로그 전압과 A/D 변환값의 관계를 나타낸 그림이며, A/D 변환의 결과는 10비트(1024) 정수로 표현됩니다.  아나로그신호를 디지털화시켜 쪼개게 되면 아날로그신호와 비슷한 신호가 나오게 됩니다. atmega128은 10bit 분해능 위에서 설명을 드렸기때문에 다 아실겁니다. 0 ~ 1023
즉 (0~3FF)의 변환값을 가지게 됩니다. 즉 아래 그림은 5V를 10비트로 환산해서 나타낸 그림이라고 봐도 될것입니다.


ADC의 잡음제거방법

 아날로그 입력선은 최소한 짧게 하고 잡음의 영향이 없도록 회로구성
 AVCC단자에는 디지털 전원 VCC를 C 전원필터로 안정화
 아날로그 회로의 모든 접지는 AGND에 접지하고 한 접점만 GND와 결속한다.
 A/D포트가 I/O포트로 사용된다면 A/D변환이 수행되고 있는 동안 논리상태를 스위칭하지 않는것이 좋다.
 잡음이 심할 경우 평균치를 구해서 사용한다.
 잡음이 심한경우에 A/D변환을 할 경우 ADC 잡음감소모드에서 A/D변환


이상 ADC 였습니다. 흠 그냥 자료조사한것도 있고 머릿속에 있는것도 있는데 정리하다 보니 틀린내용도 많고
배울점도 많았네요. 제가 정리하면 제 머릿속에만 정리가 되는듯합니다. 이렇게 글을 적고 다시 한번 읽을때면
저만 알뿐 다른분들을 먼 소리인가 이해가 안가는 글을 적는 경우가 80%정도 되더라고요. 이해해주세요
주말에 가변저항을 이용해서 서보모터를 제어해보고 월급나오면 FLEX센서를 이용해서 사람손이라고 해야하나
프로젝트를 하나 만들어보겠습니다.

 

 

 

시뮬레이션으로 서보모터 5개를 제어해봤습니다.
동영상을 인코딩하면서 조금 화질이 많이 안좋네요......




오늘은 기분 좋은 상쾌한 토요일입니다. 아침부터 예초기를 돌리고 잔디를 깍고 밥을 먹고 옷 좀 사고 밖에서 놀다가 와서 이제 조금 자리에 앉아서 글을 쓰게 됩니다.

지금 막 하나 했는데 LCD창에 서보모터의 값을 띄우게 하는 것입니다. 사진보다 동영상을 올려드리겠습니다.
공부 하기전에 찍은 사진이네요 컴퓨터만 많네요 ㅋㅋㅋㅋㅋㅋ


서보모터의 각도를 LCD로만 표시



Apple | iPhone 3GS | Normal program | Average | 1/15sec | F/2.8 | 3.9mm | ISO-80 | No flash function



자 FLEX센서와 마찬가지로 값이 변하는 가변저항을 이용해서 모터를 움직였습니다. 소스는 공개를 안하도록 할게요!!!!
소스를 원하시는 분은 댓글을 남겨주시면 보내드리도록 하겠습니다.
FLEX센서가 개당 30000원이네요 5개를 구매하려고 했는데 1개만 구매해야 할 것같습니다.


아래 동영상은 가변저항을 이용한 모터제어



 

회로도입니다. 프린터테스트해보기 위해서 A4용지로 회로도를 뽑아서 스캔 했더니 화질이 별로 좋지가 않군요
CP2102는 USART하기 위해서 사용했던 회로입니다. 빼고 사용하셔도 무방하며, 이 회로에는 LCD 회로는 부착하지
않았습니다.



네이버 카페 전자공작 키트님의 소스를 응용해서 만들었습니다.


#include  //16MHz
#include 
#include 
#include  

#asm
   .equ __lcd_port=0x1B ;포트A
#endasm
int i,ADC_I,j;
float ADC_F;


void RC_Motor(int angle){ // angle : -90도 ~ +90도

    if(angle<-90)angle=-90;
    if(angle> 90)angle= 90;
    i=(angle+ 90)*20 +1500;
    OCR1A=i; //PB5
}
void main(void){
    char s[30];
    DDRA=0xff;    // lcd 포트 출력으로 지정
    lcd_init(16); // lcd초기화
    DDRB=0x60;   // PB5
    TCCR1A=0xAA; // FAST PWM
    TCCR1B=0x1A; // 8분주=0.5usec
    ICR1=19999;  // 0.5usec*20000= 100Hz   
    ADMUX=0; ADCSRA=0xE7;

    while(1){     
  
         delay_us(250);
         ADC_I=ADCW;
         ADC_F=(float)ADC_I*500/1023.0;                   
         j=(char)ADC_F;
         RC_Motor(j);                                          
         lcd_gotoxy(0, 1); sprintf(s,"Range=%d ", j); lcd_puts(s); 
            
    }
}


/*
ADC_F=(float)ADC_I*5/1023.0;  -------------1자리
ADC_F=(float)ADC_I*50/1023.0;  ------------10자리
ADC_F=(float)ADC_I*500/1023.0; ------------100자리
*/
   
이제 FLEX센서만 부착하면 될 거 같네요!!!!! 현재 FLEX센서를 1개만 주문한 상태인데 도착해도 언제 만들지는 장담을
못하겠습니다...........




손으로 계산식으로 해서 사진파일 첨부 투척!!!!!!!!!!!!!

Apple | iPhone 3GS | Normal program | Spot | 1/40sec | F/2.8 | 3.9mm | ISO-64 | No flash function

Apple | iPhone 3GS | Normal program | Spot | 1/60sec | F/2.8 | 3.9mm | ISO-80 | No flash function



'AVR 8BIT > Flex센서 로봇팔' 카테고리의 다른 글

FLEX센서를 이용한 로봇팔 제어  (34) 2011.07.21
Posted by 숭덕이
안녕하세요 숭덕이 박제현 입니다. 회사에서 일끝나고 또 의자에 앉아 이렇게 글을 남깁니다. 조금 있으면 블로그시작한지 음 기억이 안나요!!!!!!!!암튼 초음파로 거리측정하고 모터를 움직여보겠습니다..


                                                             데이터시트
 

 

 





Apple | iPhone 3GS | 2011:07:12 22:03:03

 주파수 40Khz 
 최대 측정거리 3~4M 
 최소 측정거리 1CM 
 입력전압 5V 
 초당 측정횟수  1000ms(1초) 한번 측정시 50ms 1초당 약 20회
 입력신호 10usec 
 소비전류 4mA 
 크기 43 * 20 * 17 mm 
 스펙참조   (http://eleparts.co.kr/front/productdetail.php?productcode=005035002004000009&sort=)
 SRF-05 Single Pin Mode 



 

SRF-05에 제가 쓸 핀은 VCC,Echo,Trigger,Gnd 4개의 핀으로 회로와 초음파를 사용해보겠습니다.
초음파는 민감하고 잘 고장나는 센서이므로 회로도를 잘 보고 결선을 해주셔야 합니다. 이제 한번 이 센서를 먼저 분석해보도록 하겠습니다. 현재 가지고 있는 센서가 예전에 쓰던건데 고장난것인지 아닌지는 정확하게 모르겠으나 일단 초음파센서에 대해 적고 그 다음 빠른시일내에 테스트 해보겠습니다.

데이터시트에 보시면 타이밍 다이어그램이 있습니다. 그 그림을 가지고 설명을 드리겠습니다.


자 이 센서의 타이밍도 입니다. 정확한 펄스를 안맞춰도 되지만 정확한 값을 받지는 못하겠죠? 그래서 데이터시트에 나와있는 그대로 하면 좋습니다. 값은 나와도 값이 정확하지가 않으면 센서는 무용지물입니다.

처음 타이밍도를 보면 10us동안에 High로 되어 있습니다. 그 다음 Low로 내려간 상태에서 거리측정이 되시는것을 보실 수 있습니다. 10us의 펄스를 가하게 되면 2번째의 그림에서와 같이 8 cycles의 초음파가 발생합니다.


자 여기서 58us일때는 cm로 계산이 되며 148us는 inches로 계산된다고 나와있네요 제가 항상 실수하는것이
데이터시트를 정확하게 안보고 일단 만들어보고 그 다음에 실수한 부분을 찾는 다는 겁니다.
잘못되긴 했어도 만드는것이 재미있다 보니 어쩔 수 없이 안되더군요.

흠냥 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

초음파의 음파속도는 340m/s 입니다. 초음파는 음파를 발생하고 벽이나 장애물에 부딪치고 돌아오는 시간을 계산해보면 S= V * T/2 로 했을시 거리가 나오게 됩니다. 조금 어렵네요 저는 수학을 잘 못해서............



저도 예전에 한 2년전에 초음파센서로 거리측정한 후에 한번도 사용해보지를 못해서 정확하지는 않아서 인터넷을 찾아보니 1 ~ 2M 까지는 오차가 거의 없고 그 이상에서 1cm 정도 오차가 난다고 합니다... 참고하세요



 

자 이제 LCD에 대해 간단하게만 설명해야겠죠?????


자 집에 없는게 없군요 LCD도 있고 ^^ 일단 회로를 봐야겠군요

그냥 간단히 하고 넘어가겠습니다. LCD는 그다지 그렇게 많은 설명이 필요없을거 같습니다. 1번핀은 GND네요
당연히 GND는 연결을 해야겠지요?? 자 다음은 VDD 저는 여기에 5V를 연결하겠습니다. ㅋㅋㅋㅋ
자 이제 새로운게 나왔네요 Vo 흠 머지 Contrast 음 LCD에 선명도를 나타내는군요 !!!!   원래 가변저항을 써야하는데 제가 가난한 나머지 1k옴을 연결하고 GND와 연결하겠습니다.  가변저항을 연결하실때는 10K옴 가변저항을 사용하세요.
생각해보니까 이렇게 하난하나 설명하는거 보다 그냥 회로도를 올려드리는게 좋을거 같습니다. 다음에 한번에 해서 올려드리겠습니다...............


LCD TEST 완료....



주말에 조금 노느냐고 공부를 못했습니다. 지금 시간이 7월 17일 11시 24분 입니다.

지금 막 초음파 센서를 가지고 거리측정을 해봤습니다.

동영상을 찍어서 올리려고 했는데 전송잭을 안가져와서 그냥 일단 사진으로만 올리도록 하겠습니다





 #include <mega128.h>
#include <stdio.h>
#include <delay.h>
#include <lcd.h>
#asm
   .equ __lcd_port=0x1B ;PORTA
#endasm

#define Trigger         PORTD.4 //초음파 트리거
#define Echo            PINE.4 //초음파 에코

unsigned int i=0;
char s[21];


unsigned int getEcho(void){
    unsigned int range;
    while(!Echo);                  // Wait for echo pin to go high
    TCNT1=0; TCCR1B=2;            // 1:8 prescaler = 0.5us
    while(Echo);                   // Wait for echo pin to go low
    TCCR1B=8; range=TCNT1/116;   // the range in CM
    return(range);
}

void main(void){
    unsigned int range;
    DDRB=0x60;
    DDRD=0x10;
    DDRE=0x00;
    TCCR1A=0; TCCR1B=8;    // Set timer up in CTC mode
    delay_ms(100); lcd_init(16);
    while(1){    
        Trigger=1; delay_us(10); Trigger=0;    // 10uS
        range = getEcho(); 
        lcd_gotoxy(0, 0); sprintf(s,"Bongpjh");   lcd_puts(s);
        lcd_gotoxy(0, 2); sprintf(s,"Jae Hyun=%u cm", range); lcd_puts(s);
      
   
        if(range<30)
       {
       PORTB=0x20, delay_us(1300)  , PORTB=0x00, delay_ms(23);
       }                                                            
        else if(range<50)
       { 
       PORTB=0x20, delay_us(1050)  , PORTB=0x00, delay_ms(23);
       }
    
    
    }
  }



Posted by 숭덕이