Пищалка

Схема проекта

Схема подключения считывателя RFID меток RC522 к плате Arduino представлена на следующем рисунке.

Поскольку RFID модуль RC522 работает по интерфейсу SPI, то подключить его к плате Arduino достаточно просто – мы соединили его контакты MISO, MOSI, SCK и NSS к контактам SPI платы Arduino Uno. Модуль RC522 запитывается от контакта 5V платы Arduino. Сама же плата Arduino получает питание по USB кабелю от компьютера. Полный список соединений в схеме представлен в следующей таблице.

Модуль RC522 Плата Arduino Uno
VCC 3.3V
GND GND
RST D9
MISO D12
MOSI D11
SCK D13
SDA/NSS D10

Внешний вид собранной конструкции проекта показан на следующем рисунке.

Объяснение скетча для ведомого

Для ведомого устройства существует небольшая разница в кодировании I2C-связи. Первая разница заключается в адресе .

Для ведомых устройств адрес является обязательным. Для нашего проекта адрес для ведомого устройства будет 0x08. Это может быть любой адрес, но убедитесь, что он уникален в сети I2C.

Некоторые I2C ведомые устройства также имеют определенные I2C-адреса, поэтому сначала проверьте спецификацию.

Мы присоединим I2C сеть в качестве ведомого устройства, добавив код внутри .

Обработчики событий

Следующая задача — добавить в наш код обработчики событий для управления данными, полученными с других устройств в I2C сети.

Обработчики событий — это части кода, которые управляют событиями, с которыми наше устройство, скорее всего, столкнется во время работы.

Wire.onReceive()

В части скетча мы добавляем функцию для регистрации функции (обработчика), которая будет управлять полученными данными.

Мы вызываем нашу функцию-обработчик

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

В конце эскиза находится код функции-обработчика. Он инициализируется как . Параметр содержит количество байт полученных данных.

Wire.onRequest()

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

Единственное отличие заключается в том, что она обрабатывает события запроса данных. Запросы данных поступают от основных устройств.

В функцию мы добавляем код . А в конце нашего эскиза добавляем функцию

Обратите внимание, что обработчики не принимают никаких параметров. Функция содержит только

Нам не нужны и , потому что библиотека Wire уже обрабатывает ответы от ведомых устройств.

Скачать Arduino 1.8.7

Версия 1.8.x Arduino IDE появилась 11 Сентября 2018 года и является последней стабильной на момент написания статьи. По сравнению с 1.8.6 вы не найдете существенных улучшений в интерфейсе  – все изменения, в основном, касались исправления ошибок и повышения стабильности работы.

Изменения в версии 1.8.7

Из наиболее важных изменений данной версии можно выделить следующее:

  • Исправлена проблема выбора порта при первом использовании.
  • Исправлены ошибки запуска с некорректным файлом library_index.json или некорректными версиями библиотек.
  • Исправлены проблемы с низкой скоростью отрисовки меню File и Tools на версии для Mac OS X.
  • Улучшена работы с диалоговыми окнами в MAC OS.
  • Повышена стабильность работы системы в целом (исправлены ошибки ядра).

Прошивка

Как уже говорилось выше, моё устройство будет работать на Atmega328, а значит и код я буду строчить для неё. Эксперимент проводился на частоте встроенного генератора 8 МГц, с другими частотами я не работал. В коде используются регистры МК напрямую и глобальные переменные, и вообще попахивает хаосом, но повторюсь — это пример, набросок, может быть не самый лучший, но рабочий. Если у вас другой камень, вам всё равно придется изменить инициализирующую часть кода, так что можете его оформить как вам нравится. Вот мой полный скетч для Arduino IDE:

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

Ардуино код для Мастера

Код для нашего ведущего Ардуино (т.е. мастера):

Разбираем код Мастера

QNH — авиационный термин. Это один из факторов коррекции, который при применении к альтиметру позволит ему точно считывать высоту над уровнем моря в текущем местоположении.

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

Например, вот для Кейптауна — см. ссылку.

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

Запускает один из 125 каналов. Передатчик и приемник должны иметь один и тот же адрес.

Устанавливает уровень мощности передатчика. Высокий уровень может вызвать проблемы с нестабильностью, если питание 3,3 В осуществляется по длинным проводам. Лучше всего вставить через него конденсатор 100 мкФ, но для более долгого срока службы батареи лучше использовать низкочастотный конденсатор.

Говорит модулю вести себя как передатчик и наоборот:

говорит ему вести себя как приемник.

Передаваемые данные выводятся локально на последовательный монитор (если он подключен), а также передаются на приемник.

Строки:

посылают символ степени на последовательный монитор (для некоторых ПК это может отличаться).

Если вы используете ЖК-дисплей, вы можете сделать это с помощью:

Наконец, передает содержимое массива данных

Обратите внимание, что ему необходимо знать, сколько байт отправить и получит это

Исходный код программы

Чтобы в программе подключить ЖК дисплей к ARDUINO UNO, необходимо сделать следующие несколько вещей:

Arduino

#include <LiquidCrystal.h>
lcd.begin(16, 2);
LiquidCrystal lcd(0, 1, 8, 9, 10, 11);
lcd.print(«hello, world!»);

1
2
3
4

#include <LiquidCrystal.h>

lcd.begin(16,2);

LiquidCrystallcd(,1,8,9,10,11);

lcd.print(«hello, world!»);

В первую очередь мы должны подключить заголовочный файл (‘#include <LiquidCrystal.h>’), в котором находятся все необходимые инструкции для взаимодействия с ЖК дисплеем, что значительно упростит взаимодействие с ним в 4 битном режиме. Используя этот заголовочный файл нам не нужно будет передавать в ЖК дисплей бит за битом и нам не нужно будет самим программировать какие-либо функции для взаимодействия с ЖК дисплеем.

Во второй строчке мы должны сказать плате ARDUINO UNO какой тип ЖК дисплея мы собираемся использовать, поскольку существует достаточно большое число типов подобных дисплеев, например, 20×4, 16×2, 16×1 и т.д. В нашем проекте мы собираемся подключать к ARDUINO UNO ЖК дисплей 16х2, поэтому мы и должны записать команду ‘lcd.begin(16, 2);’. А если бы мы подключали ЖК дисплей 16х1, то в этом случае изменилась бы и команда соответствующим образом — ‘lcd.begin(16, 1);’.

В следующей инструкции мы сообщаем плате ARDUINO UNO к каким контактам мы подсоединили ЖК дисплей. В нашем случае мы использовали контакты ЖК дисплея “RS, En, D4, D5, D6, D7”, которые подсоединены к контактам «0, 1, 8, 9, 10, 11» ARDUINO UNO, поэтому и приведенная команда выглядит следующим образом — “LiquidCrystal lcd(0, 1, 8, 9, 10, 11);”.

Для того, чтобы напечатать на экране дисплея строку символов, мы использовали команду lcd.print(«hello, world!»), которая выводит на экран дисплея строку ‘hello, world!’.

Как мы видим из представленного кода, нам не нужно заботиться больше ни о каких аспектах взаимодействия с ЖК дисплеем, нам нужно просто инициализировать ЖК дисплей в программе и тогда плата ARDUINO UNO будет готова к отображению информации на экране дисплея.

Далее представлен исходный код программы (с комментариями) для взаимодействия платы ARDUINO UNO с ЖК дисплеем 16х2.

Arduino

#include <LiquidCrystal.h> // инициализируем библиотеку для взаимодействия с ЖК дисплеем
LiquidCrystal lcd(0, 1, 8, 9, 10, 11); /// сообщаем Arduino номера контактов, к которым подключен ЖК дисплей — REGISTER SELECT PIN,ENABLE PIN,D4 PIN,D5 PIN, D6 PIN, D7 PIN
void setup()
{
// устанавливаем число столбцов и строк для ЖК дисплея
lcd.begin(16, 2);
}

void loop()
{
// устанавливаем курсор в нулевой столбец первой строки
lcd
.print(» CIRCUIT DIGEST»); //печатаем строку
lcd.setCursor(0, 1); // устанавливаем курсор в нулевой столбец второй строки
lcd.print(«http://www.circuitdigest.com/»);//печатаем строку
delay(750); //задержка на 0.75 сек
lcd.scrollDisplayLeft();// переключаем данные на ЖК дисплее
lcd.setCursor(0, 0);// устанавливаем курсор в нулевой столбец первой строки
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

#include <LiquidCrystal.h> // инициализируем библиотеку для взаимодействия с ЖК дисплеем

LiquidCrystallcd(,1,8,9,10,11);/// сообщаем Arduino номера контактов, к которым подключен ЖК дисплей — REGISTER SELECT PIN,ENABLE PIN,D4 PIN,D5 PIN, D6 PIN, D7 PIN

voidsetup()

{

// устанавливаем число столбцов и строк для ЖК дисплея  

lcd.begin(16,2);

}

voidloop()

{

// устанавливаем курсор в нулевой столбец первой строки  

lcd.print(»   CIRCUIT DIGEST»);//печатаем строку

lcd.setCursor(,1);// устанавливаем курсор в нулевой столбец второй строки  

lcd.print(«http://www.circuitdigest.com/»);//печатаем строку

delay(750);//задержка на 0.75 сек

lcd.scrollDisplayLeft();// переключаем данные на ЖК дисплее

lcd.setCursor(,);// устанавливаем курсор в нулевой столбец первой строки  

}

Из чего состоит плата Arduino?

Выпускаются различные модели Arduino. Каждая из них «заточена» для различных задач. Некоторые платы принципиально отличаются от приведенной на рисунке ниже. Но большинство из них имеют следующие одинаковые узлы:

Разъем питания (USB / разъем для адаптера)

Каждая плата Arduino должна подключаться к источнику питания. Arduino Uno может запитываться от USB кабеля от вашего персонального компьютера Или от отдельного адаптера, который подключается к предусмотренному на плате разъему. На рисунке соединение через USB отмечено (1), а разъем для внешнего источника питания — (2).

USB также используется для загрузки вашей программы (скетча) на плату.

Примечание! Не используйте источник питания с напряжением на выходе более 20 вольт. Это может привести к тому, что ваша плата перегорит. Рекомендуемое напряжение питания для Arduino — от 6 до 12 вольт.

Разъемы (пины) (5V, 3.3V, GND, Analog, Digital, PWM, AREF)

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

  • GND (3): сокращение от ‘Ground’ — ‘Земля’. На платах несколько пинов GND, каждый из которых может использоваться для заземления вашей электрической цепи.
  • 5V (4) и 3.3V (5): как вы могли уже догадаться — питы, которые на выходе обеспечивают питание 5 вольт и 3.3 вольт соответственно. Большинство компонентов, которые подключаются к Arduino, благополучно питаются именно от 5 или 3.3 вольт.
  • Analog (6): на участке, который подписан ‘Analog In’ (от A0 до A5 на Arduino Uno) расположены аналоговые входы. Эти пины позволяют считывать сигналы от аналоговых датчиков (например, датчик температуры) и преобразовывать их в цифровые значения, которыми мы в дальнейшем оперируем.
  • Digital (7): напротив аналоговых пинов находятся цифровые пины (от 0 до 13 на Arduino Uno). Эти пины используются для цифровых входящих (input) сигналов (например, нажатие кнопки) и для генерации цифровых исходящих (output) сигналов (например, питание светодиода).
  • PWM (8): вы наверное заметили знак (~) рядом с некоторыми цифровыми пинами (3, 5, 6, 9, 10, и 11 на UNO). Эти пины работаю как в обычном цифровом режиме, так и в режиме ШИМ-модуляции (PWM). Если объяснить вкратце — эти пины могут имитировать аналоговый выходной сигнал (например, для постепенного затухания светодиода).
  • AREF (9): Этот пин используется достаточно редко. В некоторых случаях это подключают в схему для установки максимального значения напряжения на аналоговых входах (от 0 до 5 вольт).

Кнопка сброса (Reset Button)

Как и на оригинальных Nintendo, на Arduino есть кнопка сброса (reset) (10). При нажатии на нее контакт сброса замыкается с землей и код, загруженный на Arduino начинает отрабатывать заново. Полезная опция, если ваш код отрабатывает без повторов, но вы хотите протестить его работу.

Индикатор питания (Power LED)

Немного справа и ниже надписи “UNO” установлен светодиод, подписанный «on» (11). Этот светодиод должен загореться, когда вы подключили Arduino к источнику питания. Если светодиод не загорелся — плохой знак ;).

Светодиоды TX и RX

TX — сокращение от transmit (передача), RX — от receive (прием). Эти условные обозначения часто встречаются в электронике для обозначения контактов, которые отвечают за серийный обмен данным. На Arduino Uno эти контакты встречаются два раза на цифровых пинах 0 и 1 и в качестве светодиодов TX и RX (12). Эти светодиоды позволяют визуально отслеживать, передает или принимает данные Arduino (например, при загрузке программы на плату).

Главная интегральная микросхема (IC)

Черная деталь с металлическими коннекторами с двух сторон это интегральная микросхема, микропроцессор (IC или Integrated Circuit) (13). Можете смело считать, что это «мозги» нашей Arduino. Этот чип разный в разных моделях Arduino, но обычно он относится к линейке микропроцессоров ATmega от компании ATMEL

Это может оказаться важной информацией для загрузки скетча на плату. Модель интегральной микросхемы обычно указана на ее верхней корпусной части

Для дополнительной информации о вашей микросхеме стоит обратиться к ее даташиту.

Регулятор напряжения

Регулятор напряжения (14) is выполняет функцию, указанную в названии — контролирует напряжение, которое поступает на плату Arduino. Можете его себе представить как охранника, который не пропускает слишком большое напряжение на плату во избежание ее повреждений. Конечно же, у регулятора есть свой предел. Так что питать Arduino напряжением больше 20 вольт нельзя.

Постановка задачи

  1. Обеспечить двусторонний обмен данными между МК и ПК через USB. Никаких плат и софта типа Arduino в готовом решении мы не используем.

  2. Сделать так, чтобы ПО компьютера автоматически определяло наше устройство при подключении его к любому USB-разъему.

  3. USB-устройство должно отображаться в диспетчере устройств под нашим собственным именем (например, под именем нашей компании).

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

Выполнив это, мы получим огромную власть над нашими устройствами. Однако, есть ограничение — скорость передачи данных будет небольшой. Но отправка несложных команд, текста, или легких файлов будет работать быстро.

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

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

  • Добавим глобальные переменные , , и в верхней части нашего скетча
  • Инициализируйте значения глобальных переменных внутри функции
  • Инициализируйте контакт 13 Arduino как выходной контакт внутри с помощью
  • Добавим код логики мигания внутри функции

Библиотека Wire

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

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

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

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

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

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

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

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

Wire.beginTransmission()

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

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

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

Wire.endTransmission()

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

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

Wire.requestFrom()

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

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

Внутри мы используем для запроса одного байта данных от ведомого устройства 0x08.

После выдачи команды , за ней должна следовать команда чтения для получения ответа от шины I2C.

Write.available()

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

Wire.read();

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

Шина I2C Ардуино описание

Микроконтроллеры Arduino используют два пина для работы по интерфейсу I2C. В Arduino Uno и Nano линии SDA соответствует аналоговый порт A4, а SCL соответствует аналоговый порт A5. На Ardunio Mega SDA — 20 пин, SCL — 21 пин. Для облегчения работы с шиной I2C и обмена данными между устройствами для Arduino IDE написана стандартная библиотека Wire (скачивать и устанавливать ее не надо).

Для каждого устройства, при подключении к микроконтроллеру, присваивается уникальный адрес (максимум можно подключить 127 устройств). Поменять адрес устройства на шине нельзя, так как он вшит в микросхему. Часто производители предоставляют возможность поменять адрес устройства в небольшом диапазоне, что дает возможность подключить к шине IIC Ардуино несколько одинаковых устройств.

Программирование для платы Uno

Для написания программ (скетчей) для контроллер Ардуино вам нужно установить среду программирования. Самым простым вариантом будет установка бесплатной Arduino IDE, скачать ее можно с официального сайта.

После установки IDE вам нужно убедиться, что выбрана нужная плата. Для этого у Arduino IDE в меню “Инструменты” и подпункте “Плата” следует выбрать нашу плату (Arduino/Genuino Uno). После выбора платы автоматически изменятся параметры сборки проекта и итоговый скетч будет скомпилирован в формат, который поддерживает плата. Подключив контроллер к компьютеру через USB, вы сможете в одно касание заливать на него вашу программу,используя команду “Загрузить”.

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

Написанная и скомпилированная программа загружается через USB-соединение (UART- Serial). Со стороны контролера за этот процесс отвечает bootloader.

Более подробную информацию о том, как устроены программы для платы Ардуино можно найти в нашем разделе, посвященном программированию.

Подключение устройств

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

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

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

Видео с инструкциями:

Устройство и принцип работы транзистора

Транзистором называется полупроводниковый прибор, предназначенный для усиления и генерирования электрических колебаний. Транзисторы являются ключами (кнопками) в сетях с постоянным током. Биполярные транзисторы могут управлять электрической цепью до 50 В, полевые транзисторы могут управлять приборами до 100 В (при напряжении на затворе 5 В). В сетях с переменным током использую реле.

Фото. Устройство полевого и биполярного транзистора

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

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

Сеть I2C

Сеть I2C состоит из ведущего и ведомого устройств, соединенных шиной. В сети I2C может быть несколько ведущих и ведомых устройств — мастеров и наследников.

Ведомое устройство (наследник)

Все ведомые устройства имеют I2C-адрес, который используется для идентификации устройства в сети. I2C-адрес позволяет ведущему устройству передавать данные конкретному ведомому устройству на шине.

Ведущее устройство (мастер)

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

Шина

Шина в I2C — это просто два провода, которые соединяют все I2C-устройства в сети.

Эти два провода называются SDA и SCL. Провод SDA используется для связи между ведущим и ведомым устройствами.

Линия SCL несет тактовый сигнал, используемый для правильной синхронизации связи. Для поддержания обоих проводов в состоянии HIGH необходимы импульсные или подтягивающие (pull-up) резисторы.

Логические уровни

Будьте внимательны при подключении I2C устройств к Arduino.

Arduino выводит I2C-сигналы на 5В логическом уровне, но I2C-устройства работают с различными напряжениями логического уровня.

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

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

Заключение

Таким образом, мы можем вручную задавать положение вала сервопривода. Но на этом сфера его применения не заканчивается. Сервоприводы используются повсеместно, например, для привода дроссельной заслонки в автомобилях, в системах отопления, которые управляются автоматически, в различной бытовой технике и на производстве. Как отмечалось в начале статьи, они используются наряду с шаговыми двигателями и могут применяться в ЧПУ-станках и 3D-принтерах. Считается, что шаговые двигатели обеспечивают более точное позиционирование, но на практике всё зависит от конкрентных шагового двигателя и сервопривода которые сравнивают, а также от системы, которая ими управляет. Как и обещал прикладываю видео, на котором показано всё что было описано в этой статье.

Предыдущая
ArduinoКак управлять шаговым двигателем через Arduino

Спасибо, помогло!Не помогло