ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 아두이노 라이브러리 | I2C 멀티플렉서 TCA9548A 모듈
    Technology/Arduino 2024. 11. 27. 22:10

    1. I2C 멀티플렉서 TCA9548A 모듈

    I2C 주소를 변경하는 기능을 지원하지 않는 센서를 사용하는 경우, 해당 모듈을 이용할 경우 동일한 I2C 주소를 가지고 있더라도 두 센서를 모두 사용할 수 있다.

     

     

    TCA9548A I2C Multiplexer [ada-2717]

    TCA9548A 1-to-8 I2C multiplexer / 30.6mm x 17.6mm x 2.7mm

    www.devicemart.co.kr

     

    2. 아두이노 라이브러리 추가

    제조사 Adafruit에서 제공하는 TCA9548 라이브러리를 설치하여 사용하도록 하자.

     

    아두이노 IDE 상단 툴바에서 '툴'을 선택한 뒤 '라이브러리 관리' 항목을 선택하자. 그러면 곧이어 '라이브러리 매니저' 창이 나타나는데, 해당 창 오른쪽 상단에 라이브러리 이름을 입력하면 아두이노 플랫폼에서 지원하는 라이브러리를 검색할 수 있다. 해당 칸에 'TCA9548'을 입력하자. 라이브러리를 검색하면 입력한 검색어와 관련된 라이브러리 목록이 나타난다. 'TCA9548' 최신 버전을 선택하여 설치하도록 하자. 아래링크로 접속하면 해당 라이브러리에 대한 설명과 사용 방법을 확인할 수 있다.

     

    GitHub - RobTillaart/TCA9548: Arduino library for TCA9548 8 channel I2C multiplexer and compatibles.

    Arduino library for TCA9548 8 channel I2C multiplexer and compatibles. - RobTillaart/TCA9548

    github.com

     

    3. 예제

     

    3.1. 회로 구성

     

     

     

    3.2. 프로그램 작성

    #include <TCA9548.h>
    #include <AS5600.h>
    #include <Servo.h>
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>
    
    AS5600 TopSensor;      //  channel 2
    AS5600 BottomSensor;   //  channel 1
    uint32_t lastTime = 0;
    
    PCA9546 MP(0x70);
    
    Servo TopESC;
    Servo BottomESC;
    int potValue = 1023;
    int TopAngle;
    int BottomAngle;
    int PWM = 1300;
    
    RF24 radio(8, 9);  // CE, CSN
    const byte address[6] = "01203";
    
    struct motionData {
      int X;
      int Y;
      int Z;
      int YAW;
    };
    motionData input;
    
    void setup() {
      Serial.begin(115200);
    
      // Check multiplexer connection
      Wire.begin();
      Wire.setClock(400000);
      if (MP.begin() == false)
      {
        Serial.println("Multiplexer error");
      }
      MP.selectChannel(2);
      if (TopSensor.isConnected() == false)
      {
        Serial.println("TopSensor error");
      }
      MP.selectChannel(1);
      if (BottomSensor.isConnected() == false)
      {
        Serial.println("BottomSensor error");
      }
      TopSensor.begin(4);
      TopSensor.setDirection(AS5600_CLOCK_WISE);
      BottomSensor.begin(4);
      BottomSensor.setDirection(AS5600_CLOCK_WISE);
    
      TopESC.attach(5);
      BottomESC.attach(6);
    
      // Start RF communication
      radio.begin();
      radio.openReadingPipe(1, address);
      radio.setPALevel(RF24_PA_MIN);
      radio.startListening();
      
      // Calibrate BLDC motor
      Serial.println("Power the motor, and turn the knob to the minimum position when two bep alarms are on.");
      radio.startListening();
      while (PWM != 800) {
        if (radio.available()) {
          radio.read(&PWM, sizeof(PWM));
        }
        Serial.println(PWM);
        TopESC.writeMicroseconds(PWM);
        BottomESC.writeMicroseconds(PWM);
        delay(5);
      }
      radio.startListening();
      if (radio.available()) {
        radio.read(&PWM, sizeof(PWM));
      }
      TopESC.writeMicroseconds(PWM);
      BottomESC.writeMicroseconds(PWM);
      delay(5);
      Serial.println("********** Calibrated **********");
    
      input.Z = 800;
      radio.startListening();
    }
    
    void loop() {  
      if (radio.available()) {
        radio.read(&input, sizeof(input));
        delay(5);
      }
      Serial.println(input.Z);
      TopESC.writeMicroseconds(input.Z);
      BottomESC.writeMicroseconds(input.Z);
    
    
      /*
        MP.selectChannel(2);
        TopAngle = TopSensor.rawAngle();
        if (TopAngle >= 850 && TopAngle <= 1250) {
        TopESC.writeMicroseconds(2000);
        }
        else if (TopAngle >= 2850 && TopAngle <= 3250) {
        TopESC.writeMicroseconds(900);
        }
        MP.selectChannel(1);
        BottomAngle = BottomSensor.rawAngle();
        if (BottomAngle >= 950 && BottomAngle <= 1350) {
        BottomESC.writeMicroseconds(900);
        }
        else if (BottomAngle >= 3050 && BottomAngle <= 3150) {
        BottomESC.writeMicroseconds(2000);
        }
        delay(5);
      */
    }

     

     

     

    참고문헌

    - RobTillaart. (2021). TCA9548. GitHub. https://github.com/RobTillaart/TCA9548. 2024.11.27.

    반응형

    댓글

Designed by Tistory.