OrangePi 를 Telegram Bot 으로 활용하는 방법~


Telegram 은 카카오톡과 같은 메신저라고 생각하면 되는데,

API 가 잘 Open 되어 있어 다양하게 활용되고 있다.


Telegram Bot 은 사람이 아닌 Telegram User 로 생각하면 되는데, 

서버에서 구동하는 Code 로 사람인 User들과 interface 를 담당한다.


아래는 Python 기반의 telepot 을 사용해 telegram bot 을 만드는 방법이다.

우선 python을 설치 해 주고, package install 을 위해 pip 도 설치해 준다.

$ sudo apt-get install python python-pip python-dev build-essential

repository 에서 pip를 찾을 수 없는 경우 아래와 같이 설치 하면 된다.

$ sudo apt-get install python-setuptools

$ sudo easy_install pip

pip 로 telepot 을 설치 한다.

$ sudo pip install telepot

$ sudo pip install telepot --upgrade


telepot 을 설치하면 telepot 을 import 해 python 코드를 만들면 된다.

이때, telegram bot 에 할당되는 Token 이 필요한데, token 은 BotFather 에게 발급 받으면 된다.

telegram 메신저로 @BotFather 에게 /newbot 이라 메시지를 보내면 BotFather가 token을 발급해 준다.


아래는 telepot 을 활용한 기본적인 Bot code이다. (메시지를 보내면 같은 메아리를 보내준다.)

Bot.py

import sys

import time

import telepot


def handle(msg):

content_type, chat_type, chat_id = telepot.glance(msg)

print(content_type, chat_type, chat_id)


if content_type == 'text':

bot.sendMessage(chat_id, msg['text'])


TOKEN = 'INPUT YOUR OWN TOKEN HERE'


bot = telepot.Bot(TOKEN)

bot.message_loop(handle)

print('Listening ...')


while 1:

time.sleep(10)

* https://recall2300.github.io/2017-01-01/telegram-bot/ 을 참고하였슴다

아래와 같이 python 을 실행하여 Listening ... 이 출력되고, telegram 으로 나의 Bot에게 메시지를 보냈을 때 메아리가 들려오면 이상 무!

$ python bot.py


'Programming > OrangePi' 카테고리의 다른 글

sftp 네트워크 드라이브 연결  (0) 2018.04.05
OrangePi Plus 2 + SATA  (0) 2017.10.02
OrangePi Fan on GPIO  (0) 2017.09.15
U+ 공유기 포트포워딩 문제  (0) 2017.09.09
OrangePi Plus 2 Ubuntu 설치  (0) 2017.06.17

OrangePi Plus 2의 발열문제는 심각하다고 알려져있기에...

Aliexpress 에서 애초에 OrangePi 를 주문할 때 같이 아크릴케이스+Fan을 주문했다.

(1.6GHz 이상에서 발열문제가 심각하다고 하여, ARMBIAN에서 1.2GHz정도로 CPU frequency를 제한해 놓아서 실제로 사용하는데 큰 문제가 되진 않는다.)


FAN GPIO에 연결하여 Air Cooling 을 해주고자 하는데,

문제는 FAN이 겁나 시끄럽다.

발열도 발열이지만 시끄러워서 못쓰겄다.


저항을 달아 FAN 소리를 조금 잡아주는 방법도 있겠지만(저항을 추가 하더라도, 소리는 여전히 신경이 쓰인다.),

보다 나은 방법으로 CPU 온도가 높을 때만 FAN 이 동작하도록 하고 싶다.


H3 chip의 GPIO를 사용하는 python library 가 있지만, 뭔가 동작이 잘 안된다 싶어 코드를 짰다.

본인이 사용하는 환경은, Ubuntu 16.04 기반의 ARMBIAN5.38, 커널버전 3.4.113-sun8i 이다.


사용 방법

 - HW setting

OrangePi 의 GPIO 는 FAN 을 구동시키기에 충분한 전류를 흘려주지 못한다.(GPIO로 HIGH output을 주더라도 FAN이 돌아가지 않는다.) 

따라서 전원은 5V와 GND 를 사용하면서, Control 은 릴레이를 사용하여야 한다. 

사용하고자 하는 릴레이는 아래와 같다.

아두이노용 1 채널 릴레이 모듈을 검색하면 구매 할 수 있다.(알리 익스프레스 등에서)

Image result for 1 ch relay module

가운데 네모난 부분이 릴레이 인데, 릴레이 스펙에 따라 컨트롤 가능한 전압 범위가 다르지만, 왠만하면 작은 FAN 동작을 제어하는데는 문제가 없다.

그림의 왼쪽 부분은 output으로, NO는 Normally Opened, COM은 Common port, NC는 Normally Closed를 뜻한다.

그림의 오른쪽 부분은 input 으로, VCC는 3.3V(OrangePI의 GPIO는 3.3V), GND는 gnd 핀에 연결하면 된다. SIG는 IN으로 적혀있기도 한데, control하는 signal 이다. SIG가 HIGH일 때는 COM 과 NO 가 연결되고, LOW일 때는 COM과 NC가 연결 된다. 따라서, IN은 Control할 핀인 PA13과 연결하고, COM은 5V, NO와 FAN의 빨간선, FAN의 검은선은 gnd로 연결해주면 된다. NC는 연결하지 않아도 된다.


아래와 같이 회로를 구성하면 된다.

<회로 사진>


참조: https://m.blog.naver.com/PostView.nhn?blogId=eduino&logNo=220884752484&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F


 - 코드

우선, ARMBIAN 의 기본 Configuration은 GPIO를 꺼놓은 상태이므로, sunxi-tools를 활용해 GPIO를 enable 한다.

부팅 시, /boot/script.bin 파일을 읽어 Configuration을 확인하는데, sunxi-tools를 사용하면 script.bin 파일을 수정할 수 있다.

참조: http://linux-sunxi.org/GPIO


sunxi-tools에서 제공하는 bin2fex 를 이용해 binary 파일을 수정할 수 있게 fex 파일로 conversion 하고

fex 파일에서 GPIO 를 enable 시켜준 후

다시 sunxi 에서 제공하는 fex2bin 을 이용해 binary 파일로 conversion 해야 한다.


우선 bin2fex / fex2bin 을 사용하기 위해 linux-sunxi github 로 부터 sunxi-tools 소스를 fetch 한다. (사실 bin2fex, fex2bin 은 같은 파일이다.)

sudo apt-get update

sudo apt-get install libusb-1.0-0-dev

$ git clone https://github.com/linux-sunxi/sunxi-tools

fetch 한 sunxi-tools 소스를 make 한다.

$ cd sunxi-tools

$ make

보다 편리한 사용을 위해 path 를 설정한다.

$ export PATH=$PATH:$PWD

/boot/script.bin 파일을 fex 로 conversion 한다.(/boot/script.bin 파일이 심볼릭링크로 /boot/bin/orangepiplus.bin 으로 연결되어 있으니 orangepiplus.bin 을 conversion 하면 된다.)

$ cd  /boot/bin

$ sudo bin2fex orangepiplus.bin orangepiplus.fex

fex 파일을 열어 필요한 부분을 수정하면 된다.


이때, fex 가이드, Expansion port 정보GPIO pinout 을 참고하자. 

$ sudo vi orangepiplus.fex

orangepiplus.fex

...

[gpio_para]

gpio_used = 1

gpio_num = 1

gpio_pin_1 = port:PA13


...

수정이 끝나면, fex 파일을 다시 binary 파일로 conversion 해주자

$ sudo fex2bin orangepiplus.fex orangepiplus.bin


재부팅 하면 바뀐 설정이 적용되어 GPIO 를 사용할 수 있게 된다.

아래와 같이 모듈을 불러오면, /sys/class/gpio_sw 디렉토리가 생성되고, 해당 디렉토리에는 위의 fex에 포함한 GPIO포트가 생성된다.

$ sudo modprobe gpio-sunxi

해당하는 GPIO포트에 대해 data값을 write하게 되면 GPIO의 output(HIGH/LOW)이 바뀌게 된다.

$ echo 0 | sudo tee /sys/class/gpio_sw/PA13/data

초기 설정은 output / low_active 상태인 듯 하다. data 에 0을 써주면 output 으로 HIGH가 된다.

cfg 는 direction(input/output) 이라고 하는데(참조), 초기값이 0이다. output이 0인듯...


이제 모든 설정은 끝났으니,

cpu 온도에 따른 Fan control 만 해주면 된다.


cpu 온도는 아래와 같이 확인 할 수 있다.(파일에 주기적으로 쓰여진다.)

$ cat /sys/class/thermal/thermal_zone0/temp

그러므로 우리는 script 에서 주기적으로 온도가 써지는 파일을 읽어 그에 따라 Fan 을 On/Off 시켜주면 된다.


Fan_on_GPIO.sh

#!/bin/bash


if [ $EUID -ne 0 ]

then

echo "Pleas run as root"

exit

fi


TEMP_TRHES=70


modprobe gpio-sunxi

sleep 10s


while [ 1 ];

do

CUR_TEMP=`cat /sys/class/thermal/thermal_zone0/temp`

#echo $CUR_TEMP

if [ $CUR_TEMP -ge $TEMP_TRHES ]

then

#echo "Turn on FAN"

echo 0 | sudo tee /sys/class/gpio_sw/PA13/data > /dev/null

else

#echo "Turn off FAN"

echo 1 | sudo tee /sys/class/gpio_sw/PA13/data > /dev/null

fi

sleep 10s

done


'Programming > OrangePi' 카테고리의 다른 글

sftp 네트워크 드라이브 연결  (0) 2018.04.05
OrangePi Plus 2 + SATA  (0) 2017.10.02
OrangePi 에 Telegram Bot 구축하기  (0) 2017.09.16
U+ 공유기 포트포워딩 문제  (0) 2017.09.09
OrangePi Plus 2 Ubuntu 설치  (0) 2017.06.17

외부에서 ssh 등으로 OrangePI 에 접속을 하고자 하는데....

U+ 공유기(CAPD-6000)에서 포트포워딩/DMZ 등이 원하는 동작을 해주지 않는다.


인터넷 검색 결과 U+에서 일부 포트를 외부에서 접근 불가능 하게 제한해 놓았기 때문이라 하여

고객센터에 문의 결과


따라서 DMZ/Super DMZ 설정을 하더라도 위에 해당 하는 포트는 외부에서 접근 불가능

외부에서 접근 하는 포트를 위에 해당하지 않는 포트로 우회하여 접근 해야 한다.


공유기/통신사에 따라 막아놓은 포트가 다를 수 있으니,

통신사에 확인하시길...

'Programming > OrangePi' 카테고리의 다른 글

sftp 네트워크 드라이브 연결  (0) 2018.04.05
OrangePi Plus 2 + SATA  (0) 2017.10.02
OrangePi 에 Telegram Bot 구축하기  (0) 2017.09.16
OrangePi Fan on GPIO  (0) 2017.09.15
OrangePi Plus 2 Ubuntu 설치  (0) 2017.06.17

Ubuntu 를 사용 할 때, 

각 종 프로그램을 다운 받거나 설치하기 위한 apt의 repository 를 어떻게 해야하나 고민이 된다.


잘은 모르겠지만, 복잡한 것은 싫을 때 사용할 만한 sources.list generation 사이트를 소개한다.

https://repogen.simplylinux.ch/

위 링크에 접속하면, 나라 / Ubuntu release / Ubuntu Bransches / Ubuntu Updates 등만 설정하면 그에 알맞는 sources.list 파일을 생성해 준다.

그 외에 널리 사용되는 PPA 도 추가 할 수 있다.


비교적 최신(아마도, 현재 Ubuntu에서 공식적으로 지원하는 release 만) 선택 할 수 있는 듯 하지만,

손쉽게 sources.list 를 생성 할 수 있어 편리하다.


위 링크에서 처음 제대로 알게된 Main / Restricted / Universe / Multiverse 의 차이

Main : Ubuntu 공식 supported Software

Restricted : supported Software 이지만, 완전 free license는 아님

Universe : 널리 사용되지만, 공식 supoort는 아님

Multiverse : free가 아님


Security : 중요 security update

Updates: : recommended update

Proposed : pre-relased update

Backports : unsupported update


Main + Universe + Security 만 선택해 generate 해도 별 문제 없이 사용할 듯 하다.


생성된 sources.list 는 나라를 South Korea 로 선택시

kr.archive.ubuntu.com 으로 생성 되지만,

보다 빠른 ftp.daumkakao.com 으로 변경하여 사용하면 더 빠르게 다운 받을 수 있다.


Vi 기준

:%s/kr.archive.ubuntu.com/ftp.daumkakao.com/g


'Programming > Linux' 카테고리의 다른 글

HandBrakeCLI  (0) 2018.04.06
Linux sed  (0) 2018.02.05
Linux find  (0) 2018.02.04
Ubuntu Redshift  (0) 2017.07.02
Linux timezone  (0) 2017.06.20

Bash Script 에서 Script 에 관한 문법


Bash Script 에서 따로 자료형을 입력하지 않아도, initial value 가 string 형태의 경우 string 자료형으로 인식한다.


1. String Length

${#string} : string 의 길이 

expr length $string


2. Substring

${string:position} : string 의 앞에서 부터 position 의 위치 부터 string의 끝까지의 substring (position은 0부터 시작한다.)

${string:position:length} : string 의 앞에서 부터 position 위치 부터 length 길이의 substring


참조

http://tldp.org/LDP/abs/html/string-manipulation.html


'Programming > Bash Script' 카테고리의 다른 글

Bash Script Variable Split by Space  (0) 2018.02.04
Bash Script Echo  (0) 2018.02.04
Bash Script If statement  (0) 2017.07.04
Bash script argument  (0) 2017.06.20
Bash script sudo 권한 체크  (1) 2017.06.19

Bash Script If statement

Bash 스크립트 if 조건문 문법

기본적으로, if / elif / else / fi 로 구성한다. 

if[] bracket 사이에는 공백이 있어야 하며, [] bracket 과 [[ ]] double bracket( ) paranthesis 는 다를 수 있으므로 주의하자.

if [ expression ]

then

statement

elif [ expression ]

then

statement

else 

statement

fi


expression 에 사용하는 Comparison 은 아래와 같다.

integer comparison

if [ "$a" -eq "$b" ]  : 같음(equal to)

if [ "$a" -ne "$b" ]  : 다름(not equal to)

if [ "$a" -lt "$b" ]  : 작음(less than)

if (( "$a" < "$b" ))

if [ "$a" -gt "$b" ] : 큼(greater than)

if (( "$a" > "$b" ))

if [ "$a" -le "$b" ] : 작거나 같음(less than or equal to)

if (( "$a" <= "$b" ))

if [ "$a" -ge "$b" ] : 크거나 같음(greater than or equal to)

if (( "$a" >= "$b" ))


string comparison

if [ "$a" == "$b" ]  : 같음(equal to)

if [ "$a" = "$b" ] ※ = 양쪽 모두 빈 칸 이여야 함

if [ "$a" != "$b" ]  : 다름(not equal to)

if [ -z "$a" ] : string 이 null 이 아님(즉, 0이 아닌 길이가 있는 string)


if statement 에 not 을 사용하고자 하는 경우 ! 를 사용하면 된다.

if ! [ "$arg" -eq "matching" ]

then

echo "Not matched with the first one"

fi


If statement 를 사용해 file 존재 유무 확인

if [ -d <DIR> ] : Directory 가 존재

if [ -f <FILE> ] : 파일이 존재하며, directory 가 아님

if [ -x <FILE> ] : 파일이 실행 가능함

if [ -f test.c ]

then

echo "File test.c exists!"

else

echo "File test.c does not exist"

fi


If statement  Logical AND, OR 문법

if [[ condition1 && condition2 ]] : Logical AND

if [ condition1 ] && [ condition2 ]

if [ condition1 -a condition2 ]

if [[ condition1 || condition2 ]] : Logical OR

if [ condition1 ] || [ condition2 ]

if [ condition1 -o condition2 ]

if [[ condition1 && condition2 ]] || [[ condition3 && condition4 ]]

then

echo "Condition (1 AND 2) OR (3 AND 4)"

fi



참조

http://tldp.org/LDP/abs/html/comparison-ops.html

'Programming > Bash Script' 카테고리의 다른 글

Bash Script Variable Split by Space  (0) 2018.02.04
Bash Script Echo  (0) 2018.02.04
Bash Script String  (0) 2017.07.04
Bash script argument  (0) 2017.06.20
Bash script sudo 권한 체크  (1) 2017.06.19

시력 보호를 위해 모니터의 색온도를 조절하여 사용하는 사람들이 많이 있다.

Windows 에서는 Flux 라는 프로그램을 사용하는데,

Ubuntu 에도 Flux 가 있지만, 원하는 동작을 제대로 해주지 않는다.


Flux 대신 Redshift 를 사용하면

보다 편하게 화면의 색온도를 설정할 수 있다.

Redshift 는 Ubuntu 12.04 버전 이후로 사용할 수 있다.


설치 방법

sudo apt-get install redshift-gtk

※Debian: sudo apt-get install redshift


Redshift 를 설치 후 아래의 명령어로 색온도를 설정 할 수 있다.

$ redshift -o <temperature>


다른 많은 옵션도 있지만, 버그가 있는지 잘 안되는 명령어도 있는 듯하다. 다양한 옵션을 man 으로 확인 할 수 있다.

그냥 단순히 색온도를 설정해서 사용하기엔 편리하다.

 


'Programming > Linux' 카테고리의 다른 글

HandBrakeCLI  (0) 2018.04.06
Linux sed  (0) 2018.02.05
Linux find  (0) 2018.02.04
Ubuntu sources.list generation  (0) 2017.09.06
Linux timezone  (0) 2017.06.20

Xilinx bootgen 을 이용해 boot.bin 파일을 생성하면,

boot.bif 에 담긴 파일들(FSBL, bitstream, u-boot)이 boot.bin 으로 합쳐진다.


따라서, 해당 파일들을 boot partition에 넣을 필요 없이,

boot.bin 만 넣어주면 문제 없이 작동한다.

'Programming > Verilog' 카테고리의 다른 글

AXI Register Slice  (0) 2020.02.12
Verilog Generate  (2) 2018.07.05
Xilinx SDK disable cache  (0) 2017.06.12
Xilinx Vivado IP import  (0) 2017.05.31
Xilinx Vivado Project가 안 열릴때  (0) 2017.05.30

extern keyword 


일반적으로 전역 변수를 선언 하면, 한 파일 내에서 전역 변수로 접근이 가능하다.

다른 파일에서 선언된 전역 변수를 접근하기 위해서는 extern keyword 를 사용한다.


사용법은 간단하다.

전역 변수 선언 시 일반적으로 선언 하듯 선언 하고,

접근하고자 하는 다른 파일에서 data type 앞에 extern 을 선언하면, 접근이 가능하다.

int a=5;


extern int a;

printf("a=%d in other file", a);

//print result

//a=5

extern keyword 를 사용하면 다른 파일에서 접근이 가능하기 떄문에, 즉, 다른 파일에서 해당 이름의 변수를 가지고 있기 때문에

같은 이름의 변수를 두 개를 가지는 등의 의도치 않은 동작을 할 수 있다.

사용 시에 주의가 필요하다.


extern keyword 의 또다른 사용법이 있다.

C++ 파일을 사용하는데, C로 된 파일/함수 등을 include 하고 싶은 경우!

extern "C"{

#include <stdio.h>

void foo();

}


'Programming > C Language' 카테고리의 다른 글

static  (0) 2018.07.13
가변 인자(variable arguments) stdarg.h  (0) 2017.12.11
static  (0) 2017.06.20
Floating Point Bit 출력 방법  (0) 2017.06.08
전처리기 명령어  (0) 2017.06.07

static Keyword


기본적인 C/C++ 프로그래밍에서 흔히 사용하는 키워드는 아니다.

하지만, Code 가 여러 파일로 구성되고, 여러 파일에서 서로 참조하고 왔다갔다하면서 부터 사용하게 되는 keyword 일 수 있다.


static 은 정적 변수라고 하는데, 

함수 내부에 선언하는 지역 변수는 그 지역이 사라지면서, 함께 사라지는데 이를 방지 하기 위한 keyword 이다.

함수 내부의 변수를 data type 앞에 static 을 붙여 선언하면, 메모리 위치에서 사라지지 않아, 

다음에 함수가 call 되더라도 이전 값을 유지하고 있다.

다만 여전히 지역 변수이기 때문에, 해당 함수에서만 읽고 쓸 수 있다.

static 으로 선언한 변수의 initialize 는 처음 한 번 만 실행 된다.

void function(){

static int a = 1;

print("%d\t", a);

a++;

}


int main(){

function(); //print result : 1

function(); //print result : 2

function(); //print result : 3

return 0;

}


'Programming > C Language' 카테고리의 다른 글

static  (0) 2018.07.13
가변 인자(variable arguments) stdarg.h  (0) 2017.12.11
extern  (0) 2017.06.21
Floating Point Bit 출력 방법  (0) 2017.06.08
전처리기 명령어  (0) 2017.06.07

+ Recent posts