Программирование ардуино для чайников. Программирование Arduino

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

Необходимое железо — Arduino и USB-кабель

В этом руководстве предполагается, что вы используете Arduino Uno, Arduino Duemilanove, Nano или Diecimila.

Вам потребуется также кабель стандарта USB (с разъемами типа USB-A и USB-B): такой, каким, к примеру, подключается USB-принтер. (Для Arduino Nano вам потребуется вместо этого кабель с разъемами А и мини-В).

Программа - среда разработки для Arduino

Найдите последнюю версию на странице скачивания .

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

Подсоедините плату

Arduino Uno, Mega, Duemilanove и Arduino Nano получают питание автоматически от любого USB-подключения к компьютеру или другому источнику питания. При использовании Arduino Diecimila убедитесь, что плата сконфигурирована для получения питания через USB-подключение. Источник питания выбирается с помощью маленького пластикового джампера, надетого на два из трех штырьков между разъемами USB и питания. Проверьте, чтобы он был установлен на два штырька, ближайших к разъему USB.

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

Установите драйвера

Установка драйверов для на Windows7, Vista или XP:

  • Подключите вашу плату и подождите, пока Windows начнет процесс установки драйвера. Через некоторое время, несмотря на все её попытки, процесс закончится безрезультатно.
  • Нажмите на кнопку ПУСК и откройте Панель управления.
  • В панели управления перейдите на вкладку Система и безопасность (System and Security). Затем выберите Система. Когда откроется окно Система, выберите Диспетчер устройств (Device Manager).
  • Обратите внимание на порты (COM и LPT). Вы увидите открытый порт под названием «Arduino UNO (COMxx)».
  • Щелкните на названии «Arduino UNO (COMxx)» правой кнопкой мышки и выберите опцию «Обновить драйвер» (Update Driver Software).
  • Кликните "Browse my computer for Driver software".
  • Для завершения найдите и выберите файл драйвера для Uno - «ArduinoUNO.inf», расположенный в папке Drivers программного обеспечения для Arduino (не в подкаталоге «FTDI USB Drivers»).
  • На этом Windows закончит установку драйвера.
Выберите ваш последовательный порт

Выберите устройство последовательной передачи платы Arduino из меню Tools | Serial Port. Вероятно, это будет COM3 или выше (COM1 и COM2 обычно резервируются для аппаратных COM-портов). Чтобы найти нужный порт, вы можете отсоединить плату Arduino и повторно открыть меню; пункт, который исчез, и будет портом платы Arduino. Вновь подсоедините плату и выберите последовательный порт.

Загрузите скетч в Arduino

Теперь просто нажмите кнопку «Upload» в программе - среде разработки. Подождите несколько секунд - вы увидите мигание светодиодов RX и TX на плате. В случае успешной загрузки в строке состояния появится сообщение «Done uploading (Загрузка выполнена)».
(Замечание. Если у вас Arduino Mini, NG или другая плата, вам необходимо физически кнопкой подать команду reset непосредственно перед нажатием кнопки «Upload»).

Несколько секунд спустя после окончания загрузки вы увидите как светодиод вывода 13 (L) на плате начнет мигать оранжевым цветом. Поздравляю, если это так! Вы получили готовый к работе Arduino!

Изучение микроконтроллеров кажется чем-то сложным и непонятным? До появления Арудино - это было действительно не легко и требовало определенный набор программаторов и прочего оборудования.

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

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

Какую первую плату Arduino купить новичку?

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

В отечественных магазинах на 2017 год её цена порядка 4-5 долларов. На современных моделях её сердцем является Atmega328.

Изображение платы ардуино и расшифровка функций каждого вывода, Arduino UNO pinout

Микроконтроллер на данной плате это длинна микросхема в корпусе DIP28, что говорит о том, что у него 28 ножек.

Следующая по популярности плата, стоит почти в двое дешевле предыдущей - 2-3 доллара. Это плата . Актуальные платы построены том же Atmega328, функционально они аналогичны с UNO, различия в размерах и решении согласования с USB, об этом позже подробнее. Еще одним отличием является то, что для подключения к плате устройств предусмотрены штекера, в виде иголок.

Количество пинов (ножек) этой платы совпадает, но вы можете наблюдать что микроконтроллер выполнен в более компактном корпусе TQFP32, в корпусе добавлены ADC6 и ADC7, другие две «лишних» ножки дублируют шину питания. Её размеры довольно компактные - примерно, как большой палец вашей руки.

Третья по популярности плата - это , на ней нет USB порта для подключения к компьютеру, как осуществляется связь я расскажу немного позже.

Это самая маленькая плата из всех рассмотренных, в остальном она аналогична предыдущим двум, а её сердцем является по-прежнему Atmega328. Другие платы рассматривать не будем, так как это статья для начинающих, да и сравнение плат - это тема отдельной статьи.

В верхней части схема подключения USB-UART, пин «GRN» - разведен на цепь сброса микроконтроллера, может называться по иному, для чего это нужно вы узнаете далее.

Если UNO удобна для макетирования, то Nano и Pro Mini удобны для финальных версий вашего проекта, потому что занимают мало места.

Как подключить Arduino к компьютеру?

Arduino Uno и Nano подключаются к компьютеру по USB. При этом нет аппаратной поддержки USB порта, здесь применено схемное решение преобразования уровней, обычно называемое USB-to-Serial или USB-UART (rs-232). При этом в микроконтроллер прошит специальный Arduino загрузчик, который позволяет прошиваться по этим шинам.

В Arduino Uno реализована эта вязь на микроконтроллере с поддержкой USB - ATmega16U2 (AT16U2). Получается такая ситуация, что дополнительный микроконтроллер на плате нужен для прошивки основного микроконтроллера.

В Arduino Nano это реализовано микросхемой FT232R, или её аналогом CH340. Это не микроконтроллер — это преобразователь уровней, этот факт облегчает сборку Arduino Nano с нуля своими руками.

Обычно драйвера устанавливаются автоматически при подключении платы Arduino. Однако, когда я купил китайскую копию Arduino Nano, устройство было опознано, но оно не работало, на преобразователе была наклеена круглая наклейка с данными о дате выпуска, не знаю нарочно ли это было сделано, но отклеив её я увидел маркировку CH340.

До этого я не сталкивался с таким и думал, что все USB-UART преобразователи собраны на FT232, пришлось скачать драйвера, их очень легко найти по запросу «Arduino ch340 драйвера». После простой установки - всё заработало!

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

Что делать если на моей плате нет USB?

Плата Arduino Pro Mini имеет меньшие габариты. Это достигли тем что убрали USB разъём для прошивки и тот самый USB-UART преобразователь. Поэтому его нужно докупить отдельно. Простейший преобразователь на CH340 (самый дешевый), CPL2102 и FT232R, продаётся стоит от 1 доллара.

При покупке обратите внимание на какое напряжение рассчитан этот переходник. Pro mini бывает в версиях 3.3 и 5 В, на преобразователях часто расположен джампер для переключения напряжения питания.

При прошивке Pro Mini, непосредственно перед её началом необходимо нажимать на RESET, однако в преобразователях с DTR это делать не нужно, схема подключения на рисунке ниже.

Стыкуются они специальными клеммами «Мама-Мама» (female-female).

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

Как писать программы для Arduino?

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

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

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

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

Основы программирования в Arduino IDE

В начале кода нужно объявить переменные и подключить дополнительные библиотеки, если они имеются, делается это следующим образом:

#include biblioteka.h; // подключаем библиотеку с названием “Biblioteka.h”

#define peremennaya 1234; // Объявляем переменную со значением 1234

Команда Define дают компилятору самому выбрать тип переменной, но вы можете его задать вручную, например, целочисленный int, или с плавающей точкой float.

int led = 13; // создали переменную “led” и присвоили ей значение «13»

Программа может определять состояние пина, как 1 или 0. 1 -это логическая единица, если пин 13 равен 1, то напряжение на его физической ножке будет равняться напряжению питания микроконтроллера (для ардуино UNO и Nano - 5 В)

Запись цифрового сигнала осуществляется командой digitalWrite (пин, значение), например:

digitalWrite(led, high); //запись единицы в пин 13(мы его объявили выше) лог. Единицы.

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

digitalWrite (13, high); // устанавливаем вывод 13 в едиицу

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

delayMicroseconds() Delay (1000); //микроконтроллер будет ждать 1000 мс (1 секунду)

Настройки портов на вход и выход задаются в функции void setup{}, командой:

pinMode(NOMERPORTA, OUTPUT/INPUT); // аргументы - название переменной или номер порта, вход или выход на выбор

Понимаем первую программу «Blink»

В качестве своеобразного «Hello, world» для микроконтроллеров является программа мигания светодиодом, давайте разберем её код:

В начале командой pinMode мы сказали микроконтроллеру назначить порт со светодиодом на выход. Вы уже заметили, что в коде нет объявления переменной “LED_BUILTIN”, дело в том, что в платах Uno, Nano и других с завода к 13 выводу подключен встроенный светодиод и он распаян на плате. Он может быть использован вами для индикации в ваших проектах или для простейшей проверки ваших программ-мигалок.

Далее мы установили вывод к которому подпаян светодиод в единицу (5 В), следующая строка заставляет МК подождать 1 секунду, а затем устанавливает пин LED_BUILTIN в значение нуля, ждет секунду и программа повторяется по кругу, таким образом, когда LED_BUILTIN равен 1 - светодиод(да и любая другая нагрузка подключенная к порту) включен, когда в 0 - выключен.

Читаем значение с аналогового порта и используем прочитанные данные

Микроконтроллер AVR Atmega328 имеет встроенный 10 битный аналогово цифровой преобразователь. 10 битный АЦП позволяет считывать значение напряжение от 0 до 5 вольт, с шагом в 1/1024 от всего размаха амплитуды сигнала (5 В).

Чтобы было понятнее рассмотрим ситуацию, допустим значение напряжения на аналоговом входе 2.5 В, значит микроконтроллер прочитает значение с пина «512», если напряжение равно 0 - «0», а если 5 В - (1023). 1023 - потому что счёт идёт с 0, т.е. 0, 1, 2, 3 и т.д. до 1023 - всего 1024 значения.

Вот как это выглядит в коде, на примере стандартного скетча «analogInput»

int sensorPin = A0;

int ledPin = 13;

int sensorValue = 0;

pinMode(ledPin, OUTPUT);

sensorValue = analogRead(sensorPin);

digitalWrite(ledPin, HIGH);

delay(sensorValue);

digitalWrite(ledPin, LOW);

delay(sensorValue);

Объявляем переменные:

    Ledpin - самостоятельно назначаем пин со встроенным светодиодом на выход и даём индивидуальное имя;

    sensorPin - аналоговый вход, задаётся соответственно маркировке на плате: A0, A1, A2 и т.д.;

    sensorValue - переменная для хранения целочисленного прочитанного значения и дальнейшей работы с ним.

Код работает так: sensorValue сохраняем прочитанное с sensorPin аналоговое значение (команда analogRead). - здесь работа с аналоговым сигналом заканчивается, дальше всё как в предыдущем примере.

Записываем единицу в ledPin, светодиод включается и ждем время равное значению sensorValue, т.е. от 0 до 1023 миллисекунд. Выключаем светодиод и снова ждем этот период времени, после чего код повторяется.

Таким образом положением потенциометра мы задаем частоту миганий светодиода.

Функция map для Арудино

Не все функции для исполнительных механизмов (мне ни одной не известно) в качестве аргумента поддерживают «1023», например, сервопривод ограничен углом поворота, т.е на пол оборотоа (180 градуов) (пол оборота) сервомоторчика максимальный аргумент функции равен «180»

Теперь о синтаксисе: map (значение которое мы переводим, минимальная величина входного, максимальная величина входного, минимальная выходного, максимальная выходного значения).

В коде это выглядит так:

(map(analogRead(pot), 0, 1023, 0, 180));

Мы считываем значение с потенциометра (analogRead(pot))от 0 до 1023, а на выходе получаем числа от 0 до 180

Значения карты величин:

На практике применим это к работе коду того-же сервопривода, взгляните на код с Arduino IDE, если вы внимательно читали предыдущие разделы, то он пояснений не требует.

И схема подключения.

Выводы Ардуино - очень удобное средство для обучения работы с микроконтроллерами. А если использовать чистый C AVR, или как его иногда называют «Pure C» - вы значительно уменьшите вес кода, и его больше поместиться в память микроконтроллера, в результате вы получите отличную отладочную плату заводского исполнения с возможностью прошивки по USB.

Мне нравится ардуино. Жаль, что её многие опытные программисты микроконтроллеров безосновательно ругают, что она слишком упрощена. Упрощен, в принципе, только язык, но никто не заставляет пользоваться именно им, плюс вы можете прошить микроконтроллер через ICSP разъём, и залить туда тот код, который вам хочется, без всяких ненужных Вам бутлоадеров.

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

Еще больше информации про Ардуино и особенности его использования в различных схемах смотрите в электронной книге - .

Ядром платформы Arduino является микросхема-микроконтроллер известная как ATmega328.

ATmega328 на самом деле по всем параметрам является 8 битным компьютером: после включения, его процессор загружает байт из заданной ячейки памяти и интерпретирует это как команда. То что пойдет дальше зависит от значения этого байта. Только в отличие от известных нам компьютеров, ATmega328 не запускает никакую операционную систему: использование ресурсов находится под полным контролем программиста. Мы не можем полагаться на операционую систему, которая может коряво распределить память, переполнить её или привести к другим нежелательным для четкой автоматической системы последствиям. Кроме того, процессор может работать только с одной задачей одновременно (вы наверняка знаете, что так работают все процессоры, однако операционная система распределяет время работы различных задач таким образом, что складывается впечатление, что несколько програм на вашем компьютере работают одновременно).

У нового Arduino память совершенно пустая, следовательно, первый байт обрабатываемый процессором имеет нулевое значение: "Нет операции". Перед использованием Arduino вы должны загрузить в его память исполняемую программу, т.е. последовательность битов, первый из которых интерпретируется как команда и выполняется. Если команде нужны параметры для выполнения, они берутся из следующих байтов памяти. После выполнения команды, процессор загружает полученный байт в память и интерпретирует его как команду. Если выключить Arduino, память не стирается. Последовательность байтов, загруженных в него, хранится в энергонезависимой памяти, поэтому когда вы включите его снова, программа запускается опять с самого начала.

Частота выполнения операций процессора задается тактовым генератором 16 МГц. Питание можно подавать через разъем USB. Для работы без USB-питания Arduino требуется отдельный источник питания напряжением от 7 до 12 V (это напряжение нормализуется до необходимых уровней регулятором расположенным на борту, так что вам просто нужен недорогой источник питания для этого). На борту, оба уровня напряжения 5 В и 3,3 В доступны пользователю, из которых можно выжать максимум 50 мА тока.

Память Arduino состоит из трех типов: флэш-память, где хранится программа 32 Кб; оперативная память (SRAM) 2 КБ, где процессор хранит и перезаписывает переменные, используемые в программе; и постоянная память (EEP-ROM) 1 КБ, где программист может хранить данные, которые должны остаться при перезапуске контроллера (как флэш-память, где хранится программа). По сравнению с современными компьютерами, которые оперируют как минимум несколькими гигабайтами, 35 кбайт кажется смешным, но на самом деле этого достаточно для большинства целей. Из-за отсутствия операционной системы, использование памяти переносится под полную вашу ответственность: если случится переполнение памяти или будет обращение к несуществующей ячейке памяти, ваша программа может повести себя непредсказуемо, и это довольно трудно отследить во время отладки. Вы всегда должны держать количество переменных под контролем в вашей программе.

Процессор ATmega328 подключен к 14 дискретным портам ввода / вывода (пронумерованных от 0 до 13), 6 аналоговым входам и порту USB. Дискретный вход / выход это электрическое соединение, которое может иметь два логических состояния: 1 и 0, или TRUE и FALSE, или, как в синтаксисе Arduino, LOW и HIGH. Если сигнал в значении LOW, соответствующий вывод имеет нулевой потенциал 0 В - тоесть подключен к общему проводу. Если сигнал HIGH, то уровень напряжения между данным выводом и землей 5 В.

Контакты 0 и 1 используются для последовательного приема и передачи данных: через них плата Arduino может общаться с присоединенными к ней модулями (шилдами), используя последовательный протокол. Последовательные протоколы это коммуникационные протоколы, в которых каждый бит передается / принимается по очереди один за другим. Контакты 2 и 3 могут быть также использованы в качестве прерываний. Прерывание это электрический сигнал на дискретном входе, который прерывает текущую программу процессора при наступлении заданного логического состояния. Прерывания также существуют и у процессоров обычных компьютеров. После наступления прерывания, процессор сохраняет свое состояние в памяти и откладывает выполнение программы, перескакивает на выполнение обработчика прерывания: короткий кусок программного кода, необходимый для обслуживания прерывания. После завершения, процессор возобновляет статус, который он имел перед приходом прерывания, и возобновляет выполнение программы.

Контакты 3, 5, 6, 9, 10 и 11 могут использоваться как выходы ШИМ (широтно-импульсной модуляции PWM) и имеют некоторые аналоговые настройки. Соответственно, их ячейки памяти содержат значения между 0 и 255.

Рис.1 Arduino UNO, как он выглядит сверху и снизу. Обратите внимание на карту Италии на задней стороне.

Контакт 13 также подключен к светодиоду на борту. Когда сигнал LOW, светодиод выключен, а если сигнал HIGH светодиод светится.

Кроме стандартного использования в качестве дискретных входов / выходов, контакты 10, 11, 12 и 13 обеспечивают возможность коммуникации с внешними периферийными устройствами.

Аналоговые входы помечены A0 ... A5: каждый из них имеет цифровое разрешение 10 бит,

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

Все платформы смонтированы на плате, размером 60,6 мм × 53,4 мм и весом не больше 25 г (рис. 1).

На платах также имеются разъемы USB A / B, с помощью которых вы можете подключить их к компьютеру для коммуникации. Подключение USB-также обеспечивает питание для Arduino при подключении к компьютеру, так что для начала вам не нужен внешний источник питания.

Программа

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

Все эти инструменты входят в одну программу IDE (Integrated Development Environment), свободную

для скачивания на веб-сайте Arduino: выберите необходимую операционную систему вашего компьютера и скачайте программу. Она выглядит так же как и большинство обычных компьютерных программ. Она имеет несколько закладок на разные окна. Одно из таких окон используется для редактирования программы. Оно называется sketch на жаргоне Arduino. Скетчи пишутся в упрощенном C ++.


Рис.2 Программа Arduino появляется как окно, в котором можно ввести текст программы, которую попросту называют скетч.

Вы можете скомпилировать свой скетч в программе Arduino (рис. 2) нажав на кнопку Verify в верхнем левом углу окна: процесс компиляции транслирует C ++ программу в соответствующие машинные коды процессора ATmega328. После компиляции исполняемый скетч может быть загружен в память Arduino через USB кабель, при нажатии на кнопку Upload. Вам может понадобиться выбрать соответствующий COM-порт в меню, если есть более чем один доступный. Загрузка скетча всегда вызывает запуск компилятора, в первую очередь. Запуск скетча происходит сразу после окончания загрузки.

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

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


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

Arduino с чего начать новичку

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


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

Итак, переходим к первому уроку Arduino схемы начинающих электронщиков.

Контроллер Arduino UNO для удобства начинающих уже имеет сопротивление и LED-светодиод, подсоединенный к 13 выводу разъема, поэтому никаких внешних радиоэлементов в первом опыте нам не нужно.


Загрузив код, Ардуино позволяет нашей программе поучаствовать в инициализации системы. Для этого мы указываем микроконтроллеру команды, которые он выполнит в момент первоначальной загрузки и далее напрочь забудет об них (т.е. эти команды выполнятся Ардуинкой только один раз при старте). И именно с этой целью в нашем коде мы выделяем блок, в котором храняться эти команды. void setup() , а точнее в том пространстве внутри фигурных скобок этой функции, смотри программный скейтч.

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

Код скачать:
Скейтч с комментариями и пояснениями в файле 001-1_mig-led.ino

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


Функция delay (1000) задерживает обработку программы на 1000 милисекунд. Все это идет в вечном цикле loop() .

Главный вывод после восприятия нашей первой програмки на Ардуино: С помощью функций void loop и void setup мы передаем микроконтроллеру наши инструкции. Все то, что находится внутри блока setup выполнится всего один раз. Содержимое модуля loop будет повторятся в цикле до тех пор, пока останется включенным Arduino.

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

Вместо установки значения в HIGH, а затем в LOW, мы получим значение ledPin и проинвертируем его. Допустим если оно было HIGH, то станет LOW и т.п.

Второй вариант кода Ардуино для управления светодиодом здесь:

Затем можно заменить функцию delay() . Вместо нее, лучше использовать функцию millis() . Она возвращает количество миллисекунд, прошедшее с момента старта программы. Функция переполнится приблизительно через 50 суток работы программного кода.

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

Конечно, это добавит немного строк кода в наш скетч, но это, сделает вас несомненно более опытным программистом и увеличит потенциал вашего Arduino. Для этого нужно всего лишь научиться применять функцию millis.

Следует четко понимать, что простейшая функция delay приостанавливает выполнение всей программы Ардуино, делая ее неспособной выполнять какие-либо задачи в этот период времени. Вместо того, чтобы приостанавливать всю нашу программ, можно подсчитывать, сколько времени прошло до завершения действия. Это, прекрасно, реализуется с помощью функции millis(). Чтобы все было легко в понимании, мы рассмотрим следующий вариант мигания светодиодом без временной задержки.

Начало этой программы такое же как и у любого другого стандартного скетча Arduino.


В данном примере используется два цифровых ввода-вывода Arduino. Светодиод подсоединяется к 8 пину, который сконфигурирован как OUTPUT. К 9 через подключена кнопка, которая настроена как INPUT. Когда нажимаем на кнопку пин 9 устанавливается в HIGH, и программа переключает вывод 8 в HIGH, тем самым включая светодиод. Отпускание кнопки сбрасывает девятый вывод в состояние LOW. Затем код переключает вывод 8 в LOW, отключая световой индикатор.

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

Arduino UNO обладает тремя портами: B (цифровые входа/выхода с 8 по 13); C (аналоговые входа); D (цифровые входа/выхода с 0 по 7)

Каждый порт осуществляет управление тремя регистрами. Первый DDR задает чем будет являться pin входом или выходом. При помощи второго регистра PORT можно задать pin в состояние HIGH или LOW. При помощи третьего можно считать информацию о состояние ножек Arduino, в случае если они работает на вход.

Для работы схемы задействуем порт B. Для этого установим все ножки порта как цифровые выхода. У порта B всего 6 ножек. Биты регистра DDRB должны быть заданы в "1" , если пин будет использоваться как выход (OUTPUT), и в "0" , если пин планируем применять как вход (INPUT). Биты портов нумеруются с 0 по 7, но не всегда имеют все 8 пинов

Допустим: DDRB = B00111110; // установить ножки порта В с 1 по 5 как выхода, а 0 как вход.

В нашем схеме бегущих огней мы задействуем пять выходов: DDRB = B00011111 ; // установить пины порта В с 0 по 4 как выходы.

Для записи данных в порт В нужно задействовать регистр PORTB. Зажечь первый светодиод можно с помощью управляющей команды: PORTB = B00000001; , первый и четвертый LED: PORTB = B00001001 и т.п

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

Пример:

varA = 1; // 00000001
varA = 1 varA = 1 varA = 1

Теперь вернемся к исходному коду нашей программе. Нам требуется ввести две переменные: upDown будет включать в себя значения куда двигаться - вверх или вниз, а вторая cylon укажет какие Led зажигать.

Конструктивно такой светодиод имеет один общий вывод и три вывода для каждого цвета. Ниже показана схема подключения RGB-светодиода к плате Arduino с общим катодом. Все резисторы используемые в схеме для подключения должны быть одного номинала от 220-270 Ом.


Для подключения с общим катодом схема подключения трехцветного led будет почти аналогична, за исключением того, что общий вывод будет подключен не к земле (gnd на устройстве), а к выводу +5 вольт. Выводы Красный, зеленый и синий в обоих случаях подключаются к цифровым выходам контроллера 9, 10 и 11.

К девятому пину Arduino UNO подключим внешний светодиод через сопротивление 220 Ом. Для плавного управления яркостью последнего применим функцию analogWrite() . Она обеспечивает вывод ШИМ-сигнала на ножку контроллера. Причем команду pinMode() вызывать не требуется. Т.к analogWrite(pin,value) включает два параметра: pin - номер ножки для вывода, value - значение от 0 до 255.

Код:
/*
Учебный пример начинающего ардуинщика, раскрывает возможности команды analogWrite() для реализации Fade-эффекта светодиода
*/
int brightness = 0; // яркость LED
int fadeAmount = 5; // шаг изменения яркости
unsigned long currentTime;
unsigned long loopTime;

Void setup() {
pinMode(9, OUTPUT); // устанавливаем 9 пин как выход
currentTime = millis();
loopTime = currentTime;
}

Void loop() {
currentTime = millis();
if(currentTime >= (loopTime + 20)){
analogWrite(9, brightness); // устанавливаем значение на 9 выводе

Brightness = brightness + fadeAmount; // прибавляем шаг изменения яркости, которая установится в следующем цикле

// если достигли мин. или макс. значения, то идем в обратную сторону (реверс):
if (brightness == 0 || brightness == 255) {
fadeAmount = -fadeAmount ;
}
loopTime = currentTime;
}
}

Работа Arduino с энкодером

Энкодером предназначен для преобразования угла поворота в электрический сигнал. С него мы получаем два сигнала (А и В), которые противоположны по фазе. В этом учебном примере мы будем применять энкодер SparkFun COM-09117, имеющий двенадцать положений на один оборот (каждое положение ровно 30°). На приведенном ниже рисунке хорошо видно, как зависят выход А и В друг от друга при движении энкодера по часовой или против часовой стрелки.

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

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

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

Учитывая тот факт, что в самом быстром случае, мы можем повернуть ручку энкодера на 180° за 1/10 секунды, то это будет 6 импульсов за 1/10 секунды или 60 импульсов в одну секунду.

В реальности быстрее вращать не возможно. Так как нам необходимо отслеживать все полупериоды, то частота должна быть около 120 Герц. Для полной уверенности, возьмем 200 Гц.

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


По сигналам программного таймера необходимо постоянно осуществлять сравнение текущего значения выхода А энкодера с предыдущим значением. Если состояние меняется от положительного к нулю, то мы опрашиваем состояние выхода В. В зависимости от результата опроса состояния мы увеличиваем или снижаем счетчик значения яркости LED светодиода. Код программы с временным интервалом около 5 мс (200 Гц), представлен ниже:

Код начинающего ардуинщика:
/*
** Энкодер
** Для управлением яркостью светодиода применяется энкодер фирмы Sparkfun
*/

Int brightness = 120; // яркость светодиода, начинаем с половины
int fadeAmount = 10; // шаг изменения яркости
unsigned long currentTime;
unsigned long loopTime;
const int pin_A = 12; // pin 12
const int pin_B = 11; // pin 11
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;
void setup() {
// declare pin 9 to be an output:
pinMode(9, OUTPUT); // устанавливаем 9 вывод как выход
pinMode(pin_A, INPUT);
pinMode(pin_B, INPUT);
currentTime = millis();
loopTime = currentTime;
}
void loop() {
currentTime = millis();
if(currentTime >= (loopTime + 5)){ // проверяем состояния каждые 5мс (частота 200 Гц)
encoder_A = digitalRead(pin_A); // считываем состояние выхода А энкодера
encoder_B = digitalRead(pin_B); // выхода В энкодера
if((!encoder_A) && (encoder_A_prev)){ // если состояние меняется с положительного к нулевому
if(encoder_B) {
// выход В в положительном состояние, значит вращение осуществляется по часовой стрелке
// увеличиваем яркость свечения, не более чем до 255
if(brightness + fadeAmount }
else {
// выход В в нулевом состояние, значит вращение идет против часовой стрелки
// снижаем яркость, но не ниже нуля
if(brightness - fadeAmount >= 0) brightness -= fadeAmount;
}

}
encoder_A_prev = encoder_A; // сохраняем значение А для последующего цикла

AnalogWrite(9, brightness); // устанавливаем яркость на девятый пин

LoopTime = currentTime;
}
}

В этом примере для начинающих мы рассмотрим работу с пьезоизлучателем для генерирования звуков. Для этого возьмем пьезодатчик позволяющий генерировать звуковые волны в диапазоне частот 20 Гц - 20 кГц.

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

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


Программа для управления проста и наглядна. Начинается она с подключения файла, содержащего все необходимые команды для управления сервоприводом. Далее, мы создаем объект servo, например servoMain. Следующая функция setup(), в которой мы прописываем, что сервопривод подсоединен к девятому выводу контроллера.

Код:
/*
Arduino Servo
*/
#include
Servo servoMain; // Обьект Servo

Void setup()
{
servoMain.attach(9); // Servo подключен к девятому выводу
}

Void loop()
{
servoMain.write(45); // Повернуть сервопривод влево на 45 °
delay(2000); // Ожидание 2000 милисекунд (2 секунды)
servoMain.write(0); // Повернуть серво влево на 0 °
delay(1000); // Пауза 1 с.

delay(1500); // Ожидание 1.5 с.
servoMain.write(135); // Повернуть серво вправо на 135 °
delay(3000); // Пауза 3 с.
servoMain.write(180); // Повернуть серво вправо на 180 °
delay(1000); // Ожидание 1 с.
servoMain.write(90); // Повернуть серво на 90 °. Центральная позиция
delay(5000); // Пауза 5 с.
}

В главной функции loop() , мы задаем команды для серводвигателя, выдерживая паузы между ними.

Схема Arduino счетчика на 7-сегментном индикаторе

Этот простой проект на Arduino для начинающих, заключается в создании схемы счетчика на обычном 7-сегментном индикаторе с общим катодом. Программный код, приведенный ниже, позволяет при нажатии на кнопку запускать счет от 0 до 9.

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


Справа показана таблица соответствия выводов Arduino и выводов светодиодного индикатора.

Код этого проекта:

byte numbers = {
B11111100, B01100000, B11011010, B11110010, B01100110,
B10110110, B10111110, B11100000, B11111110, B11100110
};
void setup() {
for(int i = 2; i pinMode(i, OUTPUT);
}
pinMode(9, INPUT);
}
int counter = 0;
bool go_by_switch = true;
int last_input_value = LOW;
void loop() {
if(go_by_switch) {
int switch_input_value = digitalRead(9);
if(last_input_value == LOW && switch_input_value == HIGH) {

}
last_input_value = switch_input_value;
} else {
delay(500);
counter = (counter + 1) % 10;
}
writeNumber(counter);
}

Void writeNumber(int number) {
if(number 9) {
return;
}
byte mask = numbers;
byte currentPinMask = B10000000;
for(int i = 2; i if(mask & currentPinMask) digitalWrite(i,HIGH);
else digitalWrite(i,LOW);
currentPinMask = currentPinMask >> 1;
}
}

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

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

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

Что такое Arduino и для чего оно нужно?

Arduino — это электронный конструктор, который позволяет любому человеку создавать разнообразные электро-механические устройства. Ардуино состоит из программной и аппаратной части. Программная часть включает в себя среду разработки (программа для написания и отладки прошивок), множество готовых и удобных библиотек, упрощенный язык программирования. Аппаратная часть включает в себя большую линейку микроконтроллеров и готовых модулей для них. Благодаря этому, работать с Arduino очень просто!

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

Стартовый набор Arduino

Для того что бы начать изучать Arduino необходимо обзавестись самой платой микроконтроллера и дополнительными деталями. Лучше всего приобрести стартовый набор Ардуино, но можно и самостоятельно подобрать все необходимое. Я советую выбрать набор, потому что это проще и зачастую дешевле. Вот ссылки на лучшие наборы и на отдельные детали, которые обязательно пригодятся вам для изучения:

Базовый набор ардуино для начинающих: Купить
Большой набор для обучения и первых проектов: Купить
Набор дополнительных датчиков и модулей: Купить
Ардуино Уно самая базовая и удобная модель из линейки: Купить
Беспаечная макетная плата для удобного обучения и прототипирования: Купить
Набор проводов с удобными коннекторами: Купить
Комплект светодиодов: Купить
Комплект резисторов: Купить
Кнопки: Купить
Потенциометры: Купить

Среда разработки Arduino IDE

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

Версия Windows Mac OS X Linux
1.8.2

Язык программирования Ардуино

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

Для программирования Arduino используется упрощенная версия языка C++ с предопределенными функциями. Как и в других Cи-подобных языках программирования есть ряд правил написания кода. Вот самые базовые из них:

  • После каждой инструкции необходимо ставить знак точки с запятой (;)
  • Перед объявлением функции необходимо указать тип данных, возвращаемый функцией или void если функция не возвращает значение.
  • Так же необходимо указывать тип данных перед объявлением переменной.
  • Комментарии обозначаются: // Строчный и /* блочный */

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

Все прошивки для Arduino должны содержать минимум 2 функции. Это setup() и loop().

Функция setup

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

// переменные с пинами подключенных устройств int switchPin = 8; int ledPin = 11; // переменные для хранения состояния кнопки и светодиода boolean lastButton = LOW; boolean currentButton = LOW; boolean ledOn = false; void setup() { pinMode(switchPin, INPUT); pinMode(ledPin, OUTPUT); } // функция для подавления дребезга boolean debounse(boolean last) { boolean current = digitalRead(switchPin); if(last != current) { delay(5); current = digitalRead(switchPin); } return current; } void loop() { currentButton = debounse(lastButton); if(lastButton == LOW && currentButton == HIGH) { ledOn = !ledOn; } lastButton = currentButton; digitalWrite(ledPin, ledOn); }

// переменные с пинами подключенных устройств

int switchPin = 8 ;

int ledPin = 11 ;

// переменные для хранения состояния кнопки и светодиода

boolean lastButton = LOW ;

boolean currentButton = LOW ;

boolean ledOn = false ;

void setup () {

pinMode (switchPin , INPUT ) ;

pinMode (ledPin , OUTPUT ) ;

// функция для подавления дребезга

boolean debounse (boolean last ) {

boolean current = digitalRead (switchPin ) ;

if (last != current ) {

delay (5 ) ;

current = digitalRead (switchPin ) ;

return current ;

void loop () {

currentButton = debounse (lastButton ) ;

if (lastButton == LOW && currentButton == HIGH ) {

ledOn = ! ledOn ;

lastButton = currentButton ;

digitalWrite (ledPin , ledOn ) ;

В этом скетче я создал дополнительную функцию debounse для подавления дребезга контактов. О дребезге контактов есть на моем сайте. Обязательно ознакомьтесь с этим материалом.

ШИМ Arduino

Широтно-импульсная модуляция (ШИМ) — это процесс управления напряжением за счет скважности сигнала. То есть используя ШИМ мы можем плавно управлять нагрузкой. Например можно плавно изменять яркость светодиода, но это изменение яркости получается не за счет уменьшения напряжения, а за счет увеличения интервалов низкого сигнала. Принцип действия ШИМ показан на этой схеме:

Когда мы подаем ШИМ на светодиод, то он начинает быстро зажигаться и гаснуть. Человеческий глаз не способен увидеть это, так как частота слишком высока. Но при съемке на видео вы скорее всего увидите моменты когда светодиод не горит. Это случится при условии что частота кадров камеры не будет кратна частоте ШИМ.

В Arduino есть встроенный широтно-импульсный модулятор. Использовать ШИМ можно только на тех пинах, которые поддерживаются микроконтроллером. Например Arduino Uno и Nano имеют по 6 ШИМ выводов: это пины D3, D5, D6, D9, D10 и D11. В других платах пины могут отличаться. Вы можете найти описание интересующей вас платы в

Для использования ШИМ в Arduino есть функция Она принимает в качестве аргументов номер пина и значение ШИМ от 0 до 255. 0 — это 0% заполнения высоким сигналом, а 255 это 100%. Давайте для примера напишем простой скетч. Сделаем так, что бы светодиод плавно загорался, ждал одну секунду и так же плавно угасал и так до бесконечности. Вот пример использования этой функции:

// Светодиод подключен к 11 пину int ledPin = 11; void setup() { pinMode(ledPin, OUTPUT); } void loop() { for (int i = 0; i < 255; i++) { analogWrite(ledPin, i); delay(5); } delay(1000); for (int i = 255; i > 0; i--) { analogWrite(ledPin, i); delay(5); } }

// Светодиод подключен к 11 пину

int ledPin = 11 ;

void setup () {

pinMode (ledPin , OUTPUT ) ;

void loop () {

for (int i = 0 ; i < 255 ; i ++ ) {

analogWrite (ledPin , i ) ;

delay (5 ) ;

delay (1000 ) ;

for (int i = 255 ; i > 0 ; i -- ) {