roboforum.ru

Технический форум по робототехнике.

Python на STM32

Re: Python на STM32

Flexz » 07 ноя 2011, 22:25

Он имел ввиду A7/A9
Ваш Кэп

Re: Python на STM32

EdGull » 08 ноя 2011, 10:43

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

Re: Python на STM32

Grem » 08 ноя 2011, 11:16

И как и чем собрать в *.hex.

Re: Python на STM32

dccharacter » 08 ноя 2011, 11:18

EdGull писал(а):кстати, т.к. я питона в глаза не видел, то можете показать как на нем будет выглядеть поморгать светодиодом?

Отличное сообщение от ТС :-) А все-таки, почему тогда python?

Re: Python на STM32

EdGull » 08 ноя 2011, 12:06

потому что...
EdGull писал(а):есть предположение что писать код на питоне будет простой и быстрый

Re: Python на STM32

svp » 08 ноя 2011, 13:56

EdGull писал(а):как на нем будет выглядеть поморгать светодиодом?

В самом тривиальном виде что-то вроде такого:
Код: Выделить всёРазвернуть
import stm32, time

while True:
    stm32.pin3.set(1)
    time.sleep(0.2)
    stm32.pin3.set(0)
    time.sleep(0.2)

Я ещё не разбирался как конкретно работает этот питон-на-чипе, но в hex программы, скорее всего, конвертировать не придётся. Программа на питоне может быть представлена в двух видах: текст и байткод. Полная аналогия с Java. Для большого компа не важно что запускать, байткод или текстовую прогу. Байткод из текста генерируется налету и кладётся рядом в соседнем файле. Возможно для экономии ресурсов контроллера подавать ему мы будем готовый байткод.
Прошивка контроллера будет осуществляться один раз. В него будет записан интерпретатор и, скорее всего, как-то будет настроен автозапуск питоновских файлов из какого-то источника. Например флашка, или внутренняя флеш-память.
Это чисто теоретически. Как устроен stm, сколько у него памяти, когда и как в неё можно писать я ещё не разбирался.
Зато можно пофантаззировать, как можно завернуть низкоуровневый код работы с контроллером в чудесный синтаксический сахар питона.
Код: Выделить всёРазвернуть
import time, stm32, robots, leds, motors, servo
# модуль для работы с параллельными потоками
import thread

# Описание нашего особенного робота. Он потомок обычного гусеничного.
class MyPrettyRobot(robots.TrackedBot):
    def __init__(self):
        # инициализация атрибутов предка
        super(robots.TrackedBot, self).__init__()
        # назначение моторам управляющих пинов на ШИМ и реверс
        self.left_motor.pwm_channel = stm32.pin1
        self.right_motor.pwm_channel = stm32.pin3
        self.left_motor.reverse_channel = stm32.pin2
        self.right_motor.reverse_channel = stm32.pin4
        self.power_led.channel = stm32.pin5
       
        # добавление нового шагового двигателя для поворота башни
        self.head_motor = motors.StepMotor(
            # сигналы на шаг против и по ч.с.
            lr_channel=(stm32.pin6, stm32.pin7),
            step_angle=360.0/100)

        # добавление какого-нибудь серво-мотора
        self.tail = servo.SimpleAB(
            angles=(-30, 30), # предельные углы
            pwm_channel=stm32.pin8, # канал управления
            pwm_delta=30, # период ШИМ, например в мс
            pwm_levels=(10, 90)) # скважности крайних положений

        # Цветные фары
        self.headlight = leds.RGB(
            channel=(stm32.pin9, stm32.pin10, stm32.pin11),
            pwm_delta=30)

        self.tail_swing_interval = 2.0 # интервал мотыляния хвостом 2с
        # поток для мотыляния хвостом
        self.swinging = thread.start_new(self.doSwing, (self,))

    def doSwing(self):
        while True:
            # назначаем хвосту угол в процентах, вычесленных от времени
            self.tail.asPercent = (
                (stm32.timer.s % self.tail_swing_interval) /
                self.tail_swing_interval * 2 - 1) * 50 + 50

            # если хвост в верхней своей точке +-5 градусов
            if -5 < self.tail.angle < 5:
                # плавно зажигаем фары пурпурным цветом
                self.headlight.color = leds.PURPLE
                self.headlight.brightness = (5-abs(self.tail.angle))*20
            else: # иначе гасим их
                self.headlight.brightness = 0
            # спим немножко
            time.sleep(self.tail_swing_interval/64)
               
Последний раз редактировалось Vooon 09 ноя 2011, 10:29, всего редактировалось 1 раз.
Причина: [code=python]

Re: Python на STM32

dccharacter » 08 ноя 2011, 14:03

Код: Выделить всёРазвернуть
while(1)
{
GPIO_SetBits(GPIOA,GPIO_Pin_9);
delayms(300000);
GPIO_ResetBits(GPIOA,GPIO_Pin_9);
delayms(300000);
}


А это на си :-)

Re: Python на STM32

svp » 08 ноя 2011, 14:14

Это чисто гипотетичесий код. Я не знаю какова будет обёртка, но всё что написано вполне правдоподобно. Например пины могут называться как-то иначе, но сами по себе в обёртке они могут являться объектами, знающими своё состояние, статус, назначение.
Очевидно, что со временем повится масса абстрактных объектов, вроде моторов, светодиодов, сервомоторов и шаговиков, которым в конструктор (инициализирующую функцию) будут передаваться все данные для их полноценной работы.
Во втоором примере мы сервомотору указали pin8 -- ножку на которую он подключен ибудет получать с неё ШИМ сигнал. Когда мы создали экземпляр серво-привода и указали ему пин, этот экземпляр, создаваясь, сам зарегистрировал таймер, сконфигорировал ногу на ШИМ, и организовал нужную скважность и всё такое. Естественно под всем этим зарыто много кода в модулях. Но этот код уже не придётся писать по многу раз.

Не знаю насколько это всё будет эффективно и управляемо. Наверно всё зависит от того, насколько будет продумана внутренняя инфраструктура, на которую навешивается весь этот сахар.

Добавлено спустя 38 секунд:
dccharacter писал(а):А это на си :-)

Круто=) А второй пример?=)

Добавлено спустя 4 минуты 33 секунды:
Вообще я не буду сейчас убеждать, что питон в контроллерах -- это хорошая идея. Я, честно сказать, не знаю. Кода от этого меньше не станет. Вернее его можно красиво и читабельно разделить на слои и абстракции, но насколько мощным окажется контроллер, чтобы прощать нам более высокоуровневый подход к управлению собой. Если в C мы использовали миллисекунды и моглиспуститься вплоть до указателей и тактов, то питон, при очень жестких ограничениях в памяти и скорости может оказаться слоном в посудной лавке на этом крохотном процессоре.

Re: Python на STM32

Strijar » 08 ноя 2011, 14:15

Python очень медленный. Из скриптовых быстрей чем Lua нет. Он и проще намного и мощней. Есть даже порт на ARM7 - eLua

Re: Python на STM32

svp » 08 ноя 2011, 14:22

Strijar писал(а):Он и проще намного и мощней.

Что вы подразумеваете под этой забавной фразой (насчет мощнее)?

Re: Python на STM32

dccharacter » 08 ноя 2011, 14:25

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

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

Re: Python на STM32

svp » 08 ноя 2011, 15:19

dccharacter писал(а):Ну на си же можно все то же самое сделать

Конечно! На любом Полном по Тюрингу языке можно сделать что угодно. Слышали про такой язык, как Brainfuck?

dccharacter писал(а):Пока не понимаю прикола. Может быть от того, что в принципе не знаю и не понимаю разные парадигмы программирования (о как сказал).

Точно. Дело в том, что со времён Си постепенно происходила своего рода эволюция языков программирования, концепций и подходов. Благодаря ей в современных языках программирования гораздо ниже порог входимости. Появились концепции, позволяющие работать со структурами данных, как с объектами реального мира.

dccharacter писал(а):Но имхо _меньше_ изучить - не получится
_проще_ не выйдет

В том-то и дело, что если с нуля, то выйдет и проще и меньше. А если ломать старые догматы... Питон -- это язык с очень высокой интроспекцией.
Даже если программист не знает, что за объект он получил и что с ним можно сделать, у него есть в распоряжении система автодокументации, встроенная на уровне языка. Достаточно написать help(любой_объект) и напечатается подробное описание класса и всех методов с указанием какие нужны оргументы и для чего.

dccharacter писал(а):Ты вот там объектики всякие и т.д. делаешь. Но что мешает на си в функцию передать указатель на структуру? Все то же самое получится...

Ну и какой код получается более читабельным м понимабельным? Да, в сущности указатель на структуру и отдельная функция -- это тот же объект, но "по отдельности".
До процедурного стиля был ассемблер, а ещё раньше первокарты с машинными кодами. И на них тоже можно было программировать. И суть та же. Просто не так читабельно. Это вопрос низкого/высокого уровня. На ассемблере тоже писали очень крутые программы. А на современных ассемблерах можно вполне себе полноценное десктопное приложение с окнами и графикой написать. Тем не менее народ переезжает на уровни повыше.

Добавлено спустя 25 минут 37 секунд:
Тут же ещё вон какое дело. Перейдя с ассемблера на Си в контроллерах мы повысили уровень (читабельность, писабельность, разбирабельность), а вместе с тем немного понизили наш контроль ситуации в коде (теперь мы не сами решаем, где и как в памяти хранятся константы, в какие регистры попадают значения). Так и с переходом на питон.
Если питон на какой-нибудь атмеловской восьмибитке с клочком памяти -- это форменный слон в посудном киоске (ни пошевелиться, ни встать, но в принципе дышать можно). Си в этом случае -- это толстая продавщица. А ассемблер м-м-м... тощий таджык? Грациозная фея?=). Что-то я увлёкся аналогиями. Но теперь уж отступать поздно.
На контроллере рангом поввыше (магазин!) толстая продавщица (Си) чувствует себя отлично, а слон по-прежнему громит всё. В торговом центре, в принципе, слон особых разрушений уже не принесёт.
Эти примеры ничего не говорят о полезных качествах слона или продавщицы. Разве что если провести аналогию с грузоподъёмностью? Чем больше строк кода, тем тяжелее его держать на языке низкого уровня. При п риближении некоторого порогового значения программист просто теряет контроль над своим кодом. Не может запомнить как и что устроено из-за малого уровня абстрации. Конечно качество кода тут тоже сказывается. Качественного кода можно уложить до порога немного больше. Языки высокого кровня поднимают этот самый порог на порядки.

Re: Python на STM32

EdGull » 08 ноя 2011, 15:23

а тем более, если написанное SVP наложить на большое количество программеров участвующих в разработке, то в нашем случае Си это хорошо, а Питон лучше...

Re: Python на STM32

dccharacter » 08 ноя 2011, 15:30

Тут еще один моментик есть. Продавщица в наличии уже имеется, а за слоном далеко ехать придется :-)

Re: Python на STM32

Grem » 08 ноя 2011, 15:31

dccharacter писал(а):Пока не понимаю прикола.
Но имхо _меньше_ изучить - не получится
_проще_ не выйдет

Cам не вижу смысла, поэтому запасся попкорном :)
Благодаря ей в современных языках программирования гораздо ниже порог входимости

Это и не есть хорошо.
Товарищ svp не просто теоретик, он идеалист-теоретик и я не удивлюсь если он свой ИИ пишет :)


cron
Rambler\'s Top100 Mail.ru counter