Управление цифровым потенциометром AD5171 с помощью библиотеки Wire [1]
Этот пример показывает, как при помощи библиотеки Wire управлять цифровым потенциометром AD5171 от Analog Devices, который коммуницирует через синхронный последовательный протокол I2C. Мы настроим потенциометр таким образом, чтобы он преодолевал 64 уровня сопротивления, тем самым меняя яркость светодиода.
В протоколе I2C для отправки и передачи данных используется два контакта: Serial Clock (SCL), через который Arduino отбивает тактовый импульс, и Serial Data (SDA), по которому и проходит обмен данными между девайсами.
Если тактовый импульс меняется с LOW на HIGH (этот сценарий известен как «положительный фронт тактового сигнала»), Arduino через SDA-линию отсылает I2C-девайсу бит информации, содержащий адрес конкретного устройства, а также запрос на отправку данных. Если тактовый импульс меняется с HIGH на LOW («отрицательный фронт тактового сигнала»), «разбуженный»I2C-девайс в ответ на запрос отсылает Arduino необходимые данные по той же SDA-линии.
Поскольку I2C-протокол позволяет всем подключенным девайсам иметь свой уникальный адрес, а оба устройства (и ведущее, и ведомое) обмениваются информацией по одной и той же линии, Arduino может коммуницировать с несколькими девайсами (но по очереди), при этом используя лишь два контакта микроконтроллера.
Необходимое оборудование
Плата Arduino;
Цифровой потенциометр AD5171;
Светодиод;
Резистор на 220 Ом;
Два резистора на 4,7 кОм;
Макетная плата Breadboard;
Провода-перемычки;
Цепь
Подключите 3-ий, 6-ой и 7-ой контакты AD5171 к «земле», а 2-ой и 8-ой контакты – к +5V.
Контакт номер 4 потенциометра (т.е. SCL, используется для тактового импульса) подключите к 5-ому аналоговому контакту на Arduino, а контакт номер 5 (т.е. SDA, используется для передачи данных) – к 4-ому аналоговому контакту.
Также к каждой из этих линий (и к SCL, и к SDA) добавьте по одному подтягивающему резистору и подсоедините их к +5V.
Наконец, подключите светодиод к 1-ому контакту AD5171 (т.е. к его движку), но через 220-омовый резистор.
Когда 6-ой контакт AD5171 (т.е. ADO) подсоединен к «земле», его адрес – это «44». Чтобы добавить к той же SDA-шине еще один цифровой потенциометр, подключите его ADO-контакт к +5V, и это сменит его адрес на «45».
Одновременно можно использовать только два таких цифровых потенциометра.
Схема
Код
// Управление цифровым потенциометром через I2C// от Николаса Замбетти (Nicholas Zambetti, http://www.zambetti.com)// и Шона Бонковски (Shawn Bonkowski, http://people.interaction-ivrea.it/s.bonkowski)// Демонстрирует использование библиотеки Wire.// Управляет цифровым потенциометром AD5171 через I2C/TWI.// Создан 31 марта 2006.// Этот код не защищен авторским правом.#include<Wire.h>voidsetup(){Wire.begin();// подключаем шину I2C (для ведущего устройства адрес опционален)}byteval=0;voidloop(){Wire.beginTransmission(44);// начинаем передачу данных девайсу #44 (0x2c);// этот адрес указан в «даташите»Wire.write(byte(0x00));// отсылаем байт с инструкцией Wire.write(val);// отсылаем байт со значением от потенциометра Wire.endTransmission();// останавливаем передачу данныхval++;// увеличиваем значениеif(val==64)// если достигли 64-ой позиции (т.е. максимума)...{val=0;// ...начинаем с самого низкого значения}delay(500);}
Calibration - Определение максимума и минимума для данных от аналогового датчика.
Fading - Использование выходного аналогового контакта (ШИМ) для затухания/загорания светодиода.
Smoothing - Сглаживание серии данных, считанных с входного аналогового контакта.
Связь
ReadASCIIString - Анализ строки, состоящей из разделенных запятыми int-значений, и их последующее использование для управления RGB-светодиодом.
ASCII Table - Демонстрирует продвинутые способы вывода данных на Serial Monitor.
Dimmer - Изменение яркости светодиода при помощи движения мышкой.
Graph - Отправка данных на компьютер и их графическое отображение в скетче Processing.
Physical Pixel - Включение/выключение светодиода путем отправки данных со скетча Processing (или Max/MSP) на Arduino.
Virtual Color Mixer - Отправка с Arduino на компьютер сразу нескольких значений, а затем их считывание при помощи скетча для Processing или Max/MSP.
Serial Call Response - Многобайтная передача данных при помощи метода вызова и ответа (метода «рукопожатия»).
Serial Call Response ASCII - Многобайтная передача данных при помощи метода вызова и ответа (метода «рукопожатия»). До передачи данные зашифровываются в ASCII.
SerialEvent - Демонстрирует использование SerialEvent().
MIDI - Передача через последовательный порт сообщений с MIDI-нотами.
MultiSerialMega - Использование двух последовательных портов на Arduino Mega.
Управляющие структуры
If Statement - Как использовать оператор «if» для создания условий, опирающихся на входные аналоговые данные, при которых светодиод будет либо включаться, либо оставаться выключенным.
For Loop - Управление несколькими светодиодами, чтобы они мигали, как LED-полоска у автомобиля Китт из сериала «Рыцарь дорог».
Array - Вариация примера «For Loop», но с использованием массива.
While Loop - Использование цикла while() для калибровки датчика. Калибровка включается при нажатии на кнопку.
Switch Case - Как совершать какие-либо действия в зависимости от значений, полученных от датчика. Эквивалент примера «If Statement», но если бы условий было не два, а четыре. Этот пример демонстрирует, как дробить диапазон данных от датчика на четыре «суб-диапазона», а затем в зависимости от полученных результатов совершать одно из четырех действий.
Switch Case 2 - Второй пример, демонстрирующий использование оператора switch. Показывает, как совершать различные действия в зависимости от определенных символов, полученных через последовательный порт.
Датчики
ADXL3xx - Считывание данных с акселерометра ADXL3xx.
Knock - Определение стука при помощи пьезоэлемента.
Memsic2125 - Считывание данных с 2-осевого акселерометра Memsic2125.
Ping - Определение объектов при помощи ультразвукового дальномера.