BASIC4MCU | 질문게시판 | 답변 : (초보)아두이노 질문있습니다.
페이지 정보
작성자 master 작성일2018-12-20 10:36 조회4,051회 댓글0건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=7107
본문
angle[37] ={ 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180};//mySv[0][37]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36};mySv[1][37]={ 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73};mySv[2][37]={ 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110};mySv[3][37]={111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147};mySv[4][37]={148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184};mySv[5][37]={185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221};
180도를 5로 나누면 0~36까지 37개의 각도가 나옵니다.
1바이트 시리얼 데이터로 6개의 각도를 구분해서 전송할 수 있습니다.
0~36은 서보1
37~73은 서보2 식인거죠
//
아래 소스에서도 0~36으로 데이터를 다루며
서보모터에 write 할 때에 5를 곱해서 출력합니다.
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2018-12-20 오전 10:39:36// by Ok-Hyun Park//#include <Servo.h>Servo mySv[6];mySvPin[]={4,5,6,7,8,9};//int min_angle[]={11,11,11,11,11,11}; // 55도int max_angle[]={25,25,25,25,25,25}; // 125도//int angle[] ={18,18,18,18,18,18}; // 90도int target[]={18,18,18,18,18,18}; // 90도//void setup(){Serial.begin(9600);//for(int i=0;i<6;i++)mySv[i].attach(mySvPin[i]);for(int i=0;i<6;i++)mySv[i].write(angle[i]*5);}//void loop(){if(Serial.available()>0){byte r=Serial.read();if (r< 37){ target[0]=r; } // mySv[0]else if(r< 74){ target[1]=r- 37; } // mySv[1]else if(r<111){ target[2]=r- 74; } // mySv[2]else if(r<148){ target[3]=r-111; } // mySv[3]else if(r<185){ target[4]=r-148; } // mySv[4]else if(r<222){ target[5]=r-185; } // mySv[5]}//if(angle[0]>target[0]){ angle[0]--; mySv[0].write(angle[0]*5); } if(angle[0]<target[0]){ angle[0]++; mySv[0].write(angle[0]*5); }if(angle[1]>target[1]){ angle[1]--; mySv[1].write(angle[1]*5); } if(angle[1]<target[1]){ angle[1]++; mySv[1].write(angle[1]*5); }if(angle[2]>target[2]){ angle[2]--; mySv[2].write(angle[2]*5); } if(angle[2]<target[2]){ angle[2]++; mySv[2].write(angle[2]*5); }if(angle[3]>target[3]){ angle[3]--; mySv[3].write(angle[3]*5); } if(angle[3]<target[3]){ angle[3]++; mySv[3].write(angle[3]*5); }if(angle[4]>target[4]){ angle[4]--; mySv[4].write(angle[4]*5); } if(angle[4]<target[4]){ angle[4]++; mySv[4].write(angle[4]*5); }if(angle[5]>target[5]){ angle[5]--; mySv[5].write(angle[5]*5); } if(angle[5]<target[5]){ angle[5]++; mySv[5].write(angle[5]*5); }//delay(10)}
PC또는 블루투스에서 아두이노로 시리얼 전송 할 때에는
각도를 5로 나누고
서보1이면 그 값을 그대로 전송하고
서보6이면 그 값에 185를 더해서 전송하면 됩니다.
//----------------------------------------------------------------------
시리얼모니터에서 테스트 할 때에는 정수값을 임의로 입력할 방법이 없으므로
2바이트로 데이터를 전송 해보겠습니다.
각도부터 보내고 모터선택코드를 전송합니다.
Table of ASCII Characters
binary MSN 0000 0001 0010 0011 0100 0101 0110 0111 LSN hex 0 1 2 3 4 5 6 7 0000 0 NUL 0
00DLE 16
10SP 32
200 48
30@ 64
40P 80
50` 96
60p 112
700001 1 SOH 1
01XON
(DC1)17
11! 33
211 49
31A 65
41Q 81
51a 97
61q 113
710010 2 STX 2
02DC2 18
12" 34
222 50
32B 66
42R 82
52b 98
62r 114
720011 3 ETX 3
03XOFF (DC2) 19
13# 35
233 51
33C 67
43S 83
53c 99
63s 115
730100 4 EOT 4
04DC4 20
14$ 36
244 52
34D 68
44T 84
54d 100
64t 116
740101 5 ENQ 5
05NAK 21
15% 37
255 53
35E 69
45U 85
55e 101
65u 117
750110 6 ACK 6
06SYN 22
16& 38
266 54
36F 70
46V 86
56f 102
66v 118
760111 7 BEL 7
07ETB 23
17' 39
277 55
37G 71
47W 87
57g 103
67w 119
771000 8 BS 8
08CAN 24
18( 40
288 56
38H 72
48X 88
58h 104
68x 120
781001 9 HT 9
09EM 25
19) 41
299 57
39I 73
49Y 89
59i 105
69y 121
791010 A LF 10
0ASUB 26
1A* 42
2A: 58
3AJ 74
4AZ 90
5Aj 106
6Az 122
7A1011 B VT 11
0BESC 27
1B+ 43
2B; 59
3BK 75
4B[ 91
5Bk 107
6B{ 123
7B1100 C FF 12
0CFS 28
1C, 44
2C< 60
3CL 76
4C\ 92
5Cl 108
6C| 124
7C1101 D CR 13
0DGS 29
1D- 45
2D= 61
3DM 77
4D] 93
5Dm 109
6D} 125
7D1110 E SO 14
0ERS 30
1E. 46
2E> 62
3EN 78
4E^ 94
5En 110
6E~ 126
7E1111 F SI 15
0FUS 31
1F/ 47
2F? 63
3FO 79
4F_ 95
5Fo 111
6FDEL 127
7F
angle[37] ={ 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180};angle[37] ={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k'};
대문자 'A'~'Z' 26문자 와 소문자 'a'~'k' 11개로 37개의 문자를 각도로 사용하면 이렇게 되겠죠
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2018-12-20 오후 1:05:58// by Ok-Hyun Park//#include <Servo.h>Servo mySv[6];mySvPin[]={4,5,6,7,8,9};//int min_angle[]={11,11,11,11,11,11}; // 55도int max_angle[]={25,25,25,25,25,25}; // 125도//int angle[] ={18,18,18,18,18,18}; // 90도int target[]={18,18,18,18,18,18}; // 90도//byte r_angle;//void setup(){Serial.begin(9600);//for(int i=0;i<6;i++)mySv[i].attach(mySvPin[i]);for(int i=0;i<6;i++)mySv[i].write(angle[i]*5);}//void loop(){if(Serial.available()>0){byte r=Serial.read();if ((r>='A')&&(r<='Z')){ r_angle=r-'A'; }else if((r>='a')&&(r<='k')){ r_angle=r-'a'+26; }else if((r>='1')&&(r<='6')){ target[r-'1']=r_angle; } // target[] 저장}//if(angle[0]>target[0]){ angle[0]--; mySv[0].write(angle[0]*5); } if(angle[0]<target[0]){ angle[0]++; mySv[0].write(angle[0]*5); }if(angle[1]>target[1]){ angle[1]--; mySv[1].write(angle[1]*5); } if(angle[1]<target[1]){ angle[1]++; mySv[1].write(angle[1]*5); }if(angle[2]>target[2]){ angle[2]--; mySv[2].write(angle[2]*5); } if(angle[2]<target[2]){ angle[2]++; mySv[2].write(angle[2]*5); }if(angle[3]>target[3]){ angle[3]--; mySv[3].write(angle[3]*5); } if(angle[3]<target[3]){ angle[3]++; mySv[3].write(angle[3]*5); }if(angle[4]>target[4]){ angle[4]--; mySv[4].write(angle[4]*5); } if(angle[4]<target[4]){ angle[4]++; mySv[4].write(angle[4]*5); }if(angle[5]>target[5]){ angle[5]--; mySv[5].write(angle[5]*5); } if(angle[5]<target[5]){ angle[5]++; mySv[5].write(angle[5]*5); }//delay(10)}
각도부터 전송하고나서 서보모터 선택코드를 전송합니다.
예를들면
1번 서보 90도는 "S1"
2번 서보 90도는 "S2"
6번 서보 90도는 "S6"3번 서보 10도는 "C3"4번 서보 110도는 "W4"
댓글 0
조회수 4,051등록된 댓글이 없습니다.