<41424F54BDC7BDC0B1B3C0E75BC1A632BACE5D2E687770>

Size: px
Start display at page:

Download "<41424F54BDC7BDC0B1B3C0E75BC1A632BACE5D2E687770>"

Transcription

1 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

2 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

3 No problem! The activities and projects in this text start with an introduction to the BOE Shield-Bot s brain, the Arduino Uno. Then, you will build, test, and calibrate the BOE Shield-Bot. Next, you will learn to program the BOE Shield-Bot for basic maneuvers. After that, you ll be ready to add different kinds of sensors, and write sketches to make the BOE Shield-Bot sense its environment and respond on its own This is a good place to start! The code examples introduce Arduino programming concepts little by little, with each example sketch explained fully. See how each electronic component is used with a circuit symbol and part drawing. Traditional schematics next to wiring diagrams make it easy to build the circuits. are used in the auto, medical, and manufacturing industries, in all manner of exploration vehicles, and, of course, in many science fiction films. The word robot first appeared in a Czechoslovakian satirical play, Rossum s Universal Robots, by Karel Capek in Robots in this play tended to be human-like. From this point onward, it seemed that many science fiction stories involved these robots trying to fit into society and make sense out of human emotions. This changed when General Motors installed the first robots in its manufacturing plant in These automated machines presented an entirely different image from the human form robots of science fiction. Building and programming a robot is a combination of mechanics, electronics, and problem-solving. What you re about to learn while doing the activities and projects in this text will be relevant to real-world applications that use robotic control, the only differences being the size and sophistication. The mechanical principles, example program listings, and circuits you will use are similar to very common elements in industrial applications developed by engineers. The goal of this text is to get you interested in and excited about the 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

4 fields of engineering, mechatronics, and software development as you construct, wire, and program an autonomous robot. This series of hands-on activities and projects will introduce you to basic robotic concepts using the BOE Shield-Bot. Its name comes from the Board of Education Shield for Arduino prototyping board that is mounted on its wheeled chassis. An example of a BOE Shield-Bot with an infrared obstacle detection circuit built on the shield s prototyping area is shown below. Andy Lindsay joined Parallax Inc. in 1999, and has since authored a dozen books, including What s a Microcontroller? as well as numerous articles and product documents for the company. The original Robotics with the Boe-Bot that is the inspiration for this book was designed and updated based on observations and educator feedback that Andy collected while traveling the nation and abroad teaching Parallax Educator Courses and events. Andy studied Electrical and Electronic Engineering at California State University, Sacramento, and is a contributing author to several papers that address the topic of microcontrollers in pre-engineering curricula. When he s not writing educational material, Andy does product and application engineering for Parallax. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

5 아두이노로봇가지고놀기 교재는미국 Parallax.com 사의온라인배포자료 ( 를한국어로번역한것이다. 그리고 Parallax 사의부품을사용하면여러분들이본교재와동일한실습을수행할수있도록되어있다. 아두이노로봇 (ABOT) 은아두이노를사용한로봇자동차라는뜻으로프라이봇이붙인새로운이름이며, Ardunio Uno, Duemilanove 와 Mega 중하나의마이크로컨트롤러그리고 Parallax사의 Robotics Shield Kit를준비하여조립제작할수있다. ABOT은중 / 고등교보재또는대학교보재등으로사용될수있는로봇이며, 로봇초보자이거나마이크로컨트롤러프로그래밍초보자이거나전자공학초보자이더라도본교재를사용하여일련의실습과정들을충분히따라할수있다. 이교재는 ABOT을위한아두이노제어, ABOT을조립하고주행하기, 다양한센서들을이용하여 ABOT 제어하기등을여러분들로하여금직접다루게할것이다. 그리고이교재의목표는여러분들이자동차조립, 전자회로배선, 프로그래밍에대한엔지니어링, 메카트로닉스, 소프트웨어기술개발에흥미를갖도록하는것이다. 프라이봇 ( 은역자들과함께향후에도지속적인정보와자료를여러분들에게제공할계획이다. 짧은시간동안작업한내용이라조금은거칠고부족한점이있지만, 여러분들의지도와편달을기대하며이교재를공개한다. 마지막으로번역을위해시간을할애해주신아래역자님들께도여러분들과함께심심한감사의뜻을전한다. 번역자심재창 : jcshim@andong.ac.kr 경북대학교전자공학과공학박사현 ) 국립안동대학교컴퓨터공학과교수 번역자고주영 : sonice@andong.ac.kr 안동대학교멀티미디어공학과공학박사현 ) 안동대학교교육개발원강사 번역자이영학 : annaturu@ikw.ac.kr 영남대학교전자공학과공학박사현 ) 경운대학교항공대학항공전자공학과교수 번역자정욱진 : mail@fribot.com 경북대학교전자공학과공학박사현 ) 위덕대학교전자공학과강사 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

6 촉각스위치들을범퍼스위치혹은터치스위치라고부른다. 그리고이것들은로봇에서많이이용된다. 물체를들어올리고다른컨베이어벨트에옮기기위해프로그램된로봇은물체를감지하기위해촉각스위치에의존한다. 자동화된공장라인은물체를카운터하기위해그리고제조공정에서임의의스텝에대한부품들을일렬로세우기위해촉각스위치를사용할것이다. 각각의경우, 스위치들은프로그램된출력의어떤형식을트리거하여입력값으로제공할것이다. 입력값들은스위치가눌러졌는지혹은그렇지않은지에따라다른동작을하는장비공정에서전기적으로모니터링된다. 이장에서, 여러분은더듬이로불리는촉각스위치를 ABOT에장착하고테스트한다. 여러분은이러한스위치들의상태를모니터하기위해그리고이것이장애물과만날때, 무엇을할것인가를결정하기위해 ABOT을프로그램할것이다. 최종결과는터치에의한자율주행이될것이다. 촉각주행 더듬이스위치는고양이의많은수염처럼, 이리저리돌아다닐때터치를통하여로봇의주변을센싱하는능력을제공한다. 이장의활동들은그들스스로더듬이를이용하는것이지만, 이장의후반부에서배우게될다른센서들과결합될수도있다. 다운로드 5 장아두이노코드 ( 인터넷에서다운로드 ) 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

7 아래링크를따라서출발합시다!!! 실습1: 더듬이만들기그리고테스트 실습2: 더듬이필드테스트 실습3: 더듬이가부착된주행 실습4: 코너탈출을위한인공지능 실습5: 종합 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

8 시스템테스트를기억하십니까? 먼저, 우리는더듬이회로를만들것이고주행스케치에서이것을이용하기전에입력상태를점검하기위해코드를작성할것이다. 더듬이회로와조립 부품목록에있는더듬이하드웨어를모은다. 보드와서보 (servo) 로부터전원은차단한다. 부품리스트 (2) 더듬이와이어 (2) 7/8 팬헤드 4-40 필립스나사 (2) ½ 둥근스페이스 (2) 나일론와셔, 사이즈 #4 (2) 3-pin m/m 헤드 (2) 저항 220 Ω ( 빨강-빨강-갈색 ) (2) 저항 10 kω ( 갈색-흑색-오렌지색 ) 더듬이만들기 서보 (servo) 주행을테스트하는동안신호를모니터할때사용되었던 LED 회로를제거하시오. 앞쪽받침대위에보드를잡고있는두개의나사를제거하시오. 나일론와셔와각각에 ½ 둥근스페이스를 7/8 나사로조립하시오. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

9 여러분의보드에있는구멍과아래받침대안쪽을통하여스크류를부착합니다. 그러나아직너무조이지는마시오. 더듬이와이어의끝에있는갈고리모양을둥근나사에밀어넣는다. 이때하나는와셔위에그리고다른하나는와셔아래에위치시키고, 서로닿지않도록이것들을교차시키시오. 받침대안에있는나사를꽉조이시오. 3-핀헤드에해당하는디지털핀 5와 7에연결하기위해 220 Ω저항을사용하시오. 각 3-핀헤드에 5V 전원을연결하기위해 10 kω 저항을사용하시오. 각더듬이를조정하고브레드보드위에 3-핀헤드와닿지않게가깝게합니다. 약 3mm거리오른쪽입니다. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

10 < 어떻게더듬이스위치가동작하는가?> 보드의바깥쪽모서리에평평한구멍이 Vss와연결되어있기때문에더듬이들이접지 (Vss) 와연결된다. 금속받침대와나사는각각더듬이로전기적연결수단을제공한다. 각더듬이는디지털 I/O에연결되어있으므로, 아두이노는각회로에적용된전압 (0V 혹은 5V) 을감지하기위해프로그램될수있다. 먼저, pinmode(pin, mode) 함수에서각핀을입력모드로세팅한다. 그런다음, digitalread(pin) 함수를이용하여핀의 HIGH 혹은 LOW 상태를감지한다. 아래그림을살펴보자. 왼쪽의 r 회로는더듬이가눌러지지않았을때 5V를적용한다. 그래서 digitalread(7) 은 1(HIGH) 값을되돌려준다. 오른쪽회로는더듬이가눌러졌을때 0V를적용한다. 그래서digitalRead(7) 함수는 0(LOW) 를되돌려준다. 가장중요한것은, 여러분스케치는변수 wleft와 wright가가지고있는리턴값을저장할수있다. 그리고이것은행동을감지하거나결정을내리기위해사용된다. 다음예제스케치는이방법을증명할것이다. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

11 스위치용어 : 각더듬이는기계적인확장이고정상열림상태 (off until pressed) 순시 (on only while pressed) 단극 (one set of electrical contact points) 단역 (only one position conducts) 스위치의전기적접지연결이다. < 더듬이테스트 > 다음스케치는 digitalread(7) 과 digitalread(5) 에의해반환되는이진값을더듬이가적당하게함수화하는지를확실하게만들기위해테스트한다. 이방법은여러분이브레드보드위에 3-핀헤드에각더듬이를누를수있다. 그리고만약아두이노의디지털핀이전기적인접촉을센싱하는지를점검하시오. 더듬이가어느쪽의 3-핀헤드에대해서도눌러지지않았을때, 여러분은각각의더듬이에대해여러분직렬모니터 (Serial Monitor) 두개의열에 1이나타나는것을기대할수있다. 만약여러분이오른쪽더듬이를누른다면오른쪽열이 0으로나타날것이다. 그리고화면은 10를나타낸다. 만약여러분이왼쪽더듬이를누르면, 왼쪽열이 0을나타낼것이고화면은 01를나타낼것이다. 물론만약여러분이양쪽더듬이를모두를누르면, 00을나타낼것이다. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

12 Active-low 출력더듬이회로는더듬이가눌러졌을때 ( 작동 ) low 신호를그리고눌러지지않았을때 high 신호를전송하는 active-low 출력으로연결된다. digitalread 가 low 신호에대해 0 를그리고 high 신호에대해 1 를리턴하므로, 0 는더듬이가눌러졌을때여러분의스케치는무엇인가일하는것이고, 1 은더듬이가눌러지지않았다는것을말한다. 여러분의아두이노에입력, 저장그리고업로드 TestWhiskers. USB 케이블을다시연결그리고 position 1에 3-position 스위치를세트한다. 스케치업로딩을끝나자마자직렬모니터를연다. 연결된 USB 케이블을분리한다. 그래서아두이노는시리얼메시지를직렬모니터 (Serial Monitor) 로보낸다. 예제스케치 : DisplayWhiskerStates /* * Robotics with the BOE Shield - DisplayWhiskerStates * Display left and right whisker states in Serial Monitor. * 1 indicates no contact; 0 indicates contact. */ void setup() tone(4, 3000, 1000); delay(1000); pinmode(7, INPUT); pinmode(5, INPUT); // Built-in initialization block // Play tone for 1 second // Delay to finish tone // Set right whisker pin to input // Set left whisker pin to input Serial.begin(9600); // Set data rate to 9600 bps void loop() byte wleft = digitalread(5); // Main loop auto-repeats // Copy left result to wleft 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

13 byte wright = digitalread(7); // Copy right result to wright Serial.print(wLeft); Serial.println(wRight); // Display left whisker state // Display right whisker state delay(50); // Pause for 50 ms 직렬모니터에나타난숫자를살펴보시오. 어떤더듬이도눌러지지않으면, 모니터는 11을표시해야하고, 5V가두개디지털입력 (5번과 7번 ) 으로공급됩니다. 오른쪽더듬이가핀세개인헤더 (three-pin header) 로접촉시키고, 직렬모니터에표시된값을기록하시오. 그값은 10이어야합니다. 직렬모니터 (Serial Monitor) 에나타나는값들을보시오. 더듬이가눌러지지않았을때, 양쪽디지털입력 (5와 7) 이 5V가적용된 11이나타날것입니다. 3-핀헤드안쪽으로오른쪽더듬이를누르고직렬모니터에나타난값을기록하시오. 이것은아마 10 일것입니다. 오른쪽더듬이를누른것을놓고 3-pin 헤드안쪽으로왼쪽더듬이를누른후, 직렬모니터에나타난값을기록하시오. 이것은아마 01 일것입니다. 3-pin 헤드에대해양쪽더듬이를누르면, 직렬모니터에 00이나타날것입니다. 만약더듬이가이러한테스트를모두통과했다면, 여러분은움직일준비가되었다는것입니다. 만약그렇지않다면여러분의스케치와회로에대한에러를점검하시오. 이러한과정은중요합니다. 진지하게, 여러분은다음단계를진행하기전에이러한테스트를통과하도록여러분의회로와코드를확실하게만들어야합니다. 이장의예제나머지부분은더듬이가올바르게작동하는지에달려있습니다. 만약여러분이테스트를하지않았고에러를올바르게고치지않았다면, 예제의나머지부분은올바르게작동하지않을것입니다. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

14 <DisplayWhiskerStates 가어떻게일하는가? > setup 함수안에서, pinmode(7, 입력 ) 과 pinmode(5, 입력 ) 는입력으로디지털핀 7과 5로세트합니다. 그래서그들은더듬이회로에의해적용된전압을모니터링할수있습니다. pinmode(7, INPUT); pinmode(5, INPUT); // Set right whisker pin to input // Set left whisker pin to input loop함수안에서, digitalread에대한각호출은더듬이가눌러졌다면 0를리턴하고, 그렇지않다면 1를리턴합니다. wleft와 wright 변수로값들이저장되며, 더듬이-왼쪽과더듬이-오른쪽에대해 short이다. byte wleft = digitalread(5); byte wright = digitalread(7); // Copy left result to wleft // Copy right result to wright 다음, Serial.print(wLeft) 함수는직렬모니터 (Serial Monitor) 에 wleft 의값을나타냅니다. 그리고 Serial.println(wRight) 함수는직렬모니터에 wright 의값을나타냅니다. Serial.print(wLeft); Serial.println(wRight); // Display left whisker state // Display right whisker state loop함수가반복하기전에, delay(50) 을넣는다. 이것은직렬모니터가매초마다받는많은메시지를천천히하기위해서입니다. 아마이것이필요없을지도모르지만, 우리는보다오래된하드웨어와어떤 OS컴퓨터에대해서버퍼의과동작 ( 너무많은데이터를저장 ) 가능성을막기위해서입니다. 여러분차례 - 함수호출 nesting 여러분의스케치는 digitalread로부터값을저장하기위해변수를사용할필요가없습니다. 대신에 digitalread리턴하는값 0 혹은 1이 Serial.print() 함수안에서함수호출하는함수내의함수에의해바로사용되어진다. 직렬모니터에리턴값을곧바로보낸다. 이러한경우, 여러분의 loop함수는다음과같을것이다.: 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

15 void loop() // Main loop auto-repeats Serial.print(digitalRead(5)); // Display wleft Serial.println(digitalRead(7)); // Display wright delay(50); // Pause for 50 ms loop함수를대치하여, 스케치를업로드하시오. 그리고더듬이가같은함수로작동하는지를확인하시오. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

16 만약여러분이얼마의시간이지난후더듬이를테스트해야한다면컴퓨터없이무엇을할것인가? 이러한경우, 직렬모니터는이용할수없으며, 여러분이할수있는것은무엇입니까? 한가지방법은더듬이의상태를나타내기위해 LED 회로를이용하는것입니다. 이것은더듬이가눌려지거나혹은눌려지지않았을때 LED에불을켜는간단한스케치로만들어집니다. 부품목록 : (2) 220 Ω 저항 (2) 적색 LED LED 더듬이테스트회로를구성하라. BOE Shield-Bot의배터리팩과 USB 케이블을분리합니다. 아래와같이회로를구성하시오. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

17 LED 더듬이테스트회로프로그래밍 WhiskerStates를 TestWhiskersWithLEDs로다시저장하시오. setup() 함수에 pinmode() 호출을추가하고, 디지털핀 8과 2를출력으로세팅하시오. pinmode(8, OUTPUT); pinmode(2, OUTPUT); // Left LED indicator -> output // Right LED indicator -> output 더듬이입력상태를제어하는 LED를만들기위해, Serial.println(wRight) 와 delay(50) 사이에두개의 if...else문장을삽입하시오. if(wleft == 0) digitalwrite(8, HIGH); else // If left whisker contact // Left LED on // if no left whisker contact 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

18 digitalwrite(8, LOW); // Left LED off if(wright == 0) digitalwrite(2, HIGH); else digitalwrite(2, LOW); // If right whisker contact // Right LED on // If no right whisker contact // Right LED off if...else문장은조건을기본으로하는코드블록을실행한다는것을상기하시오. 다음은만약 wleft가 0을저장한다면, digitalwrite(8, HIGH) 함수호출을실행할것입니다. 만약 wleft가 1을저장한다면, digitalwrite(8, LOW) 함수호출을실행할것입니다. 결과는? 왼쪽더듬이가눌려졌을때혹은왼쪽 LED가불이켜지고, 왼쪽더듬이가눌려지지않았을경우 LED불은꺼진다. 두번째 if else 문장은 LED회로에대해 wright가위와같은일을합니다. BOE 쉴드의전원스위치를 1의위치에놓으시오. 아두이노프로그래밍케이블을다시연결하시오. TestWhiskersWithLeds를저장하고, 여러분의아두이노로업로드하시오. 브레드보드안의 3-핀헤드기둥에각각의더듬이를서서히누르면서스케치를테스트하시오. 브레드보드의한쪽위에있는빨강 LED는더듬이가눌려졌을때더듬이가접촉이되었다는것을나타내는불이켜집니다. 두개 LED가불이들어오고어떤상태에서도유지된다면, 여러분의전원스위치가아마도 0의위치에있는것입니다. 전원스위치를 1의위치로옮기고다시시도하시오. /* * Robotics with the BOE Shield - TestWhiskersWithLeds * Display left and right whisker states in Serial Monitor. * 1 indicates no contact; 0 indicates contact. * Display whisker states with LEDs. LED on indicates contact; * off indicates none. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

19 */ void setup() pinmode(7, INPUT); pinmode(5, INPUT); pinmode(8, OUTPUT); pinmode(2, OUTPUT); // Built-in initialization block // Set right whisker pin to input // Set left whisker pin to input // Left LED indicator -> output // Right LED indicator -> output tone(4, 3000, 1000); delay(1000); // Play tone for 1 second // Delay to finish tone Serial.begin(9600); // Set serial data rate to 9600 void loop() byte wleft = digitalread(5); byte wright = digitalread(7); // Main loop auto-repeats // Copy left result to wleft // Copy right result to wright if(wleft == 0) digitalwrite(8, HIGH); else digitalwrite(8, LOW); // If left whisker contact // Left LED on // if no left whisker contact // Left LED off if(wright == 0) digitalwrite(2, HIGH); else // If right whisker contact // Right LED on // If no right whisker contact 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

20 digitalwrite(2, LOW); // Right LED off Serial.print(wLeft); Serial.println(wRight); delay(50); // Display wleft // Display wright // Pause for 50 ms 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

21 이전에우리들의스케치는 ABOT이여러분혹은프로그래머에의해사전정의된동작리스트를실행하는것으로만들어졌다. 이제여러분은더듬이스위치를모니터하고응답으로활동을트리거하는아두이노를만들기위해스케치를사용할수있다. ABOT을운전하고만약어떤것에부딪친다면스스로자율주행을선택하도록스케치를사용할수있다. 이것이자율로봇의예이다. 더듬이주행 RoamingWithWhiskers 스케치는 ABOT이하나혹은양쪽에장애물을만날때까지더듬이입력을지켜보면서앞으로움직이도록만드는것이다. 아두이노가더듬이의전기적인접촉을센싱하자마자무엇을할것인지를결정하기위해 i f else문을사용할것이다. 결정코드는더듬이가접촉 / 비접촉의여러가지조합의경우를점검할것이다. 그리고후진-회전주행을실행하기위해 4장으로부터주행함수를호출한다. 그런다음, ABOT은다른장애물을만날때까지전진동작을다시할것이다. 예제스케치 : RoamingWithWhiskers 스케치를먼저시도하자. 그리고이것이어떻게움지이는가를좀더가까이서지켜보자. 3-위치스위치를위치 1로놓으시오. ABOT의배터리팩을아두이노에다시연결하시오. 입력, 저장그리고 RoamingWithWhiskers를업로드하시오. 프로그래밍케이블을 ABOT에서분리하고전원스위치를 2로놓는다. 바닥에 ABOT을놓고, 이것이움직이도록해보라. 더듬이스위치를장착한로봇이자신의경로에서장애물을만났을때, 로봇은후진, 회전그리고나서새로운방향으로돌아다닐것이다. // Robotics with the BOE Shield - RoamingWithWhiskers // Go forward. Back up and turn if whiskers indicate BOE Shield bot bumped 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

22 // into something. #include <Servo.h> Servo servoleft; Servo servoright; // Include servo library // Declare left and right servos void setup() pinmode(7, INPUT); pinmode(5, INPUT); // Built-in initialization block // Set right whisker pin to input // Set left whisker pin to input tone(4, 3000, 1000); delay(1000); // Play tone for 1 second // Delay to finish tone servoleft.attach(13); // Attach left signal to pin 13 servoright.attach(12); // Attach right signal to pin 12 void loop() byte wleft = digitalread(5); byte wright = digitalread(7); // Main loop auto-repeats // Copy left result to wleft // Copy right result to wright if((wleft == 0) && (wright == 0)) // If both whiskers contact backward(1000); // Back up 1 second turnleft(800); // Turn left about 120 degrees else if(wleft == 0) // If only left whisker contact backward(1000); // Back up 1 second turnright(400); // Turn right about 60 degrees else if(wright == 0) // If only right whisker contact 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

23 backward(1000); turnleft(400); else forward(20); // Back up 1 second // Turn left about 60 degrees // Otherwise, no whisker contact // Forward 1/50 of a second void forward(int time) // Forward function servoleft.writemicroseconds(1700); // Left wheel counterclockwise servoright.writemicroseconds(1300); // Right wheel clockwise delay(time); // Maneuver for time ms void turnleft(int time) servoleft.writemicroseconds(1300); servoright.writemicroseconds(1300); delay(time); // Left turn function // Left wheel clockwise // Right wheel clockwise // Maneuver for time ms void turnright(int time) servoleft.writemicroseconds(1700); servoright.writemicroseconds(1700); counterclockwise delay(time); // Right turn function // Left wheel counterclockwise // Right wheel // Maneuver for time ms void backward(int time) servoleft.writemicroseconds(1300); // Backward function // Left wheel clockwise 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

24 servoright.writemicroseconds(1700); // Right wheel counterclockwise delay(time); // Maneuver for time ms <RoamingWithWhiskers 가어떻게일을하는가?> loop함수안에있는 if...else if...else문장은더듬이가주의를요구하는어떤상태를점검합니다. 문장의시작은 if((wleft == 0) && (wright == 0)) 입니다. 번역하면, wleft변수와 wright변수가모두 0인조건을만족한다면 을의미하는것이다. 두변수가 0이라면 if 문장의코드블록은backward(1000) 와 turnleft(800) 을실행합니다. if((wleft == 0) && (wright == 0)) // If both whiskers contact backward(1000); // Back up 1 second turnleft(800); // Turn left about 120 degrees if else if else문장안에서, 스케치는조건이만족되지않는경우코드블록을건너뛰게됩니다. 그리고조건을만족할때까지점검을계속할것이다. 스케치가참값을찾았을때, 코드블록안에있는무엇인가를실행한다. 그런다음또다른점검없이 if else if else문장의끝으로건너뛴다. 그리고스케치안에있는그밖의다른명령에따라움직인다. 그래서만약양쪽더듬이가눌려지지않았다면, 첫번째 if문은참이아니고코드블록은건너뛴다. 스케치는첫번째 else if문을점검할것이다. 그래서, 왼쪽더듬이가눌려지고이문장의코드블록안에있는함수를실행할것이다. 1초동안뒤로움직이고난후, 0.4초동안왼쪽으로회전할것이다. 스케치는조건의나머지부분은건너뛰고마지막 else문뒤에오는어떤동작을수행할것이다. else if(wleft == 0) backward(1000); turnright(400); // If only left whisker contact // Back up 1 second // Turn right about 60 degrees 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

25 만약오른쪽더듬이가장애물을감지했다면, 첫번째두코드블록은건너뛰고 if(wright == 0) 블록을실행할것이다. else if(wright == 0) backward(1000); turnleft(400); // If only right whisker contact // Back up 1 second // Turn left about 60 degrees 이전의모든문장조건이참을나타내지않을경우 else 함수가실행된다. 이것은필요하지않지만, 더듬이가눌려지지않을경우유용하다. 만약그러한경우, ABOT은 20ms동안앞쪽방향으로진행한다. loop를반복하기전에왜이런작은시간을사용하는가? 재점검하기전에작은전진시간은 ABOT이앞으로움직일때더듬이센서로부터빠르게변화를감지하기위한것이다. else forward(20); // Otherwise, no whisker contact // Forward 1/50 of a second 전진, 후진, 좌회전그리고우회전함수들은 4장활동 #5에서그리고 MovementsWithSimpleFunctions 스케치에서소개될것이다. 확실히이함수들은코드를단순화할것이다. 여러분차례 ABOT이달리는주행상태를 LED를통해나타나도록만들기위해스케치의 if...else if...else 문장을수정할수있다. 표시기 LED회로에서 HIGH와 LOW 신호를보내는 digitalwrite함수호출을추가한다. 예는다음과같다. if((wleft == 0) && (wright == 0)) // If both whiskers contact 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

26 digitalwrite(8, HIGH); digitalwrite(2, HIGH); backward(1000); turnleft(800); else if(wleft == 0) digitalwrite(8, HIGH); digitalwrite(2, LOW); backward(1000); turnright(400); else if(wright == 0) digitalwrite(8, LOW); digitalwrite(2, HIGH); backward(1000); turnleft(400); else digitalwrite(8, LOW); digitalwrite(2, LOW); forward(20); // Left LED on // Right LED on // Back up 1 second // Turn left about 120 degrees // If only left whisker contact // Left LED on // Right LED off // Back up 1 second // Turn right about 60 degrees // If only right whisker contact // Left LED off // Right LED on // Back up 1 second // Turn left about 60 degrees // Otherwise, no whisker contact // Left LED off // Right LED off // Forward 1/50 of a second LED표시기를이용한주행상태를알려주는 ABOT을만들기위해 RoamingWithWhiskers 안에있는 if...else if...else문장을수정하시오. setup함수안에서디지털핀을출력으로놓는다는것을기억하시오. 그렇게함으로써 LED에실제적인전류가공급될수있습니다. pinmode(8, OUTPUT); // Left LED indicator -> output pinmode(2, OUTPUT); // Right LED indicator -> output 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

27 마지막스케치를주목하십시오. ABOT은코너에서곤경에빠질수도있습니다. 코너로들어갔을때, 왼쪽더듬이는왼쪽벽을접촉하고그래서뒤로물러나고오른쪽으로회전한다. ABOT이앞쪽으로다시움직일때, 오른쪽더듬이가오른쪽벽을감지할것이다. 그래서뒤로그리고왼쪽으로회전을할것이다. 그런다음로봇은왼쪽벽을다시접촉할것이고그런다음오른쪽벽을다시접촉하는것을누군가가이러한곤경으로부터꺼내줄때까지계속할것입니다. 코너탈출프로그래밍 RoamingWithWhiskers는이러한문제와행동을감지하기위해확장될수있습니다. 방법은양쪽더듬이가물체를번갈아가며접촉하는횟수를세는것입니다. 이것을하기위해스케치는각각의더듬이가이전의접촉동안무엇을했는지를기억해야합니다. 그런다음, 그러한상태와현재더듬이접촉상태를비교해야합니다. 만약그들이반대로있다면, 카운터 (counter) 에 1를더합니다. 만약카운터가여러분이정해놓은한계치를넘는경우, 로봇은 U턴을할것이고코너를탈출합니다. 그리고카운터를리셋 (reset) 합니다. 다음스케치는 if문장을다른한쪽에새롭게만드는것입니다. 스케치는하나의조건을점검하고, 이조건이사실이라면, 첫번째 if 문장의코드블록내에다른조건을점검합니다. 우리는다음스케치에서교차더듬이접촉을연속으로점검하는이방법을사용할것입니다. 예제스케치 : EscapingCorners 이스케치는여러분의 ABOT이어느쪽더듬이를먼저눌렀는지에따라다르지만더듬이가네번째혹은다섯번째교차해서눌러서코너를탈출하기위해역으로그리고 U턴을실행하도록할것입니다. 전원스위치를위치 1로놓고, EscapingCorners를입력하고저장하고업로드하시오. ABOT이돌아다니면서더듬이를교차로누르는이스케치를테스트한다. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

28 더듬이가교차로네번혹은다섯번접촉한후에역으로그리고 U턴을실행해야합니다. /* * Robotics with the BOE Shield - EscapingCorners * Count number of alternate whisker contacts, and if it exceeds 4, get out * of the corner. */ #include <Servo.h> // Include servo library Servo servoleft; Servo servoright; // Declare left and right servos byte wleftold; byte wrightold; byte counter; // Previous loop whisker values // For counting alternate corners void setup() pinmode(7, INPUT); pinmode(5, INPUT); pinmode(8, OUTPUT); pinmode(2, OUTPUT); // Built-in initialization block // Set right whisker pin to input // Set left whisker pin to input // Left LED indicator -> output // Right LED indicator -> output tone(4, 3000, 1000); delay(1000); // Play tone for 1 second // Delay to finish tone servoleft.attach(13); // Attach left signal to pin 13 servoright.attach(12); // Attach right signal to pin 12 wleftold = 0; // Init. previous whisker states wrightold = 1; counter = 0; // Initialize counter to 0 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

29 void loop() // Main loop auto-repeats // Corner Escape byte wleft = digitalread(5); byte wright = digitalread(7); // Copy right result to wleft // Copy left result to wright if(wleft!= wright) // One whisker pressed? // Alternate from last time? if ((wleft!= wleftold) && (wright!= wrightold)) counter++; // Increase count by one wleftold = wleft; // Record current for next rep wrightold = wright; if(counter == 4) // Stuck in a corner? wleft = 0; // Set up for U-turn wright = 0; counter = 0; // Clear alternate corner count else // Not alternate from last time counter = 0; // Clear alternate corner count // Whisker Navigation if((wleft == 0) && (wright == 0)) backward(1000); // If both whiskers contact // Back up 1 second 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

30 turnleft(800); else if(wleft == 0) backward(1000); turnright(400); else if(wright == 0) backward(1000); turnleft(400); else forward(20); // Turn left about 120 degrees // If only left whisker contact // Back up 1 second // Turn right about 60 degrees // If only right whisker contact // Back up 1 second // Turn left about 60 degrees // Otherwise, no whisker contact // Forward 1/50 of a second void forward(int time) // Forward function servoleft.writemicroseconds(1700); // Left wheel counterclockwise servoright.writemicroseconds(1300); // Right wheel clockwise delay(time); // Maneuver for time ms void turnleft(int time) // Left turn function servoleft.writemicroseconds(1300); // Left wheel clockwise servoright.writemicroseconds(1300); // Right wheel clockwise delay(time); // Maneuver for time ms void turnright(int time) // Right turn function 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

31 servoleft.writemicroseconds(1700); // Left wheel counterclockwise servoright.writemicroseconds(1700); // Right wheel counterclockwise delay(time); // Maneuver for time ms void backward(int time) // Backward function servoleft.writemicroseconds(1300); // Left wheel clockwise servoright.writemicroseconds(1700); // Right wheel counterclockwise delay(time); // Maneuver for time ms < 어떻게코너탈출작업을하는가?> 이스케치는 RoamingWithWhiskers의수정된버전이다. 그래서코너감지와탈출을위한새로운코드를살펴볼것이다. 먼저 3개의전역바이트변수가추가된다 : wleftold, wrightold 그리고 counter. 변수 wleftold와 wrightold는이전의더듬이접촉상태를저장한다. 그래서현재의접촉상태와비교할수있다. 그런다음 counter변수는연속적인교차접촉의횟수를추적하는데사용된다. byte wleftold; byte wrightold; byte counter; // Previous loop whisker values // For counting alternate corners 이러한변수들은 setup 함수에서초기화한다. counter변수는초기값이 0이다. 그러나 old변수중의하나는초기값을 1로설정해야한다. 코너를감지하는루틴은항상교차패턴을살펴야하고이전의교차패턴과비교를해야하므로초기교차패턴이있어야한다. 그래서 loop함수가그것들의값을점검하고수정을시작하기전에 setup함수내에변수 wleftold와 wrightold에초기값을할당한다. wleftold = 0; // Initialize previous whisker wrightold = 1; // states counter = 0; // Initialize counter to 0 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

32 // Corner Escape( 코너탈출 ) 아래에있는첫번째일은하나혹은다른더듬이가눌려졌는지를점검하는것이다. 이것을하기위한가장간단한방법은 if 문장에!=( 같지않다 ) 연산자를사용하는것이다. if(wleft!= wright) 의한글의미는 만약 wleft 변수가 wright 변수와같지않다면... ) 이다. // Corner Escape if(wleft!= wright) // One whisker pressed? 만약하나의더듬이가눌려져서같지않다면, 이전더듬이접촉에서반대쪽패턴이접촉했는지를점검해야한다. 그것을하기위해현재 wleft 값이이전상태의것과다르면그리고현재의 wright값이이전상태의것과다른지를 if문을이용하여작성합니다. 그것은 if( (wleft!= wleftold) && (wright!= wrightold)) 이다. 만약양쪽조건들이참이라면, 교차더듬이접촉을추적하는 counter변수에 1를더한다. 이것역시 wleftold가현재의 wlef를저장하고 wrightold가현재의 wright값을저장하여현재의더듬이패턴을기억하는것이다. if((wleft!= wleftold) && (wright!= wrightold)) counter++; // Increase count by one wleftold = wleft; // Record current for next rep wrightold = wright; 만약이것이 4번째연속적인교차더듬이접촉이라면 counter변수는 0으로리셋하고 U턴을실행한다. if(counter == 4) 문장이참이라면이코드블록은양쪽더듬이가눌려져있는더듬이주행루틴방법을실행할것이다. 그것이어떻게하는가? wleft과 wright 모두 0으로리셋한다. 이것은더듬이주행루틴이양쪽더듬이가눌려졌을것으로생각할것이고 U턴을실시할것이다. if(counter == 4) wleft = 0; // Stuck in a corner? // Set up whisker states for U-turn 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

33 wright = 0; counter = 0; // Clear alternate corner count 그러나 if((wleft!= wleftold) && (wright!= wrightold)) 안에있는조건이참이아니라면, 더이상의교차더듬이접촉은연속해서발생하지않는것이라는것을의미한다. 그래서 ABOT은코너에갇히지말아야한다. 그런경우, count변수는 0으로리셋하며, 로봇이코너를찾았을때, 다시카운트를시작할것이다. else counter = 0; // Not alternate from last time // Clear alternate corner count 새롭게만든 if 문장에대하여솜씨를발휘해야하는한가지는각문장의코드블록에대해열고닫는중괄호가추적을유지하는것이다. 아래그림은마지막스케치로부터새롭게만든 if 문장을나타낸다. 아두이노편집기에서여러분은코드블록을강조하기위해중괄호를더블-클릭할수있다. 그러나때때로, 코드를프린터하고블록을보기쉽도록모든중괄호열기와닫기를연결하는간단한선을그릴것이다. 이것은아주새롭게만들어진코드에서버그를찾는데유용할것이다. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

34 이그림에서 if(wleft!= wright) 문장의코드블록은결정코드부분의나머지모든부분을포함한다. 만약 wleft와 wright가 같다 로판정난다면, 아두이노는마지막중괄호닫기 는무슨코드가오더라도건너뛸것이다. 두번째레벨의 if문은이전값과새로운값의 wleft와 wright 값을비교할것이다. 형식은 if ((wleft!= wleftold) && (wright!= wrightold)) 이다. 이코드블록의끝괄호는 if(counter==4) 코드블록아래에있다. if ((wleft!= wleftold) && (wright!= wrightold)) 문장은만약더듬이값이이전의값과반대가아니라면그밖의조건에서 counter를 0으로리셋하는 else조건을가진다. 그림안에있는코드를주의깊게살펴보시오. wleft=0, wright=0 그리고 counter=3이라는것을기억하고, 이문장이무엇을하는지를생각하시오. wleft=1, wright=0, wleftold=0, wrightold=1 그리고 counter=3이라는것을기억하시오. 한줄씩다시코드를살펴보고각스텝에서각변수에무슨일일어나는지를설명하시오. 여러분차례 EscapingCorners 안에있는 if 문장중의하나는카운터 (counter) 가 4 에도달하는 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

35 지를점검합니다. 값을 5와 6으로증가시켜그효과를테스트해보시오. 교차더듬이접촉의수를카운팅하거나여러분이출발하는벽면이하나이상인것을명심하시오. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

36 이장은 ABOT에대한최초의센서시스템을소개하였고접촉에의해로봇자신이이리저리돌아다니고주행하는것을보였습니다. 이장의후미에있는프로젝트는요구기술로만들어졌습니다. 그리고새로운방법의다양성을적용하였습니다. 전기적부분 정상상태에서 open, momentary, single-pole, single-throw, 촉각스위치회로구성 프로그래밍 입력에대한디니털 I/O를설정하고핀의입력상태를모니터링하기위해아두이노언어의 pinmode와 digitalread 함수를이용. 전역변수의선언과초기화. 함수호출을새로작성. 센서의입력상태를기초로프로그램흐름을관리하기위해 if else문을이용. 새롭게작성된 if 문장의 3단계레벨이용. 로봇기술 센서입력을기초로한자율로봇주행 인공지능의간단한예를이용하여자율적으로굴러다니는 BOE Shield-Bot 이코너에서움직일수없다면빠져나오도록할수있다. 엔지니어링기술 부시스템다시테스트 좋은습관을만들어라 시스템입력의상태를시각적으로나타내기위해 LED표시기이용 프로그램흐름을시각적으로나타내기위해 LED 표시기이용 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

37 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

38 질문 1. 더듬이는전기적으로무엇과연결되어있는가? 2. 더듬이가눌려졌을때이것을모니터링하는 I/O핀에몇볼트의전압발생하는가? digitalread함수가되돌려주는이진값은무엇인가? 만약디지털핀 8이더듬이회로를모니터하기위해사용되어진다면, 더듬이가눌려졌을때 digitalread 가되돌려주는값은얼마인가? 그리고더듬이가눌려지지않았을때되돌려주는값은얼마인가? 3. 만약 digitalread(7)== 1이라면, 무엇을의미하는가? digitalread(7)== 0이라면무엇을의미하는가? digitalread(5)== 1 그리고 digitalread(5)== 0는어떠한가? 4. 더듬이의상태를기초로다른주행함수를호출하기위해이장에서사용하고있는문장은무엇인가? 5. 이중의 if 문장을가지는목적은무엇인가? 연습문제 1. 더듬이접촉을추적하기위해싱글변수 whiskers를이용하는루틴을적어라. 이것은더듬이가접촉되지않으면 3을저장할것이고, 오른쪽더듬이가접촉되면 2를저장, 왼쪽더듬이가저장되면 1를저장혹은양쪽더듬이가접촉되면 0를저장한다. 힌트 : 결과에 2를곱한다. 2. RoamingWithWhiskers안에있는 loop함수를수정하라그래서 ABOT이정지하도록만들고양쪽의더듬이가동시에접촉되었을때재출발을하지않는다. 3. pause함수를만들어 RoamingWithWhiskers에추가한다. 이것은 ABOT이어떤시간까지멈추는일을한다. 4. loop함수를수정해서 ABOT이뒤로그리고좌회전전에 0.5초동안정지하도록만들어라. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

39 프로젝트 1. RoamingWithWhiskers를수정해서 ABOT이정지하고일반적인불분명한주행을실행하기전에 4kHz 비프를 100ms 동안지속하도록만들어라. 양쪽더듬이접촉이같은샘플동안감지되었다면비프소리를두번내도록만들어라. 힌트 : 연습문제에서사용된 pause함수를이용하라. servo 움직임으로부터 tone호출후 0.2초정지는 0.1초톤을분리하거나, 혹은여러분은 1초톤을들을수있다. 2. RoamingWithWhiskers를수정하여 ABOT이 1야드 ( 혹은 1미터 ) 지름원안에서굴러다닌다. 여러분이한개의더듬이에터치할때 ABOT은보다작은원안에서움직일것이다. 다른더듬이를터치할때 ABOT은좀더큰지름을가지는원안에서움직일것이다. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

40 질문해 1. 인반적으로개방, 모멘트, 싱글-폴, 싱글-쓰루, 촉각스위치 2. 0 볼트, digitalread에의해이진수 0 결과가리턴된다. digitalread(8) == 0, 더듬이가눌려졌을때 digitalread(8) == 1, 더듬이가눌려지지않았을때 3. digitalread(7)== 1 는오른쪽더듬이가눌려지지않았을때를의미한다. digitalread(7)== 0 는오른쪽더듬이가눌려졌을때를의미한다. digitalread(5)== 1 는왼쪽더듬이가눌려지지않았을때를의미한다. digitalread(5)== 0 는왼쪽더듬이가눌려졌을때를의미한다. 4. 이장에서는더듬이조건들과주행함수호출을평가하기위해 if, if else 그리고 if else if else 문을사용하였다. 5. 만약하나의조건이참으로나타날경우, 코드는이중으로된 if 문과함께다른조건을평가할필요가있을것이다. 연습문제해 1. digitalread는 1혹은 0을리턴하므로, 여러분의코드는 digitalread(5) 에 2를곱할수있다. 그리고 whiskers 변수에결과를저장한다. whiskers변수에대해 digitalread(7) 의결과를추가한다. 그리고결과는더듬이없는것에대해 3일것이다. // Robotics with the BOE Shield Chapter 5, Exercise 1 // Value from 0 to 3 indicates whisker states: // 0 = both, 1 = left, 2 = right, 3 = neither. void setup() // Built-in initialization block 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

41 tone(4, 3000, 1000); delay(1000); // Play tone for 1 second // Delay to finish tone pinmode(7, INPUT); pinmode(5, INPUT); // Set right whisker pin to input // Set left whisker pin to input Serial.begin(9600); // Set data rate to 9600 bps void loop() // Main loop auto-repeats byte whiskers = 2 * digitalread(5); whiskers += digitalread(7); Serial.println(whiskers); // Display wleft delay(50); // Pause for 50 ms 2. if((wleft == 0) && (wright == 0)) 블록안에서, backward와 turnleft함수를제거하고 servoleft.detach and servoright.detach로대체한다. void loop() byte wleft = digitalread(5); byte wright = digitalread(7); // Main loop auto-repeats // Copy right result to wleft // Copy left result to wright if((wleft == 0) && (wright == 0)) pause(500); backward(1000); turnleft(800); else if(wleft == 0) // If both whiskers contact // Pause motion for 0.5 seconds // Back up 1 second // Turn left about 120 degrees // If only left whisker contact 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

42 pause(500); backward(1000); turnright(400); else if(wright == 0) pause(500); backward(1000); turnleft(400); else forward(20); // Pause motion for 0.5 seconds // Back up 1 second // Turn right about 60 degrees // If only right whisker contact // Pause motion for 0.5 seconds // Back up 1 second // Turn left about 60 degrees // Otherwise, no whisker contact // Forward 1/50 of a second 3. 해 : void pause(int time) servoleft.writemicroseconds(1500); servoright.writemicroseconds(1500); delay(time); // Pause drive wheels // Left wheel stay still // Right wheel stay still // Maneuver for time ms 4. forward함수는더듬이가다시점검을하기전에 20m동안앞으로전진하도록가정하였기때문에 else 조건안에있는 pause를호출은확실하게만들지않는다. void loop() byte wleft = digitalread(5); byte wright = digitalread(7); // Main loop auto-repeats // Copy right result to wleft // Copy left result to wright 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

43 if((wleft == 0) && (wright == 0)) // If both whiskers contact pause(500); // Pause motion for 0.5 seconds backward(1000); // Back up 1 second turnleft(800); // Turn left about 120 degrees else if(wleft == 0) // If only left whisker contact pause(500); // Pause motion for 0.5 seconds backward(1000); // Back up 1 second turnright(400); // Turn right about 60 degrees else if(wright == 0) // If only right whisker contact pause(500); // Pause motion for 0.5 seconds backward(1000); // Back up 1 second turnleft(400); // Turn left about 60 degrees else // Otherwise, no whisker contact forward(20); // Forward 1/50 of a second 프로젝트해 1. 이문제를풀기위한해는요구되는파라미터와함께비프를만드는문장을쓰는것이다. 비프가시작하자마자, ABOT이비프소리를내는동안까지유지하기위해 pause함수를호출한다. else문장의코드블록에 pause 호출을더한다. 20ms 동안어떤멈춤도없이앞쪽방향으로반복적으로가는것이필요하다. // RoamingWithWhiskers Chapter 5 Project 1 // Go forward. Back up and turn if whiskers indicate ABOT // bumped into something. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

44 #include <Servo.h> // Include servo library Servo servoleft; Servo servoright; // Declare left and right servos void setup() pinmode(7, INPUT); pinmode(5, INPUT); // Built-in initialization block // Set right whisker pin to input // Set left whisker pin to input tone(4, 3000, 1000); delay(1000); // Play tone for 1 second // Delay to finish tone servoleft.attach(13); // Attach left signal to pin 13 servoright.attach(12); // Attach right signal to pin 12 void loop() // Main loop auto-repeats byte wleft = digitalread(5); // Copy right result to wleft byte wright = digitalread(7); // Copy left result to wright if((wleft == 0) && (wright == 0))// If both whiskers contact tone(4, 4000, 100); // Play a 0.1 ms tone pause(200); // Stop for 0.2 seconds tone(4, 4000, 100); // Play a 0.1 ms tone pause(200); // Stop for 0.2 seconds backward(1000); // Back up 1 second turnleft(800); // Turn left about 120 degrees else if(wleft == 0) // If only left whisker contact tone(4, 4000, 100); // Play a 0.1 ms tone 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

45 pause(200); backward(1000); turnright(400); else if(wright == 0) tone(4, 4000, 100); pause(200); backward(1000); turnleft(400); else forward(20); // Stop for 0.2 seconds // Back up 1 second // Turn right about 60 degrees // If only right whisker contact // Play a 0.1 ms tone // Stop for 0.2 seconds // Back up 1 second // Turn left about 60 degrees // Otherwise, no whisker contact // Forward 1/50 of a second void pause(int time) // Backward function servoleft.writemicroseconds(1500); // Left wheel clockwise servoright.writemicroseconds(1500);//rightwheelcounterclockwise delay(time); // Maneuver for time ms void forward(int time) // Forward function servoleft.writemicroseconds(1700);//leftwheel counterclockwise servoright.writemicroseconds(1300);// Right wheel clockwise delay(time); // Maneuver for time ms void turnleft(int time) // Left turn function 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

46 servoleft.writemicroseconds(1300); // Left wheel clockwise servoright.writemicroseconds(1300);// Right wheel clockwise delay(time); // Maneuver for time ms void turnright(int time) // Right turn function servoleft.writemicroseconds(1700);//leftwheel counterclockwise servoright.writemicroseconds(1700);//rightwheelcounterclockwise delay(time); // Maneuver for time ms void backward(int time) // Backward function servoleft.writemicroseconds(1300); // Left wheel clockwise servoright.writemicroseconds(1700);//rightwheelcounterclockwise delay(time); // Maneuver for time ms 2. 4장의해로부터원스케치를출발하라. loop 함수에원코드를옮기고지연을 50ms로감소한다. 그래서더듬이가 1초에 20번접촉하는지를감시할수있다. 그런다음, 오른쪽더듬이가눌러졌을때오른쪽바퀴가천천히움직이는, 혹은왼쪽더듬이가눌러졌을때오른쪽바퀴스피드가증가하는변수가줄고증가하는 if 문장과함께더듬이모니터링코드를추가한다. // Robotics with the BOE Shield - Chapter 5, project 2 WhiskerCircle // ABOT navigates a circle of 1 yard diameter. // Tightens turn if right whisker pressed, or reduces turn if left whisker // is pressed. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

47 #include <Servo.h> // Include servo library Servo servoleft; Servo servoright; // Declare left and right servos int turn; void setup() pinmode(7, INPUT); pinmode(5, INPUT); // Built-in initialization block // Set right whisker pin to input // Set left whisker pin to input tone(4, 3000, 1000); delay(1000); // Play tone for 1 second // Delay to finish tone servoleft.attach(13); // Attach left signal to Port 13 servoright.attach(12); // Attach right signal to Port 12 turn = 0; // servoleft.detach(); // Stop sending servo signals // servoright.detach(); void loop() // Main loop auto-repeats // Nothing needs repeating int wleft = digitalread(5); int wright = digitalread(7); if(wleft == 0) turn -= 10; else if(wright == 0) 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

48 turn += 10; // Arc to the right servoleft.writemicroseconds(1600); // Left wheel counterclockwise servoright.writemicroseconds( turn);//rightwheelclockwise slower delay(50); //...for 25.5 seconds 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

49 광센서는로봇과산업용제어에많이응용된다. 직물공장의천끝부분을찾는것, 일년중다른시간에가로등동작시간을결정하는것, 사진찍을때그리고농작물에물주는것등에응용된다. ABOT 키트에서광센서는가시광선에반응하고, 또한적외선 (infrared) 이라고하는비가시광선에도반응한다. 이센서들은아두이노가빛의여러가지수준을감지하도록모니터할수있는다른회로에서사용될수있다. 여러분의스케치는 ABOT이빛에의해조종되도록확장될수있다. 마치손전등빔을따라움직이거나어두운방에서열린문으로들어오는광선을따라움직이는것처럼말이다. 6장아두이노코드다운로드 다음링크들을따라시작하세요. 포토트랜지스터소개실습1: 전압센서로간단한빛을비추기실습2: 더넓은범위로빛의수준을측정하기실습3: 로밍을위한빛측정하기실습4: 불빛추적루틴의점검하기실습5: 불빛으로 ABOT의주행하기제6장요약 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

50 포토트랜지스터 (Phototransistor) 란? 트랜지스터 (transistor) 는 3개의단자중 2개를통해흐르는전류의양을조절하는밸브와같다. 세번째단자는얼마나많은전류가두개단자사이를통과하는지를조절한다. 트랜지스터종류에따라서전류의흐름이전압에의해조절될수있고, 포토트랜지스터 (phototransistor) 의경우처럼빛에의해조절될수있다. 아래그림은여러분의쉴드키트에있는포토트랜지스터의개략도와부품모양을보여준다. 포토트랜지스터의베이스 (B) 에비춰지는빛의세기는얼마나많은전류가컬렉터 (C) 단자와에미터 (E) 단자로흐르게할것인가를결정한다. 더밝은빛은더많은전류를흐르게한다. 그리고더적은빛은전류를덜흐르게한다. 포토트랜지스터는 LED와약간닮은점이있다. 두개의소자는유사성이있는데, 첫째는여러분이회로에서포토트랜지스터를거꾸로연결한다면, 그것은동작하지않는점이고, 두번째는서로다른핀길이를가지고있으며단자를구분하기위하여플라스틱케이스의평평한부분을가지고있는점이다. 두개중길이가긴것이포토트랜지스터의컬렉터단자이다. 짧은길이의핀이에미터를가르키고, 그것이포토트랜지스터의플라스틱케이스의평평한면과더가깝게연결되어있다. 광선 바다에서여러분은두개의인접한파고점사이거리를피트나미터로측정할 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

51 수있다. 빛에있어서도, 광선은파동운동을하고, 최고점사이의거리는 10억분의 1 미터인나노미터 (nanometers : nm) 로측정된다. 아래그림은우리가친숙한색깔과자외선과적외선처럼우리눈으로식별할수없는파장을표시하고있다. 로봇쉴드키트의포토트랜지스터는 850 nm 파장에가장민감하고, 이것은적외선영역에해당한다. 적외선은눈으로식별할수없지만, 할로겐등과백열등그리고특히태양광을포함하여많은광원들이상당한양의적외선을방출한다. 또한포토트랜지스터는가시광선에도덜민감하게반응하고, 특히 450nm 아래파장에서잘반응한다. 이장의포토트랜지스터회로는실내에서형광등과백열등에잘동작하도록설계되었다. 태양직사광또는할로겐직사광을피하도록하시오. 이것은포토트랜지스터에너무많은적외선광으로흘러넘치지않도록하기위한것이다. 태양직사광이실내로들어않도록창문을막고, 어떤할로겐등의빛도천장에서반사되도록위쪽방향으로설치하시오. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

52 ABOT이끝에불빛이있는코스를찾아가고있다고상상해보시오. 이번코스에서여러분로봇의마지막임무는불빛이비추는바로아래에서멈추는것이다. 아두이노가이진수 1을별도의광선을감지하는것으로인식하고또는이진수 0 을분위기광선을감지하는것으로인식하는간단한포토트랜지스터회로가있다. 책상에백열등과손전등은최상의광선조합을만든다. 형광등과 LED광원조합으로과제의회로를사용하여각각의광원을식별하는것은쉽지않다. 분위기 (Ambient) 는 모든곳에현재존재하는 의의미이다. 방안의광선수준이분위기광선에해당한다고생각할수있다. 부품목록 (1) 포토트랜지스터 (phototransistor) (2) 점프선 (jumper wires) (1) 저항, 2kΩ ( 빨강-흑색-빨강 ) (1) 백열등또는형광등또는책상등 여러분의로봇실험구역내에광선상태에따라, 여러분은 2kΩ저항을다음저항들중하나로교체할수있다. (1) 저항, 220Ω ( 빨강-빨강-갈색 ) (1) 저항, 470Ω ( 노랑-보라-갈색 ) (1) 저항, 1kΩ ( 갈색-흑색-빨강 ) (1) 저항, 4.7kΩ ( 노랑-보라-빨강 ) (1) 저항, 10kΩ ( 갈색-흑색-주황 ) 아래그림은여러분에게포토트랜지스터와적외선 LED가비슷하게보이기때문에서로분리할있도록도움을준다. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

53 밝은빛감지기설치 아래개략도와배선도는밤에자동으로켜지는가로등과유사한회로의개략도와배선도이다. 회로의출력전압은포토트랜지스터에얼마나많은빛이비춰지는가에따라변화한다. 아두이노는한개의아날로그입력핀으로전압수준을관찰할것이다. 아두이노로부터배터리팩과프로그램케이블을분리하고 BOE 쉴드의스위치를 0으로놓으시오. 더듬이회로를제거하고, 회로의피에조스피커는남겨두시오. 2 kω저항을사용하여회로를구성하시오. 포토트랜지스터의에미터단자가저항으로연결되고컬렉터가 5V에연결되었는지반복하여점검하시오. 또한포토트랜지스터의단자들은서로닿지않았는지점검하시오. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

54 예제스케치 : PhototransistorVoltage PhototransistorVoltage 스케치는쉴드로접근할수있는어두이노의 5개아날로그입력채널들중하나와 A3사이에서측정된전압을직렬모니터가나타낼수있도록한다. 여러분이구성한회로에서, 전선은 A3에연결되고포토트랜지스터의에미터와저항이서로만나는행으로구성된다. 회로의이부분전압은포토트랜지스터의변화에의해감지되는광선수준에따라변화하게된다. 아래직렬모니터캡쳐화면은측정전압의몇가지예를보여준다. 프로그램케이블과배터리팩을보드에서분리하시오. 쉴드의전원스위치를 1의위치에놓으시오. PhototransistorVoltage 스케치를입력하고저장하고아두이노로업로드하시오. 포토트랜지스위로손전등이나램프를천천히움직이고, 직렬모니터에서 A3의값을관찰하시오. 더밝은빛은전압값을더크게만들어야하고더어두운빛은전압을작게나타내야합니다. 분위기광선이형광등보다밝다면여러분은 2kΩ저항보다더작은저항값으로교체할필요가있습니다. 1kΩ, 470Ω, 또는 220Ω까지시도해보세요. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

55 /* * Robotics with the BOE Shield - PhototransistorVoltage * Display voltage of phototransistor circuit output connected to A3 in * the serial monitor. */ void setup() Serial.begin(9600); // Built-in initialization block // Set data rate to 9600 bps void loop() // Main loop auto-repeats Serial.print("A3 = "); // Display "A3 = " Serial.print(volts(A3)); // Display measured A3 volts Serial.println(" volts"); // Display " volts" & newline delay(1000); // Delay for 1 second float volts(int adpin) // Measures volts at adpin // Returns floating point voltage return float(analogread(adpin)) * 5.0 / ; 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

56 더밝은빛에서중단하기 HaltUnderBrightLight 스케치는 A3로공급되는전압이 3.5V를초과할만큼충분히밝은빛을포토트랜지스터가감지할때까지 ABOT이전진하도록할것이다. 여러분은 3.5V를마지막스케치로부터기록한 HIGH와 LOW전압사이의중간지점까지변경할수있다. 마지막스케치로부터기록한분위기광선과밝은광선사이의중간지점을계산하시오. HaltUnderBrightLight 스케치에서, if(volts(a3) >3.5) 문장중 3.5 대신중간값으로대체하시오. HaltUnderBrightLight 의수정본을아두이노로업로드하시오. 마루바닥에손전등이나램프를두고, ABOT을두어걸음떨어진바닥에놓고, 빛을따라똑바로갈수있도록방향을잡으시오. ABOT이전진하도록전원스위치를 2의위치로옮기시오. 불빛아래얼마나가까이에서멈추었나요? ABOT이밝은불빛바로아래에서멈추도록, if(volts(a3) > ) 문장에서여러분이조작하는문턱 (threshold) 값을맞춰보시오. /* * Robotics with the BOE Shield - HaltUnderBrightLight * Display voltage of phototransistor circuit output connected to A3 in * the serial monitor. */ #include <Servo.h> // Include servo library Servo servoleft; Servo servoright; // Declare left and right servos void setup() tone(4, 3000, 1000); // Built-in initialization block // Play tone for 1 second 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

57 delay(1000); // Delay to finish tone servoleft.attach(13); // Attach left signal to pin 13 servoright.attach(12); // Attach right signal to pin 12 servoleft.writemicroseconds(1700); servoright.writemicroseconds(1300); // Full speed forward void loop() // Main loop auto-repeats if(volts(a3) > 3.5) // If A3 voltage greater than 2 servoleft.detach(); // Stop servo signals servoright.detach(); float volts(int adpin) // Measures volts at adpin // Returns floating point voltage return float(analogread(adpin)) * 5.0 / ; 전압함수가어떻게동작하는가? 아두이노의 A0, A1 A5 소켓이아날로그를디지털로변환하는아트멜 (Atmel) 마이크로컨트롤러핀에연결되어있다. 그것은마이크로컨트롤러가전압을측정하는방법이다. 전압을많은숫자로나누고, 각각의숫자가전압을대표하게된다. 각각의아두이노아날로그입력은 10비트해상도를가지고있고, 10개의 2진수자리는측정전압을설명하는데사용한다. 10개의 2진수비트는 1부터 1023까지를헤아릴수있게한다. 즉 0을포함한다면전압수준이총 1024개가된다. 기본적으로아두이노의 analogread 함수는전압측정값이 5V 이내인상태에서 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

58 0-1023사이의값을사용하도록구성된다. 5V 를 1024의다른단계로나누면각각의전압단계는 5/1024 전압 (4.89 mv) 만큼나누어진다. 예제 : analogread 함수가 645 를표시 ; 실제전압값은얼마인가? 답 : 스케치는 volts(a3) 를전압함수라고한다. 이때 A3는 adpin으로통용되고, 함수내에서 analogread(adpin) 는 analogread(a3) 가된다. 그리고 A3에공급되는전압을나타내는 사이의값을반환한다. analogread 함수는정수형값을반환하지만, float(analogread(adpin) 로표현된다면정수형값이실수형값으로변환된다. float volts(int adpin) // Measures volts at adpin // Returns floating point voltage return float(analogread(adpin)) * 5.0 / ; 전압함수블록계산왼쪽이반환되므로, 결과값이함수호출로반환된다. PhototransistorVoltage 스케치는 Serial.print(vsolts(A3)) 의전압함수에의해반환되는값을나타낸다. HaltUnderBrightLight는 if(volts(a3) >3.5) 표현내부의값을광선아래에서멈추기위해 ABOT으로가져가는데사용한다. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

59 이진수와아날로그그리고디지털 이진수센서는일반적으로어떤것의존재와비존재를의미하는두개의다른상태를전송할수있다. 예를들면더듬이가압력을받지않으면 HIGH신호를압력을받으면 LOW신호를보내는것처럼말이다. 아날로그센서는연속적인범위의측정값에상응하는연속적인범위의값을보낸다. 이번실험에서의포토트랜지스터회로는아날로그센서의예이다. 그것들은연속적인범위의빛수준에상응하는연속적인값들을제공한다. 디지털값은 digit로표현된숫자이다. 컴퓨터와마이크로컨트롤러가아날로그측정값을디지털로저장한다. 아날로그센서로측정하고디지털값으로측정치를저장하는과정을 A/D변환 (analog to digital conversion) 이라고한다. 이측정을디지털화측정 (digitized measurement) 이라하고, 아날로그를디지털로변환하는문서를양자화측정 (quantized measurements) 이라고도한다. 아두이노맵함수 PhototransistorVoltage 스케치에서우리는 사이의측정값을 범위의전압값으로변환한다. 다른응용즉, 모터제어나다른분석을위하여또다른함수에여러분의스케치가사용되어측정값을다른범위의정수범위값으로변환할필요가생길수있다. 이런경우아두이노맵함수가편리하다. 하나의정수범위를또다른범위의값으로대응시킨값을 mapping 이라고한다. 예를들어 범위사이의범위를 사이의서보제어범위로매핑하기를원한다고해보자. 여러분에게맵함수를어떻게사용하는지를보여주는예제가다음에있다. int adcval = analogread(a3); int newadcval = map(adcval, 0, 1023, 1300, 1700); 이번예제에서, adcval의값이 512라면, newadcval 에대한맵함수의결과는 1500이된다. 그래서 범위의중간지점으로부터 범위의대응점으로측정치가대응된다. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

60 포토트랜지스터회로는어떻게동작하는가 저항은전류의흐름을방해하는소자이다. 저항이포함된회로에서전압은수압과연결하여생각할수있다. 주어진전류량에대하여적은저항보다큰저항에서전압강하가크지만저항을통과하는전류의양은동일하다. 만약저항값을일정하게유지하고전류를변화시킨다면, 여러분은동일한저항양단에더많은전류를인가해서더큰전압을측정할수있고, 전류가작아지면전압도작아지게할수있다. 아두이노아날로그입력은포토트랜지스터회로에서보이지않는다. 그래서 A3 는영향을받지않는회로를모니터한다. 아래회로를살펴보자. 회로위쪽의 5V 와아래쪽의 GND(0V) 을이용하여, ABOT의배터리가전자를공급하여 5V 전압이걸리도록하기를원한다. A3 전압 (V A3) 이빛에따라변하는이유는포토트랜지스터가빛의양이많을때더많은전류가흐르게하고빛의양이적을때더적은전류가흐르게하기때문이다. 아래회로에서라벨I로붙여진전류가저항을통과하여흐른다. 저항을통하여더많은전류가흐르면, 저항양단의전압이커질것이다. 전류가덜흐르게되면전압은낮아질것이다. 저항의한쪽끝이 Vss = 0V에묶여져있기때문에, A3 전압은전류가증가하면올라가고전류가작아지면내려간다. 2kΩ 저항을 1kΩ 저항으로교체한다면, V A3 는동일한전류에대하여더작은값이될것이다. 사실동일한전압수준이되기위해서는두배의전류가되어야 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

61 할것이다. 이것은 ABOT이멈추도록하는 HaltUnderBrightLight의기준전압 3.5V 수준에도달하기위하여빛의밝기가 2배가되어야한다는것을의미한다. 그래서포토트랜지스터와직렬연결되는저항이작아지면빛에덜민감한회로를만드는것이다. 만약 2kΩ 저항을 10kΩ 저항으로교체한다면 V A3 는 5배증가하고, 3.5V에도달하기위하여 1/5배전류를생성에필요한 1/5배빛이필요할것이다. 그래서더큰저항은회로가빛에더민감하게동작할것이다. 직렬연결두개또는그이상의부품들이끝과끝으로연결될때, 직렬이라고한다. 회로의포토트랜지스터와저항은직렬로연결되어있다. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

62 옴의법칙두가지양이 V A3 에영향을준다. 전류와전압그리고옴의법칙이상호간의동작원리를설명한다. 옴의법칙에의하면저항양단의전압이저항을통과하는전류와저항을곱한값과같다. 그래서여러분의두개의값을알고있다면, 세번째값을계산하기위하여옴의법칙을사용할수있다. 어떤교재에서, 여러분은 E = I R을보게될것이다. E는전압을나타내고 volts 의또다른표현이다. 전압 V는전압 (volts) 의단위로측정되고, 약자는 V이다. 전류 I는암페어로측정되고약자는 A를사용한다. 저항 R은옴으로측정되고약자는그리스문자오메가 (Ω) 를사용한다. 다음회로에흐르는전류수준은밀리암페어 (ma) 이다. 소문자 m은 1/1000의암페어측정치를나타내는것이다. 비슷하게 kω에서의소문자 k는측정치가옴의 1000배임을나타낸다. 회로를흐르는두개의전류량에대하여포토트랜지스터에서의 V A3 를옴의법칙으로계산해보자 : 상당히밝은빛에의한결과로일어나는전류 1.75mA 그리고덜밝은빛으로일어나는 0.25mA 아래예제는해답을보여준다. 여러분이계산할때, 밀리 (m) 는천분의 1 그리고킬로 (k) 는천이라는것을기억하고옴의법칙에대입하시오. 예제 1: I = 1.75mA 그리고 R = 2kΩ 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

63 예제 2: 1 = 0.25mA 그리고 R = 2kΩ 옴의법칙과저항조정방안의분위기광선이 V A3 = 3.5 V 이고, 이광선이어두움에대한광선 0.5V를만드는불빛의 2배만큼밝다고말해보자. 더높은전류가흐를수있는또다른상황은분위기광선이적외선보다더강한경우이다. 어느경우이든포토트랜지스터는회로를통해흐르는전류의두배일수있고측정의어려움을초래한다. 질문 : 여러분은회로의전압응답을밝은빛의 3.5V로그리고어두운빛의 0.5V 로낮추기위하여무엇을할수있습니까? 대답 : 저항값을반으로낮추시오. 2kΩ저항을 1kΩ저항으로바꾸시오. R = 1kΩ과밝은빛전류 I = 3.5mA 와어두운빛전류 I = 0.5mA을사용하여옴의법칙계산을반복하시오. 두배의전류를사용하여밝은빛에대하여 3.5V 어두운빛에서 0.5V를나타낼수있습니까? 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

64 이전과제에서회로는단지제한된빛의범위에서동작한다. 여러분은실습1 회로가잘동작하는하나의방에서계측을하고이어서더밝은방으로그것을가져가면모든전압측정값이최대값을나타내는것을발견할것이다. 또는더어두운방으로가져가면전압이 0.1V도만들지못할것이다. 이과제는아두이노가더넓은범위의광선수준을측정하는데사용할수있는다른포토트랜지스터회로를소개한다. 이회로와스케치는 0부터 75,000까지의범위값을반환할수있다. 더작은값은밝은빛을나타내고더큰값은어두운빛을나타낸다. 커패시터 (Capacitor) 란? 커패시터는전하를충전하는소자이고, 많은회로의기초구성요소이다. 또한배터리는전하는축적하는소자이고, 이번과제를통하여충전되고방전되고다시재충전되는얇은배터리와동등하게커패시터를생각할수있다. 커패시터가얼마나많은전하를충전할수있는지가패러데이 (F) 로측정된다. 1 패러데이는 ABOT 회로에서사용하는데실용적이지않을만큼매우큰값이다. 여러분키트의커패시터는백만분의 1 비율로저장한다. 백만분의 1 패러데이를마이크로패러데이 (microfarad) 로부른다. 그리고약자는 μf이다. 0.1 μf는백만분의 1의십분의 1을저장한다. 커패시턴스측정 microfarads: (millionths of a farad), abbreviated μf 1 μf = F nanofarads: (billionths of a farad), abbreviated nf 1 nf = F picofarads: (trillionths of a farad), abbreviated pf 1 pf = F 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

65 0.1 μf커패시터의겉표면에서 104는피코패러데이 (picofarads : pf) 측정치 이다. 여기서 104는 10에 0을 4개더하는것을나타내고, 그래서커패시터는 100,000 pf 즉 0.1 μf이된다. (100,000) ( ) F = ( ) ( ) F = F = F = 0.1 μf. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

66 광감지눈설치하기다음회로는각각의포토트랜지스터에도달하는광선수준과독립적으로반응할수있다. 하나는좌측전방그리고다른하나는우측전방으로그것들이약 45 위로향하도록설치될것이다. 두개포토트랜지스터들의값을모니터하는스케치는 ABOT의어느방향이더밝은빛인지를결정할수있다. 그래서이정보는길찾기결정수단으로이용할수있다. 부품목록 (2) 포토트랜지스터 (phototransistors) (2) 커패시터 (capacitors), 0.1μF (104) (2) 저항 (resistors), 1kΩ ( 갈색-검정-빨강 ) (2) 점퍼와이어 (jumper wires) 배터리와프로그래밍케이블을여러분보드와분리하시오. 이전포토트랜지스터회로를제거하고, 아래회로를설치하시오. 여러분의포토트랜지스터가반대로연결되지않고단자가서로닿지않도록배선도에따라회로를점검하시오. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

67 이장의예제는다른방향에대한빛의세기차이를감지하기위하여위쪽방향과바깥방향으로향하는포토트랜지스터에의존할것이다. 아래그림처럼포토트랜지스터를브레드보드로부터 45 위쪽으로향하도록조정하고약 90 바깥방향으로조정하시오. 전하이동과포토트랜지스터회로 다음회로의커패시터를얇은재충전식배터리라고생각하고, 포토트랜지스터를빛으로제어하는전류밸브라고생각하시오. 각각의커패시터는 5V로충전될수있고, 그다음포토트랜지스터를통하여배출될수있다. 커패시터가전하를잃어버리는비율은얼마나많은전류가포토트랜지스터를통과하는지에의존하고, 포토트랜지스터베이스에비추는빛의밝기에의존한다. 다시더밝은빛은더많은전류를흐르게하고, 더어두운빛은전류를덜흐르게한다. 이러한종류의포토트랜지스터 / 커패시터를전하이동 (charge transfer) 회로라고부른다. 아두이노는커패시터전압이감소하는데즉어떤전압값아래로떨어지는데얼마나긴시간이걸리는지를측정함으로써각각의커패시터와연결된포토트랜지스터를통하여전하손실이일어나는비율을결정할것이다. 감쇠시간은포토트랜지스터의베이스에도달하는빛의밝기에따라제어되는전류밸브를얼마나넓게여는가에부합한다. 더많은빛은더빠른감쇠를의미하고, 더작은빛은천천히감쇠하는것을의미한다. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

68 QT Circuit: 전하이동이약자는 QT이다. 문자 Q는전기적전하이고 T는이동을나타낸다. 병렬연결 : 그림 6-11에나타난포토트랜지스터와커패시터는병렬로연결되어있다. 각단자의하나는공통단자 ( 또한노드로부른다 ) 로연결된다. 포토트랜지스터와커패시터의하나단자는 GND에연결된하나의단자를가진다. 그리고다른하나의단자는동일한 1kΩ 저항단자에연결된다. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

69 포토트랜지스터회로테스터하기 LeftLightSensor 스케치는핀 8번 QT 회로에서커패시터를충전하고, 전압감쇠시간을측정하고, 직렬모니터에서그것을보여준다. 다음회로와스케치에서, 더낮은숫자가더밝은빛을의미한다는점을기억하시오. 우리는여러분이다른분위기광선수준을위한올바른저항을찾을걱정없이 ABOT을하나의방에서또다른방으로옮길수있도록이장의나머지부분에서광감지기술을사용할것이다. 직사광선이창문을통해안으로비친다면창문을닫으시오. LeftLightSensor 입력하고업로드하고직렬모니터를여시오. 직렬모니터에디스플레이된값을기록하시오. 직렬모니터가값을디스플레이하지못하거나한두개이후에멈춘다면, 회로에에러가있을수있다. 이러한징후를알게되면배선을점검하고다시시도하시오. 포토트랜지스터회로 8번핀위에서그림자를만들기위해여러분손을사용하거나책을사용하세요. 다시직렬모니터에서측정값을점검하시오. 그값은처음값보다더커져야합니다. 또한그것을기록하시오. 직렬모니터에출력이없다면, 또는빛의수준에무관하게하나의값에멈춰있다면, 배선에러일수있다. 회로를점검하시오. 그림자를더어둡게만들기위하여포토트랜지스터위로더가깝게어떤물체를움직이시오. 측정값을기록하시오. 강하게그림자를만들거나심지어손으로감싸쥐어서그림자를만들고측정하시오. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

70 /* * Robotics with the BOE Shield - LeftLightSensor * Measures and displays microsecond decay time for left light sensor. */ void setup() // Built-in initialization block tone(4, 3000, 1000); // Play tone for 1 second delay(1000); // Delay to finish tone Serial.begin(9600); void loop() long tleft = rctime(8); // Set data rate to 9600 bps // Main loop auto-repeats // Left rctime -> tleft Serial.print("tLeft = "); Serial.print(tLeft); Serial.println(" us"); // Display tleft label // Display tleft value // Display tleft units + newline delay(1000); long rctime(int pin) pinmode(pin, OUTPUT); digitalwrite(pin, HIGH); delay(1); pinmode(pin, INPUT); digitalwrite(pin, LOW); long time = micros(); while(digitalread(pin)); time = micros() - time; return time; // 1 second delay // rctime function at pin //..returns decay time // Charge capacitor //..by setting pin ouput-high //..for 5 ms // Set pin to input //..with no pullup // Mark the time // Wait for voltage < threshold // Calculate decay time // Return decay time 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

71 다른포토트랜지스터회로를테스트하기 조종동작을하기전에여러분은불빛에대하여오른쪽핀 6번광센서회로에대하여동일한테스트를실행할필요가있을것이다. 조종동작이전에두개의회로가잘동작해야한다. rctime을호출할때핀변수를 8에서 6으로변경하시오. tleft의모든인스턴스를 tright로바꾸시오. 스케치를동작시키고, 핀 6번광센서가동작하는지점검하시오. 두개의포토트랜지스터회로를함께테스트할스케치를별도로갖는것이또한좋을것이다. BothLightSensors로스케치를다시저장하고, 코멘트를갱신하시오. loop 함수를아래것으로바꾸시오. 한쪽이방안가장밝은광원방향을가르키고다른한쪽이방안의밝은광원을벗어나는방향을가르킬때까지 BOE 쉴드-봇을회전시키시오. 직렬모니터의 tleft 와 tright 사이에서여러분이얻을수있는가장큰차이는무엇입니까? void loop() // Main loop auto-repeats long tleft = rctime(8); // Left rctime -> tleft Serial.print("tLeft = "); // Display tleft label Serial.print(tLeft); // Display tleft value Serial.print(" us "); // Display tleft units long tright = rctime(6); Serial.print("tRight = "); Serial.print(tRight); Serial.println(" us"); delay(1000); // Left rctime -> tright // Display tright label // Display tright value // Display tright units + newline // 1 second delay 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

72 rctime 과전압감쇠 빛의양이낮을때, rctime함수는정수변수심지어워드변수로저장하는데많은시간이걸린다. 다음단계로저장용량을늘리면 -2,147,483,648 부터 2,147,483,647 까지값을저장할수있다. 그래서 long rctime(int pin) 함수정의는함수가실행되고 long 값을반환한다. 또한측정할핀번호가어느핀인지를알필요가있다. long rctime(int pin) 전하이동 (charge transfer) 측정은 7단계이다. : (1) 커패시터를충전하기위하여 I/O 핀을 HIGH로놓으시오. (2) 커패시터가충분히충전될만큼기다리시오. (3) I/O 핀을입력으로바꾸시오. (4) 시간을체크하시오. (5) 아두이노의 2.1V 문턱전압아래로전압이내려가도록기다리시오. (6) 다시시간을체크하시오. (7) 단계-6시간에서단계-3시간을빼시오. 그것이감쇠시간이다. pinmode(pin, OUTPUT); // Step 1, part 1 digitalwrite(pin, HIGH); // Step 1, part 2 delay(1); // Step 2 pinmode(pin, INPUT); // Step 3 part 1 digitalwrite(pin, LOW); // Step 3, part 2 long time = micros(); // Step 4 while(digitalread(pin)); // Step 5 time = micros() - time; // Step 6 & 7 return time; 이번스케치에서, 단계-1은두개의하위단계로구성된다. 먼저 pinmode(pin, OUPUT) 은 I/O핀을출력으로설정하고다음에 digitalwrite(pin, HIGH) 가회로에 5V를공급하도록한다. 단계-3 또한 I/O핀이 HIGH신호를전송하기때문에두개의하위단계로구성된다. 스케치가 I/O핀의방향을 output-high 에서 input 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

73 으로바꿀때, 회로에서 10kΩ의저항을더하고, 이후그저항이제거되어야한다. pinmode(pin, INPUT) 가저항을제거한이후 digitalwrite(pin, LOW) 를더하는것은커패시터가포토트랜지스터를통하여전하를방출하도록하기위함이다. 고급주제선택 : 전압감쇠그래프 아래그래프는 BothLightSensors 스케치가실행되는동안 BOE 쉴드-봇의좌측우측 QT 회로전압응답을보여준다. 시간에따른응답전압을측정하고그래프해주는장치를오실로스코프 (oscilloscope) 라고부른다. 두개전압신호를그래프하는두개의측정선을파형 (trace) 이라고부른다. 위쪽파형에대한전압배율은왼쪽을따르고, 아래쪽파형에대한전압배율은오른쪽을따른다. 두개파형이시간배율은아래쪽을따른다. 각각파형위에 BothLightSensors에서명령이실행될때마다표시를보여준다. 그래서여러분은전압신호가어떻게응답하는지를알수있다. 위그래프파형은핀 8번 QT회로의커패시터전압을그린것이다. 이것은왼쪽광센서이다. digitalwrite(8, HIGH) 의응답으로전압은 0V부터거의 5V까지 1ms 표시에서빠르게올라간다. 그다음 2ms 표시에서 rctime 호출이감소가시작되도록한다. rctime함수는전압이약 2.1V 부근까지감쇠하는데걸리는시간을 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

74 측정하고, tleft변수에그것을저장한다. 그래프에서는감쇠가약 1ms 정도걸리는것처럼보이고, 그래서 tleft 변수는 1000에가까운값을저장해야한다. 그래프에서아래파형은핀 6번 QT 회로의커패시터전압 ( 오른쪽광센서 ) 을그린다. 측정은왼쪽센서측정이종료된이후시작한다. 전압은감쇠시간이약 2ms 걸리는것만제외하고위쪽파형과유사한형태로변화한다. 우리는하고, tright가 2000가까운값을저장하는것을보게될것으로기대한다. 이값이더커지면더늦은감쇠에대응하고, 더불어더낮은광수준에대응하는것이다. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

75 우리는이제다양한광원조건에서동작할수있는회로를가지고있다. 우리는또한선택할수있는어떤코드를필요로한다. 변화를선택할수없는스케치코드의예제가다음과같다 : if(tleft > 2500) // Not good for navigation. 만약문장이방안의그림자를물리치고잘동작한다고하더라도, 또다른더밝은빛을만나면그림자를결코감지하지못할것이다. 그렇지않고더어두운방으로옮기더라도오랜시간동안찾지못할것이다. 조종을위하여문제는각각의센서에광수준을알려주는실제숫자가아니라는점이다. 문제는두개센서가많은빛을감지하는차이이고따라서로봇은센서가더밝은빛을찾는방향으로회전할수있다. ( 혹은여러분이원하는바에따라더밝은빛으로부터멀어질수있다.) 해답은간단하다. 오른쪽센서측정치를두개의합으로부터나누시오. 여러분의결과는항상 0과 1의범위내에있게될것이다. 이기술은정규화미분 (normalized differential) 측정의예제이다. 여기서다음식으로표현할수있다. 예를들어 0.25의정규화미분측정은오른쪽센서의밝기가왼쪽밝기의 1/2이라는것을의미한다. tright 와 tleft 의실제값은밝은방에서는작아지고어두운방에서는커질것이지만, 왼쪽빛이오른쪽센서에대한밝기의 1/2배이면해답은여전히 0.25가될것이다. 0.5의측정값은 tright 와 tleft 의값이동일하다는것을의미한다. 둘다함께커질수있고작아질수있지만, 결과가 0.5라면동일한밝기의광수준을감지하는것을의미한다. 여기에또다른시도가있다. 정규화미분측정으로부터 0.5 를빼보시오. 그러면 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

76 결과값이 0과 1사이대신에 -0.5에서 +0.5 범위의값으로변화하고, 측정값 0 은서로동일한밝기를의미한다. 이러한결과는영점조정된정규화미분측정치 (zero-justified normalized differential shade measurement) 이다. 그러나왜그렇게하는가? 양수와음수가바퀴속도조절에사용될수있기때문에 -0.5와 +0.5범위의값이조정을위한스케치를위해더좋다. 여기서영점조정된미분측정치가다음스케치에소개된다. float ndshade; // Normalized differential shade ndshade = tright / (tleft + tright) - 0.5; // Calculate it and subtract 0.5 마지막측정치는 ndshade로이름붙여진유동소수점변수에저장될것이고, 그래서먼저선언되어진다. 다음줄에서영점조정된미분측정치연산이실행된다. 결과값은 tleft에비하여 tright가감지하는전체그림자비율을나타내는 -0.5에서 0.5사이의값이될것이다. ndshade가 0일때, 그것은 tright 와 tleft 가동일한값이라는것을의미하고그래서센서들이동일한밝기의불빛을감지한다는것을의미한다. ndshade가 -0.5에가까워질수록우측센서가더어두운그림자이고, ndshade가 0.5에가까워지면좌측센서의그림자가더어둡다는것이다. 이것은조종할때매우유용할것이다. 먼저직렬모니터로그것을테스트해보자. 예제스케치 : LightSensorValues 다음화면캡쳐는 LightSensorValues 스케치가실행되는직렬모니터예제를나타낸다. 우측센서위의그림자때문에 ndshade값이약 0.4이고, 좌측센서위의그림자로는 ndshade 값이약 -0.4가된다. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

77 근처창문에서직사광선이들어오지않는가를확인하시오. 실내불빛이좋고, 직사광선은여전히센서가과동작하는상태가될것이다. ABOT의좌측센서위에그림자를드리울때음수가나오는지를점검하고, 더어둡게하면더큰음수로나타나는지를점검하시오. ABOT의우측센서위에그림자를드리울때양수가나오는지를점검하고, 더어둡게하면더큰양수로나타나는지를점검하시오. 두개의센서가동일한수준의불빛이나그림자에대하여 ndshade 값이 0에가까운지를점검하시오. 두개센서위에동일한그림자를만드시오. 전체불빛의수준이내려가더라도 ndshade의값은여전히 0에가깝게머물러있어야합니다. /* * Robotics with the BOE Shield - LightSensorValues * Displays tleft, ndshade and tright in the Serial Monitor. */ void setup() tone(4, 3000, 1000); delay(1000); // Built-in initialization block // Play tone for 1 second // Delay to finish tone Serial.begin(9600); // Set data rate to 9600 bps 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

78 void loop() // Main loop auto-repeats float tleft = float(rctime(8)); // Get left light & make float float tright = float(rctime(6)); // Get right light & make float float ndshade; // Normalized differential shade ndshade = tright / (tleft+tright)-0.5;//calculate it and subtract 0.5 // Display heading Serial.println("tLeft ndshade tright"); Serial.print(tLeft); // Display tleft value Serial.print(" "); // Display spaces Serial.print(ndShade); // Display ndshade value Serial.print(" "); // Display more spaces Serial.println(tRight); // Display tright value Serial.println(' '); // Add an extra newline delay(1000); // 1 second delay long rctime(int pin) pinmode(pin, OUTPUT); digitalwrite(pin, HIGH); delay(5); pinmode(pin, INPUT); digitalwrite(pin, LOW); long time = micros(); while(digitalread(pin)); time = micros() - time; return time; // rctime measures decay at pin // Charge capacitor //..by setting pin ouput-high //..for 5 ms // Set pin to input //..with no pullup // Mark the time // Wait for voltage < threshold // Calculate decay time // Returns decay time 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

79 측정빛의그래프표시 아래직렬모니터캡쳐화면은 ndshade 변수값을그림으로나타낸예제이다. 별표 (asterisk) 는빛이나그림자가두개센서에걸쳐서같다면 -0.5와 0.5사이중간점에있을것이다. ABOT의우측센서위의그림자가더어둡다면별표는스케일에서우측으로자리할것이다. 좌측센서위의그림자가더어둡다면별표는좌측으로위치할것이다. 그림자 / 불빛의대조비가더커지는것은별표위치를중심으로부터더멀게할것이다. LightSensorDisplay 스케치를아두이노로로드하시오. 각각의광센서위로서로다른그림자를드리우도록시도해보고, 직렬모니터에서의별표가어떻게응답하는지를살펴보시오. 여러분이두개센서위로동일한그림자를드리우면별표는여전히중간에있어야한다는점을명심하세요. 두개센서사이에서차이가있다면센서가더어두운것을인식한다는것을가르킨다. /* * Robotics with the BOE Shield - LightSensorDisplay * Displays a scrolling graph of ndshade. The asterisk positions ranges 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

80 * from 0 to 40 with 20 (middle of the display) indicating same light on * both sides. */ void setup() // Built-in initialization block tone(4, 3000, 1000); // Play tone for 1 second delay(1000); // Delay to finish tone Serial.begin(9600); // Set data rate to 9600 bps void loop() // Main loop auto-repeats float tleft = float(rctime(8)); // Get left light & make float float tright = float(rctime(6)); // Get right light & make float float ndshade; // Normalized differential shade ndshade = tright / (tleft+tright) - 0.5; //Calculate it and subtract 0.5 for(int i = 0; i<(ndshade * 40) + 20; i++) //Place asterisk in 0 to 40 Serial.print(' '); // Pad (ndshade * 40) + 20 spaces Serial.println('*'); // Print asterisk and newline delay(100); // 0.1 second delay long rctime(int pin) pinmode(pin, OUTPUT); digitalwrite(pin, HIGH); delay(5); pinmode(pin, INPUT); // rctime measures decay at pin // Charge capacitor //..by setting pin ouput-high //..for 5 ms // Set pin to input 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

81 digitalwrite(pin, LOW); long time = micros(); while(digitalread(pin)); time = micros() - time; return time; //..with no pullup // Mark the time // Wait for voltage < threshold // Calculate decay time // Returns decay time LightSensorDisplay 의동작방법 loop 함수는좌측과우측광센서에대한 rctime 측정을반복하고그것들을 tleft 와 tright에저장한다. void loop() float tleft = float(rctime(8)); float tright = float(rctime(6)); // Main loop auto-repeats // Get left light & make float // Get right light & make float ndshade가유동소수점변수로선언된후, tleft 와 tright가영점조정된정규화미분측정값을얻기위한표현으로사용된다. 그결과는 -0.5와 +0.5 사이에존재할것이고 ndshade에저장된다. float ndshade; // Normalized differential shade ndshade = tright / (tleft+tright) - 0.5; // Calculate it and subtract 0.5 다음에, 별표를프린트하기위하여 loop 동안우측위치에커서를둔다. ndshade 값을가져와서 40을곱한다. 또한 ndshade가 -0.5라면우리가앞쪽 20칸을남겨두고프린트하기위하여 ndshade 값에 20칸을더해야한다. 그래서 ( ) + 20 = 0. 이제 ndshade가 0이라면, 우리는 20칸을남기기를원한다. 그래서 (0 40) + 20 = 20. 만약 +0.5라면우리는 40칸을남기고프린트하고싶다. (0.5 40) + 20 = 40. 물론 0.25처럼사이에어떤것이있다면우리는 ( ) + 20 = 30이다. 그래서중간과맨오른쪽사이의절반을프린트할것이다. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

82 for(int i = 0; i<(ndshade * 40) + 20; i++) // Place asterisk in 0 to 40 Serial.print(' '); // Pad (ndshade * 40) + 20 spaces 빈칸을프린트한후에한개별표가선위에프린트된다. println이프린트하고반복을통하여별표가다음줄에표시되도록하기위하여새로운줄을더한다. Serial.println('*'); // Print asterisk and newline delay(100); // 0.1 second delay 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

83 ABOT이광선방향으로추적하도록만드는한가지접근은그림자를거부하도록만드는것이다. 여러분은 ABOT의측면으로감지되는광선사이의차이가작거나또는많을때 ABOT이조금또는많이회전하도록만들기위한 ndshade 변수를사용할수있다. 그늘진곳의조종결정 ABOT의우측그림자로부터멀어지도록회전을잘하게하는 If 문장이여기에있다. 프로그램은두개의 int 변수 speedleft 와 speedright를선언하는것으로부터시작한다. 그것들은 loop 함수에서다른블록들이그들의값을검사할것이기때문에 if else블록내에서는선언되지않는다. 다음에 if(ndshade >0.0) 는로봇의우측측면으로그림자가감지되면 ABOT이어둠으로부터멀어지게회전하도록왼쪽바퀴를천천히속도를낮추는것을실행할코드블록을가지고있다. 이것을하기위해 ndshade * 는 200으로부터차감된다. speedleft로그결과를할당하기이전에, int(200.0 (ndshade ) 는유동소수점해답을정수형으로바꾼다. 정수형값을필요로하는 4장동작함수와호환되는값을만들기위해우리는다음과같이실시한다. int speedleft, speedright; // Declare speed variables if (ndshade > 0.0) // Shade on right? // Slow down left wheel speedleft = int( (ndshade * )); speedleft = constrain(speedleft, -200, 200); speedright = 200; // Full speed right wheel 다음도면은 ndshade가 0.125일때어떻게동작하는지를예제로보여준다. 왼쪽바퀴는 200 ( ) = 75이기때문에속도가느려진다. 선형속도제어가 100에서 -100사이범위에있기때문에전속의약 3/4으로바퀴를구동한다. 한편 speedright는전속전진을위하여 200으로놓는다. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

84 ndshade가커지면커질수록, 그것은더많이 200으로부터차감한다. 다음예제에서문제는없다. 그러나 ndshade가 0.45이라면, 그것은 speedleft 변수에 -250을저장하려고할것이다. 우리가원하는속도가 -200과 200까지의범위내에있도록동작 (maneuver) 함수를요구하기때문에, 우리는 speedleft가제한구역을벗어나지않도록아두이노의 constrain 함수를사용할것이다. speedleft = constrain(speedleft, 200, 200). 여기에좌측의그림자로부터멀어지게잘회전하는또다른문장이있다. 그것은우측바퀴를천천히회전하게하고좌측바퀴는전속으로전진하도록한다. (ndshade*1000) 에 200을더한다. 이런이유로다음이 if(ndshade >0.0) 을위한 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

85 그밖의문장이고, 그래서그것은 ndshade가 0과같거나더작을때사용될것이다. ndshade가 이면, speedright = int( (ndshade * )) 는 ( ) = = 75로평가할것이다. constrain함수는 speedright를제한하기위하여다시사용된다. else // Shade on Left? // Slow down right wheel speedright = int( (ndshade * )); speedright = constrain(speedright, -200, 200); speedleft = 200; // Full speed left wheel 직렬모니터로조정결정테스트 실제로조정결정을테스트하기전에직렬모니터로변수값을살펴보는것이최선이다. 그래서동작함수를호출하지않고, 먼저올바른값을갖는지를알아보기위하여 Serial.print 호출을사용해보자. Serial.print(speedLeft, DEC); // Display speedleft Serial.print(" "); // Spaces Serial.print(ndShade, DEC); // Display ndshade Serial.print(" "); // More spaces Serial.println(speedRight, DEC); // Display speedright delay(2000); // 1 second delay print와 println의호출은좌측열에서 speedleft의값을보여주는화면으로나타나고, 우측열에서 speedright, 그리고두개사이에서 ndshade를보여주도록한다. 주의깊게살피시오. 더밝은빛측면은항상전속력전진을위해 200을표시할것이고, 다른한쪽은 200보다더작은값으로속도가느려질것이다. ( 그림자가어두울수록더작은값이됨 ) 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

86 예제스케치 Light Seeking Display 전원스위치를 1에놓았는지확인하시오. LightSeekingDisplay 스케치를입력하고저장하고업로드하시오. 직렬모니터를여시오. ABOT의우측광센서위에서로다른그림자를만들어보시오. speedleft 속도를늦추고, 그림자의양을바꾸어보시오. 좌측바퀴속도가느려지는지를검사하기위하여좌측광센서로동일하게시도해보시오. 두개센서에더많이그림자를만들어보시오. 그림자가두개센서에동일하기때문에 ndshade는 0에가까워져야한다. (speedleft 와 SpeedRight는바퀴속도가느려지기전에 100까지감소해야한다.) /* * Robotics with the BOE Shield - LightSeekingDisplay * Displays speedleft, ndshade, and speedright in Serial Monitor. Verifies * that wheel speeds respond correctly to left/right light/shade conditions. */ void setup() // Built-in initialization block 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

87 tone(4, 3000, 1000); delay(1000); // Play tone for 1 second // Delay to finish tone Serial.begin(9600); // Set data rate to 9600 bps void loop() // Main loop auto-repeats float tleft = float(rctime(8)); // Get left light & make float float tright = float(rctime(6)); // Get right light & make float float ndshade; // Normalized differential shade ndshade = tright / (tleft+tright)-0.5; //Calculate it and subtract 0.5 int speedleft, speedright; // Declare speed variables if (ndshade > 0.0) // Shade on right? // Slow down left wheel speedleft = int( (ndshade * )); speedleft = constrain(speedleft, -200, 200); speedright = 200; // Full speed right wheel else // Shade on Left? // Slow down right wheel speedright = int( (ndshade * )); speedright = constrain(speedright, -200, 200); speedleft = 200; // Full speed left wheel Serial.print(speedLeft, DEC); // Display speedleft Serial.print(" "); // Spaces Serial.print(ndShade, DEC); // Display ndshade Serial.print(" "); // More spaces Serial.println(speedRight, DEC); // Display speedright 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

88 delay(1000); // 1 second delay long rctime(int pin) pinmode(pin, OUTPUT); digitalwrite(pin, HIGH); delay(5); pinmode(pin, INPUT); digitalwrite(pin, LOW); long time = micros(); while(digitalread(pin)); time = micros() - time; return time; // rctime measures decay at pin // Charge capacitor //..by setting pin ouput-high //..for 5 ms // Set pin to input //..with no pullup // Mark the time // Wait for voltage < threshold // Calculate decay time // Returns decay time 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

89 여기서 LightSeekingDisplay 스케치는실제로하려고하는것을화면에표시할 4가지를필요로한다. 1. Serial.print 호출을제거하시오. 2. 서보코드를더하시오. 3. 동작함수 (maneuver function.) 를더하시오. 4. 동작함수에 speedleft 와 speedrightadd를통과할반복함수로호출 결과는 LightSeekingShieldBot 스케치이다. LightSeekingShieldBot를아두이노에입력하고저장하고업로드하시오. 배터리팩을연결하고, ABOT을마루에놓고, 전원스위치를 2로놓으시오. ABOT이떠돌도록해보자. 그리고좌측과우측광센서위에그림자를만들어보자. /* * Robotics with the BOE Shield - LightSeekingShieldBot * Roams toward light and away from shade. */ #include <Servo.h> // Include servo library Servo servoleft; Servo servoright; // Declare left and right servos void setup() tone(4, 3000, 1000); delay(1000); // Built-in initialization block // Play tone for 1 second // Delay to finish tone servoleft.attach(13); // Attach left signal to pin 13 servoright.attach(12); // Attach right signal to pin 12 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

90 void loop() // Main loop auto-repeats float tleft = float(rctime(8)); // Get left light & make float float tright = float(rctime(6)); // Get right light & make float float ndshade; // Normalized differential shade ndshade = tright/(tleft+tright)-0.5;//calculate it and subtract 0.5 int speedleft, speedright; // Declare speed variables if (ndshade > 0.0) // Shade on right? // Slow down left wheel speedleft = int( (ndshade * )); speedleft = constrain(speedleft, -200, 200); speedright = 200; // Full speed right wheel else // Shade on Left? // Slow down right wheel speedright = int( (ndshade * )); speedright = constrain(speedright, -200, 200); speedleft = 200; // Full speed left wheel maneuver(speedleft, speedright, 20); // Set wheel speeds long rctime(int pin) pinmode(pin, OUTPUT); digitalwrite(pin, HIGH); delay(5); pinmode(pin, INPUT); digitalwrite(pin, LOW); // rctime measures decay at pin // Charge capacitor //..by setting pin ouput-high //..for 5 ms // Set pin to input //..with no pullup 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

91 long time = micros(); while(digitalread(pin)); time = micros() - time; return time; // Mark the time // Wait for voltage < threshold // Calculate decay time // Returns decay time // maneuver function void maneuver(int speedleft, int speedright, int mstime) servoleft.writemicroseconds(1500+speedleft);// Set Left servo speed servoright.writemicroseconds( speedright); //Set right servo speed if(mstime==-1) // if mstime = -1 servoleft.detach(); // Stop servo signals servoright.detach(); delay(mstime); // Delay for mstime 광선 / 그림자감도조정 여러분이빛에더민감하기를원한다면, 1000을다음두줄명령에서더큰값으로변경하시오. speedleft = int( (ndshade * )); speedright = int( (ndshade * )); 덜민감하기를원합니까? 1000 을더작은값으로변경하시오. 반복함수로맞춰질수있는 ABOT을위한여러가지광감지조정아이디어들이여기에있다. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

92 ABOT이광선대신그림자를따르도록하기위하여 if else 문장앞에 ndshade = -ndshade right 를놓으시오. 이것이왜어떻게동작하는지궁금합니까? 이장의끝부분에서프로젝트 2를점검하시오. 매우밝은조건과어두운조건을감지함으로써밝은장소와어두운장소에서돌아다니는것을마치시오. tleft 와 tright를더하고, 결과를높은문턱전압 ( 어두움 ) 혹은낮은문턱전압 ( 밝음 ) 과비교하시오. 여러분의움직이지않는상태이거나밝은광원방향으로회전하는것에의해 ABOT 함수가광나침반이되도록만드시오. 보봇이물체주위를탐지하거나항해할수있도록빛을향해움직이는것에더듬이를포함하시오. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

93 이장은로봇조종을위해밝은빛과어두움을감지할수있는한쌍의광센서사용법에초점이맞춰져있다. 많은전자공학개념과프로그램기법들이소개된다. 전자공학 포토트랜지스터가무엇인가그리고베이스, 에미터그리고컬렉터를어떻게찾는가? 자외선가시광선적외선의파장대역은무엇인가? 분위기광선은무엇을의미하는가? 디지털센서와아날로그센서의차이는무엇인가. 옴의법칙은무엇이고, 포토트랜지스터회로응답전압을맞추기위하여저항을어떻게사용하는가? 출력전압회로에서간단한디지털센서로포토트랜지스터사용하기 커패시터는무엇이고, picofarads단위로표시된작은커패시터는얼마나작은양인가? 저항-커패시터전하이동회로 (QT회로로도불리어짐 ) 에서아날로그센서로포토트랜지스터사용하기. 부품이직렬과병렬로연결된다는것은어떤의미인가? 전압감쇠가무엇이고, 저항-커패시터회로에서어떻게이용되는가? 프로그래밍 아날로그센서출력으로부터전압값을얻기위한아두이노 analogread 함수의사용법 아날로그센서로부터측정할저항-커패시터회로에서스케치는전압감쇠를어떻게측정할수있는가? 변수값을위한상향한계와하향한계를설정하기위한아두이노 constrain 함수를어떻게사용하는가? 로보틱스수단 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

94 빛에반응하는자율센서주행을위한한쌍의포토트랜지스터사용하기 기술수단 회로와코드루틴의서브시스템점검하기 아나로그입력으로부터 10비트값을아두이노에제공하는상황에서의개념 영점조정된정규화미분측정을위한방정식사용하기 포토트랜지스터출력전압회로 질문 1. 트랜지스터는무엇을조절하는가? 2. 어느포토트랜지스터끝이단자를가지고있는가? 3. 단자를구분하기위하여포토트랜지스터플라스틱케이스의납작한지점을어떻게사용할수있는가? 4. 포토트랜지스터는어느색에더민감한가 : 빨강또는초록? 5. 빛이더밝아진다면회로에서 V A3 가어떻게반응하는가? 6. V A3 가증가하도록또는감소하도록하는위회로에서포토트랜지스터는무엇을하는가? 7. 빛에더민감하도록위회로를어떻게수정할수있는가? 8. 입력으로설정되어야할 I/O핀으로공급되는전압이문턱전압위또는아래일때무슨일이일어나는가? 9. 커패시터가축적한전하량이감소한다면, 단자전압에무슨일이일어나 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

95 는가? 연습 1. 회로에서 I = 1 ma이라면 V A3 에대하여풀어보시오. 2. 회로에서 V A3 가 4.5V라면저항을통과하는전류를계산하시오 로적혀있는커패시터의값을계산하시오. 4. 핀 7번으로지연시간을측정하는 rctime문장을작성하시오. 그리고 tdecay로이름붙여진변수에결과를저장하시오. 5. 아두이노가양쪽끝에서 1001의감쇠값을측정한다면 ndshade측정치가무엇이될지계산하시오. 6. 직렬모니터에서 50개의등호기호를표시하는반복문을작성하시오. 프로젝트 1. 활동1에서, HaltUnderBrightLight sketch 와함께하는회로는과정의끝에서 ABOT을불빛아래에서멈추게한다. 여러분이경쟁이전에제한된시간만을가지고있다면, 그리고더나아가광원조건을모르고있다면어쩌겠는가? 여러분은그장소에서 ABOT을보정할필요가있을것이다. ABOT이밝은빛을감지할때반복적으로피에죠스피커가비프음을내는스케치그리고분위기불빛을감지할때조용하게유지하는스케치가이런작업에유용할것이다. 실습1에서이와같이동작하는스케치를작성하고점검하시오. 2. ABOT을이리저리돌아다니게만들고불빛대신에어두움을찾도록하는응용을개발하시오. 이와같은응용은 Building the Photosensitive Eyes로부터전하이동회로를이용해야합니다. 3. ABOT이유일한광원이형광등불빛인방안에서책상위의밝은백열등방향으로움직이도록하는응용을개발하시오. ABOT은백열등방향으로움직일수있어야하고백열등아래에서움직여야합니다. 이응용은 Building the Photosensitive Eyes로부터전하이동회로를사용해야합니다. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

96 질문해답 1. 전류의양은컬렉터로흘러들어가고베이스를통과하여흘러나온다. 5. 포토트랜지스터의컬렉터와에미터끝은단자로연결되어있다. 6. 평평한지점에가까운단자가에미터이다. 평평한지점과멀리떨어져있는단자는컬렉터이다. 7. 빨강색파장이적외선파장에더가깝다. 그래서빨강에더민감해야한다. 8. VA3는빛의양과함께증가한다. 9. 포토트랜지스터는더많은전류와더작은전류를저항으로공급한다 kω 저항을더큰값으로변경하시오. 11. 공급전압이문턱전압이상이라면, 입력은핀이 1의값을저장하는비트를예약한다. 만약문턱전압아래라면, 입력은 0을저장하는비트를예약한다. 12. 전압이감소한다. 연습해답 1. V = I R = A 2000 Ω = 2 V. 2. V = I R I = V R = = A = 2.25 ma with 5 zeros appended and multiplied by 1 pf. 1,000,000 1 pf = (1 106) ( ) F = F = 1 μf. 4. It would be long tdecay = rctime(7); 5. ndshade = tright / (tleft+tright) = 1001 ( ) 0.5 = = Solution: for(int i = 1; i<=50; i++) // Repeat 50 times Serial.print('='); // one = char each time through 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

97 Project Solutions 1. 이것은 HaltUnderBrightLight의수정버전입니다. /* * Robotics with the BOE Shield - Chapter 6, Project 1 * Chirp when light is above threshold. Will require updating value of * threshold & retesting under bright light to get to the right value. */ void setup() tone(4, 3000, 1000); delay(1000); // Built-in initialization block // Play tone for 1 second // Delay to finish tone void loop() // Main loop auto-repeats if(volts(a3) > 3.5) // If A3 voltage greater than 3.5 tone(4, 4000, 50); // Start chirping delay(100); float volts(int adpin) // Measures volts at adpin // Returns floating point voltage return float(analogread(adpin)) * 5.0 / ; 2. 이것의해답은 LightSeekingShieldBot를복사하고, loop함수에하나의명령을더추가하시오 :ndshade = -ndshade. if else문장바로전에그것을추가하시오. 그다음회피할그림자를가르키는것대신에, 그것은회피할밝은빛을가르킵니다. 또다른접근은 tleft / (tleft + tright) 와동등한 ndlight 계산을사용하는것입니다. 여러분은스케치 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

98 에서 ndshade 를 ndlight 로바꿔야할것입니다. 3. 문턱값을결정하기위하여 LightSensorValues를사용하시오. tleft + tright를취하는것이최선입니다. 여러분은이것을테스트하기위하여 LightSensorValues를사용할수있다. 밝은빛수준에이르는방법의 1/4 값으로시작하시오. 그래서밝은빛에대하여 tleft + tright = 4000과 400이라면, ¼ ( ) = = 1300 값을사용하시오. 다음에 HaltUnderBrightLight부터 LightSeekingShieldBot의메인 loop 까지유사한 if 문장을그것에추가하시오. HaltUnderBrightLight는전압출력회로를사용하기때문에보다더크게뜻의 (>) 연산자를사용합니다. 보다더작은값은더밝은빛을의미하기때문에 QT회로를위해보다더작은뜻의 (<) 연산자를필요로합니다. 우리는또한 처럼부동소수점값으로문턱값을표현합니다. 여기에예제가있습니다. // Add this if condition to stop under the bright lamp. if((tright + tleft) < ) // tleft+tright < 1300? servoleft.detach(); // Stop servo signals servoright.detach(); 여기 LightSeekingShieldBot의수정된버전에트릭을추가할것입니다. 여러분은여전히광선상태에따라그것을계산해야할것입니다. /* * Robotics with the BOE Shield - Chapter 6, Project 3 * Roams toward light and away from shade. */ #include <Servo.h> Servo servoleft; Servo servoright; // Include servo library // Declare left and right servos 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

99 void setup() tone(4, 3000, 1000); delay(1000); // Built-in initialization block // Play tone for 1 second // Delay to finish tone servoleft.attach(13); // Attach left signal to pin 13 servoright.attach(12); // Attach right signal to pin 12 void loop() // Main loop auto-repeats float tleft = float(rctime(8)); // Get left light & make float float tright = float(rctime(6)); // Get right light & make float // Add this if condition to stop under the bright lamp. if((tright + tleft) < ) // If A3 voltage greater than 2 servoleft.detach(); // Stop servo signals servoright.detach(); float ndshade; // Normalized differential shade ndshade = tright / (tleft+tright) - 0.5;//Calculate it and subtract 0.5 int speedleft, speedright; // Declare speed variables if (ndshade > 0.0) // Shade on right? // Slow down left wheel speedleft = int( (ndshade * )); speedleft = constrain(speedleft, -200, 200); speedright = 200; // Full speed right wheel else // Shade on Left? 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

100 // Slow down right wheel speedright = int( (ndshade * )); speedright = constrain(speedright, -200, 200); speedleft = 200; // Full speed left wheel maneuver(speedleft, speedright, 20); // Set wheel speeds long rctime(int pin) // rctime measures decay at pin pinmode(pin, OUTPUT); // Charge capacitor digitalwrite(pin, HIGH); //..by setting pin ouput-high delay(5); //..for 5 ms pinmode(pin, INPUT); // Set pin to input digitalwrite(pin, LOW); //..with no pullup long time = micros(); // Mark the time while(digitalread(pin)); // Wait for voltage < threshold time = micros() - time; // Calculate decay time return time; // Returns decay time // maneuver function void maneuver(int speedleft, int speedright, int mstime) servoleft.writemicroseconds( speedleft);//set Left servo speed servoright.writemicroseconds( speedright); //Set right servo speed if(mstime==-1) // if mstime = -1 servoleft.detach(); // Stop servo signals servoright.detach(); delay(mstime); // Delay for mstime 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

101 ABOT은이미더듬이센서를사용할수있다. 그러나단지물체에닿았을경우에만장애물을감지한다. 만약 ABOT은물체를 보는것 만으로물체에대해서무엇을하는지알아차릴수있다면더좋지않을까? 자이제적외선 (infrared hedadlights) 를가지고아래에서보는것과같이사람의눈과비슷한것을만들려고한다. 각각의지시등은적외선 LED가손전등같이빛을앞으로곧장보내도록튜브안에들어있다. 각각의눈은적외선수신부 (infrared receiver) 이고, 물체에서반사된적외선 LED 빛을감지하였는지를나타내는아두이노 HIGH/LOW 신호를보낸다. TV 리모콘은약 38kHz로특정길이의시간동안특정주기사이에서빛을깜박인다. 이것은리모콘에있는각키에서로다른깜박임 / 꺼짐패턴을만든다. 적외선반사됨, 적외선반사되지않음, 물체감지됨 물체감지되지않음 적외선빛신호 (Infrared Light Signals) 적외선 (Infrared) 은일반적으로 IR 이라고한다. 이빛은사람이눈으로볼수없는빛의범위에있다. 이장에서는 IR LEDs가적외선빛을내는것을소개하고단지우리가가시광선을내기위해사용한 red LED와같은것이다. 이장에서는적외선수신부 (infrared receiver) 가적외선빛을감지한다. 지난장에서포토레지스터와비슷하다. 그러나조금다른것은이들적외선수신부는주변환경의빛을감지하는것이아니고적외선빛을매우빨리있는지없는지감지할수있게설계되어있다. 작은전조등으로써사용되는 ABOT 에있는적외선 LED 는실제로 TV 리모콘에 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

102 서볼수있는것과같다. TV 리모콘은 TV에메시지를보내기위해 IR LED 빛을쏜다. TV에있는마이크로콘트롤러는이들메시지를우리가사용하려는 ABOT에있는것과같은적외선수신부로잡아낸다. TV 리모콘은약 38kHz( 초당약 38,000회 ) 대역에서 IR LED를매우빠르게깜박임으로메시지를보낸다. IR 수신부는단지이대역에맞게깜박이는적외선만받는다. 이것은리모콘이메시지로해석할수있는태양과백열등빛과같은적외선을막는다. 그래서 IR 수신부는신호를감지할수있고, 아두이노는 28kHz 깜박일것이다. 주의! 어떤형광등빛은 IR 수신부에의해감지될수있다. 이들빛은 ABOT의적외선빛을사용하는데문제가될수있다. 이들중하나는이장에서개발할 탐지기 (Sniffer) 는 ABOT 코스에서가까이있는형광등빛을테스트하는데사용될수있다. 디지털카메라, 휴대전화, 웹카메라안에있는빛센서는모든적외선빛을감지할수있다. 디지털카메라를통해서보면적외선 LED가켜져있는지꺼진지 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

103 우리가볼수있다. 이들사진들은디지털카메라와 TV 리모콘의예이다. 우리가리모콘의버튼을누르고있고디지털카메라의렌즈가 IR LED가가리키고있으면, 흰빛이깜박이면서적외선 LED를표시하는것이보인다. 디지털카메라안에들어있는이픽셀센서는빨강 (Red), 초록 (Greed), 파랑 (blue) 빛의강도를감지한다. 픽셀센서가빨강, 초록, 파랑을감지하는것에관계없이이것은적외선을감지한다. 모든세픽셀컬러센서는또한적외선을감지한다. 디지털카메라는모든색상을함께혼합하여흰색으로표시한다. Infra는아래라는의미이고, 그래서적외선은빨간색 (red) 아래라는의미이다. 이이름은빨간색빛의파장의주파수보다적다는것을의미한다. 우리의 IR LED 송신부는파장의길이가 980 나노미터 (nanometer, nm으로표시 ) 로전송하고, 우리의 IR 수신부도파장이같은것을감지한다. 이파장은적외선범위내에있다. 원적외선범위는 2000 ~ 10,000 nm이며, 범위의특정파장은나이트비전고글및적외선온도감지를위해사용됩니다. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

104 이장에서는 ABOT 을위한적외선물체감지기를만들고테스트한다. 부품목록 (2개) IR 수신기 (IR receivers) (2개) IR LEDs 투명케이스 (2개) IR LED 쉴드막이 (shield assemblies) (2개) 저항, 220 Ω ( 빨강-빨강-갈색 ) (2개) 저항, 2 kω ( 빨강-검정-빨강 ) 부품목록에서부품들을모아서적외선수신부, LED와쉴드막이부품을사용하기위해아래의그림을이용하시오. 여러분이선택한것이포토트랜지스터가아니고적외선 LED가확실한지아래그림을보고확인하시오. 적외선 LED는둥근플라스틱의튀어나온부분이좀더길고둥글다. 그리고오른쪽그림에있는것이다. IR 전조등조립하기 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

105 IR LED를 LED 지지대 ( 두개중더큰것 ) 에아래보이는것처럼끼운다. IR LED 는 LED 지지대에딸깍끼운다. IR LED의투명플라스틱케이스위세짧은튜브를끼운다. 튜브의끝에링은 LED 지지대에꼭끼게맞춘다. 사용하는동안조립된부품들이분리되지않게투명테이프의작은조각을이용하라. IR 물체감지회로 IR 목표물감지회로다음그림은 IR 물체감지회로도를보여준다. 하나의 IR 물체감지자 (IR LED와수시부는한쌍이다 ) 는 ABOT의브레드보드가장앞의한쪽코너에끼운다. 전원과프로그래밍케이블연결을빼시오. 부품을배치하기위한참고로배선도를사용하여아래그림과같이회로를완성하시오. IR LED의양극을각각 2 kω 저항에연결하시오. 음극선은브레드보드에서 IR 수신부의중앙핀과같은선으로연결하시오. 그리고점퍼선은 GND에연결하시오. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

106 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

107 주의! IR LED의양극과음극을확인하시오. 양극선은 IR LED에서관습적으로좀더길다. 음극선은좀더짧고플라스틱케이스에서편편한쪽이다. 이들은빨간색 LED에도사용하는데동일하게습관적인것이다. 물체감지테스트코드 여러분의 ABOT의적외선수신부는적외선빛 (980 나노미터범위 ) 을 38KHz 가까운속도로감지하도록설계되어있다. IR LED를이속도로 on/off 하게만들기위해, 우리는각스케치를시작할때스피커삑소리를내는것과비슷한음정을사용할수있다. 적외선감지는다음세단계를따른다. 1. IR LED on/off 를 38 khz 속도로비춘다. 2. IR 물체에반사된 38 khz IR 빛을보내기위한반응으로낮은 (low) 신호를보내기위해 IR 수신부는시간을 1/1000초또는조금더지연시킨다. 3. 각각의높은신호 (IR 감지가아니 ) 또는낮은신호 (IR 감지 ) 둘다를위해 IR 수신부의상태를확인한다. 여기왼쪽 IR LED( 핀 9 번 ) 와 IR 수신부 ( 핀 10) 세단계의예제가있다. tone(9, 38000, 8); delay(1); int ir = digitalread(10); // IRLED가 38 khz 로최소 1 ms 지속 // Wait 1 ms // IR receiver -> ir variable 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

108 참고 : 음정 (tone) 은약 1.1ms 동안지속된다. 8초간 38kHz 신호를발생시키기위해 tone(9, 38000, 8) 을기대하더라도신호는실제로아두이노의소프트웨어버전 v1.0 에서는 1.1 ms 동안만지속된다. tone 이라는이름을부여하고함수는가청범위로테스트되어설계되어있을수있다. 만약스피커가실행된다면 38kHz는들을수없을것이다. 이것은 ultrasonic( 초음파 ) 의범위이고이것은사람이들을수없는너무높은소리라는것을의미한다. 사람이들을수있는범위는 20 Hz 에서 20kHz 이다. tone 함수는초당 번 high/low를반복하는파장을발생시킨다. 아두이노소프트웨어 v1.0으로서, 실험을통하여 8ms 동안도착했고, 이것은 38kHz 사각파를 1.1ms 동안지속적으로일으킨다. tone 함수는배경으로처리되는것이라는것을명심하시오. IR 수신부는 38 KHz 신호에반응하기위한천분의몇십초단위가필요하다. delay(1) 은 ir = digitalread(10) 가 IR 수신부의출력이준비될때까지복사되어호출되는것을막는다. 다음스케치는세개의매개변수로 irdetect 라고하는함수를정의한다. : 하나는 IR LED 핀이고, 다른하나는 IR 수신부를정의하고나머지는 IR LED를깜박이는주기를설정하기위한것이다. int irdetect(int irledpin, int irreceiverpin, long frequency) loop 함수에서 irdetect 를호출할것이다. int irleft = irdetect(9, 10, 38000); // 실제적용예 이호출은 irledpin 매개변수에 9를할당하고, irreceiverpin에 10을할당하고 frequency 에 38000을할당하는것이다. 이함수는적외선을감지하는것과물체를감지하지않았을때 1을리턴하고물체를감지하였을때 0을리턴하는세단계를수행한다. 이리턴값은 irleft에저장된다. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

109 스케치예제 : TestLeft 이스케치는 ABOT의왼쪽 IR 감지기만테스트하는것이다. 이것은여러분이두개의회로중하나만집중할수있기때문에간단히문제해결을도와준다. 이것은아직도보조실험의예이다. 이보조실험을확인한후우리는시스템을통합한다. 첫번째테스트와전선또는코드가정확한지를확인해야한다. 건전지를아두이노에서빼내시오. 3지점스위치를 1위치에놓는다. 코드를입력하고저장한다음아두이노에 TestLeftIr을업로드하시오. /* * ABot - TestLeftIR * IR 감지기가물체를감지하지않으면 1을표시하고 * 물체를감지하면 0을표시한다. */ void setup() // Built-in initialization block tone(4, 3000, 1000); // Play tone for 1 second delay(1000); // Delay to finish tone pinmode(10, INPUT); pinmode(9, OUTPUT);// Left IR LED & Receiver Serial.begin(9600); // Set data rate to 9600 bps 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

110 void loop() // Main loop auto-repeats int irleft = irdetect(9, 10, 38000); // Check for object Serial.println(irLeft); // Display 1/0 no detect/detect delay(100); // 0.1 second delay // IR Object Detection Function int irdetect(int irledpin, int irreceiverpin, long frequency) tone(irledpin, frequency, 8); // IRLED 38 khz for at least 1 ms delay(1); // Wait 1 ms int ir = digitalread(irreceiverpin); // IR receiver -> ir variable delay(1); // Down time before recheck return ir; // Return 1 no detect, 0 detect ABOT 프로그래밍케이블을연결하고, 스케치를업로드시킨후시리얼모니터를여시오. 손이나종이와같은물체를 IR 물체감지기에서 1인치 (2-3cm) 정도앞에그림 7-1과같이두시오. 시리얼모니터에예상한대로장애물을감지하지않았을때 1을, 장애물을감지하였을때 0이표시된다면다음장으로넘어가세요. 시리얼모니터에예상값이표시된다면오른쪽 IR 물체감지기 (Object Detector) 로넘어가시오. 만약예상값이표시되지않으면도움말을참고하세요. 실습 - Test the Right IR Object Detector 오른쪽 IR 물체감지기를테스트하기위해스케치를수정하려면 irleft를 irright 로고치고, 회로에테스트하기위해핀번호를매개변수에정확히대입한다. 다음은변경하기위한목록순서이다. TestLeftIr를 TestRightIr로변경하여저장한다. pinmode(10, INPUT); pinmode(9, OUTPUT) 를 pinmode(3, INPUT); 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

111 pinmode(2, OUTPUT) 으로변경한다. int irleft = irdetect(9, 10, 38000) 를 int irright = irdetect(2, 3, 38000) 로변경한다. Serial.println(irLeft) 를 Serial.println(irRight) 로변경한다. ABOT의오른쪽 IR 물체감지기를위해테스트단계를반복한다. 회로나코드의에러를해결하기위하여도움말을찾으시오. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

112 이번실습에서는시리얼모니터의도움없이물체를감지하였는지를알려주는지시자 LED를만들고테스트한다. 근처에 PC나노트북이없어도조작할수있어편리하고, IR 감지기회로에문제가있을때필요하다. 여러분은또한형광등빛에서생기는적외선간섭 " 탐지 하기위해스케치를할것이다. 어떤형광등빛은적외선 LED에서보내는신호와비슷한신호를보낸다. 형광등은 안정기 (ballast) 라고하는전압조정장치가내부에있다. 어떤안정기는 38.5 khz 적외선신호로발산하기때문에 IR 감지기와같은파장으로작동한다. 방향조정을위한 IR 물체감지기를사용할때이간섭대문에 ABOT 이이상한행동을할수도있다. LED 지시회로추가하기 LED 지시회로는더듬이에서사용한것과비슷하다. 선을연결할때양극과음극을주의해야한다. 필요한부품들 (2개) 빨강색 LEDs (2개) 저항, 220 Ω (red-red-brown) 프로그래밍케이블과전원공급선을뺀다. ABOT에부품의위치를맞추기위해배선도를사용하여배선도의빨간색 LED를회로도에서보는것처럼추가하시오. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

113 시스템테스트하기이시스템에는꽤많은구성요소들이있어서배선에러가날가능성이높아진다. 그래서적외선감지기가작동하는것을확인하는테스트를하는것이중요하다. ABOT에서프로그래밍케이블을분리하기전에이스케치를이용하여회로를확인한다. 예제스케치 TestBothIrAndIndicators 프로그래밍케이블과전원케이블을연결하고전원스위치를 1에놓는다. TestBothIrAndIndicators 코드를입력하고저장한다음아두이노에업로드하시오. 업로드한다음에스피커에서들을수있는소리가맑게나는지확인하시오. 물체가앞에있을때각 IR 감지기로부터아두이노가 0 을받고있는지확인하기위해시리얼모니터를사용하시오. 왼쪽 IR 감지기앞에물체가있을때왼쪽 (8번핀 ) 의빨간색 LED가빛을내는지확인하시오. 오른쪽 IR 감지기와 7번핀 LED 에반복해서실험하시오. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

114 /* * Robotics with the BOE Shield TestBothIrAndInciators * Test both IR detection circuits with the Serial Monitor. Displays 1 if * the left IR detector does not detect an object, or 0 if it does. * Also displays IR detector states with indicator LEDs. */ void setup() // Built-in initialization block tone(4, 3000, 1000); // Play tone for 1 second delay(1000); // Delay to finish tone pinmode(10, INPUT); pinmode(9, OUTPUT);//Left IR LED & Receiver pinmode(3, INPUT); pinmode(2, OUTPUT);//Right IR LED & Receiver pinmode(8, OUTPUT); pinmode(7, OUTPUT);// Indicator LEDs Serial.begin(9600); // Set data rate to 9600 bps void loop() // Main loop auto-repeats int irleft = irdetect(9, 10, 38000);// Check for object on left int irright = irdetect(2, 3, 38000);// Check for object on right digitalwrite(8,!irleft); // LED states opposite of IR digitalwrite(7,!irright); Serial.print(irLeft); // Display 1/0 no detect/detect Serial.print(" "); // Display 1/0 no detect/detect Serial.println(irRight); // Display 1/0 no detect/detect delay(100); // 0.1 second delay // IR Object Detection Function int irdetect(int irledpin, int irreceiverpin, long frequency) tone(irledpin, frequency, 8); // IRLED 38 khz for at least 1 ms delay(1); // Wait 1 ms int ir = digitalread(irreceiverpin);// IR receiver -> ir variable 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

115 delay(1); return ir; // Down time before recheck // Return 1 no detect, 0 detect TestBothIrAndIndicators 코드설명 irdetect 함수는두개, 즉 irdetect 와 irright를호출한후물체가감지되지않으면 1을저장하거나물체가감지되면 0을저장한다. 스케치는지시자의불빛이 irleft 와 irright의값에따라켜짐 / 꺼짐을반복하기위해 if else를사용할수있다. 하지만다른방법도있다. 이스케치는 iright의값을직접적으로사용한다. irleft 가 0을저장할때단지하나만받고빨간색지시 LED를켠다. 그리고 1이저장되면 LED를끈다. 1은 LED를켜는지시자이고 0을끄는지시자이기때문에 digitalwrite(8, irleft) 를사용하면우리가원하는반대값을받을수있다. 그래서이스케치는 irleft 저장값을반전하기위해 not 연산자 (!) 를사용한다. 자이제 digitalwrite(8,!irleft) 는 IrLeft 값을반전한다. 그래서 0을저장할때 LED 는켜지고, 1을저장할때 LED가꺼진다. 같은방법으로오른쪽 IR 감지기와 LED 지시자에적용할수있다. 참고 Not(!) 연산자는변수에서이진값을반전시킨다. 좀더나가면 digitalwrite(8,!irleft) 를볼것이다. 아마도 HIGH ( 상수 1) 는불이켜지고 LOW ( 상수 0) 은불이꺼지는 digitalwrite 함수값의매개변수를적용할것이다. 변수값을사용할때 digitalwrite 함수는변수의가장오른쪽이진수자리를사용한다. 즉 1은불이켜지고 0을불이꺼진다. 그래서 irleft 가 0 ( 물체감지 ) 일때는!irLeft 는이진수 을 으로변경하게된다. 가장오른쪽자리수가 1이기때문에불이켜진다. irleft는 1일때실제이진수는 이다.!irLeft 구문의결과는 이된다. 가장오른쪽자리수가 0이므로불이켜진다. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

116 실습하기 거리테스트와원격테스트 (Remote Testing and Range Testing) LED가작동함으로우리는 ABOT에서프로그래밍케이블을빼낼수있고, 다양한물체를감지하는테스트를할수있다. 어떤물체는적외선을더잘반사하기때문에 IR 물체감지기가더멀리있는물체를감지할수있을것이고어떤것은매우가까이있어야한다. ABOT에서프로그래밍케이블을분리하고, 여러분이방향을지시하는범위에서물체를감지하는것을다시해보시오. 다양한색상이있는물체를감지하는지거리를실험해보시오. 가장가까운거리에서감지되는색상과표면은무엇인가요? 가장멀리서감지되는색상과표면은무엇인가요? IR 간섭탐지하기 (Sniffing for IR Interference) 아무것도없는곳에서도 ABOT이어떤물체를탐지했다고말하는것을볼수도있다. 이것은아마도주변에서 38.5 khz 와비슷한주파수로 IR 빛과비슷한것을발생하고있다는의미이다. 이것은직접태양빛이창문을통과하여감지가안되는원인이될수도있다. 만약이런빛에있는근처에서로봇대회또는시연을해야한다면적외선시스템은매우나쁜수행결과가될것이다. 그래서사람들앞에서시연하기전에정확한시연을하기전에미리 sniffer" 스케치로 IR 간섭영역을확인해야한다. 이스케치의원리는간단하다. IR LED를통해서어떤 IR 도전송되고있지않을때 IR 이어떤것이라도감지한다는것을관찰하기위해, 만약감지된다면피에조스피커를사용하여경고음을발생시키는것이다. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

117 주의 여러분은 IR 간섭을발생시키는기계중하나인리모콘을사용할수있다. TV, VCR, CD/DVD 재생기리모콘은 IR LED와같은종류를사용하는모든기기를조작할수있다. 이들은 ABOT이방금감지한 IR 감지기와같은종류를사용하고있다. 그래서 ABOT이 TV, VCR, CD/DVD 재생기등에메시지를전달할수있다. 모든 IR 간섭은 ABOT을지시하고리모콘버튼의누름 / 해제를반복한다. 예제 IrInterferenceSniffer 이스케치에서는 ABOT가 tone을실행해야한다. 지시자 LED를켜고, 시리얼모니터적외선을감지했다는경고를표시한다. 다시아무 IR도전송되지않기때문에 38kHz 적외선은외부소스로부터와야한다는의미이다. 코드를입력하고아두이노에 IrInterferenceSniffer 를업로드하시오. IR 간섭이감지될때 ABOT이경고소리가나는지테스트하시오. 만약교실이라면각각의 ABOT을 TestBothIrAndIndicators로작동시킬수있다. IR LED는 IrInterferenceSniffer bot의 IR 수신기에 IR LED만지시한다. ABOT이없다면 TV, VCR, CD/DVD 재생기를위한리모콘을사용할수있다. ABOT에서버튼중하나를반복해서누르고떼고하여간단한지시를한다. ABOT이없다면 TV, VCR, CD/DVD 재생기를위한리모콘을사용할수있다. ABOT이경고음으로반응하면여러분은 IR 간섭탐지기가작동하는것을알수있다. /* * ABOT 로봇을위한- IrInterferencesSniffer * 적외선간섭의외부원인을테스트하기위함만약 IR 간섭이감지된다면 * 시리얼모니터가경고를표시하고, 피에조스피커가경고음을발생시킨다. * 지시등이깜박인다. */ void setup() tone(4, 3000, 1000); delay(1000); // Built-in initialization block // Play tone for 1 second // Delay to finish tone 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

118 pinmode(10, INPUT); pinmode(3, INPUT); pinmode(8, OUTPUT); pinmode(7, OUTPUT); // Left IR Receiver // Right IR Receiver // Left indicator LED // Right indicator LED Serial.begin(9600); // Set data rate to 9600 bps void loop() // Main loop auto-repeats int irleft = digitalread(10); // Check for IR on left int irright = digitalread(3); // Check for IR on right if((irleft == 0) (irright == 0)) // If left OR right detects Serial.println("IR interference!!!"); // Display warning for(int i = 0; i < 5; i++) // Repeat 5 times digitalwrite(7, HIGH); // Turn indicator LEDs on digitalwrite(8, HIGH); tone(4, 4000, 10); // Sound alarm tone delay(20); // 10 ms tone, 10 between tones digitalwrite(7, LOW); // Turn indicator LEDs off digitalwrite(8, LOW); 실습하기 - 형광등의간섭테스트하기 ABOT에서프로그래밍케이블을분리하고, 형광등이있는불빛아래에서테스트하시오. 특히자주경보가발생된다면 IR이물체를탐지하기전에형광등을끄시오. 창문을통해빛이들어온다면블라인드를닫고다시테스트하거나창문으로 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

119 부터멀리떨어진장소로로봇을이동하시오. ABOT은적외선간섭으로부터벗어나기위해 IrInterferenceSniffer를항상사용하시오. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

120 자동차의전조등 ( 또는더밝은플래시 ) 이밝을수록어두울때더멀리볼수있다는사실을알고있다. ABOT의적외선 LED 전조등이더밝으면또한감지범위가증가한다. 더작은저항은 LED에게더많은전류를흐르게한다. LED에더많은전류가흐르므로더밝아지는원인이된다. 이실습에서는 LED와적외선 LED에서로다른저항값의영향을실험할것이다. 필요한부품들 : 이실험에서추가로필요한부품들. (2개) 470 Ω 저항 ( 노랑-보라-갈색 ) (2개) 220 Ω 저항 ( 빨강-빨강-갈색 ) (2개) 1 kω 저항 ( 갈색-검정-빨강 ) (2개) 4.7 kω 저항 ( 노랑-보라-빨강 ) 저항시리즈와 LED 밝기 먼저, LED를하나사용하여저항이 LED를어떻게밝기를다르게만드는지보자. 모두 LED가필요하고스케치는 LED에 high 신호를전달한다. 예제스케치 - P1LedHigh 코드를입력하고저장하여 LeftLedOn를업로드시킨다. 스케치를실행시키고회로에서 P8에연결된 LED가빛을내는지확인한다. // ABOT 로봇에 - LeftLedOn // 밝기실험을위한왼쪽 LED를켜는실험 void setup() tone(4, 3000, 1000); delay(1000); // Built-in initialization block // Play tone for 1 second // Delay to finish tone pinmode(8, OUTPUT); digitalwrite(8, HIGH); // Left indicator LED 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

121 void loop() // Main loop auto-repeats 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

122 IR 감지기에대해서흥미로운사실한가지는더듬이 (whiskers) 와비슷한결과를낸다는것이다. 물체를감지하지않았을때결과값은 high(1) 이고, 물체를감지하였을때결과값은 low(0) 이다. 이실습에서 RoamingWithWhiskers 스케치는수정하여 IR 감지기를작동시킨다. 수정하는것은간단하다. 단계는 1. RoamingWithWhiskers를 RoamingWithIr로저장하시오. 2. irdetect 함수를추가한다. int irdetect(int irledpin, int irreceiverpin, long frequency) tone(irledpin, frequency, 8); delay(1); int ir = digitalread(irreceiverpin); delay(1); return ir; 3. digitalread 호출을수정한다. byte wleft = digitalread(5); byte wright = digitalread(7); /* irdetect 를호출 int irleft = irdetect(9, 10, 38000); int irright = irdetect(2, 3, 38000); 4. wleft 인스턴스를 irleft 로바꾸고 irleft를 irright로바꾸시오. 5. 주석 /* */ 와 // 을추가하시오, Replace all instances of wleft with irleft and wright with irright. Update the /* */ and // comments. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

123 스케치실습 - RoamingWithIr RoamingWithWhiskers 를연다. RoamingWithIr으로저장한다. 아래스케치와같이수정한다. ABOT에서프로그래밍케이블을분리시킨다. 건전지팩을다시연결하고 3-point 스위치를 2에둔다. ABOT을운행시키거나장애물을피할수있는곳에둔다. RoamingWithWhiskers ( 별도로접촉이필요하지않다 ) 처럼행동하는지관찰한다. /* * Robotics with the BOE Shield - RoamingWithIr * Adaptation of RoamingWithWhiskers with IR object detection instead of * contact switches. */ #include <Servo.h> // Include servo library Servo servoleft; Servo servoright; // Declare left and right servos void setup() // Built-in initialization block pinmode(10, INPUT); pinmode(9, OUTPUT);//Left IR LED & Receiver pinmode(3, INPUT); pinmode(2, OUTPUT);//Right IR LED & Receiver tone(4, 3000, 1000); delay(1000); // Play tone for 1 second // Delay to finish tone servoleft.attach(13); // Attach left signal to pin 13 servoright.attach(12); // Attach right signal to pin 12 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

124 void loop() // Main loop auto-repeats int irleft = irdetect(9, 10, 38000); // Check for object on left int irright = irdetect(2, 3, 38000);// Check for object on right if((irleft == 0) && (irright == 0)) // If both sides detect backward(1000); // Back up 1 second turnleft(800); // Turn left about 120 degrees else if(irleft == 0) // If only left side detects backward(1000); // Back up 1 second turnright(400); // Turn right about 60 degrees else if(irright == 0) // If only right side detects backward(1000); // Back up 1 second turnleft(400); // Turn left about 60 degrees else // Otherwise, no whisker contact forward(20); // Forward 1/50 of a second int irdetect(int irledpin, int irreceiverpin, long frequency) tone(irledpin, frequency, 8); // IRLED 38 khz for at least 1 ms delay(1); // Wait 1 ms int ir = digitalread(irreceiverpin); // IR receiver -> ir variable delay(1); // Down time before recheck return ir; // Return 1 no detect, 0 detect 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

125 void forward(int time) // Forward function servoleft.writemicroseconds(1700); // Left wheel counterclockwise servoright.writemicroseconds(1300); // Right wheel clockwise delay(time); // Maneuver for time ms void turnleft(int time) // Left turn function servoleft.writemicroseconds(1300); // Left wheel clockwise servoright.writemicroseconds(1300); // Right wheel clockwise delay(time); // Maneuver for time ms void turnright(int time) // Right turn function servoleft.writemicroseconds(1700); // Left wheel counterclockwise servoright.writemicroseconds(1700); // Right wheel counterclockwise delay(time); // Maneuver for time ms void backward(int time) // Backward function servoleft.writemicroseconds(1300); // Left wheel clockwise servoright.writemicroseconds(1700); // Right wheel counterclockwise delay(time); // Maneuver for time ms 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

126 이전실습에서프로그램에서했던방향조정양식은더듬이에서는괜찮았다. 그러나 IR 감지기를사용할때는불필요하게느리다. 더듬이를사용할때는 ABOT 이물체를접촉해야한다. 그런다음장애물주변으로뒤로간다. 적외선으로는 ABOT은대부분장애물앞에서피할것이다. 그리고장애물주변을피할수있다. 충돌을피하기위해샘플링속도증가시키기 여러분은모든주행에서 20 ms을줄일수있다. 이것은스케치를초당거의 50 번씩확인하고또확인한다는의미이다. ( 이것은실제로조금더느리다. 초당 40번정도된다. 실행코드때문에 IR 감지에시간이너무많이걸린다.) ABOT 이방향조정으로장애물에도달하기전에충돌을피하기위해작은회전을실행할것이다. 이런방법으로필요이상으로멀리가지않고장애물주변을완전히피할수있다. 그래서복잡한코스도성공적으로방향조정을할수있다. 다음스케치를실험한후에 ABOT이주행하는꽤좋은방법이라는것에동의할것이다. 예제스케치 FastIrRoaming 코드를입력하고저장한다음 FastIrRoaming을업로드하시오. 그다음앞의실습과같은장애물로테스트하시오. /* * Robotics with the BOE Shield - FastIrRoaming * Adaptation of RoamingWithWhiskers with IR object detection instead of * contact switches */ #include <Servo.h> // Include servo library Servo servoleft; Servo servoright; // Declare left and right servos 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

127 void setup() // Built-in initialization block pinmode(10, INPUT); pinmode(9, OUTPUT); //Left IR LED & Receiver pinmode(3, INPUT); pinmode(2, OUTPUT); // Right IR LED & Receiver tone(4, 3000, 1000); delay(1000); // Play tone for 1 second // Delay to finish tone servoleft.attach(13); // Attach left signal to pin 13 servoright.attach(12); // Attach right signal to pin 12 void loop() // Main loop auto-repeats int irleft = irdetect(9, 10, 38000); // Check for object on left int irright = irdetect(2, 3, 38000);// Check for object on right if((irleft == 0) && (irright == 0)) // If both sides detect maneuver(-200, -200, 20); // Backward 20 milliseconds else if(irleft == 0) // If only left side detects maneuver(200, -200, 20); // Right for 20 ms else if(irright == 0) // If only right side detects maneuver(-200, 200, 20); // Left for 20 ms else // Otherwise, no IR detects 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

128 maneuver(200, 200, 20); // Forward 20 ms int irdetect(int irledpin, int irreceiverpin, long frequency) tone(irledpin, frequency, 8); // IRLED 38 khz for at least 1 ms delay(1); // Wait 1 ms int ir = digitalread(irreceiverpin);// IR receiver -> ir variable delay(1); // Down time before recheck return ir; // Return 1 no detect, 0 detect void maneuver(int speedleft, int speedright, int mstime) // speedleft, speedright ranges: Backward Linear // Stop Linear Forward // // Set Left servo speed servoleft.writemicroseconds( speedleft); // Set right servo speed servoright.writemicroseconds( speedright); if(mstime==-1) // if mstime = -1 servoleft.detach(); // Stop servo signals servoright.detach(); delay(mstime); // Delay for mstime FastIrRoaming 동작설명 이스케치는 TestManeuverFunction 스케치로부터작동함수를사용한다. 이 maneuver 함수는세개의매개변수 speedleft, speedright, 와 mstime 가있 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

129 다. 속도매개변수를재호출하는데 200을사용하여최대속력으로전진하고 -200은뒤로최대속력으로진행하고 -100에서 100사이의값은일정하게속도를조절한다. 또한 mstime 값은 20이고각 maneuver는 loop 함수가돌아오기전에 20ms동안실행한다. void loop() // Main loop auto-repeats int irleft = irdetect(9, 10, 38000); // Check for object on left int irright = irdetect(2, 3, 38000); // Check for object on right if((irleft == 0) && (irright == 0)) // If both sides detect maneuver(-200, -200, 20); // Backward 20 milliseconds else if(irleft == 0) // If only left side detects maneuver(200, -200, 20); // Right for 20 ms else if(irright == 0) // If only right side detects maneuver(-200, 200, 20); // Left for 20 ms else // Otherwise, no IR detects maneuver(200, 200, 20); // Backward 20 ms 실습하기 FastIrRoaming 을 FastIrRoamingYourTurn로저장한다. ABOT이물체를감지한것을지시하는 LED를추가하시오. ABOT의속도를반으로줄이기위해 speedleft와 speedright를수정하시오. (200과 -200은은너무큰숫자이고 50은앞으로 -50은뒤로속도가반이되는것을기억하시오 ). 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

130 지금까지로봇이물체를감지하였을때회피하는방향조정을위해프로그래밍하였다. ABOT이물체를감지하지않았을때도피하는행동을해야한다. 예를들어 ABOT이책상에서주행한다면이것의 IR 감지기는책상의표면을감지하고있다. 이스케치는 IR 감지기가책상의표면을 보면서 계속주행할수있어야한다. 전원케이블과프로그래밍케이블을분리하시오. IR 물체감지기가아래쪽과바깥쪽으로보이도록초점을맞추시오. 추천재료 (1개) 검은비닐전기테이프 ¾ (19 mm) 폭, 또는검은템페라페인트와브러시. (1개) 흰포스터용지, 22 x 28 in (56 x 71 cm). 포스터보드를이용한낭떠러지시뮬레이션 흰포스트용지에가장자리부분을전기테이프또는템페라페인트를책상모서리로보이게낭떠러지를만들어서시뮬레이션한다. ABOT에위험이줄어든다. 전기테이프를이용하여그림 7-12 에서보이는것처럼만든다. 전기테이프이라면작은종이위에시험용패치를만들어적외선이감지기가그것으로부터반사되는것을볼수없는것을확인하는것을먼저테스트한다. 반사된 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

131 것이적외선이아니라면줄사이에곧은선으로세줄을만들어서사용하는데그사이에흰종이가보이지않게한다. 근처에형광빛이 ABOT의 IR 감지기에감지되지않도록하기위해 IrInterferenceSniffer 스케치를실행시킨다. ABOT이포스터보드를감지하는지를확인하기위해 TestBothIrAndIndicators 를사용한다. 그러나전기테이프또는페인트는감지하지않는다. 만약 ABOT이여전히전기테이프를너무명확하게본다면, 여기몇가지해결방법이있다. IR 감지기와 LED 각도를조금아래로조절한다. 다른회사의전기테이프를사용해본다. ABOT이좀더가까운것을보기위해 2 kω를 4.7 kω ( 노랑 - 보라빨강 ) 으로교체한다. 서로다른주파수매개변수로 tone 명령을조정한다. 여기에몇가지매개변수는 ABOT에좀더가까이보게한다 : 39000, 40000, 만약이전의 IR LED를사용한다면 ABOT은아마도너무근시가되는문제가발생할수도있다여기에 ABOT이물체에정밀도를증가시키도록좀더멀리볼수있게하는몇가지방법이있다. 2kΩ ( 빨강-검정-빨강 ) 저항을 1kΩ ( 빨강-검정-갈색 ) 으로교체한다. 마찬가지로 470Ω( 노랑-보라-갈색 ) 대신에 2kΩ의 LEDs로교체한다. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

132 IR LEDs와감지기를각도를아래로좀더기울여서표면의오른쪽으로보게한다. 만약테이프나페인트로칠한코스로성공한후책상위에서시도해본다면 당신은전기테이프또는페인트로구분된코스에서 ABOT을실행시키기전에동일한단계를따르는것을기억하라! ABOT이탐지하는것을확인한다. 여러분의손은로봇의위에서그것을잡을준비를하는것이좋다. ABOT은탁자로운행준비 : 항상탁자의끝에다다를때그위에서 ABOT을잡을준비를한다. 만약 ABOT이가장자리를운행하려고한다면빠지기전에그것을받는다. 아니면 ABOT이아닌다른로봇이될수있다. 만약여러분이선근처에있을경우 ABOT이여러분을감지할것이다. 현재스케치는테이블아래에서여러분을구별할방법이없기때문에로봇이탁자가장자리에서계속앞으로나갈수도있다. 그래서감지지가보는범위에서떨어져있어야한다. 예제스케치 : AvoidTableEdge 대부분 ABOT이탁자위에서끝을넘어가지않게하기위한프로그래밍에서는 FastIrRoaming 에서 if...else if...else 구문을수정하면쉽게해결할수있다. 첫번째로뒤로가는것대신에양쪽감지기가물체를볼때 20ms 전진이필요하다. 또한물체로부터멀리가는것대신에물체를향하여돌아야할필요가있고낭떠러지를보면 20ms 보다더멀리회전해야할필요가있다. 375ms 회전은아주좋으나가장좋은수행결과값은여러분이맞추면된다. FastIrNavigation 를열고 AvoidTableEdge로저장한다. 예제스케치와동일하게스케치를수정한다. maneuver 가 loop 내부에서호출하는것을주의깊게본다. 20ms동안전진했던상태는지금은 250ms 동안뒤로간다. 마찬가지로뒤로가는상태는 20ms 동안전진한다. 또한 20ms 동안호출한상태는 375ms 동안오른쪽으로회전하고 20ms동안왼쪽 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

133 으로회전하는상태는 375ms 동안오른쪽으로회전한다. 전기테이프나페인트로만든코스위에서스케치를테스트한다. 만약탁자위에서해본다면이미논의된주의사항들을따르는것을잊지마시오. /* * Robotics with the BOE Shield - AvoidTableEdge * Adaptation of FastIrRoaming for table edge avoidance */ #include <Servo.h> // Include servo library Servo servoleft; Servo servoright; // Declare left and right servos void setup() // Built-in initialization block // Left IR LED & Receiver pinmode(10, INPUT); pinmode(9, OUTPUT); // Right IR LED & Receiver pinmode(3, INPUT); pinmode(2, OUTPUT); tone(4, 3000, 1000); delay(1000); // Play tone for 1 second // Delay to finish tone servoleft.attach(13); // Attach left signal to pin 13 servoright.attach(12); // Attach right signal to pin 12 void loop() // Main loop auto-repeats int irleft = irdetect(9, 10, 38000);// Check for object on left 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

134 int irright = irdetect(2, 3, 38000); // Check for object on right if((irleft == 0) && (irright == 0)) // Both sides see table surface maneuver(200, 200, 20); // Forward 20 milliseconds else if(irleft == 0) // Left OK, drop-off on right maneuver(-200, 200, 375); // Left for 375 ms else if(irright == 0) // Right OK, drop-off on left maneuver(200, -200, 375); // Right for 375 ms else // Drop-off straight ahead maneuver(-200, -200, 250); // Backward 250 ms before retry int irdetect(int irledpin, int irreceiverpin, long frequency) tone(irledpin, frequency, 8); // IRLED 38 khz for at least 1 ms delay(1); // Wait 1 ms int ir = digitalread(irreceiverpin); // IR receiver -> ir variable delay(1); // Down time before recheck return ir; // Return 1 no detect, 0 detect void maneuver(int speedleft, int speedright, int mstime) // speedleft, speedright ranges: Backward Linear Stop Linear //Forward // 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

135 // 왼쪽서보속도설정 servoleft.writemicroseconds( speedleft); // 오른쪽서보속도설정 servoright.writemicroseconds( speedright); if(mstime==-1) // if mstime = -1 servoleft.detach(); // Stop servo signals servoright.detach(); delay(mstime); // Delay for mstime AvoidTableEdge 가작동하는방법 AvoidTableEdge 는 FastIrRoaming 에서 loop 함수에서 if else if else 구문을수정한것이기때문에두개의구분을하나씩보자. // From FastIrRoaming if((irleft == 0) && (irright == 0)) maneuver(-200, -200, 20); else if(irleft == 0) maneuver(200, -200, 20); else if(irright == 0) maneuver(-200, 200, 20); else 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

136 maneuver(200, 200, 20); //From AvoidTableEdge if((irleft == 0) && (irright == 0)) maneuver(200, 200, 20); else if(irleft == 0) maneuver(-200, 200, 375); else if(irright == 0) maneuver(200, -200, 375); else maneuver(-200, -200, 250); if((irleft == 0) && (irright == 0)) 반응은 IR 감지기가둘다장애물을감지했기때문에 FastIrRoaming 는 maneuver(-200, -200, 20) 으로뒤로간다. 반면에IR 감지기가탁자를감지했기때문에 AvoidTableEdge 는 maneuver(200, 200, 20) 로앞으로간다. 이것은다른 20ms 동안전진하는데안전하다는의미이다. 다른 if(irleft == 0) 반응은 FastIrRoaming이 20ms 동안오른쪽으로회전하고한다는의미이다. maneuver(200, -200, 20) 는왼쪽장애물을피하기위해전 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

137 진하는단계이다. AvoidTableEdge 탁자의오른쪽인낭떠러지로부터멀리회전한다. 만약그렇다면 if else if else 구문이 else if 상태를만들지말아야한다. 이것은왼쪽 IR 감지기가탁사를본다는의미이다. 그러나오른쪽은아니다. 그래서이코드는쉴드를 maneuver(-200, 200, 375) 으로 초동안왼쪽으로회전한다. 이것은오른쪽에서감지되는낭떠러지를피하게만들어야한다. 여러분의차례 375ms 는탁자모서리를피하려고하는것인데다른응용에서는수정할수있다. 예를들면만약 ABOT이탁자의끝을꼭껴안고있다고하면, 작은회전이좀더유용할것이다. 반대로 ABOT이영역바깥쪽물체를말려고하면더큰회전 ( 너무많이는아니고 ) 이좀더유용할수있다. 그래서지그재그로뒤돌아선다음탁자를가로지르면서앞으로나간다. maneuver 함수를호출할때 mstime 매개변수를더작게사용함으로작은회원을만드는코드를작성할수있다. 예를들면만약 maneuver(-200, 200, 375) 에서 375를 300으로변경한다면왼쪽회전이더작게될것이다. 450으로변경한다면왼쪽회전에좀더정밀해질것이다. AvoidTableEdge를수정한다. 그러면낭떠러지코스의끝을따라가게한다. ABOT이낭떠러지를만날때작은회전을실행시키기위해 maneuver 내의 mstime 매개변수값을수정한다. 떨어지기전에회전하게만들려면값을얼마로해야할까? ABOT이운행하는데탁자모서리를따라가는대신에구역내에서주행하도록하기위해모서리로부터떨어진축으로시험한다. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

138 이장에서는변조된적외선을 38kHz로방출하고반사를감지하는적외선 LED 한쌍을사용하는것에초점을둔다. 로봇주행센서시스템을사용하여다음내용을다룬다. 전자 적외선 LED는무엇이고이것의양극과음극을구별하는방법은무엇인가? 변조된적외선수신부는무엇이고마이크로컨트롤러회로를사용하는방법은무엇인가? 저항값이 LED를시리즈에연결했을때미치는영향은무엇인가? 프로그래밍 새로운목적을 ( 적외선신호를변조하기위해서, 양쪽센서를둘다비슷한출력신호로만드는방법 ) 위해익숙한 tone 함수를사용하는방법은? 두개의센서와비슷한출력을가진다른센서에사용하기위해하나의센서시스템으로부터스케치를재사용하는방법은? 특별한행동 ( 장애물피하기 ) 을위해설계된현재있는스케치를새로운동작으로 ( 낭떠러지감지 ) 만들기위해재사용하는방법은? 로봇기술직접접촉하지않고자율센서주행을위한물체를감지하기위해적외선방출부와수신부한쌍을사용하여한다. 엔지니어링기술들 사람이볼수없는상태 ( 변조된적외선빛이반사되는 ) 를센서가감지하는상태를알려주기위해가시광선지시자 (red LED) 를사용한다. 서브시스템과문제해결을위해더많이연습한다. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

139 제7장에서우리는적외선 LED와수신기를사용하여물체에닫지않고물체를감지하였다. 만약 IR 센서로부터거리를잴수있는기능을가진다면더멋지지않을까? 이전장에서사용한것과동일한하드웨어로가까운거리를대략감지할수있다. 이것으로도 ABOT이충돌하지않고따라갈수있도록하기에충분하다. IR LED/ 수신회로로거리결정하기이장에서는이전장과동일한 IR LED/ 수신기회로를사용한다. 필요한부품 : (1) 자 (1) 빈용지 만약이전장에만든 ABot이라면 IR LED에 2 kω 저항을사용하였다. 만약이전장의회로를분해하였다면, 7장의실습 #1을반복해야한다. 또한, TestBothIrAndIndicators를사용하여시스템이제대로작동되는지확인해야한다. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

140 여기에 IR 수신기의특정회사의데이터시트가있다.( 파나소닉 PNA4602M; 여러분들의키트에는아마다른회사제품을사용하고있을것같다 ). 이그래프에서 IR 검출기는 38.5 khz에서가장감도가좋다. 곡선의가장높은지점을피크감도 (peak sensitivity) 라한다. 피크의양쪽의곡선이얼마나갑자기떨어지는지알수있다. 이 IR 검출기는 38kHz가아닌다른주파수로켜거나 / 끄면감도가낮아진다. 40kHz로 LED를켜면 38kHz에비해감도가반으로줄어든다. 42 khz에서 LED를비추면 20% 밖에감지를못한다. IR LED 신호가 38 khz로부터더멀어질수록감도가낮아지므로, 물체에가까워야만 IR 신호의반사파를수신할수있다. 가장감도가높은주파수 (38 khz) 에서가장멀리있는것을감지할수있다, 반면감도가낮은주파수는가까이있는물체만감지할수있다. 이것이물체와의거리를대략계산할수있도록한다. 어떤주파수를선택하고, 가장감도가좋은것부터가장감도가좋지못한것까지테스트하자. 가장감도가높은주파수부터시도하자. 만약물체가감지되면, 다음차례의감도로감지를해보자. IR 감지기에서더이상 IR을감지하지못하는주파수가어떤것인가에따라거리를대략 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

141 계산할수있다.! 주파수휩쓸기는다양한입력주파수에대한회로의출력을시험하는기술이다. 거리감시를위한주파수휩쓸기프로그래밍 다음의다이어그램은 ABot이주파수를사용하여거리를어떻게계산하는지보여주는예이다. 이예에서 Zone 3 구역에물체가있는경우로, 38000과 Hz를전송하면물체를감지할수있으나, 40000, 41000, 또는 Hz에서는감지할수없다. 만약물체를 Zone 2 구역으로이동하면 38000, 39000, 그리고 Hz 가전송되면감지되나 또는 Hz에서는감지되지않는다. 다음스케치의 irdistance() 함수는위의기술을사용하여거리를측정한다. loop() 함수코드에서 irdistance() 가호출되고 IR LED와수신되는양쪽핀의쌍을위한값을전달한다. 예를들면, 루프함수는 ABot의검출존인 보이는영역 의왼쪽에서물체와의거리를 int irleft = irdistance(9, 10) 로확인한다. // IR 거리측정함수 int irdistance(int irledpin, int irreceivepin) 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

142 int distance = 0; for(long f = 38000; f <= 42000; f += 1000) distance += irdetect(irledpin, irreceivepin, f); return distance; 만약물체가없으면 irdetect() 함수는 1을리턴하고, 물체가있으면 0을리턴한다. distance += irdetect(irledpin, irreceivepin, f); 수식은물체가검출되지않은수를세어본다. 루프를마치면, distance 변수는 IR 감지기가물체감지를못하였는지를세어서넣는다. 물체를감지하지못할수록 IR 감지기가물체가인식하지못한것이다. 물체를인식하지못할수록더멀리있는셈이다. 그래서 distance 값은앞에나온그림에서처럼존 (zone) 의번호를리턴하게된다. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

143 양쪽의거리를출력 양쪽 IR LED/ 수신기쌍이대충같게거리를감지하는지테스트하는것은중요하다. 똑같을필요는없지만너무다르면 ABOT이앞에있는물체를따라가기가힘이드는데, 왜냐하면한쪽방향으로자꾸돌아가려하기때문이다. 부 (sub) 시스템테스트를많이할필요가있다. 거리측정이일치하지않게되는공통적인이유로는 IR LED에저항이서로같지않은경우이다. 예를들면한쪽 IR LED는 1 kω 저항이고다른쪽저항은 2 kω 저항이면, 한쪽이다른쪽보다물체가가까워보인다. 드물긴하지만다른가능성으로는한쪽 IR 감지기가훨씬다른쪽보다감도가높은경우가있다. 이경우는, 좀큰저항을해당하는쪽에달면 IR 헤드라이트의강도가조금줄어들고차이나던측정값이비슷해진다. 예제스케치 DisplayBothDistances 다음의캡처된화면은시리얼모니터에서 DisplayBothDistances 프로그램으로존의감지를측정한것이다. 노이즈로인해서값이조금은들쭉날쭉하는데, 같은쌍끼리비교해서 1의값정도가서로차이나는것은문제가되지않는다. 아두이노에 DisplayBothDistances 코드를입력하고, 저장한후 ABOT 에업로드한다. 박스 (Box), 책, 병또는유사한물체를타깃으로활용하여거리검출기를테스트하자. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

144 ABOT으로부터떨어졌다가물체를가까이이동시켜보자. 아주작게이동해도값이변하는지점까지옮겨보자. 각각검출존의거리중심지점을찾고기록하자. 오른쪽 IR 검출기에대해서반복하자. 만약한쪽이다른쪽보다두배더먼거리를검출한다면, IR LED에연결된저항을확인해보자. 양쪽모두 2 kω ( 붉은색-검은색-붉은색 ) 이어야한다. 서로같지않으면 IR LED 저항을조절하여양쪽이비슷하게되도록하자. /* * ABOT - DisplayBothDistances * 왼쪽과오른W고의 IR 상태를시리얼모니터에출력 * 거리범위 0에서 5까지. 수 cm의매우짧은거리 * 각각의감지기앞에서특정할수있다. 대부분은 0은너무가깝고 * 5는너무멀다. */ void setup() // Built-in initialization block tone(4, 3000, 1000); // Play tone for 1 second delay(1000); // Delay to finish tone pinmode(10, INPUT); pinmode(9, OUTPUT); // Left IR LED & Receiver pinmode(3, INPUT); pinmode(2, OUTPUT); // Right IR LED & Receiver Serial.begin(9600); // Set data rate to 9600 bps void loop() // Main loop auto-repeats int irleft = irdistance(9, 10); // Measure left distance int irright = irdistance(2, 3); // Measure right distance Serial.print(irLeft); // Display left distance Serial.print(" "); // Display spaces Serial.println(irRight); // Display right distance delay(100); // 0.1 second delay // IR distance measurement function int irdistance(int irledpin, int irreceivepin) int distance = 0; 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

145 for(long f = 38000; f <= 42000; f += 1000) distance += irdetect(irledpin, irreceivepin, f); return distance; // IR Detection function int irdetect(int irledpin, int irreceiverpin, long frequency) tone(irledpin, frequency, 8); // IRLED 38 khz for at least 1 ms delay(1); // Wait 1 ms int ir = digitalread(irreceiverpin); // IR receiver -> ir variable delay(1); // Down time before recheck return ir; // Return 1 no detect, 0 detect 여러분의차례 거리에대한다양한테스트 다른물체를이용하거나색깔이다르거나재질이다른종이나물체를이용해서거리를측정해보세요. 어떤색상과표면이가장잘검출이되나요? 가장잘되지않는것은? 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

146 선두를따라가는 ABOT을위해서는선두와의대충거리를알아야한다. 만약선두가너무멀어지면스케치는이것을감지하고 ABOT을앞으로움직여야한다. 이와같이너무선두와너무가까우면, 스케치는감지를하고 ABOT을뒤로움직여야한다. 이스케치의목적은 ABOT과선두-물체나앞에있는 ABOT과의일정거리를유지시키는것이다. 제어시스템의몇가지용어들 기계가자동으로측정된값으로관리되면이를제어시스템 (control system) 이라한다. 시스템이유지하려는값을설정점 (set point) 이라한다. 전자제어시스템에서는센서 (sensor) 가측정을하고설정점으로되돌아가기위해기계적작동장치 (actuators) 를트리거링에의해반응을하기위해프로세서 (processor) 를사용한다. 우리기계는 ABOT이다. 측정된값으로우리가유지하기원하는것은선두물체와의거리이므로설정점이 2이다. (2번존 ). 기계의프로세서는아두이노이다. IR LED/ 수신기쌍은선두물체까지의거리값을측정하는센서이다. 만약측정된값이설정점거리와다르면, 필요에따라서보는기계적동작장치로 ABOT을앞으로나뒤로이동한다. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

147 비례제어내부살펴보기 연속해서값을측정하고설정된값을유지하기위해서오류의비율에따라출력을조절하는닫힌루프 (Closed loop) 제어는 ABOT 그림자차량에서잘작동이된다. 사실, 아래그림의제어루프에서핵심은스케치에서한줄의코드로줄여진다. 이블록다이어그램 (block diagram) 은비례제어프로세스를설명하는데, ABOT은바퀴의속도를 IR LED/ 수신기쌍이측정한거리감지에기초하여제어한다. 이블록다이어그램은왼쪽 IR 거리센서에적용할수있고서보의출력또는오른쪽에도적용할수있다. 사실, 여러분들의코드는동일한제어루프를가지고있으며, ABOT의양쪽을위해각각하나씩가지고있다. 다음예제를따라가보자. 왼쪽위쪽에서설정점은 set point = 2; 로 2이다. 우리는 ABOT이선두물체와거리가 2지역 (zone-2) 으로유지되도록희망한다. 아래쪽의측정된거리는 4지역으로선두물체와너무멀리떨어져있다. 원으로된심볼 ( 원은합쳐지는지점 : summing junction 이라함 ) 로화살표가되어있는데 + 는설정점에대해더하며빼기 -는측정된거리의에러 (error) 로여기서는 2 4 = -2 가된다. 그다음에러 (error) 값은위쪽이박스로들어간다. 작동블록 (operator block) 이블록은에러값에 (Kp: proportionality constant) -50을곱한다. 이예제에서작동블록은 = 100, 따라서 100 이출력 (output) 이다. 스케치에서, 이출력값은 maneuver() 함수로전달된다. 이것은선두물체로향해가까이가기위해전속력으로전진한다. 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

148 다음블록다이어그램은다른예를보여준다. 이번에는측정된거리가 1이다, 선두물체에대해서너무가깝다는의미이다. 그래서이번에는에러가 1이며, 1 50 = 이 maneuver() 함수에전달되고서보를반대방향으로반속도로돌려서 ABOT이선두물체로부터뒤로물러나게한다. 루프의그다음을통해서측정되는거리값은바뀔수있지만그래도괜찮다. 거리를측정함에도불구하고이제어루프는어떤오류도정정하면서이동하도록서보를움직인다. 정정은항상에러에비례 (proportional) 한다. 관련된두가지계산 : 설정점 (set point) 측정거리 (measured distance) = error; 오류 (error) x Kp = 구동을위한출력 (output for maneuver) 스케치를위해서쉽게합쳐질수있고순서를변경하여하나의수식으로만들수있음 : ( 구동을위한출력 :Output for maneuver) = ( 거리설정점 :Distance set point 측정된거리 :Measured distance) x Kp 만약스케치를더자세히살펴보고싶다면, FollowingABot이어떻게작동되는지살펴보자. 여러분의차례 다른거리로제어루프를검증하기 비례제어루프가모든 6개의측정거리에대해서바르게응답하는것을증명하기위해서다음테이블을채우세요. 블록다이어그램에서 6개중에이미 2개를채워두었으므로 4개만채 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

149 우면된다. 예제스케치 : FollowingABot FollowingABot 스케치에서비례제어루프는 1초당약 25번토의를한다. 그래서모든비례제어계산과서보의속도는초당 25번갱신이된다. 이결과로 ABOT은손이나, 책이나다른로봇을따라갈수있다. FollowingABot 코드를입력하고, 저장하고업로드하자. 8 ½ x 11 종이를이용해서장애물벽을 ABOT앞에두어서종이와 ABOT이일정한거리를유지할수있도록하자.( 이것은이전에언급한노이즈로인해서약간덜석덜석한다 ) 종이를살며시회전시켰을때 ABOT이따라서회전해야한다. 종이시트를 ABOT 주변으로이끌어간다. ABOT도이것을따라서앞으로가야한다. 종이를 ABOT에가깝게했을때 ABOT은뒤로물러나야한다. /* * ABOT - FollowingABot * Use proportional control to maintain a fixed distance between * ABOT and object in front of it. */ #include <Servo.h> // Include servo library 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

150 Servo servoleft; Servo servoright; // Declare left and right servos const int setpoint = 2; const int kpl = -50; const int kpr = -50; // Target distances // Proportional control constants void setup() // Built-in initialization block pinmode(10, INPUT); pinmode(9, OUTPUT); // Left IR LED & Receiver pinmode(3, INPUT); pinmode(2, OUTPUT); // Right IR LED & Receiver tone(4, 3000, 1000); delay(1000); // Play tone for 1 second // Delay to finish tone servoleft.attach(13); // Attach left signal to pin 13 servoright.attach(12); // Attach right signal to pin 12 void loop() int irleft = irdistance(9, 10); int irright = irdistance(2, 3); // Main loop auto-repeats // Measure left distance // Measure right distance // Left and right proportional control calculations int driveleft = (setpoint - irleft) * kpl; int driveright = (setpoint - irright) * kpr; maneuver(driveleft, driveright, 20); // drive levels set speeds // IR distance measurement function 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

151 int irdistance(int irledpin, int irreceivepin) int distance = 0; for(long f = 38000; f <= 42000; f += 1000) distance += irdetect(irledpin, irreceivepin, f); return distance; // IR Detection function int irdetect(int irledpin, int irreceiverpin, long frequency) tone(irledpin, frequency, 8); // IRLED 38 khz for at least 1 ms delay(1); // Wait 1 ms int ir = digitalread(irreceiverpin); // IR receiver -> ir variable delay(1); // Down time before recheck return ir; // Return 1 no detect, 0 detect void maneuver(int speedleft, int speedright, int mstime) // speedleft, speedright ranges: Backward Linear Stop Linear Forward // servoleft.writemicroseconds( speedleft); // Set Left servo speed servoright.writemicroseconds( speedright); // Set right servo speed if(mstime==-1) // if mstime = -1 servoleft.detach(); // Stop servo signals servoright.detach(); delay(mstime); // Delay for mstime 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

152 FollowingABot 이어떻게작동할까? FollowingABot은 3개의전역변수를선언한다. setpoint, kpl, 및 kpr. 어느위치에서든지 setpoint는상수로값이 2이다. 이와같이 kpl은 -50이고, kpr도상수로 -50이다. const int setpoint = 2; // 목표거리 const int kpl = -50; // 비례제어상수 const int kpr = -50; 이런값들을상수로정하면편리한점은변경이필요할때스케치의첫부분에있는이들값을쉽게변경할수있다. 스케치첫부분에있는이! 값들은사용된모든곳에영향을미친다. 만약 kpl을 -50에서 -45로바꾸면 kpl을사용하는모든곳의값은 -45로바뀐다. 이것은특히비례제어루프에서오른쪽과왼쪽값을지정하는실험을할때유용하다. loop() 함수에서의첫작업은현재거리를특정하기위해 irdistance() 함수를호출한다. 그리고 irleft와 irright 변수값에복사한다. void loop() int irleft = irdistance(9, 10); int irright = irdistance(2, 3); // 자동반복을위한루프 // 왼쪽거리측정 // 오른쪽거리측정 간단한제어루프계산법은기억하고있나요? 구동을위한출력 : Output for maneuver = ( 설정된거리값 :Distance set point 측정된거리값 : Measured distance) x Kp 다음의두줄은오른쪽과왼쪽의제어루프를위한계산을수행하고동작의출력값으로변수 driverleft와 driveright에저장한다. // 왼쪽과오른쪽의비례제어계산 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

153 int driveleft = (setpoint - irleft) * kpl; int driveright = (setpoint - irright) * kpr; 이제, driveleft와 driveright는서보속도를설정하기위한구동함수로전달될준비가되었다. maneuver(driveleft, driveright, 20); // 속도설정을위한구동값 각호출에서구동이 20ms만지속되므로, 루프함수를 20ms동안반복해서지연을시킨다. IR 거리검색에서 20ms가또걸리므로루프는 40ms 반복시간을갖는다. 샘플링비율의측면에서초당 25 샘플에해당한다.! 샘플링비율에대한샘플링간격샘플링간격은하나의샘플에서다음샘플까지의시간이다. 샘플링비율은샘플하는주기를나타낸다. 만약다음공식을기억하면쉽게계산할수있다 : sampling rate = 1 sample interval 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

154 선두따라가기 여기서는리더 ABOT을그림자 ABOT이따라오도록해보자. 선두로봇은 FastIrRoaming ( 주행속도를 +/- 40으로낮추어 ) 의수정된버전으로움직인다. 그림자 ABOT은 FollowingABot을실행하여움직인다. 하나의리더로봇은체인을이어서 6~7개의그림자 ABOT을따라오게한다. 체인안에있는그림자 ABOT들에게종이패널만추가하면된다. 만약 ABOT이 1대만작동된다면, 여러분이리더가될수있다. 선두물체로는책이나병이나또는손을활용할수있다. 2개이상의 ABOT이있다면, 꼬리부분에종이패널을장착하고그림에있는것처럼그림자 AbOT에게리더로봇이더잘보이도록하자. 그림자로봇들을체인으로만든다면, 각각에종이패널을끼워야한다. SlowerIrRoamingForLeaderBot 이리더 ABOT에설치되는프로그램이다. 그림자 ABOT에는각각 FollowingABot 프로그램을넣는다. 각각의그림자로봇 IR LED는수평을유지하면서약간왼쪽과오른쪽을향하도록한다 ( 위아래로향하면안된다 ). 그림자 ABOT을선두 ABOT이나다른안내하는물체의뒤에두자. 그림자 ABOT은고정된거리로선두를따라가야하며, 손이나가까운 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

155 벽등의다른물체로부터는방해를받지않도록해야한다. /* * ABOT - SlowerIrRoamingForLeaderBot * Adaptation of RoamingWithWhiskers with IR object detection instead of * contact switches */ #include <Servo.h> // Include servo library Servo servoleft; Servo servoright; // Declare left and right servos void setup() pinmode(10, INPUT); pinmode(9, OUTPUT); pinmode(3, INPUT); pinmode(2, OUTPUT); // Left IR LED & Receiver // Right IR LED & Receiver // Built-in initialization block tone(4, 3000, 1000); delay(1000); // Play tone for 1 second // Delay to finish tone servoleft.attach(13); // Attach left signal to pin 13 servoright.attach(12); // Attach right signal to pin 12 void loop() // Main loop auto-repeats int irleft = irdetect(9, 10, 38000); int irright = irdetect(2, 3, 38000); // Check for object on left // Check for object on right if((irleft == 0) && (irright == 0)) // If both sides detect 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

156 maneuver(-40, -40, 20); else if(irleft == 0) maneuver(40, -40, 20); else if(irright == 0) maneuver(-40, 40, 20); else maneuver(40, 40, 20); // Backward 20 milliseconds // If only left side detects // Right for 20 ms // If only right side detects // Left for 20 ms // Otherwise, no IR detects // Forward 20 ms int irdetect(int irledpin, int irreceiverpin, long frequency) tone(irledpin, frequency, 8); // IRLED 38 khz for at least 1 ms delay(1); // Wait 1 ms int ir = digitalread(irreceiverpin); // IR receiver -> ir variable delay(1); // Down time before recheck return ir; // Return 1 no detect, 0 detect void maneuver(int speedleft, int speedright, int mstime) // speedleft, speedright ranges: Backward Linear Stop Linear Forward // servoleft.writemicroseconds( speedleft); // Set Left servo speed servoright.writemicroseconds( speedright); // Set right servo speed if(mstime==-1) // if mstime = -1 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

157 servoleft.detach(); servoright.detach(); delay(mstime); // Stop servo signals // Delay for mstime 여러분의차례 - 상수를가지고실습하기 그림자 ABOT의행동을바꾸기위해서지점과비례상수의설정을조정할수있다. 다음의실험을하는동안손이나종이조각을사용하여그림자 ABOT을따라오도록하자. kpr과 kpl 상수값을 15에서 100까지를이용하여 FollowingABot 움직이도록하자. 물체를따라올때의 ABOT이어떻게다르게반응하는지기록하자. 세팅지점상수를조정하기위해 0~4까지의값을시도해보자. 어떤이상한행동을하게되는데한예로만약 0으로포인트값을지정하면뒤로움직이지않는다. 왜그런지살펴볼까? 실습 #1에서포인트값이 0이될때까지제어루프실습을반복하자. 측정된어떤값으로포인트값을 0으로하고뒤로이동하도록할수있을까? 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

158 축하한다! 이책을성공적으로마쳤다. 이제여러분들은기초를마쳤으며, ABOT에기능을추가하거나더자세히연구할준비가되었으며여기에몇가지아이디어가있다 : Ping))) 초음파거리센서 Ping)) sensor: #28015 at the Parallax store Check out the Ping))) KickStart code for Arduino here Mounting Bracket Kit # at the Parallax store Try the Roaming Ping))) Shield-Bot project here 기울기감지를위한두축가속도계 #28017 at the Parallax store Check out the Accelerometer KickStart code for Arduino here. See the XBee Tilt-control SumoBot project here 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

159 무선제어와통신을위한 XBee RF 모듈과어댑터 ; Visit the XBee page at the Parallax store for options Check out the XBee KickStart code for Arduino here See the XBee Tilt-control SumoBot project here 6- 족걷기로기어가는 ABot #30055 at the Parallax store 모든지형탐색을위한탱크발자국키트 #28106 at the Parallax store 번역 : 심재창 / 고주영 / 이영학 / 정욱진배포 : 프라이봇 (

ü ü ü #include #include #include #include Servo servoleft; Servo servoright; int sensorvalue1, sensorvalue2; // 각각앞쪽과뒤쪽의조도센서 int voltage, voltage2;

More information

실험 5

실험 5 실험. OP Amp 의기초회로 Inverting Amplifier OP amp 를이용한아래와같은 inverting amplifier 회로를고려해본다. ( 그림 ) Inverting amplifier 위의회로에서 OP amp의 입력단자는 + 입력단자와동일한그라운드전압, 즉 0V를유지한다. 또한 OP amp 입력단자로흘러들어가는전류는 0 이므로, 저항에흐르는전류는다음과같다.

More information

실험 5

실험 5 실험. apacitor 및 Inductor 의특성 교류회로 apacitor 의 apacitance 측정 본실험에서는 capacitor를포함하는회로에교류 (A) 전원이연결되어있을때, 정상상태 (steady state) 에서 capacitor의전압과전류의관계를알아본다. apacitance의값이 인 capacitor의전류와전압의관계는다음식과같다. i dv = dt

More information

Microsoft PowerPoint - es-arduino-lecture-03

Microsoft PowerPoint - es-arduino-lecture-03 임베디드시스템개론 : Arduino 활용 Lecture #3: Button Input & FND Control 2012. 3. 25 by 김영주 강의목차 디지털입력 Button switch 입력 Button Debounce 7-Segment FND : 직접제어 7-Segment FND : IC 제어 2 디지털입력 : Switch 입력 (1) 실습목표 아두이노디지털입력처리실습

More information

RVC Robot Vaccum Cleaner

RVC Robot Vaccum Cleaner RVC Robot Vacuum 200810048 정재근 200811445 이성현 200811414 김연준 200812423 김준식 Statement of purpose Robot Vacuum (RVC) - An RVC automatically cleans and mops household surface. - It goes straight forward while

More information

PowerPoint Presentation

PowerPoint Presentation 신호조절 (Signal Conditioning) 메카트로닉스 시스템의 구성 ECU 인터페이스 회로 (시그널 컨디셔닝) 마이컴 Model of 기계 시스템 인터페이스 회로 (드라이빙 회로) 센서 액츄에이터 (구동기) 기계 시스템 PN 접합 다이오드 [1] 다이오드의 DC 해석과 등가모델 [1] 다이오드의 DC 해석과 등가모델 [1] 다이오드 응용회로 [1] 다이오드

More information

실험. Multimeter 의사용법및기초회로이론 Multimeter 의사용법 멀티미터 (Multimeter) 는저항, 전압, 전류등을측정할수있는계측기로서전면은다음그림과같다. 멀티미터를이용해서저항, 전압, 전류등을측정하기위해서는다음그림과같은프로브 (probe) 를멀티미터

실험. Multimeter 의사용법및기초회로이론 Multimeter 의사용법 멀티미터 (Multimeter) 는저항, 전압, 전류등을측정할수있는계측기로서전면은다음그림과같다. 멀티미터를이용해서저항, 전압, 전류등을측정하기위해서는다음그림과같은프로브 (probe) 를멀티미터 실험. Multimeter 의사용법및기초회로이론 Multimeter 의사용법 멀티미터 (Multimeter) 는저항, 전압, 전류등을측정할수있는계측기로서전면은다음그림과같다. 멀티미터를이용해서저항, 전압, 전류등을측정하기위해서는다음그림과같은프로브 (probe) 를멀티미터의전면패널에꼽는다. 통상적으로검은색프로브는전면패널의검은단자 (COM) 에꼽으며, 빨간색프로브는빨간색단자에꼽는다.

More information

<4D F736F F F696E74202D203137C0E55FBFACBDC0B9AEC1A6BCD6B7E7BCC72E707074>

<4D F736F F F696E74202D203137C0E55FBFACBDC0B9AEC1A6BCD6B7E7BCC72E707074> SIMATIC S7 Siemens AG 2004. All rights reserved. Date: 22.03.2006 File: PRO1_17E.1 차례... 2 심벌리스트... 3 Ch3 Ex2: 프로젝트생성...... 4 Ch3 Ex3: S7 프로그램삽입... 5 Ch3 Ex4: 표준라이브러리에서블록복사... 6 Ch4 Ex1: 실제구성을 PG 로업로드하고이름변경......

More information

(SW3704) Gingerbread Source Build & Working Guide

(SW3704) Gingerbread Source Build & Working Guide (Mango-M32F4) Test Guide http://www.mangoboard.com/ http://cafe.naver.com/embeddedcrazyboys Crazy Embedded Laboratory www.mangoboard.com cafe.naver.com/embeddedcrazyboys CRZ Technology 1 Document History

More information

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729> 8주차중간고사 ( 인터럽트및 A/D 변환기문제및풀이 ) Next-Generation Networks Lab. 외부입력인터럽트예제 문제 1 포트 A 의 7-segment 에초시계를구현한다. Tact 스위치 SW3 을 CPU 보드의 PE4 에연결한다. 그리고, SW3 을누르면하강 에지에서초시계가 00 으로초기화된다. 동시에 Tact 스위치 SW4 를 CPU 보드의

More information

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Function) 1. 함수의개념 입력에대해적절한출력을발생시켜주는것 내가 ( 프로그래머 ) 작성한명령문을연산, 처리, 실행해주는부분 ( 모듈 ) 자체적으로실행되지않으며,

More information

KMC.xlsm

KMC.xlsm 제 7 장. /S 에필요한내용 1] IGBT 취급시주의사항 ) IGBT 취급시주의 1) 운반도중에는 Carbon Cross로 G-E를단락시킵니다. 2) 정전기가발생할수있으므로손으로 G-E 및주단자를만지지마십시요. 3) G-E 단자를개방시킨상태에서직류전원을인가하지마십시요. (IGBT 파손됨 ) 4) IGBT 조립시에는사용기기나인체를접지시키십시요. G2 E2 E1

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 실습 1 배효철 th1g@nate.com 1 목차 조건문 반복문 System.out 구구단 모양만들기 Up & Down 2 조건문 조건문의종류 If, switch If 문 조건식결과따라중괄호 { 블록을실행할지여부결정할때사용 조건식 true 또는 false값을산출할수있는연산식 boolean 변수 조건식이 true이면블록실행하고 false 이면블록실행하지않음 3

More information

실험 5

실험 5 실험. OP Amp 의기본특성 이상적 (ideal) OP Amp OP amp는연산증폭기 (operational amp) 라고도불리며, 여러개의트랜지스터로구성이된차동선형증폭기 (differential linear amplifier) 이다. OP amp는가산, 적분, 미분과같은수학적연산을수행하는회로에사용될수있으며, 비디오, 오디오증폭기, 발진기등에널리사용되고있다.

More information

chap 5: Trees

chap 5: Trees 5. Threaded Binary Tree 기본개념 n 개의노드를갖는이진트리에는 2n 개의링크가존재 2n 개의링크중에 n + 1 개의링크값은 null Null 링크를다른노드에대한포인터로대체 Threads Thread 의이용 ptr left_child = NULL 일경우, ptr left_child 를 ptr 의 inorder predecessor 를가리키도록변경

More information

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures 단일연결리스트 (Singly Linked List) 신찬수 연결리스트 (linked list)? tail 서울부산수원용인 null item next 구조체복습 struct name_card { char name[20]; int date; } struct name_card a; // 구조체변수 a 선언 a.name 또는 a.date // 구조체 a의멤버접근 struct

More information

Microsoft Word - LAB_OPamp_Application.doc

Microsoft Word - LAB_OPamp_Application.doc 실험. OP Amp 의기본응용회로 Voltage Follower/Impedance Buffer 위의 OP amp 회로에서출력전압신호는입력전압신호와항상같으므로, voltage follower라고불린다. 이회로는어떤기능을가지는회로에부하저항을연결하였을때, 부하저항이미치는영향을최소화하기위해서사용될수있다. 예를들면 low-pass filter 회로에부하저항이연결된다음과같은회로를고려해본다.

More information

Microsoft Word - FunctionCall

Microsoft Word - FunctionCall Function all Mechanism /* Simple Program */ #define get_int() IN KEYOARD #define put_int(val) LD A val \ OUT MONITOR int add_two(int a, int b) { int tmp; tmp = a+b; return tmp; } local auto variable stack

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Verilog: Finite State Machines CSED311 Lab03 Joonsung Kim, joonsung90@postech.ac.kr Finite State Machines Digital system design 시간에배운것과같습니다. Moore / Mealy machines Verilog 를이용해서어떻게구현할까? 2 Finite State

More information

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2 비트연산자 1 1 비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2 진수법! 2, 10, 16, 8! 2 : 0~1 ( )! 10 : 0~9 ( )! 16 : 0~9, 9 a, b,

More information

Microsoft Word - PLC제어응용-2차시.doc

Microsoft Word - PLC제어응용-2차시.doc 과정명 PLC 제어응용차시명 2 차시. 접점명령 학습목표 1. 연산개시명령 (LOAD, LOAD NOT) 에대하여설명할수있다. 2. 직렬접속명령 (AND, AND NOT) 에대하여설명할수있다. 3. 병렬접속명령 (OR, OR NOT) 에대하여설명할수있다. 4.PLC의접점명령을가지고간단한프로그램을작성할수있다. 학습내용 1. 연산개시명령 1) 연산개시명령 (LOAD,

More information

(b) 연산증폭기슬루율측정회로 (c) 연산증폭기공통모드제거비측정회로 그림 1.1. 연산증폭기성능파라미터측정회로

(b) 연산증폭기슬루율측정회로 (c) 연산증폭기공통모드제거비측정회로 그림 1.1. 연산증폭기성능파라미터측정회로 Lab. 1. I-V Characteristics of a Diode Lab. 1. 연산증폭기특성실험 1. 실험목표 연산증폭기의전압이득 (Gain), 입력저항, 출력저항, 대역폭 (Bandwidth), 오프셋전압 (Offset Voltage), 공통모드제거비 (Common-mode Rejection Ratio; CMRR) 및슬루율 (Slew Rate) 등의기본적인성능파라미터에대해서실험을통해서이해

More information

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint - chap06-2pointer.ppt 2010-1 학기프로그래밍입문 (1) chapter 06-2 참고자료 포인터 박종혁 Tel: 970-6702 Email: jhpark1@snut.ac.kr 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- 포인터의정의와사용 변수를선언하는것은메모리에기억공간을할당하는것이며할당된이후에는변수명으로그기억공간을사용한다. 할당된기억공간을사용하는방법에는변수명외에메모리의실제주소값을사용하는것이다.

More information

API 매뉴얼

API 매뉴얼 PCI-DIO12 API Programming (Rev 1.0) Windows, Windows2000, Windows NT and Windows XP are trademarks of Microsoft. We acknowledge that the trademarks or service names of all other organizations mentioned

More information

BY-FDP-4-70.hwp

BY-FDP-4-70.hwp RS-232, RS485 FND Display Module BY-FDP-4-70-XX (Rev 1.0) - 1 - 1. 개요. 본 Display Module은 RS-232, RS-485 겸용입니다. Power : DC24V, DC12V( 주문사양). Max Current : 0.6A 숫자크기 : 58mm(FND Size : 70x47mm 4 개) RS-232,

More information

Microsoft PowerPoint - ch03ysk2012.ppt [호환 모드]

Microsoft PowerPoint - ch03ysk2012.ppt [호환 모드] 전자회로 Ch3 iode Models and Circuits 김영석 충북대학교전자정보대학 2012.3.1 Email: kimys@cbu.ac.kr k Ch3-1 Ch3 iode Models and Circuits 3.1 Ideal iode 3.2 PN Junction as a iode 3.4 Large Signal and Small-Signal Operation

More information

슬라이드 1

슬라이드 1 임베디드시스템개론 : Arduino 활용 Lecture #9: Motor 제어 2012. 5. 18 by 김영주 강의목차 소형모터개요 트랜지스터를이용한 DC 모터제어 Motor Driver IC를이용한 DC 모터제어 Servo 모터제어 2 3 1. 소형모터 (Motor) 소형모터 (1) 소형모터 전기에너지를회전운동으로변환하는장치모터소형화로다양하게응용되고있음

More information

(b) 미분기 (c) 적분기 그림 6.1. 연산증폭기연산응용회로

(b) 미분기 (c) 적분기 그림 6.1. 연산증폭기연산응용회로 Lab. 1. I-V Characteristics of a Diode Lab. 6. 연산증폭기가산기, 미분기, 적분기회로 1. 실험목표 연산증폭기를이용한가산기, 미분기및적분기회로를구성, 측정및 평가해서연산증폭기연산응용회로를이해 2. 실험회로 A. 연산증폭기연산응용회로 (a) 가산기 (b) 미분기 (c) 적분기 그림 6.1. 연산증폭기연산응용회로 3. 실험장비및부품리스트

More information

Microsoft Word - logic2005.doc

Microsoft Word - logic2005.doc 제 8 장 Counters 실험의목표 - Catalog counter 의동작원리에대하여익힌다. - 임의의 counter를통하여 FSM 구현방법을익힌다. - 7-segment display 의동작원리를이해한다. 실험도움자료 1. 7-segment display 7-segment는디지털회로에서숫자를표시하기위하여가장많이사용하는소자이다. 이름에서알수있듯이 7개의 LED(

More information

Microsoft Word - Lab.4

Microsoft Word - Lab.4 Lab. 1. I-V Lab. 4. 연산증폭기 Characterist 비 tics of a Dio 비교기 ode 응용 회로 1. 실험목표 연산증폭기를이용한비교기비교기응용회로를이해 응용회로를구성, 측정및평가해서연산증폭기 2. 실험회로 A. 연산증폭기비교기응용회로 (a) 기본비교기 (b) 출력제한 비교기 (c) 슈미트트리거 (d) 포화반파정류회로그림 4.1. 연산증폭기비교기응용회로

More information

OCW_C언어 기초

OCW_C언어 기초 초보프로그래머를위한 C 언어기초 4 장 : 연산자 2012 년 이은주 학습목표 수식의개념과연산자및피연산자에대한학습 C 의알아보기 연산자의우선순위와결합방향에대하여알아보기 2 목차 연산자의기본개념 수식 연산자와피연산자 산술연산자 / 증감연산자 관계연산자 / 논리연산자 비트연산자 / 대입연산자연산자의우선순위와결합방향 조건연산자 / 형변환연산자 연산자의우선순위 연산자의결합방향

More information

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770> 연습문제해답 5 4 3 2 1 0 함수의반환값 =15 5 4 3 2 1 0 함수의반환값 =95 10 7 4 1-2 함수의반환값 =3 1 2 3 4 5 연습문제해답 1. C 언어에서의배열에대하여다음중맞는것은? (1) 3차원이상의배열은불가능하다. (2) 배열의이름은포인터와같은역할을한다. (3) 배열의인덱스는 1에서부터시작한다. (4) 선언한다음, 실행도중에배열의크기를변경하는것이가능하다.

More information

슬라이드 1

슬라이드 1 마이크로컨트롤러 2 (MicroController2) 2 강 ATmega128 의 external interrupt 이귀형교수님 학습목표 interrupt 란무엇인가? 기본개념을알아본다. interrupt 중에서가장사용하기쉬운 external interrupt 의사용방법을학습한다. 1. Interrupt 는왜필요할까? 함수동작을추가하여실행시키려면? //***

More information

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx #include int main(void) { int num; printf( Please enter an integer "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 을 작성하면서 C 프로그램의

More information

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F > 10주차 문자 LCD 의인터페이스회로및구동함수 Next-Generation Networks Lab. 5. 16x2 CLCD 모듈 (HY-1602H-803) 그림 11-18 19 핀설명표 11-11 번호 분류 핀이름 레벨 (V) 기능 1 V SS or GND 0 GND 전원 2 V Power DD or V CC +5 CLCD 구동전원 3 V 0 - CLCD 명암조절

More information

Microsoft PowerPoint - es-arduino-lecture-09

Microsoft PowerPoint - es-arduino-lecture-09 임베디드시스템개론 : Arduino 활용 Lecture #9: Motor 제어 2012. 5. 13 by 김영주 강의목차 소형모터개요 트랜지스터를이용한 DC 모터제어 Motor Driver IC를이용한 DC 모터제어 Servo 모터제어 2 3 1. 소형모터 (Motor) 소형모터 (1) 소형모터 전기에너지를회전운동으로변환하는장치모터소형화로다양하게응용되고있음

More information

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D> 뻔뻔한 AVR 프로그래밍 The Last(8 th ) Lecture 유명환 ( yoo@netplug.co.kr) INDEX 1 I 2 C 통신이야기 2 ATmega128 TWI(I 2 C) 구조분석 4 ATmega128 TWI(I 2 C) 실습 : AT24C16 1 I 2 C 통신이야기 I 2 C Inter IC Bus 어떤 IC들간에도공통적으로통할수있는 ex)

More information

금오공대 컴퓨터공학전공 강의자료

금오공대 컴퓨터공학전공 강의자료 C 프로그래밍프로젝트 Chap 14. 포인터와함수에대한이해 2013.10.09. 오병우 컴퓨터공학과 14-1 함수의인자로배열전달 기본적인인자의전달방식 값의복사에의한전달 val 10 a 10 11 Department of Computer Engineering 2 14-1 함수의인자로배열전달 배열의함수인자전달방식 배열이름 ( 배열주소, 포인터 ) 에의한전달 #include

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 A 반 T2 - 김우빈 (201011321) 임국현 (201011358) 박대규 (201011329) Robot Vacuum Cleaner 1 Motor Sensor RVC Control Cleaner Robot Vaccum Cleaner 2 / Event Format/ Type Front Sensor RVC 앞의장애물의유무를감지한다. True / False,

More information

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 (   ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각 JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( http://java.sun.com/javase/6/docs/api ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각선의길이를계산하는메소드들을작성하라. 직사각형의가로와세로의길이는주어진다. 대각선의길이는 Math클래스의적절한메소드를이용하여구하라.

More information

Page 2 of 5 아니다 means to not be, and is therefore the opposite of 이다. While English simply turns words like to be or to exist negative by adding not,

Page 2 of 5 아니다 means to not be, and is therefore the opposite of 이다. While English simply turns words like to be or to exist negative by adding not, Page 1 of 5 Learn Korean Ep. 4: To be and To exist Of course to be and to exist are different verbs, but they re often confused by beginning students when learning Korean. In English we sometimes use the

More information

Microsoft PowerPoint - AC3.pptx

Microsoft PowerPoint - AC3.pptx Chapter 3 Block Diagrams and Signal Flow Graphs Automatic Control Systems, 9th Edition Farid Golnaraghi, Simon Fraser University Benjamin C. Kuo, University of Illinois 1 Introduction In this chapter,

More information

ISP and CodeVisionAVR C Compiler.hwp

ISP and CodeVisionAVR C Compiler.hwp USBISP V3.0 & P-AVRISP V1.0 with CodeVisionAVR C Compiler http://www.avrmall.com/ November 12, 2007 Copyright (c) 2003-2008 All Rights Reserved. USBISP V3.0 & P-AVRISP V1.0 with CodeVisionAVR C Compiler

More information

슬라이드 1

슬라이드 1 임베디드시스템개론 : Arduino 활용 Lecture #9: IR Sensor 활용 강의목차 Photodiode & Phototransistor 적외선을이용한이동체검출실험 적외선을이용한검은띠검출실험 IR Remote 원리 IR Remote 실험 2 3 1. Photodiode & Phototransistor Photodiode & Phototransistor

More information

Requirement Definition Wheel Motor 작동하는경우장애물인식후 - Ultrasonic Sensor 홀수번누를경우 +10 Touch Sensor 누를경우 TouchSensor 계속누르고있을경우 (0.5) +10 짝수번누를경우 -10 빛이어두워졌다다

Requirement Definition Wheel Motor 작동하는경우장애물인식후 - Ultrasonic Sensor 홀수번누를경우 +10 Touch Sensor 누를경우 TouchSensor 계속누르고있을경우 (0.5) +10 짝수번누를경우 -10 빛이어두워졌다다 AutoDriveRobot Analysis Requirement Definition Wheel Motor 작동하는경우장애물인식후 - Ultrasonic Sensor 홀수번누를경우 +10 Touch Sensor 누를경우 TouchSensor 계속누르고있을경우 (0.5) +10 짝수번누를경우 -10 빛이어두워졌다다시밝아졌을경우 - Light Sensor Break

More information

쓰리 핸드(삼침) 요일 및 2405 요일 시간, 및 요일 설정 1. 용두를 2의 위치로 당기고 반시계방향으로 돌려 전날로 를 설정합니다. 2. 용두를 시계방향으로 돌려 전날로 요일을 설정합니다. 3. 용두를 3의 위치로 당기고 오늘 와 요일이 표시될 때까지 시계방향으로

쓰리 핸드(삼침) 요일 및 2405 요일 시간, 및 요일 설정 1. 용두를 2의 위치로 당기고 반시계방향으로 돌려 전날로 를 설정합니다. 2. 용두를 시계방향으로 돌려 전날로 요일을 설정합니다. 3. 용두를 3의 위치로 당기고 오늘 와 요일이 표시될 때까지 시계방향으로 한국어 표준 설정안내 서브 초침 시간 및 설정 1. 용두를 2의 위치로 뽑아냅니다. 2. 용두를 시계방향 또는 반시계방향으로 돌려(모델에 따라 다름) 를 전날로 설정합니다. 3. 용두를 3의 위치로 당기고 현재 가 표시될 때까지 시계방향으로 돌립니다. 4. 용두를 계속 돌려 정확한 오전/오후 시간을 설정합니다. 5. 용두를 1의 위치로 되돌립니다. 169 쓰리

More information

Motor

Motor Interactive Workshop for Artists & Designers Earl Park Motor Servo Motor Control #include Servo myservo; // create servo object to control a servo int potpin = 0; // analog pin used to connect

More information

슬라이드 제목 없음

슬라이드 제목 없음 2006-09-27 경북대학교컴퓨터공학과 1 제 5 장서브넷팅과슈퍼넷팅 서브넷팅 (subnetting) 슈퍼넷팅 (Supernetting) 2006-09-27 경북대학교컴퓨터공학과 2 서브넷팅과슈퍼넷팅 서브넷팅 (subnetting) 하나의네트워크를여러개의서브넷 (subnet) 으로분할 슈퍼넷팅 (supernetting) 여러개의서브넷주소를결합 The idea

More information

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다. Eclipse 개발환경에서 WindowBuilder 를이용한 Java 프로그램개발 이예는 Java 프로그램의기초를이해하고있는사람을대상으로 Embedded Microcomputer 를이용한제어시스템을 PC 에서 Serial 통신으로제어 (Graphical User Interface (GUI) 환경에서 ) 하는프로그램개발예를설명한다. WindowBuilder:

More information

Microsoft Word - Lab.7

Microsoft Word - Lab.7 Lab. 1. I-V C Lab. 7. Characterist tics of a Dio 능동필터 ode 1. 실험목표 연산증폭기를이용한저역통과필터 (low-pass filter), filter), 대역통과필터 (band-pass filter) 회로를구성, 연산증폭기능동필터회로를이해 고역통과필터 (high-pass 측정및평가해서 2. 실험회로 A. 연산증폭기능동필터

More information

중간고사

중간고사 중간고사 예제 1 사용자로부터받은두개의숫자 x, y 중에서큰수를찾는알고리즘을의사코드로작성하시오. Step 1: Input x, y Step 2: if (x > y) then MAX

More information

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3 Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3 Example 3.1 Files 3.2 Source code 3.3 Exploit flow

More information

UI TASK & KEY EVENT

UI TASK & KEY EVENT 2007. 2. 5 PLATFORM TEAM 정용학 차례 CONTAINER & WIDGET SPECIAL WIDGET 질의응답및토의 2 Container LCD에보여지는화면한개 1개이상의 Widget을가짐 3 Container 초기화과정 ui_init UMP_F_CONTAINERMGR_Initialize UMP_H_CONTAINERMGR_Initialize

More information

DE1-SoC Board

DE1-SoC Board 실습 1 개발환경 DE1-SoC Board Design Tools - Installation Download & Install Quartus Prime Lite Edition http://www.altera.com/ Quartus Prime (includes Nios II EDS) Nios II Embedded Design Suite (EDS) is automatically

More information

À̵¿·Îº¿ÀÇ ÀÎÅͳݱâ¹Ý ¿ø°ÝÁ¦¾î½Ã ½Ã°£Áö¿¬¿¡_.hwp

À̵¿·Îº¿ÀÇ ÀÎÅͳݱâ¹Ý ¿ø°ÝÁ¦¾î½Ã ½Ã°£Áö¿¬¿¡_.hwp l Y ( X g, Y g ) r v L v v R L θ X ( X c, Yc) W (a) (b) DC 12V 9A Battery 전원부 DC-DC Converter +12V, -12V DC-DC Converter 5V DC-AC Inverter AC 220V DC-DC Converter 3.3V Motor Driver 80196kc,PWM Main

More information

Microsoft PowerPoint - es-arduino-lecture-08

Microsoft PowerPoint - es-arduino-lecture-08 임베디드시스템개론 : Arduino 활용 Lecture #8: IR Sensor 활용 2014. 5. 7 by 김영주 강의목차 Photodiode & Phototransistor 적외선을이용한이동체검출실험 적외선을이용한검은띠검출실험 IR Remote 원리 IR Remote 실험 2 3 1. Photodiode & Phototransistor Photodiode

More information

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A634C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A634C0CFC2F72E BC8A3C8AF20B8F0B5E55D> 뻔뻔한 AVR 프로그래밍 The 4 th Lecture 유명환 ( yoo@netplug.co.kr) 1 시간 (Time) 에대한정의 INDEX 2 왜타이머 (Timer) 와카운터 (Counter) 인가? 3 ATmega128 타이머 / 카운터동작구조 4 ATmega128 타이머 / 카운터관련레지스터 5 뻔뻔한노하우 : 레지스터비트설정방법 6 ATmega128

More information

차시 AS_02 대상 교육주제아두이노 LED 및버튼제어프로젝트교육시간 120 분 1. 아두이노를이용하여 LED 를제어할수있다. 교육목표 2. 아두이노를이용하여삼색 LED 를제어할수있다. 3. 아두이노에서버튼입력을수행하여프로그램에연동할수있다. 장비류는미리배분하고, 재료는

차시 AS_02 대상 교육주제아두이노 LED 및버튼제어프로젝트교육시간 120 분 1. 아두이노를이용하여 LED 를제어할수있다. 교육목표 2. 아두이노를이용하여삼색 LED 를제어할수있다. 3. 아두이노에서버튼입력을수행하여프로그램에연동할수있다. 장비류는미리배분하고, 재료는 차시 AS_02 대상 교육주제아두이노 LED 및버튼제어프로젝트교육시간 120 분 1. 아두이노를이용하여 LED 를제어할수있다. 교육목표 2. 아두이노를이용하여삼색 LED 를제어할수있다. 3. 아두이노에서버튼입력을수행하여프로그램에연동할수있다. 장비류는미리배분하고, 재료는각실험단계에서배분한다. Arduino 1.0 USB 케이블 1.0 교육자료 ( 준비물 ) 300Ω

More information

Microsoft PowerPoint - Ch13

Microsoft PowerPoint - Ch13 Ch. 13 Basic OP-AMP Circuits 비교기 (Comparator) 하나의전압을다른전압 ( 기준전압, reference) 와비교하기위한비선형장치 영전위검출 in > 기준전압 out = out(max) in < 기준전압 out = out(min) 비교기 영이아닌전위검출 기준배터리 기준전압분배기 기준전압제너다이오드 비교기 예제 13-1: out(max)

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Chapter 06 반복문 01 반복문의필요성 02 for문 03 while문 04 do~while문 05 기타제어문 반복문의의미와필요성을이해한다. 대표적인반복문인 for 문, while 문, do~while 문의작성법을 알아본다. 1.1 반복문의필요성 반복문 동일한내용을반복하거나일정한규칙으로반복하는일을수행할때사용 프로그램을좀더간결하고실제적으로작성할수있음.

More information

1_12-53(김동희)_.hwp

1_12-53(김동희)_.hwp 본논문은 2012년전력전자학술대회우수추천논문임 Cascaded BuckBoost 컨버터를 이용한 태양광 모듈 집적형 저전압 배터리 충전 장치 개발 472 강압이 가능한 토폴로지를 이용한 연구도 진행되었지만 제어 알고리즘의 용의성과 구조의 간단함 때문에 BuckBoost 컨버터 또는 Sepic 컨버터를 이용하여 연구 가 진행되었다[10][13]. 태양광 발전

More information

Microsoft PowerPoint - Ch15-1

Microsoft PowerPoint - Ch15-1 h. 5 ctive Filters 기본적인필터응답 (asic filter response) 저역통과필터응답 (low-pass filter (LPF) response) v( db) log when X out s log > πf X f X log π X log ( πf) asic LPF response LPF with different roll-off rates

More information

제목을 입력하십시오

제목을 입력하십시오 포워드, 플라이백컨버터 Prof. ByoungKuk ee, Ph.D. Energy echaronics ab. chool of Informaion and Communicaion Eng. ungkyunkwan Universiy Tel: 823299458 Fax: 823299462 hp://seml.skku.ac.kr E: bkleeskku@skku.edu Forward

More information

Microsoft PowerPoint - chap06-5 [호환 모드]

Microsoft PowerPoint - chap06-5 [호환 모드] 2011-1 학기프로그래밍입문 (1) chapter 06-5 참고자료 변수의영역과데이터의전달 박종혁 Tel: 970-6702 Email: jhpark1@seoultech.ac.kr h k 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- ehanbit.net 자동변수 지금까지하나의함수안에서선언한변수는자동변수이다. 사용범위는하나의함수내부이다. 생존기간은함수가호출되어실행되는동안이다.

More information

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729> 7주차 AVR의 A/D 변환기제어레지스터및관련실습 Next-Generation Networks Lab. 3. 관련레지스터 표 9-4 레지스터 ADMUX ADCSRA ADCH ADCL 설명 ADC Multiplexer Selection Register ADC 의입력채널선택및기준전압선택외 ADC Control and Status Register A ADC 의동작을설정하거나동작상태를표시함

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 System Software Experiment 1 Lecture 5 - Array Spring 2019 Hwansoo Han (hhan@skku.edu) Advanced Research on Compilers and Systems, ARCS LAB Sungkyunkwan University http://arcs.skku.edu/ 1 배열 (Array) 동일한타입의데이터가여러개저장되어있는저장장소

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 유니티와아두이노를활용한 VR 컨트롤러개발 Part 06 헬로앱스코딩교육 김영준 공학박사, 목원대학교겸임교수前 Microsoft 수석연구원 splduino@gmail.com http://www.helloapps.co.kr 키보드로물체생성하기 키보드로물체생성하기 public GameObject CubeObject; public GameObject MyCamera;

More information

step 1-1

step 1-1 Written by Dr. In Ku Kim-Marshall STEP BY STEP Korean 1 through 15 Action Verbs Table of Contents Unit 1 The Korean Alphabet, hangeul Unit 2 Korean Sentences with 15 Action Verbs Introduction Review Exercises

More information

설계란 무엇인가?

설계란 무엇인가? 금오공과대학교 C++ 프로그래밍 jhhwang@kumoh.ac.kr 컴퓨터공학과 황준하 6 강. 함수와배열, 포인터, 참조목차 함수와포인터 주소값의매개변수전달 주소의반환 함수와배열 배열의매개변수전달 함수와참조 참조에의한매개변수전달 참조의반환 프로그래밍연습 1 /15 6 강. 함수와배열, 포인터, 참조함수와포인터 C++ 매개변수전달방법 값에의한전달 : 변수값,

More information

PowerChute Personal Edition v3.1.0 에이전트 사용 설명서

PowerChute Personal Edition v3.1.0 에이전트 사용 설명서 PowerChute Personal Edition v3.1.0 990-3772D-019 4/2019 Schneider Electric IT Corporation Schneider Electric IT Corporation.. Schneider Electric IT Corporation,,,.,. Schneider Electric IT Corporation..

More information

Microsoft PowerPoint - e pptx

Microsoft PowerPoint - e pptx Import/Export Data Using VBA Objectives Referencing Excel Cells in VBA Importing Data from Excel to VBA Using VBA to Modify Contents of Cells 새서브프로시저작성하기 프로시저실행하고결과확인하기 VBA 코드이해하기 Referencing Excel Cells

More information

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - ch07 - 포인터 pm0415 2015-1 프로그래밍언어 7. 포인터 (Pointer), 동적메모리할당 2015 년 4 월 4 일 교수김영탁 영남대학교공과대학정보통신공학과 (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : ytkim@yu.ac.kr) Outline 포인터 (pointer) 란? 간접참조연산자

More information

Example: LED flashlight

Example: LED flashlight Example: LED flashlight current flow 500 wiring diagram schematic wiring it up Electricity flows in a loop. Can stop flow by breaking the loop Hello, World! in Arduino 실습목표 LED 켜기프로그램실습 젂자부품 LED 및저항사용법이해

More information

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C4C656D70656C2D5A69762E637070>

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C4C656D70656C2D5A69762E637070> /* */ /* LZWIN.C : Lempel-Ziv compression using Sliding Window */ /* */ #include "stdafx.h" #include "Lempel-Ziv.h" 1 /* 큐를초기화 */ void LZ::init_queue(void) front = rear = 0; /* 큐가꽉찼으면 1 을되돌림 */ int LZ::queue_full(void)

More information

API 매뉴얼

API 매뉴얼 PCI-TC03 API Programming (Rev 1.0) Windows, Windows2000, Windows NT, Windows XP and Windows 7 are trademarks of Microsoft. We acknowledge that the trademarks or service names of all other organizations

More information

아이콘의 정의 본 사용자 설명서에서는 다음 아이콘을 사용합니다. 참고 참고는 발생할 수 있는 상황에 대처하는 방법을 알려 주거나 다른 기능과 함께 작동하는 방법에 대한 요령을 제공합니다. 상표 Brother 로고는 Brother Industries, Ltd.의 등록 상

아이콘의 정의 본 사용자 설명서에서는 다음 아이콘을 사용합니다. 참고 참고는 발생할 수 있는 상황에 대처하는 방법을 알려 주거나 다른 기능과 함께 작동하는 방법에 대한 요령을 제공합니다. 상표 Brother 로고는 Brother Industries, Ltd.의 등록 상 Android 용 Brother Image Viewer 설명서 버전 0 KOR 아이콘의 정의 본 사용자 설명서에서는 다음 아이콘을 사용합니다. 참고 참고는 발생할 수 있는 상황에 대처하는 방법을 알려 주거나 다른 기능과 함께 작동하는 방법에 대한 요령을 제공합니다. 상표 Brother 로고는 Brother Industries, Ltd.의 등록 상표입니다. Android는

More information

MPLAB C18 C

MPLAB C18 C MPLAB C18 C MPLAB C18 MPLAB C18 C MPLAB C18 C #define START, c:\mcc18 errorlevel{0 1} char isascii(char ch); list[list_optioin,list_option] OK, Cancel , MPLAB IDE User s Guide MPLAB C18 C

More information

Visual Basic 반복문

Visual Basic 반복문 학습목표 반복문 For Next문, For Each Next문 Do Loop문, While End While문 구구단작성기로익히는반복문 2 5.1 반복문 5.2 구구단작성기로익히는반복문 3 반복문 주어진조건이만족하는동안또는주어진조건이만족할때까지일정구간의실행문을반복하기위해사용 For Next For Each Next Do Loop While Wend 4 For

More information

시프트 레지스터 Shift Resistor 자, 이제 LED MATRIX 8x8 Board를 마이크로컨트롤러에 연결된 3개의 선으 로 제어해 보자. 이는 마이크로컨트롤러의 포트를 확장함과 동시에 프로그램 으로 제어를 더 쉽게 한다는 장점이 있다. 물론 포트를 절약하게

시프트 레지스터 Shift Resistor 자, 이제 LED MATRIX 8x8 Board를 마이크로컨트롤러에 연결된 3개의 선으 로 제어해 보자. 이는 마이크로컨트롤러의 포트를 확장함과 동시에 프로그램 으로 제어를 더 쉽게 한다는 장점이 있다. 물론 포트를 절약하게 Physical Computing for Artists & Designers 연세대학교디지털아트학과 Earl Park 시프트 레지스터 Shift Resistor 자, 이제 LED MATRIX 8x8 Board를 마이크로컨트롤러에 연결된 3개의 선으 로 제어해 보자. 이는 마이크로컨트롤러의 포트를 확장함과 동시에 프로그램 으로 제어를 더 쉽게 한다는 장점이 있다.

More information

슬라이드 1

슬라이드 1 프로세싱 광운대학교로봇학부박광현 프로세싱실행 2 C:\processing-3.2.1 폴더 창나타내기 실행 정지 3 폭 높이 600 400 도형그리기 배경칠하기 5 background(255, 255, 255); R G B background(255, 0, 0); background(255, 122, 0); 선그리기 6 background(255, 122, 0);

More information

PowerPoint Template

PowerPoint Template SOFTWARE ENGINEERING Team Practice #3 (UTP) 201114188 김종연 201114191 정재욱 201114192 정재철 201114195 홍호탁 www.themegallery.com 1 / 19 Contents - Test items - Features to be tested - Features not to be tested

More information

슬라이드 1

슬라이드 1 CHAP 2: 순환 (Recursion) 순환 (recursion) 이란? 알고리즘이나함수가수행도중에자기자신을다시호출하여문제를해결하는기법 정의자체가순환적으로 되어있는경우에적합한방법 순환 (recursion) 의예 팩토리얼값구하기 피보나치수열 1 n! n*( n 1)! fib( n) 0 1 fib( n 2) n n 0 ` 1 fib( n 1) if n 0 if

More information

C++ Programming

C++ Programming C++ Programming 예외처리 Seo, Doo-okok clickseo@gmail.com http://www.clickseo.com 목 차 예외처리 2 예외처리 예외처리 C++ 의예외처리 예외클래스와객체 3 예외처리 예외를처리하지않는프로그램 int main() int a, b; cout > a >> b; cout

More information

BC6DX Korean.ai

BC6DX Korean.ai 제품설명서 BC6DX * 제품의성능개선을위하여예고없이사양이변경될수있습니다. * 무단복제금지 제품의특징 - 운영프로그램 - 이중입력전원회로 - 방전중개별셀전압평균화 - 최대한의안전장치들 - 사이클충전 / 방전 (Cyclic charging/discharging) - USB 를이용한 PC 통신 - 2 - 외부장치들 -, 버튼 - DEC, INC 버튼 - START/

More information

Microsoft PowerPoint - 7-Work and Energy.ppt

Microsoft PowerPoint - 7-Work and Energy.ppt Chapter 7. Work and Energy 일과운동에너지 One of the most important concepts in physics Alternative approach to mechanics Many applications beyond mechanics Thermodynamics (movement of heat) Quantum mechanics...

More information

슬라이드 1

슬라이드 1 / 유닉스시스템개요 / 파일 / 프로세스 01 File Descriptor file file descriptor file type unix 에서의파일은단지바이트들의나열임 operating system 은파일에어떤포맷도부과하지않음 파일의내용은바이트단위로주소를줄수있음 file descriptor 는 0 이나양수임 file 은 open 이나 creat 로 file

More information

Microsoft Word MetOne237Bmanual

Microsoft Word MetOne237Bmanual Air Particle Counter 의사용법 Met One 237 Air Particle Counter 조선계측기교역 Tel : 02-2268-4344 Fax : 02-2275-5348 htt//:www.chosun21.co.kr 1. 장비구성 : A. Particle Counter : 본장비는 0.3um 부터측정이가능한 Met One 237B와 0.5 um부터가능한

More information

CAN-fly Quick Manual

CAN-fly Quick Manual adc-171 Manual Ver.1.0 2011.07.01 www.adc.co.kr 2 contents Contents 1. adc-171(rn-171 Pack) 개요 2. RN-171 Feature 3. adc-171 Connector 4. adc-171 Dimension 5. Schematic 6. Bill Of Materials 7. References

More information

1

1 1 2 3 4 5 6 b b t P A S M T U s 7 m P P 8 t P A S M T U s 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 Chapter 1 29 1 2 3 4 18 17 16 15 5 6 7 8 9 14 13 12 11 10 1 2 3 4 5 9 10 11 12 13 14 15

More information

슬라이드 1

슬라이드 1 첨부 4 리모콘별 TV 셋팅방법 2011. 1 전략서비스본부서비스지원팀 1 경제형 2002년개발쌍방향단순-2007년개발경제형 /PVR-2007년개발 2002 년 02 월 ~ 2003 년 08 월 85 만 (40 만은 TV 설정불가 ) 선호채널 도움말 만가능 1) TV 전원을키고 2) 0( 숫자 )+ 음소거동시에누름 -> LED ON 3) 리모콘 LED 주황색불확인후제조사코드입력

More information

Microsoft PowerPoint - chap06-1Array.ppt

Microsoft PowerPoint - chap06-1Array.ppt 2010-1 학기프로그래밍입문 (1) chapter 06-1 참고자료 배열 박종혁 Tel: 970-6702 Email: jhpark1@snut.ac.kr 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- 배열의선언과사용 같은형태의자료형이많이필요할때배열을사용하면효과적이다. 배열의선언 배열의사용 배열과반복문 배열의초기화 유연성있게배열다루기 한빛미디어

More information

untitled

untitled 1... 2 System... 3... 3.1... 3.2... 3.3... 4... 4.1... 5... 5.1... 5.2... 5.2.1... 5.3... 5.3.1 Modbus-TCP... 5.3.2 Modbus-RTU... 5.3.3 LS485... 5.4... 5.5... 5.5.1... 5.5.2... 5.6... 5.6.1... 5.6.2...

More information

<32B1B3BDC32E687770>

<32B1B3BDC32E687770> 008년도 상반기 제회 한 국 어 능 력 시 험 The th Test of Proficiency in Korean 일반 한국어(S-TOPIK 중급(Intermediate A 교시 이해 ( 듣기, 읽기 수험번호(Registration No. 이 름 (Name 한국어(Korean 영 어(English 유 의 사 항 Information. 시험 시작 지시가 있을

More information

View Licenses and Services (customer)

View Licenses and Services (customer) 빠른 빠른 시작: 시작: 라이선스, 라이선스, 서비스 서비스 및 주문 주문 이력 이력 보기 보기 고객 가이드 Microsoft 비즈니스 센터의 라이선스, 서비스 및 혜택 섹션을 통해 라이선스, 온라인 서비스, 구매 기록 (주문 기록)을 볼 수 있습니다. 시작하려면, 비즈니스 센터에 로그인하여 상단 메뉴에서 재고를 선택한 후 내 재고 관리를 선택하십시오. 목차

More information

2 PX-8000과 RM-8000/LM-8000등의 관련 제품은 시스템의 간편한 설치와 쉬운 운영에 대한 고급 기술을 제공합니다. 또한 뛰어난 확장성으로 사용자가 요구하는 시스템을 손쉽게 구현할 수 있습니다. 메인컨트롤러인 PX-8000의 BGM입력소스를 8개의 로컬지

2 PX-8000과 RM-8000/LM-8000등의 관련 제품은 시스템의 간편한 설치와 쉬운 운영에 대한 고급 기술을 제공합니다. 또한 뛰어난 확장성으로 사용자가 요구하는 시스템을 손쉽게 구현할 수 있습니다. 메인컨트롤러인 PX-8000의 BGM입력소스를 8개의 로컬지 PX-8000 SYSTEM 8 x 8 Audio Matrix with Local Control 2 PX-8000과 RM-8000/LM-8000등의 관련 제품은 시스템의 간편한 설치와 쉬운 운영에 대한 고급 기술을 제공합니다. 또한 뛰어난 확장성으로 사용자가 요구하는 시스템을 손쉽게 구현할 수 있습니다. 메인컨트롤러인 PX-8000의 BGM입력소스를 8개의 로컬지역에

More information

Microsoft Word - PEB08_USER_GUIDE.doc

Microsoft Word - PEB08_USER_GUIDE.doc 0. PEB08 이란? PEB08(PIC EVALUATION BOARD 8bits) 은 Microchip 8bit Device 개발을쉽고편리하게할수있는보드입니다. 1. 다양한 8bit Device 지원 기존대부분의 8bit 보드의경우일부 Pin-Count만지원을하였지만, PEB08은 PIC10, PIC12, PIC16, PIC18의 DIP Type Package의모든

More information

CD-RW_Advanced.PDF

CD-RW_Advanced.PDF HP CD-Writer Program User Guide - - Ver. 2.0 HP CD-RW Adaptec Easy CD Creator Copier, Direct CD. HP CD-RW,. Easy CD Creator 3.5C, Direct CD 3.0., HP. HP CD-RW TEAM ( 02-3270-0803 ) < > 1. CD...3 CD...5

More information

RS- 232, RS485 FND Display Module NET-SFND-4-23A RS-232, RS485 FND Display Module NET-SFND-4-23A MANUAL (Rev 1.0) Net-Control http

RS- 232, RS485 FND Display Module NET-SFND-4-23A RS-232, RS485 FND Display Module NET-SFND-4-23A MANUAL (Rev 1.0) Net-Control   http RS-232, RS485 FND Display Module NET-SFND-4-23A MANUAL (Rev 1.0) - 1 - 1. 정격사양. NET-SFND-4-23A Display Module 은 RS-232, RS-485 겸용입니다. 밝기조절기능을추가하여통신명령으로밝기를조절할수있습니다. 이기능을사용하여표시부를점멸시키거나점차밝아지거나어두워지는특수효과를낼수도있습니다.

More information

½½¶óÀ̵å Á¦¸ñ ¾øÀ½

½½¶óÀ̵å Á¦¸ñ ¾øÀ½ 0.2 완전차동 (fully dfferental) OP amp Dfferental nput, Dfferental output Easy to cascade OP amps nsenstve to supply nose Hgh gan Fully dff OP amp requres CMFB Hgh Speed CMOS IAB, POSTECH 0.2. NMOS 입력완전차동

More information

슬라이드 1

슬라이드 1 Pairwise Tool & Pairwise Test NuSRS 200511305 김성규 200511306 김성훈 200614164 김효석 200611124 유성배 200518036 곡진화 2 PICT Pairwise Tool - PICT Microsoft 의 Command-line 기반의 Free Software www.pairwise.org 에서다운로드후설치

More information