-
아두이노 라이브러리 | I2C 멀티플렉서 TCA9548A 모듈Technology/Arduino 2024. 11. 27. 22:10
1. I2C 멀티플렉서 TCA9548A 모듈
I2C 통신을 지원하는 센서 모듈은 고유 주소를 가지고 있으며, 일부 모듈은 하드웨어를 수정하거나 소프트웨어로 레지스트리를 변경하여 본인의 주소를 변경할 수 있다. 하지만 앞서 다룬 AS5600 모듈과 같이 I2C 주소를 변경하는 기능을 지원하지 않는 센서를 여러 개 사용한다면 I2C 주소가 충돌하므로 문제가 발생한다. 이때 I2C 멀티플렉서 TCA9548A 모듈을 사용한다면 I2C 주소가 동일한 센서를 동시에 사용할 수 있다. TCA9548A 모듈은 총 여덟 개의 I2C 채널(SD0~SD7, SC0~SC7)을 지원하며, I2C 통신(SDA, SCK)을 매개로 마이크로프로세서와 다른 센서들을 연결한다. 아래 링크로 접속하면 해당 모듈을 구매할 수 있다.
2. 아두이노 라이브러리 추가
아두이노 플랫폼에는 TCA9548A 모듈과 I2C 통신을 하기 위한 알고리즘이 라이브러리로 구현되어 있다. 그러나 기본적으로 제공되는 라이브러리는 아니기 때문에 라이브러리를 IDE에 추가하는 과정이 필요하다. 아두이노 IDE 상단 툴바에서 '툴'을 선택한 뒤 '라이브러리 관리' 항목을 선택하자. 그러면 곧이어 '라이브러리 매니저' 창이 나타나는데, 해당 창 오른쪽 상단에 라이브러리 이름을 입력하면 아두이노 플랫폼에서 지원하는 라이브러리를 검색할 수 있다. 해당 칸에 'TCA9548'을 입력하자. 라이브러리를 검색하면 입력한 검색어와 관련된 라이브러리 목록이 나타난다. 'TCA9548' 최신 버전을 선택하여 설치하도록 하자. 아래 링크로 접속하면 해당 라이브러리에 대한 설명과 사용방법을 확인할 수 있다.
3. I2C 주소 확인
아두이노 하드웨어로 TCA9548 모듈과 I2C 통신을 하기에 앞서, 해당 모듈의 주소를 알아내야 한다. 아두이노 플랫폼에서는 I2C 통신을 위한 라이브러리를 기본적으로 제공하고 있으며, I2C 주소를 확인하기 위한 예제도 제공하고 있다. 모듈의 I2C 주소를 확인하는 예제는 아래에 첨부해놓았으니, 해당 프로그램을 실행시켜 시리얼 모니터에서 모듈의 I2C 주소를 확인하면 된다.
4. 예제
4.1. 회로 구성
4.2. 프로그램 작성 - I2C 주소 확인
#include <Wire.h> // I2C 통신 라이브러리 추가 void setup() { Wire.begin(); // I2C 통신 시작 Serial.begin(9600); // 시리얼 통신 시작 (통신 속도: 9600 bps) while (!Serial); // Leonardo: wait for serial monitor Serial.println("\nI2C Scanner"); // 시리얼 모니터에 문자열 출력 후 줄 바꿈 } void loop() { int nDevices = 0; // 정수형 변수 선언 후 0으로 초기화 Serial.println("Scanning..."); // I2C 주소 탐색 for (byte address = 1; address < 127; ++address) { Wire.beginTransmission(address); // 주소 address를 가진 장치에 전송 시작 byte error = Wire.endTransmission(); // 전송 종료 후 통신 결과를 바이트 변수에 저장 // 주변 장치를 찾아 I2C 통신에 성공했을 경우 if (error == 0) { Serial.print("I2C device found at address 0x"); if (address < 16) { Serial.print("0"); } Serial.print(address, HEX); Serial.println(" !"); ++nDevices; } // 주변 장치와의 I2C 통신에 오류가 있을 경우 else if (error == 4) { Serial.print("Unknown error at address 0x"); if (address < 16) { Serial.print("0"); } Serial.println(address, HEX); } } // I2C 통신에 성공한 주변 장치가 없을 경우 if (nDevices == 0) { Serial.println("No I2C devices found\n"); } else { Serial.println("done\n"); } delay(5000); // Wait 5 seconds for next scan }
3.3. 프로그램 작성 - I2C 멀티플렉서 TCA9548A
#include <AS5600.h> // AS5600 라이브러리 추가 #include <TCA9548.h> // TCA9548 라이브러리 추가 AS5600 Encoder1; // Encoder1이라는 이름의 AS5600 객체 생성 AS5600 Encoder2; // TCA9548 MP(0x70); // MP라는 이름의 TCA9548 객채 생성 (I2C 주소: 0x70) void setup() { Serial.begin(115200); // 시리얼 통신 시작 (통신 속도: 115200 bps) Wire.begin(); // I2C 통신 시작 // TCA9548 통신 상태 확인 if (MP.begin() == false) { Serial.println("Multiplexer error"); } MP.selectChannel(0); if (TopSensor.isConnected() == false) { Serial.println("Channel 0 error"); } MP.selectChannel(1); if (BottomSensor.isConnected() == false) { Serial.println("Channel 1 error"); } Encoder1.begin(4); // 회전방향 단자 정의, GND와 연결한 경우 번호 무관 // 양의 회전방향 정의, 회전방향 단자를 GND와 연결한 경우 시계 방향이 양의 방향 Encoder1.setDirection(AS5600_CLOCK_WISE); Encoder2.begin(4); Encoder2.setDirection(AS5600_CLOCK_WISE); } void loop() { // 채널0 선택 MP.selectChannel(0); // 엔코더 값을 비트 단위(0~4095)로 읽은 후 시리얼 모니터에 출력 Serial.print(Encoder1.rawAngle()); Serial.print("\t"); // 채널1 선택 MP.selectChannel(1); Serial.print(Encoder2.rawAngle()); Serial.println("\t"); delay(500); // 500 ms 대기 }
[함께 읽으면 좋은 페이지]
참고문헌
- RobTillaart. (2021). TCA9548. GitHub. https://github.com/RobTillaart/TCA9548. 2024.11.27.
반응형'Technology > Arduino' 카테고리의 다른 글
아두이노 라이브러리 | 자기 엔코더 센서 AS5600 모듈 (2) 2024.11.26 아두이노 | BLDC모터 (0) 2024.11.25 아두이노 라이브러리 | 서보모터 정밀 제어 (0) 2024.11.24 아두이노 프로젝트 | 휴대용 냉각기 (0) 2024.11.23 아두이노 | 펠티어 열전소자 (0) 2024.11.22