<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);

}

}