Оглавление
Программная эмуляция
Платформа Arduino Nano Every с микроконтроллером ATmega4809 поддерживает программную эмуляцию для полной совместимости с платой предшественника Arduino Nano с микроконтроллером ATmega328.
-
Включение совместимости:
Инструменты
Registaers Emulation
ATMEGA328 -
Отключение совместимости:
Инструменты
Registaers Emulation
None (ATMEGA4809)
Эмуляция будет полезна, только если одновременно выполнены следующие пункты:
- Ваш проект собран на базовой плате Arduino Nano.
- Вы решили перейти с платы Arduino Nano на плату Arduino Nano Every.
- В коде прошивки использованы не базовые функции языка C++, а именно регистры микроконтроллера ATmega328.
- Вам лень менять код.
Во всех остальных случаях рекомендуем не включать эмуляцию.
Что это такое?
В этой статье мы расскажем о том, как можно реализовать голосовое управление
для своего проекта. Вы сможете говорить роботу, куда ему двигаться,
включать/выключать свет, собрать замок, отпирающийся только на ваш голос, или
голосовой тир для тренировки произношения иностранных слов. Разумеется
реализовать распознавание голоса у новичка самостоятельно не получится. Но есть
готовое решение. Мы покажем, как пользоваться этим решением, на примере
голосового тира.
Наше устройство должно будет слушать игрока, распозновать его речь и опускать
карточку на несколько секунд, как только правильно было произнесено написанное
на ней слово.
В качестве упомянутого готового решения мы возьмём плату
EasyVR 3 Plus Shield,
которая предоставляет простой интерфейс к сложно реализуемым функциям
распознавания голоса.
Пояснения к коду
- Очень часто бывает полезно обмениваться данными, например, с компьютером. В частности, для отладки работы устройства: можно, например, смотреть, какие значения принимают переменные.
-
В данном эксперименте мы знакомимся со стандартным объектом , который предназначен для работы с последовательным портом (UART) Arduino, и его методами (функциями, созданными для работы с данным объектом) , и , которые вызываются после точки, идущей за именем объекта:
-
чтобы обмениваться данными, нужно начать соединение, поэтому вызывается в
- отправляет содержимое . Если мы хотим отправить текст, можно просто заключить его в пару двойных кавычек: . Кириллица, скорее всего, будет отображаться некорректно.
- делает то же самое, только добавляет в конце невидимый символ новой строки.
-
- В и можно использовать второй необязательный параметр: выбор системы счисления, в которой выводить число (это может быть , , , для десятичной, двоичной, шестнадцатеричной и восьмеричной систем счисления соответственно) или количество знаков после запятой для дробных чисел.
Например,
Serial.println(18,BIN); Serial.print(3.14159,3);
в мониторе порта даст результат
10010 3.142
- Монитор порта, входящий в Arduino IDE, открывается через меню Сервис или сочетанием клавиш Ctrl+Shift+M. Следите за тем, чтобы в мониторе и в скетче была указана одинаковая скорость обмена данными, . Скорости 9600 бит в секунду обычно достаточно. Другие стандартные значения можете посмотреть в выпадающем меню справа внизу окна монитора порта.
- Вам не удастся использовать цифровые порты 0 и 1 одновременно с передачей данных по последовательному порту, потому что по ним также идет передача данных, как и через USB-порт платы.
- При запуске монитора порта скетч в микроконтроллере перезагружается и начинает работать с начала. Это удобно, если вам нельзя упустить какие-то данные, которые начинаю передаваться сразу же. Но в других ситуациях это может мешать, помните об этом нюансе!
- Если вы хотите читать какие-то данные в реальном времени, не забывайте делать хотя бы на 100 миллисекунд, иначе бегущие числа в мониторе будет невозможно разобрать. Вы можете отправлять данные и без задержки, а затем, к примеру, скопировать их для обработки в стороннем приложении.
- Последовательность выводится как символ табуляции (8 пробелов с выравниванием). Также вы можете использовать, например, последовательность для перевода строки. Если вы хотите использовать обратный слеш, его нужно экранировать вторым таким же: .
Работа программного обеспечения
Интерфейс DS5000
Программа, приведённая в Приложении, написана для взаимодействия DS5000 с DS1307 с помощью двухпроводного интерфейса. DS5000 запрограммирован с использованием макетной платы DS5000T фирмы Dallas Semiconductor, которая позволяет использовать ПК в качестве терминала ввода/вывода. Программные средства KIT5K поставляемые вместе с макетной платой DS5000T обеспечивают высокоуровневый интерфейс для загрузки программных приложений в DS5000 или установки его параметров через Program command. Программное обеспечение KIT5K содержит эмулятор терминала ввода/вывода, чтобы позволить пользователю запускать программные приложения в микроконтроллер DS5000, который связан с пользователем через COM порт ПК.
Исходный код DS1307
Первый раздел исходного кода, расположенный в Приложении, используется при конфигурации DS5000 для последовательного соединения с ПК. Также в начале кода находится подпрограмма MASTER_CONTROLLER, которая используется для управления демонстрационной программой.
Подпрограммы, которые следуют непосредственно за подпрограммой MASTER_CONTROLLER, являются драйверами низкого уровня и служат для управления двухпроводным интерфейсом. Они не являются индивидуальными для DS1307, а могут быть использованы с любым совместимым с двухпроводным интерфейсом «ведомым» устройством. Вот эти подпрограммы:
SEND_START
Подпрограмма используется для генерации состояния START на двухпроводной шине.
SEND_STOP
Подпрограмма используется для генерации состояния STOP на двухпроводной шине.
SEND_BYTE
Подпрограмма посылает 8-разрядное слово (первым является старший значащий бит (MSB)) по двухпроводной шине и девятый тактовый импульс для импульса подтверждения приёма.
READ_BYTE
Подпрограмма читает 8-разрядное слово с двухпроводной шины. Она проверяет очищен ли флаг LASTREAD после того, как считан последний байт из «ведомого» устройства. Если это был не последний байт, то DS5000 посылает импульс подтверждения по девятому тактовому импульсу, а если это был последний считанный байт из «ведомого» устройства, то DS5000 посылает «неподтверждение».
SCL_HIGH
Подпрограмма осуществляет переход линии SCL из низкого в высокое состояние и обеспечивает высокое состояние линии SCL перед продолжением.
DELAY и DELAY_4
Эти две подпрограммы включены для обеспечения сохранения временной диаграммы двухпроводной шины.
Остальная часть кода, включённая в приложение, специально предназначена для демонстрации функций DS1307. Продемонстрированы следующие функции:
Setting Time
Время считывается с клавиатуры и сохраняется в сверхоперативной памяти DS5000. Затем оно передаётся по двухпроводной шине в DS1307.
Set RAM
Одиночный байт в шестнадцатеричном виде считывается с клавиатуры и записывается в RAM DS1307.
Read Date/Time
Дата и время считываются по двухпроводной шине и сохраняются в сверхоперативной памяти DS5000. Затем они выводятся на экран. Это продолжается до тех пор, пока не будет нажата кнопка на клавиатуре.
OSC On/OSC Off
Тактовый генератор DS1307 может быть включен или выключен.
SQW/OUT On/SQW/OUT Off
Функция SQW/OUT может быть включена или выключена. Она будет переключаться на частоте 1 Гц.
Таблица 1. AC электрические характеристики
Параметр | Символ | Эффективноезначение | Единицы |
Тактовая частота SCL | fSCL | 59 | кГц |
Время свободного состояния шины между состояниями STOP и START | tBUF | 5.7 | мкс |
Время удержания(повторенного) состояния START | tHD:STA | 6.2 | мкс |
Период низкого состояния тактового импульса SCL | tLOW | 10.5 | мкс |
Период высокого состояния тактового импульса SCL | tHIGH | 6.5 | мкс |
Время установки для повторного состояния START | tSU:STA | 5.3 | мкс |
Время удержания данных | tHD:DAT | 5.5 | мкс |
Время установки данных | tSU:DAT | 3.1 | мкс |
Время установки для состояния STOP | tSU:STO | 5.4 | мкс |
Заключение
Было показано, как правильно подсоединять напрямую DS1307 или любое двухпроводное «ведомое» устройство к 8051-совместимому микроконтроллеру. Соединение должно быть таким, чтобы временная диаграмма двухпроводного интерфейса на микроконтроллере не нарушалась драйверами низкого уровня. Для этого в программный код должны быть включены подпрограммы задержки. Приведённых в таблице 1 эффективных значений, придерживались при конфигурации аппаратной части, описанной в данном техническом руководстве.
Документация
Rus Пример программы на языке Асемблер | ||
100 Kb Engl Исходный фаил | ||
Rus Описание интерфейса I2C | ||
Програмное обеспечение микроконтроллеров MCS-51 | ||
200 Kb Engl Описание DS1307 — часы реального времени с IIC интерфейсом |
Главная —
Микросхемы —
DOC —
ЖКИ —
Источники питания —
Электромеханика —
Интерфейсы —
Программы —
Применения —
Статьи
Наборы Матрешка
В серии «Матрешка» компания предлагает 4 типа наборов, которые отличаются по количеству компонентов:
- «Матрешка X» – самый простой, так называемый базовый набор. Очень подходит тем, кто совершенно не имеет опыта, а также радиодеталей для начала работы с Ардуино. В его состав включена самая распространенная плата – Ардуино Уно и набор деталей для создания 8 простых проектов, из 20 описанных в брошюре;
- «Матрешка Y» – более расширенная версия предыдущего набора, и благодаря дополненной комплектации позволяет собрать уже целых 17 устройств;
- «Матрешка Z» – полная версия, при помощи которой собираются все 20 устройств из прилагаемой брошюры.
Компоненты, присутствующие в каждом наборе – это:
- Arduino UNO;
- Брошюра с описанием экспериментов;
- Макетка Breadboard Half;
- Резисторы на 10 кОм (10 шт.);
- Потенциометр;
- Светодиоды (5 мм, красного цвета) – 12 шт.;
- Тактовая кнопка (5 шт.);
- Провода для соединения («папа-папа» – 65 шт.);
- Кабель USB тип A — B.
Для удобства, отличия комплектов каждого из наборов серии сведены в таблицу:
Компонент | Матрешка X | Матрешка Y | Матрешка Z |
Резисторы 220 Ом | 10 | 30 | 30 |
Резисторы 1 кОм | Нет | 10 | 10 |
Фоторезистор | Нет | 1 | 1 |
Термистор | Нет | 1 | 1 |
Керамический конденсатор на 100 нФ | Нет | 10 | 10 |
Электролитический конденсатор на 10 мкФ | Нет | 10 | 10 |
Электролитический конденсатор на 220 мкФ | Нет | 10 | 10 |
Биполярные транзисторы | Нет | 5 | 5 |
Полевой транзистор MOSFET | Нет | 1 | 1 |
Выпрямительные диоды | Нет | 5 | 5 |
Светодиоды зеленые (5 мм) | Нет | 4 | 4 |
Светодиоды желтые (5 мм) | Нет | 4 | 4 |
Светодиод трехцветный | Нет | 1 | 1 |
Индикатор семисегментный | Нет | 1 | 1 |
Пищалка Пьезо | Нет | 1 | 1 |
Сдвиговый регистр 74HC595 | Нет | 1 | 1 |
Триггер Шмитта | Нет | 1 | 1 |
Нажимной клеммник | Нет | 1 | 1 |
Кабель для подачи питания от батареи типа «Крона» | Нет | 1 | 1 |
Соединитель штырькового типа (1*40) | Нет | 1 | 1 |
Моторчик FA-130 | Нет | нет | 1 |
Шкала светодиодная | Нет | нет | 1 |
Микросервопривод | Нет | нет | 1 |
Экран текстовый 16*2 | Нет | нет | 1 |
Отдельного внимания заслуживает набор из серии – «Матрешка Интернет вещей», который является продолжением и дополнением к указанным комплектам, и дает возможность подключить созданные электронные устройства к Интернету. Входящий в его комплект красочный буклет поможет сделать первые шаги на пути создания модели умного дома, в котором многие рутинные процессы можно автоматизировать, а также обеспечить их контроль и выполнение через сеть.
Среди основных преимуществ наборов «Матрешка» можно отметить:
- Многофункциональность;
- Наличие полного спектра приспособлений и деталей для легкого старта начинающего ардуинщика;
- Простые инструкции с подробным объяснением;
- Компактная упаковка. Такой набор станет отличным подарком любознательному ребенку.
Как это собрать?
Сборка ведущего устройства
- Установите RS485-шилд на Arduino Leonardo.
- Подключите импульсный источник питания к Arduino Leonardo.
- Подключите линии «A» и «B» сети RS485 к клеммнику.
- Подключите линии «GND» и «VIN» сети RS485 к соответствующим выводам Arduino.
- Подключите USB-кабелем плату Arduino к ПК.
Сборка ведомого устройства
- Установите Troyka-шилд на Arduino Uno.
- Установите RS485-шилд на Troyka-шилд.
- Подключите дальномеры к аналоговым тройкам A0 и A1.
- Подключите линии «A» и «B» сети RS485 к клеммнику.
- Подключите линии «GND» и «VIN» сети RS485 к соответствующим выводам Arduino.
Прокладка сети
-
Воспользуйтесь витой парой или скрутите два провода в витую пару при помощи шуруповёрта.
- Протяните витую пару так, чтобы от неё до каждого из ваших устройств было расстояние не более 1 м.
-
Соедините каждое устройство с линией. Разрывать её не обязательно. Можно воспользоваться таким способом: В итоге у вас должна получиться приблизительно такая сеть:
- На всех платах установите переключатель выбора режима работы в ручной режим и включите передатчик (переключатель ON/OFF).
Пояснения к коду
- Массив состоит из элементов одного типа, в нашем случае .
- Объявить массив можно следующими способами:
int firstArray6; // 6 целых чисел с неопределёнными начальными значениями int pwmPins = {3, 5, 6, 9, 10, 11}; // 6 целых чисел, длина вычисляется автоматом boolean buttonState3 = {false, true, false}; // можно использовать элементы любого типа
- Когда мы объявляем массив с указанием количества его элементов n, это число всегда на 1 больше, чем номер последнего элемента (n-1), т.к. индекс первого элемента — 0.
- Считать или записать значение элемента массива можно, обратившись к нему по индексу, например или , где — переменная, такая как счетчик цикла
- В переменных типа можно хранить значения до 2 147 483 647. в этом случае нам будет недостаточно, потому что 65 535 миллисекунд пройдут чуть больше чем за минуту!
- Функция возвращает целое псевдослучайное число в интервале . Для драматичности каждая игра начинается с паузы случайной длины.
- Благодаря массивам в этом эксперименте мы настраиваем порты, считываем кнопки и включаем светодиоды в циклах со счетчиком, который используется как индекс элемента.
- Мы используем цикл без условия его завершения, поэтому пока мы явно того не потребуем, цикл будет крутиться до бесконечности.
- Мы использовали выражение для счётчика цикла, чтобы не только увеличивать его на единицу каждый раз, но и обнулять при достижении последнего игрока.
- Инструкция прекращает работу цикла и выполнение программы продолжается с инструкции после его конца.
Пояснения к коду
- Поскольку мы сконфигурировали вход кнопки как , при нажатии на кнопку на данном входе мы будем получать 0. Поэтому мы получим значение («истина») в булевой переменной («кнопка отпущена»), когда кнопка отпущена.
- Логический оператор («и») возвращает значение «истина» только в случае истинности обоих его операндов. Взглянем на так называемую таблицу истинности для выражения («кнопка была отпущена и кнопка не отпущена»):
1 | |||
1 | |||
1 | 1 | 1 | |
1 | 1 |
Здесь рассмотрены все возможные сочетания предыдущего и текущего состояний кнопки и мы видим, что наш условный оператор сработает только в случае, когда кнопка нажата только что: предыдущее состояние 1 («была отпущена»), а текущее 0 («не отпущена»).
- Через 10 миллисекунд мы проверяем еще раз, нажата ли кнопка: этот интервал больше, чем длительность «дребезга», но меньше, чем время, за которое человек успел бы дважды нажать на кнопку. Если кнопка всё еще нажата, значит, это был не дребезг.
- Мы передаем в не конкретное значение или , а просто булеву переменную . В зависимости от того, какое значение было для нее вычислено, светодиод будет зажигаться или гаситься.
- Последняя инструкция в сохраняет текущее состояние кнопки в переменную предыдущего состояния, ведь на следующей итерации текущее состояние уже станет историей.
Как собрать?
- Возьмите платформу Arduino Leonardo ETH и нижнюю панель кубa (7×7), соедините её с помощью винтов и гаек, так чтобы гайки располагались между панелью и платформой.
- Установите Troyka Shield через контактные колодки сверху на Arduino Leonardo ETH.
- Боковые панели куба (7×7) соедините с нижней панелью (7×7). Заднюю панель куба (7×3) закрепите между левой и правой панелями внизу, напротив разъёмов USB, Ethernet и внешнего питания платформы Arduino Leonardo ETH, заранее отделив бокорезами секции, мешающие ей устойчиво зафиксироваться.
- Возьмите микросервопривод FS90 и с помощью двух специальных панелей для крепления сервоприводов, двух панелей (3×3) и двух панелей (3×2) нашего конструктора сделайте домик для микросервопривода. Это будет плечо робота. Повторите процесс со вторым микросервоприводом.
- Из комплектации микросервопривода возьмите качельку овальной формы и через специальную панель (5×2) с вырезом для неё, закрепите к валу сервопривода болтиком также входящим в комплектацию сервомотора. Далее к этой панели с помощью двух панелей конструктора (5×2) и одной панели (6×2) соберите кисть робота. В итоге мы получили руку робота, где кисть — подвижная часть, а плечо — статичная. Повторите процесс со вторым микросервоприводом.
- Теперь к левой и правой боковым стенкам куба закрепите руки робота. Подключите микросервоприводы левой и правой руки через 3-проводные шлейфы к и пину Troyka Shield соответственно.
- Возьмите два красных светодиода «Пиранья» и прикрутите их с помощью акриловых болтов к панели для крепления двух Troyka-модулей.
- Далее используя панель с закреплёнными светодиодами, две панели (6×3) и две панели (3×3) конструктора ПВХ сделайте голову роботу, заранее подключив 3-проводные шлейфы от светодидов.
- Возьмите заднюю панель куба (7×2) и установите её между левой и правой панелями в верхней части. Далее возьмите панель крестиков (1×6) и установите между задними панелями (7×3) и (7×2). С помощью заранее выведенных 3-проводных шлейфов из головы робота подключите светодиоды «Пиранья» к и пину Troyka Shield. Установите верхнюю панель куба (7×7) на левую и правую панели.
- Так как регулятор напряжения, установленный на плате Arduino Leonardo ETH, не может выдавать ток, обеспечивающий стабильную работу сервомоторов, мы будем запитывать всю конструкцию от отдельного источника питания на . Для этого возьмите гнездо питания 2,1 мм и с помощью проводов «папа-папа» через верхнюю панель куба соедините пин Arduino с клеммника, а пин Arduino с клеммника. В результате должна получиться такая схема:
- Возьмите четыре панели крестиков (1×3) и установите две из них на нижнюю часть головы робота, а другие две на верхнюю часть куба.
- Установите голову робота через панели крестиков (1×3) на верхнюю панель куба. Соедините переднюю панель куба (6×7) с нижней панелью.
- Используя две панели (3×7) и четыре панели (2×4) конструктора ПВХ сделаем ноги для робота.
- Поставьте робота на ноги.
- Какой же музыкант без инструмента и шляпы. Установите в руки робота маракасы и сделайте для своего Мариачи праздничное сомбреро
Wi-Fi модуль как самостоятельный контроллер
Wi-Fi (Troyka-модуль) — очень умный модуль. Под металлической крышкой прячется целый микроконтроллер, который можно программировать на языке C++ через и JavaScript через .
Настройка железа
-
Ввиду отсутствия у платформы Troyka WiFi собственного USB-порта, подключите её к компьютеру, используя один из перечисленных способов:
-
через платформу Arduino Uno
-
через USB-Serial адаптер
-
через USB-UART преобразователь
-
-
Переведите модуль в режим программирования:
Необходимо каждый раз выполнять перед прошивкой модуля.
- Зажмите кнопку ;
- Нажмите и отпустите кнопку ;
-
Отпустите кнопку
- Железо готово, приступайте к программной части.
, которые можно использовать для управления или считывание данных с других устройств.
Программирование на C++
- Для начала работы с платформой Troyka Wi-Fi на языке C++ скачайте и установите на компьютер интегрированную среду разработки Arduino IDE.
-
В пункте меню
Инструменты
Плата выбирайте .
После выполненных действий платформа Troyka Wi-Fi готова к программированию через Arduino IDE.
Программирование на JavaScript
- Для старта с платформой Troyka Wi-Fi на языке JavaScript скачайте и установите интегрированную среду разработки Espruino Web IDE.
- Установите прошивку-интерпретатор JavaScript на ESP8266.
После выполненных действий платформа Troyka Wi-Fi готова к программированию через Espruino Web IDE.
Скетч
- p160_meteostation.ino
-
#include <math.h> int minute = 1; // Параметр конкретного типа термистора (из datasheet): #define TERMIST_B 4300 #define VIN 5.0 void setup() { // мы хотим передавать информацию на компьютер через USB, а // точнее через последовательный (англ. serial) порт. // Для этого необходимо начать (англ. begin) передачу, указав // скорость. 9600 бит в секунду — традиционная скорость. // Функция «begin» не является глобальной, она принадлежит // объекту с именем «Serial». Объекты — это «продвинутые» // переменные, которые обладают собственными функциями, // к которым обращаются через символ точки. Serial.begin(9600); // передаём заголовок нашей таблицы в текстовом виде, иначе // говоря печатаем строку (англ. print line). Символы «\t» — // это специальная последовательность, которая заменяется на // знак табуляции (англ. tab): 8-кратный выровненный пробел Serial.println("Minute\tTemperature"); } void loop() { // вычисляем температуру в °С с помощью магической формулы. // Используем при этом не целые числа, а вещественные. Их ещё // называют числами с плавающей (англ. float) точкой. В // выражениях с вещественными числами обязательно нужно явно // указывать дробную часть у всех констант. Иначе дробная // часть результата будет отброшена float voltage = analogRead(A0) * VIN 1024.0; float r1 = voltage (VIN - voltage); float temperature = 1.( 1.(TERMIST_B)*log(r1)+1.(25. + 273.) ) - 273; // печатаем текущую минуту и температуру, разделяя их табом. // println переводит курсор на новую строку, а print — нет Serial.print(minute); Serial.print("\t"); Serial.println(temperature); delay(60000); // засыпаем на минуту ++minute; // увеличиваем значение минуты на 1 // откройте окно Serial Monitor в среде Arduino, оставьте на // сутки, скопируйте данные в Excel, чтобы построить графики }
Скетч
- p040_thermenvox.ino
-
// даём имена для пинов с пьезопищалкой (англ. buzzer) и фото- // резистором (англ. Light Dependent Resistor или просто LDR) #define BUZZER_PIN 3 #define LDR_PIN A0 void setup() { // пин с пьезопищалкой — выход... pinMode(BUZZER_PIN, OUTPUT); // ...а все остальные пины являются входами изначально, // всякий раз при подаче питания или сбросе микроконтроллера. // Поэтому, на самом деле, нам совершенно необязательно // настраивать LDR_PIN в режим входа: он и так им является } void loop() { int val, frequency; // считываем уровень освещённости так же, как для // потенциометра: в виде значения от 0 до 1023. val = analogRead(LDR_PIN); // рассчитываем частоту звучания пищалки в герцах (ноту), // используя функцию проекции (англ. map). Она отображает // значение из одного диапазона на другой, строя пропорцию. // В нашем случае -> . Так мы получим // частоту от 3,5 до 4,5 кГц. frequency = map(val, , 1023, 3500, 4500); // заставляем пин с пищалкой «вибрировать», т.е. звучать // (англ. tone) на заданной частоте 20 миллисекунд. При // cледующих проходах loop, tone будет вызван снова и снова, // и на деле мы услышим непрерывный звук тональностью, которая // зависит от количества света, попадающего на фоторезистор tone(BUZZER_PIN, frequency, 20); }
Как собрать?
- Для начала вставьте сим-карту в GPRS Shield и установите его на платформу Iskra Neo.
- Подключите внешнюю антенну через SMA-разъём.
- На платах Arduino с микроконтроллером ATmega32U4 (Iskra Neo, Arduino Leonardo, Arduino ETH, Arduino Micro и Arduino Yún) пины и используются для протокола I²C. В GPRS Shield контакты и также по умолчанию находятся на пинах и . Чтобы избежать конфликта с I²C-гироскопом перебросим контакты и GPRS Shield’a на пины и . Для этого снимите джамперы с контактов и GPRS Shield’a. На их место воткните два провода «мама-мама».
- Присоедините к Troyka Shield контактные колодки и установите получившуюся конструкцию на GPRS Shield. Соединяем с помощью проводов «мама-мама» контакты и GPRS Shield’a с пинами и платы Iskra Neo соответственно.
-
Используя два 3-проводных шлейфа подключите Troyka-гироскоп к Troyka Shield следующим образом:
Контакты питания:
- Земля (G) — чёрный провод. Соединить с пином Troyka Shield.
- Питание (V) — красный провод. Соединить с пином Troyka Shield.
- Не используется.
Контакты шины I²C:
- Сигнальный (D) — чёрный провод. Подключить к пину Troyka Shield.
- Сигнальный (С) — красный провод. Подключить к пину Troyka Shield.
- Не используется.
Используйте 3-проводной шлейф, чтобы подключить Troyka-светодиод к цифровому пину на Troyka Shield.
Теперь подключите динамик и микрофон в соответствующие разъёмы GPRS Shield.
Вставьте шесть NiMH аккумуляторов в батарейный отсек 3×2 AA. Через штекер питания 2,1 мм с клеммником подключите его к плате Iskra Neo.По итогу должна получиться следующая схема:
Теперь вам нужно упаковать устройство в плюшевого зверя. Для этого переверните игрушку спиной к себе, сделайте аккуратный надрез по шву и разместите всю электронику внутри. Проще сразу взять игрушку с молнией на спине, как у нас, иначе замаетесь штопать, и получите в итоге монстра Франкинштейна вместо милой зверушки.
Алгоритм
- После подключения питания ничего не делаем пока не нажата кнопка «старт/сброс»;
-
Проверяем текущее количество очков. Если значение очков дошло до левой или правой границы интервала:
- заканчиваем игру;
- показываем светодиодом победителя;
- переходим в режим ожидания нажатия кнопки «старт/сброс»;
- Считываем данные с сенсоров;
-
Если значение сенсора первого игрока превысило порог:
- отнимаем от общего числа очков единицу;
- мигаем светодиодом об удачном прыжке;
- если количество очков кратно 3, включаем «помпу 1» на 3 секунды. Если помпа в данный момент работает, добавляем к времени её работы ещё 3 секунды.
-
Если значение сенсора второго игрока превысило порог:
- прибавляем к общему числу очков единицу;
- мигаем светодиодом об удачном прыжке;
- если количество очков кратно 3, включаем «помпу 2» на 3 секунды. Если помпа в данный момент работает, добавляем к её времени работы ещё 3 секунды.
Пояснения к коду
- Процедура выполняется один раз при запуске микроконтроллера. Обычно она используется для конфигурации портов микроконтроллера и других настроек
- После выполнения запускается процедура , которая выполняется в бесконечном цикле. Именно этим мы пользуемся в данном примере, чтобы маячок мигал постоянно
- Процедуры и должны присутствовать в любой программе (скетче), даже если вам не нужно ничего выполнять в них — пусть они будут пустые, просто не пишите ничего между фигурными скобками. Например:
void setup() { }
Запомните, что каждой открывающей фигурной скобке всегда соответствует закрывающая . Они обозначают границы некого логически завершенного фрагмента кода. Следите за вложенностью фигурных скобок
Для этого удобно после каждой открывающей скобки увеличивать отступ на каждой новой строке на один символ табуляции (клавиша Tab)
Обращайте внимание на в концах строк. Не стирайте их там, где они есть, и не добавляйте лишних
Вскоре вы будете понимать, где они нужны, а где нет.
Функция не возвращает никакого значения и принимает два параметра:
— номер цифрового порта, на который мы отправляем сигнал
— значение, которое мы отправляем на порт. Для цифровых портов значением может быть (высокое, единица) или (низкое, ноль)
Если в качестве второго параметра вы передадите функции значение, отличное от , , или , компилятор может не выдать ошибку, но считать, что передано . Будьте внимательны
Обратите внимание, что использованные нами константы: , , , , пишутся заглавными буквами, иначе компилятор их не распознает и выдаст ошибку. Когда ключевое слово распознано, оно подсвечивается синим цветом в Arduino IDE
Скетч
- p170_servo.ino
-
// управлять сервоприводами (англ. servo motor) самостоятельно // не так то просто, но в стандартной библиотеке уже всё // заготовлено, что делает задачу тривиальной #include <Servo.h> #define POT_MAX_ANGLE 270.0 // макс. угол поворота потенциометра // объявляем объект типа Servo с именем myServo. Ранее мы // использовали int, boolean, float, а теперь точно также // используем тип Servo, предоставляемый библиотекой. В случае // Serial мы использовали объект сразу же: он уже был создан // для нас, но в случае с Servo, мы должны сделать это явно. // Ведь в нашем проекте могут быть одновременно несколько // приводов, и нам понадобится различать их по именам Servo myServo; void setup() { // прикрепляем (англ. attach) нашу серву к 9-му пину. Явный // вызов pinMode не нужен: функция attach сделает всё за нас myServo.attach(9); } void loop() { int val = analogRead(A0); // на основе сигнала понимаем реальный угол поворота движка. // Используем вещественные числа в расчётах, но полученный // результат округляем обратно до целого числа int angle = int(val 1024.0 * POT_MAX_ANGLE); // обычная серва не сможет повторить угол потенциометра на // всём диапазоне углов. Она умеет вставать в углы от 0° до // 180°. Ограничиваем угол соответствующе angle = constrain(angle, , 180); // и, наконец, подаём серве команду встать в указанный угол myServo.write(angle); }