Raspberry Pi Zewo W에서 거리 센서 VL53L0X의 i2c 주소를 변경하여 여러 번 동시에 실행해 보았습니다.

개요



거리 센서 VL53L0X의 i2c 주소를 변경하여 복수 동작시키는 방법입니다
VL53L0X는 기동시의 i2c 주소는 0x29이므로 복수 접속하면 모두 같은 주소가 되어 버려 제어할 수 없게 됩니다
제어하려면 XSUT를 사용하여 하나씩 i2c 주소를 변경하는 절차가 필요합니다.
절차 개요는 다음과 같습니다.
  • 모든 VL53L0X의 XSUT를 로우로 설정
  • 첫 번째 VL53L0X XSHUT를 HIGH로 설정
  • 이 때 i2c 주소는 초기 값의 0x29이지만, 그대로 초기화한다
  • 변경하려는 i2c 주소로 설정
  • 다시 초기화
  • 모든 VL53L0X에 대해 2-5 단계를 수행하십시오 (2 중 첫 번째를 두 번째, 세 번째로 읽으십시오)
  • 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]);
        }
    

    좋은 웹페이지 즐겨찾기