BASIC4MCU | 질문게시판 | dc모터 제어 관련 질문 드려요 ㅠㅠ!!
페이지 정보
작성자 dpwl 작성일2023-06-06 15:25 조회527회 댓글2건본문
1. Lcd화면과 버튼 2개 & 컨베이어벨트(DC모터)와 초음파센서 3개 사용
2. 서보모터 2개 & 워터펌프 1개
=> 아두이노 UART 통신 사용
<아두이노 1> 3번째 초음파센서 최종 작동이 끝난 후, 몇 초뒤 DC모터도 작동이 끝납니다. (노란색 하이라이트 부분)
다시 전체 재구동하고 싶은데 벨트(DC모터)만 움직이고 다른 센서들이 작동을 안합니다 ..
그리고 처음 구동하기 전에 버튼(a)을 눌러서 재구동 하고 싶은데 도와주세요 !
<아두이노 우노 1&아두이노 우노 2> UART 통신 했을 시 다른 건 다 작동이 되는데 우노2 서보모터 2개가 구동을 안합니다. ㅠㅠ
코딩 한번 봐주시면 감사하겠습니다 .
#include <LiquidCrystal_I2C.h> // 아두이노 1
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
int switch_ = 0; // while 문 탈출을 위한 변수
unsigned long previousMillis = 0; // 이전 시간
long interval = 5000; /
int IN1 = 3;
int IN2 = 4;
int ENA = 5;
int trig_1 = 7; // 초음파 1
int echo_1 = 6;
int trig_2 = 9; // 초음파2
int echo_2 = 8;
int trig_3 = 10; // 초음파3
int echo_3 = 11;
int button_a = 12;
int button_b = 13;
int a_status = 0;
int b_status = 0;
int preva_status = 0;
int prevb_status = 0;
long distance_return(int trig, int echo);
void motor_go(int IN1, int IN2, int ENA);
void motor_go_slow(int IN1, int IN2, int ENA);
void motor_stop(int IN1, int IN2);
void sensor_Print(long distance);
void motor_too_slow(int IN1, int IN2, int ENA);
void setup()
{
Serial.begin(9600);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(trig_1, OUTPUT);
pinMode(echo_1, INPUT);
pinMode(trig_2, OUTPUT);
pinMode(echo_2, INPUT);
pinMode(trig_3, OUTPUT);
pinMode(echo_3, INPUT);
pinMode(ENA, OUTPUT);
pinMode(button_a, INPUT);
pinMode(button_b, INPUT);
lcd.init();
lcd.backlight();
}
void loop()
{
while (switch_ == 0)
{
long new_distance_1 = distance_return(trig_1, echo_1);
long new_distance_2 = distance_return(trig_2, echo_2);
long new_distance_3 = distance_return(trig_3, echo_3);
if (new_distance_1 < 50)
{
lcd.setCursor(0,0);
lcd.print(" a) Chocolate "); // 문구를 출력합니다.
lcd.setCursor(0,1);
lcd.print(" b) Banana ");
unsigned long currentMillis = millis();
previousMillis = currentMillis;
char num;
a_status = digitalRead(12);
b_status = digitalRead(13);
while (currentMillis - previousMillis <= 8000)// lcd선택+버튼 눌린 총 시간 약 7초
{
a_status = digitalRead(12);
b_status = digitalRead(13);
delay(300);
motor_stop(IN1, IN2);
if(a_status > preva_status)
{
lcd.clear();
lcd.setCursor(0,0); // 1번째 줄 0번째 셀부터 입력하게 합니다.
lcd.print(" Good Choice! ");
lcd.setCursor(0,1); // 1번째 줄 0번째 셀부터 입력하게 합니다.
lcd.print(" Chocolate! ");
Serial.print("A");
}
else if(b_status > prevb_status)
{
lcd.clear();
lcd.setCursor(0,0); // 1번째 줄 0번째 셀부터 입력하게 합니다.
lcd.print(" Good Choice! ");
lcd.setCursor(0,1); // 1번째 줄 0번째 셀부터 입력하게 합니다.
lcd.print(" Banana! ");
Serial.print("B");
}
currentMillis = millis();
}
if (currentMillis - previousMillis >= 8000)
{
lcd.clear();
motor_go(IN1, IN2, ENA);
delay(2000);
}
}
else if (new_distance_2 < 50)
{
lcd.setCursor(0,0);
lcd.print(" Topping? "); // 문구를 출력합니다.
lcd.setCursor(0,1);
lcd.print(" a) YES b) NO ");
unsigned long currentMillis = millis();
previousMillis = currentMillis;
a_status = digitalRead(12);
b_status = digitalRead(13);
char num;
while (currentMillis - previousMillis <= 8000)
{
a_status = digitalRead(12);
b_status = digitalRead(13);
delay(300);
motor_stop(IN1, IN2);
if(a_status > preva_status)
{
lcd.clear();
lcd.setCursor(0,0); // 1번째 줄 0번째 셀부터 입력하게 합니다.
lcd.print(" Good Choice! ");
lcd.setCursor(0,1); // 1번째 줄 0번째 셀부터 입력하게 합니다.
lcd.print(" YES! ");
Serial.print("a");
}
else if(b_status > prevb_status)
{
lcd.clear();
lcd.setCursor(0,0); // 1번째 줄 0번째 셀부터 입력하게 합니다.
lcd.print(" Good Choice! ");
lcd.setCursor(0,1); // 1번째 줄 0번째 셀부터 입력하게 합니다.
lcd.print(" NO ");
Serial.print("b");
}
currentMillis = millis();
}
if (currentMillis - previousMillis >= 8000)
{
lcd.clear();
motor_go(IN1, IN2, ENA);
delay(2000);
}
}
else if (new_distance_3 < 50)
{
lcd.setCursor(0,0);
lcd.print(" Milk ? "); // 문구를 출력합니다.
lcd.setCursor(0,1);
lcd.print(" a) YES b) NO ");
unsigned long currentMillis = millis();
previousMillis = currentMillis;
char num;
a_status = digitalRead(12);
b_status = digitalRead(13);
while (currentMillis - previousMillis <= 20000)// 우유시간 맞춰서 수정해야함 19초
{
a_status = digitalRead(12);
b_status = digitalRead(13);
delay(300);
motor_stop(IN1, IN2);
if(a_status > preva_status)
{
lcd.clear();
lcd.setCursor(0,0); // 1번째 줄 0번째 셀부터 입력하게 합니다.
lcd.print(" Good Choice! ");
lcd.setCursor(0,1); // 1번째 줄 0번째 셀부터 입력하게 합니다.
lcd.print(" YES! ");
Serial.print("c");
}
else if(b_status > prevb_status)
{
lcd.clear();
lcd.setCursor(0,0); // 1번째 줄 0번째 셀부터 입력하게 합니다.
lcd.print(" Good Choice! ");
lcd.setCursor(0,1); // 1번째 줄 0번째 셀부터 입력하게 합니다.
lcd.print(" NO ");
Serial.print("d");
}
currentMillis = millis();
}
if (currentMillis - previousMillis >= 20000)
{
lcd.clear();
switch_ = 1;
// previousMillis = 0 ;
motor_go_slow(IN1, IN2, ENA);
motor_stop (IN1, IN2);
delay(5000);
}
}
prevb_status = b_status;
preva_status = a_status;
motor_go(IN1, IN2, ENA);
}
}
long distance_return(int trig, int echo)
{
long duration, distance;
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
duration = pulseIn(echo, HIGH);
distance = duration * 170 / 1000 ;
return distance;
}
void sensor_Print(long distance)
{
Serial.print("거리: ");
Serial.print(distance);
Serial.println("mm");
delay(100);
}
void motor_go(int IN1, int IN2, int ENA)
{
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(ENA, 225);
}
void motor_go_slow(int IN1, int IN2, int ENA) // 벨트 천천히
{
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
for(int pwm = 225; pwm > 0; pwm-=50)
{
analogWrite(ENA, pwm);
delay(2000);
}
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
}
void motor_stop(int IN1, int IN2)
{
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
}
#include <Servo.h> // 아두이노 2
Servo servo;
Servo servo2;
int IN1 = 7;
int IN2 = 6;
int speed1 = 8; // ENA pwm 조절 0~255
void setup() {
Serial.begin(9600);
servo.attach(13);
servo2.attach(12);
pinMode(speed1, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
}
void loop() {
if(Serial.available())
{
char Data = Serial.read();
if(Data == 'A')
{
servo.write(90);
delay(1000);
}
else if (Data == 'B')
{
servo.write(180);
delay(1000);
}
else if (Data == 'a')
{
servo2.write(90);
delay(1000);
}
else if (Data == 'b')
{
servo2.write(0);
}
else if (Data == 'c')
{
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(speed1, 255);
delay(5000);
}
else if (Data == 'd')
{
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(speed2, 255);
delay(5000);
}
servo.write(90);
servo2.write(90);
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
analogWrite(speed1, 0);
}
}
댓글 2
조회수 527master님의 댓글
master 작성일
int speed1 = 8; // ENA pwm 조절 0~255
8번은 pwm핀이 아닙니다. 9번으로 이동하세요
//
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(speed2, 255);
IN3,IN4,speed2핀은 어디에서 선언 했을까요?
//
서보모터가 동작하지 않는다면
서보모터 코드만 간단히 넣어서 동작체크를 하세요
전원장치의 전류가 부족하면 서보모터가 동작하지 않을 수 있습니다.
5V 2A이상의 아답터를 사용해서 전원을 공급하세요
dpwl님의 댓글
dpwl 작성일
아 speed2부분 삭제한다는 걸 깜박했네요 ㅠ!
넵 답변 감사합니다 !!!!