Встроенные функции языка программирования Arduino
В этом разделе я собираюсь сделать ссылку на встроенные функции, предоставляемые языком программирования Arduino.
Жизненный цикл программы
- эта функция вызывается один раз при запуске программы, а также при выключении и перезапуске Arduino.
- эта функция многократно вызывается во время работы программы Arduino.
Обработка ввода / вывода
Следующие функции помогают обрабатывать ввод и вывод с вашего устройства Arduino.
Цифровой ввод / вывод
- считывает значение с цифрового вывода. Принимает номер контакта в качестве параметра и возвращаетили жепостоянный.
- пишетили жезначение на цифровой выходной контакт. Вы передаете пин-код иили жекак параметры.
- устанавливает контакт как вход или выход. Вы передаете пин-код иили жезначение как параметры.
- считывает цифровой импульс ска затем вснова или изки чтобыснова на булавке. Программа будет заблокирована до тех пор, пока не будет обнаружен пульс. Вы указываете номер контакта и тип импульса, который хотите обнаружить (LHL или HLH). Вы можете указать необязательный тайм-аут, чтобы перестать ждать этого импульса.
- такой же как, за исключением того, что он реализован иначе и не может использоваться, если прерывания отключены. Обычно прерывания отключаются, чтобы получить более точный результат.
- читает байт данных по одному биту с вывода.
- записывает байт данных по одному биту на вывод.
- посылает прямоугольную волну на штырь, используемую для зуммеров / динамиков для воспроизведения тонов. Вы можете указать контакт и частоту. Он работает как с цифровыми, так и с аналоговыми выводами.
- останавливаетгенерируемая волна на булавке.
- считывает значение с аналогового вывода.
- настраивает значение, используемое для верхнего диапазона входного аналогового входа, по умолчанию 5 В на платах 5 В и 3,3 В на платах 3,3 В.
- записывает аналоговое значение на вывод
- позволяет изменить разрешение аналоговых битов по умолчанию для, по умолчанию 10 бит. Работает только на определенных устройствах (Arduino Due, Zero и MKR)
- позволяет изменить разрешение аналоговых битов по умолчанию для, по умолчанию 10 бит. Работает только на определенных устройствах (Arduino Due, Zero и MKR)
Протокол I2C в Arduino
На следующем рисунке показаны контакты платы Arduino UNO, которые используются для связи по протоколу I2C.
Линия протокола I2C | Контакт платы Arduino UNO |
SDA | A4 |
SCL | A5 |
Для осуществления связи по протоколу I2C в плате Arduino используется библиотека <Wire.h>. В ней содержатся следующие функции для связи по протоколу I2C.
1. Wire.begin(address).
Эта команда производит инициализацию библиотеки Wire и осуществляет подключение к шине I2C в качестве ведущего (master) или ведомого (slave). 7-битный адрес ведомого в данной команде является опциональным и если он не указан , то устройство (плата Arduino) подключается к шине I2C в качестве ведущего (master).
2. Wire.read().
Эта функция используется для считывания байта, принятого от ведущего или ведомого.
3. Wire.write().
Эта функция используется для записи данных в устройство, являющееся ведомым или ведущим.
От ведомого ведущему (Slave to Master): ведомый записывает (передает) данные ведущему когда в ведущем работает функция Wire.RequestFrom().
От ведущему ведомому (Master to Slave): в этом случае функция Wire.write() должна использоваться между вызовами функций Wire.beginTransmission() и Wire.endTransmission().
Функцию Wire.write() можно использовать в следующих вариантах:
- Wire.write(value); value — значение передаваемого одиночного байта;
- Wire.write(string) – для передачи последовательности байт;
- Wire.write(data, length); data – массив данных для передачи в виде байт, length – число байт для передачи.
4. Wire.beginTransmission(address).
Эта функция используется для начали передачи по протоколу I2C устройству с заданным адресом ведомого (slave address). После этого вызывается функция Wire.write() с заданной последовательностью байт для передачи, а после нее функция endTransmission() для завершения процесса передачи.
5. Wire.endTransmission().
Эта функция используется для завершения процесса передачи ведомому устройству, который до этого был инициирован функциями beginTransmission() и Wire.write().
6. Wire.onRequest().
Эта функция вызывается когда ведущий запрашивает данные с помощью функции Wire.requestFrom() от ведомого устройства. В этом случае мы можем использовать функцию Wire.write() для передачи данных ведущему.
7. Wire.onReceive().
Эта функция вызывается когда ведомое устройство получает данные от ведущего. В этом случае мы можем использовать функцию Wire.read() для считывания данных передаваемых ведущим.
8. Wire.requestFrom(address,quantity).
Эта функция используется в ведущем устройстве чтобы запросить байты (данные) с ведомого устройства. После этого используется функция Wire.read() чтобы принять данные переданные ведомым устройством.
address: 7-битный адрес устройства, с которого запрашиваются байты (данные).
quantity: число запрашиваемых байт.
Yenka
Yenka — отличный симулятор, который студенты и опытные пользователи могут использовать для обучения и преподавания основ программирования и схем. Как и большинство Ардуино симуляторов из нашего списка, он оснащен всеми необходимыми функциями для проверки эскизов/идей, отладки ваших проектов и разработки сложных проектов без ввода аппаратного обеспечения в эксплуатацию.
Yenka широко используется преподавателями, преподающими основы электроники, но из-за стоимости студентам она может быть не по карману. Это кросс-платформенный симулятор, который работает как в операционной системе Linux, так и в Windows. Несмотря на стоимость программа может быть идеальным тренажером Ардуино для вашего личного использования.
GPIO
Начнем с пинов, которых больше всего, это GPIO, с англ. General Purpose Input-Output, входы-выходы общего назначения, на плате они подписаны как D0–D13 и A0–A5. По картинке распиновки они называются PD*, PB* и PC*, (вместо звёздочки – цифра) отмечены тёмно-бежевым цветом. Почему “официально” они называются PD/PB/PC? Потому что пины объединены в пОрты по несколько штук (не более 8), на примере Нано есть три порта: D, B и C, соответственно пины так и подписаны: PD3 – Port D 3 – третий выход порта D. Это цифровые пины, способные выдавать логический сигнал (0 или VCC) и считывать такой же логический сигнал. VCC это напряжение питания микроконтроллера, при обычном использовании обычной платы Ардуино это 5 Вольт, соответственно это 5 вольтовая логика: 0V – сигнал низкого уровня (LOW), 5V – высокого уровня (HIGH). Напряжение питания микроконтроллера играет очень большую роль, об этом мы ещё поговорим. GPIO имеют несколько режимов работы: вход (INPUT), выход (OUTPUT) и вход с подтяжкой к питанию встроенным в МК резистором на 20 кОм (INPUT_PULLUP). Подробнее о режимах поговорим в отдельном уроке.
Все GPIO пины в режиме входа могут принять сигнал с напряжением от 0 до 5 вольт (на самом деле до 5.5 вольт, согласно даташиту на микроконтроллер). Отрицательное напряжение или напряжение, превышающее 5.5 Вольт приведёт к выходу пина или даже самого МК из строя. Напряжение 0-2.5 вольта считается низким уровнем (LOW), 2.5-5.5 – высоким уровнем (HIGH). Если GPIO никуда не подключен, т.е. “висит в воздухе”, он принимает случайное напряжение, возникающее из за наводок от сети (провода 220в в стенах) и электромагнитных волн на разных частотах, которыми пронизан современный мир.
GPIO в режиме выхода (OUTPUT) являются транзисторными выходами микроконтроллера и могут выдать напряжение 0 или VCC (напряжение питания МК). Стоит отметить, что микроконтроллер – логическое, а не силовое устройство, его выходы рассчитаны на подачу сигналов другим железкам, а не на прямое их питание. Максимальный ток, который можно снять с GPIO выхода ардуино – 40 мА. Если попытаться снять больше – пин выйдет из строя (выгорит выходной транзистор и всё). Что такое 40 мА? Обычный 5мм одноцветный светодиод потребляет 20 мА, и это практически единственное, что можно питать напрямую от Ардуино. Также не стоит забывать о максимальном токе со всех пинов, он ограничен 200 мА, то есть не более 10 светодиодов можно запитать от платы на полную яркость…
Обмен данными с компьютером
У всех плат Arduino есть возможность обмена информацией с компьютером. Обмен происходит по USB-кабелю — никаких дополнительных «плюшек» не требуется. Нам нужен класс , который содержит все необходимые функции. Перед работой с классом необходимо инициализировать последовательный порт, указав при этом скорость передачи данных (по умолчанию она равна 9600). Для отправки текстовых данных в классе существуют небезызвестные методы и . Рассмотрим следующий скетч:
В Arduino IDE есть Монитор порта. Запустить его можно через Инструменты→Монитор порта. После его открытия убедитесь, что Монитор работает на той же скорости, которую вы указали при инициализации последовательного порта в скетче. Это можно сделать в нижней панели Монитора. Если всё правильно настроено, то ежесекундно в Мониторе должна появляться новая строка «». Обмен данными с компьютером можно использовать для отладки вашего устройства.
Информацию на стороне компьютера можно не только получать, но и отправлять. Для этого рассмотрим следующий скетч:
Прошиваем микроконтроллер и возвращаемся в Монитор порта. Вводим в верхнее поле 1 и нажимаем Отправить. После этого на плате должен загореться светодиод. Выключаем светодиод, отправив с Монитора . Если же отправить символ , в ответ мы должны получить строку «».
Какой язык программирования на Ардуино
Стать хорошим специалистом в сфере IT бывает непросто из-за трудности с первоначальным выбором конкретного направления деятельности. Речь о многообразии современных технологий, и о том, что приходится определяться, к чему сильнее ваш интерес, к «железу» или всё-таки к программному обеспечению.
Вам хотелось бы создавать уникальные по внешнему виду и возможностям устройства, или контролировать их функционал, процессы обработки данных, быстродействие? Чтобы стать специалистом по Ардуино, не нужно быть ни виртуозным разработчиком, ни опытным «технарём».
Ардуино, как язык программирования, предназначен для непрофессионального использования в роботостроении и для создания простейших автоматических систем управления. Спектр задач, которые будет способно выполнять готовое устройство, определяется набором входящих в его состав плат.
Какой язык программирования на Ардуино
Самый простой пример – автоматическая кормушка для домашних питомцев из подобных плат, а вообще с вариантами их применения можно фантазировать до бесконечности.
Говоря прямо, микроконтроллер сам по себе «глуп». Он не наделен способностями мыслить или импровизировать, действует строго по инструкциям, для написания которых как раз и используется язык программирования со строгим синтаксисом и нормами оформления. Это упрощает работу и программистов, и тех, кто будет устранять возможные синтаксические ошибки, из-за которых нарушается компиляция кода, либо прошитое им устройство начинает работать некорректно.
Бинарный машинный код, по виду представляющий собой беспорядочный набор цифр и букв, загружается в созданный микроконтроллер. Код этот может создаваться с помощью разных языков программирования, что определяется с учетом среды разработки и интерпретатора.
На каком языке программирования работает Ардуино? На давно заработавшем себе популярность С++, который на сегодняшний день один из самых мощных (официальная среда разработки — Arduino IDE). Используемому новому языку разработчики дали название Arduino Wiring, потому что в стандартную библиотеку Arduino.h включен инструментарий и функционал из фреймворка Wiring. Что касается синтаксиса, то он берется именно из языка С++, поэтому если берётесь за язык программирования Ардуино с нуля, то придется изучить не только стандартные функции, но ещё какие-то справочники по С++.
Для вас подарок! В свободном доступе до21 августа
61 проверенный канал из закрытой подборки по поиску работы в IT
Гарантированно найдете выгодную работу за 1-2 дня
Гарантированно найдете выгодную работу за 1-2 дня
Чтобы получить подарок, заполните информацию в открывшемся окне
Скачать файл
Именно в них вы почерпнете кучу полезных сведений о языке, а конкретно — о его синтаксисе (а не о функционале Wiring). Даже в специальных уроках по Ардуино не найдётся столько ценной информации.
ArduinoSim
Это кросс-платформенный симулятор Arduino, который выполняет то, что он обещает, обеспечивая отличную платформу для обучения программированию и дизайну схем. Хотя программа не имеет открытого исходного кода этот симулятор бесплатный и дает вам возможность работать в операционных системах Windows и Linux. ArduinoSim был создан на Python для интеграции с окружающей средой Arduino.
ArduinoSim был построен специально для научной и инженерной аудитории. И его пользовательская база обеспечила достаточное количество материалов для поддержки использования. Но надо понимать, что проект относится к области электротехники. Не забывайте также, что это абсолютно бесплатное решение.
Simduino для iPad
Этот продукт — платный, разработанный для использования на экосистеме смарт-устройств Apple. Это комплексный симулятор, который позволяет вам узнать о программировании и электронике на платформе Arduino. Он обеспечивает достаточную поддержку большинства языков программирования Arduino C и может использоваться для запуска нескольких проектов в соответствии с потребностями пользователя.
Эта программа имеет отличный рейтинг на iTunes. Хорошая поддержка помогает своим пользователям понять детали и описания, доступные пользователям на официальном сайте. Приблизительно за 2 доллара вы получите отличный Ардуино симулятор, совместимый с вашим iPad.
Объяснение программ для Arduino
Нам будут необходимы две программы – одна для ведущей платы Arduino, а другая – для ведомой. Полные тексты обоих программ приведены в конце статьи, здесь же мы рассмотрим их основные фрагменты.
Объяснение программы для ведущей (Master) платы Arduino
1. Первым делом в программе мы должны подключить библиотеку Wire для задействования возможностей протокола I2C и библиотеку для работы с ЖК дисплеем. Также нам необходимо сообщить плате Arduino к каким ее контактам подключен ЖК дисплей.
Arduino
#include<Wire.h>
#include<LiquidCrystal.h>
LiquidCrystal lcd(2, 7, 8, 9, 10, 11);
1 |
#include<Wire.h> LiquidCrystallcd(2,7,8,9,10,11); |
- Далее в функции void setup():
— мы инициализируем последовательную связь со скоростью 9600 бод/с;
Arduino
Serial.begin(9600);
1 | Serial.begin(9600); |
— инициализируем связь по протоколу I2C на контактах A4 и A5;
Arduino
Wire.begin(); //Begins I2C communication at pin (A4,A5)
1 | Wire.begin();//Begins I2C communication at pin (A4,A5) |
— далее мы инициализируем ЖК дисплей для работы в режим 16х2, показываем на нем приветственное сообщение и очищаем его экран через 5 секунд.
Arduino
lcd.begin(16,2); //Initilize LCD display
lcd.setCursor(0,0); //Sets Cursor at first line of Display
lcd.print(«Circuit Digest»); //Prints CIRCUIT DIGEST in LCD
lcd.setCursor(0,1); //Sets Cursor at second line of Display
lcd.print(«I2C 2 ARDUINO»); //Prints I2C ARDUINO in LCD
delay(5000); //Delay for 5 seconds
lcd.clear(); //Clears LCD display
1 |
lcd.begin(16,2);//Initilize LCD display lcd.setCursor(,);//Sets Cursor at first line of Display lcd.print(«Circuit Digest»);//Prints CIRCUIT DIGEST in LCD lcd.setCursor(,1);//Sets Cursor at second line of Display lcd.print(«I2C 2 ARDUINO»);//Prints I2C ARDUINO in LCD delay(5000);//Delay for 5 seconds lcd.clear();//Clears LCD display |
- В функции void loop():
— сначала нам необходимо получить данные от ведомого, поэтому мы используем функцию requestFrom() с адресом ведомого равным 8 и запрашиваемым 1 байтом;
Arduino
Wire.requestFrom(8,1);
1 | Wire.requestFrom(8,1); |
Принятое значение считываем с помощью функции Wire.read().
Arduino
byte MasterReceive = Wire.read();
1 | byteMasterReceive=Wire.read(); |
— далее нам необходимо считать аналоговое значение с потенциометра, подключенного к контакту A0 ведущей платы Arduino;
Arduino
int potvalue = analogRead(A0);
1 | intpotvalue=analogRead(A0); |
Затем мы конвертируем это полученное значение к диапазону одного байта – от 0 до 127 (байт у нас 7-битный).
Arduino
byte MasterSend = map(potvalue,0,1023,0,127);
1 | byteMasterSend=map(potvalue,,1023,,127); |
— после этого нам необходимо передать это конвертированное значение, поэтому мы начинаем передачу ведомой плате с адресом 8;
Arduino
Wire.beginTransmission(8);
Wire.write(MasterSend);
Wire.endTransmission();
1 |
Wire.beginTransmission(8); Wire.write(MasterSend); Wire.endTransmission(); |
— затем мы отобразим на экране ЖК дисплея принятое значение от ведомой платы с задержкой 500 микросекунд и в дальнейшем мы будем непрерывно принимать и отображать эти значения.
Arduino
lcd.setCursor(0,0); //Sets Currsor at line one of LCD
lcd.print(«>> Master <<«); //Prints >> Master << at LCD
lcd.setCursor(0,1); //Sets Cursor at line two of LCD
lcd.print(«SlaveVal:»); //Prints SlaveVal: in LCD
lcd.print(MasterReceive); //Prints MasterReceive in LCD received from Slave
Serial.println(«Master Received From Slave»); //Prints in Serial Monitor
Serial.println(MasterReceive);
delay(500);
lcd.clear();
1 |
lcd.setCursor(,);//Sets Currsor at line one of LCD lcd.print(«>> Master <<«);//Prints >> Master << at LCD lcd.setCursor(,1);//Sets Cursor at line two of LCD lcd.print(«SlaveVal:»);//Prints SlaveVal: in LCD lcd.print(MasterReceive);//Prints MasterReceive in LCD received from Slave Serial.println(«Master Received From Slave»);//Prints in Serial Monitor Serial.println(MasterReceive); delay(500); lcd.clear(); |
Библиотека Servo
Библиотека позволяет управлять сервомоторами. Поддерживает до 24 сервоприводов на любых доступных GPIO. По умолчанию первые 12 сервоприводов будут использовать Timer0 и будут независимы от любых других процессов. Следующие 12 сервоприводов будут использовать Timer1 и будут разделять ресурсы с другими функциями, использующими Timer1. Большинство сервоприводов будут работать с управляющим сигналом ESP8266 3,3в, но не смогут работать на напряжении 3,3в и потребуют отдельный источник питания. Не забудьте соединить общий провод GND этого источника с GND ESP8266
Другие библиотеки, не включенные в поставку Arduino IDE
Почти все библиотеки, которые не используют низкоуровневый доступ к регистрам микропроцессора AVR должны работать без каких-либо доработок. На сегодняшний день можно точно сказать, что протестированы и полностью работоспособны следующие библиотеки:
- arduinoWebSockets — WebSocket сервер и клиент для esp8266 (RFC6455)
- aREST REST API handler библиотека, позволяет управлять GPIO через http запросы вида http://192.168.1.101/digital/6/1
- Blynk — легкий в освоении IoT фреймворк (страница на Kickstarter). Статья на нашем сайте об этой библиотеке и мобильном приложении ESP8266 – Управляем со смартфона через Blynk
- RTC — библиотека for Ds1307 & Ds3231 для esp8266
- Souliss, Smart Home — фреймворк для Умного Дома, построенный на Arduino, Android и OpenHAB
Эксперимент 2: мигание светодиодом, используя кнопку
Данный эксперимент не только демонстрирует, как использовать цифровой выход, но и как использовать цифровой вход. Нажатие кнопки, подключенной к цифровому входу, будет включать или выключать светодиод. Программа использует обе функции: и , и .
Схема соединений
Как вы можете видеть на диаграмме выше, мы теперь используем 2 цифровых I/O вывода платы Arduino. Светодиод подключен к выводу 8, который настроен как выход. Кнопка подключена к выводу 9, который настроен как вход. Когда кто-то нажимает на кнопку, состояние на выводе 9 устанавливается в высокий уровень, , и программа устанавливает на выводе 8 тоже высокий уровень и включает светодиод. Отпускание кнопки сбрасывает вывод 9 на низкий уровень, . Программа при этом устанавливает низкий уровень и на выводе 8, что выключает светодиод.
Запуск эксперимента
- соберите схему, как показано на рисунке выше;
- подключите Arduino к компьютеру, используя USB кабель, и загрузите прошивку, используя программу Arduino IDE;
- подайте питание на плату Arduino, используя источник питания, батарею или USB кабель;
- нажмете кнопку, чтобы зажечь светодиод. Отпустите кнопку, чтобы погасить светодиод.
Ардуино для начинающих. Урок 14. Прерывания.
В этом уроке мы поговорим о прерываниях. Как понятно из названия, прерывание это событие, которое приостанавливает выполнение текущих задач и передает управление обработчику прерывания. Обработчик прерывания — это функция. Например: если вы написали скетч по управлению мотором или просто плавно зажигаете и гасите светодиод в цикле, то нажатие на кнопку может не обрабатываться, так как Arduino в данный момент занята другой частью кода. Если же использовать прерывание, то такой проблемы не возникнет, так как прерывания имеют более высокий приоритет.
В ардуино есть прерывания по таймеру и аппаратное прерывание. Далее я подробнее расскажу что это, как это использовать и зачем оно вам нужно.
В этом уроке используется:
Отличный набор для начинающих: | Купить |
Arduino Uno: | Купить |
Инфракрасный датчик расстояния: | Купить |
Инвертирующий триггер шмитта: | Купить |
Комплект конденсаторов 120 штук: | Купить |
Аппаратные прерывания
В Arduino имеется 4 вида аппаратных прерываний. Отличаются они сигналом на контакте прерывания.
- Контакт прерывания притянут к земле. Ардуино будет выполнять обработчик прерывания пока на пине прерывания будет сигнал LOW.
- Изменение сигнала на контакте прерывания. Ардуино будет выполнять обработчик прерывания каждый раз когда на пине прерывания будет изменяться сигнал.
- Изменение сигнала на контакте прерывания от LOW к HIGH. Обработчик прерывания исполняется только при изменении низкого сигнала на высокий.
- Изменение сигнала на контакте прерывания от HIGH к LOW. Обработчик прерывания исполняется только при изменении высокого сигнала на низкий.
Если прерывание ожидает нажатия кнопки, то это может стать проблемой из-за дребезга контактов. В 6 уроке мы уже говорили о дребезге контактов. Тогда мы использовали функцию delay(), но в прерываниях данная функция не доступна. Поэтому нам придется подавить дребезг контактов немного усложнив схему подключения кнопки к пину прерывания. Для этого понадобится резистор на 10 КОм, конденсатор на 10 микрофарад,и инвертирующий триггер шмитта. Подключается все по следующей схеме:
подключение кнопки прерывания ардуино
В Arduino Uno есть два пина, поддерживающие прерывания. Это цифровые пины 2 (int 0) и 3 (int 1). Один из них мы и будем использовать в нашей схеме.
Предлагаю сделать устройство, которое будет поочередно изменять яркость светодиодов в зависимости от показаний инфракрасного датчика расстояния, а по нажатию на кнопку прерывания будем переходить от одного светодиода к другому. Наше устройство будет выглядеть примерно вот так:
Использование прерываний Arduino
Схема кажется сложной и запутанной, но это не так. Мы подключаем кнопку прерывания к пину Arduino D2, используя аппаратное подавление дребезга контактов. К аналоговому пину A0 мы подключаем инфракрасный дальномер. И к пинам D9, D10 и D11 мы подключаем светодиоды через резисторы на 150 Ом. Мы выбрали именно эти контакты для светодиодов, потому что они могут выдавать ШИМ сигнал.Теперь рассмотрим скетч:
Обратите внимание на следующие моменты: Необходимо использовать ключевое слово «volatile» перед объявлением переменной значение которой будет изменяться в обработчике прерывания. Так же я добавил переменную «nullLed» для того что бы программа на определенном шаге не меняла цвет ни одного из подключенных светодиодов
Строка «attachInterrupt(buttonInt, swap, RISING);» назначает обработчиком прерывания функцию swap. Подробнее об этой функции вы можете почитать здесь.
Функция swap просто переключает текущий светодиод на следующий. Остальной скетч должен быть вам понятен, если вы посмотрели все предыдущие уроки. Это последний обучающий урок. В следующих статьях я расскажу о подключении к Arduino популярных модулей.