반응형

https://youtube.com/live/P91c5jJ_aU4

[아두이노#577] TCA9548A I2C 8채널 멀티플렉서(multiplexer)로 주소가 같은 I2C모듈을 Arduino에서 활용해보기!(녹칸다의 아두이노)

녹칸다의 아두이노 시리즈이다!

이번편에서는 TCA9548을 아두이노에 연결해서 활용하는 방법을 알아보도록 하자!
I2C통신은 I2C BUS에 모듈을 연결하면 1:N으로 통신이 가능한 방식이다.
이때 아두이노가 마스터를 담당하고 나머지 센서나 모듈이 슬레이브가 된다.

여러개의 슬레이브를 구분하기 위해서 1byte의 주소를 사용하게 되는데 상황에 따라 이 부분이 문제가 되기도 한다.

공장에서 아두이노용 센서나 모듈을 생산할때 프로그래머블하게 주소를 수정할 수 없다.
대신 PCB기판에 주소를 바꿀 수 있는 점퍼를 제공하는데 4가지 정도의 주소를 부여할 수 있다.

녹칸다가 생각하는 문제는 아래 2가지 정도이다.
1.생산할때부터 주소를 변경할 수 없도록 만들어진 모듈
2.주소를 바꿔도 다른 모듈과 사용하려면 충돌이 나는 경우

동일한 주소를 가지면 구분을 할 수 없기 때문에 사용이 어렵게된다.
이부분을 해결하기 위해서 TCA9548A란 모듈을 사용하게 되면 8채널까지는 주소가 동일하다라도 활용할 수 있다.
(스위칭 허브라고 생각하면된다)

기본 작동원리는 TCP9548A와 아두이노(arduino)를 I2C통신으로 연결하고 경로를 스위칭 하는 것이다.

아두이노에서 지금 I2C통신으로 보내는 메시지는 8채널중 몇번 채널인지를 선택하는 것이다.

선택을 하기 위해서 아래 함수가 필요하다.
void TCA9548A(uint8_t bus){
  Wire.beginTransmission(0x70);
  Wire.write(1 <<bus);
  Wire.endTransmission();
  Serial.print(bus);
}

TCA9548A도 I2C통신을 하기 때문에 주소가 있다.(0x70이다)
몇번 채널로 데이터를 전송할지 위 함수를 이용해서 결정할 수 있다.
(채널 번호는 0~7까지 있음)

예를들어 TCA9548A(0); 이라고 하면 채널0와 I2C통신을 하겠다는 의미이다.
TCA9548A(4); 라고 하면 채널4와 통신을 하겠다는 의미이다.

한개의 길로가던 기차를 8개의 길중 한곳으로 경로를 바꿔주는 장치가 바로 I2C 멀티플렉서가 되는 것이다.

문제는 녹칸다가 보유한 모듈이 그다지 I2C주소가 충돌날만한게 없다는 것이다.

시연을 위해서 I2C통신으로 제어하는 1602LCD모듈과 OLED모듈인 SSD1306을 활용하도록 한다.
(1602LCD는 점퍼를 이용해서 주소를 바꿀 수 있긴하지만 안된다고 가정해보자)

아래 순서로 접근해보도록 하자.
1.연결하는 방법 알아보기!
2.LCD 1개를 작동시키고 2개로 늘려서 개별적으로 작동시켜보기!
3.LCD 4개를 동시에 작동시켜보기!
4.OLED 1개를 작동시키고 2개로 늘려서 작동시켜보기!
5.OLED 4개를 동시에 작동시켜보기!

 

(주의사항)
setup에 Wire.begin(); 추가해야함

(필요한 함수)
void TCA9548A(uint8_t bus){
  Wire.beginTransmission(0x70);  // TCA9548A address
  Wire.write(1 << bus);          // send byte to select bus
  Wire.endTransmission();
}

(깨알지식)
1.아두이노에 1602LCD(i2c버전)를 사용하기 위해서는 liquidcrystal i2c라이브러리가 필요하다!(설치해야함)
2.SSD1306을 사용하려면 adafruit ssd1306라이브러리를 설치해야한다!

(예제번호)
1.아두이노 우노가 i2c통신으로 제어되는 1602LCD 1개를 컨트롤 하는 예시

577-1(1602LCD기본작동).txt
0.00MB

 

2.TCA9548A를 이용해서 1개의 1602LCD를 동시에 제어하는 예시를 보이시오!

577-2(TCA9548A로1602LCD제어).txt
0.00MB

 

3.(2)예제에서 1602LCD의 갯수를 2개로 늘려서 해보시오!

577-3(멀티플렉서로1602LCD2개제어하기).txt
0.00MB

 

4.(3)예제에서 2004LCD가 채널2에 새롭게 연결되었을때 어떻게 제어할지 고민해보시오!

577-4(서로다른LCD를제어해보기).txt
0.00MB

 

5.채널0,채널1,채널2에 연결된 모든 LCD에 서로 다른 센서값(랜덤값)이 출력되도록 해보시오!

577-5(3개의LCD에센서값출력하기).txt
0.00MB

 

6.아두이노가 시리얼입력을 받아서 3개의 채널에 있는 LCD를 개별제어하도록 해보시오!
(데이터 입력의 예시/시리얼모니터에서 입력)
0 1234  : 채널0의 1602LCD의 첫번째줄에 1234를 출력해라!
1 5678  : 채널0의 1602LCD의 두번째줄에 5678을 출력해라!
2 1010 : 채널1의 LCD의 첫번째줄에 1010출력!
3 1111 : 채널1의 LCD의 두번쨰줄에 1111출력!

577-6(시리얼입력으로개별제어하기).txt
0.00MB

 

7.아두이노에 SSD1306(OLED)를 1개 작동시키는 기본예시를 준비하시오!

577-7(OLED1개제어하기).txt
0.00MB

 

8.멀티플렉서를 사용해서 SSD1306화면에 text를 출력하시오!

577-8(멀티플렉서로OLED제어하기).txt
0.00MB

 

9.멀티플렉서를 이용해서 OLED 2개에 개별적인 TEXT를 출력하시오!

577-9(OLED2개를멀티플렉서로제어하기).txt
0.00MB

 

10.아두이노에 loop에서 OLED에 서로다른 카운터값이 출력되도록하시오!

577-10(서로다른값OLED에출력하기).txt
0.00MB

 

11.녹칸다가 준비한 OLED 4개를 4개의 채널에 연결해서 개별적으로 제어되도록 하시오!(라이브방송에서는 OLED의 사이즈가 동일하지 않았지만 동일한 사이즈의 OLED 4개를 활용한다고 가정한다)

577-11(OLED4개에카운터값출력하기).txt
0.00MB

 

12.가상의센서값이 4개 있고 이값을 OLED 4개에 나눠서 출력하시오!

577-12(랜덤한값4개를각각OLED에출력하기).txt
0.00MB

반응형
Posted by 덕력킹
,