CodingMaker

스마트 모빌리티(Smart Mobility)_ Arduino 코딩하기 본문

Smart Mobility

스마트 모빌리티(Smart Mobility)_ Arduino 코딩하기

메이커K 2022. 10. 22. 13:48
 

스마트 모빌리티(Smart Mobility)_조립하기, Auduino 라이브러리 추가

메카넘 휠이 장착된 스마트 모빌리티(Smart Mobility) 조립하기 BRAND SHOP > MCU보드/제어모듈" data-og-description="직선, 비스듬히, 수평, S라인으로 이동할 수 있는 메카넘 휠 입니다. - 7100원 국내 최대..

22ww.tistory.com

DCMotor Test 해보기 - 4개의 메카넘휠을 활용한 이동하기

사용모터쉴드 링크: http://www.adafruit.com/products/1438

 

Adafruit Motor/Stepper/Servo Shield for Arduino v2 Kit

The original Adafruit Motorshield kit is one of our most beloved kits, which is why we decided to make something even better. We have upgraded the shield kit to make the bestest, easiest way ...

www.adafruit.com

아두이노 실행 후 파일-예제-Adafruit_MotorShield V2 Library-DCMotorTest

 

1. 바퀴 하나만 전진 1초 후 2초 멈춤 후진 1초 후 2초 멈춤 반복 코드 작성하기

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
37
38
#include <Adafruit_MotorShield.h>
 
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_DCMotor *myMotor = AFMS.getMotor(1);
 
void setup() {
  Serial.begin(9600);
  Serial.println("Adafruit Motorshield v2 - DC Motor test!");
 
  if (!AFMS.begin()) {
    Serial.println("Could not find Motor Shield. Check wiring.");
    while (1);
  }
  Serial.println("Motor Shield found.");
 
  myMotor->setSpeed(150);
  myMotor->run(FORWARD);
  myMotor->run(RELEASE);
}
 
void loop() {
  myMotor->run(FORWARD);
  myMotor->setSpeed(255);
  delay(1000);
 
  myMotor->setSpeed(100);
  delay(2000);
 
  myMotor->run(BACKWARD);
  myMotor->setSpeed(100);
  delay(1000);
 
  myMotor->setSpeed(255);
  delay(2000);
 
  myMotor->run(RELEASE);
  delay(1000);
}
 

2. 4개 바퀴 모두 전진 후 멈춤 반복하기

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
#include <Adafruit_MotorShield.h>
 
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
 
Adafruit_DCMotor *myMotor1 = AFMS.getMotor(1);
Adafruit_DCMotor *myMotor2 = AFMS.getMotor(2);
Adafruit_DCMotor *myMotor3 = AFMS.getMotor(3);
Adafruit_DCMotor *myMotor4 = AFMS.getMotor(4);
 
void setup() {
  Serial.begin(9600);    
  Serial.println("Adafruit Motorshield v2 - DC Motor test!");
 
  if (!AFMS.begin()) {  
    Serial.println("fail to find Motor Shield.");
    while (1);
  }
  myMotor1->setSpeed(255);
  myMotor2->setSpeed(255);
  myMotor3->setSpeed(255);
  myMotor4->setSpeed(255);
}
 
void loop() {
  myMotor1->run(FORWARD);
  myMotor2->run(FORWARD);
  myMotor3->run(FORWARD);
  myMotor4->run(FORWARD);
  delay(1000);
 
  myMotor1->run(RELEASE);
  myMotor2->run(RELEASE);
  myMotor3->run(RELEASE);
  myMotor4->run(RELEASE);
  delay(2000); 
}
 

3. 차체가 회전하지 않고 바로 수평이동

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
37
38
39
40
41
42
43
44
45
46
47
48
#include <Adafruit_MotorShield.h>
 
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
 
Adafruit_DCMotor *myMotor1 = AFMS.getMotor(1);
Adafruit_DCMotor *myMotor2 = AFMS.getMotor(2);
Adafruit_DCMotor *myMotor3 = AFMS.getMotor(3);
Adafruit_DCMotor *myMotor4 = AFMS.getMotor(4);
 
void setup() {
  Serial.begin(9600);         
  Serial.println("Adafruit Motorshield v2 - DC Motor test!");
 
  if (!AFMS.begin()) {        
    Serial.println("fail to find Motor Shield.");
    while (1);
  }
  myMotor1->setSpeed(255);
  myMotor2->setSpeed(255);
  myMotor3->setSpeed(255);
  myMotor4->setSpeed(255);
}
 
void loop() {
  myMotor1->run(FORWARD);
  myMotor2->run(BACKWARD);
  myMotor3->run(FORWARD);
  myMotor4->run(BACKWARD);
  delay(1000);
 
  myMotor1->run(RELEASE);
  myMotor2->run(RELEASE);
  myMotor3->run(RELEASE);
  myMotor4->run(RELEASE);
  delay(2000); 
 
  myMotor1->run(BACKWARD);
  myMotor2->run(FORWARD);
  myMotor3->run(BACKWARD);
  myMotor4->run(FORWARD);
  delay(1000);
 
  myMotor1->run(RELEASE);
  myMotor2->run(RELEASE);
  myMotor3->run(RELEASE);
  myMotor4->run(RELEASE);
  delay(2000); 
}
 

4. 대각선 4방향으로 움직이기(우상단, 좌상단, 우하단, 좌하단 45도 이동)

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
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
#include <Adafruit_MotorShield.h>
 
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
 
Adafruit_DCMotor *myMotor1 = AFMS.getMotor(1);
Adafruit_DCMotor *myMotor2 = AFMS.getMotor(2);
Adafruit_DCMotor *myMotor3 = AFMS.getMotor(3);
Adafruit_DCMotor *myMotor4 = AFMS.getMotor(4);
 
void setup() {
  Serial.begin(9600);          
  Serial.println("Adafruit Motorshield v2 - DC Motor test!");
 
  if (!AFMS.begin()) {       
    Serial.println("fail to find Motor Shield.");
    while (1);
  }
  myMotor1->setSpeed(255);
  myMotor2->setSpeed(255);
  myMotor3->setSpeed(255);
  myMotor4->setSpeed(255);
}
 
void loop() {
  myMotor1->run(RELEASE);
  myMotor2->run(FORWARD);
  myMotor3->run(RELEASE);
  myMotor4->run(FORWARD);
  delay(1000);
 
  myMotor1->run(RELEASE);
  myMotor2->run(RELEASE);
  myMotor3->run(RELEASE);
  myMotor4->run(RELEASE);
  delay(2000); 
 
  myMotor1->run(FORWARD);
  myMotor2->run(RELEASE);
  myMotor3->run(FORWARD);
  myMotor4->run(RELEASE);
  delay(1000);
 
  myMotor1->run(RELEASE);
  myMotor2->run(RELEASE);
  myMotor3->run(RELEASE);
  myMotor4->run(RELEASE);
  delay(2000); 
 
  myMotor1->run(BACKWARD);
  myMotor2->run(RELEASE);
  myMotor3->run(BACKWARD);
  myMotor4->run(RELEASE);
  delay(1000);
 
  myMotor1->run(RELEASE);
  myMotor2->run(RELEASE);
  myMotor3->run(RELEASE);
  myMotor4->run(RELEASE);
  delay(2000); 
 
  myMotor1->run(RELEASE);
  myMotor2->run(BACKWARD);
  myMotor3->run(RELEASE);
  myMotor4->run(BACKWARD);
  delay(1000);
 
  myMotor1->run(RELEASE);
  myMotor2->run(RELEASE);
  myMotor3->run(RELEASE);
  myMotor4->run(RELEASE);
  delay(2000);
}
 

5. 대각선 이동에 회전 추가

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
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <Adafruit_MotorShield.h>
 
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
 
Adafruit_DCMotor *myMotor1 = AFMS.getMotor(1);
Adafruit_DCMotor *myMotor2 = AFMS.getMotor(2);
Adafruit_DCMotor *myMotor3 = AFMS.getMotor(3);
Adafruit_DCMotor *myMotor4 = AFMS.getMotor(4);
 
void setup() {
  Serial.begin(9600);      
  Serial.println("Adafruit Motorshield v2 - DC Motor test!");
 
  if (!AFMS.begin()) {   
    Serial.println("fail to find Motor Shield.");
    while (1);
  }
  myMotor1->setSpeed(255);
  myMotor2->setSpeed(255);
  myMotor3->setSpeed(255);
  myMotor4->setSpeed(255);
}
 
void loop() {
  myMotor1->run(RELEASE);
  myMotor2->run(FORWARD);
  myMotor3->run(RELEASE);
  myMotor4->run(FORWARD);
  delay(1000);
 
  myMotor1->run(RELEASE);
  myMotor2->run(RELEASE);
  myMotor3->run(RELEASE);
  myMotor4->run(RELEASE);
  delay(2000); 
 
  myMotor1->run(FORWARD);
  myMotor2->run(RELEASE);
  myMotor3->run(FORWARD);
  myMotor4->run(RELEASE);
  delay(1000);
 
  myMotor1->run(RELEASE);
  myMotor2->run(RELEASE);
  myMotor3->run(RELEASE);
  myMotor4->run(RELEASE);
  delay(2000); 
 
  myMotor1->run(BACKWARD);
  myMotor2->run(RELEASE);
  myMotor3->run(BACKWARD);
  myMotor4->run(RELEASE);
  delay(1000);
 
  myMotor1->run(RELEASE);
  myMotor2->run(RELEASE);
  myMotor3->run(RELEASE);
  myMotor4->run(RELEASE);
  delay(2000); 
 
  myMotor1->run(RELEASE);
  myMotor2->run(BACKWARD);
  myMotor3->run(RELEASE);
  myMotor4->run(BACKWARD);
  delay(1000);
 
  myMotor1->run(RELEASE);
  myMotor2->run(RELEASE);
  myMotor3->run(RELEASE);
  myMotor4->run(RELEASE);
  delay(2000);
 
  myMotor1->run(FORWARD);
  myMotor2->run(FORWARD);
  myMotor3->run(BACKWARD);
  myMotor4->run(BACKWARD);
  delay(1000);
 
  myMotor1->run(RELEASE);
  myMotor2->run(RELEASE);
  myMotor3->run(RELEASE);
  myMotor4->run(RELEASE);
  delay(2000);
 
  myMotor1->run(BACKWARD);
  myMotor2->run(BACKWARD);
  myMotor3->run(FORWARD);
  myMotor4->run(FORWARD);
  delay(1000);
 
  myMotor1->run(RELEASE);
  myMotor2->run(RELEASE);
  myMotor3->run(RELEASE);
  myMotor4->run(RELEASE);
  delay(2000);
}
 

6. 전진 후진 대각선 방향 이동을 시리얼 모니터에서 제어하기(시리얼 모니터에 해당 알파벳 or 숫자 입력후 Enter)

미션

  - 시리얼 통신을 통해 문자 데이터(f, l, r, b, 1, 2, 3, 4, s)를 전송받는다.

  - 각 문자에 따라 다음과 같이 차체가 움직일 수 있도록 코드를 작성한다.

  - 공간이 좁다면 속력을 낮추거나 차체를 뒤집어 실습한다.

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
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
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
111
#include <Adafruit_MotorShield.h>
 
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
 
Adafruit_DCMotor *myMotor1 = AFMS.getMotor(1);
Adafruit_DCMotor *myMotor2 = AFMS.getMotor(2);
Adafruit_DCMotor *myMotor3 = AFMS.getMotor(3);
Adafruit_DCMotor *myMotor4 = AFMS.getMotor(4);
 
char data = ' ';
 
void setup() {
  Serial.begin(9600);        
  Serial.println("Adafruit Motorshield v2 - DC Motor test!");
 
  if (!AFMS.begin()) {     
    Serial.println("fail to find Motor Shield.");
    while (1);
  }
  myMotor1->setSpeed(255);
  myMotor2->setSpeed(255);
  myMotor3->setSpeed(255);
  myMotor4->setSpeed(255);
}
 
void loop() {
  if(Serial.available())
  {
    data = Serial.read();
  }
  if(data == 'f')
  {
    myMotor1->run(FORWARD); //전진
    myMotor2->run(FORWARD);
    myMotor3->run(FORWARD);
    myMotor4->run(FORWARD);
    delay(1000);
  }
  if(data == 'b')
  {
    myMotor1->run(BACKWARD); //후진
    myMotor2->run(BACKWARD);
    myMotor3->run(BACKWARD);
    myMotor4->run(BACKWARD);
    delay(1000);
  }
  if(data == 'l')
  {
    myMotor1->run(BACKWARD); //좌측이동
    myMotor2->run(FORWARD);
    myMotor3->run(BACKWARD);
    myMotor4->run(FORWARD);
    delay(1000);
  }
  if(data == 'r')
  {
    myMotor1->run(FORWARD); //우측이동
    myMotor2->run(BACKWARD);
    myMotor3->run(FORWARD);
    myMotor4->run(BACKWARD);
    delay(1000);
  }
  if(data == '3')
  {
    myMotor1->run(BACKWARD); //좌하단
    myMotor2->run(RELEASE);
    myMotor3->run(BACKWARD);
    myMotor4->run(RELEASE);
    delay(1000);
  }
  if(data == '1')
  {
    myMotor1->run(RELEASE); //좌상단
    myMotor2->run(FORWARD);
    myMotor3->run(RELEASE);
    myMotor4->run(FORWARD);
    delay(1000);
  }
  if(data == '4')
  {
    myMotor1->run(RELEASE); //우하단
    myMotor2->run(BACKWARD);
    myMotor3->run(RELEASE);
    myMotor4->run(BACKWARD);
    delay(1000);
  }
  if(data == '2')
  {
    myMotor1->run(FORWARD); //우상단
    myMotor2->run(RELEASE);
    myMotor3->run(FORWARD);
    myMotor4->run(RELEASE);
    delay(1000);
  }
  if(data == 's')
  {
    myMotor1->run(RELEASE); //정지
    myMotor2->run(RELEASE);
    myMotor3->run(RELEASE);
    myMotor4->run(RELEASE);
    delay(1000);
  }
  if(data == 't')
  {
    myMotor1->run(BACKWARD); //회전
    myMotor2->run(BACKWARD);
    myMotor3->run(FORWARD);
    myMotor4->run(FORWARD);
    delay(1000);
  }
}

7. 스마트폰에서 블루투스로 제어하기: 블루투스 이름 바꾸기, nrf toolbox 어플 설치(이미지는 아이폰용)

예제-KOCOAFAB-RC카-9.블루투스-bluetooth_1 실행 후 업로드 후 시리얼 모니터에서 블루투스 이름 바꾸기(AT+NAMEmyCAR) 원하는 이름으로

)

어플 설치(사진은 App Store 예시)

 

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
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
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
#include <Adafruit_MotorShield.h>
#include <SoftwareSerial.h>
 
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
 
Adafruit_DCMotor *myMotor1 = AFMS.getMotor(1);
Adafruit_DCMotor *myMotor2 = AFMS.getMotor(2);
Adafruit_DCMotor *myMotor3 = AFMS.getMotor(3);
Adafruit_DCMotor *myMotor4 = AFMS.getMotor(4);
 
SoftwareSerial BTSerial(45);
 
char data = ' ';
 
void setup() {
  Serial.begin(9600);          
  BTSerial.begin(9600);
  Serial.println("Adafruit Motorshield v2 - DC Motor test!");
 
  if (!AFMS.begin()) {      
    Serial.println("fail to find Motor Shield.");
    while (1);
  }
  myMotor1->setSpeed(150);
  myMotor2->setSpeed(150);
  myMotor3->setSpeed(150);
  myMotor4->setSpeed(150);
}
 
void loop() {
  if (BTSerial.available())
  {
    char data = BTSerial.read();
    Serial.println(data);
 
    if (data == 'f')
    {
      myMotor1->run(FORWARD); //전진
      myMotor2->run(FORWARD);
      myMotor3->run(FORWARD);
      myMotor4->run(FORWARD);
    }
    if (data == 'b')
    {
      myMotor1->run(BACKWARD); //후진
      myMotor2->run(BACKWARD);
      myMotor3->run(BACKWARD);
      myMotor4->run(BACKWARD);
    }
    if (data == 'l')
    {
      myMotor1->run(BACKWARD); //좌측이동
      myMotor2->run(FORWARD);
      myMotor3->run(BACKWARD);
      myMotor4->run(FORWARD);
    }
    if (data == 'r')
    {
      myMotor1->run(FORWARD); //우측이동
      myMotor2->run(BACKWARD);
      myMotor3->run(FORWARD);
      myMotor4->run(BACKWARD);
    }
    if (data == '3')
    {
      myMotor1->run(BACKWARD); //좌하단
      myMotor2->run(RELEASE);
      myMotor3->run(BACKWARD);
      myMotor4->run(RELEASE);
    }
    if (data == '1')
    {
      myMotor1->run(RELEASE); //좌상단
      myMotor2->run(FORWARD);
      myMotor3->run(RELEASE);
      myMotor4->run(FORWARD);
    }
    if (data == '4')
    {
      myMotor1->run(RELEASE); //우하단
      myMotor2->run(BACKWARD);
      myMotor3->run(RELEASE);
      myMotor4->run(BACKWARD);
    }
    if (data == '2')
    {
      myMotor1->run(FORWARD); //우상단
      myMotor2->run(RELEASE);
      myMotor3->run(FORWARD);
      myMotor4->run(RELEASE);
    }
    if (data == 's')
    {
      myMotor1->run(RELEASE); //정지
      myMotor2->run(RELEASE);
      myMotor3->run(RELEASE);
      myMotor4->run(RELEASE);
    }
  }
}
 

대표이미지