반응형


포토인터럽터인 SG-207을 이용해서 시간당 회전횟수를 구하고

시간당 이동한 거리를 계산해여 최종적으로 속도를 계산하려고 합니다.


우선 포토인터럽트를 아두이노에 사용하려면 회로를 만들어줘야합니다.

회로는 아래와 같이 만들었습니다.



회로는 TOP VEIW이고 SG-207을 위에서 봤을때

다리 순서를 위 회로처럼해서 만들면 됩니다.


그러면 총 3개의 핀을 쓰게 되니다.

Vcc, Gnd, Signal


Vcc는 아두이노 5V에 Gnd는 Gnd에

Signal은 최종적으로 디지털 2번핀에 연결할겁니다.


하지만 아닐로그 테스트차원에서 우선은 아날로그 0번포트에 연결했습니다.



작은 보드를 이용해서 만들어 줬습니다.

핀헤더를 이용해서 점퍼케이블로 연결가능하게 만들었네요~


Signal선의 아날로그 데이터를 한번 테스트해보기 위해서

A0번 포트에 연결한다음에 아래와 같이 빛을 막을수 있는 차단막을 이용해서

2개의 기둥사이를 막았다가 안막았다가 해봅니다.



아두이노에 업로드할 코드는 아래 첨부합니다.


sg207코드1.txt




업로드하고 아두이노의 시리얼 플로터로 확인해보면

막지 않았을때 약 1000정도의 값이 측정되고

막았을때 100~200 정도가 측정되는것을 확인할 수 있습니다.


정상작동 하는것은 확인했고 이제 회전수를 측정하기 위해서

아두이노의 AttachInterrupt 함수를 사용합니다.


해당 함수는 아래 공식홈페이지에서 참조할 수 있습니다.

https://www.arduino.cc/en/Reference/AttachInterrupt



공식홈페이지에 따르면 아두이노 우노는 디지털 2번핀과 3번핀이 인터럽트 핀입니다.

(테스트로 꽂아놓았던 A0에 Signal선을 디지털 2번핀으로 옮겨줍니다)


매커니즘을 간단히 설명하자면 아날로그 데이터에서 확인한것 처럼

장애물이 없으면 High를 유지하다가 장애물이 생기면

High에서 Low로 내려가는 Falling edge가 생깁니다.

반대로 장애물을 다시 제거하면 Rising edge가 생깁니다.


Falling edge나 Rising edge가 발생할때 AttachInterrupt를 발동시킬 수 있고

연결된 함수를 호출해서 어떤? 작업을 할수 있습니다.


우리가 해야할 작업은 edge가 검출되었을때 횟수를 세면되니

어떤 전역변수를 하나 선언해두고 1씩 증가시키면 됩니다.


아래 아두이노에 업로드한 코드를 첨부합니다.

sg207코드2_인터럽트코드.txt


이코드에서 유의깊에 보셔야할 코드는 우선 아래코드 입니다.


const byte interruptPin = 2;

attachInterrupt(digitalPinToInterrupt(interruptPin), blink, FALLING);


"인터럽트핀인 2번핀에서 Falling edge가 발생하면 blink 함수를 실행하라"라는 뜻입니다.

공식홈페이지 코드를 그대로 활용하다보니 함수명은 그대로 가져 왔는데 blink 함수는

아래와 같이 정의 했습니다.


int count = 0;

void blink() {

  count++;

}


전역변수 count를 하나씩 증가시키는 코드네요~

falling edge 횟수를 센다는 것은 포토인터럽트에 장애물이 몇번 등장했는지를 나타냅니다.

루프에 딜레이를 1000ms 적용해뒀으므로 결국 전체 코드를 해석하자면


"단위시간(1초)동안 포토인터럽트가 몇번 가로막혔는지 횟수를 출력하라" 이런 뜻입니다.



이런식으로 가로막힌 횟수를 출력할 수 있습니다.


여기까지 해두고 과학상자를 이용해서 미니카 바퀴회전을 측정가능하도록

장치를 만들어 봤습니다.



미니카 바퀴 간격을 계산해서 미니카 바퀴의 회전량을 측정가능하도록

과학상자의 바퀴부품을 이용해서 만들었습니다.



속도 측정의 핵심은 위 사진과 같이 포토인터럽터와 바퀴 회전에 따라 장애물 역할을 할수있는 장치입니다.

저는 과학상자에 있는 2엽짜리 부품을 이용했습니다.



그러면 위와같이 바퀴가 회전할때의 횟수를 포토인터럽터를 이용해서 체크할 수 있습니다.

2엽날개니까 포토인터럽트에 2회 감지되면 바퀴가 한바퀴 회전했다고 가정하면 됩니다.


정밀하게 하려면 날개의 갯수를 늘려주면 됩니다.



이제 아두이노에 연결을 해주고 최종적인 연결은 아래와 같습니다.


Vcc - 5v

Gnd - Gnc

Signal - 디지털2번


여기까지 했으면 미니카 바퀴의 회전량을 측정하는것 까지 진행한것입니다.

회전량으로는 속도를 알 수 없습니다.

미니카가 일정시간동안 이동한 거리를 알아야 속도를 계산할 수 있습니다.

그러므로 미니카의 바퀴가 접하는 과학상자 바퀴가 회전할때의

총 이동거리를 계산해야 합니다.


그러기 위해서는 바퀴의 둘레를 알아야 합니다.



과학상자 바퀴(소)의 경우 지름이 3.5cm 입니다.

그러면 둘레는 공식에 의해서 3.5 * PI가 됩니다.


우선 아두이노에 업로드할 아래 코드를 다운받아서 보면서 설명하겠습니다.

sg207코드3_속도코드.txt


  float distance = (count/2.0) * (3.5 * PI); //unit : cm

  float velocity = distance / 1; //unit : cm/s

  velocity = velocity / 100000 * 3600; //unit : km/h 


위 코드에서 바퀴의 총 이동거리라는 것은 바퀴의 총 회전한 양에 바퀴의 둘레를 곱하면 계산할 수 있습니다.

바퀴의 총 회전량은 2엽날개로 인터럽트를 발생시키므로 인터럽트 발생횟수의 절반이 될것이고,

바퀴의 둘레는 위에서 계산한것과 같이 3.5 * PI 입니다.


그리고 아두이노 메인함수가 1초마다 실행되므로 1초당 이동한 거리(cm)로 생각해볼 수 있습니다.

단위가 cm/s 이죠


기본단위인 km/h로 바꿔주기 위해서

세번째줄 식을 이용하면 됩니다.


이제 단위가 km/h가 되었습니다.



미니카를 위에 한번 피팅해보고 전원을 켜서 한번 달리게 해봤습니다.



미니카 바퀴의 고무와 과학상자 바퀴 고무가 정확히 접해서 회전을 시키고 있습니다.

2엽날개도 간섭없이 잘 돌아가네요


미니카가 달리는동안 아두이노 시리얼 플로터 화면입니다.



미니카를 올려놓은 시점부터 속도가 측정됩니다.

한 36~37km 정도 되는것 같네요~

거의 무부하이기 때문이 땅에 놓았을때 보다는 높은 속도가 측정될 겁니다.


계속 방치해두니 건전지가 다써가는지

점점 속도가 떨어졌습니다.


포토인터럽터도 사용해보고 과학상자도 사용해보고

즐거운 시간이었습니다.


마치겠습니다.



반응형
Posted by 덕력킹
,