티스토리 뷰

해당 포스팅은 2016.08.16에 작성되었습니다.





제품명 : ACCENT RaspberryPi & BananaPi Shield Series

------------------------------------------
판매처
Accent_GitHub

위 링크에 제품에 대한 소개가 잘 나와있습니다.
첫 번째, 판매처에서 Spec과 Block Diagram, 초기설정 내용을 보실 수 있습니다.
두 번째, GitHub에 스크립트 파일 및 소스 등이 업로드되어 있습니다.
------------------------------------------

테스트환경 : Windows7 64bit, Raspbian Jessie(OS), RaspberryPi 2 B or RaspberryPi 3 B






Ambient_Light_Sensor_Shield



공식 홈페이지에서 제공하는 내용은 활용하지 않았습니다.

https://projects.drogon.net/raspberry-pi/wiringpi/i2c-library/

먼저 위의 링크에 가시면, wiringPi 라이브러리, 특히 i2c에 관한 함수들이 나와있고, 그에 대한 설명이 나와있습니다. 저는 여길 참조해서 wiringPi를 활용한 소스를 작성하였습니다.







실행방법



먼저, 자신이 코드를 작성할 곳으로 이동합니다.
전.. 그냥 초기 폴더에서 바로 만들겠습니다


1
$ sudo nano test_als.c
cs


이렇게 하면 생성과 동시에 편집을 할 수 있겠죠. 저는 nano가 간편해서 nano를 사용합니다만..

어떤 에디터든 상관없습니다.


소스는 다음 절에 그대로 올려두었으니 참조하시길 바랍니다.
소스에서 I2C 장치의 주소를 필요로 합니다. 그 주소를 확인해야합니다.

장치의 주소는 데이터시트를 보면 바로 알 수 있습니다. 1000100   즉 hex값으로 0x44 가 되겠습니다.
ISL29023 DATASHEET


라즈베리에서도 확인할 수 있는데요. i2cdetect 명령어를 사용해주면 됩니다.
이걸 하기 위해서는 해당 모듈을 다운받아야합니다. 아래 명령어를 통해 설치를 하겠습니다.


1
$ sudo apt-get install i2c-tools 
cs


그리고 아래 명령으로 I2C로 연결된 디바이스를 검색합니다.

1
$ sudo i2cdetect -y 1  
cs


위와 같이 진행을 하면 아래와 같은 화면을 보실 수 있으십니다.



여기서 44 라고 되어 있는 것이 현재 I2C1에 연결이 되어있는 장치 중 하나가 되겠습니다.

우리가 현재 연결하고 있는 장치는 하나밖에 없으므로 조도센서의 주소가 이것이 되겠지요.

저 같은 경우는 이미 i2c-tools 가 설치되어 있기때문에, 아래처럼 이미 최신버전이라는 메시만 출력된 것이고, 처음 설치하시는 분들은 간단한 설치과정을 거치게 됩니다.


소스가 작성이 되었다면 (다음 절을 참조하세요),

gcc를 사용하여 오브젝트 파일을 만들어줍니다.


1
2
3
$ gcc test_als.c -o test_als -l wiringPi              
// -o 는 알파벳입니다. 뒤에 따라오는것이 오브젝트 파일명입니다. 
// 그리고 -l 은 옵션인데, wiringPi 라이브러리를 지정해주는 것입니다
cs


GCC에서 자주사용하는 옵션에 대해서는 위의 주석내용을 참조하시면 도움이 되실것 같습니다.

자세한건 또다른 검색을 통해서 ! :)


이렇게 하고 나면, 현재 디렉토리에 test_als 라는 오브젝트 파일이 하나 생깁니다.

확인은 ls 로 해주시면 되겠죠!


그럼 해당 오브젝트 파일을 실행해 줍니다.


1
$ sudo ./test_als
cs


네, 실행이 되시는 것을 확인하실 수가 있습니다.

실제 출력 내용은 아래 그림과 동영상을 참조하시면 되겠습니다.














Source


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>
#include <wiringPiI2C.h>
 
void I2C_init(int ret);
unsigned int I2C_read(int ret);
 
int main() {
     int sensorAddr = 0x44;   //여기에 센서 주소, 곧 DeviceID인 디바이스주소를 입력해 주시면 됩니다.
     unsigned int lux_value;
 int ret;
 
     if((ret=wiringPiI2CSetup(sensorAddr))==-1)    //wiringPiI2CSetup은 에러 발생시 -1을 리턴합니다.
 {
  printf("Device Error");
  return 1;      // 에러가 발생했으니 메인함수를 종료합니다.
 }else{
  printf("Device Connection Success!\r\n");
 };
 
    I2C_init(ret) ;
 
     while(1) {
         lux_value = (I2C_read(ret) * 64000/ 65535 ;
         printf ("Value : %5d lux\n", lux_value) ;
         delay(1000) ;
     }
    
     return 0 ;
}
 
 
void I2C_init(int ret) {          // 이부분은 데이터시트를 참조하면 알 수 있습니다.
     wiringPiI2CWriteReg8(ret, 0x000x00) ;      // 레지스터 0x00를 0으로 초기화
     wiringPiI2CWriteReg8(ret, 0x000xA0) ;      // 레지스터 0x00에 A0 셋 - ALS 사용 : 높은 분해능 사용하기 위해서
     wiringPiI2CWriteReg8(ret, 0x010x03) ;      // 4번째 분해능(Range4)을 사용합니다. 64000
}
 
unsigned int I2C_read(int ret) {
     unsigned int tmp_lux ;
      // 4번째 분해능을 사용하여 16비트 ADC이므로, 각각의 8비트 레지스터로부터 값을 가져와 저장
     tmp_lux =  (wiringPiI2CReadReg8(ret, 0x03<< 8| wiringPiI2CReadReg8(ret, 0x02) ;
     return tmp_lux ;
}
cs


소스에 대한 간략한 설명은 소스 내 주석을 확인하시길 바랍니다.




댓글
댓글쓰기 폼