Использование ультразвуковых датчиков и двигателей. Измерение и движение одновременно.

Как измерить расстояние, управляя двигателями? Я использую 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;
}

, 👍1

Обсуждение

пожалуйста, отредактируйте свой пост... опишите проблему, которую вы пытаетесь решить... добавьте любые сообщения об ошибках, которые вы получаете... отформатируйте сообщения об ошибках в виде кода для удобства чтения, @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


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() и четыре другие функции для управления направлением вращения мотора и измерения расстояния.

,