Monday, March 11, 2019

Motorcycle carburetor/throttle digital vacuum synchronizer using BME280 pressure sensors - #2


1편에 이어.
(https://leonardkims.blogspot.com/2019/02/motorcycle-carburetorthrottle-digital.html)

지난 번 구매한 BME280 센서 보드를 테스트 했다.
I2C 통신으로 아두이노와 연결하여 프로그램을 해서 살아있는지 살펴 보는 것이 우선이다.

센서보드에 전선과 커넥터 핀을 납땜한다.

센서보드에 SCL, SDA, GND, VIN 단자가 있다.
이것을 아두이노 보드의 해당 단자에 연결한다.


여기서 중요한 것은 센서보드의 전압이다. 나는 5V 전압 공급이 가능한 제품으로 구매했기때문에 5V 전압을 공급했다. 3.3V를 공급해야 하는 보드에는 3.3V를 공급해야한다.
5V 공급하는 즉시 고장난다.

아두이노 보드를 컴퓨터와 연결한다.

아두이노 소스는 Lady Ada가 작성하여 배포한 BME280 용 라이브러리 및 예제 프로그램을 이용하기로 한다.
인터넷에서 라이브러리를 찾아서 폴더 째로 "C:\Program Files (x86)\Arduino\libraries" 폴더 밑에 복사한다.

두개가 필요하다. BME280 용 및 Ada fruit sensor master  라이브러리.

Adafruit_BME280_Library-master 폴더 밑에 보면 examples\bme280test 폴더 밑에 bme280test.ino 파일을 아두이노 IDE를 이용해서 연다.

컴파일 & 전송 버튼을 누른다.

안된다...
아두이노의 통신창을 열어보면 인식이 안된다는 에러 메세지만 뜬다.

뭐가 문제일까 생각해본다.

이 보드는 Adafruit에서 구매한 것이 아니다.
BME280 센서는 I2C에서 동작할 때 두가지 주소를 가질 수 있다.
0x76과 0x77.

Adafruit 제품은 0x77로 기본 셋팅되어 있다고 사이트에 설명이 있었다.
혹시 주소가 틀려서 그런가하고 여기 저기 찾아보니까 아까 라이브러리 폴더에 복사해 놓은 Adafruit_BME280.h 안에 BME280 센서의 주소가 정의되어 있었다.

0x77로 되어 있었다.
0x76으로 바꿔 주었다.

다시 컴파일 하고 업로딩.
아두이노 보드 상에 반가운 Rx LED가 주기적으로 반짝이는 것이 보인다.
보드에 데이터가 들어오고 있다는 의미이다.

아두이노 IDE에서 통신창을 열어본다.
오호!
현재의 기압과 온도 습도값이 1초마다 수신이 되고 있다!

신난다 ^^
Thank you Lady Ada ^^

오늘은 여기까지.

다음 작업은 I2C 멀티플렉서에 연결해서 아두이노와 연결할 것이다.


********************

오늘은 I2C 멀티플렉서를 연결할 것이다.
마이크로 컨트롤러의 I2C 통신 포트에는 여러 개의 I2C 센서들을 풀업 저항을 사용해서 병렬 연결하여 사용할 수 있다.
다만, 모든 센서 들은 고유의 주소를 가지고 있어야 한다.
이번에 사용해야하는 BME280은 셋팅에 의해서 두개의 주소를 가질 수 있다.
0x76, 0x77

나는 4기통 캬브레터 동조기를 만들어야 하므로 4개가 필요하다.
멀티플렉서는 이럴 때 사용한다.

우선 마이크로 컨트롤러의 I2C 포트(SDA, SDL)를 멀티플렉서로 연결한다.
멀티플렉서에는 여러 개의 I2C 포트가 있고 멀티플렉서를 제어 해서 해당 포트에 있는 각각의 센서 값을 읽어 올 수 있다. 센서는 동일한 주소여도 관계없다.

이번에 사용하는 멀티플렉서는 TCA9548A 이다.
I2C 센서를 8개를 연결할 수 있다.
이 TCA9548A 자체는 또한 8개의 주소를 가질 수 있기때문에 하나의 마이크로 컨트롤러에 8개의 TCA9548A를 연결할 수 있다.
따라서 TCA9548A 8개를 이용하여 동일한 주소를 가지는 센서 64개를 하나의 마이크로 컨트롤러에 연결하여 값을 받아 볼 수 있다.

이번에는 BME280 4개가 필요하므로 TCA9548A는 한 개만 필요하다.

우선 배선을 하자.
TCA9548A 보드를 준비하여 마이크로컨트롤러에서 출력되는 5V를 VIN에, GND를 GND에 연결한다.
그 다음 마이크로 컨트롤러의 SDA를 TCA9548A의 SDA에, 마이크로 컨트롤러의 SCL을 TCA9548A의 SCL에 연결한다.

그 다음, TCA9548의 첫번째 I2C 포트인 SD0에 첫번 째 BME280의 SDA를 연결하고, SC0에 SCL을 연결한다.
BME280 보드의 VIN과 GND는 TCA9548A의 VIN과 GND에서 전선을 브릿지해서 가져오면 된다.

컴퓨터와 마이크로 컨트롤러를 연결한다.

TCA9548A의 주소 비트 설정을 하지 않으면 기본 주소는 0x70이다.
이 주소를 사용하여 TCA9548A를 인식하고 이 밑에 8개 포트 중에 어디에 센서가 연결되어 있는지 체크하는 프로그램을 역시 Lady Ada가 배포했다.
해당 프로그램을 실행한다.

컴파일 & 업로딩.

자, 통신 창을 열어보자.

오, 예~
이것은 마이크로컨트롤러가 TCA9548A와 통신하는데 성공했고, TCA9548A의 0번 포트에서 0x76 주소를 가지는 I2C 센서를 의미한다.

여기까지 오면 절반은 한 것이다.
센서 프로그램 작업은 원래 처음 통신 연결하는데까지가 까다롭고 힘들다.
Lady Ada 덕분에 시간을 많이 줄일 수 있었다.
고마운 분이다.

자, 이제 이 두 개를 합하면 된다.
즉, TCA9548A를 통해서 TCA9548A의 0번 포트에 연결되어 있는 BME280 센서의 값을 받아오면 된다.

우선 Adafruit_BME280.h 에 BME280의 주소 값이 0x76으로 수정되어 있는지 확인하고, 프로그램을 수정해서 TCA9548A에 연결된 각 BME280 센서의 주소를 고유하게 지정해주도록 한다.

컴파일 & 업로딩.

마이크로 컨트롤러에서 반가운 Rx 램프가 깜박인다.
통신에 성공했다는 의미이다.

아두이노 IDE의 통신창을 열어본다.

TCA9548A의 포트 0번에서 BME280 센서를 발견해서 1초마다 온도, 기압, 습도 값을 가져오고 있다.

이제 이 값을 받아서 그래프로 출력해주는 프로그램을 하면 된다.

오늘은 여기까지.



- Leonard


No comments:

Post a Comment

CBR650F 스티어링 댐퍼 장착 시 주의할 점, 장착 후 시험 주행 200km. 여주, 괴산

 CBR650F에 장착할 스티어링 댐퍼를 구매해 놨고, 드디어 장착이다. 공교롭게도 최근에 주변 지인이 핸들 털림으로 사고를 당한 터라, 이게 없이 운행하기가 부담스러웠다. 드디어 주말이 되어서 스티어링 댐퍼를 설치했다. 기본 설치는 유튜브 이곳에 잘...