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 살레시오

댓글을 달아 주세요