Raspberry Pi Zewo W에서 거리 센서 VL53L0X의 i2c 주소를 변경하여 여러 번 동시에 실행해 보았습니다.
개요
거리 센서 VL53L0X의 i2c 주소를 변경하여 복수 동작시키는 방법입니다
VL53L0X는 기동시의 i2c 주소는 0x29이므로 복수 접속하면 모두 같은 주소가 되어 버려 제어할 수 없게 됩니다
제어하려면 XSUT를 사용하여 하나씩 i2c 주소를 변경하는 절차가 필요합니다.
절차 개요는 다음과 같습니다.
동작 테스트
구성도
이번에는 VL53L0X를 4개 동작시킵니다
i2c 주소와 GPIO 번호는 다음 값으로 설정했지만,
i2c 주소는 0x29 이외로 사용하지 않는 주소이면 OK입니다.
GPIO 번호는 선택적으로 OK입니다.
VL53L0X
i2c 주소
GPIO
1
0x2a
26
2
0x2b
19
3
0x2c
20
4
0x2d
16
실제 물건
동작 결과
1000으로 표시된 부분은 1000mm 이상입니다.
VL53L0X는 Default mode에서 최대 측정값은 1200mm이므로 오값을 출력하지 않기 때문에 출력 제한을 하고 있습니다
코드
전체는 github 에 있습니다. i2c 주소 변경 위치와 측정치 획득의 위치는 다음과 같습니다.
vl53l0x.c//VL53L0X_init()の初期化箇所
//XSHUTをHIGHにする
digitalWrite(xshut_gpio,HIGH);
usleep(100000); //100ms
//defaultの0x29で初期化
m_pMyDevice[device_id]->fd = VL53L0X_i2c_init("/dev/i2c-1", 0x29);
//変更するi2cアドレス指定
m_pMyDevice[device_id]->I2cDevAddr = i2c_address;
VL53L0X_SetDeviceAddress(m_pMyDevice[device_id], m_pMyDevice[device_id]->I2cDevAddr<<1);
//変更したi2cアドレスで再度初期化
m_pMyDevice[device_id]->fd = VL53L0X_i2c_init("/dev/i2c-1", m_pMyDevice[device_id]->I2cDevAddr);
main.c//I2c_device_init()内の初期化箇所
//全てのL53L0Xのxshutをlowにする
pinMode(VL53L0X_XSHUT_1_GPIO,OUTPUT);
pinMode(VL53L0X_XSHUT_2_GPIO,OUTPUT);
pinMode(VL53L0X_XSHUT_3_GPIO,OUTPUT);
pinMode(VL53L0X_XSHUT_4_GPIO,OUTPUT);
pinMode(VL53L0X_XSHUT_5_GPIO,OUTPUT);
digitalWrite(VL53L0X_XSHUT_1_GPIO,LOW);
digitalWrite(VL53L0X_XSHUT_2_GPIO,LOW);
digitalWrite(VL53L0X_XSHUT_3_GPIO,LOW);
digitalWrite(VL53L0X_XSHUT_4_GPIO,LOW);
digitalWrite(VL53L0X_XSHUT_5_GPIO,LOW);
if(VL53L0X_init(VL53L0X_XSHUT_1_GPIO,0x2a,0) != VL53L0X_ERROR_NONE){ //距離センサ 1
printf("*** VL53L0X_init()err\n");
return -1;
}
if(VL53L0X_init(VL53L0X_XSHUT_2_GPIO,0x2b,1) != VL53L0X_ERROR_NONE){ //距離センサ 2
printf("*** VL53L0X_init()err\n");
return -1;
}
if(VL53L0X_init(VL53L0X_XSHUT_3_GPIO,0x2c,2) != VL53L0X_ERROR_NONE){ //距離センサ 3
printf("*** VL53L0X_init()err\n");
return -1;
}
if(VL53L0X_init(VL53L0X_XSHUT_4_GPIO,0x2d,3) != VL53L0X_ERROR_NONE){ //距離センサ 4
printf("*** VL53L0X_init()err\n");
return -1;
}
main.c//VL53L0X測定値獲得と表示箇所
for(;;){
if(VL53L0X_GetMeasurements(&VL53L0X_Measurement[0],0) != VL53L0X_ERROR_NONE)break; //VL53L0X測定値獲得 1つ目
if(VL53L0X_GetMeasurements(&VL53L0X_Measurement[1],1) != VL53L0X_ERROR_NONE)break; //VL53L0X測定値獲得 2つ目
if(VL53L0X_GetMeasurements(&VL53L0X_Measurement[2],2) != VL53L0X_ERROR_NONE)break; //VL53L0X測定値獲得 3つ目
if(VL53L0X_GetMeasurements(&VL53L0X_Measurement[3],3) != VL53L0X_ERROR_NONE)break; //VL53L0X測定値獲得 4つ目
printf("time %0.2lf VL53L0X(1..4):%4d %4d %4d %4d\n", dfFlightTime,
VL53L0X_Measurement[0],
VL53L0X_Measurement[1],
VL53L0X_Measurement[2],
VL53L0X_Measurement[3]);
}
Reference
이 문제에 관하여(Raspberry Pi Zewo W에서 거리 센서 VL53L0X의 i2c 주소를 변경하여 여러 번 동시에 실행해 보았습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/shigeru-yokochi/items/f996d495effdf6dea3fc
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
전체는 github 에 있습니다. i2c 주소 변경 위치와 측정치 획득의 위치는 다음과 같습니다.
vl53l0x.c
//VL53L0X_init()の初期化箇所
//XSHUTをHIGHにする
digitalWrite(xshut_gpio,HIGH);
usleep(100000); //100ms
//defaultの0x29で初期化
m_pMyDevice[device_id]->fd = VL53L0X_i2c_init("/dev/i2c-1", 0x29);
//変更するi2cアドレス指定
m_pMyDevice[device_id]->I2cDevAddr = i2c_address;
VL53L0X_SetDeviceAddress(m_pMyDevice[device_id], m_pMyDevice[device_id]->I2cDevAddr<<1);
//変更したi2cアドレスで再度初期化
m_pMyDevice[device_id]->fd = VL53L0X_i2c_init("/dev/i2c-1", m_pMyDevice[device_id]->I2cDevAddr);
main.c
//I2c_device_init()内の初期化箇所
//全てのL53L0Xのxshutをlowにする
pinMode(VL53L0X_XSHUT_1_GPIO,OUTPUT);
pinMode(VL53L0X_XSHUT_2_GPIO,OUTPUT);
pinMode(VL53L0X_XSHUT_3_GPIO,OUTPUT);
pinMode(VL53L0X_XSHUT_4_GPIO,OUTPUT);
pinMode(VL53L0X_XSHUT_5_GPIO,OUTPUT);
digitalWrite(VL53L0X_XSHUT_1_GPIO,LOW);
digitalWrite(VL53L0X_XSHUT_2_GPIO,LOW);
digitalWrite(VL53L0X_XSHUT_3_GPIO,LOW);
digitalWrite(VL53L0X_XSHUT_4_GPIO,LOW);
digitalWrite(VL53L0X_XSHUT_5_GPIO,LOW);
if(VL53L0X_init(VL53L0X_XSHUT_1_GPIO,0x2a,0) != VL53L0X_ERROR_NONE){ //距離センサ 1
printf("*** VL53L0X_init()err\n");
return -1;
}
if(VL53L0X_init(VL53L0X_XSHUT_2_GPIO,0x2b,1) != VL53L0X_ERROR_NONE){ //距離センサ 2
printf("*** VL53L0X_init()err\n");
return -1;
}
if(VL53L0X_init(VL53L0X_XSHUT_3_GPIO,0x2c,2) != VL53L0X_ERROR_NONE){ //距離センサ 3
printf("*** VL53L0X_init()err\n");
return -1;
}
if(VL53L0X_init(VL53L0X_XSHUT_4_GPIO,0x2d,3) != VL53L0X_ERROR_NONE){ //距離センサ 4
printf("*** VL53L0X_init()err\n");
return -1;
}
main.c
//VL53L0X測定値獲得と表示箇所
for(;;){
if(VL53L0X_GetMeasurements(&VL53L0X_Measurement[0],0) != VL53L0X_ERROR_NONE)break; //VL53L0X測定値獲得 1つ目
if(VL53L0X_GetMeasurements(&VL53L0X_Measurement[1],1) != VL53L0X_ERROR_NONE)break; //VL53L0X測定値獲得 2つ目
if(VL53L0X_GetMeasurements(&VL53L0X_Measurement[2],2) != VL53L0X_ERROR_NONE)break; //VL53L0X測定値獲得 3つ目
if(VL53L0X_GetMeasurements(&VL53L0X_Measurement[3],3) != VL53L0X_ERROR_NONE)break; //VL53L0X測定値獲得 4つ目
printf("time %0.2lf VL53L0X(1..4):%4d %4d %4d %4d\n", dfFlightTime,
VL53L0X_Measurement[0],
VL53L0X_Measurement[1],
VL53L0X_Measurement[2],
VL53L0X_Measurement[3]);
}
Reference
이 문제에 관하여(Raspberry Pi Zewo W에서 거리 센서 VL53L0X의 i2c 주소를 변경하여 여러 번 동시에 실행해 보았습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/shigeru-yokochi/items/f996d495effdf6dea3fc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)