Изучаем Arduino: инструметы и методы технического волшебства - [41]

Шрифт
Интервал

Преобразовать двоичное представление числа в десятичное очень просто. Рассмотрим этапы преобразования двоичного кода в десятичный (рис. 7.5).


Рис. 7.5. Преобразование двоичного числа в десятичное

Двоичное значение каждого бита представляет собой увеличивающуюся степень числа 2. В нашем случае биты 7, 5, 3, 1 установлены в единицу. Таким образом, чтобы найти десятичный эквивалент, вы складываете 2 7, 2 5, 2 3 и i. Полученное десятичное значение равно 170. Можно доказать, что это эквивалентно, подставив десятичное значение в код из листинга 7.1.

Замените строку с shiftout() на следющую:

shiftOut(DATA, CLOCK, MSBFIRST, 170);

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

-161 -

7.4. Создание световых эффектов с помощью СДВИГОВОГО регистра

В предыдущем примере мы создали с помощью регистра сдвига и светодиодов неподвижное изображение. Гораздо интереснее отображать динамичную информацию. В следующих примерах используем сдвиговые регистры для создания анимационных эффектов "бегущего всадника" и "гистограммы".

7.4.1. Эффект "бегущий всадник"

"Бегущий всадник" - анимационный эффект, когда горящий светодиод сначала движется в одну сторону, а затем в обратную. Соберем схему из предыдущего примера. С помощью функции shiftout() можно очень быстро обновлять данные в ячейках сдвигового регистра, чтобы создавать динамичные световые анимации.

В нащем примере необходимо зажигать по одному светодиоду сначала слева направо, затем справа налево. На временной диаграмме (рис. 7.6) показано, как светодиоды будут гореть на каждом шаге, и приведены десятичные значения для включения конкретной комбинации светодиодов.

В программе передаем функции shiftout() десятичные значения комбинаций светодиодов. В цикле выбираем значение из массива и отправляем в сдвиговый регистр. Код программы приведен в листинге 7.2.


0000000* | 1 | t=1

000000*0 | 2 | t=2

00000*00 | 4 | t=3

0000*000 | 8 | t=4

000*0000 | 16 | t=5

0*000000 | 64 | t=7

*0000000 | 128 | t=8

0*000000 | 64 | t=9

00*00000 | 32 | t=10

000*0000 | 16 | t=11

0000*000 | 8 | t=12

00000*00 | 4 | t=13

000000*0 | 2 | t=14


Рис. 7.6. Пошаговое представление эффекта "бегущий всадник"

- 162 -

Листинг 7.2. Световой эффект "бегущий всадник" - lightrider.ino


// Создание световой анимации "бегущий всадник"

const int SER=8;// Контакт для подключения вывода DATA

const int LATCH =9;// Контакт для подключения вывода LATCH

const int CLK =10;// Контакт для подключения вывода CLOCK

// Последовательность включения светодиодов

int seq[14] = {1,2,4,8,16,32,64,128,64,32,16,8,4,2};


void setup()

{

// Установить контакты на вывод (OUTPUT)

pinMode(SER, OUTPUT);

pinMode(LATCH, OUTPUT);

pinMode(CLK, OUTPUT);

}

void loop()

{

for (int i = 0; i < 14; i++)

{

digitalWrite(LATCH, LOW);// LATCH - низкий

shiftOut(SER, CLK, MSBFIRST, seq[i]); // Старший бит - первый

digitalWrite(LATCH, HIGH);// LATCH - высокий

delay(100);// Скорость анимации

}

}


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

ПРИМЕЧАНИЕ

Для просмотра демонстрационного видеоклипа программы lightrider зайдите по адресу http://www.exploringarduino.com/content/ch7. Видеоклип также доступен на сайте издательства Wiley.

7.4.2. Отображение данных в виде гистограммы добавив ИК-датчик расстояния в предыдущую схему, можно создать светящуюся гистограмму, которая показывает, насколько близко вы находитесь. Для большей наглядности возьмите несколько светодиодов разного цвета. Принципиальная схема устройства с разноцветными светодиодами и ИК-датчиком расстояния приведена на рис. 7.7.

- 163 -

Рис. 7.7. Схема устройства, реализующего эффект "гистограммы расстояния"

Зная принцип действия аналогового датчика и регистра сдвига, вы в состоянии самостоятельно выбрать пороги расстояния и соответствующие им комбинации включенных и выключенных светодиодов (рис. 7.8).

Из главы 3 ясно, что диапазон используемых значений для ИК-датчика расстояния не должен превышать 10 бит (у меня максимальное значение оказалось равно 500, у вас оно возможно отличается). Лучше всего самостоятельно проверить дальность действия датчика и уточнить соответствующие значения. Все десятичные комбинации гистограммы хранятся в массиве из девяти элементов. Ограничиваем максимальное расстояние и приводим значения к диапазону от 0 до 8. Листинг 7.3 иллюстрирует программную реализацию эффекта гистограммы.

Листинг 7.3 Гистограмма отображения расстояния - bargraph.ino

// Гистограмма расстояния

const int SER=8;// Контакт для подключения вывода DATA

const int LATCH =9; // Контакт для подключения вывода LATCH

- 164 -


const int CLK =10;// Контакт для подключения вывода CLOCK

const int DIST =0;// Контакт для подключения датчика расстояния

// Возможные значения светодиодов

int vals[9] = {0,1,3,7,15,31,63,127,255};

// Максимальное значение расстояния

int maxVal = 500;

// Минимальное значение расстояния

int minVal = 0;


void setup()

{

// Установить контакты на вывод (OUTPUT)

pinMode(SER, OUTPUT);

pinMode(LATCH, OUTPUT);

pinMode(CLK, OUTPUT);

}

void loop()