보통 다른 언어에서는 숫자 자료형이 세분화되어 있다. C++의 예를 들면 byte, short, int, long, float, double 등등 정수냐 실수냐에 따라 또는 표현 범위에 따라 숫자 자료형이 세분화 되어 있으며 JAVA, C# 같은 언어도 마찬가지이다. 반면 루아에서는 그냥 숫자형(number로 표기된다) 하나이고 내부적으로 모든 숫자를 double 형 데이터로 처리한다.


print( type(1) )
print( type(1.1) )
print( type(1.1e34) )
실행결과
number
number
number


print()함수는 표준출력(보통은 화면)을 하는 내부함수이고 type()은 넘겨진 자료의 자료형 반환하는 내부함수이다. 따라서 print( type(x) ) 는 x의 자료형을 출력하는 명령이다. 위에서 정수 1도 number, 실수 1.1도 number, 1.1e34(지수적 표기법으로 1.1x1034을 나타낸다.)도 number이다. 모두 다 동일한 숫자형(number)라는 것을 알 수 있다.

 똑 같은 일을 변수를 이용하여 작성해 보면 다음과 같다.


a = 1 -- 변수 a에 정수 1을 대입
b = 1.1 -- 변수 b에 실수 1.1을 대입
c = 1.1e34 -- 변수 c에 정수 1.1 x 1034 을 대입
print(type(a)) -- ‘number’ 가 출력된다.
print(type(b)) -- ‘number’ 가 출력된다.
print(type(c)) -- ‘number’ 가 출력된다.


이 예에서 보면 a=1 이라고 하면 변수 a에 1을 대입하라는 것이고 b=1.1은 변수 b에 1.1.을, c=1.1e24는 변수 c에 1.1x1034을 대입하라는 것이다. 변수명은 이전 포스트에서 설명한 식별자 규칙에 의해서 만들어져야 한다. print( type(a) )는 변수 a에 담겨진 데이터의 자료형을 출력하라는 명령이 된다. 변수 a에는 1이 들어가 있으므로 number 가 화면에 출력된다.

 이와 같이 루아에서는 숫자 자료형은 하나밖에 없다. 루아는 내부적으로 정수도 double형이고 실수도 double형으로 처리된다. 일견은 메모리 낭비같이 여겨지기도 하지만 현대의 컴퓨팅 환경에서는 크게 중요한 문제는 아니고 이를 통해서 데이터 처리의 단순함을 얻을 수 있다.



Posted by 살레시오
,

 식별자(identifier)는 변수명이나 함수명 등을 만들때 사용된다. 루아의 식별자를 만드는 규칙은 다음과 같다. (C/C++과 동일하다.)


  1. 영어 대소문자(a~z, A~Z), 숫자(0~9), 언더바(_)로만 조합한다.

  2. 숫자로 시작하거나 공백문자를 포함할 수 없다.

  3. 미리 정의된 예약어(keyword)는 사용하면 안된다.


다른 언어에서와 마찬가지로 식별자는 대소문자를 구별한다. 즉, 대문자 A와 소문자 a는 서로 다른 것으로 구별된다. 식별자는 에를 들면 다음과 같은 것들이다.


x, vla, number, _hello, abc, id123, ch_4_5, name_of_that, _image, __sound


루아의 예약어는 프로그램에서 의미를 갖는 단어로서 다음과 같은 것들이 있다.


and, break, do, else, elseif, end, false, for, function, if, in local, nil, not, or, repeat, return, then, true, until, while


또한 예약어 외에 전역 함수(혹은 객체)에 사용되는 식별자도 사용하면 안되며 다음과 같은 것들이 있다.


_G, _VERSION, getmetatable, tostring, assert, io, rawlen, string, load, bit32, pairs, rawset, select, coroutine, tonumber, next, type, table, xpcall, error, utf8, debug, collectgarbage, math, rawget, os, pcall, ipairs, rawequal, print, setmetatable


이러한 규칙에 따라서 식별자를 만들어야 한다.



Posted by 살레시오
,

루아(Lua)언어 기초 문법

 1. 루아(Lua) 개요

 2. 식별자(identifier)

 3. 숫자형 데이터

 4. 산술연산자

 5. 부울형 데이터와 조건연산자

 6. 문자열과 '..' 연산자

 7. 루아의 nil

 8. 조건분기문 if ~ then ~ end

 9. 중첩된 조건문을 위한 elseif와 else 명령

10. 논리연산자 and, or, not

11.


2장 루아의 제어문


2.1 루아의 if ~ elseif ~ else ~ end 제어문

2.2 루아의 for ~ do ~ end 반복문

2.3 루아의 while ~ do ~ end 반복문


3장 루아의 함수


3.1 함수의 정의

3.2 지역변수/전역변수


4장 루아의 테이블


4.1 테이블 정의

4.2 

4.2


'주제별 글목록' 카테고리의 다른 글

전기전자기초실험  (2) 2016.08.28
C언어 기초  (0) 2016.01.28
자바스크립트(JS) 강좌글 모음  (0) 2016.01.23
라즈베리 파이 (raspberry pi) 기초 및 응용  (0) 2015.12.23
C# 강좌 모음  (0) 2015.08.01
Posted by 살레시오
,

구입한 아이패드 프로가 도착해서 몇 가지 사용기를 남겨보고자 한다. 애플펜슬과 전용 키보드도 같이 받았다.



일단 지문인식으로 비번 입력을 대시하는 기능은 의외로 편했다. 홈버픈에 지문인식 센서가 들어가 있다.


전용 키보드는 생각과 달리 전체를 ㄷ자로 덥는 게 아니었다. 한 면만 가려주고 키보드를 사용할 때는 아이패드를 세워둘 수 있어 편하다. 아이패드와는 자석으로 결합된 상태에서 3핀 연결단자로 연결이 된다. 블루투스방식이 아니라 직접 연결하는 방식이다. 일반 키보드와 같은데 다만 한글 자모 표시가 없다.


애플펜슬은 블루투스로 연결된다. 설정에 들어가서 반드시 블루투스 인식 과정을 거쳐야 사용할 수 있다. 아이패드 충전 단자에 꽂아서 충전하거나 전용 커넥터를 이용하면 직접 충전선에 끼워서 충전할 수 있다. 15초만 충전해도 30분을 사용할 수 있다고 설명서에 기재되어 있다.


아직까지 애플펜슬을 지원하는 앱은 드문 것 같다. procreate를 6달러 주고 설치해서 사용했는데 설치한 후 설정 화면에 들어가면 이 앱의 제어에 대한 세세한 설정을 할 수 있다. 가장 편리하다고 생각되는 것이 스케치 모드에서 펜슬외 손가락(손바닥) 접촉은 인식이 되지 않도록 할 수 있다는 점과 펜슬 입력과 손가락 터치를 구분해서 다른 동작을 수행하도록 할 수 있다는 것이다.


애플펜슬의 입력감은 정말로 좋다. 실제 연필과 거의 유사하다. 반응 속도도 매우 빠르고 입력하는 힘에 반응해서 글씨가 굵거나 얇아진다거나 하는 점이나 필기시 손바닥은 입력이 무시된다거나 하는 점이 너무 편리하다.

Posted by 살레시오
,

1. 자바스크립트(javascript) 소개


'주제별 글목록' 카테고리의 다른 글

C언어 기초  (0) 2016.01.28
루아(Lua) 강좌 모음  (2) 2016.01.25
라즈베리 파이 (raspberry pi) 기초 및 응용  (0) 2015.12.23
C# 강좌 모음  (0) 2015.08.01
자바(JAVA) 글모음  (0) 2015.07.01
Posted by 살레시오
,

  라즈비언에서 간단하게 텍스트 파일을 편집할 수 있는 nano는 가볍고 터미널에서 사용하기 편해서 자주 사용되는데 단축키가 윈도 표준과는 달라서 처음 익히는데 불편하다. (vim 보다는 훨씬 쉽긴 하지만)


  그래서 단축키를 다시 정의하는 설정파일(,nanorc)을 만들어서 github에 올려놓았다. 다음과 같은 명령을 터미널에서 실행하여 간단하게 설치할 수 있다.


curl https://raw.githubusercontent.com/salesiopark/nanorc/master/install.sh | sh


이 명령을 실행하면 ~ 디렉토리에 .nanorc 파일이 생성되고 터미널을 다시 실행시킨 후 nano를 실행하면 바뀐 설정이 적용된다. 설정은 다음과 같다.



ctrl+A : 블럭 선택 시작

ctrl+C :블럭 복사

ctrl+V: 붙이기

ctrl+X: 잘라내기


ctrl+Z : undo

ctrl+Y : redo


ctrl + S: 저장

ctrl+O : 파일 열기

ctrl+Q : 종료


블럭은 윈도 표준은 shift + 커서키이지만 nano 설정의 한계로 인해서 그것은 불가능하다. 그래서 ctrl+6 이 블럭 선택의 시작키인데 한 손으로 잡기가 힘들어서 ctrl+a 로도 되게끔 설정해 놓았다.


  이것으로 조금이라도 윈도 표준키를 사용하여 편집을 좀 더 수월하게 진행할 수 있다.

Posted by 살레시오
,

1.1 windows에서 설치하는 방법   c{ipy03}

먼저 윈도우 커맨드창을 반드시 '관리자 모드'로 실행시켜야 한다. (설치과정에서 시스템의 임시폴더를 접근하므로) 이것을 위해서 c:\windows\system32\cmd.exe 를 찾아서 마우스 우클릭후 '관리자모드로 실행'을 선택하여 커맨드창을 연다


그 다음 파이썬과 pip 모듈이 설치되었다고 가정하고 다음과 같이 명령을 내린다.


easy_install ipython[all]

혹은


python -m pip ipython[all]

이렇게 하면 ipython을 실행하기 위해서 필요한 모듈들이 모두 설치된다. 설치하는 데 조금 시간이 걸린다. 이제 다음과 같은 명령을 내리면 ipython이 실행된다.


python -m IPython

여기서 IPython의 첫 두 글자 'I'와 'P' 가 대문자이므로 유의해야 한다.



Posted by 살레시오
,

 클래스의 메서드는 일반 함수를 정의하는 것과 동일한데 한 가지 첫 번째 인자는 반드시 self가 되어야 한다는 점이 다르다.  관례적으로 메서드 정의들 사이에는  한 줄 공백을 준다.


class Robot:

   def __init__(self, name='dummy'):
       self.name = name

   def talk(self):
       print('Hi. I am %s.'% self.name)


self라는 변수를 클래스 함수의 첫번째 인자로 받아야 하는 것은 파이썬만의 (불필요해 보이는) 특징이다. 문법이 이렇게 규정되어 있으니 사용자는 거기에 맞추어 작성해 주어야만 한다. 메서드 내에서는 이 self 변수를 통해서 기정의된 필드를 접근할 수 있으며 또 한 새로운 필드를 생성하는 것도 가능하다. talk() 메서드 내부에서 name 이라는 필드를 self를 통해서 (즉, slef.name 와 같이) 사용했음을 알 수 있다. 객체의 필드는 이와 같이 메서드 내에서 반드시 self 변수를 통해서만 접근할 수 있다.


 객체의 필드와 메서드 목록을 확인하고 싶으면 내장함수 dir()를 이용하면 된다.


>>> asimo=Robot(‘asimo’)
>>> dir(asimo)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'talk']


위에서 보면 매직 메서드들 다음에 name, talk 등 필드와 메서드의 이름을 모두 확인할 수 있다.


   이제 asimo라는 Robot 클래스 객체를 통해서 메서드를 호출할 수 있다. 객체명 뒤에 점(.)을 찍고 함수명을 명시하면 된다.


>>> asimo.talk()
Hi. I am asimo.


메서드를 호출하는 쪽에서는 정의부의 self인자는 무시하고 (없는 것으로 간주하고) 인자를 주면 된다. 따라서 asimo.talk() 메서드는 아무런 인자를 주면 안된다. __init__() 메서드와 마찬가지로 self 인자 뒤에 일반인자를 줄 수 도 있다.


class Robot:

   def __init__(self, name = 'dummy'):
       self.name = name

   def talk(self):
       print('Hi. I am %s.'% self.name)

   def walk(self, step):
       print('Sorry. No legs.')

   def run(self, dist, speed = 10):
       print('Must go %dm at %dm/s speed.'%(dist, speed))
       print('Sorry. No legs.')


이렇게 정의하면 walk()함수는 하나의 일반 인자를 주고 호출해야 하며 run()은 하나 혹은 두 개의 일반 인자를 주어야 한다.


>>> asimo.walk(5)
Sorry. No legs.
>>> asimo.run(100, 50)
Must go 100m at 50m/s speed.
Sorry. No legs.
>>> asimo.run(100)
Must go 100m at 10m/s speed.
Sorry. No legs.


이와 같이 메서도는 첫 번째 인자가 self 라는 점만 제외하면 일반 함수와 정의와 호출하는 방법이 동일하다.



Posted by 살레시오
,

여기에서는 LED를 켜고 끄는 실험을 해 보도록 한다. LED는 파이썬 코드가 GPIO를 동작시키는 것을 시각적으로 확인할 수 있는 가장 간단한 도구이다. 다음 그림과 같이 LED를 저항과 직결한 뒤 12번 핀에 연결한다. 저항은 200Ω (혹은 그 이상) 이고 이것은 LED에 과전류가 흐르는 것을 막아주는 역할을 한다. LED는 극성이 있는 소자이다. 다리가 긴 쪽이 anode(+극), 짧은 쪽이 cathod(-극)이므로 연결할 때 방향을 주의해야 한다. 잘못 연결하면 LED가 켜지지 않는다. 짧은 다리는 저항과 직결하여 6번 핀(GND)에 연결하고 긴 쪽은 12번 핀과 연결하면 된다.


그림 9.2.1 LED 결선도 (긴 다리를 12번 핀에 연결)


 GPIO핀으로 LED를 제어하기 위해서 이 핀을 먼저 GPIO.setup()를 이용하여 출력으로 설정해야 한다. 그 이후에 GPIO.output()함수로 GPIO.HIGH 신호를 내보내면 LED가 켜지고 GPIO.LOW 신호를 내보내면 LED가 꺼진다.


blink.py

import RPi.GPIO as GPIO
import time

led = 12
GPIO.setmode(GPIO.BOARD)
GPIO.setup(led, GPIO.OUT)

for k in range(10):
   GPIO.output(led, GPIO.HIGH)
   time.sleep(0.5)
   GPIO.output(led, GPIO.LOW)
   time.sleep(0.5)

GPIO.cleanup()


이 프로그램은 LED를 10번 점멸시키고 난 뒤 종료된다. 이것을 실행하려면 다음과 같이 하면 된다.


sudo python3 blink.py


전에 언급한 바와 같이 반드시 앞에 sudo 명령을 붙여야 한다는 것이 유의하자.


 한 가지 언급할 것은 저항 값을 선택하는 방법이다. 데이터 쉬트에 의하면 LED에는 10mA 정도 흐르도록 하면 되고 이때 LED의 전압 강하가 1.7V 정도이다. 따라서 오옴의 법칙에 의해서 R = (3.3-1.7)/0.01 = 160Ω  을 얻을 수 있다. 이 결과로부터 160Ω 이상의 저항을 선택하되 너무 저항 값이 크면 불빛을 눈으로 확인하기 어려우므로 160~500Ω 범위의 저항을 선택하면 된다.

원문링크

Posted by 살레시오
,

 GPIO를 제어하기 위한 방법은 여러가지가 있지만 여기에서는 파이썬으로 하는 방법에 대해서 소개하고자 한다. GPIO를 제어하기 위한 파이썬 패키지 중에서 RPi.GPIO 모듈과 WiringPi 라는 모듈이 가장 많이 쓰인다. 특히 RPi.GPIO는 라즈비언에 기본으로 설치되어 있으므로 별도로 설치하는 과정이 필요치 않다. 여기에서는 이것을 이용하기로 한다.


 RPi.GPIO 모듈을 사용하기 위해서는 먼저 다음과 같이 import 명령으로 불러와야 한다.


import RPi.GPIO as GPIO


그 이후에 다음과 같은 메서드들을 사용할 수 있다.


표 9.2.1 RPi.GPIO 모듈의 기본적인 메서드들

메서드 명

기능

GPIO.setmode(GPIO.BOARD)

GPIO.setmode(GPIO.BCM)

핀 번호를 라즈베리파이 보드(BOARD) 번호로 참조

BCM(Broadcom chip-specific pin numbers)모드

GPIO.setup(pin, GPIO.IN)

GPIO.setup(pin, GPIO.OUT)

핀을 입력으로 설정

핀을 출력으로 설정

GPIO.output(pin, GPIO.HIGH)

GPIO.output(pin, GPIO.LOW)

디지털 출력을 HIGH로 설정

디지털 출력을 LOW로 설정

GPIO.input(pin)

디지털 값을 읽음.

GPIO.cleanup()

GPIO 모듈의 점유 리소스를 해제

GPIO.VERSION

RPi.GPIO 모듈의 버전값을 갖는 변수


 GPIO.setmode()함수는 핀 번호를 지정할 때 어떤 참조 방식을 사용하는지를 설정하는 함수로서 다른 메서드를 사용하기 전에 반드시 사전에 호출해야 하는 함수이다. 인자로는 기정의된 상수를 받는데 GPIO.BOARD 는 핀 번호로 라즈베리파이 보드 상의 번호(1~40)를 이용하겠다고 설정하는 것이다. GPIO.BCM은 브로드컴칩의 번호를 참조하겠다는 것으로서 그림 9.1의 GPIOXX 에서 XX에 해당하는 번호를 사용하겠다는 것이다. 예를 들어 GPIO.BOARD 모드에서 12번 핀은 GPIO.BCM 모드에서 18번 핀과 동일하다. 다른 메서드들을 사용하기 앞서서 반드시 GPIO.mode()함수를 호출하여 핀 번호 참조 모드를 지정해 주어야 하며 이 모드의 설정없이 다른 메서드들을 호출하려고 하면 예외가 발생한다.


   GPIO.setup() 함수는 아두이노의 pinMode()함수와 유사한 기능을 수행한다. GPIO.input()이나 GPIO.output()함수를 호출하기 전에 사용하고자 하는 핀이 입력인지 출력인지를 먼저 설정해 주어야 한다. 만약 GPIO.setup() 함수 호출시 풀업(pull-up)이나 풀다운(pull-down) 저항을 연결하려면 다음과 같이 pull_up_down 키워드 파라메터를 GPIO.setup()함수에 넘겨야 한다.


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

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


pull_up_down 파라메터를 주지 않으면 아무런 저항도 연결되지 않는다.


 GPIO 모듈의 사용이 모두 끝나면 GPIO.cleanup()함수를 호출하는 것이 좋다. 이 함수를 호출하면 사용 중인 핀을 포함해서 모든 리소스가 시스템에 반환된다.


 한 가지 주의할 점은 RPi.GPIO는 하드웨어에 접근하여 작업을 수행하기 때문에 root권한이 필요하다. 따라서 파이썬쉘을 실행할 때 반드시 sudo 명령을 사용해야 GPIO 메서드들을 정상적으로 사용할 수 있다.


sudo python3

sudo ipython3


또한 RPi.GPIO 패키지를 사용하는 스크립트파일(,py 파일)을 실행하는 경우에도 마찬가지로 sudo 명령을 사용해야 정상적으로 실행이 된다. 예를 들어 blink.py 파일에서 RPi.GPIO 패키지를 사용한다면


sudo python3 blink.py


와 같이 sudo 명령을 반드시 앞에 붙여야 한다.

원문링크

Posted by 살레시오
,