728x90
반응형

아두이노로 duty cycle, Low pass filter를 이용하여 1v,2v,3v,4v를 만들까 합니다.\

Low pass filter는 저역주파수 대역을 재생하고, 고역주파수 대역을 감소시킵니다. 즉, 고주파로 갈수록 신호를 DC가까이 만들 수 있으나, 단점은 저역대역을 크게 설정할 수록 DC에 가까워 지지만 전압을 컨버팅시킬때 빠르게 컨버팅하지 못 합니다.

<회로 Simulation>

v1은 초기전압(offset전압을 만들 수 있습니다.)

v2는 최대전압

TD는 타임딜레이 초기신호를 어느정도 지연시킬 것인가(Start대기 타이밍)

TR은 rising time엣지가 트리거까지 상승시간(신호가 high가 되는시간)

TF는 fall time트리거에서 엣지로 떨어지는시간 (신호가 Low가 되는시간)

PW는 펄스폭을 얼마나 줄 것인가

PER은 주기를 얼마로 줄 것인가

위와 같이 설정했다면 HIGH20us, LOW 80us = 주기 100us에 pulse가 나옵니다.

최대전압이 5V이면서 Duty20%입니다. 이걸 filter를 걸치면 100us주기 기준

20us(duty20%) = 1v

40us(duty40%) = 2v

60us(duty60%) = 3v

80us(duty80%) = 4v

100us(duty100%)= 5v

위 다섯 가지를 만들 수 있습니다.

노이즈처럼 신호가 좀 있는데 이건 filter를 더 크게 가져가면 더 줄일 수 는 있습니다.

초록색 1v짜리를 설명으로 하자면 20us에서 신호가 올라가 야하는데 LPF에 의해서 상승해야 하는 구간에 늘어지는 각이 커지기 때문입니다. 이건, 따로 Filter 공부를 하다 보시면 어느 주파수에 신호의 각을 구하는 법이 있습니다.

RC 값을 크게 키우면서 신호가 늘어지는 화면을 첨부하니 확인해 보시면 좋을 것 같습니다.

<Source>

if(Serial.available()){

a=Serial.read(); 처음에는 이 문장을 처음 시작할 때만 넣었습니다. 만약에 serial 값이 오면 a=는 그것을 읽어라인데 이걸 while문 끝날 때마다 넣어주지 않으면 무한 루프에 빠져서 Voltage 컨버팅 될 때마다 넣어 주었습니다.

 

DMM으로 회로 없이 측정하면 평균 값을 나타내기 때문에 위와 같이 확인할 수 있습니다.

이 부분이 RMS기능이라고 해야할지 RMS는 AC에서만 사용되는 것인지는 좀더 확인이 필요합니다.

 

정확한 파형을 확인하기 위해 스코프를 이용했습니다. C값이나 저항 값 LEDA TYPE으로 큰 것이 없어서 어느정도만 신호를 만들어 봤습니다. RC값을 더 커질수록 신호가 컨버팅 되는 시간이 더 길어집니다.

반응형
728x90
반응형

이번에는 조이스틱을 이용해서 2개의 DC Motor를 구동할 예정입니다.

일반 아두이노에 키드에 있는 조이스틱을 이용하였고 시리얼 방향 값 입니다.

값을 표현하자면 이런식으로 나오게되는데 500기준 위쪽(오른쪽)으로 움직이면 감소

아래쪽(왼쪽)으로 움직이면 값이 증가됩니다.

즉, 끝에 최대값은 1023이며, 최소값은 0이된다는 겁니다.

이걸 이용해서 펌웨어 작업을 진행합니다.

<소스 코딩>

x축-> 0이면 13H,12L 순방향

x축-> 1020이상이면 13L,12H 역방향

y축-> 0이면 11H,10L 순방향

y축-> 1020이상이면 11L,10H 역방향

 

 

대각선으로 하면 둘다 값이 인식됩니다.

ex)오른쪽 위쪽 대각선 x=0,y=0 모터1순방향, 2순방향

반응형
728x90
반응형

이번에는 LM35DZ 온도센서를 이용하여 일정온도가 되면 모터,LED 2가지를 제어할 예정입니다.

<LM35DZ외관 모양>

LM35DZ TO92 PACK

패키지는 TO-92이며 일반 트랜지스터 와 유사하게 생겼습니다.

<PIN MAP>

핀맵 보실 때 주의해야 할 점입니다. Datasheet에 나와있는 핀맵인데 바텀 뷰이기 때문에 인식하고 회로를 구성하셔야 합니다

<온도 값 확인 법>

10mV => 1도 입니다.

200mV정도 센서 출력 전압 값이 나오니 대략 20도로 확인하면 됩니다.(센서 마다 오차가 있으니 참고하시길 바랍니다.)

<구성도>

구성도는 A3으로 센서 아날로그 값을 입력 받습니다.

출력은, 13번 ->LED, 12번 -> Motor로 구성 하였습니다.

<코딩>

코딩에서 v = 전압 값, t= 아날로그 온도 값 입니다.

전압은 아날로그 리딩 값에서 전압 5v를 곱하고 1024 비트를 나누어주면 구할 수 있습니다.

온도 값은 5v * 100(0.2V를 20도로 변환해주기 위함)/1024비트를 나누어주면 됩니다.

23도이상일때 LED가 켜지고, 25도이상일때 모터가 구동 됩니다.

<시리얼 모니터 화면>

<동영상>

 

왼쪽화면은 모니터링 화면 오른쪽은 구동

23도이상 LED ON, 25도이상 모터 구동

다시 온도가 내려가면 구동

반응형
728x90
반응형

이번에 내용은 초음파센서를 이용한 거리측정입니다.

초음파는 20khz이상(가청주파수 위) 주파수를 이용한 센서이며, 보통 거리나 앞에 장애물을 인식하는 센서로 이용됩니다.

 

사용할 초음파센서에 전기적인 특성부터 확인.

-전원 : 5V

-측정각도 : 15도

-트리거에 입력 받는 펄스 시간 : 10uS

-거리 계산식 : (high level time×velocity of sound (340M/S) / 2

구성도

코딩

int trig = 3;

int echo = 4;

void setup() {

pinMode(trig, OUTPUT);

pinMode(13, OUTPUT);

pinMode(12, OUTPUT);

pinMode(11, OUTPUT);

pinMode(10, OUTPUT);

pinMode(9, OUTPUT);

pinMode(8, OUTPUT);

pinMode(7, OUTPUT);

pinMode(6, OUTPUT);

pinMode(echo, INPUT);

Serial.begin(9600);// 9600bps 초당 비트 전송 속도

}

void loop() {

digitalWrite(trig, HIGH);

delayMicroseconds(10);

digitalWrite(trig, LOW);

int distance=pulseIn(echo, HIGH)/58; //거리=속도x시간 , 초음파는 초당 340m로 반응 340mx1s=340m/s

//1cm(0.01m)=340m/초 ,T=D/S, T=0.01/340 29.42us 즉 1cm에 29.42us이다.

//340m/s -> cm/us로 변환 -> 34000cm/s -> 34000*10^-6 -> 0.034cm/us

if(distance>13)

digitalWrite(13, HIGH);

else

digitalWrite(13, LOW);

if(distance>12)

digitalWrite(12, HIGH);

else

digitalWrite(12, LOW);

if(distance>11)

digitalWrite(11, HIGH);

else

digitalWrite(11, LOW);

if(distance>10)

digitalWrite(10, HIGH);

else

digitalWrite(10, LOW);

if(distance>9)

digitalWrite(9, HIGH);

else

digitalWrite(9, LOW);

if(distance>8)

digitalWrite(8, HIGH);

else

digitalWrite(8, LOW);

if(distance>7)

digitalWrite(7, HIGH);

else

digitalWrite(7, LOW);

if(distance>6)

digitalWrite(6, HIGH);

else

digitalWrite(6, LOW);

delay(100);

}

초음파데이터 사양서를 보게되면 에코는 트리거에서 나가고 반사되는 하이레벨을 읽는 것입니다.

주석으로 시간을 구하는 방법과 속도로 변환하는 방법 2가지를 남겨 두었습니다.

트리거 신호가 us이기때문에 에코도 us로 변환해서 계산하시면됩니다.

 

 

아두이노 초음파 거리 측정

 

반응형
728x90
반응형

기존에 진행했던 시리얼 통신 제어 1에 이어서 추가적인 기능을 더 넣었습니다.

예제 CODE

char a;//문자 a선언

int i;

void setup() {

pinMode(6,OUTPUT);

pinMode(7,OUTPUT);

pinMode(8,OUTPUT);

pinMode(9,OUTPUT);

pinMode(10,OUTPUT);

pinMode(11,OUTPUT);

pinMode(12,OUTPUT);

pinMode(13,OUTPUT);// 6~13번 핀을 출력으로 사용

Serial.begin(9600);// 9600bps 초당 비트 전송 속도

}

void loop() {

if(Serial.available()){

a=Serial.read();

if(a=='1')

{

Serial.println("led shift on");

Serial.print("read:");

Serial.println(a);

for(i=6; i<14; i++)

{

digitalWrite(i,HIGH);

delay(200);

}

}

if(a=='2')

{

Serial.println("led shift OFF");

Serial.print("read:");

Serial.println(a);

for(i=6; i<14; i++)

{

digitalWrite(i,LOW);

delay(200);

}

 

}

if(a=='3')

{

Serial.println("led shift ");

Serial.print("read:");

Serial.println(a);

for(i=14; i>5; i--)

{

digitalWrite(i,HIGH);

delay(200);

}

for(i=14; i>5; i--)

{

digitalWrite(i,LOW);

delay(200);

}}}}

기존 자료를 보시면 이해가 될 듯합니다. LED 좌우 쉬프팅을 응용하여 신호 1,2,3 3가지를 시리얼 통신으로 제어하는 방법입니다.

 

 

 

Dockligt는 기존에 신호에 대한 부가설명을 하기 위해서 사용했었고 이번에는 아두이노 내부에 있는 통신프로그램으로 진행했습니다.

반응형

+ Recent posts