Использование ультразвуковых датчиков и двигателей. Измерение и движение одновременно.
Как измерить расстояние, управляя двигателями? Я использую Arduino UNO.
#include <Wire.h>
int motor12pin1 = 2;
int motor12pin2 = 3;
int motor34pin1 = 4;
int motor34pin2 = 5;
int pinJacina12 = 9;
int pinJacina34 = 10;
const int trigPin = 7;
const int echoPin = 8;
int zujPin = 11;
int broj = 0;
int upaljen_kod = 0;
void setup() {
Wire.begin(13); // подключаемся к шине I2C с адресом №8
Wire.onReceive(receiveEvent); // регистрируем событие
Serial.begin(9600); // запуск последовательного порта для вывода
pinMode(motor12pin1, OUTPUT);
pinMode(motor12pin2, OUTPUT);
pinMode(motor34pin1, OUTPUT);
pinMode(motor34pin2, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
loop() {
long duration, inches, cm;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
inches = microsecondsToInches(duration);
cm = microsecondsToCentimeters(duration);
Serial.print(inches);
Serial.print("in, ");
Serial.print(cm);
Serial.print("cm");
Serial.println();
if (cm == 100) {
digitalWrite(zujPin, HIGH);
} else {
digitalWrite(zujPin, LOW);
}
delay(100);
}
}
long microsecondsToInches(long microseconds) {
return microseconds / 74 / 2;
}
long microsecondsToCentimeters(long microseconds) {
return microseconds / 29 / 2;
}
void loop() {
analogWrite(pinJacina12,100);
analogWrite(pinJacina34,100);
if((broj == 0)&&(upaljen_kod == 1)) {
digitalWrite(motor12pin1, HIGH);
digitalWrite(motor12pin2, LOW);
digitalWrite(motor34pin1, HIGH);
digitalWrite(motor34pin2, LOW);
delay(1000);
digitalWrite(motor12pin1, LOW);
digitalWrite(motor12pin2, LOW);
digitalWrite(motor34pin1, LOW);
digitalWrite(motor34pin2, LOW);
delay(10000);
digitalWrite(motor12pin1, LOW);
digitalWrite(motor12pin2, HIGH);
digitalWrite(motor34pin1, LOW);
digitalWrite(motor34pin2, HIGH);
delay(1000);
digitalWrite(motor12pin1, LOW);
digitalWrite(motor12pin2, LOW);
digitalWrite(motor34pin1, LOW);
digitalWrite(motor34pin2, LOW);
upaljen_kod = 0;
delay(10000);
}
if((broj == 1)&&(upaljen_kod == 1)) {
digitalWrite(motor12pin1, HIGH);
digitalWrite(motor12pin2, LOW);
digitalWrite(motor34pin1, HIGH);
digitalWrite(motor34pin2, LOW);
delay(2000);
digitalWrite(motor12pin1, LOW);
digitalWrite(motor12pin2, LOW);
digitalWrite(motor34pin1, LOW);
digitalWrite(motor34pin2, LOW);
delay(10000);
digitalWrite(motor12pin1, LOW);
digitalWrite(motor12pin2, HIGH);
digitalWrite(motor34pin1, LOW);
digitalWrite(motor34pin2, HIGH);
delay(2000);
digitalWrite(motor12pin1, LOW);
digitalWrite(motor12pin2, LOW);
digitalWrite(motor34pin1, LOW);
digitalWrite(motor34pin2, LOW);
upaljen_kod = 0;
delay(10000);
}
if((broj == 2)&&(upaljen_kod == 1)) {
digitalWrite(motor12pin1, HIGH);
digitalWrite(motor12pin2, LOW);
digitalWrite(motor34pin1, HIGH);
digitalWrite(motor34pin2, LOW);
delay(3000);
digitalWrite(motor12pin1, LOW);
digitalWrite(motor12pin2, LOW);
digitalWrite(motor34pin1, LOW);
digitalWrite(motor34pin2, LOW);
delay(10000);
digitalWrite(motor12pin1, LOW);
digitalWrite(motor12pin2, HIGH);
digitalWrite(motor34pin1, LOW);
digitalWrite(motor34pin2, HIGH);
delay(3000);
digitalWrite(motor12pin1, LOW);
digitalWrite(motor12pin2, LOW);
digitalWrite(motor34pin1, LOW);
digitalWrite(motor34pin2, LOW);
upaljen_kod = 0;
delay(10000);
}
if((broj == 3)&&(upaljen_kod == 1)) {
digitalWrite(motor12pin1, HIGH);
digitalWrite(motor12pin2, LOW);
digitalWrite(motor34pin1, HIGH);
digitalWrite(motor34pin2, LOW);
delay(4000);
digitalWrite(motor12pin1, LOW);
digitalWrite(motor12pin2, LOW);
digitalWrite(motor34pin1, LOW);
digitalWrite(motor34pin2, LOW);
delay(10000);
digitalWrite(motor12pin1, LOW);
digitalWrite(motor12pin2, HIGH);
digitalWrite(motor34pin1, LOW);
digitalWrite(motor34pin2, HIGH);
delay(4000);
digitalWrite(motor12pin1, LOW);
digitalWrite(motor12pin2, LOW);
digitalWrite(motor34pin1, LOW);
digitalWrite(motor34pin2, LOW);
upaljen_kod = 0;
delay(10000);
}
}
void receiveEvent(int howMany) {
int x = Wire.read(); // получить байт как целое число
Serial.println(x); // вывести целое число
broj = x;
upaljen_kod = 1;
}
@Janko, 👍1
Обсуждение1 ответ
▲ 2
В вашем текущем коде есть проблемы, требующие исправления. Многоцикловые функции не поддерживаются в Arduino. Пожалуйста, отредактируйте следующим образом:
#include <Wire.h>
int motor12pin1 = 2;
int motor12pin2 = 3;
int motor34pin1 = 4;
int motor34pin2 = 5;
int pinJacina12 = 9;
int pinJacina34 = 10;
const int trigPin = 7;
const int echoPin = 8;
int zujPin = 11;
int broj = 0;
int upaljen_kod = 0;
unsigned long motorStartTime = 0;
bool motorRunning = false;
int motorRunTime = 0;
void setup() {
Wire.begin(13);
Wire.onReceive(receiveEvent);
Serial.begin(9600);
pinMode(motor12pin1, OUTPUT);
pinMode(motor12pin2, OUTPUT);
pinMode(motor34pin1, OUTPUT);
pinMode(motor34pin2, OUTPUT);
pinMode(pinJacina12, OUTPUT);
pinMode(pinJacina34, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(zujPin, OUTPUT);
}
// Функция измерения расстояния
long getDistanceCM() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
return duration / 29 / 2;
}
// Функция управления двигателями
void moveMotors(int runTime) {
analogWrite(pinJacina12, 100);
analogWrite(pinJacina34, 100);
digitalWrite(motor12pin1, HIGH);
digitalWrite(motor12pin2, LOW);
digitalWrite(motor34pin1, HIGH);
digitalWrite(motor34pin2, LOW);
motorStartTime = millis();
motorRunTime = runTime;
motorRunning = true;
}
void stopMotors() {
digitalWrite(motor12pin1, LOW);
digitalWrite(motor12pin2, LOW);
digitalWrite(motor34pin1, LOW);
digitalWrite(motor34pin2, LOW);
motorRunning = false;
}
void loop() {
long distance = getDistanceCM();
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
// Включить зуммер, если расстояние ровно 100 см
digitalWrite(zujPin, (distance == 100) ? HIGH : LOW);
// Если последовательность мотора запущена, проверяем, прошло ли время
if (motorRunning && (millis() - motorStartTime >= motorRunTime)) {
stopMotors();
delay(5000); // Пауза перед следующей командой
upaljen_kod = 0;
}
// Запустить команду двигателя, если получены новые данные
if (upaljen_kod == 1 && !motorRunning) {
switch (broj) {
case 0: moveMotors(1000); break;
case 1: moveMotors(2000); break;
case 2: moveMotors(3000); break;
case 3: moveMotors(4000); break;
}
}
delay(100); // Короткая задержка для стабилизации показаний датчика
}
void receiveEvent(int howMany) {
int x = Wire.read();
Serial.println(x);
broj = x;
upaljen_kod = 1;
}
В моём коде, в отличие от исходного кода, есть только одна функция loop(). Есть функция setup() и четыре другие функции для управления направлением вращения мотора и измерения расстояния.
,
@liaifat85
Смотрите также:
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- avrdude ser_open() can't set com-state
- Как подключиться к Arduino с помощью WiFi?
- Mac OSX Yosemite не отображает последовательные порты для Uno R3
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
пожалуйста, отредактируйте свой пост... опишите проблему, которую вы пытаетесь решить... добавьте любые сообщения об ошибках, которые вы получаете... отформатируйте сообщения об ошибках в виде кода для удобства чтения, @jsotola
Похоже, у вас две учётные записи: [1](https://arduino.stackexchange.com/users/117270/janko) и [2](https://arduino.stackexchange.com/users/117287/janko). Пожалуйста, прочтите [Я случайно создал две учётные записи; как их объединить?](https://arduino.stackexchange.com/help/merging-accounts). Обратите внимание, что зарабатывать репутацию, отвечая на собственные сообщения или редактируя их, используя вторую учётную запись, не приветствуется., @Greenonline