Увеличение и уменьшение мощности двигателя Arduino из-за ввода ультразвукового датчика
Я работаю над роботом Arduino, которому нужно следовать за роботом-лидером перед ним. Робот-лидер может ускоряться, замедляться и останавливаться, а мой робот должен иметь возможность следовать за лидером, не врезаясь в него.
У меня работают два датчика, однако мне сложно интегрировать двигатели для увеличения или уменьшения. В настоящее время только одно колесо включается одновременно для правой и левой команд. Как я могу соответствующим образом увеличивать или уменьшать скорость вращения колеса.
int SpRMotor = 5; //скорость правого двигателя
int MotorA1 = 7; //Правый мотор = +
int MotorA2 = 6; //Правый мотор = -
int MotorB1 = 8; // Левый мотор = -
int MotorB2 = 9; // Левый мотор = +
int SpLMotor = 10; //скорость левого двигателя
int TriggerPIN1 = 3;//право
int EchoPIN1 = 2;
int TriggerPIN2 = 12;//слева
int EchoPIN2 = 11;
void setup(){
pinMode(TriggerPIN1,OUTPUT);
pinMode(EchoPIN1,INPUT);
pinMode(TriggerPIN2,OUTPUT);
pinMode(EchoPIN2,INPUT);
pinMode(MotorB1, OUTPUT);
pinMode(MotorB2, OUTPUT);
pinMode(MotorA1, OUTPUT);
pinMode(MotorA2, OUTPUT);
pinMode(SpLMotor, OUTPUT);
pinMode(SpRMotor, OUTPUT);
analogWrite(SpRMotor, 170);
analogWrite(SpLMotor, 170);
Serial.begin(9600);
}
void loop(){
int limit;
int sampledata1, sampledata2;
sampledata1 = distance(TriggerPIN1, EchoPIN1);
Serial.print("distance1: ");
Serial.print(sampledata1);
delay(100);
sampledata2 = distance(TriggerPIN2, EchoPIN2);
Serial.print(" distance2: ");
Serial.println(sampledata2);
delay(100);
limit = 10;
if((15> sampledata1 >= limit)&&(15> sampledata2 >= limit))
{
Serial.print("True");
forward();
delay(100);
}
if (sampledata2 >= 15 )
{turnRight();}
if (sampledata1 >= 15 )
{turnLeft();}
if ((limit > sampledata1)&&(limit> sampledata2 ))
{
Stop();
}
}
void forward(){
digitalWrite(MotorA1, LOW);
digitalWrite(MotorA2, HIGH);
digitalWrite(MotorB1, HIGH);
digitalWrite(MotorB2, LOW);
}
void turnRight(){
digitalWrite(MotorA1, LOW);
digitalWrite(MotorA2, LOW);
digitalWrite(MotorB1, HIGH);
digitalWrite(MotorB2, LOW);
}
void turnLeft(){
digitalWrite(MotorA1, LOW);
digitalWrite(MotorA2, HIGH);
digitalWrite(MotorB1, LOW);
digitalWrite(MotorB2, LOW);
}
void Stop(){
digitalWrite(MotorA1, LOW);
digitalWrite(MotorA2, LOW);
digitalWrite(MotorB1, LOW);
digitalWrite(MotorB2, LOW);
}
int distance(int trig, int echo)
{ digitalWrite(trig,LOW);
delayMicroseconds(2);
digitalWrite(trig,HIGH);
delayMicroseconds(10);
digitalWrite(trig,LOW);
long timedelay = pulseIn(echo,HIGH);
int distance = 0.0343 * (timedelay/2);
return distance;
}
@Mattu, 👍2
1 ответ
Лучший ответ:
Скорость определяется аналоговой записью в SpRMotor
и SpLMotor
. Вы сделали это один раз (со значением 170) в настройках. Если вы используете для этого переменные (например, speedValueL
и speedValueR
), вы можете изменить их значения по мере необходимости и записать их в каналы ШИМ на каждом вперед, назад, влево или верное утверждение.
Краткий пример:
int SpRMotor = 5; //скорость правого двигателя
int MotorA1 = 7; //Правый мотор = +
int MotorA2 = 6; //Правый мотор = -
int MotorB1 = 8; // Левый мотор = -
int MotorB2 = 9; // Левый мотор = +
int SpLMotor = 10; //скорость левого двигателя
int TriggerPIN1 = 3;//право
int EchoPIN1 = 2;
int TriggerPIN2 = 12;//слева
int EchoPIN2 = 11;
int speedValueL = 0;
int speedValueR = 0;
void setup()
{
pinMode(TriggerPIN1,OUTPUT);
pinMode(EchoPIN1,INPUT);
pinMode(TriggerPIN2,OUTPUT);
pinMode(EchoPIN2,INPUT);
pinMode(MotorB1, OUTPUT);
pinMode(MotorB2, OUTPUT);
pinMode(MotorA1, OUTPUT);
pinMode(MotorA2, OUTPUT);
pinMode(SpLMotor, OUTPUT);
pinMode(SpRMotor, OUTPUT);
analogWrite(SpRMotor, speedValueR);
analogWrite(SpLMotor, speedValueL);
Serial.begin(9600);
}
void loop()
{
int limit;
int sampledata1, sampledata2;
sampledata1 = distance(TriggerPIN1, EchoPIN1);
Serial.print("distance1: ");
Serial.print(sampledata1);
delay(100);
sampledata2 = distance(TriggerPIN2, EchoPIN2);
Serial.print(" distance2: ");
Serial.println(sampledata2);
delay(100);
limit = 10;
if( (15> sampledata1 >= limit) && (15> sampledata2 >= limit) )
{
Serial.print("True");
// Просто мое предположение - делайте то, что вам подходит
speedValueL = 170;
speedValueR = 170;
forward();
delay(100);
}
if (sampledata2 >= 15 )
{
// Просто мое предположение - делайте то, что вам подходит
speedValueL = 200;
speedValueR = 0;
turnRight();
}
if (sampledata1 >= 15 )
{
// Просто мое предположение - делайте то, что вам подходит
speedValueL = 0;
speedValueR = 200;
turnLeft();
}
if ( ( limit > sampledata1 ) && ( limit> sampledata2 ) )
{
// Просто мое предположение - делайте то, что вам подходит
speedValueL = 0;
speedValueR = 0;
Stop();
}
}
void forward()
{
analogWrite(SpRMotor, speedValueR);
analogWrite(SpLMotor, speedValueL);
digitalWrite(MotorA1, LOW);
digitalWrite(MotorA2, HIGH);
digitalWrite(MotorB1, HIGH);
digitalWrite(MotorB2, LOW);
}
void turnRight()
{
analogWrite(SpRMotor, speedValueR);
analogWrite(SpLMotor, speedValueL);
digitalWrite(MotorA1, LOW);
digitalWrite(MotorA2, LOW);
digitalWrite(MotorB1, HIGH);
digitalWrite(MotorB2, LOW);
}
void turnLeft()
{
analogWrite(SpRMotor, speedValueR);
analogWrite(SpLMotor, speedValueL);
digitalWrite(MotorA1, LOW);
digitalWrite(MotorA2, HIGH);
digitalWrite(MotorB1, LOW);
digitalWrite(MotorB2, LOW);
}
void Stop()
{
analogWrite(SpRMotor, speedValueR);
analogWrite(SpLMotor, speedValueL);
digitalWrite(MotorA1, LOW);
digitalWrite(MotorA2, LOW);
digitalWrite(MotorB1, LOW);
digitalWrite(MotorB2, LOW);
}
int distance( int trig, int echo )
{
digitalWrite( trig, LOW );
delayMicroseconds( 2 );
digitalWrite( trig, HIGH );
delayMicroseconds( 10 );
digitalWrite( trig, LOW );
long timedelay = pulseIn( echo, HIGH );
int distance = 0.0343 * ( timedelay / 2);
return distance;
}
- Как использовать SPI на Arduino?
- Библиотека DHT.h не импортируется
- Светодиоды: разница между общим анодом и общим катодом
- Как повторить кусок кода
- Почему эта программа на C++ не может прочитать Serial.write() моего arduino?
- Как изменить переменную при нажатии кнопки, подключенной к контакту 2
- Отображение двоичных данных на светодиодах
- Корпус кнопки и переключателя