MicroPyton на ESP8266

Тема в разделе "ESP8266, ESP32", создана пользователем DIceberg, 5 янв 2018.

Метки:
  1. BreakFaster

    BreakFaster Нерд

    А как такую посылку принять и распарсить?
     
  2. ИгорьК

    ИгорьК Гуру

    ИМХО, не тратьте ЗДЕСЬ время на вопросы. Не видел здесь тех, кто работает в Микропитоне.

    Есть и положительный момент - можете делать ветку про Микропитон сами :)
     
  3. обычными операциями на числах и массивах
     
  4. BreakFaster

    BreakFaster Нерд

    Если не решу эту первую задачу, то ветки не будет, уйду опять Ардуино. Но Микропитон привлекает элегантностью и длиной кода и возможностью в последующем легко менять программу по сети.
    А где, по Вашему мнению, стоит искать ответы на вопросы по Мискропитону/Питону?
     
  5. ИгорьК

    ИгорьК Гуру

    На сайте разработчиков наверняка есть форум. Как-то же вы ставили прошивку, откуда-то брали.
     
  6. parovoZZ

    parovoZZ Гуру

    переходи на LUA - тогда @ИгорьК подскажет.
     
  7. ИгорьК

    ИгорьК Гуру

    Кстати, разделил бы вопрос. По Питону и даже Микропитону искать ответы не проблема - язык как язык, в учебниках и http://micropython.org все написано.
    А вот как дело дойдет до реализвции на конкретной железке, тут придется, вероятно, попотеть, если нет хорошей wiki.
     
  8. insolor

    insolor Нерд


    Это делается через uctypes (аналог библиотеки ctypes, но для micropython)

    Я работаю, в случае чего можно ко мне отправлять)
     
    nyptus, ZAZ-965 и BreakFaster нравится это.
  9. ИгорьК

    ИгорьК Гуру

    Ну вы бы сами как-то почаще проявлялись :)
     
  10. BreakFaster

    BreakFaster Нерд

    Забрезжила надежда на решение, вечером продолжу "попотеть".
     
  11. insolor

    insolor Нерд

    C Micropython есть такая проблема, что для каждого вида микроконтроллера (stm32/pyboard, esp8266, esp32 и т.д.) реализация библиотек может отличаться - начиная от инициализации пинов до интерфейса I2C, например, могут отличаться названия методов, порядок передачи параметров, названия параметров и т.д. Получается, что нельзя написать модуль, а потом без изменений просто взять и перенести на другой МК.

    Adafruit пилят свой Circuitpython, где вроде бы все к единому стандарту приводятся, но вроде бы с 4 версии собираются отказаться от поддержки ESP8266, что для меня лично большой минус. И существующие модули от micropython, чтобы они работали под circuitpython, естественно придется допиливать.
     
  12. parovoZZ

    parovoZZ Гуру

    А Си чем не подходит? Изврат ради чего происходит?
     
  13. insolor

    insolor Нерд

    Первое - интерактивность. Можно быстро в интерактивном режиме какой-то скрипт написать, запустить, без перепрошивки микроконтроллера.
    Второе - я пишу на Си, но не на С++, что-то с ООП мне проще на Python написать. Это, конечно, дело привычки и вкуса.
    Третье - какие-то скрипты, например, работающие с вебом (через модуль requests, например) можно достаточно легко адаптировать с десктопного Python на Micropython. Это будет небольшой адаптацией кода, а не переписыванием с нуля на C++.
    Еще есть Jupyter Notebook, есть возможность подключить микроконтроллер с micropython в качестве ядра, по сути пишем код в браузере, а исполняется он на микроконтроллере.
     
    BreakFaster нравится это.
  14. BreakFaster

    BreakFaster Нерд

    Сообщаю о промежуточном результате, полученном по совету insolor.
    Удалось добиться взаимности от модуля nrf24l01+, пришлось попотеть вечерок, даже либу, которая идет в исходниках Микропитона пришлось слегка дошлифовать напильником и найти один нюанс по прописке адресов pipes, но девайс задышал, принимает и передает, в том числе сообщения от существующих датчиков. Кому интересно - спрашивайте.
    Распарсивание пакетов на приеме делал и с помощью либы uctypes http://docs.micropython.org/en/v1.9.3/pyboard/library/uctypes.html, и с помощью ustruct http://docs.micropython.org/en/latest/library/ustruct.html , прокатила вторая.
    Код (Python):

    import sys
    import ustruct as struct
    import utime
    from machine import Pin, SPI
    from nrf24l01 import NRF24L01
    from micropython import const
    import uctypes

    METEO= {
        "SensorID" : 0 | uctypes.UINT16,
        "ParamValue1" : 2 | uctypes.FLOAT32,
        "ParamValue2" : 6 | uctypes.FLOAT32,
        "ParamValue3" : 10 | uctypes.FLOAT32,
        "ParamValue4" : 14 | uctypes.FLOAT32,
        "ParamValue5" : 18 | uctypes.UINT32,
        "ParamValue6" : 22 | uctypes.UINT32,
        "Comment" : (26 | uctypes.ARRAY, 6 | uctypes.UINT8),
    }
    buff = bytearray(32)
    message_res = uctypes.struct(uctypes.addressof(buff), METEO, uctypes.NATIVE)

                    buff = nrf.recv() # прием данных от nrf24l01+ в буфер
                    sensor_id = int(buff[0] + (buff[1]<<8))
                    #sensor_id = int(message_res.SensorID)  # НЕ ПРОКАТИЛО, ЧЯДНТ?
                    val1 = struct.unpack('f', buff[2:6])
                    val2 = struct.unpack('f', buff[6:10])
                    val3 = struct.unpack('f', buff[10:14])
                    val4 = struct.unpack('f', buff[14:18])
                    val5 = struct.unpack('I', buff[18:22])
                    val6 = struct.unpack('I', buff[22:26])
                    val7 = struct.unpack('s', buff[26:32])
                    print('Received data ', buff)
                    print('Received data ', list(buff))
                    print('SensorID : ', sensor_id)
                    print('Val1     : %2.2f' % val1)
                    print('Val2     : %2.2f' % val2)
                    print('Val3     : %2.2f' % val3)
                    print('Val4     : %2.2f' % val4)
                    print('Val5     : %d' % val5)
                    print('Val6     : %d' % val6)
                    print('Comment  : ', buff[26:32])

     
    Какие будут советы?
    На передачу формирую пакет с помощью uctypes, вроде прокатывает, но попробую-таки ustruct потом, в силу его трушности для Пайтона.
     
    Последнее редактирование: 26 апр 2019
    nyptus и insolor нравится это.
  15. insolor

    insolor Нерд

    Код (Python):
    #sensor_id = int(message_res.SensorID)  # НЕ ПРОКАТИЛО, ЧЯДНТ?
    message_res.SensorID - какого типа значение? Если ошибку пишет, то какую?
     
  16. BreakFaster

    BreakFaster Нерд

    Тип - uctypes.UINT16. Выдает 0, ошибку не пишет. А ручной парсинг buff дает номер датчика, как положено.
     
  17. insolor

    insolor Нерд

    Если по аналогии с ctypes, то там для получения значения из типа c_uint16 нужно использовать поле value. Т.е. должно как-то так работать:

    sensor_id = message_res.SensorID.value

    Модуль struct я не люблю потому что там для описания полей используется неочевидное сочетание букв и символов. В ctypes явно названия типов указаны, все понятно.
     
  18. insolor

    insolor Нерд

    Код (Python):
                    sensor_id = int(buff[0] + (buff[1]<<8))
                    val1 = struct.unpack('f', buff[2:6])
                    val2 = struct.unpack('f', buff[6:10])
                    val3 = struct.unpack('f', buff[10:14])
                    val4 = struct.unpack('f', buff[14:18])
                    val5 = struct.unpack('I', buff[18:22])
                    val6 = struct.unpack('I', buff[22:26])
                    val7 = struct.unpack('s', buff[26:32])
    Можно короче написать:

    Код (Python):
    sensor_id, val1, val2, val3, val4, val5, val6, val7 = struct.unpack('HffffIIs', buff)
    Или:

    Код (Python):
    sensor_id, *val = struct.unpack('HffffIIs', buff)
    Тогда val будет списком от val[0] до val[6]
     
    nyptus и BreakFaster нравится это.
  19. 8toni8

    8toni8 Нуб

    Подскажите, есть ли варианты удаленно изменить прошивку ESP на MicroPython, или хотя бы изменение отдельных коэффициентов?
     
  20. Listian

    Listian Нуб

    webrepl?

    поигрался чуток с микропитон на esp32 lolin.
    боялся, что обратно на ардуино-ide будут проблемы вернуться, но оказалось, что ардуино-ide постоянно переписывает загрузчик.
    так что все чику-пуки.

    ппц он медленный.

    залил такой скрипт. https://github.com/micropython/micropython/wiki/Performance

    результаты странные.

    Там Teensy 3.1 с 96МГц под 100 лямов выдвет o,O

    У меня:

    Arduino Nano 16 МГц - 7 лямов.

    на esp32 на 80Мгц - 3 ляма, а на 240МГц - 8.6 лямов. почти линейно.

    а вот питон на 80Мгц - 200к, а на 240МГц всего 270к. нелинейно.

    и памяти остается всего 110к, а ардуино за 300к.

    язык после С-подобных, конечно ппц упоротый. скобок нет.

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

    вообщем, как-то так.

    Код (C++):
    #include <Arduino.h>
    void setup() {
        Serial.begin(115200);
        uint32_t endTime = millis() + 10000;
        uint32_t count = 0;
        while (millis() < endTime)
            count++;
        Serial.print("Count: ");
        Serial.println(count);
    }
    void loop() {
    }  

    Код (Python):
    import utime
    def performanceTest():

        endTime = utime.ticks_ms() + 10000
        count = 0
        while utime.ticks_ms() < endTime:
            count += 1
        print("Count: ", count)
    performanceTest()
     
    Последнее редактирование: 14 апр 2020