ESP32 прошивка

И так, вышла новая версия ESP.

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

Подготовка среды Arduino IDE для ESP32

Идем по Ссылке на гит https://github.com/espressif/arduino-esp32 (для красноглазых читаем README.md )

  1. Скачиваем все содержимое.
  2. В папке  arduino/hardware создаем папку espressif
  3. в нее копируем содержимое архива из гита
  4. в папке tools запускем get.py просто двойным кликом, никакой черной магии
  5. нужно добавить питон в PATH: Система > Дополнительные параметры системы > Переменные среды > доавить в строчку PATH следующее ;C:\Python27
  6. скачиваем архив https://pypi.python.org/pypi/pyserial, распаковываем
  7. в распакованной папке запускаем GIT Bash и выполняем:
  8. python setup.py install
  9. запускаем Arduino IDE, проверяем Инструменты >Плата > ESP32 Dev Module. Если такая строчка есть, то все профит. среда настроена.
  10. Создаем новый проект, компилируем,
  11. Profit.

NB: убедитесь что финальный путь у вас /hardware/espressif/esp32/tools .

NB: установка питона https://www.python.org/downloads/release/python-2712/

 

ESP8266 Hello world

Обзор ESP8266, с чего начать?

Wi-Fi модули с ESP8266 чипом сейчас активно набирают обороты. Есть сайт посвященный данному кристаллу.

Сами разработчики предлагают несколько вариантов своего продукта, называются ESP1-12E.

Различаются они лишь по 2м параметрам:

  • количество пинов
  • наличие/отсутствие антенны

Так вот, даже не хочу рассматривать какие-то зарезанные варианты типа ESP-01, у которого выведен только  UART.

Наибольшим функционалом обладает ESP-12E (купил здесь: http://ru.aliexpress.com/item/Free-Shipping-2pcs-lot-ESP8266-remote-serial-Port-WIFI-wireless-module-through-walls-Wang-ESP-12/32256161821.html ). Единственное, эту платку не положишь на макетку, шаг выводов 2 мм.

Для этого можно просто взять готовую платочку http://ru.aliexpress.com/item/Serial-WIFI-ESP8266-module-adapter-plate-Full-IO-port-leads-you-can-choose-the-ESP-07/32380914509.html ну или мучатся.

Ну и конечно же есть очень много готовых решений (как Arduino):

  • ESPDuino

 

  • sparkfun esp8266 thing

  • ESPresso

  • Adafruit

  • WeMos

  • Olimex

ESP8266 прошивается из под Arduino IDE

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

Свои решения используя плату

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

 

Ссылочки:

  • https://www.youtube.com/watch?v=0J1Nt4q7uCQ
  • http://www.instructables.com/id/Programming-the-ESP8266-12E-using-Arduino-software/step10/Configuring-COM-Port/
  • https://raw.githubusercontent.com/nodemcu/nodemcu-devkit/master/Documents/NODEMCU_DEVKIT_SCH.png
  • http://esp8266.github.io/Arduino/versions/2.0.0/doc/boards.html

Использование библиотек из Arduino в AVRStudio

Чтобы использовать любую библиотеку Arduino в AVRStudio необходимо совсем немногое.

Разберем структуру пустого проекта. В общем то там 2 файла. Нас интересует следующий:

У него вот такое вот содержимое:

#define __AVR_ATmega328p__
#define __AVR_ATmega328P__
#define ARDUINO 161
#define ARDUINO_MAIN
#define F_CPU 16000000L
#define __AVR__
extern "C" void __cxa_pure_virtual() {;}

//
//

#include "...\arduino\hardware\arduino\avr\variants\standard\pins_arduino.h" 
#include "...\arduino\hardware\arduino\avr\cores\arduino\arduino.h"
#include <testtest.ino>

Нам понабоится подключить 2 библиотеки. Далее смотрим структуру main.cpp (точка входа)

...\arduino\hardware\arduino\avr\cores\arduino\main.cpp

Там собственно описана вся структура работы ардуины:

#include <Arduino.h>

//Declared weak in Arduino.h to allow user redefinitions.
int atexit(void (*func)()) { return 0; }

// Weak empty variant initialization function.
// May be redefined by variant files.
void initVariant() __attribute__((weak));
void initVariant() { }

int main(void)
{
	init();

	initVariant();

#if defined(USBCON)
	USBDevice.attach();
#endif
	
	setup();
    
	for (;;) {
		loop();
		if (serialEventRun) serialEventRun();
	}
        
	return 0;
}

Попробуем создать свой проект по такому лекалу.

  • Создаем новый проект
  • Копируем из ArduinoIDE папку C:\Users\Sainquake\Desktop\arduino\hardware\arduino\avr к себе в проект рядом с входной точкой проекта (Файл в котором main)
  • Пишем следующий код в теле. Подгрузку выделеной бибилотеки нужно отключить

  • Меняем пути на которые ругается компилятор

Все. Должно скомпилироваться.

Тестируем

Добавляем следующий код:

void setup(void){
	pinMode(13, OUTPUT);
}

void loop(void){
	  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
	  delay(1000);              // wait for a second
	  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
	  delay(1000);              // wait for a second
}

Добавляем библиотеки ваеринга:

#include "avr\cores\arduino\wiring.c"
#include "avr\cores\arduino\wiring_digital.c"

В них опять нужно поменять путь к pins_arduino.h

#include "C:\Users\Sainquake\Documents\Atmel Studio\6.2\GccApplication1\GccApplication1\avr\variants\standard\pins_arduino.h"

Компилируем, прошиваем. У меня нет программатора, так что я пользуюсь бутлоадером Arduino и прогой XLoader.

Результат следующий

 

 

Логическое И на биполярных транзисторах или как быть когда нужно много UARTов

Как быть когда нужно много UARTов (или любой другой штуки)

Зачастую аппаратных UARTов можно сделать не так уж и много. А иногда и вовсе один. Например, на Raspberry Pi. Что же делать если у вас есть 2 устройства с которыми нужно общаться именно по этому протоколу?

Необходимо сделать схемку коммутации сигналов.

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

Соответсвующая логическая схема чисто на логических И.

Теперь как же это должно выглядеть в железе.

Логическое И на биполярных транзисторах

Смотрим в следующую статью: http://www.schoolinfo1.narod.ru/elements2.htm. Там пишут что для лог. И нужно 2! транзистора. Жируют=) В общем я подумал и решил что можно сделать на одном:

Вот и все.

Полезные статьи:
https://ru.wikipedia.org/wiki/

http://electrik.info/main/praktika/751-shemy-vklyucheniya-bipolyarnyh-tranzistorov.html

PID ( ПИД ) регулятор всем

Что такое ПИД регулятор

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

  • Сам параметр
  • его скорость и
  • ускорение

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

Преобразование

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

Посмотрим на уравнение регулятора (из Wiki):

Если вы знакомы с Преобразованием Лапласа или проще говоря:

Можно представить ПИД регулятор в следующем виде, и сразу вынести 1/s:

Вот так просто сложный ПИД стал простым квадратным уравнением. Теперь нужно найти корни квадратного уравнения. И получим более удобное выражение:

Если вынести s1 и s2, а потом заменить на красивые буковки, получим очень даже удобное выражение. (Чего с этим делать объясню дальше)

Настройка ПИД регулятора

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

Основная задача регуляторов – это:

  • Сделать устойчивым
  •  Или Улучшить

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

Сделать устойчивым всегда необходимо такой процесс в котором вы хотите выдерживать параметр а управляете его ускорением. Ракета (измеряем угол, задаем тягу), Квадрокоптер (измеряем угол, задаем тягу винтов). Улучшить процесс регулирования бывает нужно обычно когда регулируемая величина меняется медленно, а хотелось бы побыстрее (естесственно в пределах возможности самого объекта управления). Или процесс довольно не точный, а хоется точнее (естесственно в пределах возможностей датчиков). Температура воды, скорость вращения двигателя, движение робота по линии.

  Передаточная функция

Из выражения выше мы выяснили, что ПИД регулятор это всего лишь 3 полюса в числителе и 1 в знаменателе.

Или 2 форсирующих звена и одно интегрирующее. Забьем пока на интегрирующее звено. Самое интересное в этих скобках. Дело в том что при решении квадратного уравнения может получиться несколько случаев:

  • (Ts+1)(Ts+1)
  • (Ts-1)(Ts+1)
  • (Ts-1)(Ts-1)
  • (Ts+1)(Ts-1)

Цвета соответствуют цветам графиков. (T1 = 0.1c, T2 = 1c)

Особенность звена (Ts-1) в том что фазовая характеристика начинается с +180 и заканчивается в +90. А обычное форсирующее звено начинается с 0 и идет до 90.

  • (Ts-1)
  • (Ts+1)

Полезная книжка: http://infoterra.ru/oty/books/files/tau_dlya_chainikov.pdf

Сервомашинка: исследование

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

Куплена она была здесь: http://ru.aliexpress.com/item/F02433-Corona-Digital-Tail-Servo-Metal-Gear-DS-919MG-DS-919MG-for-Trex-250-450-V2/1651459058.html

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

Цифровая микро-серво DS919MG
 Рабочее напряжение: 4.8 В/6.0 В
 Рабочий ток: 200mA/240mA
 Рабочая скорость: 0.07sec.60o/0.06sec.60o
 крутящий момент: 1.5kg.cm/1.7kg.cm
 Мертвая зона: 3 USEC
 Рабочая скорость: 40o/одной стороны Пульс  400US
 Рабочая температура Диапазон:-20 до + 60
 -Шариковый подшипник
 -Программируемый цифровой усилитель MOSFET езды
 -Шестерни металла
 -Вес: 12.5 г-0.44 унц.
 -Размер: 22.5x11.5x24.6 мм (0.88 "x 0.45" x 0.96 ")
 -Крутящий момент на 4.8 В: 20.8 унц. (1.5Kg.cm)
 -Скорость 4.8 В: 0.07 сек на 60 °

Ни слова про люфт.

Измерение люфта

Для измерения люфта понадобится лазер и экран (любая картонка). Чем больше плечо тем точнее измерение люфта.

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

На рисунке видна точка на экране и сама сервомашинка с лазером. На экране отмечены черным маркером оба крайних положения.

Расстояние до экрана 9 метров и расстояние 28 см.

Получается arctg(28/900)=1,782 градуса = 7 делений.

Постоянная времени

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

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

Входное воздействие будет гармоническим: ServoPWM=A0+A*sin( w*t ). В нашем случае сервомашинка управляется ШИМ который генерируется с первого таймера у Arduino. Благодаря использованию первого таймера разрядность ШИМ не 8 бит а 10. Соответственно диапазон положений сервомашинки от -90 до +90 градусов. Экспериментально было проверено, что минимальный угол соответствует значению 220, а максимальный 950. Можно вычислить коэффициент связи входа с выходом сервомашинки:

Kc=(950-220)/180=4 [ед/градус]

Теперь используя такую же установку как и в первом эксперименте измеряем амплитуду колебаний.

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

Код программы выглядит следующим образом:

#include <TimerOne.h>
void setup()
{
 Timer1.initialize(2500);
 //Timer1.pwm(9,560);
 Timer1.pwm(10,600);
 delay(1000);
}
float a=0;
void loop()
{
 a=600+25*sin( ((float)micros())/100000*30 );
 Timer1.pwm(10,(int)round(a)); 
}

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

заданное число X рад/с полученная амплитуда Y в см отн. амплитуда 20 log A
1 10 151 1 0
2 20 150 0,9933774834 -0,05771376475
3 30 150 0,9933774834 -0,05771376475
4 40 150 0,9933774834 -0,05771376475
5 50 110 0,7284768212 -2,751685243
6 60 97 0,642384106 -3,844104261
7 70 76 0,5033112583 -5,9632671
8 80 66 0,4370860927 -7,188660235
9 90 57 0,3774834437 -8,462041832
10 100 47 0,3112582781 -10,13758179
11 110 43 0,2847682119 -10,91016983
12 120 34 0,2251655629 -12,94996061
15 150 13 0,08609271523 -21,3006719

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

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

По АЧХ видно, что данное устройство повторяет частотную характерситику апериодического звена с частотой среза в 30 рад/сек = 4.77 Гц.

Модель сервопривода состоит из 2х апериодических звеньев насыщения (-90/+90) и люфта в 2 градуса. частотный анализ модели показывает:

Что в большей степени соответствует характеристике снятой экспериментально.

 Чувствительность

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

На фото видно способ измерения чувствительности. Изначально был задано значение  600. Далее 601, 603, 605, 610. И измерены положения луча с люфтом. То есть крайнее левое и правое положение.

  • Для разницы для значения (600 – 610)=10 получается 39 см (8.6).
  • Для разницы для значения (600 – 605)=5 получается 21 см ( 5/10=0.5 | 21/39=0.538 ).
  • Для разницы для значения (600 – 601)=1 получается 4.5 см ( 1/10=0.1 | 4.5/39=0.115 ).

Можно заметить некоторую нелинейность при уменьшении смещаемого значения, но она явно меньше чем значение люфта. Так что ей можно пренебречь.

 

Использование библиотек Arduino в AVR Studio

 

Оказывается уже сравнительно давно есть возможность программировать Arduino через нормальную IDE как AVR Studio.

Делается это довольно таки легко.

Есть такая великолепная компания http://www.visualmicro.com/. Она сделала расширение для AVR Studio которое позволяет без особых усилий использовать гигантское количество библиотек написаны под Arduino IDE.

Поставив новую AVR Studio 6.2 я увидел там интересную закладочку

Решил посмотреть и увидел это:

Решил установить это расширение и вот что получил в итоге.

В закладке Tools появилась вкладка с возможностями которые предоставляла Arduino IDE.

Из особенностей здесь 2 вещи галка Upload Using Programmer и Automatic Debugging. Плюс внизу помощь и настройки в которых указывается путь к папке с Arduino IDE.

Platform Explorer представляет собой несколько закладок, которые могут пригодиться. Закладка с примерами теперь находится здесь.

Кроме этого появилась панель в меню:

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

Подсказки и подсветка!!!

А вот и самое главное! Сбылась моя мечта. Теперь все подсказки и подсветка работают нормально!

Последнее, как создать новый проект:

Соответственно Sketch Project создается в папке с проектами Arduino.

 

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

Генерируем изображение на телеке с помощью Arduino

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

http://www.instructables.com/id/TV-Out-with-Arduino/

и соответственно библиотеку которая там используется https://code.google.com/p/arduino-tvout/downloads/detail?name=TVout_R5.91.zip&can=2&q= .

Создатели библиотеки хорошо постарались над ее созданием и написали довольно таки подробный вики: https://code.google.com/p/arduino-tvout/wiki/Useage .

Предлагаю рассмотреть сначала функции библиотеки, а затем саму начинку библиотеки.

Библиоткеа

Рассмотрим работу библиотеки сразу на простом примере:

#include <TVout.h>
#include <fontALL.h>
TVout TV;
 
void setup ( )
{
  TV.begin(NTSC,120,96);
  TV.select_font(font6x8);
  TV.println("Sainquake");
  TV.delay ( 1000 );
}
int i=0;
void loop ( )
{
  TV.clear_screen ( );
  //TV.println("Sainquake");
  TV.draw_rect(0,0,119,95,WHITE);
  TV.print(10,40,"Happy new Year!!!");
  TV.draw_line(10,50,110,50,WHITE);
  TV.print(80,1,i);
  TV.delay ( 10 );
  i++;
}

 

В проекте подключены 2 библиотеки которые скачиваются по ссылке выше. Соответственно содержимое архива надо положить в папку Arduino/libraries/

Итак. В setup у нас стандартная конструкция инициализации: begin. В ней мы указываем стандарт телевидения NTSC или PAL. PAL вам нужен будет только, если вы захотите подключиться к старому ламповому телевизору. Далее задается количество строк и столбцов в будущем изображении. Может быть я что-то каряво сделал, но изменение этих параметров не дало никаких результатов. К сожалению разрешение изображение ограничивается тактовой частотой самой Arduino.

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

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

TV.clear_screen ( );

Очистка экрана.

TV.draw_rect(0,0,119,95,WHITE);

Рисуем квадрат. Соответственно аргументы: x0, y0, width, height, color (WHITE || BLACK || INVERT)

TV.draw_line(10,50,110,50,WHITE);

Рисуем линию. Аргументы такие же, только не ширина и высота, а координаты конечной точки.

По большому счету больше функций то и не понадобится.

Теперь о HW части.

По сути это все что вам нужно.

У контроллера выделяетя 2 вывода которые соединяются в один через резисторы. На схеме так же показаны диоды для защиты от обратного тока, но и без них работает.

Эти 2 вывода по распиновке Arduino UNO будут 7 – Video и 9 – Sync.

Теперь самое сложное, вам нужно найти у себя на телевизоре вход под названием тюльпан.

О том как работает библиотека

При инициализации работы (begin) в памяти занимается место под буфер экрана.

А дальше идет только работа с таймером. В функции render_setup запускается таймер1.

Во момент прерывания от переполнения таймера вызывается функция по ссылке line_handler();. В свою очередь эта ссылка меняется на разные функции. Вот тут то и начинается магия.

Далее последовательно по таймеру выполняются несколько функций:

  • vsync_line() – генерирует синхроимпульс
  • blank_line() – вызывает либо синхронизацию либо прорисовку строки.
  • active_line() – прорисовывает строку вызывая функцию render_line();

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

 Бонус

Сделал на основе этой библиотеки следующий проект. По сути создание 3D кубика взято из примера к той же библиотеке.

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

Bluetooth выключатель света

Подключение Bluetooth к Arduino UNO

По сути все это было описано уже много раз например:

Рассмотрим только код:

/*
 The circuit: 
 * RX is digital pin 10 (connect to TX of other device)
 * TX is digital pin 11 (connect to RX of other device)
 */
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
void setup()  
{
 mySerial.begin(9600);
 mySerial.println("Hello, world?");
}
char incomingByte;
void loop()
{
  if (mySerial.available()){
    incomingByte = mySerial.read();
    if(incomingByte == '0') {
       pinMode(13, INPUT); 
       mySerial.println("LED OFF. Press 1 to LED ON!");
    }
    if(incomingByte == '1') {
       pinMode(13, OUTPUT);
       mySerial.println("LED ON. Press 0 to LED OFF!");
    }
  }
}

Чтобы не было проблем подключаем Bluetooth через софтварный UART на других ногах.

Подключение реле

Чтобы не мучатся с разводкой купил следующие готовые платки http://ru.aliexpress.com/item/5V-One-1-Channel-Relay-Module. Там 3 вывода. Земля, питание и дата. На выходе общая точка и 2 вывода. И вот здесь самый главный нюанс – принцип работы ключа.

При подключении ее к любой ноге контроллера замыкание реле происходит при установке ее как вывод. Ввод – реле разомкнуто.

pinMode(13, INPUT);

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

Тест

Скачал https://play.google.com/store/apps/details?id=Qwerty.BluetoothTerminal. Особых проблем нет, только при поиске не определяются имена устройств, так что пришлось перебирать.

Вот собственно как это работает.

Документация на HC-XX: http://www.exp-tech.de/service/datasheet/HC-Serial-Bluetooth-Products.pdf