Как закодировать светодиодные поворотники на умной машине

Этот вопрос касается того, как добавить указатели поворота на смарт-автомобиль с питанием от Arduino. У меня есть 4 светодиода для указания поворота на моей умной машине (следование по линии, система предотвращения препятствий, управление с мобильного телефона через Bluetooth, а также ИК-пульт дистанционного управления)

Может ли кто-нибудь помочь мне изменить код таким образом, чтобы я мог добавить светодиодные указатели поворота? (Я совершенно новичок в Arduino)

Хочется, чтобы два передних светодиода были высокого уровня одновременно, когда машина движется вперед и когда машина движется назад, мне нужны два задних светодиода одновременно. мне также нужны два правых светодиода высокого уровня одновременно, когда он поворачивает направо, и мне нужны два левых светодиода высокого уровня одновременно, когда он поворачивает налево.

это код

#include <IRremote.h>
#include <Servo.h>

//Назначения контактов и глобальные переменные для каждой функции. Настройте, если необходимо
//*******Назначение контактов Плата двигателя и ИК-приемник********************
const int MotorRight1 = 7;
const int MotorRight2 = 8;
const int MotorLeft1 = 9;
const int MotorLeft2 = 10;
const int MotorRightPWM = 6;
const int MotorLeftPWM = 11;
const int irReceiverPin = A5;
const int servoPin = A4; //оранжевый провод
int iSpeed = 255; //скорость, диапазон от 0 до 255
const int LedPin=13; 

//******Назначения инфракрасных клавиш*************************************** *****
const long IRfront = 16730805;      //идем прямо: кнопка вверх
const long IRback = 16718055;       //вернуться назад: кнопка вниз
const long IRturnright = 16734885;  //поворот направо: кнопка вправо
const long IRturnleft = 16716015;   //поворот налево: кнопка влево
const long IRstop = 16726215;       //стоп: кнопка ОК
const long IRcny70 = 16754775;      //Автоматический режим CNY70: кнопка EQ
const long IRAutorun = 16750695;    // Ультразвуковой режим: кнопка воспроизведения/паузы
//******Отслеживание назначения контактов и сигналов************************
const int SensorLeft = 5;      //
const int SensorMiddle = 4 ;   //
const int SensorRight = 3;     //
IRrecv irrecv(irReceiverPin);  // сигнал IRrec
decode_results infrared;       // результат декодирования
//*******Назначение и сигналы ультразвуковых контактов**************************
const int echoPin = 12; // ультразвуковой прием = эхо-контакт
const int triggerPin = 13; // ультразвуковой send=триггерный контакт
Servo myservo; // определяем мойсерво
const int degreesForward = 130; //количество градусов для просмотра вперед
const int degreesLeft = 60; //количество градусов, чтобы посмотреть налево
const int degreesRight = 180; //количество градусов, чтобы смотреть направо
const int delay_time = 250; // задержка серводвигателя
const int Fgo = 8; // Езжайте прямо
const int Rgo = 6; // Поверните направо
const int Lgo = 4; // Поверните налево
const int Bgo = 2; // возвращаться
//******Сигналы Bluetooth****************************************** *********
char val; //сохраняет полученный символ. Должен быть глобальным для выполнения непрерывного движения.

//*********Общая НАСТРОЙКА: активировать контакты********************************* *
void setup() {
  //начинаем получать последовательную информацию
  Serial.begin(9600);
  //подключения двигателя
  pinMode(MotorRight1, OUTPUT);  //

  pinMode(MotorRight2, OUTPUT);  //

  pinMode(MotorLeft1,  OUTPUT);  //

  pinMode(MotorLeft2,  OUTPUT);  //
  pinMode(MotorRightPWM, OUTPUT); //включаем правый мотор
  pinMode(MotorLeftPWM, OUTPUT); //включаем правый мотор
  irrecv.enableIRIn();      // запускаем инфракрасное декодирование
  myservo.write(degreesForward);       // заставит голову смотреть вперед

  //черный след
  pinMode(SensorLeft, INPUT);
  pinMode(SensorMiddle, INPUT);
  pinMode(SensorRight, INPUT);

  //Ультразвук
  //digitalWrite(2,HIGH); //для чего нужен этот пин?
  pinMode(echoPin, INPUT);
  pinMode(triggerPin, OUTPUT);
  myservo.attach(servoPin);
}

//***************Функции движения******************************
void advance(int d) { //идем прямо
  digitalWrite(MotorRight1, HIGH);
  digitalWrite(ledrightfrontindicator, HIGH);
  digitalWrite(MotorRight2, LOW);
  digitalWrite(ledrightfrontindicator, LOW);
  digitalWrite(MotorLeft1, HIGH);
  digitalWrite(ledleftfrontindicator, HIGH);
  digitalWrite(MotorLeft2, LOW);
  digitalWrite(ledleftfrontindicator, LOW);
  analogWrite(MotorRightPWM, iSpeed);
  analogWrite(MotorLeftPWM, iSpeed);
  delay(d * 10);
}
void right(int d) { //поворот направо (одно колесо)
  digitalWrite(MotorLeft1, LOW);
  digitalWrite(MotorLeft2, HIGH);
  digitalWrite(MotorRight1, LOW);
  digitalWrite(MotorRight2, LOW);
  analogWrite(MotorRightPWM, iSpeed);
  analogWrite(MotorLeftPWM, iSpeed);
  delay(d * 10);
}
void left(int d) {//поворот налево(одно колесо)
  digitalWrite(MotorRight1, LOW);
  digitalWrite(MotorRight2, HIGH);
  digitalWrite(MotorLeft1, LOW);
  digitalWrite(MotorLeft2, LOW);
  analogWrite(MotorRightPWM, iSpeed);
  analogWrite(MotorLeftPWM, iSpeed);
  delay(d * 10);
}
void turnR(int d) {//поворот направо (два колеса)
  digitalWrite(MotorRight1, HIGH);
  digitalWrite(MotorRight2, LOW);
  digitalWrite(MotorLeft1, LOW);
  digitalWrite(MotorLeft2, HIGH);
  analogWrite(MotorRightPWM, iSpeed);
  analogWrite(MotorLeftPWM, iSpeed);  
  delay(d * 10);
}
void turnL(int d) {//поворот налево (два колеса)
  digitalWrite(MotorRight1, LOW);
  digitalWrite(MotorRight2, HIGH);
  digitalWrite(MotorLeft1, HIGH);
  digitalWrite(MotorLeft2, LOW);
  analogWrite(MotorRightPWM, iSpeed);
  analogWrite(MotorLeftPWM, iSpeed);
  delay(d * 10);
}
void stopp(int d) { //стоп
  digitalWrite(MotorRight1, LOW);
  digitalWrite(MotorRight2, LOW);
  digitalWrite(MotorLeft1, LOW);
  digitalWrite(MotorLeft2, LOW);
  analogWrite(MotorRightPWM, iSpeed);
  analogWrite(MotorLeftPWM, iSpeed);  
  delay(d * 10);
}
void back(int d) { //вернуться назад
  digitalWrite(MotorRight1, LOW);
  digitalWrite(MotorRight2, HIGH);
  digitalWrite(MotorLeft1, LOW);
  digitalWrite(MotorLeft2, HIGH);
  analogWrite(MotorRightPWM, iSpeed);
  analogWrite(MotorLeftPWM, iSpeed);  
  delay(d * 10);
}

//************Ультразвуковой калькулятор расстояния********************************* ****
//определяем расстояние для заданных углов и печатаем char + направление
float getDistance(int degrees, char dir) {
  myservo.write(degrees);
  digitalWrite(triggerPin, LOW); // низкий уровень ультразвукового эха за 2 мкс
  delayMicroseconds(2);
  digitalWrite(triggerPin, HIGH); // высокий уровень ультразвукового эха через 10 мкс, не менее 10 мкс
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW); // низкий уровень ультразвукового эха
  float distance = pulseIn(echoPin, HIGH); // Время Читать
  distance = distance / 5.8 / 10; // превращаем время в расстояние
  Serial.print(dir); //
  Serial.print(" distance: "); //
  Serial.print(int(distance)); // расстояние вывода (мм)
  Serial.print("\n");
  return distance;
}
//*************Принятие решения по направлению ультразвука******************************
//замеры трех углов (спереди, слева, справа)
int getDirectionFromdetection() {
  int Fspeedd = 0; // расстояние спереди
  int Rspeedd = 0; // правильное расстояние
  int Lspeedd = 0; // левое расстояние
  int delay_time = 250; //
  int directionn =0;

  // получаем расстояние до фронта
  Fspeedd = getDistance(degreesForward, 'F');

  // если расстояние меньше 10 мм
  if (Fspeedd < 10) {
    stopp(1); // очищаем вывод
    directionn = Bgo;
  }
  // если расстояние меньше 25 мм
  else if (Fspeedd < 25) {
    stopp(1); // очищаем вывод
    Lspeedd = getDistance(degreesLeft, 'L'); // расстояние обнаружения слева
    delay(delay_time); // ждём стабилизации серводвигателя

    Rspeedd = getDistance(degreesRight, 'R'); // расстояние обнаружения справа
    delay(delay_time); // ждём стабилизации серводвигателя

    // если расстояние слева больше правого
    if (Lspeedd > Rspeedd) {
      directionn = Lgo; // иди налево
    }

    if (Lspeedd <= Rspeedd) {//если расстояние слева меньше, чем справа
      directionn = Rgo; //Иди направо
    }

    if (Lspeedd < 15 && Rspeedd < 15) { //если расстояние меньше 10 мм как справа, так и слева
      directionn = Bgo; //возвращаться
    }
  }
  else {
    directionn = Fgo; //Езжайте прямо
  }
  return directionn;
}

void autoRunUsingUltraSonic() {
  bool stopPressed;
  int directionn = 0; // спереди=8, сзади=2, слева=4, справа=6
  while (IRAutorun) {
    myservo.write(80); // выполняем сброс серводвигателя
    directionn = getDirectionFromdetection();
    stopPressed = stopCommandPressed();
    if (stopPressed) {
      break;
    }
    else if (directionn == Fgo) { //идем прямо
      infrared.value = 0;
      advance(5); //
      Serial.print(" Advance "); //
      Serial.print(" ");
    }
    else if (directionn == Bgo) { //вернуться назад
      infrared.value = 0;
      back(8); //
      turnL(3); //
      Serial.print(" Reverse "); //
    }
    else if (directionn == Rgo) { //повернуть направо
      infrared.value = 0;
      back(1);
      turnR(60); //
      Serial.print(" Right "); //
    }
    else if (directionn == Lgo) { //поворот налево
      infrared.value = 0;
      back(1);
      turnL(60);
      Serial.print(" Left ");
    }
  }
  infrared.value = 0;
}

//***************************Функционал Bluetooth********************* **
//Команды Bluetooth
void bluetoothCommand() {
  if (Serial.available()) { //проверяем, доступна ли команда Bluetooth
    val = Serial.read();
    Serial.write(val);
  }
  if (val == 'F') { // Вперед
    advance(10);
  }
  else if (val == 'S') { // Остановить движение вперед
    stopp(10) ;
    val = Serial.read(); //читаем значение еще раз, иначе продолжить работу с инфракрасным портом невозможно
  }
  else if (val == 'B') { // Назад
    back(10);
  }
  else if (val == 'R') { // Вправо
    turnL(10);
  }
  else if (val == 'L') { // Влево
    turnR(10);
  }
  else if (val == 's') { // Остановка, но не используется
    stopp(10 ) ;
  }
  else if (int(val) >= 49 && int(val) <= 57) { //устанавливаем скорость
    iSpeed = (int(val)-48)*26;
    Serial.println("Speed set to: " + iSpeed); 
  }
  else if (val == 'q') { //устанавливаем скорость
    iSpeed = 255;
    digitalWrite(LedPin,HIGH);   
    Serial.println("Speed set to: " + iSpeed);  
  }
  else if (val == 'W') {
    digitalWrite(LedPin,HIGH);
  }
  else if (val == 'w') {
    digitalWrite(LedPin,LOW);
  }
}

//Проверяем, нажата ли команда остановки на пульте (кнопка 5)
bool stopCommandPressed(){
  bool stopPressed = false;
  if (irrecv.decode(&infrared)) {
    irrecv.resume();
    Serial.println(infrared.value, HEX);
    if (infrared.value == IRstop) {
      stopp(10);
      stopPressed = true;
    }
  }
  return stopPressed;
}

void followBlackLine() {
  bool stopPressed;
  int SL;  //датчик слева
  int SM;  //сенсор средний
  int SR;  //датчик правый
  while (IRcny70) {
    SL = digitalRead(SensorLeft);
    SM = digitalRead(SensorMiddle);
    SR = digitalRead(SensorRight);

    if (SM == HIGH) {//средний датчик в черной области
      if (SL == LOW & SR == HIGH) {//левый датчик в черной области, правый датчик в белой области, поверните налево
        left(0);
      }
      else if (SR == LOW & SL == HIGH) {//левый белый, правый черный, бегите направо
        right(0);
      }
      else { // налево и направо, оба белые, идем прямо
        advance(0);
      }
    }
    // средний датчик в белой области
    else {
      if (SL == LOW & SR == HIGH) { // левый черный, правый белый, повернуть налево
        left(0);
      }
      else if (SR == LOW & SL == HIGH) {
        right(0);
      }
      else {  //слева и справа белые, стоп
        stopp(0);
      }
    }
    stopPressed = stopCommandPressed();
    if (stopPressed) {
      break;
    }
  }
  infrared.value = 0;  
}

//***************************************ГЛАВНЫЙ ЦИКЛЯ******** *******************************
void loop() {
  //команды Bluetooth
  bluetoothCommand();
  //************************************обычный режим дистанционного управления ********
  // успешное декодирование 'получение инфракрасного сигнала
  if (irrecv.decode(&infrared))  {         
    if (infrared.value == IRfront) {
      advance(0); //идем прямо
    }
    else if (infrared.value ==  IRback) {
      back(0); //возвращаться
    }
    else if (infrared.value == IRturnright) {
      turnR(0); // Иди направо
    }
    else if (infrared.value == IRturnleft) {
      turnL(0); // иди налево
    }
    else if (infrared.value == IRstop) {//stop
      stopp(0);
    }
    //*********************следуйте черной линии********cny70 в автоматическом режиме********
    else if (infrared.value == IRcny70) {
      followBlackLine();
    }
    //************************ультразвуковой автоматический режим************************ *****
    else if (infrared.value == IRAutorun ) {
      autoRunUsingUltraSonic();
      myservo.write(degreesForward);       // заставит голову смотреть вперед
    }
    //*********************Подождите немного, прежде чем продолжить*********************** ***
    irrecv.resume();
    delay(300);
  }
  else {
    stopp(0);
  }
}

, 👍-1

Обсуждение

Это довольно много кода. Ты сам это написал? Что именно мешает вам добавить светодиоды, которые вы включаете и выключаете с помощью digitalWrite(), точно так же, как вы активируете моторы., @chrisl

Почему у вас есть этот цикл в вашей функции FollowBlackLine(): while (IRcny70)? `IRcny70 — это константа со значением больше нуля, так что по сути это бесконечный цикл, который трудно читать., @chrisl

То же самое касается autoRunUsingUltraSonic()., @chrisl

Я получил код онлайн, @NaveenVelusamy

я не сам это писал, @NaveenVelusamy

поскольку я новичок, пожалуйста, скажите мне, какие изменения мне придется сделать, чтобы добавить светодиоды., @NaveenVelusamy

мне нужны 2 светодиода спереди и 2 светодиода сзади машины., @NaveenVelusamy

Мне нужны два передних светодиода высокого уровня одновременно, когда машина движется вперед и когда машина движется назад, мне нужны два задних светодиода одновременно., @NaveenVelusamy

мне также нужны два правых светодиода высокого уровня одновременно, когда он поворачивает направо, и мне нужны два левых светодиода высокого уровня одновременно, когда он поворачивает налево, @NaveenVelusamy

То есть никаких морганий и тому подобного? Затем вы можете просто включить соответствующие светодиоды в своих функциях перемещения (back(), advance()) с помощью digitalWrite() и выключить их после delay() с помощью той же функции. Вы смотрели множество примеров, поставляемых с Arduino IDE? Они могут научить вас правильно управлять светодиодами., @chrisl

пожалуйста, не сердись, можешь пожалуйста, сделай это для меня, как я пытался, но не получилось..., @NaveenVelusamy

нужно ли использовать какой-нибудь резистор или что-то в этом роде, чтобы все заработало??, @NaveenVelusamy

Я не злюсь. Но вы не будете довольны платформой Arduino, если не попытаетесь понять, как на самом деле работает ее код. Кроме того, мы не являемся бесплатной службой кодирования. Часть принципа работы этого сайта заключается в том, чтобы сначала изучить тему и опробовать ее, а затем прийти сюда с конкретным вопросом. Одна из причин этого заключается в том, что вам придется снова и снова отвечать на одни и те же вопросы, которые уже неоднократно объяснялись в Интернете. Поэтому сначала узнайте, как работают базовые примеры, такие как «Blink», и как должны быть связаны компоненты. Это все в сети., @chrisl

Этот сайт не является бесплатным сервисом по написанию кода., @gre_gor


1 ответ


Лучший ответ:

0

Как предложил Крисл, добавьте светодиодный код к функциям «вперед», «назад», «влево» и «вправо».

const int LedFrontRight = 21;//change pin numbers
const int LedFrontLeft = 22;
const int LedBackRight = 23;
const int LedBackLeft = 24;

// ...

void setup() {
  // ...
  pinMode(LedFrontRight, OUTPUT);
  pinMode(LedFrontLeft , OUTPUT);
  pinMode(LedBackRight , OUTPUT);
  pinMode(LedBackLeft  , OUTPUT);
}

//**************Movement functions******************************
void advance(int d) { //go straight
  digitalWrite(LedFrontRight, HIGH);
  digitalWrite(LedFrontLeft , HIGH);
  digitalWrite(LedBackRight , LOW);
  digitalWrite(LedBackLeft  , LOW);
  //... 
}
void right(int d) { //turn right (single wheel)
  digitalWrite(LedFrontRight, HIGH);
  digitalWrite(LedFrontLeft , LOW);
  digitalWrite(LedBackRight , HIGH);
  digitalWrite(LedBackLeft  , LOW);
  //... 
}
void left(int d) {//turn left(single wheel)
  digitalWrite(LedFrontRight, LOW);
  digitalWrite(LedFrontLeft , HIGH);
  digitalWrite(LedBackRight , LOW);
  digitalWrite(LedBackLeft  , HIGH);
  //... 
}
void turnR(int d) {//turn right (two wheels)
  digitalWrite(LedFrontRight, HIGH);
  digitalWrite(LedFrontLeft , LOW);
  digitalWrite(LedBackRight , HIGH);
  digitalWrite(LedBackLeft  , LOW);
  //... 
}
void turnL(int d) {//turn left (two wheels)
  digitalWrite(LedFrontRight, LOW);
  digitalWrite(LedFrontLeft , HIGH);
  digitalWrite(LedBackRight , LOW);
  digitalWrite(LedBackLeft  , HIGH);
  //... 
}
void stopp(int d) { //stop
  digitalWrite(LedFrontRight, LOW);
  digitalWrite(LedFrontLeft , LOW);
  digitalWrite(LedBackRight , LOW);
  digitalWrite(LedBackLeft  , LOW);
  //... 
}
void back(int d) { //go back
  digitalWrite(LedFrontRight, LOW);
  digitalWrite(LedFrontLeft , LOW);
  digitalWrite(LedBackRight , HIGH);
  digitalWrite(LedBackLeft  , HIGH);
  //... 
}
,