Контролировать скорость двигателя вибратора с помощью ультразвуковых датчиков
Во-первых, спасибо, что нашли время прочитать мой пост.
Я пытаюсь использовать 3 ультразвуковых датчика для управления 3 вибраторами постоянного тока с использованием ШИМ-выхода Arduino. Знаю, довольно просто, но я только новичок. :)
Вот мой код
int trigpin_1 = 2;
int echopin_1 = 3;
int trigpin_2 = 4;
int echopin_2 = 5;
int trigpin_3 = 6;
int echopin_3 = 7;
int motor_1 = 8;
int motor_2 = 9;
int motor_3 = 10;
void setup() {
// поместите сюда свой код установки для однократного запуска:
Serial.begin (9600);
pinMode(trigpin_1, OUTPUT);
pinMode(echopin_1, INPUT);
pinMode(trigpin_2, OUTPUT);
pinMode(echopin_2, INPUT);
pinMode(trigpin_3, OUTPUT);
pinMode(echopin_3, INPUT);
pinMode(motor_1, OUTPUT);
pinMode(motor_2, OUTPUT);
pinMode(motor_3, OUTPUT);
}
void loop() {
// поместите сюда свой основной код для многократного запуска:
long duration, distance;
digitalWrite(trigpin_1, HIGH);
digitalWrite(trigpin_2, HIGH);
digitalWrite(trigpin_3, HIGH);
delayMicroseconds(1000);
digitalWrite(trigpin_1, LOW);
digitalWrite(trigpin_2, LOW);
digitalWrite(trigpin_3, LOW);
duration = pulseIn(echopin_1, HIGH);
duration = pulseIn(echopin_2, HIGH);
duration = pulseIn(echopin_3, HIGH);
distance = (duration/2) /29.1;
if (distance > 200)
{
analogWrite(motor_1, 0);
analogWrite(motor_2, 0);
analogWrite(motor_3, 0);
}
else if(200 == distance > 160)
{
analogWrite(motor_1, 50);
analogWrite(motor_2, 50);
analogWrite(motor_3, 50);
}
else if(160 >= distance > 90)
{
analogWrite(motor_1, 100);
analogWrite(motor_2, 100);
analogWrite(motor_3, 100);
}
else if(90 >= distance > 60)
{
analogWrite(motor_1, 150);
analogWrite(motor_2, 150);
analogWrite(motor_3, 150);
}
else if(60 >= distance > 40)
{
analogWrite(motor_1, 200);
analogWrite(motor_2, 200);
analogWrite(motor_3, 200);
}
else if(40 >= distance)
{
analogWrite(motor_1, 255);
analogWrite(motor_2, 255);
analogWrite(motor_3, 255);
}
Serial.print (distance);
Serial.println (" cm");
delay(100);
}
Но проблема в том, что двигатели постоянного тока будут работать постоянно с рабочим циклом 100%. если кто-нибудь сможет мне помочь, буду благодарен
@, 👍-1
Обсуждение2 ответа
Боюсь, в вашем коде есть некоторые ошибки.
Во-первых, операторы if. Если значения хранятся в порядке убывания, то можно сделать так:
if (distance > 200)
{...}
else if (distance > 160) // Эта точка не будет достигнута, если значение не меньше 200.
{...}
else if (distance > 100)
{...}
Я думаю, вы пытались сделать следующее:
if (distance < 200 && distance > 160)
{...}
но это не обязательно.
Вы считываете длину импульса в одну переменную, перезаписывая предыдущие значения. Это означает, что вы считываете только датчик 3. Если вы хотите усреднить значения, попробуйте это:
duration = pulseIn(echopin_1, HIGH);
duration += pulseIn(echopin_2, HIGH); // берем результат и добавляем его к duration.
duration += pulseIn(echopin_3, HIGH);
duration /= 3; // делим длительность на три и присваиваем результат длительности.
Также я не уверен в расположении ваших датчиков, возможно, они могут мешать друг другу. В этом случае напишите функцию для чтения с датчика и сохранения результатов в массиве.
то есть константа int sensorTriggerPins[] = {2, 4, 6}; константа int sensorEchoPins[] = {3, 5, 7};
long readSensor (const int& triggerPin, const int& eechoPin)
{
digitalWrite(triggerPin, HIGH);
delayMicroseconds(1000);
digitalWrite(triggerPin, LOW);
return pulseIn(echoPin, HIGH);
}
void setup()
{
long duration[3]; // Определяем массив из трех элементов.
for (int sensor = 0; sensor < 3; ++sensor)
{
duration[index] = readSensor(sensorTriggerPin[index], sensorEchoPin[index]);
}
}
Я не знаю, решит ли это все ваши проблемы, но это должно помочь. (Возможно, было бы лучше, если бы вы опубликовали это на форуме Arduino)
PS - Вы можете упростить функцию настройки, если будете использовать массивы для назначения выводов, и то же самое можно сделать и с двигателями., @Code Gorilla
Вы не хотите использовать выходы GPIO для прямого управления двигателями. Скорее всего, вы сожжете свой Arduino с помощью приведенной вами схемы. Как минимум, вам понадобится использовать транзисторы (которые могут выдерживать токовую нагрузку двигателя) для включения/выключения двигателей.
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Как устранить шум от вентилятора 12 В с ШИМ-управлением на низкой скорости
- Вопрос о различных способах подключения платы драйвера двигателя L298N к Arduino и двигателям и их питания.
- Обратное вращение шагового двигателя
- Неиспользуемые контакты в Arduino L293D motor shield?
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Как заставить сервопривод вращаться на угол больше 180°
- Остановка/запуск двигателя постоянного тока с концевыми выключателями и кнопкой включения/выключения
Схему подключения очень сложно прочитать. Было бы лучше прочитать, если бы вы перерисовали его встроенным редактором схем., @Ariser
Действительно ли это «if(160 >= distance > 90)» работает так, как задумано в Arduino? Я не верю, что это происходит в любом варианте C. У вас также есть 3 строки 'duration = ...', поэтому вы просто перезаписываете первые 2 последними., @brhans