BASIC4MCU | 질문게시판 | 아두이노 모터+자이로센서+서보모터+led 제어 질문입니다.
페이지 정보
작성자 Mobile 작성일2022-04-21 16:40 조회2,704회 댓글3건본문
#include <MPU6050.h>
#include <I2Cdev.h>
#include <Servo.h>
#include <Wire.h>
MPU6050 mpu;
int16_t ax, ay, az;
int16_t gx, gy, gz;
int en1 = 9;
int in1 = 8;
int in2 = 7;
char ch;
boolean dir;
Servo myservo;
int val;
int prevVal;
void setup()
{
pinMode(en1, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
Wire.begin();
Serial.begin(9600);
Serial.println("Set Motor Direction & Speed");
Serial.println("Initialize MPU");
mpu.initialize();
Serial.println(mpu.testConnection () ? "Connected" : "Connection failed");
myservo.attach(6);
}
void loop()
{
if(Serial.available())
{
ch=Serial.read();
if(ch=='+')
{
int speed=Serial.parseInt();
dir=true;
Serial.print("Motor Direction & Speed : ");
Serial.print("+");
Serial.println(speed);
setMotor(speed, dir);
}
else if(ch == '-')
{
int speed = Serial.parseInt();
dir = false;
Serial.print("Motor Direction & Speed : ");
Serial.print("-");
Serial.println(speed);
setMotor(speed, dir);
}
else
{
analogWrite(en1, 0);
Serial.print("Motor Direction & Speed :");
Serial.println(0);
}
}
mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
val = map(ay, -8191,8191,0,179);
if(val != prevVal)
{
myservo.write(val);
prevVal=val;
}
delay(50);
{
digitalWrite(10, HIGH);
delay(150);
digitalWrite(10, LOW);
delay(150);
digitalWrite(11, HIGH);
delay(150);
digitalWrite(11, LOW);
delay(150);
digitalWrite(12, HIGH);
delay(150);
digitalWrite(12, LOW);
delay(150);
digitalWrite(13, HIGH);
delay(150);
digitalWrite(13, LOW);
delay(150);
}
}
void setMotor(int speed, boolean dir)
{
analogWrite(en1, speed);
digitalWrite(in1, !dir);
digitalWrite(in2, dir);
}
연결하고 구동 시 모터가 회전하지 않고 속도 조절하는걸 넣었는데 조절이 안됩니다. 어떻게 수정해야 할까요
댓글 3
조회수 2,704master님의 댓글
master 작성일
모터 테스트는
다른 코드는 모두 빼고
가장 간단한 모터 구동 예제로 테스트 하세요
Mobile님의 댓글
Mobile
늦게 답변드려 죄송합니다.
모터는 개별로 테스트를 시행해을때 정상구동되는것을 확인하였고, 자이로+서보모터+led는 정상구동하였습니다.
모터를 추가하면 모터만 구동이 되지 않는데 이유를 모르겠습니다..
master님의 댓글
master 작성일
#include <MPU6050.h>
#include <I2Cdev.h>
#include <Servo.h>
#include <Wire.h>
MPU6050 mpu;
Servo myservo;
int en1=9,in1=8,in2=7;
//
int16_t ax,ay,az,gx,gy,gz,val,prevVal;
char ch;
boolean dir;
//
void setup(){
pinMode(en1,OUTPUT); pinMode(in1,OUTPUT); pinMode(in2,OUTPUT);
pinMode(10,OUTPUT); pinMode(11,OUTPUT); pinMode(12,OUTPUT); pinMode(13,OUTPUT);
Wire.begin();
Serial.begin(9600);
Serial.println("Set Motor Direction & Speed"); Serial.println("Initialize MPU");
mpu.initialize();
Serial.println(mpu.testConnection () ? "Connected" : "Connection failed");
myservo.attach(6);
}
//
void loop(){
if(Serial.available()){
ch=Serial.read();
if(ch=='+'){
int speed=Serial.parseInt();
Serial.print("Motor Direction & Speed : "); Serial.print("+"); Serial.println(speed);
dir=true; setMotor(speed,dir);
}
else if(ch=='-'){
int speed=Serial.parseInt();
Serial.print("Motor Direction & Speed : "); Serial.print("-"); Serial.println(speed);
dir=false; setMotor(speed,dir);
}
else{
analogWrite(en1,0);
Serial.print("Motor Direction & Speed :"); Serial.println(0);
}
}
mpu.getMotion6(&ax,&ay,&az,&gx,&gy,&gz);
val=map(ay,-8191,8191,0,179);
if(val!=prevVal){ myservo.write(val); prevVal=val; }
delay(50);
//
digitalWrite(10,1); delay(150); digitalWrite(10,0); delay(150);
digitalWrite(11,1); delay(150); digitalWrite(11,0); delay(150);
digitalWrite(12,1); delay(150); digitalWrite(12,0); delay(150);
digitalWrite(13,1); delay(150); digitalWrite(13,0); delay(150);
}
//
void setMotor(int speed,boolean dir){
analogWrite(en1,speed); digitalWrite(in1,!dir); digitalWrite(in2,dir);
}
1.
Serial.println(speed);
속도 전달이 제대로 되는지 확인하시고, 가급적 255에 가까운 값으로 테스트 하세요
//
2.
en1 핀에 pwm 출력이 제대로 나오는지 확인하시고(테스터기 또는 오실로스코프)
pwm 출력이 제대로 나오지 않는다면 PWM 핀을 변경해서 다시 테스트 하세요
//
3.
전원장치 전류 부족으로 전압강하가 되는지도 체크하세요