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

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

ПРИМЕЧАНИЕ

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

9.5.1. Описание схемы устройства

Схема устройства похожа на предыдущую (см. рис. 9.6). Оставим три светодиода из четырех, а вместо последнего подключим динамик. Один вывод цифрового потенциометра, идущий к динамику, соединим через резистор с контактом платы Arduino, который будет генерировать сигнал различной частоты. Сформированный меандр проходит через цифровой потенциометр, который меняет напряжение на динамике, а следовательно, громкость звучания. Измените предыдущую схему так, как показано на рис. 9. 7.

- 198 -

Рис. 9.7. Схема управления светодиодами и громкостью динамика

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

9.5.2. Модификация программы

Внесем несколько простых изменений в нашу предыдущую программу для управления светодиодами (см. листинг 9.1). Добавьте переменную для контакта, подключенного к динамику, а также переменную для установки частоты сигнала, подаваемого на динамик. При желании внутри цикла loop() можно добавить операторы, увеличивающие частоту сигнала при каждой последующей итерации. Для установки громкости динамика подойдет та же самая функция setLed(), как и раньше, но ее название теперь вводит в заблуждение, так что рекомендуем его изменить. В листинге 9.2 она переименована в setReg().

- 200 -

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

{

setReg(SS1,REG0,i);

setReg(SS1,REG1,i);

setReg(SS2,REG0,i);

setReg(SS2,REG1,i);

delay(10);

}


delay(300);

for (int i=128; i>=0; i--)

{

setReg(SS1,REG0,i);

setReg(SS1,REG1,i);

setReg(SS2,REG0,i);

setReg(SS2,REG1,i);

delay(10);

}


delay(300);

freq = freq+100;

if (freq > 2000) freq = 100;

}


Загрузите программу на плату Arduino и убедитесь, что меняется не только яркость светодиодов, но и громкость звука. На каждой итерации частота звука увеличивается на 100 Гц, пока не достигнет 2000 Гц. Громкость динамика регулирует тот же потенциометр, который управляет светодиодами.

И это всего лишь начало. Теперь у вас достаточно знаний, чтобы сделать действительно нечто впечатляющее. Вот несколько советов:

+ можно управлять частотой и громкостью звука по сигналам от датчиков (например, инфракрасный датчик расстояния может менять частоту в зависимости от приближения к устройству и удаления от него);

+ яркость светодиодов можно устанавливать в зависимости от внешних факторов, например от температуры;

+ можно добавить кнопку, чтобы переключать громкость или частоту звука;

+ можно сопоставить световые эффекты с проигрыванием музыки.

ПРИМЕЧАНИЕ

Посмотреть видеоклип, демонстрирующий работу SPI-устройства для создания световых и звуковых эффектов, можно на странице http://www.exploringarduino.com/

content/ch9. Этот видеофайл доступен и на сайте издательства Wiley.

- 201 -

Резюме

В этой главе вы узнали следующее:

• Что согласно протоколу SPI для организации обмена требуются три общие линии (две линии данных и линия синхронизации) и по одной дополнительной линии выбора для каждого ведомого устройства.

• Что библиотека Arduino SPI позволяет облегчигь коммуникации между платой Arduino и ведомыми устройствами.

• Что можно обмениваться данными с несколькими устройствами SPI, используя общие линии данных и синхронизации и раздельные линии SS выбора ведомого устройства.

• Как управлять SPI цифровыми потенциометрами с помощью библиотеки Arduino SPI.

• Как пользоваться техническими описаниями устройств.

• Как одновременно регулировать громкость и частоту звукового сигнала, используя библиотеку Tone и цифровой потенциометр SPI.


Листинг 9.2. Управление светодиодами и громкостью динамика с помощью SPI-потенциометров - LED_speaker.ino

// Изменение яркости светодиодов не с помощью ШИМ,

// а регулировкой входного напряжения

// Подключение Arduino библиотеки SPI

#include

const int SPEAKER=8; // Вывод подключения динамика

int freq = 100;

// При подключении библиотеки SPI

// по умолчанию используются контакты

// 11 = MOSI, 12 = MISO, 13 = CLK

const int SS1=10;// Контакт выбора SS микросхемы 1

const int SS2=9;// Контакт выбора SS микросхемы 2

const byte REG0=B00000000; // Команда записи в регистр 0

//(выбор первого потенциометра)

const byte REG1=B00010000; // Команда записи в регистр 1

//(выбор второго потенциометра)


void setup()

{

// Настройка выводов выбора SS на выход

pinMode(SS1, OUTPUT);

pinMode(SS2, OUTPUT);

// Инициализация аппаратного SPI

SPI.begin();

}


//Подпрограмма выбора и отправки данных

//Chip 1 (SS 10) регистр 0 - красный светодиод

//Chip 1 (SS 10) регистр 1 - желтый светодиод

//Chip 2 (SS 9) регистр 0 - зеленый светодиод

//Chip 2 (SS 9) регистр 1 - динамик

void setReg(int SS, int reg, int level)

{

digitalWrite(SS, LOW);// Установка SS в низкий уровень (выбор)

SPI.transfer(reg);// Отправка команды

SPI.transfer(level);// Отправка значения (0-128)

digitalWrite(SS, HIGH);// Установка SS в высокий уровень