[아이씨뱅큐 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
       [인증 샷~~]



[아이씨뱅큐 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. 관련상품

 

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

사용한 품목


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

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

 

서론


 이제 텔레그램 봇을 설치하기 위해서 라즈비안위에 서버를 구성해야한다. 처음에는 일반적으로 쉽게 접근 가능한 APM(Apache, PHP, Mysql)로 접근하려 했다. 일단 라즈베리파이에서 일반 PC보다는 성능이 낮기때문에 최대한 가벼운 프로그램을 설치하려고 찾아봤다. 그리하여 lighttpd, php, SQLite로 선택했다. SQLite는 본연의 가벼운 특성 덕분에 모바일을 넘어 PC의 응용프로그램에도 널리 사용되고 있다. 그래서 이번 기회에 SQLite로 한번 개발을 해보려고 선택했다. 또 lighttpd는 웹서버 사용순위 중에서 5위를 차지하지만 youtube나 wikipedia등에서 사용되고 있어서 선택했다. 이에 대한 정보를 아래 URL에서 참조했다.

http://www.hanbit.co.kr/network/view.html?bi_id=1385

http://gywn.net/2013/08/let-me-intorduce-sqlite/

 이제 lighttpd, php, SQLite를 이용하여 서버를 구축하여 텔레그램 봇을 만들기 위한 기반을 갖추도록 하자! 

설치


 

 먼저 아래 블로그를 참고했으며, 그 과정에서 설치하는 부분들에 대해 정리하도록 하겠다. 아래 블로그는 영어로 만들어져 있으므로 내가 한글로 포스팅하는 것이 약간의 의미가 있지 않을까?라는 생각을 하지만 사실 영어를 안보고 그림이랑 코드(명령어)만 봐도 충분하다 ㅎㅎ. 그래도 영어에 거리낌이 있으신 분들에게 약간의 도움이 되리라 믿는다. 

 

먼저 아래 블로그를 참고했으며, 그 과정에서 설치하는 부분들에 대해 정리하도록 하겠다. 아래 블로그는 영어로 만들어져 있으므로 내가 한글로 포스팅하는 것이 한국사람이 보는 것에 편리하리라 믿으며 포스팅한다. 사실 영어를 안보고 그림과 코드(명령어)만 보고 따라해도 되긴 한다 ㅎㅎ

https://www.scandio.de/2012/11/setting-up-a-lightweight-webserver-with-lighttpd-php5-and-sqlite3/

아래 명령어를 입력해서 업데이트를 해주자.  

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

 

그리고 apt-get으로 필요한 것들을 아래와 같이 다운받도록 하자.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1
sudo apt-get install lighttpd php5 php5-cgi php5-common php-pear php5-sqlite php5-dev vim
cs

위 명령어를 입력하면 아래와 같이 다운로드를 해도 되겠냐는 질문을 하고 Y를 입력하면 설치를 시작한다. 이 포스팅에서는 sudo를 사용하지 않기 위해 root로 설치했다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 그리고 아래 명령어를 입력해서 lighttpd 설정파일에 들어가 server.modules "mod_fastcgi"를 추가한다. vi나 vim을 이용할 때 conf파일을 처음부터 뒤적거리면 시간이 걸리니 / 을 이용하여 검색하도록 하자. 자세한 사항을 구글신에게 묻도록 하자!

1
vim /etc/lighttpd/lighttpd.conf
cs



그리고 lighttpd.conf파일의 마지막에 아래 그림과 같은 설정을 추가하도록 하자. 내 라즈비안의 lighttpd.conf파일의 경우 제일 마지막에 아래 그림과 같이 include에 있었다. 복사할 수 있도록 명령어도 첨부했다.

1
2
3
4
5
6
fastcgi.server = (
     ".php" => ((
            "bin-path" => "/usr/bin/php5-cgi",
            "socket" => "/tmp/php.socket"    
            ))
)
cs




아래 명령어를 입력해서 php.ini파일도 변경하도록 하자.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1
sudo vim /etc/php5/cgi/php.ini
cs

저번 포스팅에서 timezone을 Asia/Seoul로 셋팅했던 것처럼 이 ini파일에도 똑같이 설정해주면 된다. 주석처리가 되어 있으니 ;를 지워 주석을 없애주도록 하자. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1
2
3
cgi.fix_pathinfo = 1
date.timezone = Asia/Seoul
cs



이제 모든 설정이 끝났으니 아래 명령어를 통해 서버를 재실행하도록 하자. 일부러 이렇게 코드와 그림을 모두 넣는 이유가 설치할 때 복붙하니까 바로바로 할 수 있어서 좋았기 때문이다.
1
/etc/init.d/lighttpd restart
cs

 

자 이제 완성이다. 모두 설치가 끝났으니까 이제 설치가 완료?榮?지 테스트 해보기로 하자. 테스트는 php와 sql로 나눠서 테스트 한다. 먼저 php부터 보면 아래 파일을 /var/www/에 info.php로 만들어 확인하도록 하자. 리눅스 웹서버의 기본경로가 /var/www이나 /var/www/html인 것을 참고로 알고 있자.

 

1
vim /var/www/info.php
cs
1
2
3
    phpinfo();
?>
cs


이렇게 만들어준 info.php에 접근하기 위해서 127.0.0.1/info.php나 본인 IP/info.php를 누르면 아래와 같은 정보가 나온다. 시스템란에 라즈베리파이라는 정보도 나온다 ㅎㅎ 

 

이제는 SQLite를 테스트하도록 하자. SQLlite는 파일기반 데이터베이스이므로 SQLite 테스트 코드가 있는 폴더에 권한을 변경해줘야 한다. 이 사실을 참고한 상태에서 일단 아래와 같이 폴더를 하나 만들고 소스를 복사 붙여넣기하여 파일을 만들도록 하자. 실제 sqltest폴더가 만들어지는 경로는 /var/www/sqltest이고 현재 경로는 /var/www라는 것을 알고 있짜.

1
2
mkdir sqltest
vim sqltest/info.php
cs

 

 

 

 

 

 

 

 

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
try {    
    // Create file "scandio_test.db" as database    
    $db = new PDO('sqlite:scandio_test.db');   
     // Throw exceptions on error   
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);   
    $sql = <<<SQL
 CREATE TABLE IF NOT EXISTS posts (   
 id INTEGER PRIMARY KEY,   
 message TEXT,    
 created_at INTEGER
)
SQL;   
    $db->exec($sql);     
    $data = array(        
        'Test '.rand(010),        
        'Data: '.uniqid(),        
        'Date: '.date('d.m.Y H:i:s')    
    );     
    $sql = <<<SQL
INSERT INTO posts (message, created_at)
VALUES (:message, :created_at)
SQL;
   
    $stmt = $db->prepare($sql);    
    foreach ($data as $message) {        
        $stmt->bindParam(':message'$message, SQLITE3_TEXT);        
        $stmt->bindParam(':created_at'time());         
        $stmt->execute();
    }     
    $result = $db->query('SELECT * FROM posts'); 
    
    foreach($result as $row) {        
        list($id$message$createdAt= $row;        
        $output  = "Id: $id\n";        
        $output .= "Message: $message\n";        
        $output .= "Created at: ".date('d.m.Y H:i:s'$createdAt)."\n";         
        echo $output;
    }     
    $db->exec("DROP TABLE posts");
} catch(PDOException $e) {
    echo $e->getMessage();
    echo $e->getTraceAsString();
}
?>
cs

아래 코드를 복붙하여 만들고 난뒤에 아래 명령어로 sqltest폴더의 권한을 변경해주자. 권한을 변경해주지 않으면 에러가 발생하는 것을 아래 그림에서 볼 수 있다.

 

 

 

 

 

 

 

 

1
sudo chown -R www-data:www-data sqltest/
cs


그리고 위 폴더에 권한을 줬을 때 SQLlite가 php와 연동해서 lighttp에서 잘 동작하여 아래와 같이 데이터가 나오는 것을 확인 할 수 있다.

참고사항으로 위 설치에는 sqlite의 쉘 프롬프트를 설치 하지 않았기 때문에 sqlite를 쉘로 관리하기를 원한다면 아래와 같은 명령어를 입력해주도록 하자. 그러면 아래 그림과 같이 sqlite를 쉘로 관리 할 수 있다.

1
apt-get install sqllite3
cs

 


 php와 mysql의 연동을 웹페이지에서 쉽게 관리할 수 있도록 하는 것처럼 php와 SQLite의 연동을 웹페이지에서 쉽게 관리할 수 있도록 phpliteadmin을 설치하는 것도 괜찮다고 생각한다. 



마치면서


생각보다 설치하는데 많은 시간은 안들었지만 새로운 환경에서 코딩을 통해 뭔가를 만들 때 가장 처음 만나는 과제가 환경설정이다. 이 환경설정이 생각보다 쉽지 않은 경우에는 코딩을 한 줄도 적어보지도 못하고 포기하거나 삽질하다가 다음 기회로 미루게 된다. 이번 포스팅까지 기본적인 환경설정을 모두 마쳤으므로 다음 포스팅부터 텔레그램 봇을 만드는데 더욱 박차를 가할 수 있을거라 기대한다.

관련 상품


라즈베리파이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기] 라즈베이파이로 텔레그램 봇 만들기[1] - 기본 설정

[아이씨뱅큐 ICbanQ 파워블로거 2기] 라즈베이파이로 텔레그램 봇 만들기[1] - 기본 설정
 
 
 

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

사용한 품목


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

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

 

 

 

 들어가면서


 개인서버를 운영하고 싶다는 생각은 예전부터 계속해왔었지만, 서버를 운영하려고 현재 사용하고 있는 노트북에 서버를 올리면 느려질 것 같은 두려움이 있었다. 그렇다고 새롭게 서버를 위한 컴퓨터를 사는 것과 호스팅 업체의 서비스를 이용하는 것은 경제적인 어려움이 있었다그냥 안하겠다는 거 아닌가?!). 그리고 시스템 공부를 위해 리눅스 워게임 환경을 개인적으로 구축해서 외부 어디서든 접근하게 하고 싶었는데 가상머신에서 올린 상태에서 외부에서 접근하는 설정이 꽤 귀찮았다. 

 또, 망한 기운이 스물스물 풍기는 내 블로그에 활력을 넣고자 포스팅을 해야 한다는 생각도 계속 가지고 있었다. 하지만 위 개인서버의 구축에 대한 변명과 비슷하게 이미 답(포스팅하기 귀찮다?)은 내놓고 합리화만 하고 있었다.

 위의 두가지 복합적인 이유를 가지고 있으면서 고민만 하던 와중에 icbanq의 파워블로거 2기에 지원했는데, 당첨이 되었다. 아!! 드디어 개인서버를 가질 수도 있고, 지원을 받으면서 어쩔 수 없이 블로그에 글을 쓰게 되는 계기가 될 수 있을 거라 생각했다. 

 

 그래서 이 개인서버를 가지고 어떤 것을 하면서 포스팅을 할까 생각했다.

1) 퍼징 디비 서버 구축(물론 아직 퍼징을 제대로 시작한 것은 아니지만 ㅎㅎ)

2) 웹 서버를 구축하여 뭔가 재미난 일?!

 

 처음에는 그냥 퍼징 정보를 받는 서버를 구축하려고 했었는데, 불현듯 머리에 재미난 것이 떠올랐다. 나는 메모가 중요하다고 생각하는 사람중에 한 사람으로 생각날 때 마다 메모를 하는 습관을 길러야 겠다는 생각만(??!!) 했었다. 곰곰히 생각해보니 습관을 만들지 못한 이유는 여러번의 시도가 있었지만 정리가 되지 않아서였다. 어떤 날은 손으로 직접 메모를 하고, 어떤 날은 구글 드라이브에 메모하고, 어떤 날은 아이폰 메모장에 메모를 했다. 그러다보니 내가 저번에 메모했던 것을 어디에 저장했는 지 기억이 나지 않았고, 모두 다 찾아보기엔 내 귀찮음이 너무 컸다. 그래서 생각했다. 아 그냥 웹서버를 만들어 거기에 메모를 하면 되겠구나!. 하지만 편리하지 않으면 안될텐데? 라는 생각에 아 카카오톡 봇을 이용하면 되겠구나 라는 생각을 했다.

 하지만...역시 쉽지 않았다. 학부시절 카카오톡 봇에 관심이 많았는데 플러스친구는 인정해도 봇은 카카오측에서 인정하지 않고 있었지만, 혹시나 하는 맘에 봤지만 역시 ..ㅎㅎ


 역시 쉽게 되지 않긔...아.. 난 아마 안될거야..

 하지만 나에게 한줄기 희망이 떠올랐으니.. 그것은 텔레그램이었다. 그래. 텔레그램 봇을 만들면 뭔가 더 안전할 거 같으니 텔레그램 봇을 만들어보도록 하자. 이미 기존의 사람들이 만들어 둔 이야기들도 있으니 난 이것을 라즈베리파이 B+에 올리기만 하면 되...아 되겠지? ㅎ

 그러기 위해서는 먼저 라즈베리파이에 서버를 구축해야 한다. 기존의 봇프로그램들처럼 명령을 통해 어디서든지 메신저로 내가 원할 때마다 데이터(나의 경우에는 메모)를 저장하고 그 목록을 보여주는 기능이 필요하기 때문이다. 

 그러기에 앞서 나는 서버를 구축해 본 경험은 있지만 라즈베리파이 이용에는 초.보.자.이므로 내가 텔레그램 봇을 만들기 위해 했던 것들을 하나하나 포스팅할 계획이다. 그래서 이번 포스팅은 '라즈베리파이 B+에 라즈비안을 설치하고 네트워크 연결하기'다. 이 포스팅의 제목을 적는 데 엄청난 서론이 있었던 것에 양해를 구하며 본격적인 포스팅을 시작하도록 하겠다.


 라즈비안 설치하기



 먼저 라즈베리파이에 대한 설명은 아래 URL을 참조하도록 하다.

(엔하위키 미러는 언제나 재밌다)

https://mirror.enha.kr/wiki/라즈베리%20파이

 

 먼저 라즈베리파이에 대한 설명은 아래 URL을 참조하도록 하다.

(엔하위키 미러는 언제나 재밌다)

 

 이를 위해 먼저 라즈베리파이에서 하드디스크 역할을 하는 SD카드에 라즈비안 이미지를 써야 한다. 그러면 라즈베리파이가 SD카드에서 라즈비안 이미지를 읽어와 부팅한다. 이미지는 아래 라즈베리파이 공식 사이트에서 받을 수 있다.

https://www.raspberrypi.org/downloads/


라즈비안 이미지를 다운받자

 

 위에서 받은 라즈비안 이미지를 SD카드에 쓰기전에 구성을 살펴보도록 하자. 라즈베리파이는 micro SD카드를 저장장치로 이용하기 때문에 데스크탑에 인식시키기 위해서 adapter가 필요하다. 아래 그림은 micro SD카드와 micro SD Adaptor의 크기를 비교한 그림으로 그 밑은 adaptor에 삽입하는 그림이다.


microSD Adaptor와 mircro SD카드 크기 비교

microSD Adaptor에 mircro SD카드 삽입

 

 SD카드를 삽입한 adaptor에 아래 그림와 같은 데스크탑의 SD카드 인식단자에 넣도록 하자. 

 

SD카드 인식단자(접사(?)하여 다소 부담스럽다)


 이제 데스크탑에 sd카드 인식시키는 것을 완료했으므로, 이 sd카드에 라즈비안을 저장하기 위해  'Win32 Disk Imager' 라는 프로그램이 필요하다. 방금 포스팅을 하다가 생각이 난 것인데, 영어와 한글을 같이 쓰면 줄간격이 내가 설정한 것과 달리 좁게 설정된다. 각설하고 이제 이 프로그램으로 방금 다운로드 받은 라즈비안 이미지를 SD카드에 덮어쓰도록 하자. 라즈베안 이미지를 위치를 지정하기 위해 오른쪽 폴더아이콘을 클릭하자. 그리고 SD카드가 인식된 것을 DEVICE에 [F:\]라는 표시에 나타는 것으로 확인 할 수 있다.

Win32 Disk Image로 라즈비안을 SD카드에 쓰기

 

 

 라즈비안 기본설정


 이제 sd카드를 라즈베리파이에 넣고 부팅하도록 하자. 부팅하면서 config를 변경해야 하는데 이 내용은 아래 URL에서 참조하면 되겠다. 

http://echo.tistory.com/34

 

 필요한 것만 정리하자면 아래와 같다. 1번째는 당연히 SD카드의 용량을 더 크게 사용하기 위해서 설정해줘야 한다. 단순히 enter한번으로 가능하다. 그리고 2번의 user password도 보안을 위해 변경해주도록 하자. 3번은 명령창[일반적인 cmd]으로 부팅할 것인지 GUI[그래픽 모드-ex)윈도우]로 부팅할 것인지 정하는 것이므로 GUI를 선택한다. 4번은 언어와 지역 시간,키보드를 설정하는 것이 있는데 이는 밑에 다시 할 것이니 패스하도록 한다. 마지막으로 8번은 외부에서 ssh로 접근하기 위해 ssh server를 enable 하도록 한다.

 

1. Expand Filesystem - SD카드 용량 확장
2 Change User Password - 사용자 패스워드 변경( 기본 id:raspberry/ pw:pi)
3. Enable Boot to Desktop/Scratch - CUI, GUI, Scratch로 부팅 설정
4. internaltionalisation Option - 언어, 지역 시간 변경을 위한 것 - 패스
8. Adavanced Option - ssh 옵션만 enable

부팅 시 초기설정 요약

 

 네트워크를 설정하기 위해 vi로 들어가서 #을 누르려고 하는데 안된다. 이는 라즈베리파이가 영국에서 만들어져 기본 셋팅이 GB(Great Britain?)으로 되어 있다. 그러므로 키보드 셋팅과 언어셋팅을 바꿔주도록 하자. 아래 블로그에 잘 나와있다. dpkg-reconfigure는 꽤 천천히 나타나므로 나처럼 성격이 급해서 몇번을 껐다가 다시 키는 불상사는 없었으면 한다. 또 dpkg에서 스크롤이나 방향키를 눌러서 이동하는 것보다 바로 ko_KR.UTF-8로 가기 위해 k를 누르고 Asia로 가기 위해 A, Seoul로 가기 위해 S를 눌러 바로 커서를 이동시키자!

http://ckbcorp.tistory.com/709

 

1. 키보드
sudo nano /etc/default/keyboard
GB를 ->ko로 바꿔줌
2. 언어
sudo dpkg-reconfigure locale
ko_KR.UTF-8로 설정
3. 지역시간(timezone)
sudo dpkg-reconfigure tzdata
Asia>Seoul

키보드, 언어, 시간 설정 요약

 

 이제 막바지에 접어 들었다. 라즈비안을 설치하고 기본설정을 했다. 이제 네트워크 연결을 해보도록 하자. 아래 블로그에 잘 나와있다.

 

http://www.rasplay.org/?p=1516

 

 요약하자면 크게 2가지로 나뉘는데 network설정과 dns설정이다. network설정은 /etc/network/interfaces 에서 하고 dns설정은 /etc/resolv.conf에서 하도록 하자. 위 블로그에 워낙 잘 나와있으므로 직접 들어가 그림을 보면서 금방 이해하도록 하자. 

 

 이렇게 모든 셋팅이 끝나면 ssh로 접속가능하고 아래와 같은 화면이 나온다. 아래 화면은 내 노트북에서 ssh로 접속한 화면이다. 이상으로 본 포스팅을 마치도록 하겠다.

 

▲노트북에서 ssh로 접속 

마치면서


 지금까지 라즈베리파이에 텔레그램 봇을 만들기 위해서 라즈비안을 SD카드에 쓰고 네트워크가 되도록 기본설정하는 것들을 봤다. 부팅 기본설정과 키보드/언어/지역시간 설정, 네트워크 설정을 했었다. 나 또한 초.보.자.이므로 라즈비안을 셋팅하면서 알아가면서 소소한 재미를 느꼈고, 차근차근 하나하나 알아가는 재미를 느끼길 기대한다. 

 

 

관련 상품


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

 

무상체험단 27기 모집 : 바나나프로

안녕하세요, 아이씨뱅큐 icbanq 입니다!

 

저희가 여지껏 많은 제품들로 체험단을 진행하였었는데요..

많은 분들께서 관심 가져주셔서 꾸준히 이어지고 있습니다!

 

그래서 이번에는 꾸준히 인기를 얻고있는!! 보드의 체험단을 준비하였습니다~

 

기본적으로 라즈베리파이 호환이 가능한데, 듀얼코어에 SATA포트 지원,

내장된 와이파이까지 그 기능이 정말 다양합니다!

다른 보드들과 비교하기 딱이지 않나요?

 

 

 

 

Banana pro Spec

 

 

 

 

27기 아이씨뱅큐 ICbanQ 무상체험단 모집,

아래 이미지를 클릭하시면 좀 더 자세한 정보 확인이 가능하며 신청도 할 수 있습니다.

기타 문의사항은 담당자를 확인해 주세요!

 

김 효민 담당자

070 7019 3930

alicia@icbanq.com

 

 

 

 

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

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

 

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

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

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

 

 

 

 

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

 

 

무상체험단 26기 모집! 오렌지파이 미니2

어느덧 벌써 무더운 여름이 성큼 찾아왔습니다.

가만히 있어도 땀나는 이 여름, 집에서 오렌지파이와 놀아보는건 어떠세요? ^^

 

 

보드들의 전쟁이라고 불릴만큼 많은 보드들이 출시되고 있습니다.

새로운 보드에 도전하시고 그 파워를 눈으로 확인해 보세요!

26기 아이씨뱅큐 (ICbanQ) 오렌지파이 미니 2 무상체험단 모집!

관심있으신 분들은 빨리 클릭클릭! 

 

 

 

CPU

H3 Quad-core Cortex-A7 H.265/HEVC 4K

GPU

·Mali400MP2 GPU @600MHz
·Supports OpenGL ES 2.0

Memory (SDRAM)

1GB DDR3 (shared with GPU)

Onboard Storage

TF card (Max. 64GB) / MMC card slot

Onboard Network

10/100M Ethernet RJ45

Video Input

A CSI input connector Camera:

Supports 8-bit YUV422 CMOS sensor interface

Supports CCIR656 protocol for NTSC and PAL

Supports SM pixel camera sensor

Supports video capture solution up to 1080p@30fps

Audio Input

MIC

Video Outputs

Supports HDMI output with HDCP

Supports HDMI CEC

Supports HDMI 30 function

Integrated CVBS

Supports simultaneous output of HDMI and CVBS

Audio Output

3.5 mm Jack and HDMI

Power Source

DC input can supply power, but USB OTG input don’t supply power

USB 2.0 Ports

Four USB 2.0 HOST, one USB 2.0 OTG

Buttons

Power Button(SW4), Recovery Button(SW2)

UBoot Button(SW3)

Low-level peripherals

40 Pins Header,compatible with Raspberry Pi B+

GPIO(1x3) pin

UART, ground.

LED

Power led & Status led

Key

IR input,UBOOT,POWER

Supported OS

Android Ubuntu, Debian, Rasberry Pi Image

 

http://www.icbanq.com/shop/event_list.asp?number=297&paging=&b_type=EVENT#eventTop