Функции arduino

Введение

Arduino/Freeduino программируется на специальном языке программирования – он основан на C/C ++, и позволяет использовать любые его функции. Строго говоря, отдельного языка Arduino не существует, как и не существует компилятора Arduino – написанные программы преобразуются ( с минимальными изменениям) в программу на языке C/C++, и затем компилируются компилятором AVR-GCC. Так что фактически, используется специализированный для микроконтроллеров AVR вариант C/C++.

Разница заключается в том, что Вы получаете простую среду разработки, и набор базовых библиотек, упрощающих доступ к находящейся « на борту» микроконтроллера периферии.

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

А при использовании « голого» C/C++ Вам бы пришлось разбираться с документацией на микроконтроллер, и вызывать нечто подобное:

UBRR0H = ( (F_CPU / 16 + 9600 / 2) / 9600 — 1) >> 8; UBRR0L = ( (F_CPU / 16 + 9600 / 2) / 9600 — 1); sbi (UCSR0B , RXEN0); sbi (UCSR0B , TXEN0); sbi (UCSR0B , RXCIE0);

Здесь кратко рассмотрены основные функции и особенности программирования Arduino. Если Вы не знакомы с синтаксисом языков C/C++, советуем обратиться к любой литературе по данному вопросу, либо Internet-источникам.

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

Более полная документация ( на английском языке) представлена на официальном сайте проекта – http://www.arduino.cc. Там же есть форум, ссылки на дополнительные библиотеки и их описание.

По аналогии с описанием на официальном сайте проекта Arduino, под « портом» понимается контакт микроконтроллера, выведенный на разъем под соответствующим номером. Кроме того, существует порт последовательной передачи данных (COM -порт).

Загрузка прошивки

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

  • “Напрямую” во flash память микроконтроллера при помощи ISP (In System Programming) внутрисистемного программатора.
  • При помощи загрузчика (bootloader), который живёт в конце Flash памяти МК, принимает программный код по протоколу TTL (UART) и записывает его во Flash память.

Загрузчик (bootloader)

Загрузчик живёт в самом конце Flash памяти МК и позволяет записывать прошивку, отправляемую через UART. Загрузчик стартует при подаче питания на МК, ждёт некоторое время (вдруг кто-то начнёт слать код прошивки по UART), затем передаёт управление основной программе. И так происходит каждый каждый раз при старте МК.

  • Загрузчик позволяет прошивать МК через UART;
  • Загрузчик замедляет запуск МК, т.к. при каждом запуске ждёт некоторое время для потенциальной загрузки прошивки;
  • Загрузчик занимает место во Flash памяти. Стандартный старый для Arduino NANO занимает около 2 кБ, что весьма существенно!
  • Именно загрузчик мигает светодиодом на 13 пине при включении, как индикация работы.

Программатор

Помимо записи прошивки во flash память, программатор позволяет:

  • Считывать содержимое Flash памяти (скачать прошивку на компьютер)
  • Полностью очищать чип от всех данных и настроек
  • Записывать и читать загрузчик
  • Считывать/записывать EEPROM память
  • Читать и настраивать фьюзы (fuses, fuse-bits) и лок биты.

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

Оптимальное подключение ESP8266

Подключение ESP8266 Примечание USB-TTL
VCC ESP8266 подключайте к внешнему источнику питания >300мА, 3,3V
GND все контакты GND должны быть соединены вместе: ESP8266, USB-TTL и источника питания GND
TX (UTXD) RX
RX (URXD) TX
GPIO0 подтягивающий к питанию резистор 10k DTR (если на вашем USB-TTL не разведен пин DTR, то вам придется вручную переключать GPIO0 на землю для перевода ESP8266 в режим прошивки)
RESET (RSBT, REST) подтягивающий к питанию резистор 10k, также можете добавить кнопку, соединяющую RESET и GND для ручного сброса модуля RTS (если на вашем USB-TTL не разведен пин RTS, то вам придется вручную перезагружать модуль )
CH_PD (CH_EN) подтягивающий к питанию резистор 10k
GPIO15 (MTDO) подтягивающий к земле резистор 10k
(для тех модулей, где выведен пин GPIO15)
GPIO2 подтягивающий к питанию резистор 10k
(на схеме не показан, но рекомендуется для увеличения стабильности)
GPIO16 для успешного выхода из режима Deep Sleep необходимо соединить пины ESP8266 GPIO16 и RESET через резистор 470 Ом (на схеме не показан)

Примечания.

1. Не на всех модулях выведены все пины. Перед приобретением модуля ознакомьтесь с видами модулей и их распиновкой.

2. Если на вашем USB-TTL конвертере выведены пины CTS и DSR — для автозагрузки прошивки они вам не помогут, т.к. работают только на вход.

3. Для стабильной работы ESP8266 требуется источник стабилизированного питания 3,3 вольт, ток более 250 миллиампер. Использование питания от USB-TTL конвертера может привести к нестабильности в работе.

Минимальное подключение ESP8266

Минимальное подключение ESP8266 (повышенная стабильность)

9.2. Базовая структура программы

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

9.2.1. Последовательное выполнение программы

При последовательном программировании код, состоящий из отдельных процедур, выполняется в цикле. На рис. 9.1 показано выполнение последовательности команд «ввод данных — обработка — вывод данных».

9.2.2. Прерывание выполнения программы

Иногда возникает необходимость прервать последовательное выполнение программы. Это выполняется с помощью прерываний (Interrupt). Основная часть программы выполняется, как и при последовательном программировании — бесконечный цикл, в котором повторяются отдельные процедуры. Как только произойдет внешнее или внутреннее прерывание, например, нажатие кнопки, основной цикл (Main-Loop) прервется и произойдет переход в программу обработки прерываний (Interrupt-Routine). В ней отрабатываются специальные задачи, например, аварийное отключение и т. п. Далее работа продолжается снова в основном цикле, где могут выполняться вспомогательные операции. Выполнение прерываний иллюстрирует рис. 9.2.

Примеры

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

Для того, чтобы узнать, какой бит (1 или 0) стоит на позиции n, воспользуемся логическим умножением.

Пусть имеется число 9

Нужно узнать, выставлен ли бит на позиции 3 (начиная с нуля). Для этого умножим его на число, у которого все биты равны нулю, кроме третьего:

Теперь узнаем значение бита в позиции 6

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

#include <stdio.h>
#include <conio.h>
#include <limits.h>

int checkbit(const int value, const int position) {
	int result;
	if ((value & (1 << position)) == 0) {
		result = 0;
	} else {
		result = 1;
	}
	return result;
}

void main() {
	int a = 3;
	size_t len = sizeof(int) * CHAR_BIT;
	size_t i;

	for (i = 0; i < len; i++) {
		printf("%d", checkbit(a, i));
	}

	_getch();
}

Заметьте, что в функции условие записано так

(value & (1 << position)) == 0

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

value & (1 << position) == 0

Функцию можно упростить

int checkbit(const int value, const int position) {
	return ((value & (1 << position)) != 0);
}

Функция, которая выставляет бит на n-й позиции в единицу.

Известно, что логическое сложение любого бита с 1 будет равно 1. Так что для установки n-го бита нужно логически сложить число с таким, у которого все биты, кроме нужного,
равны нулю. Как получить такое число, уже рассмотрено.

int setbit(const int value, const int position) {
	return (value | (1 << position));
}

Функция, которая устанавливает бит на n-й позиции в ноль.

Для этого нужно, чтобы все биты числа, кроме n-го, не изменились. Умножим число на такое, у которого все биты равны единице, кроме бита под номером n. Например

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

int unsetbit(const int value, const int position) {
	return (value & ~(1 << position));
}

Функция, изменющая значение n-го бита на противоположное.

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

int switchbit(const int value, const int position) {
	return (value ^ (1 << position));
}

Проверка

#include <stdio.h>
#include <conio.h>
#include <limits.h>

int checkbit(const int value, const int position) {
	return ((value & (1 << position)) != 0);
}

int setbit(const int value, const int position) {
	return (value | (1 << position));
}

int unsetbit(const int value, const int position) {
	return (value & ~(1 << position));
}

int switchbit(const int value, const int position) {
	return (value ^ (1 << position));
}

void printbits(int n) {
	//CHAR_BIT опеределён в библиотеке limits.h
	//и хранит число бит в байте для данной платформы
	size_t len = sizeof(int)* CHAR_BIT;
	size_t i;
	for (i = 0; i < len; i++) {
		printf("%d", checkbit(n, i));
	}
	printf("\n");
}

void main() {
	int a = 3;
	size_t len = sizeof(int) * CHAR_BIT;
	size_t i;

	printbits(a);
	a = setbit(a, 5);
	printbits(a);
	a = unsetbit(a, 5);
	printbits(a);
	a = switchbit(a, 11);
	printbits(a);
	a = switchbit(a, 11);
	printbits(a);

	_getch();
}

Фьюзы (Pro)

Фьюзы (фьюз-биты) являются низкоуровневыми настройками микроконтроллера, которые хранятся в специальном месте в памяти и могут быть изменены только при помощи ISP программатора. Это такие настройки как выбор источника тактирования, размер области памяти под загрузчик, настройка отсечки по напряжению и прочее. Фьюз-биты собраны по 8 штук в байты (т.н. байты конфигурации), как типичный регистр микроконтроллера AVR. Таких байтов может быть несколько, они называются low fuses, high fuses, extended fuses. Для конфигурации байтов рекомендуется использовать калькулятор фьюзов (например, вот такой), в котором просто ставятся галочки на нужных битах, и на выходе получается готовый байт в hex виде. Рассмотрим на примере ATmega328p:

Важный момент: в AVR биты у нас инверсные, то есть 1 это выкл, 0 это вкл. Расставляя галочки в калькуляторе, мы формируем байт, галочка стоит – бит включен, но в результирующем байте включенные биты являются нулями. Об этом стоит задумываться при ручном составлении фьюз-байта, при использовании калькулятора можете об этом даже не вспоминать. Что позволяют настроить биты?

  • CKSEL0–CKSEL3 – выбор источника и частоты тактирования (уточняй в даташите на свой МК, какая конфигурация за что отвечает)
  • SUT0–SUT1 – задержка старта МК после перезагрузки
  • CKOUT – дублирование тактирования на один из пинов (см. в даташите на какой)
  • CKDIV8 – делит тактовую частоту на 8
  • BOOTRST – если включен, МК запускается с загрузчика
  • BOOTSZ0–BOOTSZ1 – задаёт размер сектора загрузчика
  • EESAVE – защита EEPROM от стирания во время выполнения полной очистки чипа
  • WDTON – если включить, то Watchdog будет принудительно включен без возможности отключения
  • SPIEN – опасный бит, при его отключении пропадает возможность прошивки через ISP, и возможность выключить этот бит в том числе*
  • DWEN – вкл/выкл отладочный интерфейс DebugWire. На других моделях бывает и JTAG, и его бит – JTAGEN
  • BODLEVEL0–BODLEVEL3 – настройка контроля напряжения (МК сбросится при падении ниже установленного напряжения)

* – прошивка возможна при помощи высоковольтного программатора

Интерфейсная шина I²C/Библиотека Wire

I²C (IIC, англ. Inter-Integrated Circuit) — последовательная асимметричная шина для связи между интегральными схемами внутри электронных приборов.

Шина I2C также известна как двухпроводной интерфейс (Two Wire Interface, TWI) — простое и удобное устройство, используемое для обмена данными. Сам протокол был предложен фирмой Philips, но во избежание проблем с авторскими правами иногда протокол называют «двухпроводным».

Передача данных между устройствами и Arduino осуществляется по двум линиям, которые называют линией данных (Serial Data Line, SDA) и тактовой линией синхронизации сигнала (Serial Clock Line, SCL). В Arduino Uno вывод SDA находится на A4, а линия SCL — на контакте A5. Некоторые новейшие платы R3 имеют отдельные контакты, соединённые с шиной I2C и расположенные в верхнем левом углу для удобства доступа к ним. При подключении требуется установка подтягивающих резисторов. Обычно используют резисторы номиналом 4.7 кОм.

Будучи подключённой к шине I2C, плата Arduino считается ведущим устройством, а все остальные устройства — ведомыми. Каждое ведомое устройство имеет свой адрес (идентификационный номер) — шестнадцатеричное число, — позволяющий плате Arduino обращаться и взаимодействовать с каждым устройством по отдельности. Обычно устройство имеет на выбор диапазон адресов I2C, который указан в документации к нему. Конкретные доступные адреса определяются подключением контактов IC тем или иным образом.

Ведущее устройство (Uno) отвечает за инициирование обмена. Ведомые устройства не могут инициировать обмен данных, а только отвечают на запросы от ведущего устройства.

3, 2, 1, поехали!

Итак, теперь про­шива­ем кон­трол­лер, запус­каем тер­минал

Arduino выводит сооб­щение о стар­те и дает приг­лашение:

Для тер­минала я реали­зовал сле­дующий набор команд (help не реали­зовы­вал):

Пос­ле самого пер­вого запус­ка можешь пос­мотреть, что в EEPROM мик­рокон­трол­лера пус­то и взя­ты нас­трой­ки по умол­чанию. Отправь коман­ду и ищи адрес 0x100 — это стар­товый адрес. Начиная с это­го адре­са, идет 20 слов (по 2 бай­та) зна­чений задер­жек для сос­тояния нор­мы, за ними кон­троль­ный байт пер­вого бло­ка, пос­ле это­го 20 слов зна­чений задер­жек для сос­тояния ава­рии и кон­троль­ный байт вто­рого бло­ка.

Рис. 1. Прос­мотр EEPROM

Да­вай теперь изме­ним зна­чения для сос­тояния нор­мы:

Те­перь ска­жи Arduino, что­бы он перечи­тал нас­трой­ки:

За­мечу, что здесь ты не перезаг­рузил мик­рокон­трол­лер и про­читал нас­трой­ки при стар­те, а нас­трой­ки перечи­тались и при­мени­лись на лету. Теперь смот­ри на све­тоди­од Arduino, он стал мигать в соот­ветс­твии с вновь задан­ными нас­трой­ками.

Рис. 2. Прос­мотр EEPROM

Да­вай теперь заг­лянем в EEPROM и пос­мотрим, что там изме­нилось. Сно­ва давай коман­ду . Ты дол­жен уви­деть что‑то подоб­ное рисун­ке.

Рис. 3. Зам­кну­ли кон­такты

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

www

  • При­мер реали­зации буфера FIFO, исполь­зован­ный в статье
  • Очень популяр­ный форум раз­работ­чиков для AVR
  • Хо­рошая статья про нас­трой­ку тай­меров на рус­ском

Чтение из файла, хранящегося на SD-карте

Вы также можете использовать библиотеку SD-карты для чтения файла. Однако по сравнению со стандартными функциями C доступные методы довольно ограничены. Я обнаружил, что в библиотеке SD-карт часто возникают проблемы с поиском файлов в папках. В следующем примере (в папке SD_read в zip-файле) показано, как можно прочитать значение из файла, который содержит показания датчика.

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

Адаптеры/модули SD-карт могут быть полезны, если вы хотите оставить проект без присмотра и заставить его создавать файлы журнала или сохранять большое количество показаний датчиков в течение более длительного периода времени

Однако, важно понимать, что чтение файлов с SD-карты не всегда работает должным образом. Ниже вы можете скачать архив с программами, которые были также приведены выше:

SD и microSD карты могут существенно расширить возможности проектов ардуино, работающих с большими объемами данных: регистраторов данных, метеостанций, систем умного дома. Платы arduino оснащены сравнительно небольшой внутренней памятью, всего до 4 килобайт, включая и флэш-память, и EEPROM. Этой памяти не хватит для записи больших объемов данных, тем более, если плата будет постоянно выключаться или выключаться. Подключение SD карты ардуино в качестве внешнего накопителя позволяет многократно увеличить место для хранения любой информации. Съемные накопители SD стоят дешево, легко подключаются и удобны в использовании. О правильном подключении SD карты к Arduino и пойдет речь в статье.

Передача массива в функцию

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

Что из этого нужно запомнить: при описании функции параметр массива указывается со звёздочкой, т.е. * . При вызове массив передаётся как . И в целом всё.

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

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

Побитовые И, ИЛИ, НЕ, исключающее ИЛИ

Напомню для начала, что логические операции И, ИЛИ, исключающее ИЛИ и НЕ могут быть описаны с помощью таблиц истинности

Логический оператор И
X Y X AND Y
1
1
1 1 1
Логический оператор ИЛИ
X Y X OR Y
1 1
1 1
1 1 1
Логический оператор исключающее ИЛИ
X Y X XOR Y
1 1
1 1
1 1
Логический оператор НЕ
X NOT X
1
1

В побитовых (bit-wise) операциях значение бита, равное 1, рассматривается как логическая истина, а 0 как ложь. Побитовое И (оператор &) берёт два числа и логически умножает
соответствующие биты. Например, если логически умножить 3 на 8, то получим 0

char a = 3;
char b = 8;
char c = a & b;
printf("%d", c);

Так как в двоичном виде 3 в виде однобайтного целого представляет собой

а 8

Первый бит переменной c равен логическому произведению первого бита числа a и первого бита числа b. И так для каждого бита.

Соответственно, побитовое произведение чисел 31 и 17 даст 17, так как 31 это

, а 17 это

Побитовое произведение чисел 35 и 15 равно 3.

Аналогично работает операция побитового ИЛИ (оператор |), за исключением того, что она логически суммирует соответствующие биты чисел без переноса.

Например,

char a = 15;
char b = 11;
char c = a | b;
printf("%d", c);

выведет 15, так как 15 это , а 11 это 00001011

Побитовое ИЛИ для чисел 33 и 11 вернёт 43, так как 33 это , а 11 это

Побитовое отрицание (оператор ~) работает не для отдельного бита, а для всего числа целиком. Оператор инверсии меняет ложь на истину, а истину на ложь, для каждого бита.
Например,

char a = 65;
char b = ~a;
printf("%d", b);

Выведет -66, так как 65 это , а инверсия даст

что равно -66. Кстати, вот алгоритм для того, чтобы сделать число отрицательным: для нахождение дополнительного кода числа его надо инвертировать и
прибавить к нему единицу.

char a = 107;
char b = ~a + 1;
printf("a = %d, -a = %d", a, b);

Исключающее ИЛИ (оператор ^) применяет побитово операцию XOR. Например, для чисел

char a = 12;
char b = 85;
char c = a ^ b;
printf("%d", c);

будет выведено 89, так как a равно , а b равно . В итоге получим

Иногда логические операторы && и || путают с операторами & и |. Такие ошибки могут существовать в коде достаточно долго,
потому что такой код в ряде случаев будет работать. Например, для чисел 1 и 0. Но так как в си истиной является любое ненулевое значение,
то побитовое умножение чисел 3 и 4 вернёт 0, хотя логическое умножение должно вернуть истину.

int a = 3;
int b = 4;
printf("a & b = %d\n", a & b);	//выведет 0
printf("a && b = %d\n", a && b);//выведет не 0 (конкретнее, 1)

Работа с буквенно-цифровыми символами

  • проверяет, является ли символ альфа (буквой)
  • проверяет, является ли символ буквенно-цифровым (буква или цифра)
  • проверяет, является ли char символом ASCII
  • проверяет, является ли символуправляющий персонаж
  • проверяет, является ли символ числом
  • проверяет, является ли char печатаемым символом ASCII и содержит ли он содержимое (например, это не пробел)
  • проверяет, является ли символ шестнадцатеричной цифрой (AF 0-9)
  • проверяет, является ли char буквой в нижнем регистре
  • проверяет, является ли char печатаемым символом ASCII
  • проверяет, является ли символ пунктуацией (запятая, точка с запятой, восклицательный знак и т. д.)
  • проверяет, является ли символ пробелом, фид формы, новая линия, возврат каретки, горизонтальная табуляция, или вертикальная табуляция.
  • проверяет, является ли char буквой в верхнем регистре
  • проверяет, является ли символ пробелом или горизонтальной табуляцией

Создание файла и выбор названия для arduino SD card

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

Функция возвращает TRUE, если файл существует.

Популярной практикой при создании проектов – регистраторов данных является разбивка больших файлов на более мелкие, которые удобнее обновлять и открывать на компьютере. Например, вместо одного очень большого файла datalog.csv на SD карте можно иметь несколько маленьких, добавляя к концу номер по порядку: datalog01.csv, datalog02.csv и т.д. Вот пример скетча, который поможет вам выполнить эту работу:

Разное

pulseIn() — Возвращает продолжительность в микросекундах следующего импульса с напряжением HIGH на заданном контакте

noTone() — Прерывает любые серии импульсов, запущенные вызовом tone

micros() — Действует подобно millis, но возвращает число микросекунд, прошедших с момента последнего сброса платы. Значение обнуляется примерно через 70 минут

delayMicroseconds() — минимальная задержка составляет 3 мкс, максимальная — около 16 мс

attachInterrupt() — Устанавливает функцию myFunction, как обработчик положительного фронта прерывания 1 (контакт D3 в UNO)

detachInterrupt() — Запрещает обработку сигналов от прерывания 1

  • Уроки
  • Программирование
  • Функции

Arduino IDE для ESP8266: быстрый старт

1. Подключить USB-TTL к USB

2. Подключить ESP8266 к USB-TTL как обычно. Если вы подключили ESP8266 по схеме без поддержки автозагрузки прошивки (не подключены DTR и RTS), то вручную соедините GPIO0 с землей, передерните питание модуля — все готово для  прошивки

3. Запускаем Arduino IDE

4. В меню Инструменты — Плата — Generic ESP8266 board (в самом низу)

5. В меню Инструменты выбираем порт, к которому подключен наш USB-TTL

6. В меню Инструменты — выбираете частоту, размер флеш памяти вашего модуля

7. В меню Файл — Примеры (Образцы) — ESP8266WiFi — WiFiWebServer

8. В скетче заполняете SSID и пароль вашей WiFi сети

9. Жмем кнопку компиляции и загрузки скетча

10. Ждем окончании процесса прошивки. После прошивки, если модуль подключен по схеме без поддержки автопрошивки, отсоедините GPIO0 от земли и передерните питание модуля без отключения USB-TTL от питания

11. В меню Инструменты — Монитор последовательного порта

12. Выбираем скорость 115200

13. Смотрим что происходит в терминале

14. Когда модуль подключится к сети, то появятся надписи в мониторе «WiFi connected» и «Server started»

15. Ниже будет IP адрес вашего модуля ESP8266, например 192.168.1.248

16. Открываете любой браузер, в строке адреса вбиваете «http://192.168.1.248/gpio/1»

17. Смотрите монитор последовательно порта и если к ESP8266 к GPIO2 у вас подключен светодиод (через резистор, разумеется), то он включится.

18. Profit!

Автором этого проекта адаптации Arduino IDE для ESP8266 является наш соотечественник из Санкт-Петербурга Иван Грохотков.

Задать вопросы автору проекта Ивану Грохоткову aka igrr или сообщить об ошибке в Arduino IDE для ESP8266 можно в специальном разделе на нашем форуме.

Пример вывода на дисплей LCD1602 через последовательный порт UART Arduino из-под Linux средствами языка Python

Короче говоря, есть комп с линуксом, к которому подключена Arduino через USB, а к арудине подключен дисплей LCD1602, и мы хотим на него выводить инфу.

Сначала привожу полный код программы для Arduino UNO, к которой подключен дисплей LCD1602:

Скачать исходник.

Я сделал здесь решетку ‘#’ в качестве символа завершения передачи пакета данных. Как только в потоке данных встречается символ #, данные выводятся на дисплей, и буфер обнуляется, при этом сам символ ‘#’ не выводится. Конечно, можно было бы использовать ‘\n’ или др.

Далее мы напишем скрипт на Python, который будет выводить инфу на дисплей. Я выбрал Python, потому что это прикладной язык и он лучше всего подходит для подобных задач. С такими языками как C++/C# и т.п. больше возни с библиотеками, а здесь всё просто, особенно если это дело происходит под линуксом.

Первым делом устанавливаем необходимые библиотеки (для 2-ой или 3-ей версии python)

$sudo apt-get install python-serial

или

$sudo apt-get install python3-serial

Далее в интерпретаторе python пишем:

Здесь ардуина у меня подключена к порту /dev/ttyUSB0 — это я узнавал из Arduino IDE. Обычно она всегда на этом порту сидит, если других устройств на последовательный порт не подключено.

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

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Семинар по технике
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: