[ICbanQ 무상체험단 25기] BoT-CLE110Test Kit 개봉기

구매처 http://www.icbanq.com/shop/product_detail.asp?prod_code=P005672731


안녕하세요^^; 한동안 뜸하다가 무상체험단에 당첨되어서 체험단 리뷰를 진행하게 되었습니다.

(카메라가 슬슬 하늘나라를 가려고 합니다,,, 세로운 카매라가 필요합니다;)

이번에 테스트하게된 BoT-CLE110Test Kit 는 말 그대로 Bot-CLE110 무선통신모듈을 테스트 해보기 위한 보드입니다.
기본적으로 어떤 동작을 할 수 있는지 테스트해볼 수 있는 개발보드의 느낌입니다.

사실, 이 보드를 받기 전에는 크게 기대하지 않았습니다. 아니 뭐,,, 블루투스 모듈하면 보통은 UART 통신용 SSP 블루투스 모듈이니까요^^; 그냥 통신모듈 이겠거니, 마침 무선통신 모듈 하나 필요했거니,,, 해서 신청했습니다.
그런대 막상 받고 관련 문서 좀 뒤적뒤적 하니까,,, 이거 좀 책임이 무거워졌습니다.
솔직히 여기있는 기능을 이번 달 안에 다 만족스럽게 사용할 수 있을지가 의문이에요 ㅠㅠ.
이거 사실상 그냥 제 넉두리가 되버렸는데, '이 보드 정말 좋네요~ 꺄~' 하는것보다 보드를 받게된 솔직한 감상을 적어보고자,,, 본격적인 글은 이제부터 가겠습니다.


사실 키트를 받으면서 제일 놀란게, USB 케이블이,,, 꽤나 좋은걸 주셨네요. 마침 스마트폰 케이블이 부족했는데,,, 아니 체험하는데 쓸껍니다. 네.



아두이노와 같이 사용할 수 있게끔 핀해더가 포함되 있습니다. 본인이 보유하고 있는 Arduino Mega 2560 R3 와 호환이 될지는 잘 모르겠습니다. 라이브러리가 UNO 에서 사용하는 Atmega328p 에 맞추어져 있다면 세로 라이브러리를 만들거나 적당히 포팅해서 쓰겠는데,,, 제가 이상한건지 라이브러리를 공개해주셨다는데 못찾겠어요! 

핀해더들에 좀 더 아쉬운점은 역시 추가 적층이 어렵습니다. 보드 자체에 기능이 많긴 하지만 좀 아쉽긴 합니다.
다른 아두이노용 쉴드를 사용할 예정이셨다면 추가적으로 적층용 핀해더를 구매해두시는게 좋을것 같습니다.



코인형 배터리와 리듐폴리머 등을 연결할 수 있게 커넥터가 왔습니다. 코인형 배터리가 (그럴것 같진 않지만)전체 전원을 담당하는것인지, 아니면 비상전원 등으로 사용되는지는 좀더 문서와 데이터시트를 찾아볼 필요가 있을것 같습니다. 



적당히 크기 비교해보시라고 다른 보드들을 몇개 나열해봤습니다. 초록색 보드가 BoT-CLE110Test 보드입니다.

아마 다른 개발자들이나 대학생 분들의 실습/개발용 키트 정도가 맨 오른쪽 보드 크기일 겁니다(혹은 좀더 크거나)
소형 프로토타입 제작을 고려한 보드의 경우 중앙에 있는 보드와 비교해보시면 감이 오실겁니다
자작 MCU 모듈 등과 비교해봤을때 위의 붉은 보드 두개와 비교해보시면 됩니다. 
BoT-CLE110 Test 보드의 경우 Arduino UNO와 크기가 딱 맞도록 제작이 되어있고 Mega 2560 등과 비교해봤을 때 조금 작다는 느낌입니다. 


보드가 지원해주는 센서들의 모습입니다. 온도센서, Cds, 포텐셔미터가 보입니다. 다른분들의 개봉기를 좀 봤는데, 스마트폰으로 앱을 설치해서 값을 확인해볼 수 있는 모양입니다. 



그리고 그 위에 LED가 달려있습니다. 네, RGB LED가 달려있습니다. 조금 의외의 페리퍼럴 이었습니다. RGB LED를 달아주는 보드가 솔직히 좀 생소했습니다. 보통은 LED 어레이 등을 달아줄텐데, 꽤 신경쓴 모습이 보입니다. 
아마 하드웨어 PWM 과 연결되어 있을것으로 예상됩니다. BLE 모듈 자체가 이런 페리퍼럴을 제어해 줄 IO가 마련되어 있습니다. 마찬가지로 GPIO도 있습니다.



솔직히 이 보드에서 제일 놀란점이 이겁니다.

진동모터가 달려있습니다.

ㅇㅂㅇ!!!!?!?!?!?! 진동모터!? 제가 이상한건진 모르겠습니다만, 부저를 달아둔 보드는 많이 접해봤습니다. 진동모터는 솔직히 처음입니다. 보통은 고정시켜두고 사용하는 보드들이 많아서 부저를 많이 달아주는데, 특이하게 진동모터가 달려있습니다. 아무래도 이동용 디바이스에 사용을 고려한게 아닐까 싶습니다. 



그리고 BLE 모듈입니다. 지금은 이벤트중이라 이 Kit 를 사면 모듈도 하나 준다고 합니다. 저한태는 기회가 없을것 같지만!
다른 모듈과 사용할 수 있는지는 모르겠습니다(많이들 쓰는 HC 시리즈 라든지,,,). 되면 정말 좋겠지요. 문서로 사용할 수 있게끔 되어있는지 찾아보아야 할 것 같습니다. 

아직 실사용은 못해봤습니다.
다른분들을 보니 벌써 앱까지 설치해서 태스트해본 분도 계시더군요. 좋습니다. 
저도 열심히 삽질해서 정보공유하겠습니다.^^!
삽질기를 원하시는 분은 저에게 오세요!

문서화도 꽤 잘되어 있다고 생각됩니다.
보통 이런 보드들을 구매할 때, 저는 제일먼저 문서화, 개발자가 응용할 수 있도록 길을 얼마나 터주는지 등을 고려합니다. 저는 그래도 고통을 인내하는 타입이긴 합니다만, 정보가 부족하면 정말,,, 키보드를 하도 꽝꽝 쳐대서 남아나질 않습니다;. 

"여기 보드가 있구요. 행운을 빕니다. Good Luck^^" 

타입의 개발보드도 정말 싫어하는 편입니다. 어느정도 튜토리얼이 있거나, 제 래벨에서 응용 가능하다 싶은 보드를 고려하는 편입니다.


칩센사에서 제공해주는 데이터시트와 메뉴얼을 받을 수 있는 곳입니다. 해당 보드는 BoT-CLE110 관련 PDF 를 받으시면 됩니다. 테스트 키트용 PDF 뿐만 아니라 모듈의 PDF 까지 받아두셔야 합니다. 

모듈의 메뉴얼을 보면 대부분의 조작은 UART 통신을 이용하도록 되어있습니다. 라이브러리를 제작하시려는 분들은 이 메뉴얼을 보고 사용하시는 환경의 Serial(UART)통신 관련 기능을 이용하시면 됩니다. 그 외 Kit 의 데이터시트 등을 볼 수 있었습니다. Kit 에는 UART를 USB를 통해 이용할 수 있는 USB to Serial 변환 칩을 내장하고 있습니다. 그냥 USB 연결해서 AT 명령어를 통해 테스트해보는것이 좋을것 같습니다. 그외 별도로 RX, TX 를 따로 빼내었고, 모듈의 전압레벨은 3.3v 이기 때문에 Kit 가 이를 고려했는지도 확인해볼 필요가 있어보입니다. 

아두이노와는 핀해더를 통해 연결하도록 권장하고 있고, 기타 다른 리눅스 개발보드 등에서는 USB to Serial을 통해 연결하도록 권장하고 있는 듯 합니다. 

이쯤되면 그냥 이 보드 하나만 가지고도 테스트해볼건 다 해볼 수 있을것 같습니다. 그래도 보드를 받은 목적에 맞게 제가 보유하고 있는 보드들에서 사용해볼 생각입니다. 

"본 글은 아이씨뱅큐가 진행하는 칩센의 블루투스 4.1 모듈 테스트 키트 무상 체험단의 일환으로 ICbanQ의 지원을 받아 작성되었습니다" 

 

BoT-CLE110 Test Kit 개봉기

 

※ 본 글은 아이씨뱅큐가 진행하는 칩센의 블루투스 4.1 모듈 테스트 키트 무상 체험단의 일환으로 ICbanQ의 지원을 받아 작성되었습니다. http://www.icbanq.com/shop/

 

 

 

 

개봉기를 시작하겠습니다.

 

 

통보 하루만에 제품이 배송되어 왔군요. ICBanq의 무상체험 지원은 역시 스피드인가 봅니다. ^^

최근 많은 이들의 관심을 받고 있는 BT LE(Low Energy)이기에 상당한 기대감으로 제품을 개봉합니다.

 

 

 

제품을 담고 있는 상자의 크기는 생각보다 작습니다.

 

BPi를 올려 보았을 때 가로, 세로 길이가 크게 차이 나지 않습니다.

 

 

 

 

자, 이제 상자를 열어서 내용물을 확인해 보겠습니다.

 

 

왼쪽 상단 부터 시계 방향으로 micro USB 5pin cable,  설명서, 전원케이블 , 헤드소켓(+헤드핀) , 테스트 보드 입니다.

사소한 것이지만 꼭 필요한 핀들까지 구색을 갖춘 세심함이 느껴집니다. ^^

 

 

 

이제 주인공인 테스트 보드를 살펴보겠습니다.

 

 

 

 

크기는  68.6mm(W) X 53.3mm(H)로 100원 동전과 비교한 모습니다. 아두이노와 직접 연결해서 사용할 목적으로 크기를 맞춘 듯합니다.

 

 

 

보드의 정면 전체 모습입니다.  많은 슬라이드 스위치, 버튼 , vibrator, micro USB port, RGB LED, Light sensor 등이 보입니다.

설명서에 따르면 온도, 빛의 센싱이 가능한데, PIO(Periperal),AIO(Analog), DIO(Digital),PWM등을 외부에서도 control 할 수 있게 해 놓았으니 필요하다면 다른 센서들로 추가 구성도 가능 하겠군요.

 

 

블루투스 모듈은 Csr의 BT 4.1을 지원하는 칩이 적용되어 있습니다.

 

 

AIO port 쪽 모습입니다.

 

 

 

 

AIO0에 온도센서, AIO1에 빛 센서, AIO2에 가변저항이 연결되어 있군요.  

 

USB , PIO , PWM port 쪽 모습입니다.

 

 

P10과 P11은 switch와 LED가 연결되어 있고,  PWM0에는 RGB LED의 R(ed) , PWM1에는 G(reen),  PWM2에는 B(lue)가 연결되어 있습니다.  그리고 마지막으로 PWM3에는 vibrator Moter가 연결되어 있습니다. 

 

이 슬라이드 스위치들은 위로 올리면 kit 내부 회로에 의한 동작이고 , 내리면 외부 회로(아두이노 등등)에 의해 control되도록 하고 있습니다. 단, 전원에 해당하는 것은 내리면 3V coin cell battery 인가, 올리면 차단입니다. 

 

 

 

이어서 측면 모습입니다.

 

 

 

 

뒷면은 아래와 같습니다.

 

 

Coin cell battery 자리가 위쪽에 있습니다 .그리고 칩센의 엠블림이 보이고, 버젼정보등이 인쇄되어 있습니다.

 

 

 

우선 보드 이상 유무를 체크 하기 위해 Coin cell battery를 장착하고 스위치를 조작해 봅니다.

 

 

 

다행히 이상은 없군요.^^   On board 상태로 RGB LED 및 스위치 , 버튼에 의한 LED 정상 동작합니다.

참고로 진동모터는 외부전원(5V adapter or micro USB port)으로만 동작하도록 되어 있네요. 전력소모를 고려한 것 같습니다.

 

 

 

이상은 BoT-CLE110 Test Kit 제품을 개봉하여 크기, 모양, 구조 등을 한번 살펴보고 보드 이상유무 체크를 간단히 해 보았습니다.  

 

 

 

 

다음에 이어질 실질적인 테스트를 위해 Android App을 설치해 놓겠습니다.

 

 

 

동봉된 설명서에 제품 메뉴얼 및 android app 정보가 나와있습니다. Google Play에서 BoT-CLE110으로 찾으면 됩니다.

 

이상으로 개봉기를 마치겠습니다.

 

 

 

 

※ 본 글은 아이씨뱅큐가 진행하는 칩센의 블루투스 4.1 모듈 테스트 키트 무상 체험단의 일환으로 ICbanQ의 지원을 받아 작성되었습니다. http://www.icbanq.com/shop/

 

라즈베리파이 DC 모터 제어하기 (L293D)


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

 


<사용 품목>

 



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

 

ㄴ.  L293D - http://www.icbanq.com/P001806912/S

 

ㄷ.  5V 모터 - http://www.icbanq.com/P002126282

 

 

 

 

 



CONTENTS >





1. 개요

 

       이번 시간에는 DC 모터를 제어해보도록 하겠습니다.

 

 

 

2. 회로도

 

 

 

   전체적인 회로도입니다.

 

 

 

3. 소스코드 작성 

 

 

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

 

 sudo nano c파일이름.c

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

 

 

#include <stdio.h>

#include <wiringPi.h>


#define SW 6         //BCM_GPIO 25

#define OUT1 4       //BCM_GPIO 23

#define OUT2  5      //BCM_GPIO 24


int main(void)

{

    if(wiringPiSetup() == -1)

    return 1;

    

    pinMode(SW,INPUT);

    pinMode(OUT1,OUTPUT);

    pinMode(OUT2,OUTPUT);

    

    for(;;)

    {

           if(digitalRead(SW) == 0)

           {

              digitalWrite(OUT1,1);

              digitalWrite(OUT2,0);

           }

           else

           {

               digitalWrite(OUT1,0);

               digitalWrite(OUT2,1);

           }

    }

    return 0;

}


 

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


그 후 컴파일 합니다.

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


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

 sudo ./실행파일이름

 

 

 

4. 결과

 

 

동영상

 

실행하면 위와같이 정역이 스위치에 의해 조절 됨을 보실 수 있습니다.

 

 


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

 

 

IoT 닭장?

사물인터넷(IoT)가 구현된 닭장의 모습!!

https://www.bloter.net/archives/235853



라즈베이파이로 텔레그램 봇 만들기[6] - 텔레그램 CLI(lua)에 메모 기능 넣기

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

사용한 품목


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

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

 

들어가면서


 지난 포스팅까지는 텔레그램 CLI를 이용하기 위해 사용하는 lua와 sqlite3의 연동하는 방법과 간단한 코드를 봤다. 이제는 메세지를 받아서 어떤 메시지인지 확인하여 삽입(insert), 삭제(delete), 검색(select)하는 것에 대하 포스팅 하도록 하겠다. 

lua 문자열 처리


 

  특정 언어로 데이터베이스와 연동하기 위해서는 해당 언어의 문자열 처리방식에 대해 알아야 한다. 각 언어마다 문자열 처리 방식이 다르므로 lua의 문자열 방식에 대해 간단하게 알아보고 넘어가도록 하겠다. 아래 URL을 참고해도 좋다. 

http://lua-users.org/wiki/PatternsTutorial

http://namirde.blogspot.kr/2010/04/p11.html

http://lua-users.org/wiki/StringLibraryTutorial

일반적으로 문자열을 더하기 위해서 lua에서는 '..' 나 '+' 을 사용한다. 간단한 예이다.

a= 'world'

"hello"..a or "hello" + a    

 ==> "hello world"가 된다.

 

 데이터베이스의 데이터를 받아왔을 때 문자열인 경우도 있지만 숫자인 경우도 있다. 그러므로 문자열로 처리하기 위해서는 숫자를 문자열로 만들어주는 기능이 필요하다.

str = tostring("123")

 위에서도 언급했듯이 텔레그램 봇은 삽입, 검색, 삭제 기능이 있다. 그러므로 각 명령어를 받아서 쉘처럼 각 기능을 처리해야 한다. 텔레그램 자체는 문자열을 받는 것이므로 이 문자열을 잘라서 어떤 문자인지 판단해야 한다. 그러므로 문자열 자르는 기능, 특정 문자열을 찾는 기능, 문자열의 길이를 확인하는 기능이 필요하다.

string.sub(문자열, 시작 위치, 끝 위치)

  • 문자열에서 시작위치와 끝위치까지 자른다.

string.len(문자열)

  • 문자열의 길이를 구한다.

string.find(문자열, 찾는 문자열)

  • 문자열에서 찾는 문자열 찾아서 위치를 반환한다.

 

lua와 sqlite3을 연동한 텔레그램 메모 만들기


 이제 관련 문자열 만드는 것도 다 처리했으니 아래에 소스를 첨부한다. 그냥 빠르게 짜기 위해서 문자열 길이를 받고 자르고 해서 그렇게 좋은 효율을 가지는 코드는 아니다. 또한 나는 개발자가 아니므로 좋은 코드를 만드는 것보다 빠르게 코드를 만드는 것에 의의를 뒀다.

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
sqlite3 = require("lsqlite3")
db = sqlite3.open('memo.db')
function on_msg_receive(msg)
    memo_help_msg = "메모 [내용] [키워드]"
    no_msg = "[*] 번호 [*]\n"
    time_msg ="\n[*] 시간 [*]\n"
    content_msg = "\n[*] 내용 [*]\n"
    keyword_msg = "\n[*] 키워드 [*]\n"
    local m_msg = string.lower(msg.text) 
    local start_s, end_s = string.find(m_msg, "검색")
    local start_m, end_m = string.find(m_msg, "메모")
    local start_d, end_d = string.find(m_msg, "삭제")
    if(string.lower(msg.text)=="hello")then
        mark_read(msg.from.print_name, ok_cb, false)
        send_msg(msg.from.print_name, "world", oc_cb,false)
    elseif(msg.text=="올ㅋ")then
        mark_read(msg.from.print_name, ok_cb, false)
        local regdate = ""
        local content = ""
        local keyword = ""
        for row in db:nrows("SELECT * FROM test"do
            regdate = tostring(row.regdate)
          content = tostring(row.content)
          keyword = tostring(row.keyword)
          message = string.format("%s%s%s%s%s%s",time_msg,regdate,content_msg,
content,keyword_msg,keyword)
                  send_msg(msg.from.print_name, message, oc_cb,false)
        end
    elseif(start_s == 1 and end_s == 6) then
        mark_read(msg.from.print_name, ok_ck, false)
        default_query = "SELECT * FROM test "
        start_c, end_c = string.find(m_msg,"내용")
        start_k, end_k = string.find(m_msg,"키워드")
        start_t, end_t = string.find(m_msg,"시간")
        if( start_c == 8 and end_c == 13)then
            content_query = "where content like '%"
            content_to_find = string.sub(m_msg,15,string.len(m_msg))
            end_query = "%'"
            final_query = string.format("%s%s%s%s",default_query,content_query,
content_to_find,end_query)
            for row in db:nrows(final_query) do
             no = tostring(row.id)
               regdate = tostring(row.regdate)
             content = tostring(row.content)
             keyword = tostring(row.keyword)
             message = string.format("%s%s%s%s%s%s%s%s",no_msg,no,time_msg,
regdate,content_msg,content,keyword_msg,keyword)
                        send_msg(msg.from.print_name, message, oc_cb,false)
            end
        elseif( start_k == 8 and end_k == 16)then
            keyword_query = "where keyword like '%"
            keyword_to_find = string.sub(m_msg,18,string.len(m_msg))
            end_query = "%'"
            final_query = string.format("%s%s%s%s",default_query,keyword_query,
keyword_to_find,end_query)
            for row in db:nrows(final_query) do
             no = tostring(row.id)
               regdate = tostring(row.regdate)
             content = tostring(row.content)
             keyword = tostring(row.keyword)
             message = string.format("%s%s%s%s%s%s%s%s",no_msg,no,time_msg,
regdate,content_msg,content,keyword_msg,keyword)
 
             send_msg(msg.from.print_name,message,oc_cb,false)
            end
        elseif( start_t == 8 and end_t == 13)then
            send_msg(msg.from.print_name,v,oc_cb,false)
        end
    elseif(start_m == 1 and end_m == 6)then
        save_message = "\n[*] 저장 완료 [*]"
        start_memo, end_memo = string.find(m_msg,"메모%s+")
        start_memo, end_content = string.find(m_msg,"메.*%s")
        insert_content = string.sub(m_msg,end_memo+1,end_content-1)
        insert_keyword = string.sub(m_msg,end_content+1,string.len(m_msg))
        local tablefill = [[INSERT INTO test VALUES (NULL, datetime('now','
localtime'),']]..insert_content..[[',']].. insert_keyword..[[');]]
        db:exec(tablefill)
        send_msg(msg.from.print_name,"[*] 내용\t:\t"..insert_content.."\n[*] 
키워드\t:\t"..insert_keyword..save_message,oc_cb,false)
    elseif(start_d == 1 and end_d == 6)then
        save_message = "\n[*] 삭제 완료 [*]\n"
        start_memo, end_memo = string.find(m_msg,"삭제%s+")
        delete_id = string.sub(m_msg,end_memo+1,string.len(m_msg))    
        send_msg(msg.from.print_name,delete_id,oc_cb,false)
        local deletefill = [[DELETE FROM test where id =']]..delete_id..[[';]]
        db:exec(deletefill)
        send_msg(msg.from.print_name,save_message,oc_cb,false)
    end
end
function ok_cb(extra, succes,result)
end
cs

 

     명령어는 문자열에서 특정 문자(검색, 삭제, 메모)의 위치가 어디인지 판단하여 시작위치가 1이고 끝나는 위치가 6이면 문자열의 첫 두글자에 내가 찾는 문자가 있다는 것을 의미한다. 재밌게도 lua에서는 한글 한글자를 3바이트로 인식하는 것을 알 수 있었다.  

     예를 보도록 하자. 아래 그림과 같이 a라는 변수에 "테스트"를 넣고 string.find함수로 문자열의 위치를 찾았다. 아래 보는 것과 같이 "테"의 시작 위치가 1이고 끝나는 위치가 3이다. 응? 한글이 2바이트 인 것을 고려하면 시작위치가 1이고 끝나는 위치가 2이여야 하는데 3이다. 뭔가 다른게 잘못되어 그렇다고 볼 수 있는데 "스"와 "트"의 경우를 봐도 3바이트 인 것을 알 수 있다.

 

그래서 2글자로 이루어진 명령어(검색, 메모, 삭제)를 이용하기 때문에 그 string.find를 이용하여 해당 글자의 시작이 1이고 끝이 6인 것을 판단해야 한다. 하지만 '올ㅋ'는 그냥 문자열 비교를 했다. 그 이유는 올ㅋ의 경우 모든 리스트를 출력하는 것이기 때문에 추가적인 인자(정보)가 필요없다. 하지만 다른 명령의 경우는 메모를 하기 위해서는 [내용], [키워드]가 필요하고, 검색을 위해서도 어떤 종류(내용, 키워드)를 볼 지, 그 내용이 어떤 것인지 알아야 한다. 그러므로 검색이나 메모를 하기 위해서 앞 2글자가 검색, 메모, 삭제인 경우 뒤쪽의 인자들을 잘라서 처리해야 한다.

     이를 위해 아래와 같이 66, 67줄에 있는 string.find 명령어를 특정문자와 결합하여 정규표현식처럼 사용할 수 있다. 그러면 명령어의 포맷은 [명령종류][공백][인자1][공백][인자2]에서 명령어의 종류와 인자 1과 인자 2를 잘라서 가져올 수 있다.

        start_memo, end_memo = string.find(m_msg,"메모%s+")
        start_memo, end_content = string.find(m_msg,"메.*%s")

     그래서 아래와 같이 메모[공백]테스트1[공백]테스트2로 입력을 받는다.
그래서 이 명령을 받은 프로그램은 아! 지금 메모를 하고 내용으로는 테스트1,
키워드로는 테스트2를 넣구나라는 것을 알 수 있다. 




     이번은 검색[공백]키워드[공백]테스트2를 받는다.
 이를 받으면 텔레그램 봇은 "아! 키워드에 테스트2라는 단어가 포함된
메모를 검색하라는 거구나!"라고 판단한다.
여기서 나타나는 시간은 메모를 저장했을 때 당시의 시간을 입력한 것이다. 

 

     여기서 나타나는 시간은 메모를 저장했을 때 당시의 시간을 입력한 것이다. 그래야 내가 어떤 시점에 이런 메모를 썼다는 것을 알 수가 있고, 비슷한 메모를 구분 할 수 있는 근거가 된다고 생각한다. sqlite3의 테이블은 id, regtime, content, keyword로 나뉘어져 있다. id는 각 메모를 구분하기 위한 숫자이고, regtime은 메모를 저장할 당시의 시간, content는 내용, keyword는 내용을 구분할 수 있는 핵심 단어나 카테고리로 추후에 검색할 때 유용하게 사용할 수 있는 부분이라고 할 수 있다.

     아래 사진은 텔레그램 웹버전으로 명령을 내린 것이다. [*]으로 봇이 보내준 것인지 내가 내린 명령인지 쉽게 판단할 수 있을 거라 생각한다. 

 

 

 

 

 


마치면서


     이번 포스팅을 마치면서 lua와 sqlit를 연동하는데 어려움을 겪었다. 특히 아래처럼 특정 문자열은 정적으로 들어가고 특정 문자열을 동적으로 들어가는데 이를 합쳐서 db에 요청하는 것이 헷갈렸다.

"[*] 내용\t:\t"..insert_content.."\n[*] 키워드\t:\t"..insert_keyword..save_message

 sqlite3를 코딩하는 것도 lua를 코딩하는 것도 이번 텔레그램 봇을 만들면서 쓰는 것이 처음이라 더욱 생소했다. 하지만 이번 기회를 통해 특정언어를 사용하기 위해 먼저 데이터 형식에 대해 가장 먼저 알아봐야 한다는 사실을 알 수 있었다. 각 언어마다 데이터 형식과 처리방식이 다르기 때문이다. 이번 달에 포스팅은 이걸로 마치고 다음 포스팅에서는 궁극적으로 원했던 "짤방저장소"를 만들어 보도록 하겠다.

관련 상품


라즈베리파이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 (아이씨뱅큐)에서 진행하는 파워블로거 활동의 일환으로, 아이씨뱅큐의 지원을 받아 작성되었습니다]

 

라즈베이파이로 텔레그램 봇 만들기[5] - 텔레그램 CLI(lua)와 sqlite3 연동

 

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

사용한 품목


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

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

 

들어가면서


 지난 포스팅까지는 간단한 텔레그램 CLI를 이용하여 간단한 봇을 만들어봤다. 이제는 텔레그램을 이용한 메모장을 만들어보려한다. 나처럼 여러 장소에 메모를 적어서 관리를 잘 못하는 사람에게 도움이 될 거라 생각한다. 그리고 텔레그램 CLI의 사진 보내기 기능을 함께 쓰면 짤방저장소로 사용할 수 있어서 재밌을 것 같다.

luarocks


 

  lua에서 사용하는 module들을 관리하기 위해서 사용하는 패키지가 luarocks다. 리눅스 환경에서 apt-get install과 같은 느낌을 받았다. 그러므로 쉽게 설치하기 위해 luaroacks를 설치하도록 하자. 공식 홈페이지는 아래와 같다.

https://luarocks.org

 아래와 같은 순서대로 luarocks를 설치하도록 하자. 복사 하기 쉽도록 아래와 같이 명령어를 놔뒀다.

1
2
3
4
5
wget http://luarocks.org/releases/luarocks-2.2.2.tar.gz
tar zxpf luarocks-2.2.2.tar.gz
cd luarocks-2.2.2
./configure; sudo make bootstrap
sudo luarocks install luasocket
cs


아래 사진은 직접 위의 명령어를 입력하면서 나오는 결과를 함께 보여준다. 익숙하지 않는 환경을 설치하는 데 도움을 줄 수 있을 거라 믿는다.

 

 

그 다음에는 lua와 sqlite와 연동하는데 필요한 프로그램을 apt-get install로 하나, luarocks로 2개를 설치한다. 솔직히 이 중에서 어떤 것이 정말 필요한 것이고 쓸모 없는 것인지 판단이 안서지만, 모두 설치해서 환경설정에 관한 스트레스를 받지 않도록 하자.

1
2
3
apt-get install libsqlite3-dev
luarocks install luasql-sqlite3
luarocks  install lsqlite3 
cs

 

 

 

 

lsqlite3 사용, 그리고 기본적 문법


 관련 모듈을 설치했으면 이제 직접 lua와 sqlite3을 연동하도록 하자. 먼저 lua와 sqlite3를 연동하는 것을 성공하고 난 뒤에 텔레그램 CLI에 붙이도록 하자. 바로 소스에 넣으려고 했다가 문제가 발생할 수 있으니 하나하나 만들고 붙이는 방법을 택하여 알 수 없는 오류에 처하는 상황을 최대한 줄인다.

아래 코드와 같은 소스를 하나 만든다. 간단하게 설명하도록 하겠다.

sqlite3 = require("lsqlite3")

    • lsqlite3모듈을 불러와서 해당 인스턴스를 sqlite3에 저장한다.

local db = sqlite3.open('test3.db")

    • sqlite3는 test3.db라는 파일을 불러와서 연결 인스턴스를 db라는 변수에 저장한다.

db:exec[[

CREATE TABLE test(id, content);

INSERT INTO test VALUES (1, "Hello World');

INSERT INTO test VALUES (2, "Hello world');

]]

    • test3.db에 id,와 content 열을 만든다.


for row in db:nrows("SELECT * FROM test") do

    print(row.id, row.content)

end

    • [1, hello world], [2, hello world]를 출력한다.

db:close() 

      • 데이터베이스 연결을 끊는다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sqlite3 = require("lsqlite3")
local db = sqlite3.open('test3.db')
 
db:exec[[
  CREATE TABLE test(id, content);
  INSERT INTO test VALUES (1'Hello World');
  INSERT INTO test VALUES (2'Hello World');
]]
 
for row in db:nrows("SELECT * FROM test"do
  print(row.id, row.content)
end
 
db:close()
cs

 

 위 코드를 만들고 lua 파일명.lua를 실행하면 아래와 같은 결과가 나온다. 이는 test3.db에 테이블을 만들고 데이터를 입력하고 출력하는 작업을 보여준다. 

 

 

 


마치면서


 이번 포스팅에서 텔레그램 CLI와 sqlite3을 연동하기 위한 방법을 봤다. 텔레그램 CLI는 lua로 이루어져 있으므로 lua와 sqlite3 연동하기 위해 모듈을 쉽게 설치하도록 도와주는 luarocks를 설치했다. 이를 이용하여 설치 완료했고 간단하게 lua와 sqlite3를 연동하는 코드를 봤다. 다음 포스팅에서는 본격적으로 텔레그램에서 메시지를 받아서 sqlite3에 데이터를 넣고(insert) 빼고(delete) 보여주는(select)하는 것에 대해 알아보도록 하겠다.

관련 상품


라즈베리파이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 (아이씨뱅큐)에서 진행하는 파워블로거 활동의 일환으로, 아이씨뱅큐의 지원을 받아 작성되었습니다]

 

S4A를 활용한 S/W교육용 로봇 제작기 #2

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

 

 

어가며

                                                                                                                                        

S4A는 무한회전 서보모터를 지원한다. 무한회전 서보모터는 판매용이 있으나 저렴하게 제작하고자 SG90을 개조하는 방법으로 알아보겠다.  이글은 다음 블로그의 내용을 참고하였다.

SG90개조하기 블로그 참고(http://blog.naver.com/pareko/220081785291)

 

 보기

                                                                                                                                        

 SG90
   주로 RC용으로 가격이 저렴하다.



 료 살펴보기

                                                                                                                              

   1. 서보모터 제어
     저의 짧은 지식으로 알고 있는 서보모터의 종류는 다음과 같습니다. 더 다양한 종류가 있겠지만요

     가. 일반 RC서보
동작은 위의 사진과 같다. 일반 서보모터는 위와 같이 20ms를 주기로 0.7ms신호를 주면 오른쪽 2.3ms를 주면 왼쪽으로 움직인다. RC서보라고 불리우는 이유 RC에서 사용하는 조종기의 리시버의 각 채널에서 나오는 신호도 위와 같고 BLDC를 제어하기 위한 신호도 위와 같은 신호를 사용한다. 그래서 RC에서 주로 사용하는 서보이므로 RC서보라 불리운다. 맞죠?

나. 디지털 서보
     RC서보는 계속해서 위의 신호를 주어야만 그 각을 유지한다. 하지만 디지털 서보는 위의 펄스를 한 번만 보내면 서보모터에 전원이 인가되어 있는 상태이면 해당되는 각을 계속해서 유지해 준다. 안에 MCU가 그역할을 한다. RC서보로 여러개를 제어하려면 어려움을 만나게 된다. 하지만 디지털 서보를 사용하면 각 서보의 MCU가 역할을 분담하여 더욱 쉽게 제어할 수 있다. 

다. 스마트 서보

   여기서 자주 사용하는 AX-12가 스마트 서보이다. 디지털 서보와 같이 MCU가 들어 있다. 스마트 서보는 펄스를 입력 받는 것이 아니라 패킷을 받아서 현재 각과 온도 토크 등 다양한 정보를 상호 교환할 수 있는 서보이다.

 

 

 리하기

                                                                                                                               
         
1. S4A에서 나오는 신호 검사
   S4A에서 아래와 같이 프로그램 작성 후 핀에서 모터회전에 대한 신호를 분석해 보았다. 시계방향과 시계반대방향은 각각 0.7ms와 2.3ms였다. 주기는 25ms정도 되었다. 



2. 서보모터 분해 및 기어 멈치 부분 제거



2. 가변저항 연결 해제하기
 아래와 같이 분해 후 가변저항에 연결되어 있는 빨간색 3개의 선을 분해한다.




3. 가변저항을 고정저항으로 변경
   2.4k저항 두개를 이용하여 가변저항과 연결되었던 자리에 납땜하였다. 사용한 저항은 1608 SMD타입을 사용하였다.




식하기

                                                                                                                               
         
위와 같이 완료되었으면 아래의 프로그램을 S4A에서 간단하게 작성한 후 서보모터의 전원을 연결한 후 아두이노의 7번핀에 신호선을 연결한고 테스트를 한다. 서보모터의 전원은 아두이노의 5V를 사용하지 않고 외부 전원을 사용하였다.


 

S4A를 활용한 S/W교육용 로봇 제작기 #1

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



어가며

                                                                                                                              

현재 초중등교육현장에서 S/W교육에 대한 관심이 많다. 그 중 교육용 프로그램 언어(EPL)인 스크래치를 중심으로 로봇을 만들어보고자 한다. S/W교육이 중심이니 피지컬적인 요소는 최소화하여  만드는 것이 'S4A를 활용한 S/W로봇 제작기'의 목적이 될것이다.


보기

                                                                                                                                

 1. 스크래치 사이트 접속 ( http://s4a.cat/ )


  2. 다운 받기
   2가지 파일 다운 받기( 데스크탑 켬퓨터용, 아두이노 펌웨어용)

     2.1 데스크탑 컴퓨터용 파일 다운(각 운영체제 맞게 다운 )

    2.2 아두이노 펌웨어용 파일 다운 
    (주의) 바로 클릭하면 파일 다운이 되지 않으면 오른쪽 마우스를 클릭하여 "다른 이름으로 링크저장"으로 저장한다. 


 차리기

                                                                                                                              


1.  데스크탑 컴퓨터에 S4A 설치하기

    설치는 항상 긍정적인 답을 선택하면 자동으로 되니 설명 생략



          2. 아두이노에 펌웨어 설치

 (주의) 
여기에서 주의 할 점은 Arduino IDE가 미리 설치되어 있어야 되는데 이것은 여기에서 생략합니다.
인터넷에 아두이노 설치관련 검새하면 많이 나옵니다. ( http://arduino.cc/en/Main/Software )
드라이버까지 설치가 모두 완료 되어야 다음 펌웨어를 설치할 수 있습니다. 



 2.1 Arduino Uno 데스크톱 컴퓨터와 연결
    ( 저의 컴의 기준으로 연결하면 시리얼포트 27번으로 연결됨)
 


 2.2 Arduino IDE 실행 
 Arduino IDE가 설치 되었다면 위의 장보기에서 다운받은 아두이노 펌웨어 파일을 선택하여 IDE를 실행한다.
아래의 작업들은 한 번만 실행하고 그 이후의 모든 활동은 S4A에서 이루어진다.
  


2.3 업로드 설정
  2.3.1 보드 설정
   [도구]-[보드]-[Arduino Uno]


  2.3.2 포트설정
   [도구]-[시리얼포트]
  해당 보드와 연결된 포트와 연결한다.

2.4 업로드
 아래의 화살표 버튼을 눌러 Arduino Uno로 업로드 한다.


2.5 업로드 완료
  아래와 같이 상태표시줄에 "업로드 완료"라는 메세지가 Arduino에서 작업할 것은 모두 끝났다.





 리하기

                                                                                                                               

1 . Arduino와 LED 연결
  LED의 긴다리는 Arduino의 D13번핀에 연결 짧은 다리는 바로 옆 gnd에 연결 저항과 함께 연결하여 사용해야 하나
  일단 테스트 하기 위해서 바로 연결합니다. 만약 LED가 타신다면,, ㅠㅠ 꺄르르꺄르르입니다. 저항달아서 하세요.




2 컴퓨터와 Arduino 연결
 컴퓨터와 아두이노가 연결되지 않은 상태에서 S4A프로그램을 실행한다. 그러면 프로그램의 오른쪽 화면에 Arduino를 검색하는 창이 실행된다 이때 아두이노를 연결한 후 조금 기다리면 연결이 된다. 
S4A는 포트설정이 따로 없어서 매우 편한 것 같다.


3. 13번 포트에 연결되 LED점멸 프로그램 하기(전자에서의 Hello World) 
( 설치를 하면 한글로 나와야 정상인데 저는 언어선택을 잘못했는데 다시 한글로 안돌아오네요. ㅠㅠ )

  3.1 일단 제어(control) 블럭 선택
   선택하면 관련 명령어 블록이 나열된다.
    

  3.2 먼저 "클릭했을 때" 명령어
     if문에 해당되는 것 같지만. 아두이노와 차별화 된 명령어인 것 같다. 
     일단 클릭하면 프로그램이 실행되면서 아두이노에서 프로그램이 실행이 되기 위해서 이 명령어를 먼저 선택한다.
   

  3.3 무한루프 선택
     LED가 한번만 점멸하고 멈추는 것이 아니라 계속 점멸이 되어야 하므로 무한 루프를 넣는다.

   

   3.4 LED 점멸 블록 삽입
      모션블록 모음으로 가서 digital 블록을 선택한 후 출력 핀은 13번으로 선택한다.

   
   
  
   

 3.5 지연시간 입력
 다시 컨트롤 명령어블록으로 이동(사진에서 강조빠짐)해서 지연시간 블록을 각 각의 13번핀 동작 블럭 사이에 입력한다. 기본은 1초로 되어 있다. 
  즉, 1초 켜지고 1초 꺼지고 점멸이 이루어 진다. 




식하기

                                                                                                                               
이제 실행해서 프로그램이 잘 작성되었는지 직접 만지고 보고 느낄 수 있는 맛보기를 하겠습니다.

1. 순차실행 
 실행하기 위해서 [Edit]-[Start Single Stepping]메뉴를 선택한다.




2. 실행
실행하기 위해서 블럭모음을 선택한다. 또는 먼저 선택한 다음 가)의 메뉴를 선택하는 방법도 있다.


3. 확인 동영상

 

 

센서와 아두이노를 이용한 심쿵차!!

센서와 아두이노를 이용해
운전자의 상태를 표시해 주는 자동차가 개발 됐습니다.

이름하여 "심쿵차"의 아름답고 유용한 자태!!
함께 보시죠^^



Volumio 곡 버튼으로 제어하기

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

어가며

                                                                                                                              

 오래전부터 오디오 하시는 분들 이야기만 들어보았지 어떤 음과 함께하는지 자세히 알지는 못했다. 우연히 지인의 추천으로 PCM5102기반의 DAC을 공구하게 되었고 가지고 있던 Raspberry Pi를 이용하여 고품질의 음을 들을 수 있다고 하였다. 

저 또한 스피커도 구매하고 하나씩 디지파이의 세계에 빠져들고 있는 초보이다. Volumio(https://volumio.org/)는 MPD(Music Player Daemon)를 콘트롤하기 위한 GUI를 제공해 준다. 하지만 원격 디바이스에서 IP를 통해 접속을 해야하므로 나름 불편하다고 느꼈다. 그래서 버튼으로 간단하게 제어할 수 없을까? 해서 이곳 저곳 검색한 결과 성공한 내용을 정리하여 저같은 초보에게 도움을 주고자 글을 남긴다.

 

보기

                                                                                                                              

1. Raspberry Pi 2 

  (http://www.icbanq.com/shop/product_detail.asp?prod_code=P005686826&catg_code=115185)

 

2. Tact스위치

  (http://www.icbanq.com/shop/product_detail.asp?prod_code=P000096309&catg_code= )

 

     

            [Raspberry PI 2]                        [Tact스위치 1103T] 

 

 료 살펴보기

                                                                                                                              

1. 라즈베리파이
   다음과 같은 스펙을 가지고 있다.
 

 

2. Tact 스위치
   Tact스위치 종류는 아래 사진[사진1]과 같이 매우 다양한다. 사진[2]를 보면 빨간 라인이 서로 연결이 되어 있어서 한 라인이다. 처음 사용하시는 분은 주의해서 사용해야한다. 

 

 

    [사진1] Tact 스위치                                    [사진2] Tact 스위치 

 

 

 드웨어 구성하기

                                                                                                                              

1. 회로도




2. 납땜하기
   위의 회로도와 같이 납땜합니다.






 프트웨어 구성하기

                                                                                                                              

1. Music Player Daemon (http://www.musicpd.org/ )

 mpd는 무료 Open source music player server이다. 다양한 음원(확장자)을 실행해 주는 램상주 프로그램으로 이를 바탕으로 Volumio는 네트워크상 접속하여 제어할 수 있도록 GUI환경을 제공해 주고 있다.  이를 제어하기 위해서는 mpc로 제어해야 한다.

2. mpc-Program for controlling Music Player Daemon (MPD)

  mpc는 Music Player Daemon를 제어하기 위해 사용하는데 각 명령어는 다음 링크를 참조한다.
  


3. 코드작성하기

   3.1 라즈베리파이 접속한다.
   3.2 btnTest.py 파이썬 파일 만들기
      

   cd


   sudo nano btnTest.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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#!/usr/bin/python
 
import RPi.GPIO as GPIO
import time
import sys
import os
 
 
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
 
GPIO.setmode(GPIO.BCM)
 
GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(27, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_UP)
 
 
while 1:
    
    
    input_state_set = GPIO.input(4)
    input_state_play = GPIO.input(17)
    input_state_prev = GPIO.input(27)
    input_state_next = GPIO.input(22)
    
    if input_state_set == False:
        os.system('mpc toggle'
        
 
        
    if input_state_play == False:
        os.system('mpc toggle')
    
                
    
    if input_state_prev == False:
        status = "prev"
        os.system('mpc prev')    
        
    if input_state_next == False:
        status = "next"
        os.system('mpc next')
    
        
    
        
        
 
cs


위의 내용을 복사해서 붙여넣은 다음 

Ctrl+w, 
yes선택 
Enter

위와 같은 순서로 빠져나온다. 그럼 코드 작성은 완성이 되었다.



 동하기

                                                                                                                              


1. Volumio에서 일단 음을 실행한다 

2. 다음 아래의 명령어를 실행하면 파이썬으로 작성된 코드가 동작한다. 
      

   sudo python btnTest.py



3. 버튼 눌러보기
    

 GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUD_UP)

GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP)

GPIO.setup(27, GPIO.IN, pull_up_down=GPIO.PUD_UP)

GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_UP)



위의 코드와 같이 버튼은 내부풀업을 세팅하였다. 따라서 스위치에 저항을 납땜하지 않아도 된다.

각 스위치의 연결은 다음을 확인한다.


        input_state_set = GPIO.input(4)

input_state_play = GPIO.input(17)

input_state_prev = GPIO.input(27)

input_state_next = GPIO.input(22)



버튼을 누르면 곡의 정보가 콘솔창에 아래와 같이 표시된다.




4. 실제 작동 동영상

  위의 동영상은 CLCD와 함께 곡의 정보까지 표현해 주는 프로그램이다. 아래 코드를 참고하면 된다.
CLCD활용방법은 다음 링크와 같다.

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
#!/usr/bin/python
 
from CharLCD import CharLCD
from subprocess import *
from time import sleep, strftime
from datetime import datetime
 
import RPi.GPIO as GPIO
import time
import sys
import os
 
 
 
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
 
GPIO.setmode(GPIO.BCM)
 
GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(27, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_UP)
 
lcd = CharLCD()
 
 
lcd.begin(16,2)
playFlag = False
 
while 1:
    
    
    input_state_set = GPIO.input(4)
    input_state_play = GPIO.input(17)
    input_state_prev = GPIO.input(27)
    input_state_next = GPIO.input(22)
    
    if input_state_set == False:
        lcd.clear()
        os.system('mpc toggle')
        
 
        
    if input_state_play == False:
        lcd.clear()
        os.system('mpc toggle')
    
                
    
    if input_state_prev == False:
        lcd.clear()
        status = "prev"
        os.system('mpc prev')    
        
    if input_state_next == False:
        lcd.clear()
        status = "next"
        os.system('mpc next')
    
        
    
    
    try:
    
    
        title = client.currentsong()['title']
        last_status = client.status()['state']
        volume = client.status()['volume']
        audio = client.status()['audio']
        id = client.currentsong()['id']
        currentsong = client.currentsong()['file']
        status = client.status()['state']
    
    
        if status == "play"
            lcd.message( "[" + id + "] " + title + "\n" + "PLAY     " + audio[0:2+"k"+ audio[6:8+ "b  ")
            
        elif status == "pause":
            lcd.message( "[" + id + "] " + title + "\n" + "PAUSED   " + audio[0:2+"k"+ audio[6:8+ "b  ")
            
        elif status == "stop":
            lcd.message( "[" + id + "] " + title + "\n" + "STOPED   " + audio[0:2+"k"+ audio[6:8+ "b  ")
            
        elif status == "prev":
            lcd.message( "[" + id + "] " + title + "\n" + "PLAY     " + audio[0:2+"k"+ audio[6:8+ "b  ")
            
        elif status == "next":
            lcd.message( "[" + id + "] " + title + "\n" + "PLAY     " + audio[0:2+"k"+ audio[6:8+ "b  ")
                
            
    except:
        pass