본문 바로가기

[아두이노&랩뷰 컴파일러]스위치를 활용한 Edge Detection!~

반응형

 디지털신호는 1,0으로 구성되어 있는 신호다. 0에서 1로 올라가는 것을 Rising이라고 하고 1에서 0으로 내려가는 Falling이라고 한다.그 외에도 LOW,HIGH,CHANGE 등이 있다. 이 예제에서는 스위치를 눌렀을 때 발생하는 발생하는 디지털신호에서 Falling Edge의 갯수를 카운트하여, Falling Edge의 갯수가 5개가 되면 13번 핀의 아두이노의 내장 LED의 불을 켜는 것을 설명한다. 여기서 주로 활용되는 것은 글로벌변수와 Attach Interrupt VI이다. 

 

 랩뷰에서는 4가지의 변수(로컬변수, 글로벌변수, 공유변수, 기능적 글로벌 변수)가 사용가능하며 차이점은 각각의 사용범위이다. 로컬변수는 하나의 VI내에서만 값을 지정할 수 있는 것이고, 글로벌변수는 VI와 VI간에 값을 지정할 수 있다. 공유변수는 네트워크로 다른 PC의 VI나 자신의 PC의 다른 VI와 연결할 때 사용되며, 기능적글로벌 변수는 글로벌변수의 역할을 하나 사용자가 직접 만들어야 하는 것이다. 랩뷰에서는 경합조건(Race Condition)이 발생할 수도 있기 때문에 기능적변수를 제외한 변수의 무분별한 사용을 지양한다. 데이터의 흐름이 깨짐으로 해서 백번원하는 결과를 얻다가도, 한번씩 다른 결과를 나타내기도 하므로 디버깅에 어려움이 따르기 때문이다. Attach Interrupt는 해당하는 변화(Falling Edge)가 발생했을 떄 참조된 VI를 실행시키는 함수이다.단 참조된 VI에서는 딜레이함수를 사용할 수 없다.


[준비물]

아두이노&USB케이블

스위치

점프케이블 2개



[회로도]



[블럭다이어그램]



Attach Interrupt 함수에 연결되어 있는 Callback VI는 아래의 이미지와 같다. 여러번 설명한 것과 같이 Falling Edge가 들어올 때마다 이 Callback VI가 실행되며 count 글로벌변수를 사용해서 Main VI의 While문안의 count글로벌 변수와 값을 쓰고 읽는다. 그 값을 기준으로 LED를 끄고 켜는 것이다.


[프런트 패널]



회로를 연결한 후 코드를 아두이노에 올리면 스위치를 5번 누름에 따라서 LED가 켜지는 것을 확인할 수 있다. 하지만 스위치에 따라 바운싱이 생긴다. 그래서 스위치를 한번 누른다고 생각하지만 아두이노가 받아들이기에는 여러번을 받아들이는 것으로 인식한다. 그래서 심지어 한번만 눌러도 LED가 켜진다. 한번 눌렀는데 5번 눌려진 것과 같은 것이다. 소프트웨어적으로 딜레이를 줘서 디바운스를 해줘야겠지만 callback VI내부에서는 모든 딜레이함수가 동작을 하지 않는다. 그러므로 디바운스 회로를 연결해서 바운스 문제를 해결해야한다.  해결방법은 RC회로와 슈미트트리거회로를 만들어야한다. 아래 동영상에 잘 설명되어있다.



반응형
-->