3선 초음파 센서를 PSOC 5LP에 연결하기

Matthew Bon 작성, 2017년 3월 17일 최종 수정

필요한 하드웨어:

PSOC 5LP 시제품 키트
3선 초음파 센서, 여기에서는 Paralax의 28015를 사용했습니다.

유용한 링크:

CY8CKIT-059_Quickstart_Guide - CY8CKIT-059_Quickstart_Guide.pdf (1.3 MB)
28015-PING-Sensor-Product-Guide-v2.0] - 28015-PING-Sensor-Product-Guide-v2.0.pdf (383.2 KB)

초음파 센서 개요:

Parallax 28015와 같은 초음파 센서의 동작 방식은 다음과 같습니다. 측정을 시작하기 위해, 먼저 외부 마이크로컨트롤러가 센서의 신호 핀에 펄스를 인가할 것입니다. 그러면 센서는 초음파 신호를 방출할 것입니다. 신호가 방출된 후, 센서는 반향 신호에 귀 기울이는 동시에 신호가 방출된 시간과 반향 신호가 수신된 시간 사이의 길이(비행 시간이라고도 함)를 계산합니다. 반향 신호가 수신되면, 센서는 신호 핀에 펄스를 출력합니다. 이 펄스의 길이가 신호의 비행 시간에 해당합니다. 출력 펄스의 길이를 알면, 마이크로컨트롤러는 간단한 계산을 통해 거리를 측정할 수 있습니다.

센서의 출력 펄스 길이를 거리로 변환하는 계산은 다음과 같습니다.

  1. 먼저, 공기 중 소리의 속도는 공기의 온도에 따라 변한다는 사실을 고려해야 합니다. 이와 관련된 공식은 다음과 같습니다: 공기 중 소리의 속도 = 331.5 + (0.6 * 공기 온도) m/s, 여기서 공기 온도의 단위는 섭씨입니다. 실내 온도(21도)에서 소리의 속도는 344.1 m/s입니다.
  2. 거리를 측정하는 공식은 다음과 같습니다: (비행 시간 * 공기 중 소리의 속도) / 2. 28015의 규격서에 따르면 출력 펄스의 최솟값은 115us, 최댓값은 18500us입니다. 소리의 속도에 344.1 m/s를 사용해 계산하면, 측정 가능한 거리는 대략 0.027m (0.85 ft)에서 3.18m (10.4 ft)입니다. 이 범위를 벗어난 물체는 정확하게 측정할 수 없습니다.

초음파 센서 사용의 몇 가지 장점:

  • 두 물체 간의 거리를 물리적으로 접촉하지 않고도 간단하고 편리하게 측정할 수 있습니다.
  • 일반적으로 적외선 거리 센서보다 측정 범위가 훨씬 더 넓습니다.

초음파 센서 사용의 몇 가지 단점:

  • 위에서 언급하였듯이, 공기 중 소리의 속도는 온도에 따라 변하기 때문에 센서에 연결된 마이크로컨트롤러는 일반적으로 이러한 변화를 보정할 방법을 필요로 합니다.
  • 반사된 신호가 센서에 도달하지 못할 정도로 각진 표면은 감지할 수 없습니다. 소리를 잘 반사하지 않는 부드러운 재질의 물체도 감지하기 어렵습니다.

기존 접근 방식:

3선 초음파 센서를 인터페이스 하는 일반적인 방법은 하나의 GPIO 핀과 출력 펄스의 길이를 기록하는 타이머를 사용하는 것입니다.

아래 회로와 코드를 참조하시기 바랍니다:

기존 접근 방식의 Main.c

/* ========================================
 *
 * Copyright YOUR COMPANY, THE YEAR
 * All Rights Reserved
 * UNPUBLISHED, LICENSED SOFTWARE.
 *
 * CONFIDENTIAL AND PROPRIETARY INFORMATION
 * WHICH IS THE PROPERTY OF your company.
 *
 * ========================================
*/
#include <project.h>
uint16 counts = 0;
float  feet   = 0;
uint16 i      = 0;
int main()
{
    CyGlobalIntEnable;
     
    for(;;)
    {
        //Timer_1_Init();  //Initiate timer
        Pin_1_Write(1);
        CyDelayUs(10);
        Pin_1_Write(0);
         
         
        while(Pin_1_Read() != 1) //wait until return pulse starts
        {
       
        }
         
        Timer_1_Start();
         
         
        while(Pin_1_Read() != 0) //wait unit return pulse stops 
        {  
           
        }
         
        counts = 0xFFFF-Timer_1_ReadCounter();
         
        feet = counts * 0.00056325; //Convert pulse width to feet, to convert to meters, multiply by 0.0001717 instead. 
         
        if (feet < 1.0 )
            {
                
                LED_Write(1);
                  
                 
            }
              
             else
            {
           
                LED_Write(0);
             }
             
             
        CyDelay(100);
        Timer_1_Stop();
                
        
    }
}
 
/* [] END OF FILE */

이 구현은 매우 간단합니다. 센서가 실행될 수 있도록 프로세서가 Sonic_Sensor 핀을 하이로 만든 다음, 로우로 만들어 반환 펄스를 기다립니다. 반환 펄스가 감지되면 프로세서는 타이머를 시작합니다. 반환 펄스가 끝나면 프로세서는 타이머로부터 값을 읽어와 거리를 계산합니다. 이후 프로세서는 타이머가 멈출 때까지 기다린 후 이 과정을 다시 시작합니다.

이 방법은 이러한 센서를 인터페이스 하는 일반적인 방식이며, 거의 모든 마이크로컨트롤러가 이 동작을 수행할 수 있습니다. 아래 섹션에서는 PSOC 5LP의 UDB(Universal Digital Block, 범용 디지털 블록)를 사용하여 동일한 기능을 구현하는 또 다른 방법을 설명하고 있으며, UDB는 Cypress의 PSOC 플랫폼 고유의 기능입니다.

UDB 기반 접근 방식:

위의 간단한 타이머 기반 접근 방식 대신, PSOC의 UDB를 사용하여 동일한 작업을 수행할 회로를 만들 수 있습니다.

아래 회로를 참조하시기 바랍니다:

각 회로 부품의 기능은 다음과 같습니다:

  • Sonic_Sensor 핀: 시작 펄스를 보내고 반환 펄스를 수신하는데 사용되는 양방향 입출력 핀.
  • Enable 핀: 플립플롭과 카운터의 활성화에 사용되는 입출력 핀.
  • Counter: 반환 펄스의 길이를 기록하는 데 사용.
  • Toggle Flip-Flop: 초음파 센서의 출력 펄스를 카운터를 증가시키는 펄스 열로 변환.
  • AND 게이트: Enable 신호가 하이일 때만 플립플롭이 증가하도록 만듦.
  • NOT 게이트: Enable 신호가 로우로 전환되면 카운터를 리셋.
  • Clock_1: 카운터를 구동하는 클럭으로, Clock_2 주파수의 두 배로 동작합니다.
  • Clock_2: 플립플롭을 구동하는 클럭으로, Clock_1 주파수의 절반으로 동작합니다.
  • Sync_1: Clock_1과 Clock_2가 동일한 위상이 되도록 두 클럭을 동기화
  • LED: 표시용으로 사용

회로가 거리 측정값을 기록하는 과정은 다음과 같습니다:

  1. 초음파 센서가 실행될 수 있도록 프로세서가 Sonic_Sensor 핀을 10마이크로초 동안 하이로 만듭니다.
  2. 10마이크로초가 지나면, 프로세서는 (Sonic_Sensor 핀을 로우로 설정하고) Sonic_Sensor 핀이 반환 펄스를 수신할 수 있도록 입력으로 동작하게 지시합니다.
  3. 그런 다음, Enable 핀을 하이로 만들어 플립플롭과 카운터를 활성화합니다.
  4. 초음파 센서의 출력 펄스는 Sonic_Sensor 핀을 하이로 만들 것입니다. 플립플롭의 입력이 하이가 되면, 출력은 하이와 로우 상태를 1MHz(플립플롭 클럭 주파수의 절반)의 속도로 번갈아 가며 왔다 갔다 할 것입니다. 이는 사실상 출력 펄스가 지속되는 동안 매 마이크로초마다 하나가 카운트된다는 것을 의미합니다.
  5. 출력 펄스가 멈추면, 플립플롭의 출력은 하이 상태를 유지하기에 카운터는 증가를 멈출 것입니다. 이제 프로세서는 카운터를 읽어 거리 측정값을 얻을 수 있습니다.
  6. 측정값을 읽으면, 프로세서는 Enable 핀을 로우로 만들어 카운터를 리셋합니다.

이 절차를 수행하는 데 필요한 코드는 아래에서 확인할 수 있으며, 전체 PSOC Creator 프로젝트는 이 게시글의 예제 프로젝트 부분에서 확인할 수 있습니다.

UDB 접근 방식의 Main.c

/* ========================================
 *
 * Copyright YOUR COMPANY, THE YEAR
 * All Rights Reserved
 * UNPUBLISHED, LICENSED SOFTWARE.
 *
 * CONFIDENTIAL AND PROPRIETARY INFORMATION
 * WHICH IS THE PROPERTY OF your company.
 *
 * ========================================
*/
#include <project.h>
int main()
{
    CyGlobalIntEnable; /* Enable global interrupts. */
    Counter_Start();
    for(;;)
    {
        uint16 counts = 0; // value to store results from the counter
        float  feet = 0;
  
        Enable_Write(0);
        Sonic_Sensor_Write(1);   //Output the sensor pulse
 
        CyDelayUs(10); //wait for the sensor pulse to finish
 
        Sonic_Sensor_Write(0); //shut off the sensor pulse
        Enable_Write(1);
  
        Sonic_Sensor_Read(); //receive return pulse
        CyDelay(50); // wait for the maximum value of the return pulse
 
        counts = Counter_ReadCounter();// read counter value
        feet = counts * 0.00056325; //convert pulse width to feet, to convert to meters, multiply by 0.0001717 instead.
        CyDelayUs(10);
 
        if (feet < 1.0 )
            {
                
                LED_Write(1);
                  
                 
            }
              
             else
            {
           
                LED_Write(0);
             }
                 
              Enable_Write(0);// reset the counter
               
            }
                 
}
/* [] END OF FILE */

예제 프로젝트:

아래 작업 파일에는 위에 설명한 기존 접근 방식과 UDB 기반 접근 방식 모두에 대한 PSOC Creator 프로젝트가 포함되어 있습니다.

PSOC_Ultrasonic.zip (9.6 MB)

질문 / 의견

이 게시글을 통해 3선 초음파 센서를 PSOC에 인터페이스 하는 방법과 PSOC가 제공하는 유연성에 대해 일부나마 이해하셨기를 바랍니다.

본 게시글 또는 다른 페이지의 정보에 대한 질문이나 피드백은 테크포럼을 방문해 주시기 바랍니다: TechForum



영문 원본: Interfacing a Three Wire Ultrasonic Sensor to the PSOC 5LP