초음파센서, 부저 with 라즈베리파이

공이지·2024년 7월 14일

초음파센서

  • 위와 같이 생긴 초음파센서는 송신모듈로 초음파를 발생시키면 수신모듈로 물체에 부딫힌 초음파를 인식한다.
  1. 다음과 같이 라즈베리파이에 연결된 Trigger Pin으로 10us의 펄스 신호를 입력해준다.(이 과정을 산에서 야호하면 되돌아오는 메아리라고 하면 뇌가 야호~라고 말하라고 입력해주는 과정!)
  2. 그러면 초음파 센서의 송신모듈에서 25us짜리 8개의 초음파를 발사한다.(이는 뇌에서 입력받은 야호~를 외치는 과정!)
  3. 발사한 초음파가 물체에 부딪혀 수신 모듈로 돌아올 때, 초음파 센서의 Echo핀에서 그 시간 동안만 High신호를 출력한다. 이 High신호의 간격을 이용해 음파의 속도(343m/s)를 적용해 물체와의 거리 값을 계산합니다.(산에 부딪힌 메아리가 돌아와 나의 귀에 들리게되는 과정!)

    3번의 과정이 잘 이해가 안간다면. 간다하게 내가 야호~ 소리치고 난 후 부터 Echo핀에 High신호를 출력하여 물체에 부딫혀 돌아오는 초음파가 수신모듈로 되돌아온다면 Echo핀의 출력은 High에서 Low로 변할 것이다. 이렇게 Echo핀의 High출력이 나오는 시간을 초음파의 속도와 곱하고 2로 나누어주면 물체와의 거리를 계산할 수 있다는 말이다!!

초음파센서 라즈베리파이 실습코드
다음은 초음파를 발사해 거리를 측정하는 기능을 실행한다. 코드의 가독성 및 관리를 위해서 3개의 코드파일로 나누어 extern 을 사용하여 함수를 외부에서 사용합니다.

  • 위에서 설명했듯이 라즈베리파이에서 Trig핀으로 신호를 입력해줘야한다. 10us의 펄스신호를 입력해줘야하기에 트리거신호를 High로 출력하고 10us의 딜레이를 주고 트리거신호를 Low로 변경시킵니다! 이후 딜레이를 200us로 주어서 Trig핀으로 들어가는 신호의 주기를 관리해줍니다.
  • 위의 코드의 함수를 extern으로 불러와서 사용한다. 이 과정에서 부저센서는 Trig신호를 받아서 이미 초음파를 발사했다 그러면 Echo핀에서 출력을 High로 변경한다. while(digitalRead(ECHO) != 1); 위 코드에서는 ECHO가 High가 될때까지 기다리다가 ECHO의 출력이 High가 되면 t1에 ECHO가 1이되는 순간부터 시간을 저장합니다. 이후 while(digitalRead(ECHO) != 0); ECHO핀에서 초음파가 모두 들어오게 된다면, 즉! ECHO의 출력이 LOW가 된다면 끝난 시점의 시간을 t2에 저장합니다. 이후 물체와의 거리를 계산하기 위하여 초음파의 속도(340m/s)와 t2-t1의 시간을 곱해주면 물체와의 거리를 구하는 코드입니다.
  • 이코드는 부저센서와 합하여 거리에 따라 부저센서에 영향을 주는 코드이지만 다음에 설명하겠다. 중요한점은 위에서 계산한 Dist() 함수로 물체의 거리를 구하여 표시하는 코드입니다.

Pulse...?

  • 먼저 ClockCounter는 펄스카운터는 일정 시간동안 발생하는 펄스의 개수를 세는 장치이다. 이를 통해 주파수, 속도,회전수등을 측정할 수 있다. Clock Counter는 펄스카운터의 한 종류인데 클럭신호의 펄스를 카운팅하여 시간을측정하는 역할을 한다.
  • Clock Counter는 입력클럭 신호를 분주(Prescaler : 타이머에 공급하는 입력 클럭의 속도를 조절하는 분주기.)하여 다른 용도로 사용하는 역할도 한다. 예를들어 클럭신호가 1초에 1920번 발생한다고 하면 이를 10개로 묶어서 한 개로 카운팅할 수 있다. 예를들어 입력 클럭신호가 1920Hz라면 입력클럭신호를 10으로 분주하여 192Hz의 새로운 클럭 신호를 생성합니다. 생성된 클럭신호 192Hz 클럭 신호를 카운팅하면 1초에 192번 펄스를 출력합니다. 이때 Prescaler의 분주비는 10이됨!!
  • 여기서 Range는 Clock Counter의 최대 계수 범위를 결정하는 것입니다. 즉 그림에서 보면 Counter의 최대 값이라고 간다하게 생각할 수 도 있습니다. 8비트 Counter라면 최대 계수의 값은 2^8 = 256이되고 이는 0~255까지 카운트 할 수 있고 255가 8비트 Counter의 Range입니다!
  • 그림에 CompareCompare Register를 의미합니다. Clock Counter에서 입력 클럭 신호를 카운팅하여 시간을 측정 할 때, Compare Register는 Counter의 값과 비교하여 특정 시점에서 펄스를 발생시키는 역할을 합니다.
  • EX >>
    Counter가 0부터 시작하여 증가하다가 Compare Register 값과 같아지면 출력 펄스가 발생합니다.Counter가 계속 증가하다가 다시 Compare Register 값과 같아지면 출력 펄스가 종료됩니다.
    이렇게 Compare Register 값을 조절하면 출력 펄스의 시작 시점과 끝 시점을 제어할 수 있습니다. 즉, 펄스의 폭을 조절할 수 있습니다.
    이를 통해 Clock Counter를 이용하여 다양한 타이밍 신호를 생성할 수 있습니다. 예를 들어, 펄스폭 변조(PWM) 신호 생성, 일정 주기의 타이밍 신호 생성 등이 가능합니다.

    따라서 Clock Counter의 Compare Register는 출력 펄스의 폭을 조절하는 데 사용되는 중요한 기능이라고 할 수 있습니다.
  • Clock Counter에서 펄스폭을 조절하는 방법
    • CompareRegister 값 조절
      1. Compare Register 값을 변경하여 펄스의 시작 시점과 끝 시점을 조절할 수 있습니다. 예를 들어, Compare Register 값을 증가시키면 펄스의 폭이 넓어지고, 감소시키면 펄스의 폭이 좁아집니다.
    • Preascaler 값 조절
      1. Prescaler는 입력 클럭 신호를 분주하여 Counter의 증가 속도를 조절합니다.
      2. Prescaler 값을 변경하면 Counter의 증가 속도가 달라지므로, 펄스의 폭이 변경됩니다.
      3.예를 들어, Prescaler 값을 증가시키면 Counter의 증가 속도가 느려지므로 펄스의 폭이 넓어집니다.
  • 펄스폭과 DutyRate
    duty rate는 펄스 신호의 "듀티 비율"을 나타내는 개념으로, 펄스가 HIGH 상태로 있는 시간의 비율을 말합니다.
    duty rate는 다음과 같이 계산됩니다: Duty rate = (Pulse Width / Period) x 100 (%)
    즉, 펄스폭이 증가하면 duty rate도 증가하게 됩니다. 반대로 펄스폭이 감소하면 duty rate도 감소하게 됩니다.
    예를 들어, 펄스폭이 1ms이고 주기가 10ms라면 duty rate는 10%가 됩니다. 펄스폭을 2ms로 늘리면 duty rate는 20%가 됩니다. 이처럼 펄스폭과 duty rate는 밀접하게 연관되어 있습니다. 펄스폭을 조절하면 자연스럽게 duty rate도 변경되게 됩니다.
    따라서 Clock Counter에서 펄스폭을 조절하면 그에 따라 duty rate도 함께 조절될 수 있습니다. 이러한 특성은 PWM(Pulse Width Modulation) 등의 기술에 활용됩니다.

    위 그림의 식을 보면 주파수는 PreScaler와 Range와 Clock의 영향을 받습니다. PreScaler는 입력 클럭 신호를 분주하여 Counter의 증가 속도를 조절합니다. PreScaler값이 클수록 더욱 긴 주기의 신호를 생성하여 출력 주파수가 낮아집니다. 반대로 Range가 작을 수록 더 짧은 주기 신호를 생성할 수 있고 주파수 출력이 높아집니다. 따라서 PreSclaer와 Range를 적절히 조절하면서 주파수의 신호를 조절할 수 있다는 의미입니다!

부저센서

  • 일반적으로 우리가 아는 부저(Buzzer)는 피에조 부저(Piezo Buzzer)라고 하는 것입니다. 이는 피에조 효과를 이용한 부저인데, 피에조 효과란 수정, 세라믹과 같은 물체에 전기적인 신호를 주면 물질이 수축, 신장하는 효과를 말합니다. 이러한 물체 위에 얇은 판을 붙여주면 소리가 나는 소자입니다. 하지만 전기적인 신호만 준다고 해서 부저가 울리지는 않습니다. 판을 떨리게 하는 신호를 만들어줘야하는데, 주로 PWM신호를 사용합니다. 이를 사용하면 각 음계에 맞는 주파수를 생성하여 판을 떨리게 함으로써 다양한 소리를 낼 수 있습니다.
  • 부저센서의 주파수를 이용해서 노래를 연주하는 기능입니다. 또한 초음파 센서의 길이측정 기능을 더하여 물체와의 거리가 가까우면 연주를 위한 계이름 사이의 delay값을 줄여서 노래를 배속으로 처리하도록 만들었습니다.
  • 다음 식을 활용하여 부저의 주파수를 구할 수 있습니다 여기에선 PreSclaer 값은 19이다. 그리고 우리는 계이름 표를 확인하여 원하는 계이름의 주파수를 구하기위해 Range값을 구해야하기 때문에 pwm의 clock값 19.2Mhz(192000000)와 계이름의 주파수 값을 적어놓은 배열을 계산하여 계일이름 별로 계산한 range값을 배열로 저장합니다.
  • 그리고 initSound()함수를 이용해 PWM모드를 설정해주고 range값을 계산하여 연주를 할 준비가 완료되었다고 iFlag를 1로 변경시켜줍니다
  • 이후 Play()함수에서 계산한 range값으로 연주를 시작하는데 이때 PWM모드로 초기화가 진행되었는지 확인하기위해 iFlag값을 확인합니다.

MakeFile(Linux)


  • 위에서 초음파센서의 헤더파일들을 모아서 초음파센서 기능들을 실행할 수 있었다. 우리가 cmd창에서 하나씩 오브젝트파일로 변경하여 실행파일로 만들어서 실행하는데는 상당히 귀찮다..! 따라서 이렇게 헤더파일들을 이용한 파일들을 makefile을 이용해서 빌드하는 과정은 다음과 같다.
  1. 다음과 같이 정의한 헤더파일(.h) or 소스파일(.c)들을 오브젝트 파일로 변환해준다.
    2.맨위의 #define처럼 한꺼번에 정의를 하여 실행을 시켜주면 TARGET에 작성된 이름으로 실행파일을 만들어 make명령어를 사용해서 손쉽게 프로그램을 실행할 수 있다.
    참조 : https://code-lab1.tistory.com/370
profile
화이팅..!

0개의 댓글