November 25, 2024

디바이스마트 미디어:

[66호] 원하는 색상으로 제어가 가능한 아두이노 IoT 스마트 무드등 키트 -

2021-06-25

★2021 ICT 융합 프로젝트 공모전 결과 발표! -

2021-05-12

디바이스마트 국내 온라인 유통사 유일 벨로다인 라이다 공급! -

2021-02-16

★총 상금 500만원 /2021 ICT 융합 프로젝트 공모전★ -

2021-01-18

디바이스마트 온라인 매거진 전자책(PDF)이 무료! -

2020-09-29

[61호]음성으로 제어하는 간접등 만들기 -

2020-08-26

디바이스마트 자체제작 코딩키트 ‘코딩 도담도담’ 출시 -

2020-08-10

GGM AC모터 대량등록! -

2020-07-10

[60호]초소형 레이더 MDR, 어떻게 제어하고 활용하나 -

2020-06-30

[60호]NANO 33 IoT보드를 활용한 블루투스 수평계 만들기 -

2020-06-30

라즈베리파이3가 드디어 출시!!! (Now Raspberry Pi 3 is Coming!!) -

2016-02-29

MoonWalker Actuator 판매개시!! -

2015-08-27

디바이스마트 레이저가공, 밀링, 선반, 라우터 등 커스텀서비스 견적요청 방법 설명동영상 입니다. -

2015-06-09

디바이스마트와 인텔®이 함께하는 IoT 경진대회! -

2015-05-19

드디어 adafruit도 디바이스마트에서 쉽고 저렴하게 !! -

2015-03-25

[29호] Intel Edison Review -

2015-03-10

Pololu 공식 Distributor 디바이스마트, Pololu 상품 판매 개시!! -

2015-03-09

[칩센]블루투스 전 제품 10%가격할인!! -

2015-02-02

[Arduino]Uno(R3) 구입시 37종 센서키트 할인이벤트!! -

2015-02-02

[M.A.I]Ahram_ISP_V1.5 60개 한정수량 할인이벤트!! -

2015-02-02

MoonWalker Series Motor Controllers User’s Manual 15. 프로그램의 작성과 실행

MW001

MoonWalker Series

Motor Controllers

User’s Manual

MW-MDC24D100S / MW-MDC24D100D

MW-MDC24D200S / MW-MDC24D200D

MW-MDC24D500S / MW-MDC24D500D

 ※ 사용자 매뉴얼에 포함된 정보는 정확하고 신뢰성이 있는 내용입니다. 그러나 출판 당시 발견되지 않은 오류가 있을 수 있으니 사용자는 자신의 제품 검증을 수행하시기 바라며, 전적으로 사용자 매뉴얼에 포함된 정보에 의존하지 마시기 바랍니다.

 

15. 프로그램의 작성과 실행

제어기의 강력한 기능 중 하나는 사용자가 프로그램을 작성하여 제어기에 다운로드하고 실행하는 기능입니다. 이 기능은 제어기의 모터 제어 기능에 PC를 결합하는 것과 동일합니다. PC에서 수행하던 일부 혹은 모든 기능을 제어기에서 구현할 수 있기 때문에, 전체 시스템 구성을 단순화 할 수 있습니다.

15.1 프로그램의 작성

Mini-C 스크립트 언어로 프로그램을 작성하는 것은 제어기의 기능을 확장하여 다양한 용도로 사용할 수 있도록 합니다.
Mini-C 스크립트 언어는 C언어와 유사합니다. C언어의 구조는 장비를 제어하는 낮은 수준의 프로그래밍에 유리하고 배우기 쉽습니다. 만일 C언어에 친숙한 사용자라면, “14.2 C언어와의 차이”만 살펴보더라도 바로 프로그램을 작성할 수 있습니다.

15.1.1 소스코드 작성
사용자는 Mini-C 스크립트 언어의 문법을 사용하여 제어기에서 실행되는 프로그램을 작성합니다. 프로그램의 소스코드는 텍스트로 작성되며, *.scr 확장자를 가지는 텍스트 파일에 저장하거나 다시 읽어올 수 있습니다.
소스코드 작성에 Motor Control UI 유틸리티를 사용할 수 있습니다. 또한 Windows 운영체제에서 제공하는 notepad와 같은 일반적인 텍스트 편집 유틸리티도 소스코드 작성에 사용할 수 있습니다.
소스코드는 문장의 길이, 들여쓰기 등에 제약 받지 않고 자유로운 형태의 텍스트로 작성하면 됩니다.

15.1.2 소스코드 구조
스크립트 언어로 프로그램을 작성할 때 소스코드의 구조는 다른 종류의 프로그램을 작성하는 것과 비슷합니다. 단순하게, 프로그램이 한 번 실행되고 끝나도록(단일 실행구조) 프로그램을 작성할 수 있습니다. 이와 달리, 반복적으로 실행되도록(반복 실행구조) 프로그램을 작성할 수도 있습니다.
단일 실행구조는 제어기가 시작될 때 혹은 외부의 명령에 의해 정해진 기능을 수행하고 종료되는 형태입니다. 다음 예제와 같이, 제어기가 시작될 때 제어기의 구성 파라미터를 설정하는 것입니다.

// 채널 1의 모터에 대하여 최대 전류, 전압, 속도, 가속도 설정
setv (_max_current, 1, 5);
setv (_max_voltage, 1, 24);
setv (_max_velocity, 1, 3000);
setv (_acceleration, 1, 1500);
setv (_deceleration, 1, 1500);

반복 실행구조는 제어기 프로그램을 작성하는 좀 더 일반적인 방법입니다. 프로그램은 아날로그/디지털 입력 또는 모터 상태(전류, 전압, 온도, 속도, …)를 읽어 모터 전원 및 디지털 출력을 조절하는 과정을 무한히 반복하도록 작성될 수 있습니다.

// 채널 1의 모터에 대하여 최대 속도, 가속도 설정
setv (_max_velocity, 1, 1000);
setv (_acceleration, 1, 500);
setv (_deceleration, 1, 500);

// 아날로그 입력 채널 1의 값을 읽어 모터 채널 1의 속도를 조절
while (1) {
speed = getv (_ai_converted_value, 1);
speed = speed * 1000;
setv (_velocity_command, 1, 0);
sleep (100);
}

반복 실행구조는 보통 while(1) { … } 과 같이 만듭니다. while 문의 조건은 항상 참이기 때문에, 이 프로그램은 사용자가 스크립트의 실행을 중단하거나 제어기가 꺼지기 전까지 무한히 반복합니다.

반복 실행되는 블록 끝에는 sleep() 함수로 일정 대기 시간을 삽입하는 것이 좋습니다. 불필요하게 프로세서 자원을 사용하지 않으면서 원하는 기능을 달성할 수 있도록, 대기 시간은 필요한 만큼 짧게 설정 합니다. 예를 들어, 배터리를 모니터링하고 배터리의 낮은 전압에 대해 디지털 출력을 트리거 하는 스크립트가 밀리 초 마다 실행될 필요는 없습니다. 100ms의 대기 시간이면 충분하고 제어기가 스크립트의 실행에 불필요한 시간을 할당하는 것을 방지해야 합니다.

15.1.3 스크립트 예제

다음 예제 소스코드는 듀얼 채널 모터제어기를 차동 구동형 이동로봇에 적용하여, 사용자의 명령에 따라 로봇을 움직이고 움직인 위치를 추정하는 프로그램입니다.

/*
This script reads the velocity command from variable _user_value 1, 2
and control velocity of left and right wheels of the mobile robot.
While moving, left and right wheels’ encoder values are used to calculate
the mobile robot’s position x, y and heading theta.
*/

// get the robot’s properties
r = getv (_wheel_radius, 0);
b = getv (_axle_length, 0);
g = getv (_gear_ratio, 0);
enc = getv (_encoder_ppr, 1);

enc1_p = getv (_position, 1);
enc2_p = getv (_position, 2);

while (1) {

// reads the user command
v = getv (_user_value, 1);
w = getv (_user_value, 2);

// calculate the velocity of left and right wheels
rps2rpm = 60/(2*_PI);

vl = g/r*(v-w*b/2);
vr = g/r*(v+w*b/2);

// set the velocity to left and right wheels’ motor
setv (_velocity, 1, vl*rps2rpm);
setv (_velocity, 2, vr*rps2rpm);

// get the encoder value and estimate the position that robot moved
enc1 = getv (_position, 1);
enc2 = getv (_position, 2);
de1 = enc1 – enc1_p;
de2 = enc2 – enc2_p;
enc1_p = enc1;
enc2_p = enc2;

de1 *= 2*_PI/enc;
de2 *= 2*_PI/enc;

// delay 10ms
sleep (10);

}

※ 엔티렉스 로봇연구소 홈페이지(www.ntrexgo.com)에 접속하면 제어기의 다양한 스크립트 예제를 다운로드 받을 수 있습니다.

15.2 빌드

사용자가 작성한 소스코드는 제어기에서 직접 실행될 수 없습니다. 따라서 소스코드는 빌드 과정을 거쳐 제어기의 가상머신에서 실행 가능한 바이트코드로 변환되어야 합니다.
일반적으로, 프로그램의 빌드는 컴파일과 링크 과정을 의미합니다. Mini-C 스크립트 언어로 작성된 프로그램은 하나의 소스코드만으로 하나의 프로그램을 만들어 냅니다. 그래서 컴파일러만으로 빌드 과정을 끝낼 수 있으며 링커는 사용하지 않습니다.
빌드는 Motor Control UI 유틸리티 상에서만 가능합니다. 유틸리티의 [Build] 버튼을 눌러 빌드 과정을 진행합니다. 현재 Mini-C 스크립트를 독립적으로 컴파일 하는 컴파일러는 제공되지 않습니다.

15.2.1 컴파일

컴파일러는 스크립트 소스코드를 제어기의 가상머신에 의해 해석되는 바이트코드로 변환(컴파일)합니다. 소스코드의 양에 따라 다르겠지만, 컴파일 과정은 보통 순식간에 진행됩니다.
컴파일 하는 동안 소스코드의 문법 오류를 검사하고 오류가 발견되면 오류 메시지를 출력합니다. 컴파일 도중 오류가 발생하더라도 컴파일러는 전체 소스코드를 스캔 합니다. 그렇기 때문에, 오류 메시지는 여러 개가 출력될 수 있습니다.
다음과 같이 간단한 예제 소스코드를 컴파일 하면,

// File: scr\new.scr
a = 1;
b = 2;
c = a + bb; // bb가 선언되지 않았다고 컴파일 오류 발생

컴파일러는 다음과 같은 오류 메시지를 출력합니다.

scr\new.scr(4) : Error : “bb” : undeclared identifier.
>>> scr\new.scr – 1 error(s), build failed

사용자는 오류가 발생한 파일의 메시지를 참조하여 소스코드에서 오류를 수정해야 합니다. 컴파일러의 모든 오류 메시지는 “15.2.2 컴파일 오류 메시지”를 참고하시기 바랍니다.
소스코드가 오류 없이 컴파일 되면 다음과 같은 메시지를 출력합니다.

>>> scr\new.scr – 0 error(s), build succeeded

오류 없이 컴파일이 끝난 경우, 어셈블리(확장자 *.asm) 파일과 바이트코드(확장자 *.bin) 파일이 생성됩니다. 바이트코드 파일은 바이트코드를 바이너리 형태로 저장한 파일입니다. 이 파일이 제어기로 다운로드 되고 가상머신에서 읽혀 실행됩니다.

15.2.2 컴파일 오류 메시지

다음 오류 메시지는 사용자가 작성한 소스코드의 컴파일 과정에서 문법 오류에 의해 발생하는 메시지입니다. 이 메시지를 참조하여 소스코드의 오류를 수정할 수 있습니다.

·  ’xxx’ : undeclared identifier
·  ’xxx’ : function not found
·  ’xxx’ : function does not take x arguments
·  ’xxx’ : left operand must be l-value
·  ’xxx’ : right operand must be l-value
·  label ‘xxx’ was undefined
·  label redefined ‘xxx’
·  undeclared identifier ‘x’
·  unexpected end of file found in comment
·  missing expression
·  missing ‘(‘ after ‘if’
·  missing ‘(‘ after ‘for’
·  missing ‘(‘ after ‘while’
·  missing ‘)’
·  missing ‘}’
·  missing ‘;’
·  missing ‘;’ after ‘break’
·  missing ‘;’ after ‘continue’
·  missing ‘;’ after ‘goto’
·  missing ‘while’ after ‘do’
·  missing label after ‘goto’
·  syntax error ‘x’
·  syntax error : ‘)’
·  syntax error : ‘,’
·  syntax error : ‘xxx’
·  syntax error : missing ‘x’
·  syntax error : missing ‘)’
·  syntax error : function call missing ‘)’
·  illegal ‘break’
·  illegal ‘continue’
·  illegal ‘else’ without matching ‘if’

15.3 다운로드 및 실행

15.3.1 다운로드

빌드가 성공하면 바이트코드 파일(확장자 *.bin)이 만들어집니다. 바이트코드 파일을 제어기로 다운로드 하는데 Motor Control UI 유틸리티가 사용됩니다. 유틸리티의 [Download] 버튼은 바이너리 파일을 읽어 제어기의 플래시 메모리로 전송합니다. 그리고 플래시 메모리에 저장된 바이트코드는 새로운 파일을 다운로드 하지 않는 한 영구적으로 유지됩니다.
제어기의 플래시 메모리에는 최대 60Kbyte의 바이트코드를 저장할 수 있는 공간이 예약되어 있습니다. 이를 소스코드로 환산하면 약 3천 라인 이상입니다. 이는 사용자가 스크립트로 필요한 기능을 구현하는데 충분한 양이 될 것입니다.
만일 제어기의 가상머신에서 프로그램이 실행 중일 때 새로운 파일을 다운로드 하면, 현재 실행 중인 프로그램은 중단되고 제어기는 새로운 바이트코드를 수신하여 플래시 메모리에 저장하게 됩니다.

※ 제어기에는 하나의 프로그램만 저장되고 실행됩니다. 만일 새로운 파일을 다운로드 하면, 기존의 저장된 프로그램에 덮어쓰게 됩니다.

15.3.2 실행

스크립트 프로그램을 실행하는 방법은 두 가지가 있습니다. 하나는, 제어기 시작 시 자동으로 실행되도록 설정하는 것입니다. 다른 하나는, 수동으로 실행되도록 설정하고 사용자가 제어기에 스크립트의 시작/종료 명령을 보내는 것입니다.
제어기 시작 시 스크립트의 실행 여부를 결정하는 것은 Motor Control UI 유틸리티에서 설정할 수 있습니다. Configuration 탭에서 Script 그룹의 Run Script at Startup 항목을 Enable 혹은 Disable 하는 것입니다.
수동으로 실행되도록 설정되었다면, USB, RS-232, CAN 포트를 통해 명령을 전송하여 실행합니다. Motor control UI 유틸리티에서 Script 탭의 [Run/Stop] 버튼으로 스크립트 프로그램을 실행하거나 중단할 수 있습니다.
만일 Hyperterminal과 같은 유틸리티가 USB나 RS-232 포트를 통해 연결되어 있다면, 다음과 같이 텍스트 기반으로 스크립트의 시작/종료 명령을 내리고 실행 상태를 읽어올 수 있습니다.

sco=8 – 스크립트 시작 명령
sst – 스크립트의 실행 상태 읽기
sco=9 – 스크립트 종료 명령
sst

자세한 내용은 “10.2.2 system_command – System Command”을 참조하기 바랍니다.
스크립트가 실행되면서 가상머신에 할당된 스택과 데이터 메모리를 초과하여 사용할 수가 있습니다. 가상머신은 수행 효율을 위해 이러한 스택과 데이터 메모리의 오버플로우를 검사하지 않습니다. 이러한 상황은 시스템 충돌로 이어져, 실행되는 스크립트를 중지하고 새로운 스크립트를 로드할 수 없게 되거나 PC와 통신할 수 없게 됩니다. 만일 이러한 상황이 발생하면 제어기의 상태를 “제품 초기 설정 값” 상태로 되돌려야 합니다. “1.3.1 리셋 스위치”를 참조하기 바랍니다.
상기와 같은 상황이 발생하는 것을 방지하기 위해, 제어기 시작 시 스크립트가 수동으로 실행되도록 설정하고 사용자가 작성한 스크립트를 충분히 테스트해야 합니다.

 

 

 

Leave A Comment

*