Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр
Красочная расслабляющая игра в жанре маджонг - Накорми Попугая! Собирайте плитки с фруктами, набирайте очки, побеждайте!

Накорми Попугая

Аркады, Маджонг, Казуальные

Играть

Топ прошлой недели

  • AlexKud AlexKud 38 постов
  • SergeyKorsun SergeyKorsun 12 постов
  • SupportHuaport SupportHuaport 5 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

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

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня

Esp8266 + Гаджеты

С этим тегом используют

Arduino Электроника Самоделки Своими руками YouTube Умный дом Ardublock AliExpress Китайские товары Товары Вертикальное видео Telegram (ссылка) Смартфон Все
4 поста сначала свежее
13
HappyF
10 месяцев назад

Ответ на пост «Мой открытый проект метеостанции с монохромным дисплеем»⁠⁠

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

Ответ на пост «Мой открытый проект метеостанции с монохромным дисплеем» Электроника, Гаджеты, Esp8266, Самоделки, Умный дом, Длиннопост, Arduino

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

Ответ на пост «Мой открытый проект метеостанции с монохромным дисплеем» Электроника, Гаджеты, Esp8266, Самоделки, Умный дом, Длиннопост, Arduino

Ужас, да? А ведь мы с этой штукой первое место заняли... Ещё и на uno, вообще ужас.

А вот теперь совсем другое дело:

Функции мониторинга:

1) Загруженность, температура,возможно самые жрущие процессы, скорость куллеров и т.д. и т.п.
2) Включение и выключение корпусных вентиляторов при нагрузке. Они дешёвые, шумят, я их включаю вручную когда играю, вывел специально на скрытый переключатель.
3) По-приколу ещё сделаю так, что комп включается с кнопки в меню. Просто потому, что могу. Изначально хотел сделать на ключе за 100 рублей с али, но случайно сломал его.

Функции метеостанции:

1) В доме
Температура, влажность, давление, качество воздуха/газы (на серии mq и на bme280)
2) На улице
Температура, влажность воздуха, давление, качество воздуха/газы, плювиограф (если лень не будет), датчик дождя, датчик уф, флюгер. Полная комплектация, я же тут не в игрушки играю. Хотя нет, прямо как конструктор, если честно.
Возможно сделаю на даче, с помощью радио, ну или на балконе. Может оба сразу, но это уже слишком.
3) Предсказание погоды
Видел у Гайвера предсказатель погоды, который основываясь на давлении пытается предсказать погоду, вернее возможность осадков. Думаю, не помешает.
4) Онлайн погода
Естественно, он будет и из интернета данные получать, иначе зачем esp Можно будет и сравнить ради интереса.

Функции умного дома:

1) Выключение света (возможно и розеток)
Есть у меня давнишняя идейка, сделать совсем немного опасную схемку из мелкой esp-01, миниатюрного реле с чип и дип, да блоком питания за 60 рублей. И запихнуть всё в подрозетник. Вот прям так, чтобы ничего снаружи не было. Всё время вижу как пихают нано с радио и громоздким модулем реле в огромный разветвлитель или удлинитель. У меня другой подход. Прямо сейчас тестирую блок питания на качество, стоит и работает на полной мощности уже неделю, вроде бахнуть не должен. Хотя вроде видел на хабре человека, который нечто похожее реализовывал.
2) Хочу сделать что-то ещё более интересное, так что доделаю и сигнализацию. Простые датчики движения/приближения, которые считают, сколько человек пройдёт или выйдет. Пиликать не будет, это глупо, просто тихо отправлять уведомление на телефон. Определять нарушителя будет смешным способом: если к интернету телефонов подключено меньше, чем количество людей в доме, то значит пора высылать уведомление. Ну или просто оставлю один датчик и надо будет вручную его включать, это на случай если лень.

Итак, пока что спаял часть, что должна быть внутри дома: nano (esp нет сейчас, потом будет работать с нано через uart), tft 1.8 (хочу именно мелкий экранчик, а корпус прицепить снизу, под монитором), энкодер для управления, bme280, ds3231. На коленке собрал кривой корпус из дво и соплей, потом сделаю нормально.

Ответ на пост «Мой открытый проект метеостанции с монохромным дисплеем» Электроника, Гаджеты, Esp8266, Самоделки, Умный дом, Длиннопост, Arduino
Ответ на пост «Мой открытый проект метеостанции с монохромным дисплеем» Электроника, Гаджеты, Esp8266, Самоделки, Умный дом, Длиннопост, Arduino

Набросал и код, я не ас в программировании, пока что просто вывел показатели на экран и сделал график температуры, влажности и давления. Кстати говоря, экранчик на самом деле цветной, так что я обязательно выведу туда гифку с котиком и по-возможности doom. Вот что пока получается:

Ответ на пост «Мой открытый проект метеостанции с монохромным дисплеем» Электроника, Гаджеты, Esp8266, Самоделки, Умный дом, Длиннопост, Arduino
Ответ на пост «Мой открытый проект метеостанции с монохромным дисплеем» Электроника, Гаджеты, Esp8266, Самоделки, Умный дом, Длиннопост, Arduino

Хранит значения в постоянной памяти, так что не слетит, да и заодно ещё будет собираться на пк в отдельном файле. Ардуинка только 24 часа помнит. Значения с пк будет брать через серийник по usb, от него же и питаться. Короче, дел много, а я пока что занят клавиатурой dactyl manuform, да и посылки надо ждать, так что не могу доделать пока свой непонятный проект, как-то так. Как я хорошо накатал целый пост про проект, который и на 20 процентов не готов, а? Ладно, на самом деле уже все технические особенности определил, даже часть кода написал, остаётся только всё это собрать да отладить.

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

Показать полностью 6
Электроника Гаджеты Esp8266 Самоделки Умный дом Длиннопост Arduino
5
11262
nradiowave
nradiowave
10 месяцев назад

Мой открытый проект метеостанции с монохромным дисплеем⁠⁠

Дописал документацию к своей железке. Хотел бы показать чего получилось

Мой открытый проект метеостанции с монохромным дисплеем Электроника, Гаджеты, Esp32, Esp8266, C++, Самоделки, Home Assistant, Domoticz, Умный дом, Длиннопост

Метеостанция Волна 2BW42

Мой открытый проект метеостанции с монохромным дисплеем Электроника, Гаджеты, Esp32, Esp8266, C++, Самоделки, Home Assistant, Domoticz, Умный дом, Длиннопост

Если вкратце про сам проект - метеостанция рассчитана на интеграцию в систему умного дома - данные о внешнем датчике устройство получает через Home Assistant или Domoticz, и так же может отправлять свои данные по MQTT (в HA девайс подхватывается через Auto Discovery, в Domoticz через виртуальные датчики)

Прошивка совместима с ESP8266 и ESP32 (Arduino Framework, C++, PlatformIO); внутренний датчик температуры \ влажности BME280. Прошивка работает с дисплеями на электронных чернилах 4.2' и 1.54' дюйма (таблицы совместимости с теми производителями с которыми тестил можно найти на сайте с документацией). Сами E-Ink дисплеи своеобразны в работе и значительно медленней отрисовывают всю область экрана в сравнении с обычными жк, но не требуют постоянного питания для отображения картинки и для автономного девайса подходят хорошо, позволяя очень существенно экономить расход батареи. В живую картинка на таком экране читается приятно, как с обычного листа бумаги.

В режиме работы от аккума устройство просыпается раз минуту для обновления области часов на экране и раз в 10 минут для полного обновления (датчики температуры и другая статистика), WiFi-соединение (синхронизация данных по внешнему датчику, отправка своих данных по MQTT) раз в час в целях экономии заряда; аккума 18650 2000 мА*ч хватает на ~несколько месяцев. Все таймауты при желании можно перенастроить.

Оформление интерфейса изначально делал под дисплеи 4.2' (400х300), с котиком-индикатором который меняется от погодных условий \ времени.

Мой открытый проект метеостанции с монохромным дисплеем Электроника, Гаджеты, Esp32, Esp8266, C++, Самоделки, Home Assistant, Domoticz, Умный дом, Длиннопост

интерфейс по умолчанию

Некоторые зарисовки иконок которые делал для проекта, часть задействованы для индикатора :

Мой открытый проект метеостанции с монохромным дисплеем Электроника, Гаджеты, Esp32, Esp8266, C++, Самоделки, Home Assistant, Domoticz, Умный дом, Длиннопост

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

Пример настройки кастомного оформления (фоновая картинка может быть и на весь экран) :

Мой открытый проект метеостанции с монохромным дисплеем Электроника, Гаджеты, Esp32, Esp8266, C++, Самоделки, Home Assistant, Domoticz, Умный дом, Длиннопост

редактор интерфейсов

Мой открытый проект метеостанции с монохромным дисплеем Электроника, Гаджеты, Esp32, Esp8266, C++, Самоделки, Home Assistant, Domoticz, Умный дом, Длиннопост
Мой открытый проект метеостанции с монохромным дисплеем Электроника, Гаджеты, Esp32, Esp8266, C++, Самоделки, Home Assistant, Domoticz, Умный дом, Длиннопост

интерфейс для мелких дисплеев 1.54'

Еще некоторые фотографии с процесса сборки под разные варианты корпуса

Мой открытый проект метеостанции с монохромным дисплеем Электроника, Гаджеты, Esp32, Esp8266, C++, Самоделки, Home Assistant, Domoticz, Умный дом, Длиннопост

Основание корпуса-подставки

Мой открытый проект метеостанции с монохромным дисплеем Электроника, Гаджеты, Esp32, Esp8266, C++, Самоделки, Home Assistant, Domoticz, Умный дом, Длиннопост

вариант полностью закрытого корпуса (чуть промахнулся с размерами, в исходниках модельки 3д принта уже поправил)

Опционально в прошивке реализована возможность вывода картинок c 4 цветном режиме (2-bit). Если сам e-ink экран поддерживает такой режим работы, то можно загрузить картинку фона в таком режиме.

Пример отрисовки фона в градациях серого :

Мой открытый проект метеостанции с монохромным дисплеем Электроника, Гаджеты, Esp32, Esp8266, C++, Самоделки, Home Assistant, Domoticz, Умный дом, Длиннопост
Мой открытый проект метеостанции с монохромным дисплеем Электроника, Гаджеты, Esp32, Esp8266, C++, Самоделки, Home Assistant, Domoticz, Умный дом, Длиннопост

Тестовый "толстый" корпус с доступом к внутренностям. Использовался экран с двойным слоем чернил (красный \ черный), к сожалению они значительно медленней в плане отрисовки

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

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


Сайт с документацией (Метеостанция Волна 2BW42)
GitHub страница с прошивкой

Показать полностью 11
[моё] Электроника Гаджеты Esp32 Esp8266 C++ Самоделки Home Assistant Domoticz Умный дом Длиннопост
586
128
monobogdan
monobogdan
1 год назад
TECHNO BROTHER

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI?⁠⁠

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Зачастую в процессе разработки собственных устройств или моддинга уже существующих, встаёт задача выполнения стороннего кода: будь то ваши собственные программы с SD-флэшек, или программы, написанные другими пользователями с помощью SDK для вашего устройства. Тема компиляторов и кодогенерации достаточно сложная: чтобы просто загрузить ELF или EXE (PE) программу, вам нужно досконально разбираться в особенностях вашей архитектуры: что такое ABI, релокации, GOT, отличие -fPIE от -fPIC, как писать скрипты для ld и т. п. Недавно я копал SDK для первых версий Symbian и основываясь на решениях из этой ОС понял, каким образом можно сделать крайне «дешевую» загрузку любого нативного кода практически на любом микроконтроллере, совершенно не вникая в особенности кодогенерации под неё! Сегодня мы с вами: узнаем, что происходит в процессе загрузки программы ядром Linux, рассмотрим концепцию, предложенную Symbian Foundation и реализуем её на практике для относительно малоизвестной архитектуры — XTensa (хотя она используется в ESP32, детали её реализации «под капотом» для многих остаются загадкой). Интересно? Тогда добро пожаловать под кат!

❯ Как это работает?


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

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост




Давайте для общего понимания вкратце разберемся, как происходит загрузка программ в Windows/Linux:

1. Система создаёт процесс и загружает в память программы секции из ELF/PE. Обычные программы для своей работы используют 3 секции: .text (код), .data (не-инициализированный сегмент памяти для глобальных переменных), .bss (сегмент памяти для инициализированных переменных). Каждому процессу выделяется собственное адресное пространство, называемое виртуальной памятью, которое не позволяет программе испортить память ядра, а также позволяет не зависеть от разметки физической памяти на выполняющей машине. Концепцию виртуальной памяти реализует специальной модуль в процессоре, называемый MMU.

2. Если бы наши программы не использовали никаких зависимостей в виде динамических библиотек, то на этом процесс загрузки можно было бы закончить: каждая программа имеет свой адрес загрузки, относительно которого линкер строит связи между обращениями к коду/данным программы. Фактически, для самых простых программ линкеру остаётся лишь прибавить адрес загрузки программы (например, 0x100) к каждому абсолютному обращению к памяти.
Однако современные программы используют десятки библиотек и для всех предусмотреть собственный адрес загрузки не получится: кто-то где-то всё равно будет пересекаться и вероятно, портить память. Кроме того, современные стандарты безопасности в Linux рекомендуют использовать позиционно-независимый код, дабы использовать преимущества ASLR (Address Space Layout Randomization, или простыми словами возможность загрузить программу в случайное место в памяти, дабы некоторые уязвимости, завязанные на фиксированном адресе загрузки программы перестали работать).

3. Поэтому для решения этой проблемы придуман т. н. динамический линкер, который уже на этапе загрузки программы или библиотеки патчит программу так, чтобы её можно было загрузить в любой участок памяти. Для этого используются данные, полученные от обычного линкера а этапе компиляции программы: помимо .text, .data и .bss, линкер создаёт секции .rel и .rel-plt, которые называются релокациями. Если объяснять совсем условно, то релокации — это просто запись вида «какой абсолютный адрес в коде программы нужно пропатчить» -> «на какое смещение его пропатчить». Самая простая релокация выглядит вот так:

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Где по итогу:

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

.rel-plt же служит для резолвинга вызовов к dll/so: изначально программа ссылается на заранее определенные в процессе компиляции символы, которые уже в процессе загрузки патчатся на физические адреса функций из загруженной библиотеки.

И казалось бы — всё очень просто, пока в дело не вступают GOT (Global Offset Table — глобальная таблица смещений) и особенности реализации конкретного ABI. И ладно бы x86 или ARM, там всё разжевано и понятно, однако на других архитектурах начинаются проблемы и не всегда очевидно что и где за что отвечает.

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

  1. Писать полноценный загрузчик ELF-бинарников. ELF может оказаться громоздким для некоторых окружений и его реализация может оказаться тривиальной не для всех.

  2. Зарезервировать определенный сегмент в памяти (пусть с 0xFFF по 0xFFFF) и скомпилировать нашу программу с адресом загрузки 0xFFF с параметром -fno-pic. В таком случае, линкер сгенерирует обращения к памяти по абсолютным адресам — если переменная лежит по адресу 0xFFF, то программа будет обращаться сразу к этому адресу памяти, без необходимости что либо динамически линковать. Именно такой подход использовался во времена ZX Spectrum, Commodore 64 и MS-DOS (однако там роль «виртуальной памяти» выполняла такая особенность 8086, как сегменты). У такого подхода есть и минусы: относительная невозможность загрузки сразу нескольких программ одновременно, зарезервированное пространство линейно отъест небольшой кусок памяти у основной прошивки, нет возможности динамической аллокации секций. Зато такой код теоретически будет работать быстрее, чем PIC.

    Проблемы реализации такого способа: иногда нужно лезть в систему сборки основной прошивки и патчить скрипт линкера так, чтобы он не трогал определенный регион памяти. В случае esp32, например, это требует патча в сам SDK и возможного «откола» от мейнлайн дистрибутива.

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


Недавно мы сидели в чате ELF-сцены (разработка нативных программ под телефоны Siemens, Sony Ericsson, Motorola и LG с помощью хаков) и думали, как же можно реализовать загрузчик сторонних программ на практически неизвестных платформах. Кто-то предлагал взять ELF под основу — однако с его реализацией под некоторые платформы есть трудности, а кто-то предлагал писать «бинлоадер» — самопальный формат бинарников, который получается из, например, тех же эльфов.

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

В это же время я копал SDK для Symbian и хорошо помнил, что в прикладных приложениях для этой ОС нет поддержки глобальных переменных вообще. Да, сегмент .data и .bss полностью отсутствует — переменные предлагается хранить в структурах. Почему так сделано? Всё дело в том, что каждая программа в Symbian — это dll-библиотека, которую загружает EKA и создаёт экземпляр CApaApplication. И дабы была возможность загрузить dll один раз для всех программ (что справедливо для системных библиотек), ребята полностью выкинули возможность использования любых глобальных переменных. А ведь идея интересная!

Однако в таком подходе есть несколько серьезных ограничений:

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

  • Отсутствие преинициализированных данных. Вот это уже может стать относительно серьёзной проблемой, у которой, тем не менее, есть свои обходные решения. Например если вы храните команды для инициализации дисплея в таблице, или какие-либо калибровочные данные — вы не сможете их объявить, просто используя инициализаторы в C. Тоже самое касается и строковых литерал. Тут есть два варианта: часть таблиц можно вынести на стек (если эти самые таблицы достаточно маленькие), либо подгружать необходимые данные из бинарника с помощью основной прошивки (например, LoadString и т. п.).


Давайте же на практике посмотрим, имеет ли право на жизнь такой подход!

❯ Практическая реализация


Формат нашего бинарника будет до безобразия прост: небольшой заголовок в начале файла и просто сырой дамп сегмента .text, который можно экспортировать из полученного elf даже без необходимости писать скрипт для линкера. При этом нужно учесть, что ESP32 — это микроконтроллер частично Гарвардской архитектуры, т. е. шина данных и кода у него расположены отдельно. Однако у чипа есть полноценный MMU, который позволяет маппить регионы физической памяти в виртуальную память, чем мы и воспользуемся в итоге!

Заголовок нашего бинарника будет выглядеть вот так:

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Программа общается с основной прошивкой посредством псевдо-syscall'ов: функции, которая в качестве первого аргумента ожидает номер нужной службы и один 32х-битный указатель для описания структуры с параметрами. Реализация syscall'ов — одна из самых простых и неприхотливых с точки зрения обратной совместимости с будущими прошивками.

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Концептуально всё очень просто: GetGlobalStateSize сообщает нашему загрузчику размер структуры для хранения глобального стейта, в то время как Start уже фактически заменяет main() в нашей программе. Необходимости в crt0 нет, поскольку весь необходимый инит выполняет бутлоадер ESP32. Впрочем, при желании вы можете выделить отдельный стек для вашей программы — это повысит надежность, если выполняемая программа удумает испортить стек.

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Собираем нашу программу:

xtensa-esp32-elf-cc.exe test.c -fno-pic -nostdlib -nostartfiles -Wl,--section-start=.text=0x0

xtensa-esp32-elf-objcopy.exe --only-section=.text --output-target binary a.out run.bin

-fno-pic отключает генерацию кода, зависимого от GOT, -nostdlib и -nostartfiles убирает из билда crt0 и stdlib, благодаря чему мы получаем только необходимый код. --section-start задает смещение для загрузки секции .text на 0x0 (в идеале это делать необходимо из скрипта для ld).
objcopy скопирует из полученного ELF только необходимую нам секцию .text.

Как же это работает на практике? Давайте дизассемблируем выходной бинарник и посмотрим, что у нас дает на выхлопе cc:

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Обратите внимание, что Start вызывает подфункции с помощью инструкции CALLX8, которая в отличии от обычного Immediate-версии CALL8, выполняет переход относительно текущего адреса в PC, благодаря чему переход полностью независим от адреса загрузки программы в памяти. А благодаря тому, что все данные, в том числе и указатель на глобальный стейт передаются через стек, нет необходимости релокейтить сегменты данных.

По итогу всё, что нужно от загрузчика бинарников — это загрузить программу в память для инструкций, выделить память для структуры с стейтом программы и передать управление Start. Всё!
Конкретно в случае ESP32, у нас есть два возможных решения задачи загрузки программы в память:

  1. Загрузить программу в IRAM. Такая возможность теоретически есть, однако на практике загрузчик ESP32 устанавливает права только на чтение и выполнение на данный регион памяти. Попытка что-то скопировать туда закончится исключением SIGSEGV. Кроме того, сегмент IRAM относительно небольшой — всего около 200Кб.

  2. Самопрограммирование. Для этого, в esp32 есть два механизма — Partition API и SPI Flash API. Я выбрал Partition API для простоты реализации.


Для нашей прошивки необходимо будет переразметить флэш-память. Для этого запускаем idf.py menuconfig, идём в Partition Table -> Custom partition table CSV. Создаём в папке проекта partitions.csv, куда пишем:

# ESP-IDF Partition Table
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x6000,
phy_init, data, phy, 0xf000, 0x1000,
factory, app, factory, 0x10000, 1M,
executable, data, undefined, 0x110000, 0x10000

Для заливки программы можно использовать соответствующее Partition API, либо parttool.py:

parttool.py --port "COM41" write_partition --partition-name=executable --input "run.bin"

Переходим к загрузчику программы:

Выполняем сторонние программы на микроконтроллерах с Гарвардской архитектурой: как загружать программы без знания ABI? Опрос, Гаджеты, Программирование, C++, Avr, Arduino, Esp32, Embedded, Своими руками, Самоделки, Esp8266, Assembler, Железо, Микроконтроллеры, Длиннопост

Прошиваем ESP32:

idf.py build

idf.py flash

idf.py monitor

И смотрим результат:

SysCall 25

SysCall 35

SysCall 15

Всё работает!

❯ Заключение


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

Пожалуй, стоит упомянуть ещё один… очень своеобразный метод, который я иногда встречаю при реализации самодельных компьютеров. Люди пишут… эмуляторы 6502/Z80 :)
И если такой подход ещё +- применим к ESP32, то в AVR просадки производительности будут слишком серьезными. Так зачем, если можно использовать все возможности ядра на максимум?

Полезный материал?
Всего голосов:
Приходилось ли загружать сторонний код в ваших устройствах?
Всего голосов:
Показать полностью 9 2
[моё] Опрос Гаджеты Программирование C++ Avr Arduino Esp32 Embedded Своими руками Самоделки Esp8266 Assembler Железо Микроконтроллеры Длиннопост
12
76
Timeweb.Cloud
Timeweb.Cloud
1 год назад
TECHNO BROTHER
Серия Своими руками

Технологии прошлого и настоящего: как я сделал Nixie Clock с самодельным драйвером на ESP8266⁠⁠

  • Автор: CyberexTech

  • Больше интересных фото и комментариев в оригинале материала

Технологии прошлого и настоящего: как я сделал Nixie Clock с самодельным драйвером на ESP8266 Электроника, Техника, Изобретения, Часы, Timeweb, Гаджеты, Своими руками, Инженер, Видео, YouTube, Длиннопост, Esp8266

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

❯ С чего всё началось


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

Технологии прошлого и настоящего: как я сделал Nixie Clock с самодельным драйвером на ESP8266 Электроника, Техника, Изобретения, Часы, Timeweb, Гаджеты, Своими руками, Инженер, Видео, YouTube, Длиннопост, Esp8266

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

❯ Разработка часов


По состоянию на 2016 год, было много различных схем часов на лампах, но мне не нравилась их схемотехника, она казалась мне избыточной и не эффективной. Хотелось реализовать что-то простое, питающееся от стандартного USB порта, без использования модуля RTC и светодиодной подсветки, которая, по моему мнению, только портит всю эстетику ламп. На тот момент большинство схем работало на Arduino и микроконтроллерах от компании Atmel. Годом ранее, компания Espressif Systems выпустила на рынок свой микроконтроллер ESP8266, который произвел революцию. Так как на тот момент, широкополосный интернет уже был достаточно распространен, в том числе и домашние сети Wi-Fi, я решил отказаться от применения RTC модуля в своей схеме часов и использовать NTP серверы для синхронизации времени. Как вы могли догадаться, в своей схеме я применил модуль ESP8266. Далее я поделился в Twitter своим опытом применения нового модуля ESP8266 в своем проекте. Мой твит вызвал интерес, и мне предложили написать статью на Hackaday.io. Я последовал совету и опубликовал свою статью там.

Но в этой статье я хочу описать реализацию часов с применением шести индикаторов ИН-14 с использованием улучшенного драйвера. Как выглядят эти лампы, вы можете увидеть ниже.

Технологии прошлого и настоящего: как я сделал Nixie Clock с самодельным драйвером на ESP8266 Электроника, Техника, Изобретения, Часы, Timeweb, Гаджеты, Своими руками, Инженер, Видео, YouTube, Длиннопост, Esp8266

Давайте приступим


Ниже изображена схема драйвера часов:

Технологии прошлого и настоящего: как я сделал Nixie Clock с самодельным драйвером на ESP8266 Электроника, Техника, Изобретения, Часы, Timeweb, Гаджеты, Своими руками, Инженер, Видео, YouTube, Длиннопост, Esp8266

Схема подключения ламп:

Технологии прошлого и настоящего: как я сделал Nixie Clock с самодельным драйвером на ESP8266 Электроника, Техника, Изобретения, Часы, Timeweb, Гаджеты, Своими руками, Инженер, Видео, YouTube, Длиннопост, Esp8266

Согласно документации, индикаторная лампа работает от напряжения в 170В (напряжение возникновения разряда), для стабильной работы нам потребуется напряжение в 200В. Как вы можете видеть из схемы, для повышения напряжения до 200В применен set-up преобразователь на базе ШИМ контроллера МАХ1771 в связке с L2, D1 и Q1. Так как нам недостаточно выводов ESP8266 для управления лампами, то будем «размножать» пины управления с помощью дешифраторов CD4028BM96. Данный модифицированный драйвер позволяет управлять десятью газоразрядными индикаторными лампами. Выше описанный драйвер имеет динамический метод управления индикацией, то есть в определенный момент времени загорается только одна лампа, но переключение выполняется настолько быстро, что человеческий глаз практически не воспринимает переключение ламп и кажется что все лампы горят одновременно. Данный режим переводит работу ламп в импульсный режим, что положительно сказывается на их срок службы.

Разработка платы


Разработка платы велась в Sprint-Layout 5.0, так как мне это было удобнее для изготовления платы в домашних условиях.

Плата драйвера:

Технологии прошлого и настоящего: как я сделал Nixie Clock с самодельным драйвером на ESP8266 Электроника, Техника, Изобретения, Часы, Timeweb, Гаджеты, Своими руками, Инженер, Видео, YouTube, Длиннопост, Esp8266

Плата для установки ламп:

Технологии прошлого и настоящего: как я сделал Nixie Clock с самодельным драйвером на ESP8266 Электроника, Техника, Изобретения, Часы, Timeweb, Гаджеты, Своими руками, Инженер, Видео, YouTube, Длиннопост, Esp8266

Изготовление печатной платы выполнялось с применение фотошаблона и фоторезиста:

Технологии прошлого и настоящего: как я сделал Nixie Clock с самодельным драйвером на ESP8266 Электроника, Техника, Изобретения, Часы, Timeweb, Гаджеты, Своими руками, Инженер, Видео, YouTube, Длиннопост, Esp8266

Засветка фоторезиста платы драйвера:

Технологии прошлого и настоящего: как я сделал Nixie Clock с самодельным драйвером на ESP8266 Электроника, Техника, Изобретения, Часы, Timeweb, Гаджеты, Своими руками, Инженер, Видео, YouTube, Длиннопост, Esp8266

Засветка фоторезиста платы крепления ламп:

Технологии прошлого и настоящего: как я сделал Nixie Clock с самодельным драйвером на ESP8266 Электроника, Техника, Изобретения, Часы, Timeweb, Гаджеты, Своими руками, Инженер, Видео, YouTube, Длиннопост, Esp8266

Травление платы драйвера:

Технологии прошлого и настоящего: как я сделал Nixie Clock с самодельным драйвером на ESP8266 Электроника, Техника, Изобретения, Часы, Timeweb, Гаджеты, Своими руками, Инженер, Видео, YouTube, Длиннопост, Esp8266

Пайка компонентов:


Плата драйвера в собранном виде:

Технологии прошлого и настоящего: как я сделал Nixie Clock с самодельным драйвером на ESP8266 Электроника, Техника, Изобретения, Часы, Timeweb, Гаджеты, Своими руками, Инженер, Видео, YouTube, Длиннопост, Esp8266

Монтаж ламп на плату управления:

Технологии прошлого и настоящего: как я сделал Nixie Clock с самодельным драйвером на ESP8266 Электроника, Техника, Изобретения, Часы, Timeweb, Гаджеты, Своими руками, Инженер, Видео, YouTube, Длиннопост, Esp8266

Тест работы схемы часов с небольшой отладкой:

Технологии прошлого и настоящего: как я сделал Nixie Clock с самодельным драйвером на ESP8266 Электроника, Техника, Изобретения, Часы, Timeweb, Гаджеты, Своими руками, Инженер, Видео, YouTube, Длиннопост, Esp8266

Для управления высоким напряжением используются оптроны TLP627 от компании TOSHIBA.

TLP627 — высоковольтный транзисторный оптрон со схемой Дарлингтона на выходе.

Корпус часов


Корпус часов не предполагает какой либо сложной конструкции, разработка выполнялась во FreeCAD:

Технологии прошлого и настоящего: как я сделал Nixie Clock с самодельным драйвером на ESP8266 Электроника, Техника, Изобретения, Часы, Timeweb, Гаджеты, Своими руками, Инженер, Видео, YouTube, Длиннопост, Esp8266

Далее корпус был распечатан на 3D принтере, с использованием HIPS пластика. Данный пластик при печати создает структуру стенки, которая чем-то похоже на дерево и не обладает глянцевым эффектом как другие виды пластика типа PLA, ABS и т. п.

Монтаж электроники


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

Технологии прошлого и настоящего: как я сделал Nixie Clock с самодельным драйвером на ESP8266 Электроника, Техника, Изобретения, Часы, Timeweb, Гаджеты, Своими руками, Инженер, Видео, YouTube, Длиннопост, Esp8266

В итоге мы получаем следующее:

Технологии прошлого и настоящего: как я сделал Nixie Clock с самодельным драйвером на ESP8266 Электроника, Техника, Изобретения, Часы, Timeweb, Гаджеты, Своими руками, Инженер, Видео, YouTube, Длиннопост, Esp8266

Часы в работе:

Технологии прошлого и настоящего: как я сделал Nixie Clock с самодельным драйвером на ESP8266 Электроника, Техника, Изобретения, Часы, Timeweb, Гаджеты, Своими руками, Инженер, Видео, YouTube, Длиннопост, Esp8266

Часы в данный момент находятся на моём на рабочем столе, естественно, в живую они выглядят гораздо красивее:

Технологии прошлого и настоящего: как я сделал Nixie Clock с самодельным драйвером на ESP8266 Электроника, Техника, Изобретения, Часы, Timeweb, Гаджеты, Своими руками, Инженер, Видео, YouTube, Длиннопост, Esp8266

❯ Давайте поговорим о прошивке часов


Для разработки прошивки часов, я использовал среду разработки Arduino IDE. Ниже представлен код прошивки:

  • Код прошивки в источнике материала.

После удачной прошивки и первом включении, часы создадут Wi-Fi точку доступа. Для конфигурации часов необходимо подключиться к созданной точке доступа (пароль сети указан в прошивке) и перейдя по IP адресу 192.168.4.1 в браузере вашего устройства, выполнить не сложную настройку часов. Ниже представлен скриншот интерфейса устройства:

Технологии прошлого и настоящего: как я сделал Nixie Clock с самодельным драйвером на ESP8266 Электроника, Техника, Изобретения, Часы, Timeweb, Гаджеты, Своими руками, Инженер, Видео, YouTube, Длиннопост, Esp8266

Для настройки часов, вам необходимо будет подключиться к вашей Wi-Fi сети, указать NTP сервер и ваш часовой пояс. Затем перезагрузить часы. Всё, часы готовы к использованию.

❯ Что в итоге?


В итоге у нас получились простые в реализации часы на ламповых индикаторах, где не требуется применять антикварные микросхемы типа К155ИД1, вся схема выполнена на современной элементарной базе. Часы не нуждаются в ручной настройке времени, синхронизация времени выполняется автоматически с удаленного NTP сервера, что гарантирует постоянную точность времени. Разработанный драйвер показал хорошие результаты надежности, работая уже более пяти лет.

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

Спасибо, что дочитали до конца! Если статья понравилась, то вы знаете что делать. И как всегда, вопросы, пожелания, осуждение? :) — добро пожаловать в комментарии. До встречи в новых статьях!

Небольшой бонус, фото из архива:

Технологии прошлого и настоящего: как я сделал Nixie Clock с самодельным драйвером на ESP8266 Электроника, Техника, Изобретения, Часы, Timeweb, Гаджеты, Своими руками, Инженер, Видео, YouTube, Длиннопост, Esp8266
Технологии прошлого и настоящего: как я сделал Nixie Clock с самодельным драйвером на ESP8266 Электроника, Техника, Изобретения, Часы, Timeweb, Гаджеты, Своими руками, Инженер, Видео, YouTube, Длиннопост, Esp8266
Технологии прошлого и настоящего: как я сделал Nixie Clock с самодельным драйвером на ESP8266 Электроника, Техника, Изобретения, Часы, Timeweb, Гаджеты, Своими руками, Инженер, Видео, YouTube, Длиннопост, Esp8266
Технологии прошлого и настоящего: как я сделал Nixie Clock с самодельным драйвером на ESP8266 Электроника, Техника, Изобретения, Часы, Timeweb, Гаджеты, Своими руками, Инженер, Видео, YouTube, Длиннопост, Esp8266

Ссылки к статье:

  • Модель корпуса часов

  • Исходники проекта на GitHub (прошивка и проект платы)


Моё мобильное приложение для быстрого поиска и доступа к моим(и не только) самодельным устройствам.

Показать полностью 23 1
[моё] Электроника Техника Изобретения Часы Timeweb Гаджеты Своими руками Инженер Видео YouTube Длиннопост Esp8266
7
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии