Суббота, 27.04.2024, 01:05
Приветствую Вас Гость | RSS
Главная | Каталог статей | Регистрация | Вход
Меню сайта
Реклама Google
Форма входа
Категории раздела
Это нужно знать! [17]
Изучаем AVR [30]
Программаторы [12]
Необходимое ПО [8]
Готовые устройства [73]
Справочная [38]
Инструмент [0]
Технология [8]
Литература [0]
Arduino скетчи [18]
Поиск
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Микроконтроллеры - это просто!
Главная » Статьи » Arduino скетчи

Как подключить к Arduino...

Как подключить к Arduino светодиод
Светодиод можно подключить либо к цифровому (логическому) выводу, и в этом случае его состоянием можно управлять по принципу включен-выключен, либо к одному из выводов ШИМ (PWM), и при таком подключении можно управлять яркостью его свечения.
Надо заметить, что один светодиод к Arduino уже подключен. Он расположен на самой плате и подключен к выводу Digital 13. Для того, чтобы им помигать, достаточно загрузить в микроконтроллер скетч Blink в меню Examples->Basic.

Номинальный ток для одного вывода микроконтроллера Arduino составляет 20mA, что для напряжения +5В составляет сопротивление в 250 Ом. Светодиод вывода Digital 13 подключен  через резистор 1 кОм, что вместо с сопротивлением светодиода составляет около 1,5 кОм - то есть он потребляет ток около 3 мА, что позволяет подключить к тому же выводу, например, ещё один светодиод через резистор (это чтобы код скетча Blink не изменять).

Схема:

Подключив светодиод таким образом, можно загрузить в Arduino скетч Blink и посмотреть, как они синхронно мигают. В статье Знакомство с Arduino есть пример того, как с помощью транзистора сделать, чтобы светодиоды мигали в противофазе, то есть подобно огням шлагбаума.

Скетч Blink устроен довольно просто. В функции setup() вызовом функции pinMode() вывод Digital 13 переводится в режим вывода. Затем управление передаётся функции loop(), которая вызывается снова и снова в бесконечном цикле. В этой функции светодиод включается вызовом функции digitalWrite() с аргументом HIGH (высокий уровень или логическая единица), вызовом функции delay() производится задержка длительностью в 1000 мс (1 секунда), затем светодиод гасится вызовом функции digitalWrite() с аргументом LOW (низкий уровень или логический ноль) и снова производится задержка вызовом функции delay().

Как управлять яркостью светодиода
Для того, что управлять яркостью светодиода при помощи ШИМ, следует подключить светодиод к одному из выводов с широтно-импульсной модуляцией. В меню Examples->Analog есть скетч Fading с примером плавного увеличения и уменьшения яркости светодиода c периодичностью около 3 секунд.

В комментарии к скетчу Fading написано, что светодиод можно просто подключить между выводом Digital 9 и землёй (вывод GND), но на практике он светится слишком ярко, а изменения в яркости происходят нелинейно. Поэтому гораздо симпатичнее на мой взгляд светодиод мерцает, будучи подключенным через фильтр НЧ на конденсаторе и резистивный делитель напряжения.

Схема:

Код скетча Fading похож по структуре на код скетча Blink, но управление яркостью светодиода производится вызовом функции analogWrite().

Как подключить к Arduino кнопку
Кнопку к Arduino можно подключить двумя способами. Первый способ описан в комментарии к скетчу Button в меню Examples->Digital.

Схема:


В данном случае, когда кнопка не нажата, то её контакты разомкнуты, и на входе Digital 2 логический ноль. Если кнопку нажать, контакты замкнутся, и на входе Digital 2 появится напряжение +5В, соответствующее логической единице.

Второй способ подключения отличается от первого тем, что кнопка подключается к земле, а резистор к источнику напряжения +5В:

В данном случае резистор выполняет функцию подтягивающего (pull-up) резистора, "подтягивающего" напряжение на входе Digital 2 до уровня +5В (логическая единица). При замыкании контактов кнопки потенциал на выводе Digital 2 становится равным потенциалу земли (0 вольт), и таким образом на входе Digital 2 единицу сменяет логический ноль.

Можно заметить, что в первом случае резистор также выполняет функцию подтягивающего резистора, только подтягивает он напряжение на входе микроконтроллера не вверх (pull-up), а к земле (pull-down). Если бы резистора не было, то напряжение на входе "гуляло" бы, ловя статическое напряжение в атмосфере, как это происходит, если оставить вход Gate полевого транзистора не подключенным.

В коде скетча Button вызовом функцим pinMode() с аргументом INPUT вывод Digital 2 переводится в режим ввода, и вызовом функции digitalRead() производится опрос текущего состояния кнопки.

Надо заметить, что в скетче Button не учитывается так называемый дребезг контактов, который проявляется в том, что при нажатии на кнопку контакты физически приближаются друг к другу, и на некотором расстоянии разность потенциалов на контактах начинает пробивать электрическое сопротивление воздуха. Происходит это очень быстро - кнопку вполне достаточно опрашивать с частотой в 32 Гц, в то время как функция loop() без задержки вызывается возможно в тысячу, а то и в десятки тысяч раз чаще. Для сравнения - микроконтроллер Arduino, работая на частоте 16 МГц, может выполнить 32 раза в секунду по 500000 команд.

Несложно добавить в конце функции loop() вызов функции delay() для организации задержки в 31 мс:

void loop() {
   ... // Код функции
   delay(31);
}

Если использовать большое время задержки, например 3000 мс (3 сек.), то нажимая на кнопку можно заметить, как микроконтроллер не сразу реагирует на нажатия - кнопку приходится нажимать и ждать, пока сработает, потому что иначе он просто не замечает нажатия, будучи занят ожиданием окончания выполнения функции delay().

Как подключить к Arduino 8-омный динамик
В меню Examples->Digital есть скетч toneMelody, который при сбросе микроконтроллера проигрывает мелодию, ноты в которой задаются двумя параметрами - тоном и громкостью. В качестве динамика используется 8-омная динамическая головка, например динамик так называемого PC Speaker, подключаемая к выводу Digital 8.

Динамик подключается по схеме:

Вместо сопротивления с номиналом 220 Ом можно использовать и большее, например, 510 Ом или 1 кОм.

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

Как видно из схемы, громкость при этом получается настолько большой, что я добавил в схему потенциометр R2 в качестве регулятора громкости. Транзистор включен по схеме с общим эмиттером, и в данном случае выступает не в роли усилителя, а в качестве электронного ключа для согласования нагрузок.

Дело в том, что поскольку у динамической головки очень маленькое сопротивление, то при подаче на неё напряжения +5В через неё будет протекать ток около 625 мА. Максимальный ток, который могут обеспечить все выводы микроконтроллера составляет всего 150 мА, то есть в 4 раза меньше. И таким образом, подключая динамик к микроконтроллеру не напрямую, а через транзистор, способный пропускать через себя большее напряжение и ток большей силы, мы обеспечиваем электрическое согласование, в данном случае согласование по току.

Звуку можно добавить низких частот, подключив между базой транзистора и землёй электролитический конденсатор ёмкостью, например, в 1 мкФ. При этом резистор R1 и конденсатор образуют RC-фильтр низких частот. Чем больше ёмкость конденсатора, тем ниже частота среза такого фильтра.

Посмотрев на схему внимательно, я обнаружил, что с транзистором и регулятором громкости у меня получился почти усилитель класса D, только в роли катушки выступает катушка динамика, а в роли нагрузки резистор R2. Поэтому добавив в схему диод, я превратил её в схему усилителя класса D.

Усилители класса D получили широкое распространение благодаря тому, что транзистор в таком усилителе работает в ключевом режиме, и благодаря этому не нагревается, что обеспечивает усилителю класса D высокий КПД.

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

Винтажный эффект резонансного фильтра можно получить, если конденсатор подключить плюсом к выводу 2 потенциометра R2, а минусом к земле. При уменьшении громкости к сигналу добавляется резонанс, а также уменьшается уровень нижних частот.

Как подключить к Arduino устройство с Android
Задавшись целью подключить к Arduino Android-совместимое устройство, например смартфон или планшет, потребуется либо использовать плату Arduino MEGA ADK, либо подключить к Arduino плату расширения USB Host Shield (используется SPI-интерфейс).

После успешного подключения, нужно скачать и установить Android ADK (Accessory Development Kit) для разработки программного обеспечения для Android-устройства (язык программирования Java).

Для написания скетчей Arduino также потребуется скачать и установить библиотеку для платы USB Host Shield, также приводятся примеры коммуникации Arduino с Android-устройством.

Как подключить к Arduino FPGA
Теоретически, чтобы подключить к Arduino микросхему FPGA, требуется выполнить согласование уровней напряжений сигналов, поскольку выводы FPGA соответствуют стандарту логических уровней напряжений LVTTL. Так я и поступил, подключив чип FPGA к Arduino по следующей схеме согласования:

Однако стабильно эта схема работать по невыясненной пока причине отказалась -- данные передавались как бы с помехами на линии (периодически два-три байта передавались неверно). Чуть лучше всё это работало, если после отправки каждого байта посылался импульс по линии nSS.

Тогда я попробовал подключить к FPGA трёхвольтовую плату Olimexino-STM32, и в результате выяснилось, что первая версия slave-модуля интерфейса SPI была написана что называется криво. Переписав модуль с нуля и добавив подтягивающие (pull-up) резисторы, я получил работающую схему, которая успешно передает данные даже с частотой тактирования SCK 18 МГц (18 Мбод).

Я соединил по такой же схеме согласования уровней Arduino и Olimexino-STM32, однако выяснилось, что данные по ней получается передавать, только когда Olimexino-STM32 выступает в качестве мастера, а Arduino в режиме slave. Да и то, со скоростью не выше 1.125 МГц.

С написанным мною slave-модулем интерфейса SPI, после добавления в схему дополнительных подтягивающих (pull-up) резисторов, Arduino в качестве мастера работать и вовсе отказался -- данные передаются, но неверно. Тестирование самой схемы согласования не выявило никаких проблем, да и Olimexino-STM32 в роли мастера и Arduino в режиме slave с ней успешно работают.

UPD1: Есть подозрение, что вышел из строя кварцевый генератор. Возможно, причина того, что данные от Arduino перестали передаваться, заключается именно в этом.

UPD2: Замена генератора не спасла положения. Возможных вариантов вижу 3:

  • Не работает сама схема согласования, но чтобы это проверить, требуется осциллограф, которого у меня пока к сожалению нет.
  • Данные на самом деле передаются от Arduino к FPGA, но не передаются обратно, поскольку тока в 8 мА на выводе микросхемы Cyclone III не хватает для того, чтобы управлять подтяжкой (pull-up) в 5К из двух резисторов по 10К, включенных параллельно.
  • Теоретически тока должно хватать (ток подтяжки при напряжении 3,3 В получается 660 мкА против 330 мкА для одного резистора в 10К), следовательно есть ещё вариант, что это как-то связано с тем, что микросхема Cyclone III вообще-то 2,5 В. Такой вывод я сделал из того, что кодеком, который я успешно подключил до этого к Cyclone, у меня с Cyclone III работать не захотел (тоже интерфейс управления SPI). Во всяком случае проблема с кварцевым генератором оказалась в том, что в настройках распиновки вход CLK    был по умолчанию заявлен как LVTTL 2,5 В.

UPD3: Удалось выяснить причину появления "мусора" при передаче. Причиной оказался блок питания, который я использовал. Попробую заменить на другой.


Как подключить к Arduino матричную клавиатуру
Матричную клавиатуру подключить к Arduino с одной стороны и не сложно, с другой стороны отводить под это целых 8 выводов из 17-ти свободных -- это как-то слишком много. С похожей проблемой я столкнулся, подключив к Arduino LCD-дисплей WG12232E, после чего решил, что удобнее использовать для этой задачи не Arduino, а отдельный микроконтроллер. Результатом стал Модуль LCD-дисплея WG12232E.

Самый простой вариант подключения приведён на схеме:

Матричная клавиатура имеет 4 вывода горизонтальных линий контактов и 4 вывода вертикальных линий контактов. Соответственно при подключении матричной клавиатуры к микроконтроллеру одна группа подключается к выходных выводам, а другая группа подключается к входным выводам (на приведённой схеме это выводы Analog In). Опрос состояния кнопок при этом производится либо построчно, либо по столбцам, по очереди -- на каждой итерации опрашивается одна строка кнопок либо один столбец. На соответствующий вывод при этом подаётся напряжение установкой состояния пина в логическую 1. Входные выводы микроконтроллера следует при этом подтянуть резисторами к земле, чтобы при отсутствии напряжения (когда кнопка не нажата) на соответствующем входе был ноль. При нажатии на кнопку на соответствующем выводе будет напряжение с выхода, то есть логическая 1.

Скетч опроса клавиатуры:

#define LED 13 // Вывод светодиода
 
#define MATRIX_OUT0 8 /// Выводы матричной клавиатуры
#define MATRIX_OUT1 9
#define MATRIX_OUT2 10
#define MATRIX_OUT3 11
 
#define MATRIX_IN0 A0 // Входы матричной клавиатуры
#define MATRIX_IN1 A1
#define MATRIX_IN2 A2
#define MATRIX_IN3 A3
 
// Пара вспомогательных массивов
const unsigned char matrixOutPins[4] = {
 MATRIX_OUT0, MATRIX_OUT1,
 MATRIX_OUT2, MATRIX_OUT3
 };
const unsigned char matrixInPins[4] = {
 MATRIX_IN0, MATRIX_IN1,
 MATRIX_IN2, MATRIX_IN3
 };
 
// Массив состояния кнопок
bool keyState[4][4] = {
 { false, false, false, false },
 { false, false, false, false },
 { false, false, false, false },
 { false, false, false, false }
 };
 
void setup()
{
 // Инициализация выводов матричной клавиатуры
 for (char n = 0; n < 3; ++n) {
 pinMode(matrixInPins[n], INPUT);
 pinMode(matrixOutPins[n], OUTPUT);
 digitalWrite(matrixOutPins[n], LOW);
 }
 // Инициализация вывода светодиода
 pinMode(LED, OUTPUT);
}
 
void loop()
{
 updateKeyState(); // Обновить состояние клавиатуры
 delay(62); // с частотой 16 Гц, чтобы избежать дребезга контактов
}
 
void updateKeyState()
{
 for (char n = 0; n < 3; ++n) {
 // Опрос линии кнопок
 digitalWrite(matrixOutPins[n], HIGH);
 for (char nn = 0; nn < 3; ++nn) {
 // Опрос кнопки в линии
 bool curState = digitalRead(matrixInPins[n]);
 if (keyState[n][nn] != curState) {
 // Если состояние кнопки изменилось,
 // вызвать функцию-обработчик события
 keyState[n][nn] = curState;
 // Скан-код кнопки = (номер линии * 4) + номер кнопки
 char scanCode = (n << 2) | nn;
 if (curState)
 keyPress(scanCode);
 else
 keyRelease(scanCode);
 }
 }
 }
}
 
// Обработка события Кнопка Нажата
void keyPress(char scanCode)
{
 digitalWrite(LED, HIGH); // Вкл. светодиод
}
 
// Обработка события Кнопка Отпущена
void keyRelease(char scanCode)
{
 digitalWrite(LED, LOW); // Выкл. светодиод
}
 

Более сложный вариант подключения -- использовать для коммутирования линий кнопок микросхему счётчика-делителя 74LS90 (К155ИЕ2). В этом случае можно будет обойтись 5-ю выводами вместо 8-ми.

 

Категория: Arduino скетчи | Добавил: Alex (01.06.2014)
Просмотров: 7121 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Copyright MyCorp © 2024