kz ru
Каталог

Проект 11: Умный автомобиль для трассировки линии

Блок-схема:

 Обнаружение Датчик трассировки линии в центре Обнаружена черная линия: ВЫСОКИЙ Обнаружена белая линия: НИЗКИЙ Датчик трассировки линии слева Обнаружена черная линия: ВЫСОКИЙ Обнаружена белая линия: НИЗКИЙ Датчик трассировки линии справа Обнаружена черная линия: ВЫСОКИЙ Обнаружена белая линия: НИЗКИЙ Условие 1 Условие 2 Обнаружить левый и правый датчики трассировки Статус Датчик трассировки в центре обнаруживает черную линию Левый датчик трассировки обнаруживает черную линию; правый датчик обнаруживает белую линию Поворот налево Левый датчик трассировки обнаруживает белую линию; правый датчик обнаруживает черную линию Поворот направо Левый и правый датчики трассировки обнаруживают черную линию Движение вперед Левый и правый датчики трассировки обнаруживают белую линию Движение вперед Датчик трассировки в центре обнаруживает белую линию Левый датчик трассировки обнаруживает черную линию; правый датчик обнаруживает белую линию Поворот налево Левый датчик трассировки обнаруживает белую линию; правый датчик обнаруживает черную линию Поворот направо Левый и правый датчики трассировки обнаруживают черную линию Стоп Левый и правый датчики трассировки обнаруживают белую линию Стоп

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

 

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

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

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

// Данные от улыбки получены с помощью сенсорного инструмента
unsigned char start01[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x80, 0x40, 0x20, 0x10, 0x08,
0x04, 0x02, 0x01};
#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);
matrix_display(start01); // Показать начальный узор
}

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

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

if (M_val == 1) { // если состояние среднего равно 1, что означает обнаружение черной линии
if (L_val == 1 && R_val == 0) { // Если обнаружена черная линия слева, но не справа, поворачиваем влево
left();
} else if (L_val == 0 && R_val == 1) { // В противном случае, если обнаружена черная линия справа и нет слева, поворачиваем вправо
right();
} else { // В противном случае, двигаемся вперед
front();
}
} else { // Нет обнаруженных черных линий посередине
if (L_val == 1 && R_val == 0) { // Если обнаружена черная линия слева, но не справа, поворачиваем влево
left();
} else if (L_val == 0 && R_val == 1) { // В противном случае, если обнаружена черная линия справа и нет слева, поворачиваем вправо
right();
} else { // В противном случае, останавливаемся
Stop();
}
}
}

void front() // Определить состояние движения вперед
{
digitalWrite(left_ctrl, HIGH);
analogWrite(left_pwm, 155);
digitalWrite(right_ctrl, HIGH);
analogWrite(right_pwm, 155);
}

void back() // Определить состояние движения назад
{
digitalWrite(left_ctrl, LOW);
analogWrite(left_pwm, 100);
digitalWrite(right_ctrl, LOW);
analogWrite(right_pwm, 100);
}

void left() // Определить состояние поворота влево
{
digitalWrite(left_ctrl, LOW);
analogWrite(left_pwm, 100);
digitalWrite(right_ctrl, HIGH);
analogWrite(right_pwm, 155);
}

void right() // Определить состояние поворота вправо
{
digitalWrite(left_ctrl, HIGH);
analogWrite(left_pwm, 155);
digitalWrite(right_ctrl, LOW);
analogWrite(right_pwm, 100);
}

void Stop() // Определить состояние остановки
{
digitalWrite(left_ctrl, LOW);
analogWrite(left_pwm, 0);
digitalWrite(right_ctrl, LOW);
analogWrite(right_pwm, 0);
}

// Эта функция используется для отображения точечной матрицы
void matrix_display(unsigned char matrix_value[]) {
IIC_start(); // функция, вызывающая начальное состояние передачи данных
IIC_send(0xc0); // выбрать адрес
for (int i = 0; i < 16; i++) // данные узора составляют 16 байт
{
IIC_send(matrix_value[i]); // передать данные узора
}
IIC_end(); // завершить передачу данных узора
IIC_start();
IIC_send(0x8A); // Управление отображением, выбрать 4/16 ширину импульса
IIC_end();
}

// Условия, при которых начинается передача данных
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
}
}

//*************************************************************************

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