kz ru
Каталог

Проект 10: Ограничение движения умного автомобиля

Блок-схема:

Конкретная логика ограничения движения 4WD умного автомобиля показана в таблице.

Обнаружение:

Датчик трассировки линии
в центре
Обнаружена черная линия: высокий
уровень
Обнаружена белая линия: низкий
уровень
Датчик трассировки линии
слева
Обнаружена черная линия: высокий
уровень
Обнаружена белая линия: низкий
уровень
Датчик трассировки линии
справа
Обнаружена черная линия: высокий
уровень
Обнаружена белая линия: низкий
уровень
Условие Движение
Все три датчика трассировки линии не
обнаруживают черные линии
Двигаться вперед
Любой из трех датчиков трассировки линии
обнаруживает черные линии
Двигаться назад, затем повернуть налево

Схема подключения:

Пины G, V, S1, S2 и S3 датчика трассировки линии подключены к G (GND), V (VCC), D11, D7 и D8 платы расширения датчика. Питание подключается к порту BAT.

Тестовый код:

 

//*************************************************************************
/*
4wd BT Car
lesson 10
Restricting_Smart_Car
https://alash-electronics.kz/blogs/wiki
*/

// Данные от улыбки получены с помощью сенсорного инструмента
#define SDA_Pin A4 // Устанавливаем пин данных на A4
#define SCL_Pin A5 // Устанавливаем пин сигнала на A5
int left_ctrl = 2; // Определение пинов управления направлением группы B мотора
int left_pwm = 5; // Определение пинов управления ШИМ группы B мотора
int right_ctrl = 4; // Определение пинов управления направлением группы A мотора
int right_pwm = 6; // Определение пинов управления ШИМ группы A мотора
int sensor_L = 11; // Определение пина левого датчика трассировки линии
int sensor_M = 7; // Определение пина среднего датчика трассировки линии
int sensor_R = 8; // Определение пина правого датчика трассировки линии
int L_val, M_val, R_val; // Определение этих переменных

void setup() {
Serial.begin(9600); // Начать монитор последовательного порта и установить скорость передачи данных на 9600
pinMode(left_ctrl, OUTPUT); // Установить пины управления направлением группы B мотора как ВЫХОД
pinMode(left_pwm, OUTPUT); // Установить пины управления ШИМ группы B мотора как ВЫХОД
pinMode(right_ctrl, OUTPUT); // Установить пины управления направлением группы A мотора как ВЫХОД
pinMode(right_pwm, OUTPUT); // Установить пины управления ШИМ группы A мотора как ВЫХОД
pinMode(sensor_L, INPUT); // Установить пины левого датчика трассировки линии как ВХОД
pinMode(sensor_M, INPUT); // Установить пины среднего датчика трассировки линии как ВХОД
pinMode(sensor_R, INPUT); // Установить пины правого датчика трассировки линии как ВХОД

pinMode(SCL_Pin, OUTPUT); // Установить пин сигнала часов на вывод
pinMode(SDA_Pin, OUTPUT); // Установить пин данных на вывод
}

void loop() {
tracking(); // Запустить основную программу
}

void tracking() {
L_val = digitalRead(sensor_L); // Считать значение левого датчика трассировки линии
M_val = digitalRead(sensor_M); // Считать значение среднего датчика трассировки линии
R_val = digitalRead(sensor_R); // Считать значение правого датчика трассировки линии

if (L_val == 0 && M_val == 0 && R_val == 0) { // Если не обнаружено черных линий, двигать автомобиль вперед
Car_front();
} else { // В противном случае, если хотя бы один из датчиков обнаруживает черную линию, отъехать назад и повернуть налево
Car_back();
delay(700);
Car_left();
delay(700);
}
}

void Car_front() {
digitalWrite(left_ctrl, HIGH);
analogWrite(left_pwm, 155);
digitalWrite(right_ctrl, HIGH);
analogWrite(right_pwm, 155);
}

void Car_back() {
digitalWrite(left_ctrl, LOW);
analogWrite(left_pwm, 100);
digitalWrite(right_ctrl, LOW);
analogWrite(right_pwm, 100);
}

void Car_left() {
digitalWrite(left_ctrl, LOW);
analogWrite(left_pwm, 100);
digitalWrite(right_ctrl, HIGH);
analogWrite(right_pwm, 155);
}

void Car_right() {
digitalWrite(left_ctrl, HIGH);
analogWrite(left_pwm, 155);
digitalWrite(right_ctrl, LOW);
analogWrite(right_pwm, 100);
}

void Car_Stop() {
digitalWrite(left_ctrl, LOW);
analogWrite(left_pwm, 0);
digitalWrite(right_ctrl, LOW);
analogWrite(right_pwm, 0);
}

// Условия, при которых начинается передача данных
void IIC_start() {
digitalWrite(SDA_Pin, HIGH);
digitalWrite(SCL_Pin, HIGH);
delayMicroseconds(3);
digitalWrite(SDA_Pin, LOW);
delayMicroseconds(3);
digitalWrite(SCL_Pin, LOW);
}

// Указывает на конец передачи данных
void IIC_end() {
digitalWrite(SCL_Pin, LOW);
digitalWrite(SDA_Pin, LOW);
delayMicroseconds(3);
digitalWrite(SCL_Pin, HIGH);
delayMicroseconds(3);
digitalWrite(SDA_Pin, HIGH);
delayMicroseconds(3);
}

// Передача данных
void IIC_send(unsigned char send_data) {
for (byte mask = 0x01; mask != 0; mask <<= 1) // Каждый байт имеет 8 бит и проверяется бит за битом, начиная с наименьшего разряда
{
if (send_data & mask) { // Устанавливает высокий и низкий уровни на пине данных в зависимости от того, является ли каждый бит байта 1 или 0
digitalWrite(SDA_Pin, HIGH);
} else {
digitalWrite(SDA_Pin, LOW);
}
delayMicroseconds(3);
digitalWrite(SCL_Pin, HIGH); // Поднимает пин сигнала часов SCL_Pin для остановки передачи данных
delayMicroseconds(3);
digitalWrite(SCL_Pin, LOW); // Опускает пин сигнала часов SCL_Pin, чтобы изменить СИГНАЛ SDA
}
}
//*************************************************************************

Результат тестирования:

После успешной загрузки кода на плату подключите провода в соответствии со схемой подключения, включите внешний источник питания, а затем переведите переключатель DIP в положение ON. Поместите умный автомобиль в черный круг, и он будет двигаться только по кругу.

Комментарии
Отзывов еще никто не оставлял
Предзаказ
Предзаказ успешно отправлен!
Имя *
Телефон *
Добавить в корзину
Название товара
100 тг
1 шт.
Перейти в корзину
Обратный звонок
Запрос успешно отправлен!
Имя *
Телефон *
Заказ в один клик
С помощью уведомлений о заказе можно не только получать актуальную информацию по заказу, но и иметь быстрый канал связи с магазином