Как закодировать светодиодные поворотники на умной машине
Этот вопрос касается того, как добавить указатели поворота на смарт-автомобиль с питанием от 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);
}
}
@NaveenVelusamy, 👍-1
Обсуждение1 ответ
Лучший ответ:
Как предложил Крисл, добавьте светодиодный код к функциям «вперед», «назад», «влево» и «вправо».
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);
//...
}
- Как повторить кусок кода
- Данные DHT11 из Arduino UNO в Firebase через ESP8266
- Объяснение кода MPU6050
- Arduino Мигает двумя светодиодами без задержки (количество повторений)
- Как я могу прервать задержку() при нажатии кнопки?
- Проблема с открытием нескольких текстовых файлов одновременно/по порядку с использованием <SD.h>
- Как увеличить срок службы EEPROM?
- Как остановить серводвигатель в текущем положении при использовании последовательного порта? Я хочу, чтобы он оставался в одном положении при получении «0».
Это довольно много кода. Ты сам это написал? Что именно мешает вам добавить светодиоды, которые вы включаете и выключаете с помощью
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