winPython 은 초기에 python console을 실행시키게 되어 있다. 만약 ipython을 기본으로 사용하고 싶다면 다음과 같은 과정으로 설정하면 된다.


먼저 python console을 초기 기동시 자동으로 시작하게 하지 않으려면 Tools > Preferences 메뉴에서 다음 그림과 같은 옵션을 체크 해제한다. 이 옵션의 체크가 해제되면 winPython을 실행시킬 때 console 창이 자동으로 실행되는 것을 억제할 수 있다.



그 다음 ipython 옵션에서 다음 탭을 체크하여 선택한다.



그러면 이제 winPython을 실행시키면 초기에 python console 대신 ipython 이 실행된다.

[#00066]


Posted by 살레시오
,

1. 파이시리얼(pyserial) : 파이썬 시리얼통신 모듈

 먼저 pyserial을 소개하도록 하겠다. pyserial은 시리얼 통신을 하기 위한 파이썬 모듈이다. 만약 winPython 을 사용한다면 pyserial 이 기본으로 설치되어 있다. ( 처음에는 이 사실도 모르다가 따로 설치를 해야 하겠거니 짐작하고 한참을 헤맸었다. ) 따라서 바로 import 하면 사용할 수 있다.  주의할 점은 모듈명은 pyserial이 아니라 그냥 serial 이라는 것이다.


>>> import serial


일단 아두이노를 연결하면 윈도우 장치관리자에서 COM포트 번호를 확인할 수 있다. 아두이노 우노를 연결하고 내 컴퓨터의 예를 보면 아래와 같이 'COM22'번으로 잡혀있다.



먼저 시리얼 통신 객체를 생성하여야하는데 serial 모듈에 있는 Serial 클래스 (즉, serial.Serial 클래스이다.)를 이용하면 된다. 생성자의 정의는 다음과 같다.


class serial.Serial

__init__(
    port=None,
    baudrate=9600,
    bytesize=EIGHTBITS,
    parity=PARITY_NONE,
    stopbits=STOPBITS_ONE,
    timeout=None,
    xonxoff=False,
    rtscts=False,
    writeTimeout=None,
    dsrdtr=False,
    interCharTimeout=None
)


입력 인수들:


  • port - 장치명. 윈도우즈에서는 'COM0', 'COM1' 등이다.

  • baudrate - 보레이트(baud rate) 예를 들면 9600, 115200 등.

  • parity - 패리티비트. FIVEBITS, SIXBITS, SEVENVITS, EIGHTBITS 등이 가능하다.

  • stopbit - 정지비트. STOPBITS_ONE , STOPBITS_ONE_POINT_FIVE , STOPBITS_TWO 등이 가능하다.

  • timeout - 수신 시간 제한 설정

  • xonxoff - 소프트웨어 흐름 제어를 설정

  • rtscts - 하드웨어(RTS/CTS) 흐름 제어 설정

  • dsrdtr - 하드웨어(DSR/DTR) 흐름 제어 설정

  • writeTimeout - 송신 시간 제한 설정

  • interCharTimeout


예외 발생


  • ValueError - 입력 변수값에 오류가 있을 경우 발생

  • SerialException - 시리얼 통신 장치에 오류가 있을 경우 발생


이것을 보면 포트 정도만 지정해 주어도 기본적으로 생성이 되는 것을 알 수 있다. 포트는 'COM22'와 같이 문자열로 넘겨주어야 한다. 포트명을 특정해 주면 즉시 장치와 연결이 open된다. 시리얼통신 장치를 다 사용하였다면 obj.close() 를 호출하여 반드시 닫아주어야 한다.




Posted by 살레시오
,

2. 아두이노로부터 수신 실험

 실험을 위해서 다음과 같은 간단한 프로그램을 아두이노 우노에 다운로드 하였다. 이 프로그램은 전원이 켜지면(또는 리셋 버튼을 누르면) "Hello python." 이라는 문자열을 보낸다.


void setup() {
   Serial.begin(9600);
   Serial.println("Hello python.");
}

void loop() {
}


그리고 파이썬에서 Serial 객체의 인스턴스를 다음과 같이 생성한다.


>>> ard = serial.Serial('COM22')


이렇게 하면 ard 변수에 Serial 클래스의 인스턴스가 생성된다. 이제 이 변수를 이용해서 아두이노에서 보내는 값을 읽어들일수 있다.


>>> obj = ard.readline()
>>> obj
b'Hello python.\r\n'


아두이노 쪽에서 println()함수를 썼기 때문에 끝에 \r\n 두 개의 개행 제어 문자가 붙어서 넘어왔다.


 한 가지 주의할 것은 Serial.readlin() 함수의 반환 객체가 문자열이 아니라 bytes 라는 파이썬 객체로서 각각의 문자의 아스키코드 바이트 값의 배열이라는 점이다. 이것을 파이썬 문자열(string)로 변환하려면 bytes.decode()함수를 이용하면 된다.


>>> str = obj[:-2].decode()
>>> str
'Hello python.'


이제 str 변수에 아두이노로 부터 전송된 문자열이 정확히 저장되었다. 여기서 obj[:-2] 와 같이 인덱싱을 한 것은 \r\n 두 문자를 제외하기 위한 것이다.





Posted by 살레시오
,

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

  여기에서는 C/C++언어에서 객체의 이름을 짓는 기본 규칙을 설명한다. 변수(variable), 함수(function), 그리고 클래스(class)의 이름을 지정하는데 사용되는 이름을 식별자(identifier)라고 한다. 변수란 어떤 데이터를 저장하는 그릇으로 이해하면 되며 함수나 클래스에 대해서는 뒤에서 자세히 설명할 것이다.


  식별자를 만드는 데에는 다음과 같은 제약 사항이 있다.


        ❶ 알파벳 대소문자(a, b, …, z, A, B, …, Z), 숫자(0,1,2, …9), 밑줄(_)을 조합하여 만든다.

        ❷ 숫자로 시작해서는 안 된다.

        ❸ 최대 길이는 32자이다.

        ❹ C/C++언어의 예약어는 식별자로 쓸 수 없다.


특수문자로는 유일하게 밑줄(_)문자가 식별자를 만드는데 사용이 되며 이외의 다른 특수문자는 식별자롤 사용할 수 없다. 아래의 예는 올바른 식별자이다.


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

  iA cStatus iMotor10 i_AVR_Name _reg For

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


아래의 예는 올바르지 않은 식별자이다.


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

  123a   : 숫자로 시작하면 안 됨

  A@Bc : 특수문자 @은 사용 불가

  %pi    : 특수문자 % 사용 불가

  for      : 키워드는 사용 불가

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


  한 가지 주의할 점은 C언어에서는 식별자를 사용할 때 대소문자를 구별한다는 점이다. 즉 다음 식별자들은 모두 서로 다른 것으로 구별된다.


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

  ia, iA, Ia, IA

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


이러한 특징은 거의 대부분의 프로그래밍 언어들에 있어서 공통적으로 해당된다.​

[#00070]


Posted by 살레시오
,

micropython 코어를 이용한 wipy 라는 IoT 보드가 킥스타터에서 자금을 모으고 있다.



내세우고 있는 특징들은 다음과 같다.


  • 저가, 소형, 빵판에 장착 가능
  • 초저전력 소모 (와이파이 연결해도 850uA )
  • 100% 파이썬 프로그래밍 
  • 충분히 많은 GPIOs, 인터페이스, 주변기기
  • 고성능  CPU와 최신 WiFi radio.


이 기기의 최대 특징은 와이파이와 결합된 파이썬 보드라는 것이다. micropython의 펌웨어를 이용하여 파이썬 3.4를 지원한다. 그리고 와이파이로 무선 프로그래밍이 가능하다는 것이다. 다음과 같이 텔넷 연결도 가능하다.



보면 알겠지만 일반적인 파이썬쉘로 접속이 가능하므로 그때그때 프로그램의 동작을 확인해 볼 수 있다.


  물론 전문적인 시스템 개발자들은 앞으로도 한동안 여전히 C/C++을 이용해야 할 것이다. 하지만 이런 보드들이 좀 더 늘어나면 하드웨어 프로그래밍을 하는데 굳이 C/C++을 배우지 않고 파이썬만으로도 할 수 있는 환경이 마련되어 일반 사용자들에게 충분히 어필을 할 수 있을 것 같다.

[#00097]


Posted by 살레시오
,

  3D프린팅을 하다 보면 인쇄물이 밑판(베드)에 너무 단단하게 붙어버려서 이걸 떼어내는데 굉장히 힘들거나 아예 안 되는 경우도 종종 발생한다. 이것을 해결하기 위해서 youtube에서 검색을 좀 해보면 얼음팩으로 접합면을 식힌 다음에 망치같은 것으로 살살 쳐서 떼어내는 동영상도 있던데 훨씬 간단한 팁을 발견해서 여기에 소개하도록 하겠다.


  바로 헤어스프레이를 bed에 뿌린 다음에 그 위에 인쇄를 하는 것인데 이게 의외로 효과적이다. 별다른 힘을 들이지 않고 인쇄물을 떼어낼 수 있다. 헤어스프레이 자체가 접착력이 있기는 한데 그 힘이 별로 크지 않기 때문에 서포트가 살짝 bed에 달라 붙게 되는 것이다.


  필자는 UP! plus 라는 프린터를 사용하고 있는데 이것에는 갈색 플라스틱으로 된 밑판(bed)이 몇 장 딸려온다. 이것에는 조그만 구멍이 격자모양으로 뚫려 있어서 프린트할 때 서포트가 잘 달라붙도록 되어있는데 종종 너무 밀착되어 떼어내기가 매우 힘든 경우가 있다. 분리하는 도구(끝이 칼날로 된 주걱)가 딸려오기는 하는데 이것을 사용해도 떼어내기가 쉽지 않은 경우가 많다.




그래서 위 동영상에 나온대로 마트에서 헤어스프레이를(strong 형으로. 마트에서 몇 천원이면 살 수 있다.) 구입한 후 살짝 (5초~10초 정도) 골고루 뿌린 다음 인쇄하면 인쇄물이 베드에서 뜨지 않고 서포트가 너무나 쉽게 분리가 되서 아직까지는 편하게 사용하고 있다.

[#00096]


Posted by 살레시오
,

  robox 라는 프린터는 특이하게 노즐이 두 개인데 하나는 0.3mm 이고 다른 하나는 0.8mm 이다. 기본적인 아이디어는 정밀도를 요하는 외곽은 0.3mm 노즐로, 대충 채워도 되는 내부는 0.8mm노즐을 사용하여 프린팅 속도를 높이도록 설계되어 있다. 이 회사 홍보 문구에는 기존 제품 대비 최대 3배의 속도를 낸다고.


하지만 인쇄 품질이나 장점으로 내세우는 속도면에서는 썩 좋지 않은 평이 있다.


http://www.pcpro.co.uk/printers/1000065/cel-robox-review-a-3d-printer-for-the-masses



  3세대 Cube 가 출시되었는데 가격은 1000불 정도이다. (우리 돈 120만원 정도) 3D프린팅을 하다보면 노즐의 초기 높이를 설정하는 과정을 거쳐야 하는데 이게 수동으로 하려면 어렵기도 하고 매번 해줘야 되서 번거롭다. 노즐과 베드의 간격이 너무 낮거나 너무 높으면 프린팅이 제대로 되기 않기 때문에 대충해서도 안 된다.


  


  요즘에는 100만원 대의 저가형 제품들 중에도 이러한 세팅 과정을 센서를 이용하여 자동으로 해주는 제품들이 나오고 있는데 3세대 큐베도 이러한 오토 레벨링(auto leveling)기능이 포함되어 있다. 초보자들은 이 기능이 포함되어 있는 제품을 선택하는 것이 좋다. 그리고 프린팅 베드를 감싸는 케이스도 있는 것이 좋은데 프린팅할 때 외부와 공기가 차단되어야 인쇄 품질이 더 높아지기 때문이다.

[#00095]


Posted by 살레시오
,

 실험을 위해서 여러 하드웨어 보드들을 구해서 잠깐씩 살펴보았는데, 하드웨어를 제어하는 (주로 오픈소스)보드들이 공통적으로 가지고 있는 필수 기능으로 다음과 같은 것들이 있다.


  • (디지털) In/Out 포트            : on/off 입출력
  • 인터럽트 (interrupt)             : 이벤트 처리
  • PWM                                : 아날로그 (처럼) 출력
  • A/D 변환기                         : 아날로그 입력 (주로 센서의 입력)
  • 통신 (주로 시리얼 통신)       : (주로) PC 혹은 다른 보드와의 통신
  • D/A 변환기                      : 아날로그 전압 출력


보드에 따라서 이러한 기능을 구현하는데 사용하는 언어도 다르다.


  • 아두이노는 C++
  • 넷두이노는 (매우 특이하게) C#.Net
  • R-Pi는 주력 언어가 파이썬 (하지만 리눅스 보드이므로 다른 언어도 가능함)
  • 비글본블랙은 자바스크립트 (마찬가지로 C++, JAVA 등도 가능). 비글본블랙은 D/A변환기도 내장하고 있으며 주변기기가 가장 풍부하게 마련되어 있다.


 어떤 보드의 기능과 프로그래밍을 살펴볼 때 위의 기능들을 사용 언어로 어떻게 구현하는지를 파악할 수 있다면 반 이상은 아는 것이라고 봐도 될 것 같다. 많이 사용되는 라즈베리 파이는 GPIO에 A/D변환기가 없으며 PWM기능도 매우 빈약하다.


  언어의 난이도 순으로 배열해 보면 (순전히 주관적인 생각임) 다음과 같다, 


  • C++ >  JAVA, C# > javascript > python


C++이 제일 어렵고 파이썬이 상대적으로 제일 난이도가 낮은 편에 속한다.


얼마 전까지만 해도 임베디드는 닥치고 C/C++ 이었는데 요즘에는 고수준 언어나 심지어 스크립트 언어로도 프로그래밍할 수 있는 보드들이 출시되고 있어서 비전문가들이 좀 더 쉽게 접근할 수 있는 환경이 되고 있다.

[#00093]


Posted by 살레시오
,

  라즈베리파이 컴퓨트 모델에 이어서 새로운 모델이 출시되었다. 이름은 model b+ 인데 기존 model b 의 단점과 제기되었던 불편한 요소들을 개선한 최종 진화판이라고 소개하고 있다.



하지만 아쉽게도 모델B와 동일한 프로세서를 사용하므로 사용자들이 가장 원했던 성능의 향상은 없지만 소소하게 개선된 점들을 짚어보면 다음과 같다.


  1. 전원부의 회로를 개선하여 불안정했던 전원을 보완하였다.
  2. 오디오 회로의 수정으로 잡음이 많았던 단점을 보완하였다.
  3. 아날로그 비디오와 오디오 단자를 하나로 통합하였다.
  4. USB포트를 두 개에서 네 개로 늘려서 키보드, 마우스, 와이피이동글을 꽂고도 하나가 남는다.
  5. 마이크로SD카드 채용하여 메모리카드의 고정성이 좀 더 향상되었다. 
  6. GPIO가 26핀에서 40핀으로 확장되었으나 추가된 핀들이 대부분 포트핀(디지털입출력핀)이다. 외부의 EEPROM을 자동 인식하기 위한 통신선 두 개가 추가되었고, PWM은 여전히 하나이며 ADC는 없다.
  7. 그외 마운트 홀의 위치를 좀 더 안정적으로 변경하였고 모서리를 둥글게 처리하였다.


그외 크기나 성능 사양은 model B와 동일하다. 프로세서와 동작클럭도 같고 램도 512MB 이다. 가격은 모델B와 같은 가격으로 책정되었다.


  참고로 (3)번 항에서 알 수 있듯이 새로운 A/V 단자가 있는데 이 단자에 스테레오 이어폰을 끼우면 그냥 오디오 단자로 사용할 수 있는데 아래 그림과 같은 케이블을 이용하면 영상신호와 음향신호를 모두 뽑아낼 수 있다고 한다. 이건 참 개인적으로 기발한 변경점이라고 생각된다.


[#00072]

Posted by 살레시오
,