Доброго времени суток, Хабровчане, сегодня речь пойдет о весьма не бюджетной мощной отладочной плате – Arduino Portenta H7. Статья будет обзорной и будет включать в себя описание платы и ее фич, возможные области применения, ну а в конце напишем пару примеров под этого монстра.

Покупка

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

Не задавая лишних вопросов (т. к. это очередная новая игрушка для меня), полез на просторы интернета искать место, где можно бы заказать сие чудо. Первым делом, пошел на официальный сайт ардуины, где данная плата стоит около 100$, однако при попытке заказа в РФ, сайт выдает ошибку, мол «нельзя, извини, браток». Расстраиваться было рано, поэтому полез искать магазины-партнеры, однако и каждый партнер отказывался осуществлять доставку в Россию. Наконец, я вышел на три российских компании, у которых огромными буквами было написано, что они могут доставить в Россию, однако, цена была уже не такой приветливой: (вместо 100$  с официального сайта ~ 7000 руб., российские конторы предлагали купить за ~ 12000). Деньги казённые, так что экономить не имело смысла, и я сразу написал всем трем фирмам. При этом две из них сразу предложили оплатить заказ, но что-то меня предостерегло от этой глупости…. Ибо через неделю все три компании ответили, что «данный товар закончился», и они ничем мне не могут помочь. Однако, спустя еще неделю, представитель одной из компаний написал, что у них есть коллеги, у которых есть еще коллеги, у которых  данный товар имеется в наличии (т. е. вы понимаете, как это звучит: «у меня есть друг, у которого есть друг, который знает одного человечка…»). При этом напрямую с этими людьми мне не давали связаться вплоть до момента оплаты. В конечном итоге, плату Arduino Portenta H7 я получил за 17000 руб. (цена весьма неплохого смартфона). На этом самая комичная часть статьи закончена, переходим к более серьезным вещам.

Краткое описание платы

Portenta H7 - пионер в семействе Portenta, предназначенная в основном для промышленного использования, однако, открытый исходный код и удобство использования Arduino позволяет применять ее где угодно.

Модель H7 оснащена двухъядерным процессором Arm Cortex ST, на котором "стоит" Mbed ОС. Mbed ОС - встроенная операционная система реального времени (RTOS), разработанная специально для микроконтроллеров, применяемых в IoT проектах.

Процессор

Особенность Arduino Portenta H7 заключается в одновременном выполнении как высокоуровневого кода с использованием Mbed API, так и поддержании работы с задачами в реальном времени. Т. к. оба ядра имеют полный доступ ко всей периферии, данная плата может спокойно выполнять:

  • Arduino-скетчи

  • Нативные приложения для Mbed ОС

  • Интерпретировать MicroPython и JavaScript

  • Код TensorFlow Lite

Параллельность выполнения процессов обеспечивают двухъядерный процессор STM32H747, состоящий из ядра Cortex-M7, которое работает при 480 МГц и ядра M4, работающее при 240 МГц. Такая особенность реализует реальную параллельность выполнения программ, к примеру, выполнение Arduino-скетча и программы, написанной на MicroPython. При этом оба ядра свободно "общаются друг с другом" для обмена информацией.

Более того, H7 может работать и как простой встраиваемый микроконтроллер, и может быть использована в качестве главного процессора встраиваемого персонального компьютера.

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

Machine Learning

На H7 могут быть запущены проекты, написанные с использованием TensorFlow Lite, что реализует возможность запуска алгоритмов машинного обучения на микроконтроллере! При этом одно из ядер может взять на себя функции вычислительного ядра для TensorFlow Lite, в то время как второе будет управлять, например мотором, или производить передачу данных.

GPU

Да, все верно, STM32H747 содержит встроенный GPU(Chrom-ART Accelerator), который реализует, пожалуй, самую впечатляющую особенность Portnenta H7 - подключение внешнего монитора для создания встраиваемого персонального компьютера с графическим интерфейсом пользователя. Более того, чип плата содержит встроенный JPEG энкодер и декодер.

Протоколы передачи данных

Беспроводной модуль Murata 1DX позволяет одновременно управлять WiFi и Bluetooth подключениями, при этом WiFi может работать в режиме точки доступа, в режиме станции, а также в сдвоенном режиме, представляющем собой совокупность двух предыдущих. А скорость передачи данных может достигать 65 Мбит/с.

Bluetooth интерфейс поддерживает как BLE, так и Bluetooth Classic, что позволит применить данное чудо техники в IoT проектах. Про такие протоколы как UART, I2C, SPI, Ethernet, я думаю, говорить смысла нет: H7 поддерживает каждый из них.

Память

Внутренняя память состоит из 2 Мб флэш-памяти , и 1 Мб ОЗУ, разделенной следующим образом:

  • 192 кБ строго отведены для критических по длительности процедур

  • 64 кБ для инструкций

  • 128 кБ для хранения данных

  • 864 кБ пользовательской SRAM

  • 4 кБ для резервной копии SRAM

Также к данной модели можно присоединять дополнительную внешнюю SDRAM и QSPI Flash. Объем подключаемой SDRAM может достигать 64 Мб, напрямую отображаемых в адресном пространстве. QSPI Flash позволяет добавлять до 128 Мб, которые могут быть использованы для хранения данных или кода программы.

Шифрование данных

"На борту" H7 расположены два крипто-чипа: ATECC608A производства Microchip, и SE050C2 от компании NXP.

Ethernet Phy

Дополнительный физический интерфейс 10/100 Ethernet напрямую подключается к внутреннему MAC- адресу платы, обеспечивая полнодуплексную связь с автоматической поддержкой MDIX. А внешнее прерывание по Lan значительно снижает энергопотребление устройства в режиме ожидания.

На борту

Итак, по умолчанию Arduino Portenta H7 имеет в наличии:

  • Двухъядерный микроконтроллер STM32H747 (Cortex-M7, работающий при 480 МГц / M4, работающий при 240 МГц)

  • Графический аппаратный ускоритель Chrom-ART

  • Блок вычисления CRC

  • Встроенный JPEG кодек

  • Оперативная память - 8-64 Мб SDRAM

  • 2-128 Мб NOR Flash

  • 4 DMA контроллера, для облегчения "жизни" основного процессора

  • 1 высокоскоростной контроллер прямого доступа к памяти

  • Поддержка сетевых протоколов 10/100 Phy

  • Встроенный беспроводной модуль с поддержкой беспроводных протоколов BT5.0 и WiFi 802.11

  • Встроенный DisplayPort

  • USB type C

  • Антенна 2.4/5 ГГц

  • 22 таймера и watchdog-ов

  • 4 I2C интерфейса

  • 4 USART/UART - интерфейсов

  • 6 SPI

  • 8-ми битный интерфейс камеры

  • 3 16-ти битных АЦП, с поддержкой до 36 каналов, с поддержкой макс. скорости до 3.6 MSPS

  • 96-ти битный уникальный ID

  • и т.д.

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

Набор всех фич просто не перечислить... Для более подробной информации можете ознакомиться с официальным сайтом Arduino.

Внешнее описание

Плата приходит в небольшой коробочке, задняя часть которой частично дублирует информацию из даташита.

Внешний вид коробки

Человеку, который за всю жизнь видел пока только китайские копии Arduino nano, и голые камни ATmega, мне было весьма приятно подержать в руках такое устройство.

Внешний вид платы Arduino Portenta H7
Внешний вид платы с официального сайта

 Физические размеры составляют: 66 х 25 мм.

Области применения

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

Помимо научно-исследовательских целей, плата может найти широкое применение в качестве достаточно компактной системы с машинным обучением, например, вы захотели сделать систему распознавания лиц и приделать ее к домофону. В таком случае Portenta H7 - идеальный вариант.

Также, широкое распространение может получить прецизионное оборудование, в основу которого ляжет данная плата.

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

В общем - областей применения - тьма, тут уже кто на что горазд.

Написание классического blink

Вот мы и подходим к концу. Если вам не интересна эта часть, можете смело переходить к заключению. Или ко второму примеру, в котором мы будем работать с WiFi.

Здесь же мы подготовим полностью среду разработки Arduino IDE к работе с Arduino Portenta H7, и напишем классический пример мигания светодиодом (куда уж без этого всего), однако для этого задействуем оба ядра отладочной платы.

Итак, приступим.

Настройка IDE

Первым делом, нам необходимо подгрузить все библиотеки для работы с Portenta, для этого в IDE мы нажимаем Инструменты -> Плата -> Менеджер плат (Tools->Board->Board Manager)

Менеджер плат

В поисковике менеджера плат вбиваем "portenta", и затем выбираем "Arduino mbed-enabled Boards", выбираем необходимую версию (на момент моей работы это была версия 1.30), и скачиваем.

Скачивание ядра

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

Программирование Portenta H7

Писать мы будем классический blink, однако попробуем реализовать его на каждом из ядер по отдельности: т.е., к примеру раз в полсекунды светодиод будет моргать красным цветом, а раз в 200 мс - зеленым, при этом за другой цвет будет отвечать второе ядро.

Особенность Portenta H7 заключается в том, что код для каждого ядра можно написать в отдельном файле, а затем загрузить для каждого из ядер по отдельности (однако, если хочется, вместо "двухфайловой" прошивки можно сделать однофайловую). примеры обоих вариантов будут представлены ниже.

M7Blink

void setup() {
    // initialize digital pin LEDR as an output.
    bootM4(); //Waking up the M4 core
    pinMode(LEDR, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
   digitalWrite(LEDR, LOW); // turn the red LED on (LOW is the voltage level)
   delay(500); // wait for 500 milliseconds
   digitalWrite(LEDR, HIGH); // turn the LED off by making the voltage HIGH
   delay(500); // wait for 500 milliseconds
}

Код для моргания красным светодиодом на ядре M7

Вас может смутить, 4 строчка кода (bootM4()) (хотя по названию, в принципе, можно догадаться). Смысл этой строчки становится ясным после того, как мы узнаем каким образом происходит запуск микроконтроллера.

После подачи напряжения, стартует лишь ядро M7, в то время как M4 - спит. Следовательно, для того, чтобы код, написанный для M4 выполнялся, ядро M4 следует принудительно пнуть. Это собственно и достигается командой bootM4().

Далее нам следует написать код для второго ядра "M4Blink":

M4Blink

void setup() {
    // initialize digital pin LEDG as an output.
    pinMode(LEDG, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
   digitalWrite(LEDG, LOW); // turn the LED on (LOW is the voltage level)
   delay(200); // wait for 200ms
   digitalWrite(LEDG, HIGH); // turn the LED off by making the voltage HIGH
   delay(200); // wait for 200ms
}

Код для моргания зеленым светодиодом на ядре M4

Далее, для загрузки обоих файлов в память МК нам необходимо подключить плату к компьютеру, далее пройтись по цепочке: Инструменты -> Плата -> Arduino Mbed OS Boards, и выбирать вначале M7 core.

Выбор ядра для загрузки прошивки

Далее, выбираем COM порт, к которому подключена наша плата, и нажимаем "загрузить".

Выбор порта для загрузки проишвки

После успешной загрузки, необходимо повторить операцию для ядра M4, однако в цепочке Инструменты -> Плата -> Arduino Mbed OS Boards необходимо выбрать уже M4 core. При этом цепочка для выбора порта остается такой же, как и в предыдущем случае.

Выбор второго ядра для загрузки прошивки

Если все сделано правильно, то встроенный светодиод на плате начнет моргать зеленым раз в 200 мс, а красным - раз в 500 мс. При наложении цветов, мы получим желтый цвет.

"Однофайловая" прошивка

Далее, приведу пример "однофайловой прошивки", которая не потребует раздельных файлов для разных ядер. Для такой прошивки используются директивы #ifdef, однако ими не стоит злоупотреблять, и большой код все-таки лучше разбить на два файла.

"Однофайловая прошивка"
int myLED;

void setup() {

 randomSeed(analogRead(0));

 #ifdef CORE_CM7
  bootM4();
  myLED = LEDR; // built-in blue LED10 #endif11
 #endif

  #ifdef CORE_CM4
   myLED = LEDG; // built-in greeen LED
  #endif

 pinMode(myLED, OUTPUT);
}

void loop() {
 digitalWrite(myLED, LOW); // turn the LED on
 delay(200);
 digitalWrite(myLED, HIGH); // turn the LED off
 delay( rand() % 2000 + 1000); // wait for a random amount of time between 1 and 3 seconds.
}

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

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

Далее, будет приведен еще один пример, взятый с оф. сайта Arduino: мы превратим нашу Portenta H7 в WiFi точку доступа.

WiFi Hotspot

В данном примере мы напишем программу, которая сделает из нашей платы WiFi точку доступа, которая будет работать в качестве сервера, выдающего HTML страничку, содержащую три кнопки, по нажатию на которые, будет изменяться свет встроенного в плату светодиода. Итак, приступим.

Код

WiFiServer
#include <WiFi.h>
#include "arduino_secrets.h"

///////please enter your sensitive data in the Secret tab/arduino_secrets.h
char ssid[] = SECRET_SSID;    // your network SSID (name)
char pass[] = SECRET_PASS;    // your network password (use for WPA, or use as key for WEP)
int keyIndex = 0;             // your network key Index number (needed only for WEP)

int status = WL_IDLE_STATUS;

WiFiServer server(80);				//Server port = 80	

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  
  Serial.println("Access Point Web Server");

  pinMode(LEDR,OUTPUT);
  pinMode(LEDG,OUTPUT);
  pinMode(LEDB,OUTPUT); 

  // by default the local IP address of will be 192.168.3.1
  // you can override it with the following:
  // WiFi.config(IPAddress(10, 0, 0, 1));

  if(strlen(pass) < 8){    
    Serial.println("Creating access point failed");
    Serial.println("The Wi-Fi password must be at least 8 characters long");
    // don't continue
    while(true);
  }
    
  // print the network name (SSID);
  Serial.print("Creating access point named: ");
  Serial.println(ssid);

  //Create the Access point
  status = WiFi.beginAP(ssid,pass);
  if(status != WL_AP_LISTENING){
    Serial.println("Creating access point failed");
    // don't continue
    while (true);
  }

  // wait 10 seconds for connection:
  delay(10000);

  // start the web server on port 80
  server.begin();

  // you're connected now, so print out the status
  printWiFiStatus();
  
}

void loop() {

 // compare the previous status to the current status
  if (status != WiFi.status()) {
    // it has changed update the variable
    status = WiFi.status();

    if (status == WL_AP_CONNECTED) {
      // a device has connected to the AP
      Serial.println("Device connected to AP");
    } else {
      // a device has disconnected from the AP, and we are back in listening mode
      Serial.println("Device disconnected from AP");
    }
  }

  WiFiClient client = server.available();   // listen for incoming clients

  if (client) {                             // if you get a client,
    Serial.println("new client");           // print a message out the serial port
    String currentLine = "";                // make a String to hold incoming data from the client
  
    while (client.connected()) {            // loop while the client's connected
     
      if (client.available()) {             // if there's bytes to read from the client,
        char c = client.read();             // read a byte, then
        Serial.write(c);                    // print it out the serial monitor
        if (c == '\n') {                    // if the byte is a newline character

          // if the current line is blank, you got two newline characters in a row.
          // that's the end of the client HTTP request, so send a response:
          if (currentLine.length() == 0) {
            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
            // and a content-type so the client knows what's coming, then a blank line:
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println();

            // the content of the HTTP response follows the header:
            client.print("<html><head>");
            client.print("<style>");
            client.print("* { font-family: sans-serif;}");
            client.print("body { padding: 2em; font-size: 2em; text-align: center;}");            
            client.print("a { -webkit-appearance: button;-moz-appearance: button;appearance: button;text-decoration: none;color: initial; padding: 25px;} #red{color:red;} #green{color:green;} #blue{color:blue;}");
            client.print("</style></head>");
            client.print("<body><h1> LED CONTROLS </h1>");
            client.print("<h2><span id=\"red\">RED </span> LED </h2>");
            client.print("<a href=\"/Hr\">ON</a> <a href=\"/Lr\">OFF</a>");
            client.print("<h2> <span id=\"green\">GREEN</span> LED </h2>");
            client.print("<a href=\"/Hg\">ON</a> <a href=\"/Lg\">OFF</a>");
            client.print("<h2> <span id=\"blue\">BLUE</span> LED </h2>");
            client.print("<a href=\"/Hb\">ON</a> <a href=\"/Lb\">OFF</a>");
            client.print("</body></html>");

            // The HTTP response ends with another blank line:
            client.println();
            // break out of the while loop:
            break;
          } else {      // if you got a newline, then clear currentLine:
            currentLine = "";
          }
        } else if (c != '\r') {    // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }

        // Check to see if the client request was "GET /H" or "GET /L":
        if (currentLine.endsWith("GET /Hr")) {
          digitalWrite(LEDR, LOW);               // GET /Hr turns the Red LED on
        }
        if (currentLine.endsWith("GET /Lr")) {
          digitalWrite(LEDR, HIGH);                // GET /Lr turns the Red LED off
        }
        if (currentLine.endsWith("GET /Hg")){
          digitalWrite(LEDG, LOW);                // GET /Hg turns the Green LED on
        }
        if (currentLine.endsWith("GET /Lg")){
          digitalWrite(LEDG, HIGH);                // GET /Hg turns the Green LED on
        }
        if (currentLine.endsWith("GET /Hb")){
          digitalWrite(LEDB, LOW);                // GET /Hg turns the Green LED on
        }
        if (currentLine.endsWith("GET /Lb")){
          digitalWrite(LEDB, HIGH);                // GET /Hg turns the Green LED on
        } 
        
      }
    }
    // close the connection:
    client.stop();
    Serial.println("client disconnected");
  }
  
}

void printWiFiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your Wi-Fi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print where to go in a browser:
  Serial.print("To see this page in action, open a browser to http://");
  Serial.println(ip);
}

Код достаточно простой и легко читается, однако все оригинальные комментарии сохранены.

А работает он по следующему принципу: после нажатия на определенную кнопку, телефон посылает Get запрос на сервер, в сообщение указываются параметры H/L (High/Low), R/G/B (Red/Green/Blue), после получения всей последовательности, сервер (Portenta H7) включает/выключает необходимый светодиод и переходит в режим ожидания следующего сообщения.

Создатели кода рекомендуют хранить SSID и пароль точки доступа в отдельном файле. Для этого необходимо нажать на стрелочку под порт монитором в Arduino IDE. Ввести имя файла "arduino_secrets.h".

Создание нового файла

А в сам файл стоит добавить следующие две строчки, которые будут содержать SSID и пароль точки доступа.

# define SECRET_SSID "PortentaAccessPoint" //You could put your own SSID
# define SECRET_PASS "123Qwerty"					//And password

Ну а далее остается лишь зашить прошивку в плату. Заливать прошивку стоит также как и в предыдущем примере, а в качестве ядра выбрать M7.

Ошибки

Ошибка создания точки доступа

Для устранения такой ошибки надо зайти в Файл -> Примеры -> отлистать до Arduno Portenta -> WiFi -> PortentaWiFiFirmwareUpdater, и загрузить выбранный файл в микроконтроллер.

После успешного обновления, необходимо опять загрузить нашу прошивку для сервера на Portenta H7.

Подключение к точке доступа

После успешной прошивки, следует открыть порт монитор, и дождаться сообщения о готовности токи доступа.

Сообщение о готовности точки доступа

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

HTML страница нашего сервера

А для управления светодиодами, стоит нажимать на кнопки on/of у соответствующих цветов. При этом на Portenta H7 будут приходить сообщения, которые будут также отображаться в порт мониторе.

Отправка запросов на сервер

Собственно на этом, данный пример завершен.

Заключение

В общем то и все. В данной статье я провел обзор новой платы производства Arduino, рассмотрел некоторые из ее особенностей, привел области применения такого устройства, и познакомил читателя с настройкой IDE для работы с данной платой.

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

Всем спасибо, до новых встреч!

Комментарии (28)


  1. DanilinS
    15.07.2021 13:44
    +3

    Arduino Portenta H7 имеет в наличии:

    Давайте уточним, что из перечисленного имеет отношение к Arduino Portenta H7 а что к STM32H747. А то у вас все в кучу.


    1. Osiris74 Автор
      15.07.2021 14:24

      Да, в перечисленном списке, элементы имеют отношение как с Portenta H7, так и к STM32H747. И мне не особо ясен смысл разбиения отдельно на фичи МК и того, что содержится на плате. Я постарался вынести самые впечатляющие особенности и того и другого в список.


      1. KivApple
        15.07.2021 14:59

        Ну то что имеет сам STM32H747 можно получить путём заказа какой-нибудь другой dev-платы, а больший выбор означает и ниже цену и больше поставщиков (конкретно я как физлицо вижу вообще вариант на AliExpress за 47$, но юрлицу может быть неудобно оплачивать).

        Так что разделять какие плюшки даёт просто сам МК и какие плюшки даёт конкретная dev-плата (предустановленная периферия и т. д., ардуиновский бутлоадер сам по себе обычно можно залить на любую плату с совместимым МК, так что софтовая часть не считается) вполне имеет смысл.


        1. DanilinS
          15.07.2021 15:04

          "На борту" H7 расположены два крипто-чипа: ATECC608A производства Microchip, и SE050C2 от компании NXP.

          На плате чип один. ATECC608A или SE050C2 на выбор.


  1. dcoder_mm
    15.07.2021 13:49
    +1

    встроенный GPU(Chrom-ART Accelerator), который реализует, пожалуй, самую впечатляющую особенность Portnenta H7 - подключение внешнего монитора

    Chrom-ART Accelerator который даже ST скромно называют DMA2D это именно что DMA предназначенный для работы с двухмерными массивами. Фичи типа pixel format conversion и альфа-блендинга там есть, но и только.

    Внешние дисплеи, чтобы с ними мог работать DMA2D подключаются либо через LTDC либо через FMC, и то и то требует кучи пинов (LTDC - порядка двух десятков для режима RGB565)


    1. dcoder_mm
      15.07.2021 13:55

      А, стоп, там конвертер делающий из MIPI DisplaPort обернутый в USB-C

      Вы бы хоть схему в статью добавили


      1. Osiris74 Автор
        15.07.2021 14:25

        Да, Вы правы, про конвертер упомянуть забыл. Схемы специально решил не прикреплять, посчитал их ненужными в данном случае.


  1. rcepro
    15.07.2021 14:11
    +3

    ардуина...посредственность...не достанешь в РФ...да ещё только за большие деньги....

    смысл во всём этом? это просто какая-то реклама, а не топик.

    производители, в своих изделиях - не станут тратить свои деньги на такой контроллер - т.к. им важно, чтоб было дёшево и чтоб было всегда возможно купить. А рядовые пользователи - тем более - 17тыс руб за такой "шедевр"?... Что он им даст в профессиональном плане? Что они покажут в своём резюме? - как спустили деньги на посредственную отладочную плату?

    что касается, что это мол - выбор начальства - купить эту плату и всё тут...:
    не знаю - так ли это на самом деле - или это просто выдумки автора но,
    контроллер (и отладочная плата) выбирается под задачу. Есть задача. есть поставленные и обусловленные ей технические рамки, - выбирается контроллер. Причём, при выборе - идёт грызня за каждую копейку, потому что конкуренция.


    1. dcoder_mm
      15.07.2021 14:19
      +1

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


      1. DanilinS
        15.07.2021 14:40
        +1

        Такие люди обычно берут STM32H747I-DISCO, которое уже имеет экран и кучу обвеса на борту.
        А если берут для "интегрированных мозгов" — покупают что-то типа https://aliexpress.ru/item/1005001722246541.html


        И в догонку — на али эта плата стоит около 9 т.р. https://aliexpress.ru/item/1005002741201377.html


        1. Osiris74 Автор
          15.07.2021 14:43

          Насчет STM32H747I-DISCO ни разу не слышал, спасибо за ссылку, почитаю на досуге про него.

          А при попытке заказать с Ali, также возникает проблема при оплате: оплата проходит, а через несколько дней приходит сообщение о том, что в РФ они доставить ее не могут, и начинается длительный процесс ожидания возврата средств.


          1. dcoder_mm
            15.07.2021 14:58
            +2

            Насчет STM32H747I-DISCO ни разу не слышал

            Вам тогда возможно будет интересно что у ST есть еще серия очень дешевых плат Nucleo с МК и минимальной обвязкой. Это самый дешевый способ купить плату с STM32 и ethernet PHY например


            1. Osiris74 Автор
              15.07.2021 18:12

              Спасибо за информацию!

              Обязательно почитаю


    1. Osiris74 Автор
      15.07.2021 14:37
      +1

      Реклама чего?
      Я лично ничего не рекламирую в данном посте.
      В вводной части я лишь пытался рассказать о том, что данную плату в РФ доставить весьма проблематично.

      Дешево будет в том случае, если заказывать через официальный сайт Ардуины (на данный момент плата стоит 70 с лишним долларов), что уже весьма неплохая цена. Остальные наценки идут из-за российских компаний импортеров.

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

      Выбор начальства пал именно на эту плату, из-за того что наш коллега из-за рубежа написал рабочее ПО именно для этого устройства. Моей задачей было разобраться со всем этим делом, а далее уже обеспечить экономическую выгоду от сего устройства.

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

      И на момент моего первого знакомства с Portenta H7 меня мало интересовала его экономическая выгода.

      Надеюсь, я смог дать Вам пояснения по каждому из пунктов.


      1. rcepro
        15.07.2021 14:41
        +1

        "Выбор начальства пал именно на эту плату, из-за того что наш коллега из-за рубежа написал рабочее ПО именно для этого устройства. Моей задачей было разобраться со всем этим делом, а далее уже обеспечить экономическую выгоду от сего устройства. "

        когда девайс создают под ПО - тут просто уже, как говорится, - нет слов...


        1. Osiris74 Автор
          15.07.2021 14:45
          +1

          Вы не поняли.

          Коллега собрал у себя работающее устройство, затем написал под него ПО. Т.к. коллега не может приехать в РФ, была поставлена задача повторить его устройство, точнее скачать его ПО, прошить МК, подпаять все необходимые компоненты к плате. А далее начать оптимизировать данное устройство.


      1. DanilinS
        15.07.2021 14:48

        "рабочее ПО именно для этого устройства " — имеется в виду что софт заточен под что-то распаянное на плате? Если используется крипточип или WiFi/BT Module то брать имеет смысл. Иначе взять любую отладочную плату на чипе этой серии и прошить ардуино-загрузчик.


        1. Osiris74 Автор
          15.07.2021 14:50

          Используется WiFI/BT модуль.


  1. Teplo_Kota
    15.07.2021 14:47
    +1

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


    1. DanilinS
      15.07.2021 15:42

      Это не совсем законно. Скорее всего плата попадает по экспортные ограничения ( по криптографии?).
      При сертификации и лицензировании может всплыть и стать причиной кучи проблемм.


      1. Osiris74 Автор
        15.07.2021 18:11

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


  1. Albert2009ru
    15.07.2021 16:49

    Добрый день!

    Что-то сильно усложнили написание скетчей. Насколько я понял, даже скетч "два в одном" нужно грузить два раза... Геморрой какой-то, а если я ADC начну опрашивать? А он только на одном из ядер. Тема как-то не раскрыта :(


    1. Osiris74 Автор
      15.07.2021 18:10

      Да, все верно, скетч необходимо грузить дважды в МК, чтобы каждое ядро могло прочитать свои инструкции. ИМХО есть какая то лазейка по запихиванию данных из М7 в М4, но этим пока не занимался


    1. dcoder_mm
      15.07.2021 19:30

      В каком смысле ADC только на одном из ядер? Он же на AHB висит а она должна быть доступна для всех


      1. Albert2009ru
        15.07.2021 20:47
        +1

        :) Я даже не знаю о чем Вы... На Atmega328P это так работает ADCSRA конфигурируется на включение ADC и выбор частоты замера + "муксится" канал ADC на конкретный пин проца.

        Далее ADCSRA единицу в ADSC, затем ждем пока он вновь в ноль не перейдет, снова единицу туда же (читайте эррату, они в Atmega этот косяк так и не исправили) и затем, результатом замера будет значение ADC в 16 битах, либо можно в ADCH и ADCL они "побайтные".

        И всё это в одной единственной Atmege, соответственно в "Ардуине".

        Не поленился слазить в даташит на Atmeg'у (мало ли, вдруг чего-то реально не знал), там тоже ничего про AHB нет. Дайте ссылку на этот AHB, надо развивать эрудицию.

        зы Я в "кишках" процессоров не разбираюсь, что в даташите написано и в примерах приведено, тем и пользуюсь.


        1. dcoder_mm
          15.07.2021 21:09
          +1

          На Atmega328P это так работает

          Oh, sweet summer child...

          AHB это одна из внутренних шин в МК на которой висит разная периферия (в том числе и ADC). Оба ядра имеют доступ к ней. Посмотрите блок-схему МК в даташите на стр 19. ADC справа сверху, ядра Cortex-M4 и Cortex-M7 слева сверху. Легко видеть (я не удержался, простите), что оба ядра имеют доступ к ADC через разные промежуточные шины.

          А еще вам наверное будет интересно почитать как устроены ADC в этом МК (reference manual, стр 961) и сравнить с атмегой.

          Дайте ссылку на этот AHB, надо развивать эрудицию.

          Я могу вам дать ссылки на две брошюрки об этом МК:

          Одна поменьше (даташит): https://www.st.com/resource/en/datasheet/stm32h747xi.pdf

          Вторая чуть побольше (reference manual): https://www.st.com/resource/en/reference_manual/dm00176879-stm32h745755-and-stm32h747757-advanced-armbased-32bit-mcus-stmicroelectronics.pdf


          1. Albert2009ru
            15.07.2021 22:09
            +2

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

            Спасибо, ещё раз, за ссылки!


  1. aliday
    17.07.2021 10:19
    +1

    Чем оно лучше esp32 за 1000₽ с али ещё и с экраном? А без - так за 500! Выглядит оверпрайсово, выгода вообще не очевидна, даже если взять две штуки для многопоточности