Русский
Русский
English
Статистика
Реклама

Micropython

Перевод PortablePy компьютер-раскладушка для MicroPython

24.01.2021 16:23:06 | Автор: admin
Признаю: мне очень нравится та невероятная скорость, с которой загружаются домашние компьютеры 1980-х годов. Я какое-то время пытался оптимизировать время загрузки Raspberry Pi, но особенно далеко в этом деле не продвинулся. Я, кроме того, большой поклонник специализированных устройств, в которых аппаратное обеспечение используется для решения какой-то одной задачи. Такие системы тоже работают очень быстро. MicroPython это очень интересная разработка, попадающая в сферу моих интересов. Это, с одной стороны язык высокого уровня, а с другой программный комплекс, который без особых сложностей работает на весьма скромных аппаратных ресурсах.



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

  • StickPi: очень маленькое устройство, основанное на Raspberry Pi Zero с e-paper-дисплеем, но без клавиатуры и без батареи, к которому можно подключаться с компьютера по SSH.
  • PocketPi: устройство, основанное на Raspberry Pi Zero, питающееся от батарей, оснащённое 4-дюймовым экраном HyperPixel (800x480 пикселей) и миниатюрной клавиатурой.
  • PsionPi: мой свежий проект, основанный на Raspberry Pi 3a+, работающий от батарей, оснащённый клавиатурой от Psion 5 Series, в состав которого входит Arduino-контроллер клавиатуры и 7-дюймовый дисплей с разрешением 800x480.
  • Ещё один проект, подробностей о котором я пока не публиковал, представляющий собой устройство, в состав которого входит 5-дюймовый дисплей, Raspberry Pi 3 и миниатюрная клавиатура.

Собственно говоря, все эти проекты объединяет то, что в них используются разные варианты платы Raspberry Pi. Когда же вышел Adafruit PyPortal Titano, я тут же влюбился в это устройство, так как оно объединяет в себе много интересного железа и 3,5-дюймовый дисплей с разрешением 320x480, который я, кроме того, примерял к своему проекту PocketPi.

Я, кроме того, недавно узнал о существовании электронных компонентов производства M5Stack, и об их миниатюрной и недорогой QWERTY-клавиатуре CardKB Mini с поддержкой I2C, которая меня прямо-таки зацепила. Эта клавиатура использует Arduino для чтения данных с массива клавиш и для перевода информации о нажатии на клавиши в коды, которые можно передать во внешний мир. В результате это моя третья клавиатура, в которой используется Arduino (первая это механическая клавиатура, вторая клавиатура для моего недавнего проекта PsionPi). У Adafruit PyPortal Titano имеется поддержка I2C. Поэтому я решил попробовать подружить это устройство и CardKB Mini.


Adafruit PyPortal Titano, CardKB Mini и источник питания

Первым делом мне хотелось соединить устройства и посмотреть на то, как пользоваться клавиатурой для ввода текста без применения компьютера или USB-клавиатуры. Клавиатура видна по адресу 0x5f, для наладки работы с ней нужно просто транслировать коды клавиш в буквы. Конечно, нужно привязать к соответствующим действиям разные специальные клавиши, вроде Delete, Backspace и Return. В результате получится нечто вроде минималистичного текстового редактора.

Вот видеодемонстрация совместной работы Adafruit PyPortal Titano и CardKB Mini.

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


Карманный калькулятор Casio, моё устройство, Nokia E61

Карманный калькулятор Casio с предыдущего рисунка, на самом деле, обладает корпусом-раскладушкой. А вот мой любимый Nokia E61, в плане дизайна, гораздо ближе к тому, что получилось у меня. Размеры чёрного основания устройства составляют 125x100 мм, что хорошо, да и, в любом случае, сильнее уменьшить готовое устройство не получится. В общем-то, монолитный корпус надоел мне сразу же после того, как завершилась его печать

С другой стороны, логичным развитием идеи разработки корпуса, в плане его форм-фактора, является движение в сторону корпуса-раскладушки. Когда я держал в руках старый Game Boy Advance SP, я чувствовал, что хочу слышать приятный звук закрывания такого корпуса, и что мне хочется, чтобы у меня был бы миниатюрный компьютер, напоминающий этот Game Boy.


Модель корпуса в Tinkercad и Game Boy

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

В этом видео показано сравнение Game Boy и моего корпуса-раскладушки.

Я, из интереса, попробовал разместить в новом корпусе экран из моего проекта PocketPi.


Экран от PocketPi в новом корпусе

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

Теперь пришло время заняться проектированием источника питания. В этот раз я решил не пользоваться платой Adafruit PowerBoost. Мне кажется, что она слишком дорогая, да и греется она очень сильно. У меня была пара подобных плат более дешёвых, но и более крупных. Поэтому я решил попробовать воспользоваться ими. Для того чтобы сделать всю конструкцию тоньше и сэкономить место, я убрал USB-порт.


Работа над системой питания

Я, опять же, чтобы устройство было тоньше, убрал разъёмы с PyPortal и подключил питающий кабель напрямую, используя соответствующую схему.


Подключение питания к PyPortal

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


Компоненты компьютера, подключённые друг к другу

Мне пришлось кое-что изменить в корпусе и сделать в нём отверстия для USB-C-разъёма PyPortal, для выключателя питания и Micro-USB-порта, используемого для зарядки устройства. Потом я разместил в корпусе подсистему питания.


Размещение компонентов в корпусе

Клавиатуру я закрепил с помощью двустороннего скотча.


Готовое устройство

Тут можно посмотреть на мой компьютер в деле. Я, после съёмки этого видео, доработал корпус, сделал так, чтобы он нормально закрывался бы, и убрал магнитные держатели, что позволило выделить больше места для внутренних компонентов. Файлы для печати корпуса можно найти на Thingiverse.

Я написал на Python небольшую утилиту для работы с файлами и минималистичный редактор. Сейчас проблема заключается в невозможности записи данных во флэш-память платы при подключении её к компьютеру по USB-C. И мне ещё надо разобраться с тем, можно ли писать во флэш-память при работе устройства от батареи. Я продолжаю заниматься этим проектом, и, вполне возможно, ещё что-нибудь о нём расскажу.

Хотите сделать себе миниатюрный узкоспециализированный компьютер?

Подробнее..

Raspberry Pi Pico на МК RP2040 начало и первые шаги. Что есть поесть за 4

26.01.2021 20:09:19 | Автор: admin

Начало


Raspberry Pi Foundation всегда знает чем порадовать или удивить нас, а так же как подталкивать других производителей на интересные шаги и решения для хорошей конкуренции.
В четверг (рыбный день, кстати) 21-ого января 2021 года был анонсирован выпуск нового микроконтроллера RP2040 и небольшой платы с его применением, которая получила название Raspberry Pi Pico.



Честно говоря, я прочитал эту новость и не планировал ничего делать по этому поводу. Но потом случайно заметил несколько особенностей этого микроконтроллера, что разбудило любопытство во мне и подтолкнуло к покупке пары плат для дальнейших экспериментов. Очень привлекло наличие PIO блоков и множество PWM. Справедливости ради, PWM можно как-то решить, а вот с PIO есть смысл поиграться.

После пары дней занимательной возни я решил поделиться своим небольшим опытом с Хабром и его гостями.

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

Введение


Raspberry Pi Pico является платой с микроконтроллером RP2040.

Надо помнить, что это не компьютер, на котором запущена взрослая ОС типа Linux, а именно микроконтроллер и поэтому цели применения у Pico отличаются от той же Raspberry Pi Zero и других старших продуктов семейства Raspberry Pi.

Приведу часть технических характеристик:

  • Два ядра Arm Cortex-M0+ @ 133 МГц
  • 264 КБ памяти (284 КБ если отключить XIP кеширование и использовать память USB)
  • 2 МБ флеш-память с XIP кешированием. В RP2040 нет встроенной флеш-памяти, поэтому чип распаян на плате. У RP2040 есть поддержка до 16 МБ внешней флеш-памяти
  • DMA контроллер
  • 4 x 12-разрядных аналоговых входа (на Pico доступно для пользователя 3 из них)
  • 2 UART
  • 2 SPI
  • 2 I2C
  • 16 PWM каналов
  • Встроенный сенсор температуры
  • Всего 30 GPIO пинов (3,3 вольта)
  • MicroUSB B порт с USB 1.1 контроллером и поддержкой хоста
  • 2 PIO блока для своих собственных интерфейсов
  • 2 x PLL (один для USB, второй для остального)
  • Поддержка UF2 для загрузки бинарников
  • Поддержка SWD для загрузки и отладки
  • Поддержка спящих режимов и пониженной частоты для снижения потребления

RP2040 декодируется как:

RP: Raspberry Pi
2: два ядра
0: ядра M0+
4: минимум 256 КБ памяти
0: нет встроенной флеш-памяти

PIO блоки дают возможность создавать свои интерфейсы. Например, можно запрограммировать интерфейс WS2812, добавить I2S, SDIO или VGA и т.п.

Ещё одна интересная штука: ядро Cortex-M0+ не содержит в себе блока вычислений с плавающей запятой. Обычно это эмулируется библиотеками GCC, но тут Raspberry Pi использует более быстрое оптимизированное решение от автора Qfplib, которое лицензировано для использования на RP2040.

Более подробный datasheet на плату Pico
Тут можно найти datasheet на сам RP2040

Плата


Немного о самой плате Raspberry Pi Pico.

Плата имеет удобный размер 21мм x 51мм. Есть даже отверстия для монтирования, чем может похвастаться не каждая похожая плата.

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



На Pico стоит понижающий преобразователь на 3,3 Вольта. И это не просто линейный преобразователь, которые часто встречаются на недорогих аналогичных платах, а buck-boost SMPS на Richtek RT6150B. Благодаря этому входное питание платы может быть в пределах 1,8 5,5 Вольт.

Флеш-память W25Q16JV, хоть, и стоит внешняя, но перепаивать её будет не такой уж и тривиальной задачей, так как чип в корпусе USON-8 (мне лично точно не под силу).
Есть кнопка BOOTSEL и светодиод на GPIO25. Так же выведен SWD для отладки.

Кстати, можно использовать вторую плату Pico как отладчик по SWD.

Входы-выходы


На Raspberry Pi Pico выведено почти все входные-выходные пины (26 из 30). Официальная распиновка платы:



Некоторые пины задействованы для внутреннего применения:

GPIO23: выход для контроля энергосбережения SMPS. Можно регулировать пульсации за счёт изменения КПД преобразователя
GPIO24: вход для VBUS sense (1 если VBUS по MicroUSB подключен)
GPIO25: выход на светодиод, расположенный на плате
GPIO29: аналоговый вход для измерения VSYS/3
Сам USB порт дополнительно выведен на точки TP1, TP2 и TP3 внизу платы.



Разработка


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

  • C/C++ с использованием предлагаемого Pico SDK
  • CircuitPython для Pico
  • MicroPython для Pico

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

Попробую вкратце пройтись по каждому из этих подходов.

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

RP2040 имеет встроенный загрузчик, который поддерживает UF2 (разработка Microsoft) для загрузки бинарников. Это представляет из себя внешний USB накопитель, на который можно просто скопировать бинарник.

Когда я купил плату в магазине, то во флеш-памяти ничего не было и UF2 активировался автоматически при подключении по USB. Когда программа записана на флеш-памяти, то UF2 режим можно активировать удерживанием кнопки BOOTSEL при подачи питания по USB. Появится накопитель RPI-RP2, который можно использовать для копирования бинарных файлов uf2.

Для отладки можно использовать SWD. Если нет подходящего отладчика, то можно использовать ещё одну плату Pico с прошитым отладчиком.

Как более простой вариант Pico может выводить данные стандартного вывода на UART или прикидываться USB CDC и выводить в обычный терминал типа PuTTY, minicom или аналогичный с параметрами по-умолчанию 115200 8n1.

C/C++ с Pico SDK


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

В своё время для ESP8266 мне пришлось пройти достаточно длинный квест для установки и настройки SDK. Но первоначальная установка окружения для RP2040 мне показалась намного более простой и удобной.

В оригинальном документе достаточно подробно описаны шаги для установки SDK на Linux, macOS и Windows.

Вариант с разработкой на Raspberry Pi 4B или 400 с Linux будет самым простым, так как есть скрипты, которые сделают первоначальную конфигурацию (даже установку Visual Studio Code):

git clone https://github.com/raspberrypi/pico-setup.gitpico-setup/pico_setup.sh


У меня все Raspberry Pi 4 оказались в каких-то своих тёмных делах, да и как-то привычнее разрабатывать на более удобных компах. По этой причине был выбран путь установки окружения вручную. Тем более, это оказалось не таким уж и сложным.

Весь процесс начальной подготовки сводится к следующим шагам (в данном случае шаги выполнялись на macOS и Linux):

# Создать общую директорию для всего:mkdir pico && cd pico# Забрать Pico SDK:git clone --recursive https://github.com/raspberrypi/pico-sdk.git# Забрать примеры:git clone https://github.com/raspberrypi/pico-examples.git# Linux: установить необходимые инструменты для сборки через "apt":apt update && apt install cmake gcc-arm-none-eabi build-essential# OSX: установить инструменты используя "brew" (список может немного меняться в зависимости от текущих установленных пакетов):# (gcc-arm-embedded будет установлен в /usr/local/bin. Эта информация нужна будет при конфигурировании Visual Studio Code)brew install cmake gcc-arm-embedded# Настроить переменную PICO_SDK_PATH (можно занести значение во что-то типа .profile по вкусу):export PICO_SDK_PATH=`pwd`/pico-sdk

Пример кода для мигания светодиодом с использованием Pico SDK:

#include "pico/stdlib.h"int main() {    // Конфигурация пина со светодиодом    const uint LED_PIN = 25;    gpio_init(LED_PIN);    gpio_set_dir(LED_PIN, GPIO_OUT);    // Наш рабочий бесконечный цикл    while (true) {        // Переключить светодиод        gpio_put(LED_PIN, 1);        sleep_ms(250);        gpio_put(LED_PIN, 0);        sleep_ms(250);    }}

Можно попробовать собрать эту мигалку из примеров:

cd pico-examplesmkdir buildcd buildcmake ..cd blinkmake -j8

Если всё прошло без ошибок, то в результате мы получим файлы, среди которых будет blink.uf2. Этот файл можно скопировать на Pico в режиме UF2 (надо удерживать кнопку BOOTSEL во время подачи питания по USB).

После копирования Pico автоматически перезагрузится и можно наслаждаться hello world на микроконтроллере.

В pico-examples есть достаточно много интересных примеров. В том числе и примеры с использованием PIO. Выглядит очень интересно. Возможно, расскажу об этом потом, но надо самому разобраться для начала.

Для создания начального шаблона для своего проекта есть инструмент от Raspberry Pi.

Он создаёт шаблоны под Pico SDK, Visual Studio и добавляет поддержку разных библиотек на разную периферию.

CircuitPython


Я много слышал про MicroPython и CircuitPython, но никогда не сталкивался. А тут появилась хорошая возможность пощупать.

CircuitPython является форком MicroPython, но со своими плюшками. Пожалуй, самая заметная плюшка в том, что CircuitPython создаёт USB флешку со своей файловой системой, где можно напрямую редактировать скрипты на Python'е в своём любимом IDE. При любой записи изменённого скрипта происходит автоматический перезапуск платы и выполнение кода.
В терминале можно видеть результат или запустить интерактивный режим для выполнения команд в нём, что тоже помогает в отладке.

Установка CircuitPython достаточно проста:

  1. Скачать файл UF2 файл с CircuitPython'ом на circuitpython.org/board/raspberry_pi_pico
  2. Перевести Pico в режим UF2 удержанием BOOTSEL во время подачи питания USB
  3. Скопировать файл из #1 на флешку RPI-RP2, после чего Pico перезапустится автоматически

После этого из системы уйдёт RPI-RP2 и вместо него появится новый накопитель CIRCUITPY. На этом новом накопители должен быть файл code.py, с которого начинается выполнение кода. Так же там будет пустая директория lib, куда можно добавлять сторонние и свои библиотеки.
Файл code.py можно изменять прямо на этом накопителе в своём любимом редакторе. Adafruit советует использовать свой MU Editor, но у меня он зависает при запуске. Наверно, это даже к лучшему, так как я всё равно пользовался бы чем-то другим.

Так же доступна консоль на последовательном порту с параметрами 115200 8n1. При подключении можно получить доступ к интерактивному Python'у и выводу в консоль через print в скриптах.

Наша мигалка на CircuitPyhon будет выглядеть примерно так:

import boardimport timefrom digitalio import DigitalInOut, Direction# Конфигурация пина со светодиодомled = DigitalInOut(board.LED)led.direction = Direction.OUTPUT# Наш рабочий бесконечный циклwhile True:    # Переключить светодиод    led.value = not led.value    time.sleep(1)

Adafruit предлагает достаточно большой набор библиотек для работы с разным оборудованием.
Можно скачать .zip архив со всеми официальными доступными библиотеками для CircuitPython на circuitpython.org/libraries

Рекомендуется забирать .mpy версию. Это готовый байт-код, который откомпилирован под нужную версию CircuitPython.

MicroPython


MicroPython и CircuitPython достаточно близки друг к другу, но с некоторыми особенностями для отладки и API.

Установка MicroPython тоже достаточно проста:

  1. Скачиваем UF2 со свежим релизом тут (вкладка Getting started with MicroPython)
  2. Переводим Pico в режим UF2 удерживанием BOOTSEL во время подачи питания USB
  3. Копируем .uf2 файл из первого шага на RPI-RP2

На этот раз RPI-RP2 уходит, но новый накопитель не появляется. Можно подключиться терминалом на только что появившийся порт (115200 8n1), по которому будет доступна интерактивная консоль Python'а.

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

Скачать Thonny можно тут

После установки Thonny в настройках надо подключить Pico. Это сделать можно через меню Tools Options, потом в закладке Interpreter выбрать MicroPython (Raspberry Pi Pico) в поле Which interpreter or device, а в поле Port выбрать порт, на котором подключена плата Pico.



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

Пример для мигания на MicroPython:

import timefrom machine import Pin# Конфигурация пина со светодиодомled = Pin(25, Pin.OUT)led.value(0)# Наш рабочий бесконечный циклwhile True:    # Переключить светодиод    led.toggle()    time.sleep(1)

Выводы (на этот раз не контроллера)


На мой взгляд для такого свежего и нового микроконтроллера уже есть достаточно инструментов для начала экспериментов.

Уверен, что фанатам Arduino не придётся долго ждать когда Pico будет портирован на их любимую платформу. Зато пока есть хороший повод поиграться с Python'ом.

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

Ещё недавно я наткнулся на TensorFlow Lite Micro для Pico для запуска моделей машинного обучения.

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

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

Из песочницы Как я умный аквариум делал (backend)

27.09.2020 12:08:21 | Автор: admin

image


Пролог


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


Обучался я в основном web программированию, поскольку и работал на том же направлении. Охватывал Full-stack разработку, поскольку решил, что нужно разбираться как в серверной части, так и во фронтовой. Учил JavaScript и различные фреймворки для бека это были Express, Appolo GraphQL (поскольку на работе был именно такой стек, да и в целом хотелось попробовать что-то отличное от REST подхода), на фронте это был все тот же Apollo GQL и Vue.


И вот немного окрепнув в этой связке, завершая один из учебных проектов, я задумался, что бы сделать интересного, где можно было бы задействовать мои знания. Эта мысль меня уже давно беспокоила, конечно многие мне советовали, для того что бы получить опыт, можно сделать с нуля свой "В контакте", "The Facebook", "Instagram" и т.д. и они были правы, действительно это бы прибавило мне опыта, но такие большие проекты я боялся не вывести в одиночку и забросить его.


Как то раз мой друг решил купить себе аквариум, тогда я думал, что это глупое занятие, что толку пялится на рыб? Подумал я тогда...


Но случилось то что должно было, друг купил себе аквариум на 15 литров и тройку рыбешек по 3см каждая. Спустя неделю друг понял, что хочет больше и конечно же свой старый он подсунул именно мне со словами "Да ладно он не большой, тебе понравится, просто поставь, пусть стоит рядом с кроватью". Но тех рыб он оставил себе. Я же пошел в ближайшей магазин и купил себе "Петушка" Кто не в курсе погуглите, вкратце скажу, что это бойцовская рыбка, которую всегда селят в отдельном аквариуме.


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


И так почитав разные статейки я пришел к тому, что я хочу для начала попробовать так называемый "Нано риф" маленький морской аквариум от 20-50 литров, в который даже "Самп" необязательно ставить. Выяснилось, что мне нужно освещение в разных спектрах (белый, синий, зеленый, красный), при всем этом светодиоды должны светить одновременно, поэтом RGB светодиоды мне не подойдут. Освещение должно само меняться, создавая иллюзию дня и ночи. Нужен был рассвет и закат. Нужно следить за температурой. Нужно следить за химической составляющей воды. Делать ее подмены. И еще много всего. И тут я подумал, что можно какую то часть из этого автоматизировать, по крайней мере что касаемо освещения и температуры.


Еще несколько лет назад я делал несложные приспособления на платформе Arduino. Было весело и интересно, было решено сделать умный аквариум на базе этой платформы, позже я поменял саму платформу.


Не переплачивай делай сам


Выбор был сделан в пользу платы NodeMCU это такая "Ардуина" с уже встроенным WI-FI на борту (ESP 8266), что мне и нужно было, хотя у меня и была в закромах Arduino nano и сам wi-fi модуль в отдельном исполнении, но его надо было прошивать для этого и т.д. Заказал на известном сайте в поднебесной новенькую NodeMCU, пришла быстро и работа закипела.



По старинке скачал Arduino IDE настроил ее на работу с этой платой (на Windows 10, сам драйвер встал по умолчанию), и открыл пример для подключения к WI-FI. Не знаю почему, долго я мучил ее но так и не влетело мое подключение, начала гуглить. Почитав несколько статей, узнал, что на платку можно залить прошивку для некоего языка Lua(потратив усилия и время потом уже вычитал, что еще есть Micro python, но об этом позже)


Прошив плату и открыв документацию вместе с форумом, увидел примеры кода, которые шокировали даже меня, человека который нормально относится к C++ в Arduino и знающего JS и Python(немного). И там был синтаксис которого я не хотел:


init.lua


print ( "Waiting ...")tmr.register (0, 5000, tmr.ALARM_SINGLE, function (t) tmr.unregister (0); print ( "Starting ..."); dofile ( "main.lua") end)tmr.start (0)

main.lua


--WiFi Settupwifi.setmode(wifi.STATION)local cfg={}cfg.ssid="wifi_point_name"cfg.pwd="point_pass"wifi.sta.config(cfg)cfg = nilcollectgarbage()=wifi.ap.getip()

Пример для подключения к WI-FI был менее ужасным, но тем не менее, я не хотел разбираться в этих begin и end. Почитав документацию к esp-8266 узнал, что есть на ней некая прошивка с Питоном на борту. Точнее это было не просто обычный Питон, это было Micro python, некая обрезанная версия его, но все же это было лучше чем lua ИМХО. И я полез искать прошивки и инструменты


Скачиваем с сайта прошивку под нужную плату и прошиваем при помощи esptool прошиваем


pip install -g esptoolesptool.py --port COM3 --baud 460800 write_flash --flash_size=detect 0 esp8266-20191220-v1.12.bin

скачиваем специальную IDE EsPy для работы с "Микропитоном" и понеслась.


Для начала прочитал что на плату надо залить обязательных два файла, без которых ничего не поедет, а именно:


  • boot.py скрипт, который загружается первым при включении платы. Обычно в него вставляют функции для инициализации модулей, подключения к Wi-Fi и запуска WebREPL;
  • main.py основной скрипт, который запускается сразу после выполнения boot.py, в него записывается основная программа.

Далее читаю как все используют интерфейс взаимодействия WebREPL очень схоже с тем как используют ssh подключение для работы с raspberri, но он был мне не нужен, поскольку EsPy умел общаться с платой и можно было также закачивать свеженаписанный скрипт на плату без использования esptool, хотя и там не было ничего сложного. Первый шаг подключение к WI-FI засунул в скрипт самый базовый и легкий код.


boot.py


import networkimport time''' Код подключения к WiFi '''wlan_id = "my_point"wlan_pass = "strong_pass"wlan = network.WLAN(network.STA_IF)wlan.active(True)if wlan.isconnected() == False:    wlan.connect(wlan_id, wlan_pass)    while wlan.isconnected() == False:        time.sleep(3)        print("Connection Fail...")print('Device IP:', wlan.ifconfig()[0])

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


main.py


from app import app_startapp_start()

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


app.py


from micropyserver import MicroPyServerimport ujsonserver = MicroPyServer()def send(self, **kwargs):        '''            Отправляем ответ        '''        server.send(            ujson.dumps(kwargs),            content_type="Content-Type: application/json",            # Добавляем заголовки для CORS политики            extra_headers=["Access-Control-Allow-Origin: *"]        )        gc.collect()def healthcheck():    send(success=1, healthcheck='green')server.add_route("/healthcheck", healthcheck)def app_start():    server.start()

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


  • main.py
  • boot.py
  • app.py
  • micropyserver.py

Запускаем, видим что сервак локально поднялся и предлагает сходить на http://192.168.1.70/ и проверить. Идем в браузер, делаем запрос http://192.168.1.70/healthcheck, и о чудо все работает, сервер отвечает



// Json from chrome browser{    "success": 1,    "healthcheck": "green",}

Далее ждал когда приедут нужные мне hardware запчасти (датчик температуры, LED-матрицы, LCD-дисплей и т.д. ), пока ждал, принялся писать бекенд дальше, все разбил на классы и начал писать. Для начала решил написать Помошника для сервера, который бы включал в себя парсер запросов и функцию отправки, и добавил Класс для работы с датчиком температуры.


app.py


from heater import Heater# ... пропущен кодclass HttpHelper:    """        Простой парсер GET запросов    """    def __init__(self):        pass    def parse(self, request):        '''            парсер строки ответа сервера        '''        lines = request.split("\r\n")        result = {            'lines': lines,            'method': ure.search("^([A-Z]+)", lines[0]).group(1),            'path': ure.search(                "^[A-Z]+\\s+(/[-a-zA-Z0-9_.]*)", lines[0]            ).group(1),        }        param_split = ure.sub("\/([a-z]+_?)+?\?", '', lines[0].split(" ")[1])        result['params'] = self.get_params(param_split.split("&"))        return result    def get_params(self, params_as_array):        '''            создает словарь для query параметров        '''        params = {}        for element in params_as_array:            splited = element.split("=")            params[splited[0]] = splited[1]        return params    def send(self, **kwargs):        '''            Отправляем ответ        '''        server.send(            ujson.dumps(kwargs),            content_type="Content-Type: application/json",            extra_headers=["Access-Control-Allow-Origin: *"]        )        gc.collect()# ... пропущен кодdef get_water_temperature_C(request):    '''        Отдает температуру в Цельсиях    '''    try:        water_heater.get_water_tmp_C()        http_helper.send(            success=1,            water_temperature_c=water_heater.water_tmp        )    except Exception as e:        print(e)        http_helper.send(success=0, error=e)# ... пропущен кодserver.add_route("/healthcheck", healthcheck)server.add_route("/get_water_tmp", get_water_temperature_C)# ... пропущен код

heater.py


import machineimport onewireimport ds18x20HEATER_PIN = 2class Heater:    def __init__(self):        self.water_tmp = 0.00        self.heater_pin = machine.Pin(HEATER_PIN)        self.sensor = ds18x20.DS18X20(onewire.OneWire(self.heater_pin))    def get_water_tmp_C(self):        rows = self.sensor.scan()        self.sensor.convert_temp()        for rom in rows:            self.water_tmp = self.sensor.read_temp(rom)        return self.water_tmp

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



  • белый 2 штуки
  • зеленый 1 штука
  • красный 1 штука
  • синий 1 штука

Все они питались от 32 вольт, взял блок питания для термотринтеров (24V) и повышающий преобразователь. Посоветовавшись со знающим другом, принял решение подключать все их через микросхему, которая называется в простонародье "составной транзистор Дарлингтона", понравилось, что все на одной небольшой микросхеме и не нужно париться с радиаторами охлаждения, если бы я выбрал биполярные транзисторы. Все приехало, все спаял и прикрутил к радиатору. Светодиоды не стал промазывать термо-пастой, так как знал, что на все 100% они не будут гореть и тепло будет хорошо отводится и так. Получилось все конечно не на продажу, но в целом меня внешний вид пока устраивал.


Написал класс для них, и добавил роуты для работы через API.


Прицепил еще LCD дисплей, что бы видеть на каком IP стартанул сервер, поскольку на тот момент еще не было реализовано статичный ip для этого. Ну и после этого пошел писать frontend для того, что бы можно было с любого устройства смотреть инфу и управлять аквариумом.



Эпилог


В целом получил хороший опыт в разработке IOT устройства, работа над которым еще не завершена и будет продолжаться. В процессе пришлось немного подкорректировать работу библиотеки MicroPyServer, а именно объем передаваемых данных в сокете. Поскольку я пришел к тому, что при нескольких запросах в течении небольшого промежутка, память просто заканчивалась и контроллер падал с ошибкой, пока не придумал как ее можно отловить в try except, но это надо будет сделать.


micropyserver.py


# ... пропущенный кодdef _get_request(self):        """ Return request body """        # было выставлено 4096 , при этом быстро возникает MemoryError        return str(self._connect.recv(1024), "utf8")

В планах:


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

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru