BLE테스트키트 안드로이드 앱을 이용한 라즈베리파이 로봇 제어입니다.

 

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

구입처입니다. 

원래 라즈베리파이와 테스트 키트를 블루투스 통신하여 서보모터로 스위치를 제어하려고 했는데, 
생각같이 되지 않아 제가 활동하는 커뮤니티에서 만들고 있는 로봇에 컨트롤러로 사용하여 미션을 수행하였습니다.

제공한 안드로이드 앱의 터미널을 통해 로봇에게 명령 하달하기 입니다.

다른 것은 개별적으로 했던 것이고, BLE 테스트 키트와 관련있는 부분은 BLE 테스트 앱의 터미널을 통해
데이터를 전달하고 라즈베리파이에서 이를 시리얼 통신으로 수신해서 처리하는 내용입니다.
 
 
 
급조해서 로봇 머리에 테스트 키트를 부착했습니다.
다른 라인들 때문에 좀 지저분해졌는데 양해바랍니다.
 
 
 
로봇은 원래 라즈베리파이를 웹을 통해 제어하는 구조였는데, 라즈베리파이의 USB와 테스트 키트를 연결하여 제공된 안드로이드
앱의 터미널을 통해 로봇을 제어하려고 합니다.
 



부팅 시키고 나서 페어링까지 완료한 모습입니다.
이제부터 터미널에 글을 쓰고 send하게 되면 라즈베리파이의 시리얼을 통해 로봇을 제어할 수 있는데요.
저는 기존에 사용하던 node.js의 오픈 소스를 이용하여 구현하였습니다.

아래의 소스가 시리얼 통신으로 터미널에서 전송한 데이터를 받아오는 소스입니다. 보내는 것도 가능한데,
이번 미션에서는 받아오는 부분만 필요해서 받는 이벤트 쪽만 구현했습니다.

var serialport = require("serialport");
var SerialPort = serialport.SerialPort
var serialPort = new SerialPort("/dev/ttyUSB0", {
  baudrate: 9600,
  parser: serialport.parsers.readline("\n") // 
}, false); // this is the openImmediately flag [default is true] 
 
 serialPort.open(function (error) {
  if ( error ) {
    console.log('failed to open: '+error);
  } else {
    console.log('open');

    serialPort.on('data', function(data) {
      console.log('received: ' + data);
      
      if (data[0] === 'f') //forward
        forward(0);
      else if (data[0] === 'b') //backward
        backward(0);
      else if (data[0] === 'l') //left
        left(0);
      else if (data[0] === 'r') //right
        right(0);
    else if (data[0] === 's') //stop
        stop();
    });
  }
});

로봇 제어 API는 좀 길어서 생략했습니다. 
잠시 공간을 할애하자면, 간혹 IT 커뮤니티에서 보신 분들도 계시겠지만, 
개인적으로 circulus라는 커뮤니티에서 활동하면서 제작하고 있는 로봇입니다.
pololu 서보모터 컨트롤러, sg5010, as3103등의 서보모터를 사용하여 만들었고요. circulus라는 개발 platform에서
소프트웨어를 구현하고 있고, 웹을 통해 제어하고 있는데, 이번에는 BLE제어 키트를 이용하여 안드로이드 앱으로
제어하게 되었네요. 
pololu의 서보모터 컨트롤러의 소프트웨어 역시, npmjs.org에 오픈소스를 찾으실 수 있습니다.

아래는 로봇을 제어하는 동영상입니다.
 
 
 
 
 
 



 
지금까지 읽어주셔서 감사합니다. 좋은 하루 보내세요.

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

신고

블루투스 라즈베리파이 시리얼 콘솔

 

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

무상체험 대상인 BoT-CLE110 Test Kit 구입처http://www.icbanq.com/shop/product_detail.asp?prod_code=P005672731

 

​라즈베리파이 모델B 2대, 라즈베리파이2 모델B 2대, 모두 4대의 라즈베리파이를 가지고 있다. 데모용으로 자주 들고 다니는 라즈베리파이2는 2대는 각각 Ubuntu 14.04 + ROS indigo, 라즈비안과 카메라 영상을 네트워크 스티리밍할 mjpeg streamer가 설치되어 있다. 보통 전원과 네트워크만 연결해 사용하고, 여간해서는 키보드, 모니터 등은 연결하는 일이 거의 없다. 하지만 가끔씩 이 전에 사용했던 네트워크 설정이 데모장소의 네트워크 여건상 수동 설정을 사용했을 경우, 난감한 사태가 벌어진다. 보통 USB to UART 장치를 이용해 시리얼 콘솔 접속으로 설정을 변경하는데, 이 BoT-CLE110 Test Kit을 일종의 쉴드로 만들어 아예 장착해 두면, 바로 PC나 스마트폰에서 무선으로 이 작업이 가능하겠다는 생각이 들었다.

1. BoT-CLE110 Test Kit의 Baudrate 변경


일반적으로 리눅스 시리얼 콘솔로 사용되는 UART Baudrate는 115,200baud를 사용한다. 라즈베리파이 또한 마찬가지이다. 이 작업에 적당한 시리얼통신 에뮬레이터는 아두이노 IDE 프로그램의 시리얼 모니터가 적당하다. 먼저 BoT-CLE110 Test Kit을 마이크로 5핀 USB 케이블을 통해 PC와 연결한다. 이 때 장치관리자의 포트항목에 나타나는 COMxx의 xx에 해당하는 숫자를 기억해두자.


이제 아두이노IDE를 실행시킨 후 '도구 - 포트 - COMxx'을 앞서 기억해 둔 숫자로 맞춘 후   아이콘을 클릭하여, 시리얼모니터를 실행한다.


아래 그림처럼 설정이 되었는 지 확인한다.


AT를 입력하여 +OK가 출력되는 지 확인


AT+UART=115200 를 입력하여 +OK가 출력되는 지 확인


아래 그림에 표시한 것 처럼 보레이트를 115200으로 변경 AT를 입력하여 +OK가 출력되는 지 확인



2. 바즈베리파이의 Serial Cosole 활성화


시리얼 콘솔을 활성화 시키기 위해 raspi-config를 실행한다.

 $ sudo raspi-config

메인메뉴에서 '8. Advanced Options' - 'A08. Serial' - '' - '' 순서로 선택하여 시리얼 콘솔을 활성화 시킨 후,  ''를 선택하여 raspi-config를 종료한다.


 

시리얼 콘솔 포트 확인

 $ sudo ls /dev/ttyA*

   /dev/ttyAMA0

​/dev/ttyAMA0가 라즈베리파이 PGIO포트에 있는 시리얼 콘솔 접속시 사용되는 시리얼 포트의 이름이다.


3. Wiring

라즈베리파이의 I/O 신호레벨이 +3.3V 이므로 특별히 신호레벨을 맞춰 줄 필요는 없다. GND만 맞춰주면 되다. 아래 그림처럼 4가닥만 연결해주면 된다. 점선으로 표시한 SW 방향에 주의한다. 앞서 전송속도를 115200으로 변경할 때와 반대방향으로 맞춘다.

 

 

4. BoT-CLE110 Test Kit를 이용한 라즈베리파이 시리얼 콘솔 접속

 

 


 

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

  

 
이 저작물은 크리에이티브 커먼즈 저작자표시-비영리 4.0 Unported 라이선스에 따라 이용할 수 있습니다 
신고

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

 

 

신고

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

 

신고

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
신고

라즈베리파이에 Window 10 IoT core 올리기

 

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

 

어가며

                                                                                                                              

아직 정식 데스크탑용 Windows 10 버젼이 나오지 않았다. LED에 불을 켜고 일반 GPIO를 제어하려면 데스크탑 PC에 Windows 10을 설치한 후 익스프로러 10을 기반으로 Visual Studio 2015RC를 설치한 후 제어를 해야 한다. 아무래도 윈도우 응용프로그램 개발이 가능하지 않으면 초기 사용에 많은 어려움이 있을 것 같다.



보기

                                                                                                                              

1. Raspberry Pi 2 

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

2. SD memory (Class 10 이상) 

      제가 구입한 SD메모리 스펙은 아래와 같습니다.



료 살펴보기

                                                                                                                              

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

2. SD메모리 
  SD메모리는 16G(Class 10) 이상을 권장한다.  여기서 Class10 은 최소 쓰기 속도를 나타내는데 일반적으로 배속이라 한다.  자세한 내용은 다음 링크를 참고한다.(http://www.bloter.net/archives/230516 ) 




치하기

                                                                                                                              


2. 프로그램 설치하기
  2.1 가상드라이버 툴로 IOS이미지를 마운트 하기
       IOS이미지를 마운트하면 해당 드라이버에 Windows_10_IoT_Core_FPi2.msi 파일을 볼 수 있다. 이를 선택하여 프로그램을 설치한다.



  2.2 설치완료 
      설치가 완료되면 [모든 프로그램]에서 2가지 프로그램을 볼 수 있다. 하나는 WindowsIoTCoreWatcher와 다른 하나는 WindowsIoTImageHelper이다.  WindowsIoTCoreWatcher는 현재 접속되어 있는 디바이스의 목록과 상태를 모니터링하는 프로그램이고 WindowsIoTImageHelper는 Win32DiskImager와 같이 윈도우용 이미지를 굽는 프로그램이다. 



3 이미지 굽기
 3.1. sd메모리 선택하기
    SD메모리를 데스크탑 컴퓨터에 연결한다. 그리고 이미지를 굽기위해 WindowsIoTImagerHelper를 실행한다
    해당 SD메모리를 선택한다. 



 3.2. 이미지 경로설정
    그리고 이미지를 구울 원본 이미지를 선택해야하는데 경로는 다음과 같다 ( 64비트 기준 -> C:\Program Files (x86)\Microsoft IoT\FFU\RaspberryPi2 )


  3.3 이미지 쓰기
     콘솔창이 나온 후 이미지 작업이 끝나면 없어진다.




4. RPi에서 Windows 10 IoT실행하기

 1. sd메모리는 RPi에 삽입하기
   이미지를 쓰기한 SD메모리를 RaspberryPi에 삽입한다.

 2. 부팅하기
    조금 기다리면 다음과 같은 화면들이 나오면서 설치가 완료된다.
    GUI환경이 제공되지 않기 때문에 아직 할 수 있는 것이 없다. 




   

3. 설치완료
  설치가 완료 되었으면 데스크탑컴퓨터에서 WindowsIoTCoreWatcher로 해당 RPi를 확인할 수 있다.

 


 

신고

라즈베이파이로 텔레그램 봇 만들기[4] - 간단한 텔레그램 봇

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


사용한 품목


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

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

 

들어가면서


 지난 포스팅까지 라즈비안 위에 서버를 구성하고 텔레그램 봇을 설치까지 마쳤다. 이제 텔레그램 CLI를 실행시키기 위해 번호를 등록하고 테스트 코드를 돌려보도록 하겠다. 가상번호로 텔레그램 봇을 만들어서라즈베리파이에 있는 텔레그램 번호와 내 폰의 텔레그램이 달라야 명령을 내릴 수 있다고 착각했다. 메일의 '내게쓰기'기능처럼 텔레그램도 나에게 메세지를 보낼 수 있었고 이를 이용해서 반응하도록 했다. 아래 URL을 참고했다. 자 이제 본격적으로 텔레그램 봇에 대해 이야기 해보도록 하자.

http://humit.tistory.com/62

Voxox


 

  처음에는 voxox라는 어플을 이용하여 가상번호를 만들려고 했다. 이 어플로 전화를 받거나 메세지를 받기 위해서는 결제를 해야 된다는 정보를 보고 '뭐, 1달러정도는 할 수 있다'라고 생각했다가 실수로 두번 결제했다. 으아ㅏㅏㅏㅏㅏ. $2.86가 바보 같이 내가 결제한 증거다. 

 

 

 생각해보니 내가 폰에 설치한 텔레그램은 이미 내 폰번호로 등록되어 있었다. 그러므로 텔레그램을 새롭게 쓰기 위해서는 번호를 등록해야 하고, 폰에 설치한 텔레그램에 등록된 번호를 voxox 로 받은 가상번호로 바꿔야했다. 근데 바꾸기 위해서는 텔레그램 서버로부터 코드를 받아야 하는데 그게 쉽지 않았다. 일반적으로 voxox는 아이패드나 블루스택, 지니모션과 같이 전화기능이 없는 환경에서 사용한다. voxox 어플을 설치하고 가상번호를 받아 전화로 쓰거나 카카오톡, 텔레그램을 쓰는 것이다. 그러므로 voxox를 사용하여 굳이 지금 내 폰에 등록된 텔레그램의 번호를 가상번호를 바꿀 필요가 없다는 결론을 내렸다.(블루스택은 기숙사에 서버로 쓰는 컴퓨터에 있어서 지금 당장 해볼 수 없었던 이유도 있었다),(문자로 코드도 안오는 이유도 있었다.)

 

'내게 쓰기' 기능과 간단한 텔레그램 봇


 그래서 '내게 쓰기'기능을 이용해보자고 생각했고, 내 번호를 직접 연락처에 넣고 메세지를 날렸다. 카카오톡에서 해보지 않았고 안될 것 같은 느낌이 들었는데, 텔레그램에서 되서 얼마나 기뻤는지 모른다. 

 

▲좋다!

아래와 같이 번호와 이름을 등록하면 login메세지가 뜬다. 처음에는 메모를 위한 봇을 원했지만, 어벤져스를 보면서 나도 자비스같은 봇을 가지고 싶었다. 생각 같은 것도 정리해두고 스크립트 같은 것을 만들어두고 텔레그램으로 명령을 내리면 자동으로 해주는 것을 하나하나 만들어 갈 예정이다. 훗 재밌겠군 

 

이제 전화번호 등록도 ?瑛릿歐?소스를 짜보도록 하자. 간단하게 hello를 입력하면 world를 출력해주는 봇을 만들 것이다. 이것이 의미가 있는 것이 내 명령에 반응을 했다는 것을 의미하므로 world 출력하는 것 대신에 서버의 db에 접근하여 자료를 검색하고 출력하도록 만들 수 있다. 또, 텔레그램 봇에서도 사진을 보낼 수 있으므로 나만의 사진저장소짤방저장소를 만들 수 있을 것 같다 ^오^

1
2
3
4
5
6
7
8
9
function on_msg_receive(msg)
        if(string.lower(msg.text)=="hello")then
            mark_read(msg.from.print_name, ok_cb, false)
            send_msg(msg.from.print_name, "world", ok_cb, false)
        end
end
 
function ok_cb(extra, secces, result)
end
cs

 lua를 포스팅을 하며 처음 만져보므로 소스에 대한 내용을 이야기는 다음 포스팅에서 하도록 하겠다. 간단하게 말하고 넘어가자면 msg.text를 lower로 소문자를 만들어 "hello"라면 send_msg를 이용하여 "world"를 보내는 것이라 직관적으로 쉽게 알 수 있다. 아래 그림은 hello 명령을 폰에서 날렸을 때 텔레그램 봇에서 world를 보내도록 한 것이다.



 또 재밌는 것은 텔레그램은 웹버전도 제공한다는 것이다. 웹 브라우저에서 텔레그램 인증을 통해 바로바로 명령을 날릴 수 있다. 이를 활용할 수 있는 부분을 생각해봤는데, 외부망에서 사내 서버에 직접적으로 접근하지 않고 텔레그램을 이용하여 서버의 상태를 볼 때 사용할 수 있을 거라 본다. 아래 그림은 웹버전의 텔레그램이다.




마치면서


 이번 포스팅에서 내 명령에 반응하는 간단한 텔레그램 봇을 만들어봤다. 생각보다 텔레그램이 가진 기능이 많아서 재밌는 것을 많이 할 수 있을 것 같다. 흥미진진하다. 또, 웹에서도 텔레그램 봇에 접근가능함을 보였다. 그러므로 웹이나 폰에서 텔레그램 봇에 명령을 전달하면 봇은 서버에 담긴 데이터들(사진, 메모 등)을 나에게 보낼 것이다. 물론 이에 대한 내용은 차근차근히 다음 포스팅에 담도록 하겠다..

관련 상품


라즈베리파이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기] 라즈베이파이로 텔레그램 봇 만들기[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기] TFT-LCD에 X윈도우 없이 바로 창 띄우는 2가지 방법

 

 

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


[ 사용한 품목 ]

 

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

- TFT-LCD

 

 

[ 내  용 ]

 

1. Python으로 작성한 Tkinter UI 띄우는 방법


  [목표] Python으로 작성안 GPIO제어 스위치 대화창을 TFT-LCD에 X윈도우 실행없이 바로 출력
    
    아래이 모든 작업은 /home/pi에 작성한다.  
    
       [ Tkinter UI파일 작성 후 저장]
$ sudo nano gui_switch.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
from Tkinter import *
import RPi.GPIO as GPIO
import time
 
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
 
class App:
    
    def __init__(self, master):
        frame = Frame(master)
        frame.pack()
        self.check_var = BooleanVar()
        check = Checkbutton(frame, text='Pin 18'
                 command=self.update,
                 variable=self.check_var, onvalue=True, offvalue=False)
        check.grid(row=1)
 
    def update(self):
        GPIO.output(18, self.check_var.get())
 
root = Tk()
root.wm_title('On / Off Switch')
app = App(root)
root.geometry("200x50+0+0")
root.mainloop()
 
 
cs
        
        [ start.sh 쉘스크립트 작성 ]
$ sudo nano start.sh
1
2
3
4
 
#!/bin/sh
openbox &
python /home/pi/gui_switch.py
cs
[ TFT-LCD에 띄우기 ]
$ sudo FRAMEBUFFER=/dev/fb1 xinit ./start.sh
       [인증 샷~~]



2. JAVA로 작성한 Swing UI로 띄우는 방법


  [목표]  java으로 작성안 UI 대화창을 TFT-LCD에 X윈도우 실행없이 바로 출력
    
    아래이 모든 작읍은 /home/pi에 작성한다.  
    
       [ Swing을 이용한 UI파일 작성 후 저장]
$ sudo nano hello.java

 
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
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
 
/**
 */
public class hello extends JFrame 
    implements ActionListener{
 
    JTextArea textArea;
    JButton buttonHello;
     
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
 
    private static void createAndShowGUI() {
        hello myFrame = new hello();
 
        myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         
        myFrame.prepareUI();
 
        myFrame.pack();
        myFrame.setVisible(true);
    }
     
    private void prepareUI(){
        textArea = new JTextArea();
        textArea.setEditable(false);
        JScrollPane panel = new JScrollPane(textArea);
        panel.setPreferredSize(new Dimension(300100));
         
        buttonHello = new JButton("Hello");
        buttonHello.addActionListener(this);
         
        getContentPane().add(panel, BorderLayout.CENTER);
        getContentPane().add(buttonHello, BorderLayout.PAGE_END);
    }
 
    @Override
    public void actionPerformed(ActionEvent e) {
        textArea.setText("Hello from Raspberry Pi");
    }
 
}
cs

        
        [ 컴파일 하기]
         hello.java파일이 있는 같은 폴더에서 실행
javac hello.java


        [ start.sh 쉘스크립트 작성 ]
$ sudo nano hello.sh
1
2
3
4
 
#!/bin/sh
openbox &
java hello
s
[ TFT-LCD에 띄우기 ]
$ sudo FRAMEBUFFER=/dev/fb1 xinit ./hello.sh
       [인증 샷~~]



신고


티스토리 툴바