10 Arduino에서 쉽게 거리 센서 GP2Y0E03에서 I2C로 값을 얻습니다.

7067 단어 ArduinoI2C

거리 센서 정보



거리 센서라고 해도 몇 가지 종류가 있습니다.
- 광학식
- 초음파
-레이저 등

이번에 사용하고 싶은 센서는 PSD(position sensitive detector)라는 소자를 이용하는 적외선 광학 센서로 대상물과의 거리를 반사광의 입사각에 따라 읽는 방식입니다.

이 방식으로 유명? 개인적으로 옛날부터 사용하고 있던 것이, 샤프의 GP2Y0A21YK 입니다. 이 센서는 대상물과의 거리를 아날로그 출력합니다. 마이크로 컴퓨터 등의 A/D 변환 기능을 사용하면 쉽게 읽을 수 있지만 출력 값이 선형이 아닌 (비선형)되어 보정을 필요로하는 등 다루기 어려운 점도 있습니다.

이번은 새롭게 GP2Y0E03 이하 E03을 이용하기로 했습니다.
또, 이번 아날로그 포트를 이용하지 않고 I2C로 값을 취득하는 것으로, PIN의 절약도 하고 싶다고 생각했습니다.

Arduino의 I2C(아이스퀘어시)에 대해서는, Arduino와 30분 만에 I2C 통신 에서 설명 받고 있으므로, 고맙게 소개하겠습니다.

샤프제 광학 거리 센서 GP2Y0E03에 대해서



인용 GP2Y0E03 아키즈키 전자 통상
■특징
・신호 처리 회로 내장
· CMOS 이미지 센서
・적외 LED 채용
・소형(16.7×11×5.2㎜)
· 고정밀
・디지털(I2C)/아날로그 전압 출력

■주요 사양
・출력:I2C 및 아날로그 출력
・전원 전압(VDD): 2.7~5.5V
・측거 범위: 4~50cm
L = 50cm에서
VOUT(A) 1=0.3~0.8V
 D1=45~50cm
 L=4cm에 있어서
VOUT(A) 3=2.1~2.3V
 D3=3~5cm
・사이즈:18.9x8.0x5.2mm

되어 있습니다.
작은 것, 아날로그, I2C 어느 쪽에도 대응하고 있는 점이 기쁩니다.
측정 거리입니다만, 실감으로서 60 cm정도까지가 범위일까라고 생각합니다.
30cm 정도의 근거리는 정밀도도 안정되어 있습니다.

I2C 연결



GP2Y0E03 단독으로 Arduino와 연결




Arduino의 SCL(A5)과 SDA(A4)를 각각 접속하여 풀업하면 됩니다만, E03의 전원 전압이 3.3V이므로 5V계의 디바이스와 접속하는 경우는 레벨 변환을 실시할 필요가 있습니다 .
이번에는 PCA9306을 사용했습니다.
판매되는 기판에는 풀업 저항이 설치되어 있으므로 다시 설치할 필요가 없습니다.

또한 E03은 I2C 통신을 할 때 GPIO1을 H 레벨로 설정해야합니다. L 레벨의 상태는 대기입니다.

다중 장치로 Arduino와 연결




슬레이브 어드레스가 다른 디바이스를 버스에 접속하는 수의 경우의 결선도입니다.
시험에 가속도 센서 ADXL345를 통합했습니다.

통신 프로그램



Robot19
#include <Wire.h>

// デバイスアドレス(スレーブ)
uint8_t E03_DEVICE_ADDRESS 0x40
uint8_t DISTANCE_ADDRESS 0x5E



void loop(){
  uint8_t dis[2];
  uint16_t  distance;

  Wire.beginTransmission(E03_DEVICE_ADDRESS);
  Wire.write(DISTANCE_ADDRESS );
  Wire.endTransmission();

  Wire.requestFrom(E03_DEVICE_ADDRESS, 2);
  for (i=0; i< 2; i++){
    while (Wire.available() == 0 ){}
    dis[i] = Wire.read();
  }

  distance = dis[0]<<4;
  distance |= dis[1];
  distance = (distance / 16) / 4;
  Serial.print(dis[0]);
  Serial.print("  ");
  Serial.print(dis[1]);
  Serial.print("  ");
  Serial.println(distance);
}

설정에 대해서는 모두 Default입니다. 괴롭히지 않습니다.

거리의 값은 12 바이트 길이이며,
E03의 주소 0x5e에 Distance[11:4] 0x5f에 Distance[3:0]인가 저장되어 있습니다.
따라서 2바이로 나뉘어 데이터가 수신됩니다.
상위를 4비트 왼쪽 시프트하고 하위의 4비트와 OR함으로써 12비트의 데이터를 생성할 수 있습니다.
distance = (distance/16)/4;에서 [cm]로 변환하고 있습니다.
실측으로 확인했습니다만, 식이 잘못되어 있으면 미안해.

마지막으로 시리얼 모니터로 확인합니다.
①0x5e_Distance[11:4]의 값(상위)
②0x5f_Distance[3:0]의 값(하위)
③거리[cm]

마지막으로



3.3V 계열의 디바이스에서는 매우 편리합니다.
임계값 등 세세한 설정이 가능합니다. 또한 용도에 따라 설정을 할 수 있다고 생각합니다.

좋은 웹페이지 즐겨찾기