Передача данных в инфракрасном диапазоне при помощи Arduino
Всем доброго времени дня (или ночи, как вам удобно), начнём пожалуй с лирического вступления. Сейчас у многих дома есть телевизор с пультом ДУ(дистанционного управления), тюнер, DVD проигрыватель.
Многие люди(и семьи) не представляют свой домашний быт без пульта ДУ в руке. Согласитесь – как здорово быть властелином домашней техники, и в любой момент диктовать этим железякам свою волю.
В этой статье, мы бы хотели рассмотреть технологию дистанционного управления более углубленно, и привести некоторые примеры применения для своих нужд.
Итак, что же нам потребуется в качестве компонентов для нашего эксперимента? Как вариант продаются готовые модули ИК-пульта и ИК-приёмника. Но нам не хочется ждать и платить деньги, поэтому будет действовать более хардкорно.
Возьмём за основу пульт ДУ неизвестного происхождения, также у нас имеется кусок платы от китайского тюнера на котором распаян инфракрасный приёмник. На фото ниже вы можете видеть эти комплектующие.
Если признаться честно – пульт ДУ был найден среди ненужного барахла в столе офиса, а плата с ИК-приёмником была взята в ближайшей радиомастерской.
Ну так что же, как говаривал Ганнибал – “Вперед, на Карфаген”. Нам нужно просто выпаять приёмник и подключить его к плате Arduino по нижеследующей схеме…
ИК-приёмник который был выпаян из платы не имеет какой либо маркировки, это просто очередной неизвестный китайский радиокомпонент, каких выпущено было тысячи. Вкратце можно сказать – в одном корпусе он объединяет фотодиод, предусилитель и формирователь.
На выходе формируется обычный ТТЛ-сигнал без заполнения, пригодный для дальнейшей обработки микроконтроллером. Несущая частота возможно(!) 36 кГц, но сейчас это не так важно… Просто попробуем его подключить к плате Arduino, условная схема даст нужную распиновку данного девайса.
На схеме ниже, выделенное красным – это форма корпуса в котором выполнен наш ИК-приёмник, выделенное зеленым – распиновка по которой он подключен к плате Arduino.
Итак, всё подключено. Чтобы прочитать коды с пульта ДУ существует библиотека IRremote.h, именно с её помощью будем изучать наш пульт, а точнее коды кнопок. В дальнейшем используем прочитанные коды в своих целях.
Скетч, при помощи которого будут прочитаны коды кнопок, представлен в примерах этой библиотеки, называется он IRrecvDemo.
Внимание !!! Скетч при компиляции выдаёт ошибку, в самом начале нужно добавить еще две подключаемые библиотеки:
#include “boarddefs.h” //Добавочная библиотека #include “IRremote.h” #include “IRremoteInt.h” //Добавочная библиотека int RECV_PIN = 2; //Пин подключения выходного сигнала с ИК-приёмника //Создаём экземпляр класса IRrecv, в качестве параметра передаём пин подключения сигнала ИК-приёмника IRrecv irrecv(RECV_PIN); decode_results results; //Переменная для сохранения полученного кода нажатой кнопки void setup() { Serial.begin(9600); irrecv.enableIRIn(); //Включение ИК-приёмника в работу } void loop() { if (irrecv.decode(&results)) //Если произошло событие/кнопка была нажата { Serial.println(results.value, HEX); //Выводим в монитор порта код нажатой кнопки в шестнадцатиричном виде irrecv.resume(); //Считываем следующую значение/кнопку } delay(100); }
После того как скетч был залит в плату Arduino(мы используем Arduino Nano на шилде I/O Wireless Shield for Nano), можно открыть монитор порта и посмотреть какие появляются коды при нажатии кнопок на пульте ДУ. Результат работы скетча представлен на скриншоте ниже:
Кстати, в качестве монитора порта мы используем свой проверенный софт, если кому интересно – почитать статью и скачать Serial Monitor Pro можно здесь.
Далее, нужно оформить полученные коды кнопок в виде констант, сделано это будет примерно так:
#define KEY_ONOFF 0x807F807F //Кнопка Включения/Выключения #define KEY_MUTE 0x807F48B7 //Кнопка Mute #define KEY_1 0x807F00FF //Кнопка 1 #define KEY_2 0x807FE01F //Кнопка 2 #define KEY_3 0x807F609F //Кнопка 3 #define KEY_4 0x807F20DF //Кнопка 4 #define KEY_5 0x807FD02F //Кнопка 5 #define KEY_6 0x807F50AF //Кнопка 6 #define KEY_7 0x807F10EF //Кнопка 7 #define KEY_8 0x807FF00F //Кнопка 8 #define KEY_9 0x807F708F //Кнопка 9 #define KEY_0 0x807FC837 //Кнопка 0
И вот теперь, в общем то всё готово для финального теста – это будет элементарный тест управления включением/выключением релейных модулей. Приведем небольшое задание:
- Используем два релейных модуля
- Реле №1 привязываем к кнопке “1” пульта
- Реле №2 привязываем к кнопке “2” пульта
- Включение любого из релейных модулей производится нажатием на кнопку к которой он привязан
- Выключение любого из релейных модулей также производится нажатием на кнопку к которой он привязан
- Нажатие на кнопку On/Off безусловно выключает оба релейных модуля(если они были включены, либо один из них включеный)
Скетч, который реализует вышеописанное задание:
#include “boarddefs.h” //Добавочная библиотека #include “IRremote.h” #include “IRremoteInt.h” //Добавочная библиотека #define KEY_ONOFF 0x807F807F //Кнопка Включения/Выключения #define KEY_1 0x807F00FF //Кнопка 1 #define KEY_2 0x807FE01F //Кнопка 2 #define RELOUT1 3 //Выходной порт для реле 1 #define RELOUT2 4 //Выходной порт для реле 2 int RECV_PIN = 2; IRrecv irrecv(RECV_PIN); decode_results results; static boolean REL1_ONOFF = false; static boolean REL2_ONOFF = false; void setup() { pinMode(RELOUT1, OUTPUT); pinMode(RELOUT2, OUTPUT); Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver } void loop() { if (irrecv.decode(&results)) { switch(results.value) { case(KEY_ONOFF): REL1_ONOFF = false; REL2_ONOFF = false; break; case(KEY_1): if(REL1_ONOFF) REL1_ONOFF = false; else REL1_ONOFF = true; break; case(KEY_2): if(REL2_ONOFF) REL2_ONOFF = false; else REL2_ONOFF = true; break; } irrecv.resume(); } digitalWrite(RELOUT1, REL1_ONOFF); digitalWrite(RELOUT2, REL2_ONOFF); delay(100); }
И в конце статьи – видео, которое демонстрирует работу обоих скетчей. При желании и наличии творческой фантазии, можно расширить парк подключаемых модулей и управлять этим всем более продвинуто. Мы же в своей статье, постарались привести базовый пример применения этой технологии. Спасибо за внимание и приятного просмотра !!!
Источник: http://arduino.on.kg/peredacha-dannyh-v-infrakrasnom-diapazone-pri-pomoshchi-Arduino
Знакомство с Arduino
Быстрое знакомство с микроконтроллером ATmega в обертке Arduino. Техническая информация Arduino Uno.
Если покопать Интернет на тему управления устройствами с помощью компьютера, то очень быстро находится масса ссылок на Arduino, хотя, если посмотреть подробнее, это не совсем прибор для сопряжения компьютеров с электродвигателями, но вполне может стать и им, если стоит такая задача. На его основе относительно просто сделать то, что вам нужно, т.к. для него существует масса готовых модулей, в т.
ч. для управления электродвигателями. Область его применения ограничена только фантазией. Хотя сам по себе продукт построен на единственной микросхеме (микроконтроллере), которая появилась задолго до него (1996 и 2005 годы соответственно).Микроконтроллер (МК) – однокристальный компьютер, имеющий процессор, память (в т.ч. энергонезависимую) и интерфейсы для ввода и вывода.
Arduino – очень популярный продукт на базе 8-битных МК ATmega типа AVR фирмы Atmel.
В принципе, Arduino – это печатная плата (точнее, несколько разных модификаций) с общеизвестными стандартными габаритами и расположением выводов микроконтроллера, а некоторые модели так же имеют элементы контроля напряжения питания и USB интерфейс, используемый одновременно и для питания и для связи с контроллером через последовательное соединение (USB-serial). Т.е.
по сути Arduino внешне является просто оберткой для МК ATmega, предоставляя стандартный формфактор, облегчающий физическое подключение дополнительных модулей, сделанных по тому же стандарту (Arduino shields).
Кроме этого удобства физического подключения, очень облегчает работу с Arduino (в отличии от работы к МК напрямую) наличие готового открытого ПО для программирования контроллера – среды для разработки со встроенным компилятором и загрузчиком кода в МК, а так же набора библиотек, облегчающих написание некоторых операций.
Специальный загрузчик, заранее записанный в память МК, обеспечивает загрузку и выполнение загруженного кода (т.н. скетчей, как называют программы в терминах Arduino), так что пользователю не нужно задумываться, как загружается и стартует его код.
Достаточно написать скетч в среде разработки и нажать кнопку загрузки – код загрузится в память МК и запустится сразу, а так же будет стартовать автоматически при перезагрузке МК.
Использовать МК ATmega без Arduino конечно можно, а для электронщика, даже любителя, достаточно просто, но для начинающего или вовсе не электронщика, это будет связано с целым рядом сложностей, которые Arduino сводит к минимуму. Хотя, свои минусы Arduino тоже добавляет, но их немного и для большинства применений они не имеют значения. Минусами (для Arduino UNO/Mega) я бы назвал: относительно высокое энергопотребление (основную часть потребляет не микроконтроллер, а элементы регулировки питания) и автоматическую перезагрузку МК при подключении терминала через USB-serial интерфейс (решается различными способами, программными и аппаратными).Первым я приобрел Arduino Uno – пожалуй, самую популярную модель Arduino, снабженную USB портом и входом для внешнего питания, на базе МК ATmega328. Для этой модели (и еще для Arduino Mega 2560) существует большое количество готовых для подключения (без паяльника) модулей и с ней удобно экспериментировать, подключая и отключая эти модули.Внешний вид Arduino Uno R3
Чтобы увидеть, насколько Arduino является «оберткой» МК ATmega, можно изучить схему выводов ATmega328 в исполнении 28DIP и соотнести их описание с выводами Arduino.Почти все выводы МК напрямую соединены с выводами Arduino.
При чем некоторые выводы одновременно и доступны для подключения и задействованы во внутренней схеме, например D0 и D1 одновременно являются RX и TX последовательного интерфейса, подключенного к USB-serial контроллеру, реализованному на отдельном МК ATmega16U (этот МК обслуживает только USB интерфейс и не имеет отношения к функционированию «основного» МК).У Arduino Uno имеется USB интерфейс, который используются как для питания (5В), так и для связи с компьютером, при этом на компьютере он распознается как асинхронный последовательный (COM) порт. Со стороны МК связь с компьютером так же выглядит как обмен данными через последовательный порт.Так же имеется вход для внешнего питания 7-12В. Хотя у меня плата работала и с напряжением 6В (предельные значения 6-20В), все же лучше использовать источник питания в рекомендуемом диапазоне 7-12В. Регулятор напряжения всегда будет выводить напряжение на 5В – рабочее напряжение Arduino Uno. Arduino автоматически переключает питание между USB портом и внешним источником питания, делая выбор в пользу внешнего, если он дает напряжение более 6,6В.В принципе, сам МК ATmega328 может работать и на пониженном напряжении (3.3В), но только на пониженной частоте (8МГц), а на Arduino Uno частота задается внешним источником частоты в 16МГц. Интересно, что внутри самого МК есть внутренний источник частоты 8МГц, который на Arduino Uno не задействован.Подробнее о выводах. Для начала, о наиболее бесполезных :)ISCP для USB интерфейса предназначен для программирования контроллера USB интерфейса и примеры его использования мне неизвестны.ISCP для «основного» МК используется для работы с программатором, через который можно совершать операции, недоступные через обычный последовательный интерфейс – запись загрузчика и изменение фьюзов (fuses), изменяющих поведение МК.Выводы МК делятся (в каком-то роде условно) на цифровые (D0-D13) и аналоговые (A0-A5), хотя при написании программ используется «сквозная» нумерация выводов, т.е. вывод 13 = D13, а 14 = A0, 15 = A1 и т.д.Цифровые выводы могут использоваться и как входы и как выходы (режим входа или выхода задается в программе), аналоговые используются как входы, с разрешением АЦП 10 бит (0-1023) и пределом измерений 5В относительно земли или вывода AREF.
Выводы D0, D2 используются для передачи данных через асинхронный последовательный порт и подключены к USB-serial контроллеру. Внимание – эти выводы нельзя подключать напрямую к порту RS323! Эти выводы используют последовательный интерфейс ТТЛ, который несовместим с RS232 и требует преобразования.
Выводы D2, D3 могут использоваться для вызова внешних прерываний.Выводы D3, D5, D6, D9, D10, и D11 связаны с внутренними счетчиками-таймерами МК и могут использоваться для вывода ШИМ-сигнала (Широтно-импульсная модуляция, PWM) и в качестве счетчиков внешних импульсов.
Выводы D10-D13 могут использоваться для работы с внешними устройствами по протоколу SPI, при чем D10 (SS) используется в случае, если МК является ведомым (slave).Вывод D13 подключен к светодиоду «L» на плате, что никак не влияет на его использование, но может быть полезным для индикации чего-либо.Два вывода I2C в верхнем (или «длинном») ряду – дублируют A4 и A5.
Они могут использоваться для работы с внешними устройствами по протоколу I2C, что является дополнительной функцией A4, A5.Вывод Vin используется для подачи питания от внешнего источника, далее он проходит через регулятор напряжения.Выводы GND, 5V, 3V3 – земля и регулируемое напряжение 5В, 3,3ВВывод IOREF – выдает рабочее напряжение, т.е. 5В для Arduino Uno.
Таким образом, возможности ввода-вывода достаточно разнообразные. Через аналоговые входы можно измерять напряжение сигнала (можно даже сделать осциллограф, но частота измерений будет ограничена скоростью процессора), для цифровых входов-выходов можно как считывать, так и выставлять состояние, в т.ч.
генерировать ШИМ сигнал (обычно используется для управления двигателями или генерирования звука), а через целый ряд интерфейсов можно общаться с внешними устройствами: однопроводная шина на базе любого цифрового вывода, асинхронный последовательный порт, I2C, SPI.При чем I2C и SPI позволяют одновременно подключать множество устройств на одну шину.
Большинство сенсоров для Arduino подключаются с помощью аналоговых входов, однопроводной шины или I2C.Через SPI обычно работают устройства, требующие большой скорости передачи данных (Ethernet shield, WiFi shield).Очень полезно для экспериментов иметь Sensor shield – плату с удобным дублированием всех выводов вместе с землей и питанием для подключения внешних устройств.
Так же очень удобна макетная плата для быстрого подключения устройств и пассивных компонентов без пайки.Нельзя превышать допустимые величины силы тока!Ток на любом отдельном выводе не должен превышать 40 мА.Ток на любой группе выводов (D0-D4, D5-D13, A0-A5) не должен превышать 100 мА.
Ток на всем МК не должен превышать 200 мА.
Источник: http://atroshin.ru/ru/content/znakomstvo-s-arduino
Как подключить RFID считыватель RC522 к Arduino
В этой статье мы рассмотрим подключение к Arduino считывателя карт и брелоков RFID RC522, работающего на частоте 13,56 МГц.
- Arduino (или совместимая плата);
- считыватель RFID RC522 (приобретается здесь);
- беспроводная RFID метка (идёт в комплекте по ссылке выше) или бесконтактный билет на метро/наземный транспорт;
- макетная плата;
- соединительные провода (вот такие);
- компьютер с Arduino IDE.
Модуль RFID-RC522 выполнен на микросхеме MFRC522 фирмы NXP. Эта микросхема обеспечивает двухстороннюю беспроводную (до 6 см) коммуникацию на частоте 13,56 МГц.
Беспроводной модуль RFID-RC522
Микросхема MFRC522 поддерживает следующие варианты подключения:
SPI (Serial Peripheral Interface, последовательный интерфейс для связи периферийных устройств) | до 10 Мбит/сек; |
двухпроводной интерфейс I2C | до 3400 кбод в режиме High-speed,до 400 кбод в режиме Fast; |
последовательный UART (аналог RS232) | до 1228,8 кбод. |
С помощью данного модуля можно записывать и считывать данные с различных RFID-меток: брелоков от домофонов, пластиковых карточек-пропусков и билетов на метро и наземный транспорт, а также набирающих популярность NFC-меток.
RFID – это сокращение от “Radio Frequency IDentification” и переводится как «радиочастотная идентификация».
NFC – это “Near field communication”, «коммуникация ближнего поля» или «ближняя бесконтактная связь».
2Схема подключения RFID-RC522 к Arduino
Подключим модуль RFID-RC522 к Arduino по интерфейсу SPI по приведённой схеме.
Схема подключения RFID-RC522 к Arduino по интерфейсу SPI
Питание модуля обеспечивается напряжением от 2,5 до 3,3 В. Остальные выводы подключаем к Arduino так:
RST | D9 |
SDA (SS) | D10 |
MOSI | D11 |
MISO | D12 |
SCK | D13 |
Не забывайте также, что Arduino имеет специальный разъём ICSP для работы по интерфейсу SPI. Его распиновка также приведена на иллюстрации. Можно подключить выводы RST, SCK, MISO, MOSI и GND модуля RC522 к разъёму ICSP на Ардуино.
3Библиотека для работы Arduino с RFID
Микросхема MFRC522 имеет достаточно обширную функциональность. Познакомиться со всеми возможностями можно изучив её паспорт (datasheet). Мы же для знакомства с возможностями данного устройства воспользуемся одной из готовых библиотек, написанных для работы Arduino с RC522. Скачайте её и распакуйте в директорию Arduino IDElibraries
Установка библиотеки “rfid-master” для работы Arduino с RFID-метками
После этого запустите среду разработки Arduino IDE.
4Скетч для считывания информации, записанной на RFID-метке
Теперь давайте откроем скетч из примеров: Файл Образцы MFRC522 DumpInfo и загрузим его в память Arduino.
Открываем скетч DumpInfo
Данный скетч определяет тип приложенного к считывателю устройства и считывает данные, записанные на RFID-метке или карте, а затем выводит их в последовательный порт.
#include #include const int RST_PIN = 9; // пин RST const int SS_PIN = 10; // пин SDA (SS) MFRC522 mfrc522(SS_PIN, RST_PIN); // создаём объект MFRC522 void setup() { Serial.begin(9600); // инициализация послед. порта SPI.begin(); // инициализация шины SPI mfrc522.PCD_Init(); // инициализация считывателя RC522 } void loop() { // Ожидание прикладывания новой RFID-метки: if ( ! mfrc522.PICC_IsNewCardPresent()) { return; // выход, если не приложена новая карта } // Считываем серийный номер: if ( ! mfrc522.PICC_ReadCardSerial()) { return; // выход, если невозможно считать сер. номер } // Вывод дампа в послед. порт: mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); }
Текст скетча достаточно хорошо прокомментирован.
Для более полного знакомства с библиотекой изучите файлы MFRC522.h и MFRC522.cpp из директории rfid-master.
5Дамп данных с RFID-метки
Запустим монитор последовательного порта сочетанием клавиш Ctrl+Shift+M, через меню Инструменты или кнопкой с изображением лупы. Теперь приложим к считывателю билет метро или любую другую RFID-метку. Монитор последовательного порта покажет данные, записанные на RFID-метку или билет.
Считываем данные с билета на наземный транспорт и метро с помощью RFID
Например, в моём случае здесь зашифрованы уникальный номер билета, дата покупки, срок действия, количество оставшихся поездок, а также служебная информация. Мы разберём в одной из будущих статей, что же записано на карты метро и наземного транспорта.
Примечание
Да, с помощью модуля RFID-RC522 можно записать данные на билет метро.
Но не обольщайтесь, каждая карта имеет неперезаписываемый счётчик циклов записи, так что «добавить» поездок себе на метро не получится – это сразу будет обнаружено и карта будет забракована турникетом 🙂 А вот использовать билеты метро для записи на них небольших объёмов данных – от 1 до 4 кб – можно. И способы применения этому ограничены только вашей фантазией.
Источник: https://soltau.ru/index.php/arduino/item/399-kak-podklyuchit-rfid-schityvatel-rc522-k-arduino
Как подключить к Arduino..
Надо заметить, что один светодиод к 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
Источник: http://easymcu.ucoz.ru/publ/12-1-0-106