Мобильная версия Форум Arduino Документация Гарантийные условия 0 0
UA RU
График работы магазина:
Пн-Пт: 8.00 - 19.00
Сб: 10.00 - 17.00
Вс: выходной
Каталог
Напиши статью и получи скидку!

Расстояние напоказ

2015-11-21

Все статьи →

Автор Александр Чечин.

Иногда бывает нужно сделать небольшой, но эффектный проект для показа на неком мероприятии. Основная его цель – привлечь внимание и вызвать интерес незнакомых с Arduino людей. Как правило, времени на такие разработки всегда не хватает, приходится собирать что-то "на скорую руку".

Столкнувшись с такой проблемой, для демонстрации я выбрал светодиодную матрицу 8х8. Ну что может быть ярче красного свечения 64-х светодиодов? Тем более что управлять всем этим хозяйством можно всего лишь по трем проводам, благодаря микросхеме МАХ7219.

Для достижения эффекта "ВАУ!" нужно придать матрице интерактивность, чтобы она реагировала на движение окружающих. Для этого идеально подходит любой датчик расстояния, можно ультразвуковой, типа HC-SR04, а можно взять и инфракрасный от Sharp. Под рукой оказался первый и родилась вот такая схема:

В Интернете информации о подключении и программировании дальномера HC-SR04 более чем достаточно, "не обижена" и светодиодная матрица.

Дальномер подключаем так: trigPin - к цифровому порту 5, а echoPin - к цифровому порту 4.

Матрица соединяется с Arduino классически: CLK – 10-й цифровой пин, CS – 9, а DIN - к 8 цифровому порту.

Питание выводим к соответствующим контактам микроконтроллера. Светодиодная матрица имеет одноименные контакты с обеих сторон платы, поэтому, при необходимости, можно воспользоваться любой гребенкой. На предлагаемой схеме +5В для HC-SR04 взяты с контакта Vcc матрицы.

После включения дальномер измеряет расстояние и отправляет его на индикацию. Матрица будет отображать только одну цифру, в диапазоне от 0 до 9. В этом случае ее будет отчетливо и далеко видно. Поэтому измеряемое расстояние ограничим одним метром, а отображать будем десятки сантиметров. Если дальномер "потеряет" отраженный сигнал, тогда на матрицу выведем знак вопроса "?".

Собираем схему. Вместо Arduino UNO, которая оказалась занятой в другом проекте, я воспользовался платой Nano, а для удобства подключения проводов и внешнего питания установил ее на специальный Nano v3.0 I/O Shield.

Ультразвуковой дальномер закрепил на маленькой макетной плате. Схема соединений остается прежней.

После сборки пишем скетч.

//объявляем порты для дальномера

int trigPin = 5;

int echoPin = 4;

long distance; //переменная для хранения измеренного расстояния

int dd; //переменная для хранения десятков сантиметров

//объявляем порты и переменные для матрицы

int Max7219_pinCLK = 10;

int Max7219_pinCS = 9;

int Max7219_pinDIN = 8;

int ledLevel;

int num_max=11;

//переменные для операторов цикла

unsigned char i;

unsigned char j;

//массив для хранения отображаемых символов

//каждая строка – 16-тиричное число, определяющее

//светящиеся светодиоды на одной строке матрицы

unsigned char disp1[11][8]={

{ 0x3E, 0x7F, 0x71, 0x59, 0x4D, 0x7F, 0x3E, 0x00 }, // '0'

{ 0x40, 0x42, 0x7F, 0x7F, 0x40, 0x40, 0x00, 0x00 }, // '1'

{ 0x62, 0x73, 0x59, 0x49, 0x6F, 0x66, 0x00, 0x00 }, // '2'

{ 0x22, 0x63, 0x49, 0x49, 0x7F, 0x36, 0x00, 0x00 }, // '3'

{ 0x18, 0x1C, 0x16, 0x53, 0x7F, 0x7F, 0x50, 0x00 }, // '4'

{ 0x27, 0x67, 0x45, 0x45, 0x7D, 0x39, 0x00, 0x00 }, // '5'

{ 0x3C, 0x7E, 0x4B, 0x49, 0x79, 0x30, 0x00, 0x00 }, // '6'

{ 0x03, 0x03, 0x71, 0x79, 0x0F, 0x07, 0x00, 0x00 }, // '7'

{ 0x36, 0x7F, 0x49, 0x49, 0x7F, 0x36, 0x00, 0x00 }, // '8'

{ 0x06, 0x4F, 0x49, 0x69, 0x3F, 0x1E, 0x00, 0x00 }, // '9'

{ 0x02, 0x03, 0x51, 0x59, 0x0F, 0x06, 0x00, 0x00 }, // '?'

};

//Функции для вывода информации на матрицу

void Write_Max7219_byte(unsigned char DATA)

{

unsigned char i;

digitalWrite(Max7219_pinCS,LOW);

for(i=8;i>=1;i--)

{

digitalWrite(Max7219_pinCLK,LOW);

digitalWrite(Max7219_pinDIN,DATA&0x80);

DATA = DATA<<1;

digitalWrite(Max7219_pinCLK,HIGH);

}

}

void Write_Max7219(unsigned char address,unsigned char dat)

{

digitalWrite(Max7219_pinCS,LOW);

Write_Max7219_byte(address);

Write_Max7219_byte(dat);

digitalWrite(Max7219_pinCS,HIGH);

}

void Init_MAX7219(void)

{

Write_Max7219(0x09, 0x00);

Write_Max7219(0x0a, 0x03);

Write_Max7219(0x0b, 0x07);

Write_Max7219(0x0c, 0x01);

Write_Max7219(0x0f, 0x00);

}

//Функции для работы с дальномером

long getEchoTiming() {

digitalWrite(trigPin, LOW);

delayMicroseconds(2);

digitalWrite(trigPin, HIGH);

delayMicroseconds(10);

digitalWrite(trigPin, LOW);

long duration = pulseIn(echoPin,HIGH);

return duration;

}

long getDistance() {

long distacne_cm = getEchoTiming()/58;

return distacne_cm;

}

//Настраиваем Arduino

void setup()

{

//настраиваем порты к которым подключена матрица

pinMode(Max7219_pinCLK,OUTPUT);

pinMode(Max7219_pinCS,OUTPUT);

pinMode(Max7219_pinDIN,OUTPUT);

delay(50);

Init_MAX7219(); //включаем матрицу

// настраиваем порты к которым подключен дальномер

pinMode(trigPin,OUTPUT);

pinMode(echoPin,INPUT);

Serial.begin(9600); //для отладки включаем последовательный порт

}

//Рабочий цикл микроконтроллера

void loop()

{

distance = getDistance(); //измеряем расстояние до предмета

dd=(int)distance/10; //делим его на 10

Serial.println(dd); //выводим в COM-порт

delay(100); //ждем

//выбираем нужный символ для показа от 0 до 10

switch (dd) {

case 0: j=0;

break;

case 1: j=1;

break;

case 2: j=2;

break;

case 3: j=3;

break;

case 4: j=4;

break;

case 5: j=5;

break;

case 6: j=6;

break;

case 7: j=7;

break;

case 8: j=8;

break;

case 9: j=9;

break;

default: j=10;

break;

}

//выводим символ с номером j на матрицу

for(i=1;i<9;i++)

Write_Max7219(i,disp1[j][i-1]);

}

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

Я воспользовался коробкой от компьютерной мыши, просверлив в ней нужные отверстия. Крышку зафиксировал скотчем. Единственное уязвимое место конструкции это окно для ультразвукового дальномера.

Все готово.

Вперед, на показ!

Работа дальномера:

До препятствия 50 см.

До препятствия 30 см.

Расстояние больше метра. На матрице "?"

Ваша оценка статьи:

Отлично
Хорошо
Удовлетворительно
Плохо
Очень плохо

Общая оценка:

Оценка "Расстояние напоказ"
5 из 5
сделана на основе 1 оценки 1 клиентских отзыва.

Благодарим Вас за обращение! Ваш отзыв появится после модерации администратором.
Dima
15.03.2023 20:53:30
Цікавий проект,я як новачок в Arduino був дуже зацікавлений статтею!
оплата картами Visa и MasterCard