NXC를 이용한 마인드스톰 프로그래밍
차례 마인드스톰 NXT NXC 예제소스코드
마인드스톰의구성 NXT Servo Motor Sonic Sensor Light Sensor Sound Sensor Many Bricks Touch Sensor
마인드스톰의주요부품 NXT 마인드스톰의메인이되는부품이다. Brick 들로만든로봇을각센서들에서받아들인정보를토대로 NXT 에서컨트롤한다. NXT 상부의 A, B, C 포트에는모터를, 하부의번호포트에는센서를연결한다. 오렌지색버튼은전원 / 확인, 화살표버튼은메뉴선택, 어두운회색버튼은취소와뒤로가기기능을담당한다. 물체와센서사이의거리를측정할수있다. 255cm 까지가능하며 +/-3cm 의오차가있을수있다. 주기적으로신호를받는다. Sonic Sensor
마인드스톰의주요부품 Light Sensor Touch Sensor 물체의색을구별하는센서이다. 흑백으로색을읽어들이는단점이있지만물체의색이비슷하지않다면어느정도구별가능하다. 주기적으로신호를받는다. 물체의접촉을감지하는센서이다. Pressed, Released, Bumped( 눌렀다가뗌을반복 ) 을구별하여입력받을수있다. 인터럽트로신호가들어오며누른회수를측정할수도있다. 소리를감지하는센서다. 감지한소리의크기를 db 단위로표현한다. 주기적으로신호를받는다. Sound Sensor
마인드스톰의주요부품 Servo Motor 정방향과역방향움직임이가능하며 360 회전이가능한모터이다. 방향과회전각도, 속도조절 ( 최대속도에대한퍼센트 ) 이가능하여여러응용이가능하며한번동작명령을받으면다시동작명령을받을때까지이전의상태를유지한다.
마인드스톰의특징 NXT 자체에서간단한프로그래밍이가능하다. 각종센서를이용한상황에맞는로봇의행동설정이가능하다. USB 와 Bluetooth 를이용하여컴퓨터의프로그램을다운받아실행하거나조종이가능하다.
NXC
NXC 란? C 언어를기반으로 NXT 에맞게수정을거친언어 개발툴로 Bricx CC 를사용하며 C 언어와몇몇명령어만제외하면크게다르지않기때문에 C 언어를다룰줄아는사람이라면쉽게사용할수있다. NXC 홈페이지의 NXC Tutorial 과 NXC Guide 를참조하기를권한다. http://bricxcc.sourceforge.net/nbc/
개발툴설치 NXC 를이용한프로그래밍을위해개발툴인 Bricx CC(Bricx Command Center) 를사용한다. http://sourceforge.net/projects/bricxcc/files/ bricxcc/ Bricx CC Test Release 를다운받아압축을해제한다. 마인드스톰에동봉되어있는 CD 로 LEGO MINDSTORMS NXT 도설치하여컴퓨터가 NXT 를인식할수있도록한다.
Bricx CC 설정 Bricx CC 실행시처음으로나타나는화면이며설정에맞는 Brick 을찾아연결하는과정이다. NXT 를컴퓨터에연결하고해당 Port 로설정한다. Brick Type 은 NXT, 그리고 Firmware 는 Standard 로한다. Cancel 을눌러취소하고컴파일전에메뉴의 [Tools]-[Find Brick] 을실행하여설정할수도있다.
Bricx CC 설정 메뉴의 [Edit] [Preference] 를선택하여위의창을띄운다 [Compiler] 탭의 [Common] 에서 Preferred language for standard firmware 항목을 NXC 로설정한다.
컴파일및실행 컴파일전에브릭이연결되어있지않다면반드시 [Tools]-[Find Brick] 를실행하여브릭을연결후컴파일을한다. Bricx CC 의메뉴의오른쪽에있는버튼들이다. 왼쪽부터오른쪽으로, 첫번째버튼이컴파일버튼이다. 소스코드를브릭에맞게컴파일한다. 두번째버튼은다운로드버튼이다. 컴파일된프로그램을 NXT 에다운로드시킨다. 세번째버튼은프로그램실행, 네번째는실행중인프로그램을중지시키는버튼이다. 실행과중지는 NXT 의 [My Files]-[Software files]- [ 소스코드명 ] 을선택하여할수도있다.
예제 코드
#1 Motors Test // #1 motors test task main() { int speed = 10; int time = 500; // 0.5sec while(true) { OnFwd(OUT_AC, speed); OnRev(OUT_B, speed); Wait(1000); if(speed < 100) { speed += 10; } else { break; } } 요구사항 모터 A,C : 정방향으로작동 모터 B : 역방향으로작동 1 초에 10% 씩속도증가 속도가 100% 이상일경우모터 A,B 바로정지, 모터 B 부드럽게정지. } Off(OUT_AC); Float(OUT_B); // Coast(OUT_B);
#2 Sensors Test // #2 sensors test #define SOUND 50 #define BRIGHT 40 #define DISTANCE 15 task main() { SetSensorTouch(IN_1); SetSensorSound(IN_2); SetSensorLight(IN_3); SetSensorLowspeed(IN_4); until(sensor_1 == 1); OnFwd(OUT_A, 20); until(sensor_2 > SOUND); OnFwd(OUT_B, 50); 요구사항 다음입력을순차적으로받아들일것 Touch Sensor에입력이들어오면모터 A를 20% 의속력으로회전시킴 Sound Sensor에 40% 이상의소리가입력시모터 B를 50% 의속력으로회전시킴 Light Sensor에 50% 이상의빛이들어올경우모터 C를 50% 의속력으로회전시킴 Ultrasonic Sensor로 15Cm 미만의물체를감지할경우모터 A, B, C 작동을중단시킴. until(sensor_3 >= BRIGHT); OnFwd(OUT_C, 50); until(sensorus(in_4) < DISTANCE); Off(OUT_ABC); }
#3 Parallel Test 요구사항 다음이벤트들을병렬로처리할것 Touch Sensor 에신호가 1 일경우모터 A 를정방향으로작동시 킨다. 신호가 0 일경우역방향으로작동시킨다. Light Sensor 에 40% 이상의빛이들어올경우모터 B 를정방향으로작동시킨다. 그반대일경우역방향으로작동시킨다. Ultrasonic Sensor 에 15Cm 이하의물체가감지되면모터 C 를정방향으로작동시킨다. 그반대일경우역방향으로작동시킨다.
#3 Parallel Test // #3 parallel test #define BRIGHT 40 #define DISTANCE 15 task motor_a() { while(true) { if (SENSOR_1 == 1) { OnFwd(OUT_A, 75); Wait(300); } else { OnRev(OUT_A, 75); Wait(300); } } } task motor_b() { while(true) { if (SENSOR_3 > BRIGHT) { OnFwd(OUT_B, 75); Wait(300); } else { OnRev(OUT_B, 75); Wait(300); } } } task motor_c() { while(true) { if (SENSOR_4 < DISTANCE) { OnFwd(OUT_C, 75); Wait(300); } else { OnRev(OUT_C, 75); Wait(300); } } } task main() { Precedes(motor_A, motor_b, motor_c); SetSensorTouch(IN_1); SetSensorLight(IN_3); SetSensorLowspeed(IN_4); }
#4 Problem on Parallel // #4 problem on parallel task move_fwd() { while(true) { OnFwd(OUT_A, 20); Wait(3000); } } task move_rev() { while(true) { if(sensor_1 == 1) { OnRev(OUT_A, 20); Wait(3000); } } } 두개의각기다른함수가동시에 하나의자원을사용할때예상치 못한문제점발생. task main() { Precedes(move_fwd, move_rev); SetSensorTouch(IN_1); }
#5 Solution - mutex // #4 problem on parallel mutex motora; task move_fwd() { while(true) { Acquire(motorA); OnFwd(OUT_A, 20); Wait(500); Release(motorA); } } task move_rev() { while(true) { if(sensor_1 == 1) { Acquire(motorA); OnRev(OUT_A, 20); Wait(500); Release(motorA); } } } Mutex 를이용하여하나의자원에 여러프로세스가동시에접근하는 것을막을수있음. task main() { Precedes(move_fwd, move_rev); SetSensorTouch(IN_1); }
구조적분석 : 분석서
문제정의 로봇은정지상태로시작한다. 정지상태에서는어떤입력에도반응하지않는다. 터치센서에입력이들어오면전진하고누르고있는동안속도가증가한다. 속도가최대치 (100) 에다다르면속도를 10 으로돌려놓는다. 전진하는동안박수를치게되면 ( 사운드센서의입력이 40 이상이되면 )! Startup.rso 소리를재생한다.! Startup.rso 소리파일은 NXT 초기가동시출력되는소리이다. 전진하는동안밝기가어두워지면 ( 라이트센서의입력이 40 미만이되면 ) 동작을멈춘다. 동작을멈춘상태에서는어떤입력에도반응하지않는다. 다시밝아진다면이전속도로전진한다. 전진도중에 20Cm 전방의장애물을만나면 3 초간후진하고, 다시이전속도로전진한다. 후진도중에는어떤입력에도반응하지않는다.
문제정의 시스템범위및구조 Input Sensor : 입력센서를통해상황을인식한다. Speaker : 제어결과에따라소리를출력한다. Motor : 제어결과에따라로봇을이동시킨다. Control : 입력센서의입력정보에따라로봇의작동을제어한다. Speaker 소리출력 입력센서 Input Sensor Control Motor 바퀴 자동운전로봇시스템
문제정의 입력센서 Ultrasonic Sensor 로봇이장애물을인식하게한다. Sound Sensor 로봇이사용자의박수소리에반응하도록한다. Light Sensor 로봇이주변의밝기를인식하게한다. Touch Sensor 사용자가누르면반응하도록한다.
문제정의 주요시나리오 속도를조절한다. 속도를최대로높였다가다시낮아지는것을확인한다. 전방에장애물을인식한다. 로봇이 3 초간전진시와같은속도로후진한다. 3 초후다시전과같은속도로전진한다. 불을끈다. 불이다시켜질때까지어떤동작도하지않는다.
시스템문맥도작성 Touch Sensor Speaker Sound Sensor Light Sensor Robot Control 0 Ultrasonic Sensor Motor Time Digital Clock
로봇제어정보테이블 정보 설명 Touch Input 터치센서를사용자가눌렀음을나타낸다. Sound Input Bright Input Distance Input Sound Sensor 를통해들어오는소리의정보를나타낸다. 주기적으로읽혀지며주기는 10ms 이다. Light Sensor 를통해들어오는밝기를나타내는정보이다. 주기적으로읽혀지며주기는 10ms 이다. Ultrasonic Sensor 를통해들어오는사물과의거리정보를나타낸다주기적으로읽혀지며주기는 10ms 이다. Time 타이머인터럽트로서 10ms 주기로입력된다. Speak Speaker 를통해서외부로의출력정보를나타낸다. Motor 로봇제어에의한모터의제어정보를나타낸다. 속도와방향을가진다.
데이터흐름도작성 Speed Clap Control Sensor 1 Direction Dark Control Unit 2 Time
Control Sensor 1 분할 Touch Input Touch Interface 1.1 [Asynchronou s Device] Speed Sound Input Time Bright Input Sound Interface 1.2 [Periodic Device] Light Interface 1.3 [Periodic Device] Bright Control Input Sensor 1.5 Dark Time Distance Input Ultrasonic Interface 1.4 [Periodic Device] Time
Control Input Sensor 1.5 분할 Sound Bright Touch Distance Sensor Control 1.5.1 [Control] Enable Disable isdark 1.5.4 Dark Trigger Speed Trigger isclap 1.5.3 Clap Save Speed 1.5.2 Speed
상태머신 sensor control 1.5.1 Idle Touch[Bright >= 40 && Distance >= 20] / Trigger Save Speed [Sound > 40 & Bright >= 40 & Distance >= 20] / Trigger isclap Touch / Trigger Save Speed Forward [Bright < 40] / Enable isdark [Bright >= 40] / Disable isdark Blocked [Bright >= 40 & Distance < 20] / Backward Timeout(3) [Bright >= 40 & Distance >= 20] / Backward Timeout(3) [Bright >= 40 & Distance < 20] / Backward Reverse Timeout(3) [Bright < 40] / Enable isdark
Control Unit 2 분할 Speaker Interface 2.2 [Asynchronou s Device] Speak Clap Dark Control Output Unit 2.1 Direction Speed Motor Interface 2.3 [Asynchronou s Device] Motor
Control Output Unit 2.1 분할 Dark Clap Unit Control 2.1.1 [Control] Trigger Speak Sentence 2.1.4 Sound Info Speed Move Backward 2.1.3 Motor Action Move Forward 2.1.2 Motor Action
상태머신 Unit Control 2.1.1 Clap &!Dark &!Reverse /Trigger Speak sentence Forward Stop Reverse &!Dark / Disable Move Forward Enable Move Backward Forward &!Dark / Disable Move Backward Enable Move Forward Reverse Clap &!Dark &!Reverse /Trigger Speak sentence
1.1 [A] 1.2 [P] 1.5.1 [C] 1.5.4 2.1.1 [C] 2.1.4 2.2 [A] 1.3 [P] 1.5.3 2.1.3 1.4 [P] 1.5.2 Speed 2.1.2 2.3 [A] A : Asynchronous P : Periodic C : Control
프로세스명세 PSpec 1.1 Stereotype Input Output Touch Interface Asynchronous Function Touch Input (bool)touch Process Touch Sensor 에서 Touch Input 을받으면 Sensor Control 프로세스에 Touch 를보내어 Touch Input 이들어왔음을알린다. Touch 는 True/False 로구분되며입력이들어왔을때가 True 이다. PSpec 1.2 Stereotype Input Output Sound Interface Periodic Function Sound Input (int)sound Process Sound Sensor 에서 Sound Input 을받으면 Sensor Control 프로세스에 Sound 를보낸다. Sound 는 Sound Sensor 에서감지한소리의크기정보데이터다.
PSpec 1.3 Stereotype Input Output Light Interface Periodic Funtion Bright Input (int)bright Process Light Sensor 에서 Bright Input 을받으면 Sensor Control 프로세스에 Bright 를보낸다. Bright 는 Light Sensor 에서감지한밝기정보데이터다. PSpec 1.4 Stereotype Input Output Ultrasonic Interface Periodic Function Distance Input (int)distance Process Ultrasonic Sensor 에서 Distance Input 을받으면 Sensor Control 프로세스에 Distance 를보낸다. Distance 는 Ultrasonic Sensor 에서감지한물체와의거리정보데이터다.
PSpec 1.5.1 Stereotype Input Output Sensor Control Control (bool)touch, (int)sound, (int)distance In, (bool)dark Trigger, (bool)direction Process 현재의상태에서입력에따라행동을결정하고, 행동을수행하기위한이벤트를발생시킨다. PSpec 1.5.2 Stereotype Input Output Save Speed Synchronous Function Trigger, (int)speed (int)speed Process Trigger 이벤트를통해서수행되며현재의 Speed 데이터를읽어서크기가 100 이상이면 10 으로, 100 미만이면현재 Speed 에서 10 추가한값을저장한다.
PSpec 1.5.3 Stereotype Input Output isclap Synchronous Function Trigger (bool)clap Process Trigger 이벤트를통하여수행되며 Unit Control 프로세스에게 Clap 이벤트를보내어 Speak Sentence 프로세스에게 Trigger 이벤트를보내도록하는프로세스이다. PSpec 1.5.4 Stereotype Input Output isdark Synchronous Function Enable, Disable (bool)dark Process Enable 이벤트가발생시수행되며 Unit Control 프로세스에게 Dark 이벤트를보내어 Move Reverse 프로세스에게 Enable 이벤트를보내도록하는프로세스이다.
PSpec 2.1.1 Stereotype Input Output Unit Control Control (bool)dark, (bool)clap, (bool)direction, (int)speed Trigger, Enable, Disable Process 현재의상태에서입력에따라행동을결정하고, 행동을수행하기위한이벤트를발생시킨다. PSpec 2.1.2 Stereotype Input Output Move Forward Synchronous Function Enable, Disable (int, bool)motor Action Process Enable 이벤트가발생시수행되며 Motor Interface 에게 Motor Action 데이터를보내어 Motor 가앞으로동작하도록하는프로세스이다. Motor Action 에는 Motor 의진행방향과속도가포함된다.
PSpec 2.1.3 Stereotype Input Output Move Backward Synchronous Function Enable, Disable (bool, int)motor Action Process Enable 이벤트가발생시수행되며 Motor Interface 에게 Motor Action 데이터를보내어 Motor 가뒤로동작하도록하는프로세스이다. Motor Action 에는 Motor 의진행방향과속도가포함된다. PSpec 2.1.4 Stereotype Input Output Speak Sentence Synchronous Function Trigger Sound Info Process Trigger 이벤트가발생시수행되며 Speaker Interface 에게 Sound Info 데이터를보내어 Speaker 가소리를내도록하는프로세스이다. Sound Info 는 Speaker 가낼실제소리정보다.
PSpec 2.2 Stereotype Input Output Speaker Interface Asynchronous Function Sound Info Speak Process Sound Info 데이터를받아 Speaker 에게 Speak 데이터를보내소리를내게하는프로세스이다. PSpec 2.3 Stereotype Input Output Motor Interface Asynchronous Function Motor Action Motor Process Motor Action 데이터를받아 Motor 에게 Motor 데이터를보내어움직이게하는프로세스이다.
데이터사전작성 데이터명 Clap Dark Direction Speed 설명 Sound Sensor 를통해들어오는소리의크기가 40 을넘었음을알려, Speaker 를통해 Speak 를내기위해보내는정보다. Bright 가 40 미만이면로봇의모든동작을멈추기위해보내는정보이다. True 와 False 로구분되며 True 일때 Bright 가 40 미만임을나타낸다. Distance 의정보에따라모터의방향을결정하기위해보내는정보다. Direction 의값은 Distance 가 15 미만일때 Backward, 15 이상일때 Forward 가된다. 0 이상 100 이하의값을가지며값은모터의최대속도에대한비율을나타낸다. Touch 가들어올때마다 10 씩증가하며, Speed 의값이 100 일경우 Touch 가들어오면 Speed 의값은 10 이된다. 초기값은 10 이다.
데이터명 Sound Info Motor Action Touch Sound Bright Distance 설명 Speaker 가실제로낼소리데이터를나타낸다. NXT 에내장되어있는소리데이터베이스를이용하며프로그램코드상에서지정할수있다. 모터의속도와방향정보를포함하는데이터이다. 데이터저장소인 Speed와 Direction을사용한다. Touch Sensor 로부터 Touch Input 이들어왔음을나타내는이벤트이다. True/False 로구성되며 True 일때가 Touch Input 이들어왔을때이다. Sound Sensor 로부터들어오는 Sound Input 의크기데이터이다. Light Sensor 로부터들어오는 Bright Input 의크기데이터이다. Ultrasonic Sensor 를통해들어오는 Distance Input 의크기데이터이다.
구조적설계 : 설계서
후보태스크선정 1.1 [A] 1.2 [P] 1.5.1 [C] 1.5.4 2.1.1 [C] 2.1.4 2.2 [A] 1.3 [P] 1.5.3 2.1.3 1.4 [P] 1.5.2 Speed 2.1.2 2.3 [A]
TASK MODEL Touch Input Touch Speaker Speak Sound Input Sound Time Sensor Control Unit Control Bright Input Time Distance Input Light Ultrasonic Speed Motor Motor Time
식별된태스크에대한모듈정의 프로세스 선별기준 모듈 Task 1 Touch Interface 1.1 Asynchronous Touch Task 2 Sound Interface 1.2 Periodic Sound Task 3 Light Interface 1.3 Periodic Light Task 4 Ultrasonic Interface 1.4 Periodic Ultrasonic Task 5 Sensor control 1.5.1 Save Speed 1.5.2 isclap 1.5.3 isdark 1.5.4 Control 제어응집도제어응집도제어응집도 Sensor control Task 6 Unit control 2.1.1 Speak Sentence 2.1.2 Move Forward 2.1.3 Move Backward 2.1.4 Control 제어응집도제어응집도제어응집도 Unit control Task 7 Speaker Interface 2.2 Asynchronous Speaker Task 8 Motor Interface 2.3 Asynchronous Motor
모듈구조 - 초기 Unit Control Sensor Control Forward Backward Touch Sound Light Ultraso Save nic Speed Speak Motor
모듈구조 - 상세 Application Unit Control Sensor Control Forward Backward Save Speed Input Interface Output Interface ` Touch Sound Light Ultraso nic Speak Motor
모듈정의 모듈 ID RC_AM01 모듈명 Unit Control 모듈개요 인터페이스 Sensor Control 로부터의입력값을이용해 Speaker 와 Motor 을제어함 없음 프로그램구동시에실행 모듈 ID RC_AM02 모듈명 Sensor Control 모듈개요 인터페이스 4 개의센서로부터입력을받아처리함 get_sensors() 입력된값들을처리하여구조체 (m_sensors) 를반환하는함수 모듈 ID RC_AM03 모듈명 Save Speed 모듈개요 인터페이스 Sensor Control 에의해불려져모터의속도를저장해줌 save_speed(int m_current_speed) 현재속도를인자로받아속도를확인한후계산하여다시반환해주는함수
모듈정의 모듈 ID RC_AM04 모듈명 Forward 모듈개요 인터페이스 현재저장된속도에맞게모터를정방향으로회전시킴 set_forward(int m_current_speed) 현재저장된속도를인자로받아모터를작동시키는함수 모듈 ID RC_AM05 모듈명 Backward 모듈개요 인터페이스 현재저장된속도에맞게모터를역방향으로회전시킴 set_backward(int m_current_speed) 현재저장된속도를인자로받아모터를작동시키는함수 모듈 ID RC_IM01 모듈명 Touch 모듈개요 인터페이스 외부에있는 Touch Sensor 로부터의입력을소프트웨어에서사용할수있도록처리함. get_touch_input() Touch Sensor 의입력을받아 (bool)m_touch 로반환하는함수
모듈정의 모듈 ID RC_IM02 모듈명 Sound 모듈개요 인터페이스 외부에있는 Sound Sensor 로부터의입력을소프트웨어에서사용할수있도록처리함. get_sound_input() Sound Sensor 의입력을받아 (int)m_sound 로반환하는함수 모듈 ID RC_IM03 모듈명 Light 모듈개요 인터페이스 외부에있는 Light Sensor 로부터의입력을소프트웨어에서사용할수있도록처리함. get_light_input() Light Sensor 의입력을받아 (int)m_bright 로반환하는함수 모듈 ID RC_IM04 모듈명 Ultrasonic 모듈개요 인터페이스 외부에있는 Ultrasonic Sensor 로부터의입력을소프트웨어에서사용할수있도록처리함. get_ultrasonic_input() Ultrasonic Sensor 의입력을받아 (int)m_distance 로반환하는함수
모듈정의 모듈 ID RC_OM01 모듈명 Speaker 모듈개요 인터페이스 소프트웨어에서처리된출력값을이용해외부스피커를동작할수있도록처리함 set_speaker() 외부장치인 Speaker 를동작하게하는함수 모듈 ID RC_OM02 모듈명 Motor 모듈개요 인터페이스 소프트웨어에서처리된출력값을이용해외부스피커를동작할수있도록처리함 set_motor() 현재속도값인 (int)m_current_speed 를인자로받는함수 set_forward() 또는 set_backward() 에의해불려지는함수. 모터의동작을제어하는함수이다.
Balanced System Unit Control Input Function Function Function Output 외부입력 -Dark -Clap -Direction 데이터저장소입력 - Speed 내부프로세스 -Speak Sentence -Move Reverse -Move Forward 외부출력 -Sound Info -Motor Action
구조차트 main m_sensors get_sensors m_current_speed m_current_speed m_sound m_touch m_current_speed m_current_speed m_distance get_light_input set_speaker set_forward set_backward get_touch_in get_light_input put get_sound_i get_light_input nput m_bright get_ultrasoni get_light_input c_input save_speed get_light_inp get_light_input ut get_light_input set_motor
데이터정의 데이터명설명타입 m_touch 터치센서의입력정보를가진변수. bool m_current_spe ed 로봇이움직이는속도정보를가진전역번수 int (0~100) m_sound 사운드센서의입력정보를가진변수 int(0~100) m_bright 라이트센서의입력정보를가진변수 int(0~100) m_distance m_sensors 울트라소닉센서의입력정보를가진변수 센서들의입력정보가유효한지여부를가진구조체 int(0~255) struct (m_sound, m_bright, m_distance)