Arduino- 서보모터 2017.11.25 서울과학기술대학교기계시스템디자인공학과 교수김성환
1. Arduino 란? (1) 아두이노 (Arduino) 는오픈소스를기반으로한단일보드마이크로컨트롤러. AVR 기반. (2) 가장큰장점은마이크로컨트롤러를쉽게동작시킬수있다는것. 일반적인번거로운과정을피하고, 컴파일된펌웨어를 USB를통해쉽게업로드. (3) 저렴하고, 윈도를비롯해맥 OS X, 리눅스와같은여러 OS의통합환경 (IDE) 을모두지원. (4) 아두이노보드의회로도가 CCL에따라공개. 심지어누구나직접보드를만들고수정가능. (5) 다양한주변장치가공급되어, 초보자도납땜없이구성가능. (6) 공식홈페이지 : http://arduino.cc/en/main/homepage (7) 아두이노제품구입처 공식홈페이지에서제시하는공식판매처 Plug House MakeZone ArtRobot Eleparts JK Electronics Hanjindata INIPRO Keytronics Lab Co. Segyung Britestone SAMPLE Electronics VCTEC Korea RobotScienceMall 추천판매처메카솔루션 : http://www.mechasolution.com/ 아트로봇 : www.artrobot.co.kr 엘레파츠 : www.eleparts.co.kr 디바이스마트 : www.devicemart.co.kr (7) 비공식참고사이트들아두이노스토리 : http://cafe.naver.com/arduinostory MPU CAFE : http://cafe.naver.com/mpucafe 전자공작 : http://cafe.naver.com/circuitsmanual - 2 -
당근이의 AVR 갖고놀기 : http://cafe.naver.com/carroty SPARKFUN : http://www.sparkfun.com/ Afrotech : http://afrotechmods.com/index.htm 로보밥얼렁뚱땅로보틱스연구소 : http://robobob.tistory.com/ Make: Korea : http://www.make.co.kr/ Instructables : http://www.instructables.com/tag/type-id/category-technology/ Bildr.blog : http://bildr.org/ 2. 아두이노하드웨어의사양 (1) 아두이노우노의구조 (2) 사양 항목 규격 항목 규격 마이크로컨트롤러 ATmega328 DC 전류량 / 입력-출력핀 40 ma 동작전압 5 V 플래시메모리 32 kb ( 부트로더 0.5 kb) 입력전압 7~12 V SRAM 2 kb 디지털입출력핀 14개 (6개는 PWM 출력 ) EEPROM 1 kb 아날로그입력-출력핀 6개 클럭속도 16 MHz 3. 통합개발환경설치 (IDE : Intergrated Development Environment) (1) IDE의역할 - PC에설치해야하는소프트웨어 - 소스를편집하여다운로드할수있게해주는기능. - 시리얼통신창을포함하고있음 (2) 프로그램다운로드 - 홈페이지에접속 : http://arduino.cc/en/main/software - 설치가필요한버전과필요없는버전이있음. 설치없는버전이편리. 아래그림처럼다운로드. - 3 -
- 적절한폴더에압축을풀면완료. 실행파일이있는확인. 실행파일 4. 아두이노연결후 COMM 드라이버설치 (1) 아두이노와 PC의연결 - 아두이노와 PC는물리적으로는 USB 단자를통해연결 - 하지만소프트웨어에서는이를논리적시리얼포트로인식하여통신하도록되어있음 - USB를시리얼 COM 포트로인식하게하려면드라이버를설치해야한다. (2) COM 드라이버의설치방법 - 아두이노와 PC 를 USB 케이블로연결한다. 연결하는순간아두이노에전원이공급된다. - 장치관리자에서다음그림과같이장치설치 - 4 -
정해진폴더에서찾기 - 설치가완료되면아두이노와의 USB 연결이 COM 으로인식. 아래경우는 COM3 (COM 번호는상황마다다르며확인해두어야함.) 5. IDE 실행및환경설정 (1) 아이콘을더블클릭하여 IDE 실행 (2) 사용하는종류의보드를설정 - 우리는다음좌측그림처럼 도구 보드 Arduino Uno 로선택 (3) 통신포트를설정 - 드라이버에서설치된 COM3 로선택 ( 경우마다맞춰서설정해야함 ) - 5 -
보드의설정 통신포트의설정 (4) 사용언어설정 - 파일 환경설정에서사용할언어설정 6. IDE 환경 확인 (Verify) 업로드 (Upload) 새파일 (New) 열기 (Open) 저장 (Save) Serial Monitor - 6 -
(1) 툴바의기능 1 확인 (Verify) : 프로그램을컴파일 2 업로드 (Upload) : 아두이노로컴파일된프로그램을업로드 3 새파일 (New) : 비어있는새로운프로그램을생성 4 열기 (Open) : 저장장치에저장된프로그램을연다 5 저장 (Save) : 현재프로그램을저장장치로저장. 필요하면이름을정하기를요구한다 6 Serial Monitor : 시리얼창이별도로생성된다. 이창을통해아두이노가시리얼통신을통해주고받는데이터를확인할수있다. (2) 프로그램 - 아두이노에서소스프로그램은특별히 스케치 라고불리운다. - 소스를저장하면 ".ino" 의확장자를가진다. 7. Blink 프로그램 (1) 프로그램의목적 - 디지털접점 13번에연결된내장 LED를깜빡이기 - 하드웨어와소프트웨어가정상인지확인할수있음 (2) 입력및실행 - 다음과같은프로그램 ( 스케치 ) 을입력 - 확인 ( ) 눌러컴파일후, 업로드 ( ) 눌러업로드 - 13번 LED가빠르게깜박이는것을확인한다. 13 번 LED ON Lamp int led = 13; void setup() { pinmode(led, OUTPUT); void loop() { digitalwrite(led, HIGH); delay(100); digitalwrite(led, LOW); delay(100); - 7 -
2. Arduino- 서보모터배선 2. Arduino- 서보모터배선 1. 브레드보드 ( 빵판 : Breadboard) (1) 브레드보드란 - 전자회로의 ( 일반적으로임시적인 ) 시제품을만드는데사용하는재사용할수있는무땜납장치. (2) 브레드보드의외형 - 8 x 5.5 cm 의브레드보드는다음과같은형태를가짐. (*) 비공식참고사이트 : http://binworld.kr/13 2. 다음과같이배선한다 (1) 서보모터의배선 - 흑색 : GND - 적색 : 5V - 황색 : 신호선 [3, 6, 9 번 ] - 8 -
2. Arduino- 서보모터배선 (2) 다음과같은프로그램을작성하여다운로드한다. ServoSerialTest #include <Servo.h> const char clf=10; Servo m1, m2, m3; String gbuff; void setup() { m1.attach(3); m2.attach(6); m3.attach(9); Serial.begin(9600); Serial.setTimeout(0); void loop() { // 데이터없으면리턴 if(serial.available() <= 0) return; // 수신내용버퍼에추가 gbuff += Serial.readString(); // M ~ LF 찾기 int ipos0 = gbuff.indexof('m'); if(ipos0 < 0) return; int ipos1 = gbuff.indexof(clf, ipos0); if(ipos1 < 0) return; // LF 빼고내부만얻기 String st = gbuff.substring(ipos0, ipos1); else if(st.substring(0, 3) == "M2,") { String strdec = st.substring(3); int deg = StrDecToValue(strDec); m2.write(deg); Serial.println(deg); else if(st.substring(0, 3) == "M3,") { String strdec = st.substring(3); int deg = StrDecToValue(strDec); m3.write(deg); Serial.println(deg); //------------ user function ----------- int StrDecToValue(String strdec) { char buf[10]; strdec.tochararray(buf, 10); int ival = strtoul(buf, NULL, 10); return ival; // gbuff 업데이트 gbuff = gbuff.substring(ipos1 + 1); //================================= // 모터포지션을받아서모터를세팅 //================================= if (st.substring(0, 3) == "M1,") { String strdec = st.substring(3); int deg = StrDecToValue(strDec); m1.write(deg); Serial.println(deg); - 9 -
2. Arduino- 서보모터배선 3. 시리얼로명령을전송 (1) 다음과같이시리얼창을띄움 - 옵션을맞춘다 - 새줄 / 9600 보드레이트 (2) 명령을입력한다. - Ma,ddd 의형식으로입력 - ( 예 ) M1,0 : 1번모터를 0도위치로 M1,30 : 1 번모터를 30도위치로 M2,110 : 2번모터를 110도위치로 - 10 -
3. Arduino Language Reference 3. Arduino Language Reference 1. Arduino Language (1) C++ 에기반하고있으므로 C++ 와대단히유사하다. (2) 프로그램언어, 내장함수, 디지털및아날로그입출력함수, 유용한클래스들을지원한다. 프로그램언어자료형, 연산자, 제어문 (C++ 와매우유사 ) 내장함수디지털및아날로그입출력함수복잡한작업을손쉽게해주는유용한클래스 수학함수, 문자배열조작함수등 digitialread, digitalwrite, analogread, analogwrite 등 String, Serial, Servo 등 (3) 프로그래밍을위한레퍼런스페이지 - http://arduino.cc/en/reference/homepage 2. Structure 함수 형식 1 void setup( ) 2 void loop( ) 설명 - 전원이켜지거나리셋버튼이눌리웠을때한번실행됨 - 설정할내용을넣으면좋음 - 없으면안됨 - 전원이들어와있는동안지속적으로호출됨. - 없으면안됨 3. Digital I/O 1 2 3 형식 void pinmode(pin, mode) void digitalwrite(pin, value) int digitalread(pin) 설명 - pin : 핀번호 - mode : INPUT, OUTPUT, INPUT_PULLUP - digital 핀의용도를설정. 디폴트는 INPUT - pin : 핀번호 - value : HIGH or LOW - 출력핀에출력값설정 - pin : 핀번호 - return : HIGH or LOW - 입력핀의입력값읽기 - 11 -
3. Arduino Language Reference 4. Analog I/O 1 2 3 형식 int analogread(pin) void analogwrite(pin, value) void analogreference(type) 설명 - pin : 핀번호 (A0~A5) - return : 0~1023 (5V를 10bit로변환 ) - pin 설정없이바로사용가능 - pin : 핀번호 (~ 이붙은핀. 3,5,6,9,10,11) - value : 0 ~ 255 - PWM ( 디지털핀을통해아날로그출력 ) - input range와 resolution을변경 - 자세한것은홈페이지참조 5. Serial 클래스 1 2 3 4 5 6 7 8 9 10 형식 void Serial.begin(speed) void Serial.end( ) int Serial.available( ) long Serial.print(val) Serial.print(val, format) long Serial.println(val) Serial.println(val, format) byte Serial.write(val) Serial.write(str) Serial.write(buf, len) int Serial.read( ) int Serial.parseInt( ) float Serial.parseFloat( ) String Serial.readString( ) String Serial.readStringUntil(char) 설명 - speed : baud rate. 9600, 19200, 38400, 57600 등 - 통신시작. 보통 setup( ) 에서호출 - 통신종료 - 읽을수있는데이터의 byte 수반환. 없으면 0 리턴 - 도착한통신이있는지판단하는데사용 - 데이터를송신. 대부분스트링으로바꾸어전송 - val : int, double, String, char 등 - format : 정수일때는진수, 실수일때는자리수 - println( ) 함수는뒤에 char(13)+char(10) 을붙임 - 이진데이터혹은이진데이터열을전송 - write(2) : STX를전송. write(65) : "A" 를전송 - write("20") : 20 을전송 - 첫번째바이트를읽어리턴. 데이터없으면 -1 리턴 - ASCII 코드가얻어짐 - 다음의유효한정수를찾아리턴 - ( 예 ),123,456 => 100이리턴됨 - 못찾으면 1초후 0 리턴 (Serial.setTimeout() 에서조정가능 ) - 자세한내용은도움말참조 - 정해진시간까지읽어진스트링을리턴 - 시간은 Serial.setTimeout() 에서설정. 0으로설정가능 - char를만날때까지를읽어서반환. - 정해진시간까지못읽으면함수가종료됨 - 12 -
3. Arduino Language Reference 6. String 클래스 형식 설명 1 charat(n) String 오브젝트의 n번째문자를리턴 2 compareto(s2) String 오브젝트를지정된 String S2 오브젝트와비교 3 concat(s2) String 오브젝트와 S2 오브젝트가결합된새 String 오브젝트를리턴 4 endswith(s2) String 오브젝트가 S2 오브젝트의문자들로끝나면 true를리턴 5 equals(s2) String 오브젝트가 S2 오브젝트와정확히일치하면 ( 대소문자구분 ) true를리턴 6 equalsignorecase(s2) equals와같지만대소문자를구분하지않음 7 getbytes(buffer, len) len에해당하는개수의문자를제공된바이트버퍼에복사 8 indexof(s) 제공된 String 오브젝트 ( 또는문자 ) 의인덱스를리턴하며, 없으면 1을리턴 9 lastindexof(s) indexof와같지만 String 오브젝트의끝에서시작된다는점이다름 10 length( ) String 오브젝트의문자수를리턴한다. 11 replace(a, B) String 오브젝트 ( 또는문자 ) A의모든인스턴스를 String 오브젝트 ( 또는문자 ) B로바꿈 12 setcharat(index, c) 문자 c를 String 오브젝트의지정된위치 (index) 에저장 13 startswith(s2) String 오브젝트가 S2 오브젝트의문자들로시작되면 true를리턴 14 substring(index) String 오브젝트의지정된위치 (index) 부터마지막까지의문자로구성된 String 오브젝트를리턴 15 substring(index, to) 위함수와같지만 to 앞의문자까지만하위문자열에포함된다는점이다름 16 tochararray(buffer, len) String 오브젝트의문자중에서최대 len개의문자를제공된버퍼에복사 17 toint( ) String 오브젝트에있는숫자의정수값을리턴 18 tolowercase( ) 모든문자를소문자로변환한 String 오브젝트를리턴 19 touppercase( ) 모든문자를대문자로변환한 String 오브젝트를리턴 20 trim( ) 선행및후행공백을모두제거한 String 오브젝트를리턴 - 13 -