RSS блога
Подписка
Плата микроконтроллера Raspberry Pi Pico — Arduino на стероидах
- Цена: €4,13 плюс доставка €0,61
- Перейти в магазин
Во времена моей молодости говорили — легко, как два байта переслать. Другие — чуть по-другому — легко, как два пальца об асфальт, подразумевая под этим нечто третье.
Не так давно Raspberry Pi Foundation выкатил собственный микроконтроллер, за рекордно низкую по нынешним временам цену для устройства с такими параметрами — сама микросхема стоит 1 доллар. Сейчас мы будем разбираться, легко ли в этом микроконтроллере два байта переслать.
Настоящие специалисты, которые в комментариях уже не раз меня называли ардуинщиком-недоучкой, в этом опусе вряд ли найдут что-то полезное, а остальные — добро пожаловать.
В началебыло слово была платка от Raspberry на базе этого микроконтроллера под названием Raspberry Pi Pico, на котором были только сам микроконтроллер, 2 мегабайта флеш-памяти, светодиод, кварц, микро USB разъем и кнопка перехода в режим загрузки. И все это с объявленной ценой без налогов и пересылки в 4 USD.
Потом поперло — таких платок разного вида просто понесло потоком — и уменьшенных размеров, и с кучей разной периферии. Очевидно, очень скоро этот микроконтроллер заинтересовал ардуинщиков и его поддержка была включена в длинный список поддерживаемых микроконтроллеров.
Теперь лирическое отступление.
Для начала, что за мелкоконтроллер на платке?
Обозвали его RP2040, что по мнению Raspberry Pi Foundation, обозначает:
Что мы имеем внурях:
Откуда надерганы IP (Intellectual property — так в мире проектирования микросхем так называют готовые блоки-библиотеки)
С таймерами, на первый взгляд, большая напряженка — единственный таймер общего назначения с очень маленьким набором функций. Впридачу к нему имеются WDT и RTC.
Но это только на первый взгляд — 16 PWM, собственные таймеры у контроллера DMA и программируемые машины состояний меняют дело кардинально.
Микропроцессор, на самом деле, очень необычен именно в плане периферии. Главная фишка — это блоки программируемого ввода вывода, PIO, каждый из которых содержит 4 машины состояний 8 32-разрядных FIFO регистров, память программ. Каждый из таких блоков программируется на собственном ассемблере. С помощью PIO вы можете добавить недостающий интерфейс или сделать совершенно новый — например, аппаратный интерфейс для WS8212 или что вам в голову придет.
Меня терзают смутные сомнения, что часть аппаратных интерфейсов этого микропроцессора именно так и сделаны — абсолютно такие же PIO, только вместо памяти программ с возможностью записи, там применена масочная память. Или OTP, которая позволяет менять конфигурацию микропроцессора уже на существующем кремнии.
При таком подходе разработка сильно упрощается. И я подозреваю, что, в основном, все было разработано одним человеком в течении примерно года.
Товарищ Сталин говорил — «У каждой ошибки есть имя и фамилия»
Речь не об ошибке, но тем не менее фамилия быть должна. К сожалению, не нашел. Но, скорее всего, зовут его Graham. И проектировал он на Verilog. У меня есть один знакомый — бывший коллега, который такую вещь вполне мог бы спроектировать за несколько месяцев, но это явно не он.
Небольшую статейку от человека, который вертелся рядом с разработчиком, можно найти здесь.
Он пишет, что проектирование начали в середине 2017 года. Процессор поступил в продажу в начале 2021 года. Год-полтора, наверно, ушло на запуск производства и тестирование. Значит, на проектирование ушло еще полтора-два года. Если, конечно, кремний пошел с первой попытки.
Если кому интересно, можно посмотреть картину по слоям, как делают транзистор
Вы все поняли и решили, что вы будете первым, кто сделает микросхему на кухне? К сожаление, вы опоздали, такой деятель уже нашелся, вы будете не первым :)
Но еще можете свой процессор слепить, вот RP2040. Как видите, все очень просто, большую часть площади занимает RAM.
Здесь можно посмотреть картинку получше.
По словам руководства Raspberry Pi, выход годных микроконтроллеров с пластины около 20 000 штук. Пластина по 40-нм технологии в TSMC стоит около 2300 долларов. Партия, очевидно, не одна штука.
Можете считать барыши :) Но не забудьте прибавить стоимость тестирования, резки, корпусирования. А еще за подготовку к производству надо заплатить и разработчики тоже кушать хотят.
Ну ладно, с присказкой закончим.
При первом включении плата распознается, как USB диск, для того, чтобы запустить свою программу, достаточно скомпилированный файл в формате uf2 закинуть на этот диск, выполнение начнется немедленно.
При последующих включениях будет запущена именно эта программа. Чтобы загрузить новую программу, нужно перейти в режим загрузки снова, для этого нужно отключить плату от USB, зажать кнопку BOOTSEL, подключить платку к USB и затем отпустить кнопку. Процедура нудная, и разъем недолго продюжит, если вы отлаживаете свою программу.
На этом сайте вы найдете программу, которая приводит все в привычное для ардуино представление — достаточно загрузить программу один раз. После этого среда ардуино уже будет компилировать вашу программу в в формате uf2, загрузчик будет переводить плату в режим mass storage device и закидывать ваш файл на образовавшуюся флешку. Ваша программа сразу получит управление — никаких лишних телодвижений, все очень привычно.
Мне удавалось несколько раз убить загрузчик — но ничего страшного, опять переходим в режим загрузки и закидываем файл и продолжаем, как ни в чем не бывало.
Если что-то сильно накосячили и ничего и никак не работает (но BOOTSEL работает) — нужно загрузить файл flash_nuke.uf2 который вычистит флеш и вернет все в первоначальное состояние. SWD мы не будем обсуждать во избежания лишнего усложнения.
Я не ортодоксальный ардуинщик, поэтому предпочитаю использовать PlatformIO. Если честно, я никогда не использовал Arduino IDE для разработки своих программ, только загрузить что-то готовое. Кто пытался написать что-то более-менее сложное в Arduino IDE понимает, что это разновидность мазохизма. Хотя версия IDE 2.х выглядит уже гораздо лучше и похоже на настоящий редактор. Даже отладку позволяет — конечно, для тех контроллеров, где это предусмотрено.
Платка получена, подпаиваем к ней гребенку выводов и кнопку аппаратного сброса — ну что эта за адруина и чтобы без кнопки сброса?
Для начала просто их примеров загружаем blink — светодиод на плате мигает. Удивительно, но факт.
Теперь бы пару байтов на выход переслать. И вот тут — засада. У большинства процессоров — это самая простая операция, что можно придумать. А тут управление заточено на управления битами. Каждый бит обслуживается 2 регистрами по 32 бита. 64 бита на одну ножку, Карл! И это еще далеко не все, прерывания — это отдельная песня, в итоге — читать документацию вспотеешь. Если еще учесть, что она сырая и что-то понять и найти концы очень сложно.
В итоге все-таки находится регистр, который можно зацепить к выводам и переслать нашу пару байтов.
Но выглядит это так:
sio_hw->gpio_togl — это не регистр вывод, а исключающее или, полезная штука.
Все, кушать подано, садитесь жрать, пожалуйста.
А теперь бы все это сделать побыстрее — выбросить из памяти прямо на выход, используя прямой доступ в память. Надо с DMA разбираться, однако. Для начала упрощенный вариант — из памяти в память.
Разобраться с регистрами позднее будем, а пока вызываем функции богомерзких библиотек
Все работает и копируется. Дело за малым — в качестве места, куда данные копируются, нужно определить, как регистр sio_hw→gpio_out
Ну, размечтался! А накусь выкусь!
Оказывается, в этот регистр DMA просто не умеет писать!
А что делать? Raspberry рекомендует написать программку буквально из одной строчки для программируемого ввода-вывода, писать свои данные в него, а так программа уже все сама передаст на выход.
— Спасибо, красивое ©.
Встроенной в ардуино поддержки ассемблера пока нет (для Python — есть). Но есть исходный код ассемблера с SDK
Чай не баре — берите, компилируйте и пользуйтесь на доброе здоровье.
Для совсем ленивых — нашелся добрый человек, сделал онлайн компилятор.
Начнем разбираться — собственно, на этом я собираюсь и закончить с обзором программного обеспечения. Пример выдран отсюда, все лишнее выброшено, осталась только суть
Итак, пишем (только не спрашивайте, что это значит) :)
Это наш ws8212_single.pio файл, этот текст просто в левую часть онлайн компилятора вставить надо
ws8212_single.pio
То, что появится в правой части, нужно скопировать и вставить в свой файл ws2812.pio.h в ту же папку, где исходник теста
ws2812.pio.h
И сам тест остался
Ну и любуемся на картинку — можно подключать адресуемые светодиоды.
Как заключение: если вам достаточно обычного ардуино и не возникает желания делать чего-то более сложного, то Raspberry Pi Pico можно использовать прямо сейчас.
Если хочется странного — то лучше пока воздержаться, пока документация будет доведена до кондиции и примеров на все случаи жизни будет больше.
А продавец — молодец, как в Али в комментариях обычно пишут.
Но если честно — посылка из Китая еще не дошла, через несколько дней, после того, как я заказал платку на Али, я разместил заказ еще в одном магазине, и через несколько дней он уже у меня был. Ну очень любопытно было, а ждать не хотелось.
И не стесняйтесь ставить минусы, если вам кажется, что обзор не нужен. Стереть его можно значительно быстрее, чем написать :)
Не так давно Raspberry Pi Foundation выкатил собственный микроконтроллер, за рекордно низкую по нынешним временам цену для устройства с такими параметрами — сама микросхема стоит 1 доллар. Сейчас мы будем разбираться, легко ли в этом микроконтроллере два байта переслать.
Настоящие специалисты, которые в комментариях уже не раз меня называли ардуинщиком-недоучкой, в этом опусе вряд ли найдут что-то полезное, а остальные — добро пожаловать.
В начале
Потом поперло — таких платок разного вида просто понесло потоком — и уменьшенных размеров, и с кучей разной периферии. Очевидно, очень скоро этот микроконтроллер заинтересовал ардуинщиков и его поддержка была включена в длинный список поддерживаемых микроконтроллеров.
Теперь лирическое отступление.
Для начала, что за мелкоконтроллер на платке?
Обозвали его RP2040, что по мнению Raspberry Pi Foundation, обозначает:
- RP: Raspberry Pi
- 2: два ядра
- 0: ядра M0+
- 4: минимум 256 КБ памяти
- 0: нет встроенной флеш-памяти
Что мы имеем внурях:
- Два ядра Arm Cortex-M0+ @ 133 МГц
- 264 КБ памяти RAM (на самом деле 284 КБ, но часть используется для кеширования и USB)
- Поддержка до 16МБ внешней флеш-памяти с QSPI интерфейсом, реально на платке запаяно 2МБ
- DMA контроллер
- 4 x 12-разрядных аналоговых входа (на Pico доступно для пользователя 3 из них)
- 2 × UART
- 2 × SPI
- 2 × I2C
- 16 × PWM каналов
- Встроенный сенсор температуры
- Всего 30 GPIO пинов
- USB 1.1 контроллер с поддержкой хоста
- 2 × PIO блока для своих собственных интерфейсов
- 2 x PLL (один для USB, второй для остального)
- Поддержка UF2 для загрузки программ
- Поддержка SWD для загрузки и отладки
- Поддержка спящих режимов и пониженной частоты для снижения потребления
Откуда надерганы IP (Intellectual property — так в мире проектирования микросхем так называют готовые блоки-библиотеки)
- ARM Limited (M0+, UART, SPI)
- Synopsys, Inc. (I2C, SSI)
- Taiwan Semiconductor Manufacturing Company Limited (TSMC) (standard cells, memories)
- Dolphin Design SAS (Voltage Regulator, Power-on Reset/Brown-out Detector)
- Aragio Solutions (GPIO and Crystal Pad library)
- Silicon Creations (PLL)
- GF Micro (ADC, TS, USB PHY)
С таймерами, на первый взгляд, большая напряженка — единственный таймер общего назначения с очень маленьким набором функций. Впридачу к нему имеются WDT и RTC.
Но это только на первый взгляд — 16 PWM, собственные таймеры у контроллера DMA и программируемые машины состояний меняют дело кардинально.
Микропроцессор, на самом деле, очень необычен именно в плане периферии. Главная фишка — это блоки программируемого ввода вывода, PIO, каждый из которых содержит 4 машины состояний 8 32-разрядных FIFO регистров, память программ. Каждый из таких блоков программируется на собственном ассемблере. С помощью PIO вы можете добавить недостающий интерфейс или сделать совершенно новый — например, аппаратный интерфейс для WS8212 или что вам в голову придет.
Меня терзают смутные сомнения, что часть аппаратных интерфейсов этого микропроцессора именно так и сделаны — абсолютно такие же PIO, только вместо памяти программ с возможностью записи, там применена масочная память. Или OTP, которая позволяет менять конфигурацию микропроцессора уже на существующем кремнии.
При таком подходе разработка сильно упрощается. И я подозреваю, что, в основном, все было разработано одним человеком в течении примерно года.
Товарищ Сталин говорил — «У каждой ошибки есть имя и фамилия»
Речь не об ошибке, но тем не менее фамилия быть должна. К сожалению, не нашел. Но, скорее всего, зовут его Graham. И проектировал он на Verilog. У меня есть один знакомый — бывший коллега, который такую вещь вполне мог бы спроектировать за несколько месяцев, но это явно не он.
Небольшую статейку от человека, который вертелся рядом с разработчиком, можно найти здесь.
Он пишет, что проектирование начали в середине 2017 года. Процессор поступил в продажу в начале 2021 года. Год-полтора, наверно, ушло на запуск производства и тестирование. Значит, на проектирование ушло еще полтора-два года. Если, конечно, кремний пошел с первой попытки.
Если кому интересно, можно посмотреть картину по слоям, как делают транзистор
Вы все поняли и решили, что вы будете первым, кто сделает микросхему на кухне? К сожаление, вы опоздали, такой деятель уже нашелся, вы будете не первым :)
Но еще можете свой процессор слепить, вот RP2040. Как видите, все очень просто, большую часть площади занимает RAM.
Здесь можно посмотреть картинку получше.
По словам руководства Raspberry Pi, выход годных микроконтроллеров с пластины около 20 000 штук. Пластина по 40-нм технологии в TSMC стоит около 2300 долларов. Партия, очевидно, не одна штука.
Можете считать барыши :) Но не забудьте прибавить стоимость тестирования, резки, корпусирования. А еще за подготовку к производству надо заплатить и разработчики тоже кушать хотят.
Ну ладно, с присказкой закончим.
При первом включении плата распознается, как USB диск, для того, чтобы запустить свою программу, достаточно скомпилированный файл в формате uf2 закинуть на этот диск, выполнение начнется немедленно.
При последующих включениях будет запущена именно эта программа. Чтобы загрузить новую программу, нужно перейти в режим загрузки снова, для этого нужно отключить плату от USB, зажать кнопку BOOTSEL, подключить платку к USB и затем отпустить кнопку. Процедура нудная, и разъем недолго продюжит, если вы отлаживаете свою программу.
На этом сайте вы найдете программу, которая приводит все в привычное для ардуино представление — достаточно загрузить программу один раз. После этого среда ардуино уже будет компилировать вашу программу в в формате uf2, загрузчик будет переводить плату в режим mass storage device и закидывать ваш файл на образовавшуюся флешку. Ваша программа сразу получит управление — никаких лишних телодвижений, все очень привычно.
Мне удавалось несколько раз убить загрузчик — но ничего страшного, опять переходим в режим загрузки и закидываем файл и продолжаем, как ни в чем не бывало.
Если что-то сильно накосячили и ничего и никак не работает (но BOOTSEL работает) — нужно загрузить файл flash_nuke.uf2 который вычистит флеш и вернет все в первоначальное состояние. SWD мы не будем обсуждать во избежания лишнего усложнения.
Я не ортодоксальный ардуинщик, поэтому предпочитаю использовать PlatformIO. Если честно, я никогда не использовал Arduino IDE для разработки своих программ, только загрузить что-то готовое. Кто пытался написать что-то более-менее сложное в Arduino IDE понимает, что это разновидность мазохизма. Хотя версия IDE 2.х выглядит уже гораздо лучше и похоже на настоящий редактор. Даже отладку позволяет — конечно, для тех контроллеров, где это предусмотрено.
Платка получена, подпаиваем к ней гребенку выводов и кнопку аппаратного сброса — ну что эта за адруина и чтобы без кнопки сброса?
Для начала просто их примеров загружаем blink — светодиод на плате мигает. Удивительно, но факт.
Теперь бы пару байтов на выход переслать. И вот тут — засада. У большинства процессоров — это самая простая операция, что можно придумать. А тут управление заточено на управления битами. Каждый бит обслуживается 2 регистрами по 32 бита. 64 бита на одну ножку, Карл! И это еще далеко не все, прерывания — это отдельная песня, в итоге — читать документацию вспотеешь. Если еще учесть, что она сырая и что-то понять и найти концы очень сложно.
В итоге все-таки находится регистр, который можно зацепить к выводам и переслать нашу пару байтов.
Но выглядит это так:
Код
void setup()
{
for (uint8_t pin = 0; pin < 16; pin++)
{
uint32_t *PIN_CTRL_REG = (uint32_t*)IO_BANK0_BASE + pin * 2 + 1;
*PIN_CTRL_REG = 5; // 5 = SIO function
}
sio_hw->gpio_oe = 0xFFFF;
sio_hw->gpio_out = 0x05555;
}
void loop()
{
sleep_us(1);
sio_hw->gpio_togl = 0xFFFF;
}
sio_hw->gpio_togl — это не регистр вывод, а исключающее или, полезная штука.
Все, кушать подано, садитесь жрать, пожалуйста.
А теперь бы все это сделать побыстрее — выбросить из памяти прямо на выход, используя прямой доступ в память. Надо с DMA разбираться, однако. Для начала упрощенный вариант — из памяти в память.
Разобраться с регистрами позднее будем, а пока вызываем функции богомерзких библиотек
Код
#include <Arduino.h>
#include "hardware/dma.h"
#define LED_BUILTIN 25
const char src[] = "Hello, world! (from DMA)";
char dst[count_of(src)];
void hello_dma(void)
{
// Get a free channel, panic() if there are none
int chan = dma_claim_unused_channel(true);
dma_channel_config c = dma_channel_get_default_config(chan);
channel_config_set_transfer_data_size(&c, DMA_SIZE_8);
channel_config_set_read_increment(&c, true);
channel_config_set_write_increment(&c, true);
dma_channel_configure(
chan, // Channel to be configured
&c, // The configuration we just created
dst, // The initial write address
src, // The initial read address
count_of(src), // Number of transfers; in this case each is 1 byte.
true // Start immediately.
);
}
void setup()
{
Serial.begin(115200);
while (!Serial);
pinMode(LED_BUILTIN, OUTPUT);
hello_dma();
dma_channel_wait_for_finish_blocking(chan);
Serial.print(src);
Serial.print(" -> ");
Serial.println(dst);
}
void loop()
{
digitalWrite(LED_BUILTIN, HIGH);
delay(500);
digitalWrite(LED_BUILTIN, LOW);
delay(500);
}
Все работает и копируется. Дело за малым — в качестве места, куда данные копируются, нужно определить, как регистр sio_hw→gpio_out
Ну, размечтался! А накусь выкусь!
Оказывается, в этот регистр DMA просто не умеет писать!
А что делать? Raspberry рекомендует написать программку буквально из одной строчки для программируемого ввода-вывода, писать свои данные в него, а так программа уже все сама передаст на выход.
The CortexM0+ SIO address space is not accessible from the bus matrix and thus you can't DMA to it.Вот это номер, особенно учитывая, что разобраться с программированием этого ввода-вывода не так просто — документация не самая лучшая. К одном месте кто-то обращался в поддержке — дескать, в вашей документации заявлена поддержка последовательных интерфейсов. А пример можно? Ответ был каким-то не очень дружелюбным — отойди, мальчик, не мешай работать. Как руки дойдут — так и сделаем.
If you want to DMA to the pins, then make a one line PIO program that outputs data to the pins, and DMA to the PIO SM.
— Спасибо, красивое ©.
Встроенной в ардуино поддержки ассемблера пока нет (для Python — есть). Но есть исходный код ассемблера с SDK
Чай не баре — берите, компилируйте и пользуйтесь на доброе здоровье.
Для совсем ленивых — нашелся добрый человек, сделал онлайн компилятор.
Начнем разбираться — собственно, на этом я собираюсь и закончить с обзором программного обеспечения. Пример выдран отсюда, все лишнее выброшено, осталась только суть
Итак, пишем (только не спрашивайте, что это значит) :)
Это наш ws8212_single.pio файл, этот текст просто в левую часть онлайн компилятора вставить надо
ws8212_single.pio
Код
.program ws2812
.side_set 1
.define public T1 2
.define public T2 5
.define public T3 3
.lang_opt python sideset_init = pico.PIO.OUT_HIGH
.lang_opt python out_init = pico.PIO.OUT_HIGH
.lang_opt python out_shiftdir = 1
.wrap_target
bitloop:
out x, 1 side 0 [T3 - 1] ; Side-set still takes place when instruction stalls
jmp !x do_zero side 1 [T1 - 1] ; Branch on the bit we shifted out. Positive pulse
do_one:
jmp bitloop side 1 [T2 - 1] ; Continue driving high, for a long pulse
do_zero:
nop side 0 [T2 - 1] ; Or drive low, for a short pulse
.wrap
% c-sdk {
#include "hardware/clocks.h"
static inline void ws2812_program_init(PIO pio, uint sm, uint offset, uint pin, float freq, bool rgbw) {
pio_gpio_init(pio, pin);
pio_sm_set_consecutive_pindirs(pio, sm, pin, 1, true);
pio_sm_config c = ws2812_program_get_default_config(offset);
sm_config_set_sideset_pins(&c, pin);
sm_config_set_out_shift(&c, false, true, rgbw ? 32 : 24);
sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_TX);
int cycles_per_bit = ws2812_T1 + ws2812_T2 + ws2812_T3;
float div = clock_get_hz(clk_sys) / (freq * cycles_per_bit);
sm_config_set_clkdiv(&c, div);
pio_sm_init(pio, sm, offset, &c);
pio_sm_set_enabled(pio, sm, true);
}
%}
То, что появится в правой части, нужно скопировать и вставить в свой файл ws2812.pio.h в ту же папку, где исходник теста
ws2812.pio.h
Код
// -------------------------------------------------- //
// This file is autogenerated by pioasm; do not edit! //
// -------------------------------------------------- //
#pragma once
#if !PICO_NO_HARDWARE
#include "hardware/pio.h"
#endif
// ------ //
// ws2812 //
// ------ //
#define ws2812_wrap_target 0
#define ws2812_wrap 3
#define ws2812_T1 2
#define ws2812_T2 5
#define ws2812_T3 3
static const uint16_t ws2812_program_instructions[] = {
// .wrap_target
0x6221, // 0: out x, 1 side 0 [2]
0x1123, // 1: jmp !x, 3 side 1 [1]
0x1400, // 2: jmp 0 side 1 [4]
0xa442, // 3: nop side 0 [4]
// .wrap
};
#if !PICO_NO_HARDWARE
static const struct pio_program ws2812_program = {
.instructions = ws2812_program_instructions,
.length = 4,
.origin = -1,
};
static inline pio_sm_config ws2812_program_get_default_config(uint offset) {
pio_sm_config c = pio_get_default_sm_config();
sm_config_set_wrap(&c, offset + ws2812_wrap_target, offset + ws2812_wrap);
sm_config_set_sideset(&c, 1, false, false);
return c;
}
#include "hardware/clocks.h"
static inline void ws2812_program_init(PIO pio, uint sm, uint offset, uint pin, float freq, bool rgbw) {
pio_gpio_init(pio, pin);
pio_sm_set_consecutive_pindirs(pio, sm, pin, 1, true);
pio_sm_config c = ws2812_program_get_default_config(offset);
sm_config_set_sideset_pins(&c, pin);
sm_config_set_out_shift(&c, false, true, rgbw ? 32 : 24);
sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_TX);
int cycles_per_bit = ws2812_T1 + ws2812_T2 + ws2812_T3;
float div = clock_get_hz(clk_sys) / (freq * cycles_per_bit);
sm_config_set_clkdiv(&c, div);
pio_sm_init(pio, sm, offset, &c);
pio_sm_set_enabled(pio, sm, true);
}
#endif
И сам тест остался
Код
#include "ws2812.pio.h"
#define WS2812_PIN 0
#define IS_RGBW false
static inline void put_pixel(uint32_t pixel_grb)
{
pio_sm_put_blocking(pio0, 0, pixel_grb << 8u);
}
void setup()
{
PIO pio = pio0;
int sm = 0;
uint offset = pio_add_program(pio, &ws2812_program);
ws2812_program_init(pio, sm, offset, WS2812_PIN, 800000, IS_RGBW);
}
void loop()
{
//for (uint i = 0; i < 3; ++i)
put_pixel(0xff00AA);
sleep_ms(10);
}
Ну и любуемся на картинку — можно подключать адресуемые светодиоды.
Как заключение: если вам достаточно обычного ардуино и не возникает желания делать чего-то более сложного, то Raspberry Pi Pico можно использовать прямо сейчас.
Если хочется странного — то лучше пока воздержаться, пока документация будет доведена до кондиции и примеров на все случаи жизни будет больше.
А продавец — молодец, как в Али в комментариях обычно пишут.
Но если честно — посылка из Китая еще не дошла, через несколько дней, после того, как я заказал платку на Али, я разместил заказ еще в одном магазине, и через несколько дней он уже у меня был. Ну очень любопытно было, а ждать не хотелось.
И не стесняйтесь ставить минусы, если вам кажется, что обзор не нужен. Стереть его можно значительно быстрее, чем написать :)
Самые обсуждаемые обзоры
+68 |
3230
133
|
+50 |
3479
65
|
+28 |
2433
43
|
+37 |
2716
38
|
+55 |
1993
37
|
А если на самом деле… Сейчас полно микроконтроллеров (и плат с ними) с гораздо более интересной «начинкой» и меньшей ценой. И если отойти от «экосистемы» Arduino, то выбор немал.
А так… 60% купивших зальют готовый «скетч» и помигают диодиком, 5% сделают гирлянду к НГ, остальные… Кинут в ящик к другим покупкам с али и забудут. :)
Того что на той плате улучшенный и доработанный
stmgigadeviceМоя простая потребительская логика — производители полупроводников сейчас получают колоссальные прибыли, зачем им снижать цены до уровня 2019 года? Китайцы и американцы вроде активно взялись за постройку заводов, но: а) это явно не в 2023 будет сделано б) даже когда построят, зачем им снижать цены до уровня 2019 года?
Т.е. цены конечно могут поползти вниз. неспешно. Но еще очень нескоро. Для этого рынок должен насытиться. Что дело не одного года.
Просто так цены не падают. Зачем продавать дешево если дорого все равно покупают?
Просто один товар заменяется другим, при этом на старый цены не падают, а тоже растут. Оно и понятно — нет массовости, изделие переходит в разряд штучных.
Пример из другой сферы: автомобили сейчас стали доступнее, чем в 90х, но это другие автомобили. Да, они круче по всем параметрам и одновременно дешевле, но старые авто так никогда и не дешевели.
Конечно флуктуации цены ± есть, из-за рынка, конкуренции, курсов и так далее. Но глобально итоговый СЛОЖНЫЙ товар никогда не дешевеет.
Когда Z80 вышел в 70х, он стоил $39.95.
worldradiohistory.com/Archive-Radio-Electronics/70s/1977/Radio-Electronics-1977-12.pdf#page=86
В любом случае дороже современных.
… и на массу промышленного оборудования тех лет, где он мог использоваться. Но там вопрос цены не стоит.
Я не конкретно про Z80, а в принципе. Не надо думать, что народ только балуется с этими изделиями.
Возможно, часть этого оборудования используется до сих пор и его надо ремонтировать. Отсюда есть потребность в новых Z80.
тов. О.Бендером!!-артели по их выпуску превратились в концерны, а вот цены…
;-))
Разве что их из серебра и золота стали делать из нержавейки.
Поставить приставку — тогда да.
Лучше пару светофоров по бокам.
Эдакие диайвайщики-потребители.
И уж точно никакой BluePill в продакшин не засуну никогда.
В продакшине печь.
Так что не надо писать «с ценой в доллар».
На предлагаемом самим Raspberry магазине cytron rp2040 стоит 1.05$ при единичном заказе и в наличии более 500 штук
Нет, конечно не думаю. Но зная архитектуру это не проблема.
Интересно только то, что было сделано позже (хотя бы тот-же F0).
… и вот только тогда приходит осознание, что простые вещи по чужим чертежам делать скучно, а свои и сложные — сложно.
Раз нет WiFI, он конкурент НЕ для ESP, а для STM32.
По сравнении с STM32 не вижу ни одного плюса.
RP2040 слишком много жрёт во сне, где-то в 100-1000раз большем, чем STM32.
То есть, для больших задач он слишком мелкий, а для мелких слишком прожорливый.
вот зачем?
даже если он кривой — он нужен для получения информации о товаре и его всегда можно улучшить.
Гоголь был неправ! (наверное, хз..)
))
Но вот микроконтроллера, чтобы имел сравнимое потребление, сравнимую производительность и память до сих пор нет.
дыркиотверстия сделать под кнопки и светодиод.Потом, таки, купили фен вместо ИК паяльной станции и сей изврат перестал быть нужным. ))
имхо только сейчас коллективный разум и гугл сделали программирование на ESP8266 не сложным — задаешь любой вопрос и тут же ответ на первой станице поиска. Для этого энтузиастам и espressif понадобилось всего 9 лет. Не думаю, что Raspberry Pi Pico будет быстрее, учитывая ее цену и отсутствие wifi, bt etc.
пы.сы. у китайцев недавно появилась новая зверюшка — W806 Microcontroller 240MHZ
И про стирание лишних бутлоадеров можно почитать тут: ссылка (первым методом не получилось, третий не пробовал, второй работает 100%)
— миниатюрное устройство с полноценным Ethernet, сейчас для меня это WT32-ETH01, но хотелось бы по компактнее, или такого же размера, но с PoE.
— озу по больше, чтоб говнокодить по хлеще можно было.
— встроенный RTC, прям чтоб всё компактно, только батарейка снаружи.
Ну и ещё бы отдельную железку для ZigBee, чтоб от батарейного питания, чтоб также легко кодить как в ардуино.иде, для конструирования собственных кнопок/выключателей.
Но… Цена, конечно, не 250 руб. И если брать «обвязку» — он уже не такой и маленький (именно из-за Ethernet).
HLK-RM04 хватает на ali. Да и у меня валяется парочка.
Имея в виду устройство с Ethernet я подразумевал программируемое в ардуино иде устройство размером не больше чем сам разъём изернет.
В делах автоматики и диспетчеризации я жуть как не люблю беспроводную связь. Раньше для коммуникации баловался всякими собственными велосипедами, какое-то время мутил на rs485, пробовал связь на on ware… Но теперь надоела вся эта ересь, полюбилось делать всё на Ethernet и гонять там web и mqtt по TCP IP. Сейчас такая концепция у меня в голове. И устройства стремлюсь делать перенастраиваемые через web, а не как раньше, чтоб сменить что-то, например IP, надо было перезаливать прошивку.
Беспроводные сети имеют плюс, что они гальванически развязаны. RS485 может выжечь и порты и дорогостоящее оборудование при ударе молнии рядом. На оптику тогда уже лучше переходить.
Ну раз плюс назвали, то принято и минусы называть.
Ну во-первых, при ударе молнии «рядом» и без rs485/323/Ethernet у вас всё выгорит. Хотя бы входные цепи приёмных устройств.
Во-вторых, от этого тоже есть гальванически развязанные rs485 и 232, и стоят они не более $5.
В-третьих, какое дорогостоящее оборудование? Свитч на 100 мегабит за 380 рублей? Или сгорит само сердце — wt32-eth01 за 800р? Да, потеря потерь, надо вложить в 100 раз больше и перейти на оптику, действительно…
Да. Поржал. Это новый уровень, ардуино, ESP8266, esp32, WT32-ETH01, и ОПТИКА, мать её…
Осталось только конвертеры для дуинок сделать uart to оптика, пигтейлов закупить, ну и сварочник, чё уж там…
Свитчи кстати тоже разные бывают- как длинки за 400 р на 5 портов, так и кошки на 48 портов с POE портами за пару килобаксов:)))
infiber.ru/biblioteka/stati/pof.html
Сварочник не обязателен, кабель взять с запасом или вызвать специалиста, компаний что варят оптоволокно сотни в любом городе.
А по сварке- для малых расстояний вообще или просто готовые патч-корды оптические с приваренными на заводе разъемами, либо оптоволокно плюс «быстрые» бесклеевые разъемы и скалыватель (они в принципе есть уже и китайские за пару тысяч) и все. А, ну и стриппер для снятия внешней оболочки с волокна- еще плюс тысяча. Либо заместо разъемов соединители и пигтейлы, плюс опять же скалыватель и стриппер (хотя в соединителях насколько знаю есть гель с таким же коэффициентом преломления, как у волокна, поэтому даже скалыватель необязателен, но все-же крайне желателен).
10 лет назад ничего в таких размерах с Linux, Ethernet и GPIO было не найти.
научиться готовить яичницудергать пинами, поваром становиться не собираюсь.Ну во-первых 10 лет назад для любителей линукс уже был народный mr3020 и его младшая семисотая модель, которая была вообще в каждом магазине торгующим электроникой, и он был меньше, он был с изернет, он был с WiFi, он был с USB, и да, около 5 пинов у него тоже было, а кому мало цепляли ардуину по уарт, сам делал…
Ну а во-вторых: у меня нет мании на линукс в каждом устройстве, у меня и без линуксов отлично датчики считываются по spi, i2c, on wire и т.д., и не менее отлично всё это транслируется куда угодно по тем же rs232/485, mqtt, да хоть get'ы в БД по тому же tcp/ip.
Но как только это выходит из домашней «песочницы» и понадобится, к примеру, SSL/TLS, то всё сразу становится иначе: в Linux это делается легко и удобно, а в какой-нибудь Atduino — сложно, «толсто» (для прошивки) и очень урезанно.
Вы заявляете, что HLK-RM04 — «в целом полное г», но это не так, сравниваете готовый промышленный модуль с платой роутера и предлагаете паяться проводами к пятакам? «Для дома, для семьи» это ещё сойдёт (хотя зачем, если есть нормальные альтернативы), а вот для чего-то более серьёзного — нет.
Ещё застал системы от Бош, в самом представительстве Боша и в Мегах по России.
И для меня совсем не ясна эта ниша устройств типа HLK-RM04, в продакшн они не попадут никогда, комьюнити 0.00. Проектов на них тоже около нуля. Какие плюсы, то что там Линукс?
Хороший контакт с автором, извечные идеалы сообщества, ламповость.
Ждём ButthuRTOS.
На микроконтроллеры переходят все более и более высокоуровневые языки. «Молодежь требует». А технологии позволяют.
esp32, нужно подключить ADC через SPI. Допустимая частота SPI 2.5М. Прикинул временные затраты, вроде выходит 30-50 kSPS. Собираю в железе, код через ихний фраймворк. Ну и что " технологии позволяют"? — 15 мкс/байт. Обмен требует передачу 4 байт. Итого, от «30-50 kSPS» остается пшик.
Но и это не всё, дальше будет интереснее — в железе esp32 для режима half duplex заложен режим автоматической пакетной передачи. Т.е. можно записать и получить ответ единожды пнув SPI. Однако, фраймворк написан программерами для программеров. Им заморочки железа перпендикулярны.
Последствия перехода с железом с «регистрового» уровня на высокоуровневые [...] интерпретаторы понятен и очевиден, как и его последствия. «Ногодрыг» — это ихнее «всё».
А если — что бы надежно и долго работало — то что-то вроде HP ProDesk 600 G3 DM. Б.у. много навезли, можно G2 или даже G1 брать, по цене…
А если есть желание поразбираться, то Friendly NanoPi R4S 1GB/4GB Dual Gbps Ethernet.
Но поскольку звучало «что купить новичку» — в комьюнити малины больше инфы, как это сделать с нуля. А для Х86 — вообще ничего мудрить не нужно.
Это касается качалки. Диск подцепляется автоматом, монтировать не нужно
И при этом для самбы юзеров много можно наклепать, небось?
Еще раз — просто торрентокачалку с доступом и просто самбу с примитивным доступом можно поднять почти на любой линукс-железке.
Но минимум непоняток для новичка будет там, где ему есть у кого спросить.
Не нужно ©
Да, оверпрайс как для торрентокачалки, да и ТВ-приставки дешевле в полтора-два раза.
Но это ведь полноценный ПК, который и поюзать можно всеми мыслимыми сценариями, набор периферии — на любой вкус. Жрёт только много и «пылесосит» соответственно (хотя я в своём кастомном корпусе протянул от БП трубу до проца — теперь 12см-вентилятор блока питания в одиночку тихо и достаточно эффективно охлаждает всё).
мне только спроситьмне только торренты. Потом веб-сайтик захочется, помоечку для файлов, личный календарик, контакты, видео шарить, а там и до крипты недалеко! :)Иметь «слабый вендодесктоп» намного круче и гибче, чем все эти прыжки вокруг ARM. Это не говоря про мириады дров, уже написанных для венды.
Не стирайте, это полезное.
А вас минус останется тут и после этого автор не сможет с этим жить пойдет за выпивкой и на него упадёт сосуля! После этого карачун ему...)))
Что полезное все промахиваются, а сайт пока работает никто править не будет. Ибо + и — ерунда это…
А платка была куплена — идея была переделать мой старый проект на более дешевый вариант, никакие ESP там не катят, а вычислений особых нет, просто надо гнать 2 байта данных довольно быстро.
Проект тут — Большой дисплей. Замороженный проект
Но вообще движёк довольно неплохой, большой плюс это то что под буффер можно выделять почти всю доступную память, а не думать как по прерыванию успеть заполнить мелкий буфер регистров как в случае с RMT. Легко сделать double buffer если нужно бесшовное преключение. В общем есть с чем поработать в плане функционала…
Скетч использует 90290 байт (4%) памяти устройства. Всего доступно 2097152 байт.
Глобальные переменные используют 42824 байт (15%) динамической памяти, оставляя 227512 байт для локальных переменных. Максимум: 270336 байт.
Скетч использует 90290 байт (4%) памяти устройства. Всего доступно 2097152 байт.
Глобальные переменные используют 42824 байт (15%) динамической памяти, оставляя 227512 байт для локальных переменных. Максимум: 270336 байт. Как так-то? Я тоже хочу хотя бы 14 килобайт! ;)
Когда я давно (статья-то уже старая) ставил Ардуину для 2040, было 2 варианта плагина, можно попробовать другой. У себя концов уже не найду — с тех пор компьютер поменялся, и какой там был — уже неведомо. А 2040 я больше не использовал.
Вот здесь mysku.club/blog/diy/90242.html еще одна моя статья, но там тоже ничего нет про компилятор. Тоже были проблемы — один вариант нужную конфигурацию для работы с SD не компилировал просто так, только с бубном.
а с Platformio более-менее. Оперативку ест, как не в себя, но это благодаря Mbed OS и загрузчику, который сейчас работает автоматом, а не как описано в статье
Ваш subj, на ARM M0, да еще и за такие деньги/доставаемость/юзабельность — это только для фанатов Raspberry RI.
Вообще, маладцы, я тащусь от них — взяли самый хламоподобный процессор, который даже делить не умеет, и сделали из него «свяркающый брильянт». (сарказм) Нет деления? — нет проблем, поставим аппаратный делитель. Чтоб поделить, сбегайте в периферию и потопчитесь в ожидании результата.
А ведь это не письма из Казахстана.
О-о, одно нашлось! ;-))
Защищаются от реверса :)
www.youtube.com/watch?v=RB6JQmqBeIE&t=648s
Это ОЗУ? Внутреннее?