LINUX.ORG.RU

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

 ,


3

5

Как-то так сложилось, что в руки попала esp-wroom-32 и попросили для неё написать программы.

Есть небольшой опыт программирования на ассемблере для avr: работа с прерываниями по таймеру и взаимодействие по UART. Для этого достаточно:

  • текстового редактора
  • avr-gcc
  • avrdude
  • make (опционально)

Для stm32 на LOR’е опубликован шикарнейший цикл статей. Спасибо, @vbr! На практике, признаюсь, пока не пробовал.

А как быть с esp32? В официальной инструкции рекомендуется использовать ESP-IDF (integrated development framework, если правильно помню). Я попробовал загрузить базовые примеры («Привет, Мир!» и помигать диодиком) и пришёл в ужас от того, как эта Python поделка секунд >10 это дело загружает.

Также попробовал это дело через Arduino IDE, только базовые примеры сам уже написал. Гораздо быстрее всё грузится, но всё равно – такое себе.

Какой необходимый минимум программ, чтобы работать с esp32?

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

vbr ★★★★★
()
Последнее исправление: vbr (всего исправлений: 1)
Ответ на: комментарий от Jullyfish

esphome удобная штука, она хоть и заточена для работы homeassistant, но можно и без него и без wifi

Не знаю о каком ide говорил товарищ выше, но это консольная вещь основанная на platformio

vim myesp1.yaml

esphome compile myesp1.yaml

esphome upload myesp1.yaml

Когда-то делал цифровое упр. блоком питания. Измерение через ina226, display 16x2, rotary encoder, 2 ЦАП – установка напряжения и тока.

substitutions:
  devicename: power-supply

esphome:
  name: $devicename
  platform: ESP32
  board: esp-wrover-kit
  on_boot:
     priority: -100
     then:
        - lambda: |-
              id(volt_output).set_level((float)(id(volt_set_int)/255.0));
              id(curr_output).set_level((float)(id(curr_set_int)/255.0));

globals:
   - id: volt_set_int
     type: uint8_t
     restore_value: yes
     initial_value: '49'
   - id: curr_set_int
     type: uint8_t
     restore_value: yes
     initial_value: '128'
   - id: mode_int
     type: uint8_t
     restore_value: no
     initial_value: '0' # 0 normal; 1 set U; 2 set I



logger:
  level: INFO
#  level: DEBUG

display:
  - platform: lcd_gpio
    dimensions: 16x2
    data_pins:
      - 27
      - 14
      - 32
      - 33
    enable_pin: 12
    rs_pin: 13
    update_interval: 1s
    lambda: |-
      if (id(mode_int)) {
          it.printf(0, 0, "U:%03d", id(volt_set_int));
          it.printf(0, 1, "I=%03d", id(curr_set_int));
       } else {
          it.printf(0, 0, "U=%03d", id(volt_set_int));
          it.printf(0, 1, "I:%03d", id(curr_set_int));
       }
      it.printf(8, 0, "U:%06.3f", id(ina226_bus_voltage).state - id(ina226_shunt_voltage).state);
      it.printf(8, 1, "I:%06.3f", id(ina226_current).state);


sensor:
  - platform: rotary_encoder
    id: "rotary_enc"
    pin_a: 19
    pin_b: 18
    on_clockwise:
       then:
         - lambda: |-
                if (id(mode_int)) {
                    if (id(curr_set_int)<255) id(curr_set_int)+=1;
                    id(curr_output).set_level((float)(id(curr_set_int)/255.0));
                } else {
                    if (id(volt_set_int)<255) id(volt_set_int)+=1;
                    id(volt_output).set_level((float)(id(volt_set_int)/255.0));
                }
    on_anticlockwise:
       then:
         - lambda: |-
                if (id(mode_int)) {
                    if (id(curr_set_int)>0) id(curr_set_int)-=1;
                    id(curr_output).set_level((float)(id(curr_set_int)/255.0));
                } else {
                    if (id(volt_set_int)>0) id(volt_set_int)-=1;
                    id(volt_output).set_level((float)(id(volt_set_int)/255.0));
                }
  - platform: ina226
    address: 0x40
    shunt_resistance: 0.025 ohm
    #shunt_resistance: 0.029 ohm
    update_interval: 1s
    current:
      id: "ina226_current"
    bus_voltage:
      id: "ina226_bus_voltage"
    shunt_voltage:
      id: "ina226_shunt_voltage"

binary_sensor:
  - platform: gpio
    pin:
      number: 5
      mode:
        input: true
        pullup: true
      inverted: true
    id: "rotary_switch"
    on_click:
      min_length: 50ms
      max_length: 350ms
      then:
        - globals.set:
            id: mode_int
            value: !lambda 'if (id(mode_int) == 0) return 1; else return 0;'

output:
  - platform: esp32_dac
    pin: 25
    id: volt_output
  - platform: esp32_dac
    pin: 26
    id: curr_output

i2c:
  sda: 21
  scl: 22
  scan: true
  id: bus_a
futurama ★★★★★
()
Последнее исправление: futurama (всего исправлений: 2)
Ответ на: комментарий от futurama

vim myesp1.yaml

esphome compile myesp1.yaml

esphome upload myesp1.yaml

У esp-idf тоже cli интерфейс, но, например, если взять официальный пример с миганием светодиодика, то сначала даётся команда idf.py build, которая у меня на компьютере создала 629 директорий и 1352 файла… И всё это ради одного диодика.

У arduino IDE тоже есть cli интерфейс.

esphome как и esp-idf на Python’е, что довольно грустно.

Но с yaml ещё дела не имел, так что интересно попробовать.

Jullyfish
() автор топика
Ответ на: комментарий от Jullyfish

Да ля, не осилишь ты Bare metal, это soc и этим все сказано, не взрывай себе мозг, пиши уже под freertos. тем более там есть много чего пописать.

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

Morin ★★★★★
()
Ответ на: комментарий от Jullyfish

которая у меня на компьютере создала 629 директорий и 1352 файла… И всё это ради одного диодика.

Добро пожаловать в прекрасный новый мир идиотов)

Выбрось каку(плату) и возьми rpi pico за 300 руб, космическими возможностями и вменяемым компилятор ом. Я в неё влюбился и теперь все остальные мк - жалкое подобие

pihter ★★★★★
()
Ответ на: комментарий от pihter

Добро пожаловать в прекрасный новый мир идиотов)

Хрю.

Выбрось каку(плату) и возьми rpi pico

Звучит как самый адекватный вариант. А как там с WiFi и BT? Знакомые используют esp32 потому что это дело там уже вшито и им «так проще».

Jullyfish
() автор топика
Ответ на: комментарий от Jullyfish

необходимый минимум программ, чтобы работать с esp32?

Не люблю IDE. Если есть возможность – лучше без него.

При такой клинической картине создавать файлы рекомендую через cat >, редактировать исключительно с помощью ed, и так далее, пока понимание не настанет, что ты не с тем борешься.

aol ★★★★★
()

А тебе не кажется, что прежде чем программировать микроконтроллер, надо хотя бы минимально, хоть что-то, прочитать про него? Про эту платформу? Нет?

Откуда у всех это жизненное кредо «х-ли думать, надо делать».

А ведь можно было просто погуглить и не задавать таких глупых вопросов.

ESP32 это тебе не доисторический восьмибитный AVR который ты программтруешь на ассемблере в блокнотике, люди, очнитесь!

Это современный двухъядерный микроконтроллер с wifi модулем, который работает под управлением многозадачной операционной системы на базе FreeRTOS!

Диодиком тебе помигать сложно. А что ты хотел, твоя прошивка для мигания диодиком содержит в себе операционку! Вот откуда там 600+ файлов.

Ты ещё Intel Core-i9 с блокнотика запрожь на асме, чтобы диодом помигать.

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

James_Holden ★★★★
()
Последнее исправление: James_Holden (всего исправлений: 3)
Ответ на: комментарий от James_Holden

А тебе не кажется, что прежде чем программировать микроконтроллер, надо хотя бы минимально, хоть что-то, прочитать про него?

По инструкции я дошёл до места, где написано:

That is all that you need to get started with ESP32!

и даже чуть-чуть дальше!

Это современный двухъядерный микроконтроллер с wifi модулем, который работает под управлением многозадачной операционной системы на базе FreeRTOS!

И это теперь меня обязывает ставить операционку на МК?

По сабжу - минимальный набор для них, это ESP-IDF и тулчейн из нее.

Грустненько.

ESP-IDF это форк FreeRTOS плюс драйверы периферии, плюс система сборки на питоне.

Не знал, благодарю!

Jullyfish
() автор топика

Можно через ардуино IDE программировать. Там от IDE только название, но зато можно как ардуину программировать.

Я так для веб-радио заливал готовую прошивку в WROVER.

Beewek ★★★
()
Ответ на: комментарий от Jullyfish

которая у меня на компьютере создала 629 директорий и 1352 файла…

«Я 11 лет считаю спички у вас в коробках - и то 59, то 60, а иногда и 58. Вы там сумасшедшие что ли все?» ©

gremlin_the_red ★★★★★
()
Ответ на: комментарий от gremlin_the_red

Для avr там буквально: исходный код, Makefile и Леголас (elf).

Для stm32: исходный код, Makefile и Леголас, только мы перед этим объективизируем, а потом делаем из него делаем бинарную личность.

А тут 629 урков и 1352 гоблинов!

Jullyfish
() автор топика
Ответ на: комментарий от James_Holden

Ты ещё Intel Core-i9 с блокнотика запрожь на асме, чтобы диодом помигать.

Так запросто, это EFI приложение из страницы кода, собирающееся двумя командами. Можно и x86 boot sector, то же самое. Нет никакой разницы между программированием avrок и взрослых процессоров, кроме объёмя кода для инициализации оборудования.

А готовые комплекты типа IDE+RTOS+своя система сборки+ещё куча говна - это для новичков сделано, и только для них и подходит.

anonymous
()
Ответ на: комментарий от James_Holden

esp-idf создаёт директорию build/, я взял пример с «Hello, world!»:

$ du -hs build/
118M	build/

Под efi никогда не писал, но вот инструкция как сделать всё тот же «Hello, world!» с помощью GNU-EFI:

13M	gnu-efi
4.0K	main.c
4.0K	main.o
Jullyfish
() автор топика
Ответ на: комментарий от Jullyfish

Ты хочешь сказать, что у тебя в ESP32 118 МЕГАбайт флеш памяти? Ты хорошо себя чувствуешь? Если бы прошивка весила 118 Мб, тебе понадобилось бы столько флеша в микроконтроллере. Очевидно, что там прошивка на два порядка меньше весит.

А вот gnu-efi, это, подозреваю, стрипнутый бинарник и он таки весит 13 Мб, что на порядок больше чем прошивка для ESP32, содержащая в себе ОС!

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

James_Holden ★★★★
()
Ответ на: комментарий от James_Holden

Ты хочешь сказать, что у тебя в ESP32 118 МЕГАбайт флеш памяти?

Не хочу. Скорее: какого х… исходники столько весят, если у нас всего 4 мб флеша? Зачем для каждого «проекта» мне собранные все-все-все компоненты?

стрипнутый бинарник и он таки весит 13 Мб

Насчёт стрипнусти не уверен Makefile не смотрел. Но там ещё исходный код.

Jullyfish
() автор топика

К сожалению, мейнстрим — это «ESP-IDF, rtos и не задавать дурацких вопросов». Либо NodeMCU, а то и вовсе богопротивный микропи**н. Имхо, по этой причине ESP32 — самая недооценённая и нераскрытая железка из популярных микроконтроллеров.

Объясняется это дело банально — Espressif наладили массовый выпуск чипов на готовых микроархитектурных блоках, лицензированных у третьей стороны (Cadence) и связаны NDA по рукам и ногам. В связи с чем официальная позиция у них такая: «мы ничего раскрыть не можем, но и мешать не будем. Расковыряете — молодцы, пользуйтесь». Сейчас в линейке появились чипы с ядрами на RISС-V, но большая часть по-прежнему завязана на проприетарные блоки и закрыта.

Отдельные попытки реверсить это дело есть (гуглить по «ESP32 Bare Metal»), но полноценного SDK пока не попадалось. Даже на недавнем 38C3 был доклад по расковыриванию беспроводного стека ESP32 (с переписыванием на rust, сообразно духу времени).

Если нужно что–то открытое, с хорошей документацией и беспровод не критичен — лучше и впрямь взять RP2040.

anonymous
()
Ответ на: комментарий от Jullyfish

А как там с WiFi и BT?

Есть версия платы с модулем и есть - без

Забыл упомянуть, там божественная стандартная библиотека и документация

Писать проще чем под авр-ку

pihter ★★★★★
()
Ответ на: комментарий от Jullyfish

. А как там с WiFi и BT?

Есть ESP32 с внешней антенной. Для всяких bluetooth датчиков - благодать. также есть esp32 с ethernet кабелем ( хотя нафига)? В общем полный простор для творчества

ivanich10
()
Ответ на: комментарий от Jullyfish

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

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

pihter ★★★★★
()
Ответ на: комментарий от James_Holden

То есть для его запуска понадобится UEFI?

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

pihter ★★★★★
()
Ответ на: комментарий от anonymous

по этой причине ESP32 — самая недооценённая и нераскрытая железка из популярных микроконтроллеров

Закрытость же. Было бы для неё все - цены б ей не было

pihter ★★★★★
()
Ответ на: комментарий от Morin

а при чем тут бивас? i9 может выполнять голый x86 машинный код или нет? Бивас нужен для взаимодействия с окружающим миром: с экрана читать с клавы писать. Если я возьму ПЗУшку, положу туда x86 хеллоу ворлд прямо с нуля – он будет выполняться?

pihter ★★★★★
()
Ответ на: комментарий от pihter

а при чем тут бивас? i9 может выполнять голый x86 машинный код или нет?

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

V1KT0P ★★
()
Ответ на: комментарий от pihter

Если я возьму ПЗУшку, положу туда x86 хеллоу ворлд прямо с нуля – он будет выполняться?

Ой все, давайте не будем собачится, это не конструктивный спор ради спора уже. Выполняться он будет, но чтобы решить хотя бы задачу которую решает MBR (отказавшись от BIOS, придется поработать напрямую с SATA контроллерами а не через функции BIOS диск читать, притом так чтобы с любыми работало) не дергая при этом прерывания BIOS (у нас ведь его нет в таком примере), придется навалить кода ну точно не меньше, чем ESP-IDF пихает в микроконтроллер. А скорее всего, намного больше.

И наоборот, я могу сказать что вот люди реверсят ESP32 baremetal и там наверняка есть минимальные примеры, когда «код выполняться будет», ничего полезного для практики не делая.

Речь же была не об этом, а о том, что чтобы раскрыть возможности ESP32 нужна операционка, драйверы, стек TCP/IP и беспроводной стек! Это, как бы, занимает место, да. А что вы хотели, ну посмотри сколько весит TCP/IP стек хотя бы, в разных его реализациях, и сколько аппаратных ресурсов для него надо.

James_Holden ★★★★
()
Последнее исправление: James_Holden (всего исправлений: 1)
Ответ на: комментарий от James_Holden

Речь же была не об этом, а о том, что чтобы раскрыть возможности ESP32 нужна операционка, драйверы, стек TCP/IP и беспроводной стек! Это, как бы, занимает место, да. А что вы хотели, ну посмотри сколько весит TCP/IP стек хотя бы, в разных его реализациях, и сколько аппаратных ресурсов для него надо.

А как в RPi Pico все это же работает без ОС? А как на авр-ках удп пакеты обрабатывают без ОС?

// справедливости ради, я еще не пробовал вайфай на ней ( но платку уже заимел ), но все остальное там работает приблизительно так же просто как и в авр. А мощи у ESP vs Pico сопоставимые. У нас тут еще и PIO есть, это ваще бомба, хоть hdmi в фоне организуй

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

pihter ★★★★★
()
Ответ на: комментарий от James_Holden

чтобы раскрыть возможности ESP32 нужна операционка, драйверы, стек TCP/IP и беспроводной стек!

Речь как раз о том, что стек возможно и нужен, а вот «операционка, драйверы» — для ряда задач уже совершенно лишние. Иногда можно обойтись и примитивным, как палка, шедулером, а то и вовсе тривиальным конечным автоматом. Далеко не всегда от 8266/ESP32 требуется именно беспроводной тракт — помимо RF это ещё и дешёвый шустрый 32-битный камень с хардварной криптой, кучей таймеров и прерываний.

Аналогичное заблуждение было поначалу про HAL и CubeMX на STM32 — мол, без них никак нельзя, сложно таймеры и периферию инициализировать, столько всего, вай-вай. А потом из карачаевских степей выполз грубый спивающийся астроном и вывозил неумех–ардуинщиков физиономией по их собственным заблуждениям.

Прошло десять лет, и теперь ни у кого не вызывает сомнений, что помигать светодиодиком на STM32 можно и без HAL, и без libopencm3, и без генерённых портянок («Нужно ли?» — это уже другой вопрос). Количество любознательных исследователей набрало критическую массу и status quo поменялся. Рано или поздно аналогичное случится и в отношении камней от Espressif.

anonymous
()
Ответ на: комментарий от pihter

Что там «все то же» работает? Ну почитайте даташиты, е мое, ну не хочу я бомбить, а приходится в этом треде)))

RPI Pico для WiFi использует дополнительный чип, с которым основной микроконтроллер общается по SPI. И этот чип имеет встроенный STM32 микроконтроллер с тонной памяти, уже прошитый TCP/IP и беспроводным стеком

Integrated ARM Cortex-M3 processor and on-chip memory
for complete WLAN subsystem functionality, minimizing the
need to wake up the applications processor for standard
WLAN functions. This allows for further minimization of
power consumption, while maintaining the ability to fieldupgrade with future features. On-chip memory includes 512
KB SRAM and 640 KB ROM.

Естественно, что тебе проще писать под него прошивку, ведь весь сетевой код уже с завода зашит во второй чип! Ну включите мозги, люди, ауууу…

Поэтому тебе там не нужна ОС - параллельная задача обработки сети там идет на другом микроконтроллере вообще!

Про udp на AVR я даже комментировать не буду. Хватит надо мной издеваться.

James_Holden ★★★★
()
Последнее исправление: James_Holden (всего исправлений: 1)
Ответ на: комментарий от James_Holden

Ну почитайте даташиты, е мое, ну не хочу я бомбить, а приходится в этом треде)))

Ну это же ( читать даташиты ) – крайний случай! :)

RPI Pico для WiFi использует дополнительный чип, с которым основной микроконтроллер общается по SPI. И этот чип имеет встроенный STM32 микроконтроллер с тонной памяти, уже прошитый TCP/IP и беспроводным стеком

Все, утерся, молчу :)

pihter ★★★★★
()
Ответ на: комментарий от anonymous

Прошло десять лет, и теперь ни у кого не вызывает сомнений, что помигать светодиодиком на STM32 можно и без HAL, и без libopencm3, и без генерённых портянок

И что? Я 11 лет назад на стм32 из самописного форта светодиодом мигал. Только беспроводной стек это уже другое, вероятно по сложности сравнимо с OsmocomBB. Может и попроще, но с миганием светодиодом такое явно не сравнить.

anonymous
()