<aside> 💡 이 페이지에는 자주 사용하는 명령어를 정리해 두었습니다. 즐겨찾기에 추가하고 필요할 때마다 참고하세요
</aside>
#include <IBusBM.h> //IBusBM 라이브러리 생성
#define motorW1_IN1 5 //모터드라이버의 motorW1_IN1부분을 3번에 연결했다고 알려줌
#define motorW1_IN2 6 //모터드라이버의 motorW1_IN2부분을 4번에 연결했다고 알려줌
#define motorW1_IN3 3 //모터드라이버의 motorW2_IN1부분을 5번에 연결했다고 알려줌
#define motorW1_IN4 4 //모터드라이버의 motorW2_IN2부분을 6번에 연결했다고 알려줌
#define motorW2_IN1 9 //모터드라이버의 motorW1_IN1부분을 7번에 연결했다고 알려줌
#define motorW2_IN2 10 //모터드라이버의 motorW1_IN2부분을 8번에 연결했다고 알려줌
#define motorW2_IN3 7 //모터드라이버의 motorW2_IN1부분을 9번에 연결했다고 알려줌
#define motorW2_IN4 8 //모터드라이버의 motorW2_IN2부분을 10번에 연결했다고 알려줌
IBusBM IBus; //IBusBm IBus를 지정함
IBusBM IBusSensor; //IBusBm IBusSensor를 지정함
int ch0, ch1, ch2, ch3, ch6 = 0; //변수 ch0, ch1, ch2, ch3, ch6의 값을 0으로 정함
int r22=110; //변수 r22의 값을 110으로 정함
int r23=92; //변수 r23의 값을 92으로 정함
int r24=100; //변수 r24의 값을 100으로 정함
int r25=70; //변수 r25의 값을 70으로 정함
float speed1PWM= 0; //변수 speed1PWM을 0으로 정함
void setup() {
Serial.begin(115200); //시리얼통신을 115200으로 개봉함
IBus.begin(Serial1, IBUSBM_NOTIMER); // Servo iBUS
IBusSensor.begin(Serial2, IBUSBM_NOTIMER); // Sensor iBUS
IBusSensor.addSensor(IBUSS_INTV); // add voltage sensor
}
void loop() {
IBus.loop();
ch0 = IBus.readChannel(0); //채널 1 좌우방향
ch1 = IBus.readChannel(1); //채널 2 전진후진
ch2 = IBus.readChannel(2); //채널 3 현재 기능 없음
ch3 = IBus.readChannel(3); //채널 4 현재 기능 없음
ch6 = IBus.readChannel(6); //채널 7 현재 기능 없음
if (ch0 > 1600)//우회전
{
int R=map(ch1,1600,2000,30,50); //변수 R의 값을 ch1 변수값에서 나오는 1600~2000의 값을 30~50의 값으로 변환한 값으로 정함
delay(100);
if (ch1 > 1600) //전진
{
speed1PWM=map(ch1,1600,2000,0,255);
digitalWrite(motorW1_IN1, LOW);
analogWrite(motorW1_IN2, speed1PWM);
digitalWrite(motorW1_IN3, HIGH);
digitalWrite(motorW1_IN4, HIGH);
analogWrite(motorW2_IN1, speed1PWM);
digitalWrite(motorW2_IN2, LOW);
digitalWrite(motorW2_IN3, HIGH);
digitalWrite(motorW2_IN4, HIGH);
}
else if (ch1 < 1500) //후진
{
speed1PWM=map(ch1,1500,1000,0,255);
analogWrite(motorW1_IN1, speed1PWM);
digitalWrite(motorW1_IN2, LOW);
digitalWrite(motorW1_IN3, HIGH);
digitalWrite(motorW1_IN4, HIGH);
digitalWrite(motorW2_IN1, LOW);
analogWrite(motorW2_IN2, speed1PWM);
digitalWrite(motorW2_IN3, HIGH);
digitalWrite(motorW2_IN4, HIGH);
}
else
{
analogWrite(motorW1_IN1, 0);
digitalWrite(motorW1_IN2, LOW);
digitalWrite(motorW1_IN3, HIGH);
digitalWrite(motorW1_IN4, HIGH);
digitalWrite(motorW2_IN1, LOW);
analogWrite(motorW2_IN2, 0);
digitalWrite(motorW2_IN3, HIGH);
digitalWrite(motorW2_IN4, HIGH);
}
}
else if (ch0 <1300)//좌회전
{
int R=map(ch1,1600,2000,30,50); //변수 R의 값을 ch1 변수값에서 나오는 1600~2000의 값을 30~50의 값으로 변환한 값으로 정함
delay(100);
if (ch1 > 1600) { //전진
speed1PWM=map(ch1,1600,2000,0,255);
digitalWrite(motorW1_IN1, LOW);
analogWrite(motorW1_IN2, speed1PWM);
digitalWrite(motorW1_IN3, HIGH);
digitalWrite(motorW1_IN4, HIGH);
analogWrite(motorW2_IN1, speed1PWM);
digitalWrite(motorW2_IN2, LOW);
digitalWrite(motorW2_IN3, HIGH);
digitalWrite(motorW2_IN4, HIGH);
}
else if (ch1 < 1500) //후진
{
speed1PWM=map(ch1,1500,1000,0,255);
analogWrite(motorW1_IN1, speed1PWM);
digitalWrite(motorW1_IN2, LOW);
digitalWrite(motorW1_IN3, HIGH);
digitalWrite(motorW1_IN4, HIGH);
digitalWrite(motorW2_IN1, LOW);
analogWrite(motorW2_IN2, speed1PWM);
digitalWrite(motorW2_IN3, HIGH);
digitalWrite(motorW2_IN4, HIGH);
}
else
{
analogWrite(motorW1_IN1, 0);
digitalWrite(motorW1_IN2, LOW);
digitalWrite(motorW1_IN3, HIGH);
digitalWrite(motorW1_IN4, HIGH);
digitalWrite(motorW2_IN1, LOW);
analogWrite(motorW2_IN2, 0);
digitalWrite(motorW2_IN3, HIGH);
digitalWrite(motorW2_IN4, HIGH);
}
}
else if (ch1 > 1600) //전진
{
speed1PWM=map(ch1,1600,2000,0,255);
digitalWrite(motorW1_IN1, LOW);
analogWrite(motorW1_IN2, speed1PWM);
digitalWrite(motorW1_IN3, HIGH);
digitalWrite(motorW1_IN4, HIGH);
digitalWrite(motorW2_IN1, LOW);
analogWrite(motorW2_IN2, speed1PWM);
digitalWrite(motorW2_IN3, HIGH);
digitalWrite(motorW2_IN4, HIGH);
}
else if (ch1 < 1500) //후진
{
speed1PWM=map(ch1,1500,1000,0,255);
analogWrite(motorW1_IN1, speed1PWM);
digitalWrite(motorW1_IN2, LOW);
digitalWrite(motorW1_IN3, HIGH);
digitalWrite(motorW1_IN4, HIGH);
analogWrite(motorW2_IN1, speed1PWM);
digitalWrite(motorW2_IN2, LOW);
digitalWrite(motorW2_IN3, HIGH);
digitalWrite(motorW2_IN4, HIGH);
}
else
{
analogWrite(motorW1_IN1, 0);
digitalWrite(motorW1_IN2, LOW);
digitalWrite(motorW1_IN3, HIGH);
digitalWrite(motorW1_IN4, HIGH);
digitalWrite(motorW2_IN1, LOW);
analogWrite(motorW2_IN2, 0);
digitalWrite(motorW2_IN3, HIGH);
digitalWrite(motorW2_IN4, HIGH);
}
}
선회 방식이 변화하는 과정.
위쪽 코드는 회전 시 오른쪽 스틱을 왼쪽 또는 오른쪽으로 돌린 상태에서 왼쪽 스틱을 위로 하면 우회전, 아래로 하면 좌회전인 방식이었지만, 아래 코드는 오른쪽 스틱을 왼쪽/오른쪽으로 돌리면
좌회전/우회전을 한다.
#include <IBusBM.h> //IBusBM 라이브러리 생성
#define motorW1_IN1 5 //모터드라이버의 motorW1_IN1부분을 3번에 연결했다고 알려줌
#define motorW1_IN2 6 //모터드라이버의 motorW1_IN2부분을 4번에 연결했다고 알려줌
#define motorW1_IN3 3 //모터드라이버의 motorW2_IN1부분을 5번에 연결했다고 알려줌
#define motorW1_IN4 4 //모터드라이버의 motorW2_IN2부분을 6번에 연결했다고 알려줌
#define motorW2_IN1 9 //모터드라이버의 motorW1_IN1부분을 7번에 연결했다고 알려줌
#define motorW2_IN2 10 //모터드라이버의 motorW1_IN2부분을 8번에 연결했다고 알려줌
#define motorW2_IN3 7 //모터드라이버의 motorW2_IN1부분을 9번에 연결했다고 알려줌
#define motorW2_IN4 8 //모터드라이버의 motorW2_IN2부분을 10번에 연결했다고 알려줌
IBusBM IBus; //IBusBm IBus를 지정함
IBusBM IBusSensor; //IBusBm IBusSensor를 지정함
int ch0, ch1, ch2, ch3, ch6 = 0; //변수 ch0, ch1, ch2, ch3, ch6의 값을 0으로 정함
int r22=110; //변수 r22의 값을 110으로 정함
int r23=92; //변수 r23의 값을 92으로 정함
int r24=100; //변수 r24의 값을 100으로 정함
int r25=70; //변수 r25의 값을 70으로 정함
float speed1PWM= 0; //변수 speed1PWM을 0으로 정함
void setup() {
Serial.begin(115200); //시리얼통신을 115200으로 개봉함
IBus.begin(Serial1, IBUSBM_NOTIMER); // Servo iBUS
IBusSensor.begin(Serial2, IBUSBM_NOTIMER); // Sensor iBUS
IBusSensor.addSensor(IBUSS_INTV); // add voltage sensor
}
void loop() {
IBus.loop();
ch0 = IBus.readChannel(0); //채널 1 좌우방향
ch1 = IBus.readChannel(1); //채널 2 전진후진
ch2 = IBus.readChannel(2); //채널 3 현재 기능 없음
ch3 = IBus.readChannel(3); //채널 4 현재 기능 없음
ch6 = IBus.readChannel(6); //채널 7 현재 기능 없음
if (ch0 > 1600)//우회전
{
int R=map(ch1,1600,2000,30,50); //변수 R의 값을 ch1 변수값에서 나오는 1600~2000의 값을 30~50의 값으로 변환한 값으로 정함
delay(100);
speed1PWM=map(ch1,1500,1000,0,255);
analogWrite(motorW1_IN1, speed1PWM);
digitalWrite(motorW1_IN2, LOW);
digitalWrite(motorW1_IN3, HIGH);
digitalWrite(motorW1_IN4, HIGH);
digitalWrite(motorW2_IN1, LOW);
analogWrite(motorW2_IN2, speed1PWM);
digitalWrite(motorW2_IN3, HIGH);
digitalWrite(motorW2_IN4, HIGH);
}
else if (ch0 <1300)//좌회전
{
int R=map(ch1,1600,2000,30,50); //변수 R의 값을 ch1 변수값에서 나오는 1600~2000의 값을 30~50의 값으로 변환한 값으로 정함
delay(100);
speed1PWM=map(ch1,1600,2000,0,255);
digitalWrite(motorW1_IN1, LOW);
analogWrite(motorW1_IN2, speed1PWM);
digitalWrite(motorW1_IN3, HIGH);
digitalWrite(motorW1_IN4, HIGH);
analogWrite(motorW2_IN1, speed1PWM);
digitalWrite(motorW2_IN2, LOW);
digitalWrite(motorW2_IN3, HIGH);
digitalWrite(motorW2_IN4, HIGH);
}
else if (ch1 > 1600) //전진
{
speed1PWM=map(ch1,1600,2000,0,255);
digitalWrite(motorW1_IN1, LOW);
analogWrite(motorW1_IN2, speed1PWM);
digitalWrite(motorW1_IN3, HIGH);
digitalWrite(motorW1_IN4, HIGH);
digitalWrite(motorW2_IN1, LOW);
analogWrite(motorW2_IN2, speed1PWM);
digitalWrite(motorW2_IN3, HIGH);
digitalWrite(motorW2_IN4, HIGH);
}
else if (ch1 < 1500) //후진
{
speed1PWM=map(ch1,1500,1000,0,255);
analogWrite(motorW1_IN1, speed1PWM);
digitalWrite(motorW1_IN2, LOW);
digitalWrite(motorW1_IN3, HIGH);
digitalWrite(motorW1_IN4, HIGH);
analogWrite(motorW2_IN1, speed1PWM);
digitalWrite(motorW2_IN2, LOW);
digitalWrite(motorW2_IN3, HIGH);
digitalWrite(motorW2_IN4, HIGH);
}
else
{
analogWrite(motorW1_IN1, 0);
digitalWrite(motorW1_IN2, LOW);
digitalWrite(motorW1_IN3, HIGH);
digitalWrite(motorW1_IN4, HIGH);
digitalWrite(motorW2_IN1, LOW);
analogWrite(motorW2_IN2, 0);
digitalWrite(motorW2_IN3, HIGH);
digitalWrite(motorW2_IN4, HIGH);
}
}
이제 모터드라이버를 l298n으로 바꾸면서 코드를 다시 한번 수정한다.
#include <IBusBM.h> //IBusBM 라이브러리 생성
#define motorW1_IN1 3 //모터드라이버의 motorW1_IN1부분을 3번에 연결했다고 알려줌
#define motorW1_IN2 4 //모터드라이버의 motorW1_IN2부분을 4번에 연결했다고 알려줌
#define motorW1_IN3 5 //모터드라이버의 motorW2_IN1부분을 5번에 연결했다고 알려줌
#define motorW1_IN4 6 //모터드라이버의 motorW2_IN2부분을 6번에 연결했다고 알려줌
IBusBM IBus; //IBusBm IBus를 지정함
IBusBM IBusSensor; //IBusBm IBusSensor를 지정함
int ch0, ch1, ch2, ch3, ch6 = 0; //변수 ch0, ch1, ch2, ch3, ch6의 값을 0으로 정함
float speed1PWM= 0; //변수 speed1PWM을 0으로 정함
void setup() {
Serial.begin(115200); //시리얼통신을 115200으로 개봉함
IBus.begin(Serial1, IBUSBM_NOTIMER); // Servo iBUS
IBusSensor.begin(Serial2, IBUSBM_NOTIMER); // Sensor iBUS
IBusSensor.addSensor(IBUSS_INTV); // add voltage sensor
}
void loop() {
IBus.loop();
ch0 = IBus.readChannel(0); //채널 1 좌우방향
ch1 = IBus.readChannel(1); //채널 2 전진후진
ch2 = IBus.readChannel(2); //채널 3 현재 기능 없음
ch3 = IBus.readChannel(3); //채널 4 현재 기능 없음
ch6 = IBus.readChannel(6); //채널 7 현재 기능 없음
if (ch0 > 1600)//우회전
{
int R=map(ch1,1600,2000,30,50); //변수 R의 값을 ch1 변수값에서 나오는 1600~2000의 값을 30~50의 값으로 변환한 값으로 정함
delay(100);
speed1PWM=map(ch1,1500,1000,0,255);
analogWrite(motorW1_IN1, speed1PWM);
digitalWrite(motorW1_IN2, LOW);
digitalWrite(motorW1_IN3, LOW);
analogWrite(motorW1_IN4, speed1PWM);
}
else if (ch0 <1300)//좌회전
{
int R=map(ch1,1600,2000,30,50); //변수 R의 값을 ch1 변수값에서 나오는 1600~2000의 값을 30~50의 값으로 변환한 값으로 정함
delay(100);
speed1PWM=map(ch1,1600,2000,0,255);
digitalWrite(motorW1_IN1, LOW);
analogWrite(motorW1_IN2, speed1PWM);
analogWrite(motorW1_IN3, speed1PWM);
digitalWrite(motorW1_IN4, HIGH);
}
else if (ch1 > 1600) //전진
{
speed1PWM=map(ch1,1600,2000,0,255);
analogWrite(motorW1_IN1, speed1PWM);
digitalWrite(motorW1_IN2, LOW);
analogWrite(motorW1_IN3, speed1PWM);
digitalWrite(motorW1_IN4, LOW);
}
else if (ch1 < 1500) //후진
{
speed1PWM=map(ch1,1500,1000,0,255);
digitalWrite(motorW1_IN1, LOW);
analogWrite(motorW1_IN2, speed1PWM);;
digitalWrite(motorW1_IN3, LOW);
analogWrite(motorW1_IN4, speed1PWM);
}
else
{
analogWrite(motorW1_IN1, 0);
digitalWrite(motorW1_IN2, LOW);
analogWrite(motorW1_IN3, 0)
digitalWrite(motorW1_IN4, LOW);
}
}