Как использовать два ультразвуковых датчика для управления двигателем 5 Вольт?
Я подключил к макетной плате два ультразвуковых датчика, а также установил двигатель на 5 В. Я также установил диод и установил обычную настройку. Я легко могу управлять мотором с помощью одного датчика.
Я хочу, чтобы двигатель работал, скажем, со скоростью 100, как только я его запущу:
- Первый датчик следует использовать для медленного замедления двигателя, когда перед ним находится объект.
- Второй датчик следует использовать для медленного ускорения двигателя, когда перед ним находится объект.
Я не хочу, чтобы скорость возвращалась к 100 после удаления объекта. Скорость должна оставаться той же, в зависимости от того, какой датчик использовался.
Если мне нужно что-то уточнить, сообщите мне в комментариях.
Код
int motorPin = 9;
int trigPin = 13;
int echoPin = 12;
int trigPin2 = 5;
int echoPin2 = 4;
void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT);
pinMode(motorPin, OUTPUT);
}
void loop() {
int duration, distance;
digitalWrite (trigPin, HIGH);
delayMicroseconds (1000);
digitalWrite (trigPin, LOW);
duration = pulseIn (echoPin, HIGH);
distance = (duration/2) / 29.1;
if (distance < 20) { // Расстояние от датчика
analogWrite (motorPin, 50);
} else {
int duration, distance;
digitalWrite (trigPin2, HIGH);
delayMicroseconds (1000);
digitalWrite (trigPin2, LOW);
duration = pulseIn (echoPin2, HIGH);
distance = (duration/2) / 29.1;
if (distance > 20) { // Расстояние от датчика
analogWrite (motorPin, 150);
}
if (distance > 20) { // Расстояние от датчика
Serial.println("Out of range");
} else {
Serial.print(distance);
Serial.println(" cm");
}
delay(500);
}
}
1 ответ
Это очень просто с помощью инструкции map()
. Вот код, который вы могли бы использовать (не стесняйтесь изменять значения):
int speed = 112 + map(distance, 0, 20, 0, 112) - map(distance2, 0, 20, 0, 112);
Так что если бы оба датчика давали одинаковые значения, они бы смещали друг друга. Чтобы это работало, если объект удален, вы могли бы просто использовать последнее значение distance
/distance_2
и обновить другое.
Одной из проблем этого подхода является то, что если линия преобразования объекта не перпендикулярна линии пингов, то значение будет:
10 → 11 → 12 → 13 → 14 → 15 → 16 → 17 → 18 → 19 → 20 → [Вне диапазона]
Я добавил несколько красивых анимаций, чтобы показать вам, что я имею в виду:
Перпендикулярно:
Коллинеарно:
Насколько я понимаю, это то, что вы хотите:
int motorPin = 9;
int trigPin = 13;
int echoPin = 12;
int trigPin2 = 5;
int echoPin2 = 4;
int postdist = 112;
int postdist2 = 112;
void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT);
pinMode(motorPin, OUTPUT);
}
void loop() {
//Первое чтение
int duration, distance;
digitalWrite (trigPin, HIGH);
delayMicroseconds (1000);
digitalWrite (trigPin, LOW);
duration = pulseIn (echoPin, HIGH);
distance = (duration/2) / 29.1;
int ltol = postdist - 5;
int htol = postdist + 5;
if (distance > 20 || !(distance > ltol && distance < htol)) { // Расстояние от датчика
Serial.println("Out of range");
distance = postdist;
}
//Второе чтение
int duration2, distance2;
digitalWrite (trigPin2, HIGH);
delayMicroseconds (1000);
digitalWrite (trigPin2, LOW);
duration2 = pulseIn (echoPin2, HIGH);
distance2 = (duration2/2) / 29.1;
int ltol2 = postdist2 - 5;
int htol2 = postdist2 + 5;
if (distance2 > 20 || !(distance2 > ltol2 && distance2 < htol2)) { // Расстояние от датчика
Serial.println("Out of range");
distance2 = postdist2;
}
//Математика:
Serial.print("Distances-1: ");
Serial.print(distance);
Serial.print(" cm 2: ");
Serial.print("Distances-1: ");
Serial.print(distance2);
Serial.println(" cm");
postdist = distance;
postdist2 = distance2;
int speed = 112 + map(distance, 0, 20, 0, 112) - map(distance2, 0, 20, 0, 112);
if(speed < 60) {speed = 60;} //Измените 60 в соответствии с вашими требованиями к минимальному порогу
analogWrite (motorPin, speed);
Serial.print("Motor Speed: ");
Serial.println(speed);
delay(500);
}
Список изменений: забыл отредактировать postdist
/postdist2
в конце цикла, добавил минимальный порог, предотвратил очень небольшие изменения напряжения, чтобы поддерживать напряжение стабильным и предотвращать шум.
Спасибо за помощь. Всякий раз, когда я пытаюсь сделать так, как вы написали выше, мотор ведет себя странно. Странно, он просто внезапно перестает работать, а затем снова начинает работать., @Master Ivin ChickenSheep
Можете ли вы подтвердить, что вы используете транзистор для управления двигателем (не подключайте его напрямую к выводу Arduino)? Кроме того, вам следует использовать диод обратного хода параллельно с ним., @jfpoilpret
Да, я использую транзистор и диод., @Master Ivin ChickenSheep
[Создан чат](http://chat.stackexchange.com/rooms/14000/discussion-between-anno-and-masterivinchickensheep), @Anonymous Penguin
- Какова работа pulseIn?
- Сколько датчиков может поддерживать один модуль Arduino?
- Получение BPM из данного кода
- Как подключить более 10 датчиков к Arduino uno r3
- Чтение датчика давления от 4 до 20 мА с использованием uno
- Что выбрать между датчиками температуры и влажности: AM230x или DHT22?
- SRF04 Ультразвуковой датчик - неточные показания
- (Код ультразвукового датчика: такого файла или каталога нет)
"100" — это половина скорость?, @Anonymous Penguin
хм, максимум 225, так что я предполагаю, что половинная скорость должна быть около 112. но да, в моей концепции это половинная скорость, @Master Ivin ChickenSheep
Что вы хотите, чтобы произошло, если оба объекта одновременно находились спереди и сзади робота? Эту проблему можно решить, если вы запишете все возможные комбинации, то есть, насколько я понимаю, 4 комбинации., @Adel Bibi
Что ж, чего я хочу, когда два объекта сохранялись одновременно, так это того, чтобы скорость становилась нормальной (по умолчанию), как в 100., @Master Ivin ChickenSheep
Есть ли то же самое, но с Raspberry Pi и HAT-расширением/драйвером PWM от adafruit? Тот же ультразвуковой датчик и один мотор. Я пытаюсь увеличить скорость двигателя, когда что-то близко к двигателю (также в обратном направлении), и поддерживать работу двигателя вперед, как обычно, если объект находится далеко., @user1642131