블랙이랑 한 번 붙어볼텨? 비글본그린이 나타났다! (BeagleBone Green)

안녕하세요, 아이씨뱅큐 마케팅 담당자 Alicia 입니다 J

 

뭔가 많은 메이커 분들의 이목을 집중시킬 만한 포스팅 재료가 없을까 곰곰이 생각하다가 신제품 출시 때에도 쓰지 못했던 비글본 그린 (Beaglebone Grea) 에 대해 몇 자 적어볼까 하여 컴퓨터 앞에 앉았습니다 (은유적인 표현입니다. 저는 오늘 하루 종일 컴퓨터 앞에 앉아 있었습니다!!).

비글본 그린은 한때 제 2의 라즈베리파이로 불려졌던 비글본 블랙의 설계를 본뜬 기판으로 최초는 아니지만 그 구조가 크게 바뀐 파생 기판이라 볼 수 있습니다. 중국 오픈소스 하드웨어 필드에서 유명한 Seeedstudio 에서 개발한 상품으로 두 개의 그로브 시스템 (Grove System) 커넥터, 마이크로 USB 를 장착하였으며 배터리 기반의 실시간 시계 (RTC)도 추가된 제품이라고 합니다. (그에 반해 사용량이 적은 HDML 커넥터는 제거!)

그로브 시스템 커넥터가 장착 됨으로써 기타 케이프 없이도 Seeedstudio에서 생산/판매 중인 다양한 종류의 센서기판과 바로 연결이 가능하게 되었습니다. 새로운 센서기판들과의 연결뿐만 아니라 기존의 비글본 블랙 (Beaglebone Black)과도 100% 호환된다고 하니 가히 BBB의 제대로 된 업그레이드 버전이라 칭할 만 하지 않나요?

 

 

 

<비글본 블랙과 비글본 그린 SPEC 비교>

 

 

 

 

그렇다면

 

비글본 그린이 출시되었던 6월에도 쓰지 않았던 포스팅을 제가 쓰는 이유는 무엇일까요아 아이씨뱅큐에서 또 뭔가를 하나보다라고 생각하시면 될 것 같습니다 ㅎㅎㅎㅎ

 

바로 Thing+와 비글본 그린의 만남! 이라고나 할까요…………. (너무 억지스럽다면 ()지성…)

Thing+ (한글로 씽플러스라고 네이버에 등록되어 있던데 이게 더 억지스러운거 아닌가…………)는 사물인터넷 (IoT) 응용서비스를 위한 서비스형 소프트웨어 (SaaS) 입니다. 사용자에게 IoT 경험을 제공하려는 서비스 파트너에게 클라우드 인프라에서 수행되는 애플리케이션뿐 아니라 임베디드 미들웨어와 클라이언트 애플리케이션까지 모두 제공해 쉽고 빠르게 서비스를 시작할 수 있도록 도와줍니다. 쉬운 말로누구나 쉽게 IoT 플랫폼을 개발/이용/관리 할 수 있단 말입니다. 기술적인 내용은 저도 잘 모르니 아래 참조…………….. ^^

https://www.imaso.co.kr/news/article_view.php?article_idx=20150520201143

 

하지만 아무리 쉽다고 해도 쉬운 것이 아니라는 거! 아이씨뱅큐도, Thing+를 운용하는 달릭웍스도 잘 알기에 준비한 나만의 IoT 서비스 만들기워크샵! 오호.. 기대되쥬? (참석하시면 저도 만날 수 있습니다. 피하지 말아주세요). 라즈베리파이2 또는 비글본 그린을 이용하여 IoT 서비스를 구축하는 방법을 달릭웍스 담당자로부터 직접 들을 수 있는 기회!

 

 

강의까지 들을 수 있지만 무엇보다도 시중에 판매하고 있는 키트들을 저렴하게 득!할 수 있는 기회라는 거………… WOW. 자세한 워크샵 내용은 http://www.icbanq.com/P005756201/ 에서 확인하시기 바랍니다. 문의는 shop@icbanq.com 으로 GOGO J

 

 

 

 

신고

[아이씨뱅큐 ICbanQ 파워블로거 2기] 라즈베이파이로 텔레그램 봇 만들기[3] - 텔레그램 CLI 설치하기

[본 컨텐츠는 ICbanQ (아이씨뱅큐)에서 진행하는 파워블로거 활동의 일환으로, 아이씨뱅큐의 지원을 받아 작성되었습니다]

 

사용한 품목


1) 라즈베리파이B+ 베이직 키트: 

http://www.icbanq.com/shop/product_detail.asp?prod_code=P005607887&LType=R

 

서론


 지난 포스팅까지 라즈비안위에 서버를 구성했다. 이제는 라즈비안에 텔레그램을 설치해야 한다. 기본적인 구성은 라즈비안 위에 서버와 텔레그램이 병렬적으로 돌아가고 텔레그램이 나의 명령을 받아서 서버의 웹과 데이터베이스에 접근하는 구조를 가진다. 설치하는 방법은 아래 3개의 URL을 참고했다.

http://coffeenix.net/board_view.php?bd_code=1759

http://humit.tistory.com/57

https://github.com/vysheng/tg/blob/master/README.md

설치


 

  설치할 때 먼저 관련 라이브러리들을 설치해야 한다. 그런데 문제는 repository가 잘못 ?榮쩝?repository를 못 찾는 지 라이브러리들을 가져오지 못했다. 무엇이 문제일까? 평소에 라이브러리를 가져오지 못하는 문제는 repository를 찾지못해서였고, 이 문제는 dns와 관련이 있었다. 그래서 /etc/network/interfaces를 아래와 같이 변경했고 문제를 해결했다. 물론 변경 후 네트워크 서비스를 재시작해야 한다. dns서버를 기존에는 한국 코넷?쪽으로 해놨다가 구글 dns서버의 IP인 8.8.8.8로 바꿔줬다.

 

 

라이브러리를 다운받기 전에 아래 명령어를 입력해서 업데이트를 해주자.  

 

 

 

 

 

1
2
sudo apt-get update
sudo apt-get upgrade
cs

 그리고 아래 명령어를 입력하도록 하자. 

 

 

 

 

 

1
apt-get install libreadline-dev libconfig-dev libssl-dev lua5.2 liblua5.2-dev libevent-dev
cs

 

 업데이트를 해서 그런지 아래 그림과 같이 라이브러리를 있다고 했다. 물론 없으면 설치해주도록 하자. 설치하다가 딴거 하다가 그래서 중간에 라이브러리를 직접 설치해줬는 지 기억이 안난다. :(

 

그럼 이제 텔레그램 CLI를 설치하기 위한 환경은 모두 갖췄다. CLI는 Command Line Interface로 터미널을 통해 사용자와 컴퓨터가 상호 작용을 하는 방식을 말한다. 우리는 이 텔레그램 CLI를 이용하여 DB나 웹에 접근할 것이고, 개인적으로 CLI가 편하다고 생각할 뿐더러 CLI외에 텔레그램을 db와 웹에 접근하는 방법이 딱히 생각나지 않아서 텔레그램 CLI를 선택했다 ^오^

 처음에는 블로그를 참조해서 wget를 이용해서 다운받았는데, configure 문제가 아래와 같이 있었다. 그래서 github에 제작자가 만들어 둔 방법을 사용하니 바로 ?榮? 역시 만든 사람이 제일 잘 아는 것 같다.

./configure명령을 날리면 체크를 하다가 마지막에 에러를 뱉고 진행이 안된다. 

 

그 문제가 python에 있길래 python 관련 configure를 처리하기 위해 어떻게 해야할까 고민했다. 그러다가 파이썬 관련 configure를 관리하기 위해 apt-get install을 이용하는 포스팅을 봤고 아래와 같이 했지만 여전히 안?榮?

 

위에서 언급한 것과 같이 제작자가 readme에 적어둔 대로 git clone명령으로 설치했다.(원래는 wget을 해서 안?榮? 물론 wget의 문제가 아니라 내가 중간에 뭘 잘못 했을 지도 모른다.)

1
git clone --recursive https://github.com/vysheng/tg.git && cd tg
cs

 이렇게 설치하면 tg 디렉토리로 들어가는데 ./configure와 make를 하면 컴파일을 한다.

 

 

1
2
./configure
make
cs

 

아래 그림은 git clone으로 설치해서 cd로 해당 디렉토리로 이동하고 ./configure와  make를 한다. 뭐가 문제인 지는 모르겠지만 컴파일이 오래 걸리길래 딴 걸 했는데 대충 1시간은 지난거 같다. (그만큼 용량이 크나? 라즈베리파이가 문제인건가?)

 

 

 

 

컴파일을 하고 아래 명령어를 쳐서 번호를 물으면 올바르게 설치 된 것이다. 




마치면서


설치하면서 라이브러리때문에 많은 시간이 걸렸다. 역시 새로운 환경에서 개발을 한다는 것은 개발보다 환경구축에 많은 심력을 소모하게 된다는 나의 지론(?!)을 다시 생각나게 했다. 그리고 다음 포스팅에는 내 텔레그램으로 봇에 명령을 내리기 위해서 가상번호를 만들면서 생긴 우여곡절기와 간단히 만든 텔레그램 봇을 보여주도록 하겠다.

관련 상품


라즈베리파이2 보드: 

http://www.icbanq.com/shop/product_detail.asp?prod_code=P005652343

라즈베리파이2 베이직 키트: 

http://www.icbanq.com/shop/product_detail.asp?prod_code=P005655515

손톱두이노: 

http://www.icbanq.com/shop/product_detail.asp?prod_code=P005668577

라즈베리파이 전용 방열판 (소): 

http://www.icbanq.com/shop/product_detail.asp?prod_code=P002110427

 

 

 

 

[본 컨텐츠는 ICbanQ (아이씨뱅큐)에서 진행하는 파워블로거 활동의 일환으로, 아이씨뱅큐의 지원을 받아 작성되었습니다]


  

 

신고

[아이씨뱅큐 ICbanQ 파워블로거 2기] 라즈베리파이 온습도센서(CHIPCAP-L/Module) 이용하기

[본 컨텐츠는 ICbanQ (아이씨뱅큐)에서 진행하는 파워블로거 활동의 일환으로아이씨뱅큐의 지원을 받아 작성되었습니다]



<사용 품목>


 

ㄱ. 라즈베리파이 B+ - http://www.icbanq.com/shop/product_detail.asp?prod_code=P005587400

ㄴ. 온습도센서(CHIPCAP-L/Module) -

http://www.icbanq.com/shop/product_detail.asp?prod_code=P000888998&catg_code=<ype=S

ㄷ. MCP3208 - 

http://www.icbanq.com/shop/product_detail.asp?prod_code=P001749352&catg_code=<ype=S




CONTENTS >



1. 개요
 

이번 시간에는 MCP3208을 통해 온습도센서를 이용해보도록 하겠습니다.

 

 

 

2. 회로도

 

전체적인 회로도입니다. 라즈베리파이 자체에는 ADC기능이 없기 때문에 MCP3208을 통해 구현하였습니다.

 

 

3. 소스코드 작성 

 

먼저 c파일을 생성합니다.

 

 sudo nano c파일이름.c

파일이름은 하시고 싶은대로 지으시면 됩니다.

 

#include

#include

#include

 

#include

#include

 

#define CS_MCP3208  6        // BCM_GPIO 25

 

#define SPI_CHANNEL 0

#define SPI_SPEED   1000000  // 1MHz

 

#define VCC         3.3 // Supply Voltage

 

 

int read_mcp3208_adc(unsigned char adcChannel)

{

  unsigned char buff[3];

  int adcValue = 0;

 

  buff[0] = 0x06 | ((adcChannel & 0x07) >> 2);

  buff[1] = ((adcChannel & 0x07) << 6);

  buff[2] = 0x00;

 

  digitalWrite(CS_MCP3208, 0);  // Low : CS Active

 

  wiringPiSPIDataRW(SPI_CHANNEL, buff, 3);

 

  buff[1] = 0x0F & buff[1];

  adcValue = ( buff[1] << 8) | buff[2];

 

  digitalWrite(CS_MCP3208, 1);  // High : CS Inactive

 

  return adcValue;

}

 

 

int main (void)

{

  int adc0Value   = 0;

  int adc1Value   = 0;

  float adc0Vol   = 0;

  float adc1Vol   = 0;

  float Temp      = 0;

  float RH        = 0;

 

  if(wiringPiSetup() == -1)

  {

    fprintf (stdout, "Unable to start wiringPi: %s\n", strerror(errno));

    return 1 ;

  }

 

  if(wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1)

  {

    fprintf (stdout, "wiringPiSPISetup Failed: %s\n", strerror(errno));

    return 1 ;

  }

 

  pinMode(CS_MCP3208, OUTPUT);

 

  while(1)

  {

    adc0Value = read_mcp3208_adc(0);

adc0Vol = (adc0Value/4096.0)*VCC; 

Temp = adc0Vol*200.0-50.0; 

 

adc1Value = read_mcp3208_adc(1);

adc1Vol = (adc1Value/4096.0)*VCC; 

RH = adc1Vol*100.0; 

printf("Temp = %f\n",Temp);

printf("RH = %f\n",RH);

delay(350);

  }

 

  return 0;

}


 

위와 같이 작성하신 후 c파일로 저장합니다.


그 후 컴파일 합니다.

gcc -o 실행파일이름 c파일이름.c -lwiringPi 


컴파일 후 실행파일을 실행합니다.

 sudo ./실행파일이름

 

4. 결과

 

 

 실행하시면 위와 같이 실행 창에 온도와 습도가 나타나게 됩니다.

 


[본 컨텐츠는 ICbanQ (아이씨뱅큐)에서 진행하는 파워블로거 활동의 일환으로아이씨뱅큐의 지원을 받아 작성되었습니다]

 

신고

[아이씨뱅큐 ICbanQ 파워블로거 2기] 라즈베리파이 CdS(광량) 센서 사용하기


[본 컨텐츠는 ICbanQ (아이씨뱅큐)에서 진행하는 파워블로거 활동의 일환으로아이씨뱅큐의 지원을 받아 작성되었습니다]



<사용 품목>


 

ㄱ. 라즈베리파이 B+ - http://www.icbanq.com/shop/product_detail.asp?prod_code=P005587400

ㄴ. CdS 센서(GL5537) 

ㄷ. MCP3208 - 

http://www.icbanq.com/shop/product_detail.asp?prod_code=P001749352&catg_code=<ype=S




CONTENTS >



1. 개요
 

이번 시간에는 MCP3208을 통해 CdS센서를 사용해보도록 하겠습니다.

CdS센서는 광량에 따라 저항 값이 달라지는 센서입니다.

보통 CdS센서를 사용할 경우 어두운 환경과 밝은 환경 둘에서의 CdS 통한 전압 값을 

비교 후 기준을 정하여서 지금 환경이 밝다 어둡다를 알려주도록 하거나

다른 액츄레이터가 동작할 수 있도록 합니다.
 

2. 회로도

 

전체적인 회로도입니다. 라즈베리파이 자체에는 ADC기능이 없기 때문에 MCP3208을 통해 구현하였습니다.

 

 

3. 소스코드 작성 

 

먼저 c파일을 생성합니다.

 

 sudo nano c파일이름.c

파일이름은 하시고 싶은대로 지으시면 됩니다.

 

#include <stdio.h>

#include <string.h>

#include <errno.h>

 

#include <wiringPi.h>

#include <wiringPiSPI.h>

 

#define CS_MCP3208  6        // BCM_GPIO 25

 

#define SPI_CHANNEL 0

#define SPI_SPEED   1000000  // 1MHz

 

 

int read_mcp3208_adc(unsigned char adcChannel)

{

  unsigned char buff[3];

  int adcValue = 0;

 

  buff[0] = 0x06 | ((adcChannel & 0x07) >> 2);

  buff[1] = ((adcChannel & 0x07) << 6);

  buff[2] = 0x00;

 

  digitalWrite(CS_MCP3208, 0);  // Low : CS Active

 

  wiringPiSPIDataRW(SPI_CHANNEL, buff, 3);

 

  buff[1] = 0x0F & buff[1];

  adcValue = ( buff[1] << 8) | buff[2];

 

  digitalWrite(CS_MCP3208, 1);  // High : CS Inactive

 

  return adcValue;

}

 

 

int main (void)

{

  int adcChannel = 0;

  int adcValue   = 0;

  float adcVol   = 0;

 

  if(wiringPiSetup() == -1)

  {

    fprintf (stdout, "Unable to start wiringPi: %s\n", strerror(errno));

    return 1 ;

  }

 

  if(wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1)

  {

    fprintf (stdout, "wiringPiSPISetup Failed: %s\n", strerror(errno));

    return 1 ;

  }

 

  pinMode(CS_MCP3208, OUTPUT);

 

  while(1)

  {

    adcValue = read_mcp3208_adc(adcChannel);

adcVol = (adcValue/4096.0)*3.3; 

    if(adcValue>=100)

    {

    printf("Bright\n");

    }

else 

{

printf("Dark\n");

}

 

delay(350);

  }

 

  return 0;


 

위와 같이 작성하신 후 c파일로 저장합니다.


그 후 컴파일 합니다.

gcc -o 실행파일이름 c파일이름.c -lwiringPi 


컴파일 후 실행파일을 실행합니다.

 sudo ./실행파일이름

 

4. 결과

 

 

실행 후 실행 창에서 CdS센서를 손으로 가리면 'Dark'라고 뜨고 

평상 시에는 'Bright'라고 뜨게 되는 것을 보실 수 있습니다.

 

 


[본 컨텐츠는 ICbanQ (아이씨뱅큐)에서 진행하는 파워블로거 활동의 일환으로, 아이씨뱅큐의 지원을 받아 작성되었습니다]


  

 

신고

[아이씨뱅큐 ICbanQ 파워블로거 2기] MPD를 사용하여 곡 정보 CLCD에 표현하기

 

[본 컨텐츠는 ICbanQ (아이씨뱅큐)에서 진행하는 파워블로거 활동의 일환으로아이씨뱅큐의 지원을 받아 작성되었습니다]


[ 사용한 품목 ]

 

라즈베리파이 B+, 로터리 엔코더 


 

[ CONTENTS ]


::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::[ Hardware ]::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

LCD ================ GPIO

VSS (pin 1) —————- GND

VDD (pin 2)—————- +5V (pin 2)

D7   (pin 14)—————— GPIO14 (pin 8) [previously GPIO18]

D6   (pin 13) —————— GPIO23 (pin 16)

D5    (pin 12)—————— GPIO24 (pin 18)

D4    (pin 11)—————— GPIO25 (pin 22)

E      (pin 6) ——————– GPIO08 (pin 24)

RS    (pin 4)—————— GPIO07 (pin 26)

RW    (pin 5)—————— GND


::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::[ Software ]::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::


1. GPIO설치
sudo dpkg -i python-rpi.gpio_0.5.11-1_armhf.deb

2. MPD설치
sudo apt-get install python-mpd

2.1 CharLCD.py

[참고]  Adafruit_CharLCD.py를 이용하여 만들었다. (라이브러리로 활용)

  sudo nano CharLCD.py
  아래내용 복사-붙여넣기
  Ctrl + X선택 후 y 선택 후 Enter


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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
#!/usr/bin/python
 
#
# based on code from lrvick and LiquidCrystal
#
 
from time import sleep
 
class CharLCD(object):
 
    # commands
    LCD_CLEARDISPLAY        = 0x01
    LCD_RETURNHOME          = 0x02
    LCD_ENTRYMODESET        = 0x04
    LCD_DISPLAYCONTROL      = 0x08
    LCD_CURSORSHIFT         = 0x10
    LCD_FUNCTIONSET         = 0x20
    LCD_SETCGRAMADDR        = 0x40
    LCD_SETDDRAMADDR        = 0x80
 
    # flags for display entry mode
    LCD_ENTRYRIGHT          = 0x00
    LCD_ENTRYLEFT           = 0x02
    LCD_ENTRYSHIFTINCREMENT = 0x01
    LCD_ENTRYSHIFTDECREMENT = 0x00
 
    # flags for display on/off control
    LCD_DISPLAYON           = 0x04
    LCD_DISPLAYOFF          = 0x00
    LCD_CURSORON            = 0x02
    LCD_CURSOROFF           = 0x00
    LCD_BLINKON             = 0x01
    LCD_BLINKOFF            = 0x00
 
    # flags for display/cursor shift
    LCD_DISPLAYMOVE         = 0x08
    LCD_CURSORMOVE          = 0x00
 
    # flags for display/cursor shift
    LCD_DISPLAYMOVE         = 0x08
    LCD_CURSORMOVE          = 0x00
    LCD_MOVERIGHT           = 0x04
    LCD_MOVELEFT            = 0x00
 
    # flags for function set
    LCD_8BITMODE            = 0x10
    LCD_4BITMODE            = 0x00
    LCD_2LINE               = 0x08
    LCD_1LINE               = 0x00
    LCD_5x10DOTS            = 0x04
    LCD_5x8DOTS             = 0x00
 
    def __init__(self, pin_rs=7, pin_e=8, pins_db=[25242314], GPIO=None):
        # Emulate the old behavior of using RPi.GPIO if we haven't been given
        # an explicit GPIO interface to use
        if not GPIO:
            import RPi.GPIO as GPIO
            GPIO.setwarnings(False)
        self.GPIO = GPIO
        self.pin_rs = pin_rs
        self.pin_e = pin_e
        self.pins_db = pins_db
 
        self.GPIO.setmode(GPIO.BCM)
        self.GPIO.setup(self.pin_e, GPIO.OUT)
        self.GPIO.setup(self.pin_rs, GPIO.OUT)
 
        for pin in self.pins_db:
            self.GPIO.setup(pin, GPIO.OUT)
 
        self.write4bits(0x33)  # initialization
        self.write4bits(0x32)  # initialization
        self.write4bits(0x28)  # 2 line 5x7 matrix
        self.write4bits(0x0C)  # turn cursor off 0x0E to enable cursor
        self.write4bits(0x06)  # shift cursor right
 
        self.displaycontrol = self.LCD_DISPLAYON | self.LCD_CURSOROFF | self.LCD_BLINKOFF
 
        self.displayfunction = self.LCD_4BITMODE | self.LCD_1LINE | self.LCD_5x8DOTS
        self.displayfunction |= self.LCD_2LINE
 
        # Initialize to default text direction (for romance languages)
        self.displaymode = self.LCD_ENTRYLEFT | self.LCD_ENTRYSHIFTDECREMENT
        self.write4bits(self.LCD_ENTRYMODESET | self.displaymode)  # set the entry mode
 
        self.clear()
 
    def begin(self, cols, lines):
        if (lines > 1):
            self.numlines = lines
            self.displayfunction |= self.LCD_2LINE
 
    def home(self):
        self.write4bits(self.LCD_RETURNHOME)  # set cursor position to zero
        self.delayMicroseconds(3000)  # this command takes a long time!
 
    def clear(self):
        self.write4bits(self.LCD_CLEARDISPLAY)  # command to clear display
        self.delayMicroseconds(3000)  # 3000 microsecond sleep, clearing the display takes a long time
 
    def setCursor(self, col, row):
        self.row_offsets = [0x000x400x140x54]
        if row > self.numlines:
            row = self.numlines - 1  # we count rows starting w/0
        self.write4bits(self.LCD_SETDDRAMADDR | (col + self.row_offsets[row]))
 
    def noDisplay(self):
        """ Turn the display off (quickly) """
        self.displaycontrol &= ~self.LCD_DISPLAYON
        self.write4bits(self.LCD_DISPLAYCONTROL | self.displaycontrol)
 
    def display(self):
        """ Turn the display on (quickly) """
        self.displaycontrol |= self.LCD_DISPLAYON
        self.write4bits(self.LCD_DISPLAYCONTROL | self.displaycontrol)
 
    def noCursor(self):
        """ Turns the underline cursor off """
        self.displaycontrol &= ~self.LCD_CURSORON
        self.write4bits(self.LCD_DISPLAYCONTROL | self.displaycontrol)
 
    def cursor(self):
        """ Turns the underline cursor on """
        self.displaycontrol |= self.LCD_CURSORON
        self.write4bits(self.LCD_DISPLAYCONTROL | self.displaycontrol)
 
    def noBlink(self):
        """ Turn the blinking cursor off """
        self.displaycontrol &= ~self.LCD_BLINKON
        self.write4bits(self.LCD_DISPLAYCONTROL | self.displaycontrol)
 
    def blink(self):
        """ Turn the blinking cursor on """
        self.displaycontrol |= self.LCD_BLINKON
        self.write4bits(self.LCD_DISPLAYCONTROL | self.displaycontrol)
 
    def DisplayLeft(self):
        """ These commands scroll the display without changing the RAM """
        self.write4bits(self.LCD_CURSORSHIFT | self.LCD_DISPLAYMOVE | self.LCD_MOVELEFT)
 
    def scrollDisplayRight(self):
        """ These commands scroll the display without changing the RAM """
        self.write4bits(self.LCD_CURSORSHIFT | self.LCD_DISPLAYMOVE | self.LCD_MOVERIGHT)
 
    def leftToRight(self):
        """ This is for text that flows Left to Right """
        self.displaymode |= self.LCD_ENTRYLEFT
        self.write4bits(self.LCD_ENTRYMODESET | self.displaymode)
 
    def rightToLeft(self):
        """ This is for text that flows Right to Left """
        self.displaymode &= ~self.LCD_ENTRYLEFT
        self.write4bits(self.LCD_ENTRYMODESET | self.displaymode)
 
    def autoscroll(self):
        """ This will 'right justify' text from the cursor """
        self.displaymode |= self.LCD_ENTRYSHIFTINCREMENT
        self.write4bits(self.LCD_ENTRYMODESET | self.displaymode)
 
    def noAutoscroll(self):
        """ This will 'left justify' text from the cursor """
        self.displaymode &= ~self.LCD_ENTRYSHIFTINCREMENT
        self.write4bits(self.LCD_ENTRYMODESET | self.displaymode)
 
    def write4bits(self, bits, char_mode=False):
        """ Send command to LCD """
        self.delayMicroseconds(1000)  # 1000 microsecond sleep
        bits = bin(bits)[2:].zfill(8)
        self.GPIO.output(self.pin_rs, char_mode)
        for pin in self.pins_db:
            self.GPIO.output(pin, False)
        for i in range(4):
            if bits[i] == "1":
                self.GPIO.output(self.pins_db[::-1][i], True)
        self.pulseEnable()
        for pin in self.pins_db:
            self.GPIO.output(pin, False)
        for i in range(48):
            if bits[i] == "1":
                self.GPIO.output(self.pins_db[::-1][i-4], True)
        self.pulseEnable()
 
    def delayMicroseconds(self, microseconds):
        seconds = microseconds / float(1000000)  # divide microseconds by 1 million for seconds
        sleep(seconds)
 
    def pulseEnable(self):
        self.GPIO.output(self.pin_e, False)
        self.delayMicroseconds(1)       # 1 microsecond pause - enable pulse must be > 450ns
        self.GPIO.output(self.pin_e, True)
        self.delayMicroseconds(1)       # 1 microsecond pause - enable pulse must be > 450ns
        self.GPIO.output(self.pin_e, False)
        self.delayMicroseconds(1)       # commands need > 37us to settle
 
    def message(self, text):
        """ Send string to LCD. Newline wraps to second line"""
        for char in text:
            if char == '\n':
                self.write4bits(0xC0)  # next line
            else:
                self.write4bits(ord(char), True)
 
 
if __name__ == '__main__':
    lcd = CharLCD()
    lcd.clear()
    lcd.message("  CLCD 16x2\n  Standard LCD")
 
cs




2.2 CLCD 출력 테스트 

아래 명령어를 입력

sudo python CharLCD.py
++++++++++++++++++   출력화면 ++++++++++++++++++++++++

    lcd.clear()
    lcd.message("  CLCD 16x2\n  Standard LCD")

+++++++++++++++++++++++++++++++++++++++++++++++++++

위헤 해당된 글이 CLCD에 출력이 되어야 한다.



2.3 곡정보 표시를 위한 clcd_test.py 만들기

  sudo nano clcd_test.py
  아래내용 복사-붙여넣기
  Ctrl + X선택 후 y 선택 후 Enter
  그리고 아래를 실행하여 확인
 
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
44
45
46
47
48
49
50
 
#!/usr/bin/python
 
from CharLCD import CharLCD
from subprocess import *
from time import sleep, strftime
from datetime import datetime
 
from mpd import MPDClient
client = MPDClient()               # create client object
client.timeout = 10                # network timeout in seconds (floats allowed), default: None
client.idletimeout = None          # timeout for fetching the result of the idle command is handled seperately, default:$
client.connect("localhost"6600)  # connect to localhost:6600
 
 
lcd = CharLCD()
 
 
lcd.begin(16,2)
 
 
while 1:
    
    title = client.currentsong()['title']
    last_status = client.status()['state']
    volume = client.status()['volume']
    id = client.currentsong()['id']
    currentsong = client.currentsong()['file']
    status = client.status()['state']
    
    lcd.clear()
    
    try:
        if status == "play":
            lcd.message( "[" + id + "] " + title + "\n" + "PLAY     VOL:" + volume)
            
        elif status == "pause":
            lcd.message( "[" + id + "] " + title + "\n" + "PAUSED   VOL:" + volume)
            
        else:
            lcd.message( "[" + id + "] " + title + "\n" + "STOPED   VOL:" + volume)
                
        last_status = client.status()['state']
            
    except:
        pass
        
        
    sleep(2)
 
cs


2.4 Music Player Daemon (MPD) 정보 스크립트 만들기 
mpd데몬이 설치가 되어있다면 다음 파일을 만들어 보자

  sudo nano mpd_info.py
  아래내용 복사-붙여넣기
  Ctrl + X선택 후 y 선택 후 Enter
  그리고 아래를 실행하여 확인

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
 
#!/usr/bin/env python 
from mpd import MPDClient
client = MPDClient()               # create client object
client.timeout = 10                # network timeout in seconds (floats allowed), default: None
client.idletimeout = None          # timeout for fetching the result of the idle command is handled seperately, default:$
client.connect("localhost"6600)  # connect to localhost:6600
currentsong = client.currentsong()
print ""
print 'CURRENT----------------------------------------------------------------'
if len(currentsong) > 0:
   for text in currentsong:
      print text + ": " + str(currentsong.get(text))
   current_id = int(currentsong.get("pos")) + 1
else:
   print "No current song (empty playlist)"
print ""
print 'STATUS-----------------------------------------------------------------'
status = client.status()
for text in status:
   print text + ": " + str(status.get(text))
print ""
print 'STATS------------------------------------------------------------------'
stats = client.stats()
for text in stats:
   print text + ": " + str(stats.get(text))
client.close()                     # send the close command
client.disconnect()                # disconnect from the server
 
cs

2.5 위의 파일 실행 및 확인

 아래 명령을 실행하면 화면에 다양한 정보를 볼 수 있다. 저 정보를 사용하여 위의 clcd_test.py를 꾸미면 된다.

sudo python mpd_info.py



3. 실행 및 확인 

sudo python clcd_test.py
위와 같이 실행하면 아래와 같이 곡아이디, 곡명, 플레이상태, 볼륨정보등을 확인할 수 있다. 



 

4. 동영상 확인


 
5. 관련상품

신고

[아이씨뱅큐 ICbanQ 파워블로거 2기] Volumio 로터리엔코더( GPIO )를 이용하여 음량제어하기

[본 컨텐츠는 ICbanQ (아이씨뱅큐)에서 진행하는 파워블로거 활동의 일환으로아이씨뱅큐의 지원을 받아 작성되었습니다]

 

 


[ 사용한 품목 ]

 

라즈베리파이 B+, 로터리 엔코더 


 

[ CONTENTS ]

 

[참고]

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::[ Hardware ]::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::



::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::[ Software ]::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::


1. GPIO설치
sudo dpkg -i python-rpi.gpio_0.5.11-1_armhf.deb

2. Rotary Class
  아래의 2.1과 2.2모두 /home/volumio/에 위치한다.

2.1 rotary_class.py

[참고]  Bob Rathbone source: http://www.bobrathbone.com/raspberrypi_rotary.htm 

  sudo nano rotary_class.py
  아래내용 복사-붙여넣기
  Ctrl + X선택 후 y 선택 후 Enter

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
 
#!/usr/bin/env python
#
# Raspberry Pi Rotary Encoder Class
# $Id: rotary_class.py,v 1.2 2014/01/31 13:34:48 bob Exp $
#
# Author : Bob Rathbone
#
# This class uses standard rotary encoder with push switch
#
 
import RPi.GPIO as GPIO
 
class RotaryEncoder:
 
    CLOCKWISE=1
    ANTICLOCKWISE=2
    BUTTONDOWN=3
    BUTTONUP=4
 
    rotary_a = 0
    rotary_b = 0
    rotary_c = 0
    last_state = 0
    direction = 0
 
    # Initialise rotary encoder object
    def __init__(self,pinA,pinB,button,callback):
        self.pinA = pinA
        self.pinB = pinB
        self.button = button
        self.callback = callback
 
        GPIO.setmode(GPIO.BCM)
        
        # The following lines enable the internal pull-up resistors
        # on version 2 (latest) boards
        GPIO.setwarnings(False)
        GPIO.setup(self.pinA, GPIO.IN, pull_up_down=GPIO.PUD_UP)
        GPIO.setup(self.pinB, GPIO.IN, pull_up_down=GPIO.PUD_UP)
        GPIO.setup(self.button, GPIO.IN, pull_up_down=GPIO.PUD_UP)
 
        # For version 1 (old) boards comment out the above four lines
        # and un-comment the following 3 lines
        #GPIO.setup(self.pinA, GPIO.IN)
        #GPIO.setup(self.pinB, GPIO.IN)
        #GPIO.setup(self.button, GPIO.IN)
 
        # Add event detection to the GPIO inputs
        GPIO.add_event_detect(self.pinA, GPIO.FALLING, callback=self.switch_event)
        GPIO.add_event_detect(self.pinB, GPIO.FALLING, callback=self.switch_event)
        GPIO.add_event_detect(self.button, GPIO.BOTH, callback=self.button_event, bouncetime=200)
        return
 
    # Call back routine called by switch events
    def switch_event(self,switch):
        if GPIO.input(self.pinA):
            self.rotary_a = 1
        else:
            self.rotary_a = 0
 
        if GPIO.input(self.pinB):
            self.rotary_b = 1
        else:
            self.rotary_b = 0
 
        self.rotary_c = self.rotary_a ^ self.rotary_b
        new_state = self.rotary_a * 4 + self.rotary_b * 2 + self.rotary_c * 1
        delta = (new_state - self.last_state) % 4
        self.last_state = new_state
        event = 0
 
        if delta == 1:
            if self.direction == self.CLOCKWISE:
                # print "Clockwise"
                event = self.direction
            else:
                self.direction = self.CLOCKWISE
        elif delta == 3:
            if self.direction == self.ANTICLOCKWISE:
                # print "Anticlockwise"
                event = self.direction
            else:
                self.direction = self.ANTICLOCKWISE
        if event > 0:
            self.callback(event)
        return
 
 
    # Push button up event
    def button_event(self,button):
        if GPIO.input(button): 
            event = self.BUTTONUP 
        else:
            event = self.BUTTONDOWN 
        self.callback(event)
        return
 
    # Get a switch state
    def getSwitchState(self, switch):
        return  GPIO.input(switch)
 
# End of RotaryEncoder class
 
 
cs


2.2 VolumioKnob.py 

  sudo nano VolumioKnob.py
  아래내용 복사-붙여넣기
  Ctrl + X선택 후 y 선택 후 Enter
  그리고 아래를 실행하여 확인
  sudo python /home/volumio/VolumioKnob.py 


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
#!/usr/bin/env python
#
# Raspberry Pi Rotary Test Encoder Class
#
# Author : Bob Rathbone
#
# This class uses a standard rotary encoder with push switch
#
import subprocess
import sys
import time
from rotary_class import RotaryEncoder
 
# Define GPIO inputs (BCM)
PIN_A = 23              # Pin 16
PIN_B = 24             # Pin 18
BUTTON = 25     # Pin 22
 
# This is the event callback routine to handle events
def switch_event(event):
        if event == RotaryEncoder.CLOCKWISE:
              subprocess.call(['mpc''volume''+2' ])
              time.sleep(.2)
        elif event == RotaryEncoder.ANTICLOCKWISE:
              subprocess.call(['mpc''volume''-2' ])
              time.sleep(.2)
        elif event == RotaryEncoder.BUTTONDOWN:
              subprocess.call(['mpc''toggle' ])
        #elif event == RotaryEncoder.BUTTONUP:
              #print "Button up"
        return
 
# Define the switch
rswitch = RotaryEncoder(PIN_A,PIN_B,BUTTON,switch_event)
 
while True:
        time.sleep(0.5)
 
cs


3. 자동스크립트 작성

sudo nano /etc/rc.local

exit 0: 위에 아래 내용 삽입

sudo python /home/volumio/VolumioKnob.py &



3. 성공 & 재실행

sudo reboot


4. 동영상 확인





 

 

5. 관련상품

 
신고

라즈베리파이 3종 여름특별 할인!

라즈베리파이/라즈베리파이2

 

어느새부터 시작된 오픈하드웨어 계의 강자 라즈베리파이!  

라즈베리파이 3종 세트 할인 판매를 아이씨 뱅큐에서 시작합니다~

19일까지 한정판매를 진행하니 그동안 사려고 마음먹으신 분들은 얼른 고고 :)

 

 

 

 

http://www.icbanq.com/shop/templete_list.asp?t_idx=11&catg_code=101144100111

 

 

신고

아이씨뱅큐 라즈베리파이2 이벤트!

아이씨뱅큐 ICbanQ에서 준비한 또 다른 라즈베리파이2 이벤트_ 1000원의 행복!

파이 가격에 1000 원만 추가하면 라즈베리파이 멀티콤프 케이스가 똬!

4월 24일까지 판매라고하니 재고 소진되기 전에 얼른~ 구매하세요 ~ 

 

 

 

신고