3. 두 번째 실험 : 송신


  이번에는 파이썬에서 값을 송신하면 그에 따라서 아두이노의 LED를 점멸시키는 예제를 해 보겠다. 파이썬에서 데이터를 쓰는 함수로 Serial.write() 함수가 있는데 전송할 바이트 데이터를 리스트나 튜플로 묶어서 넘겨주면 된다. 반환값은 전송한 데이터의 바이트 수이다. 예를 들면 다음과 같다.


-------------------------------------------------------------------------

>>> ard.write( [0] ) # 0이라는 데이터를 전송한다.

>>> ard.write( [10, 150, 255] ) # 10,150,255를 차례로 전송한다.

>>> ard.write( 123 ) # 예외 발생!

-------------------------------------------------------------------------


전송되는 데이터는 바이트 데이터이므로 0~255 사이의 정수여야 하며 마지막 예와 같이 리스트나 튜플이 아니라면 예외가 발생함을 유의하여야 한다.


만약 문자열을 한꺼번에 전송하고 싶다면 encode() 라는 문자열 내장 함수를 이용하면 된다. 이 함수는 파이썬 문자열을 아스키값의 bytes 배열로 변환시켜준다.


-------------------------------------------------------------------------

>>> ard.write( 'Hello arduino.\r\n'.encode() )

-------------------------------------------------------------------------


이 명령은 'H' 부터 맨 마지막 '\n' 까지 14개의 문자의 아스키코드를 차례로 전송한다.


이제 실험을 위해서 아두이노에 다음과 같은 프로그램을 작성하여 다운로드 했다.



아두이노 프로그램 : 전원이 켜지면(또는 리셋 버튼을 누르면) "Hello python." 이라는 문자열을 보낸다. 그리고 데이터가 들어오면 0값이면 LED를 끄고 아니라면 켠다.

-------------------------------------------------------------------------

void setup() {

Serial.begin(9600);

Serial.println("Hello python.");

pinMode(LED_BUILTIN, OUTPUT);

}


void loop() {

if( Serial.available() )

digitalWrite(LED_BUILTIN, Serial.read());

}

-------------------------------------------------------------------------


이제 ard.write([0]) 이라고 명령을 내리면 LED가 꺼지고 ard.write([1])이라고 하면 LED가 켜지는 것을 다음과 같이 확인할 수 있다. 




위 동영상을 보면 1을 쓰면 LED가 켜지고 0을 쓰면 꺼지는 것을 볼 수 있다.


Posted by 살레시오
,

산술 연산자로 다음과 같은 것들이 있다.


연산자

기능

용례

+

덧셈


-

뺄셈


*

곱셈


/

나눗셈

결과는 실수형이다. (2.x에서는 int / int의 결과는 int)

//

자리내림 나눗셈

피연산자가 모두 정수인 경우 나눗셈의 결과 소수점 아래는 버리고 정수만 취한다.

둘 중 하나라도 실수라면 / 연산자와 동일함.

**

거듭제곱

2**10, (1+2j)**20

%

나머지

3%4, -10%3, 12.345%0.4


  나눗셈의 경우 ver 2.x에서는 정수형끼리의 나눗셈은 결과도 정수형이 된다. 다음 결과를 확인해 보라.


----------------------------------------------------------

>>> 4/5

>>> a, b=11,5 #a에 11, b에 5를 대입한다.

>>> b/a

----------------------------------------------------------


하지만 3.x버전에서는 나눗셈의 결과는 무조건 실수로 된다.


■ 2.x버전에서는 정수간 나눗셈의 결과는 정수였다. 즉 1/2는 0, 2/3은 1이다. 하지만 3.x버전에서는 정수간 나눗셈의 결과는 나누어 떨어지는 경우라도 무조건 실수형이 된다. 즉, 1/2는 0.2, 6/3은 2.0이 된다.


  연산자 //는 두 피연산자가 모두 정수일 경우 결과값이 실수이면 소수점 아래는 버린다.


······································································································································

>>> 9//2 # 결과는 4 (정수)

>>> 9//2.0 # 결과는 4.5(실수)

······································································································································


  연산자 %는 나눗셈 수행 후 정수몫을 구하고 난 나머지를 구하는 연산자이다. 다음을 확인해보라.


······································································································································

>>> 3%2

>>> 11.5 % 0.2

······································································································································


연산자 **는 거듭제곱 연산자이다. 다음 연산의 결과값들을 예상해 보자.


······································································································································

>>> 2**10

>>> a, c = 3, 4+5j #변수 a와 c를 차례로 초기화시킨다.

>>> c**a

······································································································································


  복소수의 거듭제곱도 (4+5j)*(4+5j)*(4+5j) 의 결과값을 보여준다. 파이썬에서는 복소수에 대한 산술 연산도 기본적으로 지원하므로 쉽게 수행할 수 있음을 알 수 있다.

#00003


Posted by 살레시오
,

  프로그램은 결국 데이터를 처리하는 일을 주로 하게 된다. 여기에서는 파이썬의 내장 자료형에 대해서 알아보자. 가장 중요하고 사용 빈도가 높은 파이썬 자료형은 다음과 같은 것들이 있다.


  • 숫자 : 정수, 실수, 복소수로 나뉜다. 
  • 문자열 
  • 리스트(list) 
  • 튜플(tuple) 
  • 딕셔너리(dictionary) 
  • 집합(set)


  변수명, 함수명, 클래스명 등으로 쓸 수 있는 식별자를 만드는 방법은 다른 언어들과 거의 동일하다. 사용되는 문자들은 다음과 같다.


  • 영문자 대소문자 (a,b … z A B … Z)
  • 숫자 (0 1 … 9)
  • 언더바(_)


이러한 문자들을 조합하되 숫자로 시작하면 안된다. 그리고 대소문자를 다른 문자로 구별한다. 그리고 python3에서는 유니코드 문자를 식별자로 사용할 수 있다. 즉, 한글로도 변수명을 지을 수 있지만 권장되지는 않는다.

#00001


Posted by 살레시오
,

  파이썬에서 사용자 폴더를 검색 경로에 추가시키기 위해서는 다음과 같이 sys 모듈의 path 리스트에 이 경로를 추가해 주면 된다.

---------------------------------------------------------------------------
>>> import sys
>>> sys.path.append('d:/mydir') # 윈도는 'd:\\mydir'
---------------------------------------------------------------------------

그러면 만약 다음과 같이 모듈을 import 할 때

---------------------------------------------------------------------------
>>> import mymod
---------------------------------------------------------------------------


사용자 폴더 안에서도 mymod.py 파일이 있는지 검색해 보게 된다.

  그런데 검색 경로 안에 어떤 폴더가 있고 그 폴더 안에 __init__.py 파일이 있다면 이것은 그 폴더가 파이썬 모듈이라는 것을 표시하는 역할을 한다. 예를 들어 다음과 같이 spam폴더 안에 파일이 두 개가 있다고 가정하자.


    d:/ mydir / spam /__init__.py # 이 파일이 spam 폴더를 파이썬모듈로 만든다.
    d:/ mydir /spam / module.py

그리고 d:/mydir 이 경로로 잡혀있다고 가정한다. 그렇다면 spam 폴더는 파이썬 모듈로 간주되고 module.py는 하위모듈로 취급된다. 그래서 module.py 모듈파일을 다음과 같이 불러올 수 있다.

---------------------------------------------------------------------------
>>> import spam.module
---------------------------------------------------------------------------

또는 

---------------------------------------------------------------------------
>>> from spam import module
---------------------------------------------------------------------------

즉, spam폴더 안에 __init__.py 파일이 있다면 spam 폴더는 모듈로 간주되고 module.py 는 서브모듈이 된다. 만약 __init__.py 파일을 지운다면 파이썬은 spam 폴더를 모듈로 취급하지 않으므로 module.py 도 더이상 서브모듈로 간주되지 않는다. 따라서 위의 명령어는 오류를 발생시킬 것이다.

이 __init__.py 은 그냥 빈 파일일 수도 있지만, 객체를 정의하거나 서브패키지의 특정 부분만을 선택하여 내보내거나 하는 코드를 가질 수도 있다. 만약 __init__.py 안의 내용을 접근하려면 다음과 같이 하면 된다. 

---------------------------------------------------------------------------
>>> import spam
---------------------------------------------------------------------------

이렇게 하면 __init__.py 안에 정의된 객체들이 spam 모듈로 올라오게 된다. 주의할 점은 이렇게 spam 모듈을 임포트한다고 해서 module.py 가 자동으로 하위모듈로 임포트되는 것은 아니라는 것이다. spam이 임포트될 때 module 도 임포트되려면 __init__.py 안에 다음과 같이 명시해 주어야 한다.

---------------------------------------------------------------------------
# __init__.py 화일의 내용
from . import module
---------------------------------------------------------------------------

이렇게 하면 spam.module 로 접근할 수 있다.

[#00085]

Posted by 살레시오
,

  파이썬의 numpy, scipy, 심지어 sympy 까지 있는데 MATLAB의 control system toolbox 같은 것은 없나.. 하고 생각했었는데 있었다. 사용자 매뉴얼을 아래에 링크하였다.

python control system library User's manual


이 모듈은 winPython 에서 기본적으로 설치되어 있지 않다. 하지만 윈파이썬의 콘솔창(Tools > Open command prompt) 에서 다음과 같이 명령을 내리면 자동으로 인스톨된다.

------------------------------------------------------------------------
> pip install control
------------------------------------------------------------------------

이 라이브러리는 기본적인 선형제어 시스템에 관련된 함수들과 클래스가 정의되어 있고 MATLAB control toolbox 와 이름체계가 비슷한 것 같다.

이제 simulink 같은 툴만 나오면 되는 건가.. 갈수록 파이썬에 놀라는 중이다.

[#00084]

Posted by 살레시오
,