Arduino Nano: обзор и характеристики платы от Arduino

О плате

Ардуино Нано — это аналог Arduino Uno, которая также работает на чипе ATmega328P, но отличается формфактором платы, которая в 2-2,5 раза меньше, чем Уно (53 х 69 мм). Размеры подобны пачке сигарет, и позволяют легко собирать сложные схемы навесным монтажом, но после стадии создания макета идёт сборка действующих экземпляров, а для этого лучше подходит как раз Нано.

Размер Arduino Nano:
19 x 43 мм

В остальном, способы взаимодействия и характеристики чипов совпадают с базовой моделью Уно, которая больше подходит для экспериментов, чем для реальных проектов. Нет более насущной проблемы для любителя электроники, чем желание красиво и компактно оформить своё устройство.

Платформа имеет контакты в виде пинов, поэтому ее легко устанавливать на макетную плату. Arduino Nano используется там где важна компактность, а возможностей Mini либо не хватает, либо не хочется заниматься пайкой.

Смотрите по теме: Индикатор уровня воды c помощью Arduino Nano

Резюмируя

Теперь по сути дела: датчики, их куча кучная, измерять можно ну просто всё, что вообще измеряется. Электроника: напряжение, ток, сопротивление, работа с переменным током, поля. Параметры микроклимата: температура, влажность, давление, содержание газов, скорость ветра, освещенность, что угодно. Интересных модулей тоже очень много: Bluetooth, сотовая связь, GPS, дисплеи различных типов и размеров, датчики присутствия, как ИК, так и микроволновые, модули для беспроводной связи ардуинок и многое другое.

Можно управлять абсолютно любой железкой, которая выполняет свою функцию просто при подаче питания: лампочка, светодиодная лента, электронагреватель, мотор или любой электропривод, электромагнит, соленоид-толкатель, и это все с любым напряжением питания. Но тут нужно кое что понять: Ардуино (точнее микроконтроллер) – логическое устройство, то есть по-хорошему она должна только отдавать команды другим устройствам, или принимать их от них. Это я к тому, что напрямую от ардуино не работают ни лампочки, ни моторчики, ни нагреватели, ни-хуче-го. Максимум – светодиод. С пониманием этого идём дальше. Чтобы ардуино включила или выключила (подала питание) на другое устройство, нужно устройство – посредник, например реле или транзистор. Ардуино управляет реле, а реле в свою очередь включает любую нужную нагрузку с любым напряжением питания и все такое, подробнее об этом поговорим отдельно.

Как суть всего выше написанного – возможности Ардуино по подключению и управлению различными железками практически безграничны, можно воплотить любую идею, даже самую безумную. Датчики что то измеряют, исполнительные устройства что то контролируют, в это же время ведётся отсылка данных куда-нибудь, что-то отображается на дисплее и контролируется при помощи кнопок. Романтика!

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

Характеристики Arduino Nano

МикроконтроллерAtmel ATmega168 или ATmega328
Рабочее напряжение (логическая уровень)5 В
Входное напряжение (рекомендуемое)7-12 В
Входное напряжение (предельное)6-20 В
Цифровые Входы/Выходы14 (6 из которых могут использоваться как выходы ШИМ)
Аналоговые входы8
Постоянный ток через вход/выход40 mAh с одного вывода и 500 mAh со всех выводов
Флеш-память16 Кб (ATmega168) или 32 Кб (ATmega328) при этом 2 Кб используются для загрузчика
ОЗУ1 Кб (ATmega168) или 2 Кб (ATmega328)
EEPROM512 байт (ATmega168) или 1 Кб (ATmega328)
Тактовая частота16 МГц
Размеры1.85 см x 4.2 см

В первую очередь в разговоре о характеристиках нужно отметить, что Нано выпускается в различных версиях и самые распространённые:

  • Nano v.2;
  • Nano v.3.

Главное отличие – в самом микроконтроллере. Младшая версия использует Atmega168, Atmega328. Основные отличия чипов – это объём Flash-памяти:

  • mega 328: Flash-память – 32 кб, ПППЗУ – 1024 и ОЗУ – 2 кб;
  • mega 168: Flash-память – 16 кб, ПППЗУ – 512 и ОЗУ – 1 кб.

ПППЗУ — это перепрограммируемые запоминающее устройство.

Главный конкурент Arduino Nano по размеру – это Arduino Micro. В целом они похожи, но у «микро» интерфейс SPI разведен на другие пины, как и шина I2C, а также изменено количество выводов прерываний. В целом, платы похожи размерами, но различны соотношения сторон, а также некоторые схемотехнические нюансы.

Arduino Nano имеет 8 аналоговых входов, они могут использоваться как цифровой выход, 14 цифровых из которых 6 могут работать как широтно-импульсный модулятор (ШИМ), еще два задействованы под I2C и 3 под SPI.

В противоположном конце платы от разъёма микро-юсб расположена колодка Arudino ICSP для прошивки микроконтроллера.

ШИМ выходы и транзисторы помогут вам: регулировать обороты двигателя, яркость светодиодов, мощность нагревателей и многое другое. А аналоговые входы позволят читать значения с аналоговых датчиков, таких как:

  • фоторезисторы;
  • терморезисторы;
  • термопары;
  • измерители влажности;
  • датчики давления и другие.

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

На базе платы Nano получится отличный миниатюрный программатор Arduino ISP, для прошивки целого ряда контроллеров.

Объяснение скетча для мастера

Основная часть кода как для ведущего, так и для ведомых устройств — это то, что я называю логическим кодом мигания. Чтобы мигнуть светодиодом 13 на Ардуино, мы должны сделать следующее:

  • Добавим глобальные переменные byte i2c_rcv, int time_start, stat_LED и byte value_pot в верхней части нашего скетча
  • Инициализируйте значения глобальных переменных внутри функции setup()
  • Инициализируйте контакт 13 Arduino как выходной контакт внутри setup() с помощью pinMode()
  • Добавим код логики мигания внутри функции loop()

Библиотека Wire

Для использования встроенного интерфейса I2C Arduino мы будем использовать библиотеку Wire.

Эта библиотека поставляется в стандартной комплектации с Arduino IDE. Как и в других библиотеках Arduino, библиотека Wire имеет готовые I2C функции, чтобы сделать кодирование проще для нас.

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

#include

После включения библиотеки мы можем использовать встроенные функции библиотеки.

Первое, что нужно сделать, это подключить устройство к шине I2C. Синтаксис для этого — Wire.begin(address). Адрес является необязательным для мастер-устройств. Итак, для эскиза мастера Arduino, мы просто добавляем код Wire.begin(); внутри setup().

Теперь мы переходим к циклу loop(). Наш код заставит Arduino прочитать значение потенциометра, подключенного к контакту A0, и сохранить его в переменной value_pot.

Отправка данных

После сохранения значения с пина A0 в переменную value_pot, мы можем отправить значение по I2C. Отправка данных по I2C включает в себя три функции:

  • Wire.beginTransmission()
  • Wire.write()
  • Wire.endTransmission()

Wire.beginTransmission()

Мы инициируем команду отправки, сначала информируя устройства на шине о том, что мы будем отправлять данные.

Для этого мы вызываем функцию Wire.beginTransmission(address). Адрес — это I2C-адрес ведомого прибора, который будет принимать данные. Эта функция делает две вещи:

  1. Она информирует шину о том, что мы будем посылать данные.
  2. Он информирует предполагаемого получателя о том, что данные готовы к получению.

Wire.write()

А затем мы отправим значение переменной value_to_send с помощью функции Wire.write(value).

Wire.endTransmission()

После отправки данных нам необходимо освободить сеть, чтобы позволить другим устройствам общаться по сети. Это делается с помощью функции Wire.endTransmission().

Наше ведущее устройство также должно получить положение потенциометра от ведомого устройства. Мы делаем это с помощью Wire.requestFrom(), Wire.available() и Wire.read().

Wire.requestFrom()

Полным синтаксисом запроса данных от ведомого устройства является Wire.requestFrom(адрес, количество).

Адрес — это I2C-адрес ведомого устройства, от которого мы должны получить данные, а количество — это количество байтов, которое нам нужно. Для нашего проекта, адрес ведомого устройства 0x08 и нам нужен один байт.

Внутри loop() мы используем Wire.requestFrom(0x08, 1); для запроса одного байта данных от ведомого устройства 0x08.

После выдачи команды Wire.requestFrom(0x08, 1), за ней должна следовать команда чтения для получения ответа от шины I2C.

Write.available()

Сначала мы проверяем, есть ли данные на шине. Это делается с помощью функции Write.available() внутри условного оператора if(). Функция Write.available() возвращает количество байт, ожидающих чтения.

Wire.read();

Для получения доступных данных мы используем функцию Wire.read() и сохраняем возвращаемое значение в переменную i2c_rcv. Каждый вызов функции Wire.read() получает только один байт данных из шины I2C.

Питание модуля

Arduino Nano может работать с разных источников питания, его можно подключить как через Mini-B USB компьютера, или от обычного нерегулируемого 6-20 вольт (pin 30), или регулируемого 5 вольт (pin 27). Плата автоматически выберет питание с самым высоким напряжением.

  1. Через mini-USB или microUSB при подключении к компьютеру;
  2. Через внешний источник питания, напряжение 6-20В.

Внешнее питание стабилизируется благодаря LM1117IMPX-5.0 с напряжением 5В. Когда подключение происходит через USB используется диод Шоттки.

Распиновка Arduino Nano

У Arduino Nano распиновка выполнена так, как показано на картинке ниже:

1 – TX (передача UART) или порт D0; 2 – RX (прием UART) или порт D1; 3,28 – сброс (RESET); 4,29 – земля; 5…16 – порты D3…D13; 17 – напряжение 3,3 В; 18 – опорное напряжение АЦП; 19…26 – 8 каналов АЦП A0…A7; 27 – напряжение 5,0 В; 30 – плюс питания модуля 2-20 В

Первые два вывода используются либо для связи по классическому последовательному интерфейсу с другим устройством, либо как порты для двоичных данных. В arduino nano распиновка 5…16 выводов, кроме указанных, имеет дополнительные функции:

5 – прерывание INT0; 6 – прерывание INT1 / ШИМ / AIN0; 7 – таймер-счетчик T0 / шина I2C SDA / AIN1; 8 – таймер-счетчик T1 / шина I2C SCL / ШИМ; 9,12,13,14 – ШИМ; 16 – светодиод.

Более подробная схема вводов-выводов на рисунке ниже (нажмите для увеличения):

AIN0 и AIN1 – это входы быстродействующего аналогового компаратора. Кроме того, имеется 6 каналов с выходом широтно-импульсного модулятора (ШИМ). К тому же имеется большее число пинов, на которые могут быть переведены запросы прерываний.

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

Распиновка Arduino Nano 3.0

У Arduino Nano 3.0 распиновка не отличается от той схемы, что приведена выше, несмотря на другой контроллер. ATmega328 отличается от ATmega168 вдвое большим объемами памяти всех видов:

  • flash,
  • оперативной,
  • EEPROM.

Это позволяет улучшить ПО прошивки и загручика, а также дать пользователю больше возможностей для его прикладной задачи. Arduino nano v 3.0 распиновка может быть использована для программирования, но для этих целей используется отдельный разъем. Об этом ниже.

Что такое протокол I2C и как он работает

Термин IIC расшифровывается как “Inter Integrated Circuits” и часто обозначается как I2C или даже как TWI (2-wire interface protocol), но во всех случаях за этими обозначениями скрывается один и тот же протокол. I2C представляет собой протокол синхронной связи – это значит что оба устройства, которые обмениваются информацией с помощью данного протокола должны использовать общий сигнал синхронизации. Поскольку в этом протоколе используются всего 2 линии (провода), то по одной из них должен передаваться сигнал синхронизации, а по другой – полезная информация.

Впервые протокол I2C был предложен фирмой Phillips. Протокол в самом простом случае соединяет с помощью 2-х линий 2 устройства, одно из устройств должно быть ведущим, а другое – ведомым. Связь возможна только между ведущим и ведомым. Преимуществом протокола (интерфейса) I2C является то, что к одному ведущему можно подключить несколько ведомых.

Схема связи с помощью протокола I2C представлена на следующем рисунке.

Назначение линий данного интерфейса:

  • Serial Clock (SCL): по ней передается общий сигнал синхронизации, генерируемый ведущим устройством (master);
  • Serial Data (SDA): по ней осуществляется передача данных между ведущим и ведомым.

В любой момент времени только ведущий может инициировать процесс обмена данными. Поскольку в этом протоколе допускается несколько ведомых, то ведущий должен обращаться к ним, используя различные адреса. То есть только ведомый с заданным (указанным) адресом должен отвечать на сигнал ведущего, а все остальные ведомые в это время должны «хранить молчание». Таким образом, мы можем использовать одну и ту же шину (линию) для обмена данными с несколькими устройствами.

Уровни напряжений для передаваемых сигналов в интерфейсе I2C жестко не определены. В этом плане I2C является достаточно гибким, то есть если устройство запитывается от напряжения 5v, оно для связи с помощью протокола I2C может использовать уровень 5v, а если устройство запитывается от напряжения 3.3v, то оно для связи с помощью протокола I2C может использовать уровень 3v. Но что делать если с помощью данного протокола необходимо связать между собой устройства, работающие от различных питающих напряжений? В этом случае используются преобразователи/переключатели напряжения (voltage shifters).

Существует несколько условий для осуществления передачи данных в протоколе I2C. Инициализация передачи начинается с падения уровня на линии SDA, которое определяется как условие для начала передачи (‘START’ condition) на представленной ниже диаграмме. Как видно из этого рисунка, в то время как на линии SDA происходит падение уровня, в это же самое время на линии SCL ведущий поддерживает напряжение высокого уровня (high).

То есть, как следует из рисунка, падение уровня на линии SDA является аппаратным триггером для условия начала передачи. После этого все устройства на этой шине переключаются в режим прослушивания.

Аналогичным образом, повышение уровня на линии SDA останавливает передачу данных, что на представленной диаграмме обозначено как условие окончания передачи данных (‘STOP’ condition). В это же самое время ведущим на линии SCL поддерживается напряжение высокого уровня (high).

На следующем рисунке представлена структура адреса ведомого в протоколе I2C.

Бит R/W показывает направление передачи следующих за ним байт, если он установлен в HIGH – это значит что будет передавать ведомый (slave), а если он установлен в low – это значит что будет передавать ведущий (master).

Каждый бит передается в своем временном цикле, то есть нужно 8 временных циклов чтобы передать байт информации. После каждого переданного или принятого байта 9-й временной цикл используется для подтверждения/не подтверждения (ACK/NACK) приема информации. Этот бит подтверждения (ACK bit) формируется либо ведомым, либо ведущим в зависимости от ситуации. Для подтверждения приема информации (ACK) на линии SDA ведущим или ведомым устанавливается низкий уровень (low) в 9 временном цикле, в противном случае происходит не подтверждение приема информации (NACK).

На следующем рисунке представлена структура передаваемого сообщения в протоколе I2C.

Схема Arduino Nano ISCP

Наконец, надо сказать о подключении программатора. Для программирования контроллеров Atmel, на котором собран модуль Arduino, используется интерфейс ICSP. Для Arduino Nano icsp распиновка выглядит выглядит следующим образом (см. верхнюю часть предыдущего рисунка):

  1. MISO (ведущий принимает от ведомого);
  2. +5V (питание);
  3. SCK (тактовый импульс);
  4. MOSI (ведущий передает ведомому);
  5. RESET (сброс);
  6. GND (земля).

Первый пин 6-контактного разъема имеет в основании форму квадратика и нумеруется по часовой стрелке, если смотреть сверху. Чтобы не возникало сомнений по порядку нумерации выводов коннектора, ниже приводится фрагмент принципиальной схемы платы Ардуино:

Этот разъем подключается к программатору с интерфейсом SPI (интерфейс последовательного программирования контроллеров Atmel). Кроме того, прошивка контроллера может меняться из среды программирования через кабель USB, так что приобретать программатор становится необязательным (он нужен только в том случае, если отсутствует программа загрузчика).

Варианты прошивки Ардуино

Прошивка с помощью Arduino IDE

Прошить плату при помощи среды разработки Arduino IDE можно в несколько шагов. В первую очередь нужно скачать и установить саму программу Arduino IDE. Также дополнительно нужно скачать и установить драйвер CH341. Плату Ардуино нужно подключить к компьютеру и подождать несколько минут, пока Windows ее опознает и запомнит.

После этого нужно загрузить программу Arduino IDE и выбрать нужную плату: Инструменты – Плата. Также нужно выбрать порт, к которому она подключена: Инструменты – Порт. Готовая прошивка открывается двойным кликом, чтобы ее загрузить на плату, нужно нажать кнопку «Загрузить» вверху панели инструментов.

В некоторых ситуациях может возникнуть ошибка из-за наличия кириллицы (русских букв) в пути к папке с кодами. Для этого файл со скетчами лучше создать и сохранить в корне диска с английским наименованием.

Прошивка с помощью программатора

Одни из самых простых способов прошивки платы – при помощи программатора. Заливка будет производиться в несколько этапов.

В первую очередь нужно подключить программатор к плате и к компьютеру. Если программатор не опознается компьютером, нужно скачать и установить драйверы.

После этого нужно выбрать плату, для которой нужно прошить загрузчик. Это делается в меню Сервис >> Плата.

Затем нужно выбрать программатор, к которому подключен контроллер. В данном случае используется USBasp.

Последний шаг – нажать на «записать загрузчик» в меню Сервис.

После этого начнется загрузка. Завершение произойдет примерно через 10 секунд.

Прошивка Arduino через Arduino

Для того чтобы прошить одну плату с помощью другой, нужно взять 2 Ардуино, провода и USB. В первую очередь нужно настроить плату, которая будет выступать в качестве программатора. Ее нужно подключить к компьютеру, открыть среду разработки Arduino IDE и найти в примерах специальный скетч ArduinoISP. Нужно выбрать этот пример и прошить плату.

Теперь можно подключать вторую плату, которую нужно прошить, к первой. После этого нужно зайти в меню Инструменты и выставить там прошиваемую плату и тип программатора.

Можно начать прошивать устройство. Как только прошивка будет открыта или написана, нужно перейти в меню Скетч >> загрузить через программатор. Для заливания прошивки не подходит стандартная кнопка загрузки, так как в этом случае прошивка будет загружена на первую плату, на которой уже имеется прошивка.

Интерфейсы связи

Arduino Nano поддерживает интерфейс I2C для связи с различными устройствами и периферией. Один из часто встречающихся способов применения – это связь с дисплеем через шину I2C. Благодаря особой технологии вы можете выводить наборы символов и данных на дисплей, используя всего лишь 2 пина, в Нано это пины D4 SDA) и D5 (SCL).

К Ардуино Нано подключение аналогично — используйте отмеченные ранее пины. Для работы с дисплеем вам понадобится библиотека, которую можно скачать ниже:

Код программы ниже:

#include #include LiquidCrystal_I2C lcd(0x27,16,2); // установка адреса LCD на 0x27 для 16 символов и 2 строк void setup() { lcd.init(); // инициализация дисплея // Print a message to the LCD. lcd.backlight(); lcd.print(«Hello, world!»); } void loop() { }

Пример скетча — управление задней подсветкой модуля I2C LCD1602:

#include #include #if defined(ARDUINO) && ARDUINO >= 100 #define printByte(args) write(args); #else #define printByte(args) print(args,BYTE); #endif LiquidCrystal_I2C lcd(0x27,16,2); // установка адреса LCD на 0x27 для 16 символов и 2 строк void setup(){ lcd.init(); // инициализация дисплея lcd.backlight(); lcd.home(); lcd.print(«Hello world…»); lcd.setCursor(0, 1); lcd.print(«dfrobot.com»); } int backlightState = LOW; long previousMillis = 0; long interval = 1000; void loop(){ unsigned long currentMillis = millis(); if(currentMillis — previousMillis > interval) { previousMillis = currentMillis; if (backlightState == LOW) backlightState = HIGH; else backlightState = LOW; if(backlightState == HIGH) lcd.backlight(); else lcd.noBacklight(); } }

Работа с SPI требует два пина под передачу данных (master in и out):

  • для выбора системы, с которой идёт «общение» (SS или CS – crystal/system select),
  • сигнал тактирования SCLK.

На официальном сайте есть специальная библиотека для работы с ним. При написании программ не забудьте подключить её директивой:

#include SPI.h

Теперь можно организовывать систему связи.

Особенности установки драйверов

При установке драйверов для Arduino Nano на Windows OS система обнаружит необходимый софт автоматически, если при этом использовался установочный файл с официального сайта Arduino.

Если же драйверы не были обнаружены и установлены системой, необходимо:

  1. Открыть панель управления.
  2. Перейти в раздел «Система и безопасность».
  3. Попасть во вкладку «Система».
  4. Открыть диспетчер устройств.
  5. Открыть вкладку с COM- и LPT-портами.
  6. Если во вкладке нет порта FT232R USB UART или раздела с COM- и LPT-разъемами, перейти во вкладку «Другие устройства» и зайти в раздел «Неизвестное устройство».
  7. Кликнуть ПКМ на FT232R USB UART.
  8. Выбрать «Обновить драйверы».
  9. Нажать «Выполнить поиск драйверов на компьютере».
  10. Выбрать FTDI USB Drivers в папке Drivers от Arduino.

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

Рейтинг
( 2 оценки, среднее 4.5 из 5 )
Понравилась статья? Поделиться с друзьями:
Для любых предложений по сайту: [email protected]