Чтобы в полной мере проверить знания протокола SPI, возьмем две микросхемы MCP4231, что даст нам четыре управляемых потенциометра. Каждый из них подключен последовательно со своим светодиодом (красным, желтым, зеленым и синим) и регулирует его яркость. Задействованы только две клеммы потенциометра.
Один контакт каждого потенциометра подключен через резистор к шине 5 В, второй ( средний вывод) - к аноду светодиода. Схема подключения одного светодиода изображена на рис. 9.5.
Катод светодиода подключен к земле. Когда сопротивление цифрового потенциометра минимально, ток течет от источника 5 В через резистор 100 Ом и средний вывод потенциометра (имеющий сопротивление - 75 Ом) и далее через светодиод.
Когда сопротивление потенциометра максимально, ток течет через резистор 100 Ом, потенциометр (- 10 кОм), а затем через светодиод. Даже при полностью выведенном потенциометре сопротивление участка цепи будет 175 Ом, что достаточно для ограничения тока через светодиод. При увеличении и уменьшении сопротивления цифрового потенциометра меняется ток через светодиод, а следовательно, его яркость. Этот метод регулирования яркости может оказаться очень полезным, если заняты все выводы ШИМ.
- 194 -
Рис. 9.5. Схема подключения светодиода к потенциометру
Рис. 9.6. Схема подключения цифровых потенциометров
- 195 -
Теперь, учитывая цоколевку, подсоединяем цифровые потенциометры к шине SPI.
На плате Arduino Uno контакт 13 - это SCK, контакт 12 - MISO, контакт 11 MOSI. Контакт 10 будем использовать как SS для одного чипа, а контакт 9 - как SS для другого чипа. Схема подключения приведена на рис. 9.6. Помните, что каждую из микросхем нужно подключить к своей линии SCK, MISO и MOSI.
Еще раз проверьте, что все правильно подключено, и перейдем к написанию программы управления яркостью светодиодов.
Чтобы проверить, что все подключено правильно и работает, напишем простую программу с использованием библиотеки SPI для управления яркостью четырех светодиодов.
Библиотека SPI встроена в Arduino IDE, что сильно облегчает организацию обмена по протоколу SPI. Все, что остается программисту, - подключить библиотеку SPI и отправить данные в соответствии с протоколом SPI с помощью встроенных команд. Конечно, необходимо переключать флажки SS для выбора устройства.
Чтобы отправить команду одному из цифровых потенциометров на изменение яркости светодиода, необходимо выполнить следующее:
• установить на выводе SS требуемой микросхемы низкий уровень;
• отправить байт команды на выбранный потенциометр;
• отправить байт данных - значение для выбранного потенциометра;
• установить на выводе SS выбранной микросхемы высокий уровень.
Программа, приведенная в листинге 9.1, выполняет все описанные шаги: выбирает контакт SS, посылает байт выбора потенциометра и байт значения потенциометра по протоколу SPI. Функция SPI. begin() инициализирует аппаратный интерфейс SPI на плате Arduino и после этого для передачи данных по шине SPI можно использовать команду SPI. transfer().
Контакт выбора SS для первой микросхемы подключается к контакту 10 платы, для второй - к контакту 9. Функция settled() получает номер контакта SS, адрес регистра микросхемы и значение уровня потенциометра и передает данные в соответствующий чип. В цикле loop() яркость всех четырех светодиодов сначала увеличивается, а затем уменьшается. Загрузите программу на плату Arduino и увидите этот эффект.
ПРИМЕЧАНИЕ
Посмотреть видеоклип, демонстрирующий работу SPI цифрового потенциометра в качестве регулятора яркости, можно на странице http:/1 www.exploringarduino.com/content/ch9. Этот видеофайл доступен также на сайте издательства Wiley.
Освоив простой пример, в следующем разделе создадим более сложное устройство, добавив звуковой эффект.
- 196 -
Листинг 9.1. Управление несколькоими SPI цифровыми потенциометрами - SPI_led.ino
// Изменение яркости светодиодов не с помощью ШИМ,
// а регулировкой напряжения
// Подключение библиотеки SPI
#include <SPI.h>
// При подключении библиотеки 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();
}
// Подпрограмма выбора и отправки данных для каждого светодиода