[아두이노] [강좌] 34. SPI 통신 (3) - 기압 센서(MPL115A1) 실습하기

오늘 실습에 사용할 기압 센서는바로바로




 



스파크펀 사의 “MPL115A1” 센서이다.



SPI 통신을 사용하는 센서이고다른 기압 센서들은 어떤지 모르겠지만 얘는 계산 식이 엄청 복잡하다데이터 시트를 봐도 무슨 말인지 모르겠어;;;

 

그럼에도 불구하고 이 아이를 선택한 이유는예제 소스가 제공되기 때무느흐흐흐흐.

 

 

아두이노에 사용되는 센서들의 대부분은 자신들의 라이브러리를 제공하는 경우가 많기 때문에 구매 사이트의 정보 페이지를 잘 살펴보면 유용한 정보를 얻을 수 있는 경우가 많다데이터 시트 등도 마찬가지고회로도랑 PCB 레이아웃 파일까지 있음.

 

 

일단 연결부터. SPI 통신을 사용하니까 50~53번 핀을 사용하는 데우노(Uno) 보드를 사용하는 사람도 있을 테니 ICSP 포트를 이용해서 연결해보도록 하자.


3acf89919a770b71294d366fb14d4b4d.png


선이 많네..

 

 

‘CSN’이라고 표시된 핀이 SS , ‘SDO’는 ‘MISO’, ‘SDI’는 ‘MOSI’, ‘SCK’는 ‘SCK’에 연결하면 되고, VCC GDN도 각각 연결한다. ‘SDN’ 핀은 ‘Shut Down’ 기능의 핀으로 GND에 연결하면 칩을 Sleep 모드로 전환하여 동작하지 않도록 하는 기능을 가지는데사용하지 않으므로 연결하지 않아도 좋다만일 사용한다면 3.3V의 전압이 나오는 핀에 연결해야 하므로 유의.


혹시 VCC 핀을 보드의 POWER 부분에 직접 연결하는 사람은 5V가 아니라 3.3V에 연결해야 한다.


 

SS 핀은 일부러 다른 핀에 연결했다. 53번이나 10번에 연결해도 좋고원하는 핀 어디에 연결해도 좋다난 일단 가까운 7번에 연결함.

 

 

ICSP 포트의 핀 기능은 이전 강좌에 상세히 표시해 뒀으므로 참고.

 


 

그리고 소스를 짜면 되는데데이터 시트를 보니 계산 식과 이걸 구하려면 몇 번째 비트를 써야 되고뭐 이런 내용들이 있다.

 

426a78cd9356c9c6aba1b12b16ab237e.png

 

d3d6dcde92912f45396fd625f24f17a6.png 



내가 영어 울렁증이 있어서인지설명이 어려워서인지 잘 모르겠지만난 이거 봐도 뭔 말인지 잘 모르겠음

 

 

 

 

그래숴우린 제조사에서 제공하는 예제 소스를 활용할 예정이다구매 사이트의 링크를 이용해서 “Example Code”를 다운로드 한다그리고 열어보자.

79afcbeb4f404efae619087bbc11eb47.png



아두이노 소스가 아닌 건 쪼금 서운.. 하지만 참고하기에 충분한 소스이다.

 

 

“main.c” 파일을 열어보면 뭔가 많이 있지만우리가 참고할 내용은 calculatePressure() 함수 하나 뿐다음은 main.c 파일의 내용을 아두이노 소스로 변경한 것이다.

 

 

변환 식 계산 덕분에 조금 긴 소스가 됐..



너무 길어서 일단 접어두기.



훠우엄청 기네추가로 고도 구하는 공식도 넣었엉(칭찬해줘)

  

 

일단 업로드 한 후 시리얼 모니터를 실행해보면현재 위치의 기압과 고도 값이 나오는 것을 알 수 있다.


3e91792d1f757b5dbc0d2c43aa783150.png
 


아쉬운 점은 아두이노 보드를 들고 높은 곳으로 가본 적이 없어 차이를 느낄 수가 없다는..

brown_and_cony-79 


 

소스는 엄청 길지만 유의해서 봐야할 부분은 writeData() 함수와 readData() 함수.

 

MPL115A1 칩은 SPI 통신을 사용하지만읽기와 쓰기의 동작 구분을 I2C 통신과 비슷하게 최상위 비트 하나로 하고 있다, I2C 통신은 최하위 비트였구만아무튼 최상위 비트가 1이냐, 0이냐에 따라 해당 레지스터(저장 주소)에 쓸 것이냐읽어 올 것이냐를 구분한다.

 

writeData() 함수 먼저 보자.



 void writeData(byte addr, char data) {

   addr &= 0x7F;

 

   digitalWrite(PRESS_SS, LOW);

   delay(1);

   SPI.transfer(addr);

   SPI.transfer(data);

   delay(1);

   digitalWrite(PRESS_SS, HIGH);

 }

 


레지스터 주소와 쓸 데이터를 매개 변수로 받고 있으며, addr 값에 0x7F 값을 &(AND) 연산하여 최상위 비트를 0으로 만든다.. & 연산이 처음 나왔지만 소스 때문에 길이가 너무 길어져서 “*참고로 넣을까 말까 고민 중.

 

그리고는 PRESS_SS 키워드로 지정한 SS 핀을 LOW로 변경하여 PRESS_SS 핀에 연결된 슬레이브를 선택한다약간의 딜레이를 주고SPI.transfer() 함수를 이용하여 주소를 먼저 전송쓰기 모드이므로 다시 데이터를 전송한다또 약간의 딜레이를 준 후 SS 신호를 HIGH로 변경하면 쓰기 끝.

 

 

이번엔 readData() 함수.



 char readData(byte addr) {

   char data;

   addr |= 0x80;

 

   digitalWrite(PRESS_SS, LOW);

   delay(1);

   SPI.transfer(addr);

   data = SPI.transfer((byte)0);

   delay(1);

   digitalWrite(PRESS_SS, HIGH);

 

   return data;

 } 

 



레지스터 주소 값을 매개 변수로 받아서 최상위 비트를 1로 만든다. |(OR) 연산을 이용해서.

 

그리고는 역시 SS 핀을 LOW 신호로 만든 후 레지스터 값(+읽기 비트)을 전송데이터를 읽기 위해 다시 한 번 0(사실 무슨 값을 쓰든 상관 없다)을 전송하여 반환되는 값을 data 변수에 저장한다. SPI 통신은 읽기와 쓰기가 동시에 이뤄지기 때문에 데이터를 읽기 위해서는 데이터를 써야 한다는 점 꼭 명심.

 

그리고 SS 핀을 다시 HIGH로 만든 후 data 값을 반환한다.

 

 

brown_and_cony-16 



어렵지 않다유의해야 할 점은 통신 할 때 SS 신호가 LOW여야 한다는 점.

 

 

 

그럼 기압 센서의 기압 값 변환 소스 설명은 나도 잘 모르니까 넘어가면서(읭?) 오늘 강좌는 여기서 끝다음 강좌부터는 모터 다루기 실습을 진행할 예정이니까 관심 있으신 분들은 또 들러주세용~

 

안녕.



brown_and_cony-44

 

0
0
이 글을 페이스북으로 퍼가기 이 글을 트위터로 퍼가기 이 글을 카카오스토리로 퍼가기 이 글을 밴드로 퍼가기

임베디드 보드

번호 제목 글쓴이 날짜 조회수
78 마이크로비트 아날로그 홀 센서 활용 (아두이노 센서 활용) icon HellMaker 08-08 19,552
77 마이크로비트 마이크로비트로 가위바위보 게임 일산메이커 08-01 18,838
76 마이크로비트 마이크로 비트로 led 문자 출력하기 2 #microbit #마이크로비트 #led Wavy 07-31 18,456
75 마이크로비트 마이크로비트 - led로 문자출력하기 #마이크로비트 #led #문자 #microbit +1 Wavy 07-30 18,105
74 마이크로비트 마이크로 비트로 간단하게 led켜기 (microbit easy led) #microbit #LED #led Wavy 07-24 18,646
73 마이크로비트 마이크로비트 교육자료 - 반응속도 게임 +1 일산메이커 07-19 20,312
72 아두이노 C 언어 비교문에서 == 사용 방법 icon 양재동메이커 04-12 20,996
71 아두이노 [아두이노 실습] 푸쉬버튼 long press, short press 판단하기 icon 양재동메이커 03-27 21,397
70 아두이노 [아두이노 실습] Push button 스위치로 FND 카운트 증가/감소 icon 양재동메이커 03-27 25,953
69 아두이노 Blynk를 사용해 아두이노에서 IoT 맛보기 icon 양재동메이커 03-27 22,681
68 아두이노 아두이노에서 u8glib로 0.96" OLED 사용하기 icon 양재동메이커 03-27 22,409
67 아두이노 아두이노에서 여러개의 스위치를 1개의 analog input핀으로 검사하기 icon 양재동메이커 03-27 21,080
66 아두이노 아두이노에서 RTOS 사용하기 (FreeRTOS in Arduino) icon 양재동메이커 03-27 25,271
65 아두이노 아두이노에서의 delay() 함수 icon 양재동메이커 03-27 19,740
64 아두이노 아두이노의 pinMode()에서 INPUT과 INPUT_PULLUP의 차이 icon 양재동메이커 03-27 22,070
63 아두이노 아두이노등의 임베디드 시스템의 변수 값 오버플로우 문제 icon 양재동메이커 03-27 19,670
62 아두이노 아두이노에서 외부 라이브러리 설치하기 (Install library in arduino) icon 양재동메이커 03-27 21,569
61 아두이노 WS2812 color LED 사용하기 icon 양재동메이커 03-27 20,053
60 아두이노 WS2812와 APA102의 차이 비교 (Comparison between WS2812 and APA102) icon 양재동메이커 03-27 23,188
59 아두이노 [강좌] 51. 와이파이 통신 (5) - WebServer 예제 (2) icon 양재동메이커 03-21 19,591