1 Mini Q DFRobothttp www dfrobot com Mini
1. Mini. Q -개요 DFRobot(http: //www. dfrobot. com/)에서 Mini. Q 2 WD 기반에 Romeo V 2 All-in-one 컨트롤러 사용 하여 사용자가 다양한 컨스터마이징 작업을 수행할 수 있도록 제공함 • Sharp GP 2 Y 0 A 21 Distance Sensor - operating voltage: 4. 5 V to 5. 5 V - average current consumption: 30 m. A (typical) - distance measuring range: 10 cm to 80 cm (4" to 32") - output type: analog voltage - output voltage differential over distance range: 1. 9 V (typical) - response time: 38 ± 10 ms • Others - 13000 rpm @ No load - 50: 1 Gear ratio - 260 rpm @ 6 V - 40 m. A @ 6 V - 360 m. A stall current @ 6 V - 10 oz inches torque @ 6 V Written by ZEDO 2016 1
2. Mini. Q -연결도 DIO 4~6는 모터 제어를 위해 사용함 RIGHT LEFT A 0 A 1 A 2 Written by ZEDO 2016 2
3. Mini. Q-조립 방법(1/3) Written by ZEDO 2016 3
3. Mini. Q-조립 방법(2/3) Written by ZEDO 2016 4
4. Code-IR Avoidance(1/3) DFRobot에서 제공하는 Sample 코드의 경우 모타 동작이 반대로 되어 수정 완료. /* # This Sample code is for testing the Mini. Q Discovery Kit. # # # Editor : Date : Ver : Product: SKU : Phoebe 2014. 6. 19 0. 1 Mini. Q Discovery Kit KIT 0071 # Description: # Obstacle avoidance function of Mini. Q Discovery Kit */ #include <math. h> #include <Servo. h> //Include Servo library Servo irservo; // create servo object to control a servo #define Svo_Pin 9 int posnow; int ir_sensor = A 1; int int S 1 S 2 D 1 D 2 = = 5; 6; 4; 7; //D 1 Speed Control( 왼쪽) //D 2 Speed Control( 오른쪽) //D 1 Direction Control( 왼쪽) //D 1 Direction Control( 오른쪽) void stop(void) //Stop { digital. Write(S 1, 0); digital. Write(D 1, LOW); digital. Write(S 2, 0); digital. Write(D 2, LOW); } void advance(char a, char b) //Move forward { analog. Write (S 1, a); //PWM Speed Control digital. Write(D 1, HIGH); analog. Write (S 2, b); digital. Write(D 2, HIGH); } void back_off (char a, char b) //Move backward { analog. Write (S 1, a); digital. Write(D 1, LOW); analog. Write (S 2, b); digital. Write(D 2, LOW); } Written by ZEDO 2016 6
4. Code-IR Avoidance(2/3) void turn_L (char a, char b) //Turn Left( 왼쪽으로 빙빙 돌기) { analog. Write (S 1, a); digital. Write(D 1, LOW); // 왼쪽 모터가 뒤로 돌기 analog. Write (S 2, b); digital. Write(D 2, HIGH); // 오른쪽 모터가 앞으로 돌기 } void turn_R (char a, char b) //Turn Right( 오른쪽으로 빙빙 돌기) { analog. Write (S 1, a); digital. Write(D 1, HIGH); // 왼쪽 모터가 앞으로로 돌기 analog. Write (S 2, b); digital. Write(D 2, LOW); // 오른쪽 모터가 뒤로 돌기 } void setup() { int i; for(i=4; i<=7; i++) pin. Mode(i, OUTPUT); digital. Write(S 1, LOW); digital. Write(S 2, LOW); irservo. attach(Svo_Pin); Serial. begin(9600); advance(80, 80); } int pos=0; float distance; Written by ZEDO 2016 //attaches the servo on pin 9 to the servo object //Set Baud Rate // variable to store the servo position 7
4. Code-IR Avoidance(3/3) void loop() { // digital. Write(2, HIGH); for (int i=0; i<180; i++) { irservo. write(i); int x=analog. Read(ir_sensor); // connect the GP 2 Y 0 A 21 distance sensor to Analog A 1 Serial. println(x); // print distance if(x>350) //13. 7 cm 보다 클 경우(POWER(3027. 4/x, 1. 2134)) { if(i<135) //43. 5 cm 보다 작을 경우(POWER(3027. 4/x, 1. 2134)) { back_off(80, 80); delay(300); turn_L(80, 80); delay(300); } else { back_off(80, 80); delay(300); turn_R(80, 80); delay(300); } advance(80, 80); } delay(4); } for(int i=180; i>0; i--) { irservo. write(i); int x=analog. Read(ir_sensor); Serial. println(x); // print distance if(x>350) //13. 7 cm 보다 클 경우(POWER(3027. 4/x, 1. 2134)) { if(i<135) //43. 5 cm 보다 작을 경우(POWER(3027. 4/x, 1. 2134)) { back_off(80, 80); delay(300); turn_L(80, 80); delay(300); } else { back_off(80, 80); delay(300); turn_R(80, 80); delay(300); } advance(80, 80); } delay(4); } } Written by ZEDO 2016 8
4. Code-IR(GP 2 Y 0 A 21) Distance /* Read values from Sharp GP 2 Y 0 A 21 distance sensor and output to serial Sharp Distance Sensor GP 2 Y 0 A 21 (10 -80 cm) 3. 1 V at 10 cm to 0. 3 V at 80 cm */ int ir_sensor = A 1; void setup() { //initialize serial communications at 9600 bps Serial. begin(9600); } void loop() { int sensor_value = analog. Read(ir_sensor); //read the sensor value Serial. println(sensor_value); //print the sensor vlue delay(500); //delay 500 ms (0. 5 second) } Written by ZEDO 2016 9
4. Code-IR(GP 2 Y 0 A 21) Distance with Average IR Sensor에서 읽어 들이는 거리값에 대한 평균을 구하여 반영함(Noise 고려) int ir_sensor = A 1; // Analog A 1 void setup() { Serial. begin(9600); } void loop() { Serial. println(value_average(10)); //loop 10 times and get its average delay(500); } int value_average(int average_count) { int sum = 0; for (int i=0; i<average_count; i++) { int sensor_value = analog. Read(ir_sensor); sum = sum + sensor_value; } return(sum/average_count); } Written by ZEDO 2016 10
4. Code-IR(GP 2 Y 0 A 21) Distance with Voltage IR Sensor를 통해 전달되는 Analog 값은 10 bit 해상도(2^10=1024)로 전달되며, 5 V에서는 1023, 2. 5 V 에서는 512값을 가짐(센서에 가까울 수록 높은 값, 멀어질수록 낮음 값) int ir_sensor = A 1; // Analog A 1 void setup() { Serial. begin(9600); } void loop() { Serial. println(value_average(10)); //loop 10 times and get its average delay(500); } int value_average(int average_count) { int sum = 0; for (int i=0; i<average_count; i++) { int sensor_value = analog. Read(ir_sensor); sum = sum + sensor_value; } return(sum/average_count); } Written by ZEDO 2016 11
4. Code-IR(GP 2 Y 0 A 21) Distance(cm) IR Sensor를 통해 전달되는 값(0(remote)~1023(near))을 meter로 환산한다. int ir_sensor = A 1; void setup() { //initialize serial communications at 9600 bps Serial. begin(9600); } void loop() { int sensor_value = analog. Read(ir_sensor); //read the sensor value int distance_cm = pow(3027. 4/sensor_value, 1. 2134); //convert readings to distance(cm) Serial. println(distance_cm); //print the sensor value delay(500); //delay 500 ms (0. 5 second) } Written by ZEDO 2016 12
4. Code-IR(GP 2 Y 0 A 21) Distance(cm) with Average IR Sensor를 통해 전달되는 값(0(remote)~1023(near))을 meter로 환산한다. (평균값 고려) int ir_sensor = A 1; void setup() { //initialize serial communications at 9600 bps Serial. begin(9600); } void loop() { int distance = average_value(100); //loop 100 times and get its average Serial. println(distance); //print the sensor value delay(500); //delay 500 ms (0. 5 second) } int average_value(int average_count) { int sum = 0; for (int i=0; i<average_count; i++) { int sensor_value = analog. Read(ir_sensor); //read the sensor value int distance_cm = pow(3027. 4/sensor_value, 1. 2134); //convert readings to distance(cm) sum = sum + distance_cm; } return(sum/average_count); } Written by ZEDO 2016 13
4. Code-Remeo V 2 Button Control(1/2) DFRduino Ro. Meo는 5개의 버튼(S 1 -S 5)이 있으며 하나의 Analog 입력(0)을 사용함 6개의 Key를 사용하기 char msgs[5][15] = { "Right Key OK ", "Up Key OK ", "Down Key OK ", "Left Key OK ", "Select Key OK" }; char start_msg[15] = { "Start loop "}; int adc_key_val[5] ={ 30, 150, 360, 535, 760 }; int NUM_KEYS = 5; int adc_key_in; int key=-1; int oldkey=-1; void setup() { // pin. Mode(13, OUTPUT); //we'll use the debug LED to output a heartbeat Serial. begin(9600); /* Print that we made it here */ Serial. println(start_msg); } Written by ZEDO 2016 14
4. Code-Remeo V 2 Button Control(2/2) DFRduino Ro. Meo는 5개의 버튼(S 1 -S 5)이 있으며 하나의 Analog 입력(0)을 사용함 void loop() { adc_key_in = analog. Read(0); // read the value from the sensor // digital. Write(13, HIGH); /* get the key */ key = get_key(adc_key_in); // convert into key press if (key != oldkey) { // if keypress is detected delay(50); // wait for debounce time adc_key_in = analog. Read(0); // read the value from the sensor key = get_key(adc_key_in); // convert into key press if (key != oldkey) { oldkey = key; if (key >=0){ Serial. println(adc_key_in, DEC); Serial. println(msgs[key]); } } } // digital. Write(13, LOW); } // Convert ADC value to key number int get_key(unsigned int input) { int k; for (k = 0; k < NUM_KEYS; k++) { if (input < adc_key_val[k]) { return k; } } if (k >= NUM_KEYS) k = -1; // No valid key pressed return k; } Written by ZEDO 2016 15
4. Code-Remeo V 2 Moter Control(1/2) Romeo V 2의 PWM 직렬 모터 제어는 2개의 디지털 IO 핀(4, 6)과 2개의 PWM 핀(5, 6)으로 구성됨 1번 모터(오른쪽) 2번 모터(왼쪽) //Standard PWM DC control int S 1 = 5; //D 1 Speed Control(왼쪽) int S 2 = 6; //D 2 Speed Control(오른쪽) int D 1 = 4; //D 1 Direction Control(왼쪽) int D 2 = 7; //D 1 Direction Control(오른쪽) void stop(void) //Stop { digital. Write(S 1, 0); digital. Write(D 1, LOW); digital. Write(S 2, 0); digital. Write(D 2, LOW); } void advance(char a, char b) //Move forward { analog. Write (S 1, a); //PWM Speed Control digital. Write(D 1, HIGH); analog. Write (S 2, b); digital. Write(D 2, HIGH); } Written by ZEDO 2016 16
4. Code-Remeo V 2 Moter Control(2/2) Romeo V 2의 PWM 직렬 모터 제어는 2개의 디지털 IO 핀(4, 6)과 2개의 PWM 핀(5, 6)으로 구성됨 void loop(void) { if(Serial. available()){ char val = Serial. read(); if(val != -1) { switch(val) { case 'w': //Move Forward Serial. println("Move Forward"); advance (40, 40); //move forward in max speed break; case 's': //Move Backward Serial. println("Move Backward"); back_off (40, 40); //move back in max speed break; case 'a': //Turn Left Serial. println("Turn Left"); turn_L (40, 40); break; case 'd': //Turn Right Serial. println("Turn Right"); turn_R (40, 40); break; case 'z': Serial. println("Hello"); break; case 'x': Serial. println("Stop"); stop(); break; } } else stop(); } } void back_off (char a, char b) //Move backward { analog. Write (S 1, a); digital. Write(D 1, LOW); analog. Write (S 2, b); digital. Write(D 2, LOW); } void turn_L (char a, char b) //Turn Left(왼쪽으로 빙빙 돌기) { analog. Write (S 1, a); digital. Write(D 1, LOW); // 왼쪽 모터가 뒤로 돌기 x analog. Write (S 2, b); digital. Write(D 2, HIGH); // 오른쪽 모터가 앞으로 돌기 } void turn_R (char a, char b) //Turn Right(오른쪽으로 빙빙 돌기) { analog. Write (S 1, a); digital. Write(D 1, HIGH); // 왼쪽 모터가 앞으로로 돌기 analog. Write (S 2, b); digital. Write(D 2, LOW); // 오른쪽 모터가 뒤로 돌기 } void setup(void) { int i; for(i=4; i<=7; i++) pin. Mode(i, OUTPUT); Serial. begin(9600); //Set Baud Rate Serial. println("Run keyboard control"); // 키보드로 제어하기 digital. Write(S 1, LOW); digital. Write(S 2, LOW); } Written by ZEDO 2016 17
4. Code-적외선 원격 제어(키값 읽기) 포토 트랜지스터를 Romeo V 2에 설치하여 리모콘에서 전달되는 값을 읽어 보자 포토 트랜지스터를 Romeo V 2의 아나로그 단자(A 2)에 연결한다. - A 1은 거리 측정 센서 사용 // Photo Transistor example #include <IRremote. h>//IR 라이브러리 포함 int RECV_PIN = A 2; //포트선언 IRrecv irrecv(RECV_PIN); decode_results; //구조선언 void setup() { Serial. begin(9600); irrecv. enable. IRIn(); } void loop() { if(irrecv. decode(&results)){ Serial. println(results. value, HEX); irrecv. resume(); // Receive the next value } } Written by ZEDO 2016 18
4. Code-적외선 원격 제어(리모콘의 제조사 확인) 포토 트랜지스터에 신호를 전달하는 리모콘의 제조사와 키값을 확인하자. #include <IRremote. h>//IR 라이브러리 포함 int RECV_PIN = A 2; //포토 트랜지스터 포트 설정 long on 1 = 0 x 00 FF 6897; //수신된 신호 long off 1 = 0 x 00 ff 30 CF; long on 2 = 0 x 00 FF 9867; long off 2 = 0 x 00 FF 18 E 7; long on 3 = 0 x 00 FFB 04 F; long off 3 = 0 x 00 FF 7 A 85; long on 4 = 0 x 00 FF 10 EF; long off 4 = 0 x 00 FF 42 BD; long on 5 = 0 x 00 FF 38 C 7; long off 5 = 0 x 00 FF 4 AB 5; long on 6 = 0 x 00 FF 5 AA 5; long off 6 = 0 x 00 FF 52 AD; IRrecv irrecv(RECV_PIN); decode_results; //구조 선언 void dump(decode_results *results) { int count = results->rawlen; if (results->decode_type == UNKNOWN) { Serial. println("Could not decode message"); } else { if (results->decode_type == NEC) { Serial. print("Decoded NEC: "); } else if (results->decode_type == SONY) { Serial. print("Decoded SONY: "); } else if (results->decode_type == RC 5) { Serial. print("Decoded RC 5: "); } else if (results->decode_type == RC 6) { Serial. print("Decoded RC 6: "); } Serial. print(results->value, HEX); Serial. print(" ("); Serial. print(results->bits, DEC); Serial. println(" bits)"); } Written by ZEDO 2016 Serial. print("Raw ("); Serial. print(count, DEC); Serial. print("): "); for (int i = 0; i < count; i++) { if ((i % 2) == 1) { Serial. print(results->rawbuf[i]*USECPERTICK, DEC); } else { Serial. print(-(int)results->rawbuf[i]*USECPERTICK, DEC); } Serial. print(" "); } Serial. println(""); } void setup() { pin. Mode(RECV_PIN, INPUT); //포트모드,입력 Serial. begin(9600); //전송속도 9600 bps irrecv. enable. IRIn(); // Start the receiver } int on = 0; unsigned long last = millis(); 19 void loop() { if (irrecv. decode(&results)) //디코딩 { // If it's been at least 1/4 second since the last // IR received, toggle the relay if (millis() - last > 250) { on = !on; digital. Write(13, on ? HIGH : LOW); dump(&results); } if (results. value == on 1 ) Serial. println ("on 1"); if (results. value == off 1 ) Serial. println("off 1"); if (results. value == on 2 ) Serial. println("on 2"); if (results. value == off 2 ) Serial. println("off 2"); ; if (results. value == on 3 ) Serial. println("on 3"); if (results. value == off 3 ) Serial. println("off 3"); if (results. value == on 4 ) Serial. println("on 4"); if (results. value == off 4 ) Serial. println("off 4"); ; if (results. value == on 5 ) Serial. println("on 5"); if (results. value == off 5 ) Serial. println("off 5"); if (results. value == on 6 ) Serial. println("on 6"); if (results. value == off 6 ) Serial. println("off 6"); last = millis(); irrecv. resume(); // Receive the next value } }
4. Code-적외선 원격 제어(Mini. Q 제어) 적외선 원격 제어를 통해 Mini. Q를 구동해 보자 #include <IRremote. h>//IR 라이브러리 포함 int RECV_PIN = A 2; //포토 트랜지스터 포트 설정 long go = 0 x 00 FF 18 E 7; //버튼 2 long back = 0 x 00 FF 4 AB 5; //버튼 8 long left = 0 x 00 FF 10 EF; //버튼 4 long right = 0 x 00 FF 5 AA 5; //버튼 6 long stop = 0 x 00 FF 38 C 7; //버튼 5 IRrecv irrecv(RECV_PIN); decode_results; //구조 선언 unsigned long last = millis(); int int S 1 = 5; S 2 = 6; D 1 = 4; D 2 = 7; // Speed Control(왼쪽) // Speed Control(오른쪽) // Direction Control(왼쪽) // Direction Control(오른쪽) void brake(void) //Stop { analog. Write(S 1, 0); digital. Write(D 1, LOW); analog. Write(S 2, 0); digital. Write(D 2, LOW); } void advance(char a, char b) //Move forward { analog. Write (S 1, a); //PWM Speed Control digital. Write(D 1, HIGH); analog. Write (S 2, b); digital. Write(D 2, HIGH); } void back_off (char a, char b) //Move backward { analog. Write (S 1, a); digital. Write(D 1, LOW); analog. Write (S 2, b); digital. Write(D 2, LOW); } Written by ZEDO 2016 void turn_L (char a, char b) //Turn Left(왼쪽으로 빙빙 돌기) { analog. Write (S 1, a); digital. Write(D 1, LOW); // 왼쪽 모터가 뒤로 돌기 analog. Write (S 2, b); digital. Write(D 2, HIGH); // 오른쪽 모터가 앞으로 돌기 } void turn_R (char a, char b) //Turn Right(오른쪽으로 빙빙 돌 기) { analog. Write (S 1, a); digital. Write(D 1, HIGH); // 왼쪽 모터가 앞으로로 돌기 analog. Write (S 2, b); digital. Write(D 2, LOW); // 오른쪽 모터가 뒤로 돌기 } void setup() { Serial. begin(9600); //Set Baud Rate for(int i=4; i<=7; i++) pin. Mode(i, OUTPUT); pin. Mode(RECV_PIN, INPUT); //포트모드,입력 irrecv. enable. IRIn(); // Start the receiver analog. Write(S 1, 0); analog. Write(S 2, 0); } void dump(decode_results *results) { if (results->decode_type == UNKNOWN) { //Serial. println("Could not decode message"); brake(); } } 20 void loop() { if (irrecv. decode(&results)) //디코딩 { // If it's been at least 1/4 second since the last // IR received, toggle the relay if (millis() - last > 250) //1/4초 이후 신호 수신의 경우 { dump(&results); //적외선 신호 디코딩 } if (results. value == go ) advance(80, 80); else if (results. value == back ) back_off(80, 80); else if (results. value == left ) turn_L(80, 80); else if (results. value == right ) turn_R(80, 80); else if (results. value == stop ) brake(); last = millis(); irrecv. resume(); // Receive the next value } }
유첨. Micro Metal Gear Motor with Connector (50: 1)) Mini. Q에 장착된 DFRobot사의 기어 비율 50: 1의 6 V 메탈 기어드 모터 Operating Voltage: 1. 0~6. 0 V Motor Speed: 260 rpm@6 V Gear Ratio: 50: 1 Rated Current: 30 m. A@6 V Stall Current: 350 m. A@6 V Stall Torque: 0. 39 kg*cm@6 V Weight: 15 g Written by ZEDO 2016 22
- Slides: 22