LINUXTALKS.CO

Ардуино для «старичков». Часть 1. Философия

 ,

L


0

1

«Старички» - это люди с большим опытом использования юникс-систем и разработки под них. То есть - мы.

МИКРОКОНТРОЛЛЕРЫ

Мы все, так или иначе, сталкивались с разработкой под микроконтроллеры. Какие для этого есть классические инструменты? Например, для платформы Atmel - если мы разрабатываем из-под Linux, то инструменты все те же, которые используются для разработки под сам Linux! У нас есть avr-gcc, есть тот же самый GNU Make, плюс к этому нужна программа, которая будет работать с программатором и записывать прошивку в микроконтроллер. В Linux это консольная утилита, конечно же. Например, avrdude.

При помощи этого набора консольных (!) утилит писались проекты, в любом редакторе, в любом IDE. Это было очень удобно, эффективно и красиво.

Но! Мы немного забыли о том, что все это, и использование Linux в первую очередь, сильно имеет крен в сторону профессиональной разработки. Сложно представить какого-нибудь любителя-дачника, который хочет сделать автоматическую поливалку парника, и ради этого начинает учить bash и GNU Make. Естественно, он использует Windows, и там несколько другие подходы. В Windows весьма неудобно работать с набором консольных утилит, да это и не принято, поэтому там мы ставим один такой монстро-GUI-бандл всего, под названием IDE. Вместо божественного Vim! И этот бандл, он как бы, ест ресурсы! И куда менее удобен чем Vim, в качестве редактора кода. Вот этот момент сразу запомним - в Linux у нас упор на консольные утилиты, в Windows нам нужна цельная GUI среда которая делает все. И эта среда будет жирная.

Но есть в embedded сфере еще более серьезная проблема. Вот допустим, вы написали код поливалки парника для Atmega8. А я решил его использовать тоже, но у меня STM32F407. Куда мне засунуть ваш код? То есть - решения получаются непортируемы между разными микроконтроллерами. Даже в пределах одной платформы! А основной принцип программирования нам что говорит - надо переиспользовать код!

И вот тогда, некоторые умные люди взяли и сделали такую штуку как

ARDUINO

Как понять, что это такое? Тут надо немного пошевелить мозгами. Это не совсем то, чем оно кажется с первого взгляда. Вы считаете, что Arduino - это вот такая отладочная платка, UNO, с микроконтроллером AVR на ней? Да, в том числе и она, но смысл то вообще не в этом! Посмотрите как выглядит Arduino UNO - там есть гребенка с пинами GPIO (дискретные входы-выходы), есть гребенка с аналоговыми ножками (входами АЦП), есть ножки UART, SPI, I2C. И (!!!) их расположение на плате - это стандарт! Это де-факто стандарт всей этой сферы. А дальше, есть море всех вот этих плат расширения к Arduino, которые просто втыкаются в эти СТАНДАРТНЫЕ гребенки!

С программной стороны, что это такое? Платформа Arduino - это набор C++ библиотек, предоставляющий СТАНДАРТНЫЙ АБСТРАГИРОВАННЫЙ ОТ РЕГИСТРОВ API для работы с вот этими вот СТАНДАРТНЫМИ ножками Arduino!

А теперь - фокус-покус! Зачем все это нужно нам? Представьте теперь, что я не хочу микроконтроллер Atmega328, а хочу STM32F411, который на порядок круче. Но - при этом я хочу втыкать в него все эти мириады плат расширения, которые понаделали для Arduino. И я хочу брать драйверы для всех этих плат, которые УЖЕ написали для Arduino. Удобно же? Но как это возможно? Микроконтроллер вообще другой!

И вот тут, еще более умные люди, чем те, кто придумал Arduino изначально (а может и они сами, я не вникал), посмотрели внимательно на платформу Arduino и на ее СТАНДАРТ. Ножки, которые есть на гребенках Arduino UNO, есть на всех микроконтроллерах всех платформ! Они есть везде, если это не восьмипиновое чудо, конечно. Но и для него есть варианты.

API платформы Arduino это что? Смотри выше. СТАНДАРТНЫЙ АБСТРАГИРОВАННЫЙ ОТ РЕГИСТРОВ API. Значит, все это может работать на любой аппаратной платформе! Нужно только перенести библиотеки Arduino, реализующие все это, на любую целевую платформу. А дальше, любая программа на C++, которой достаточно вот этого базового СТАНДАРТА, начинает работать на любом микроконтроллере вообще! У нас наконец-то, один и тот же код начинает переноситься между микроконтроллерами. Наступает светлое коммунистическое будущее.

КАК ТЕПЕРЬ ПОНЯТЬ ARDUINO

То есть, современное Arduino - это программная платформа, которая реализует базовый АБСТРАГИРОВАННЫЙ ОТ РЕГИСТРОВ API для всех основных платформ микроконтроллеров. Сюда входит AVR, STM32, ESP32, Raspberry Pi Pico, еще куча всего, в том числе одноплатники с Linux внутри! Да да, смеющиеся над ардуинкой, попуститесь! Эти скетчи, компилируются и работают как приложение линукса. Если у вас такая платформа.

И где-то на задворках всего этого многообразия, есть та самая Arduino UNO с атмегой. Если вы хотите именно ее, то пожалуйста.

А есть, например, такая плата как Nucleo-64. На ней стоит мощный современный микроконтроллер STM32F411, но гребенки… вот сюрприз! Они такие же точно, как у Arduino UNO! То есть все ардуиновские платы расширения втыкаются в нее как в родную.

А ЕСЛИ МНЕ ЭТОГО МАЛО???

И вот он самый главный вопрос человека, знакомящегося с Arduino после 20-летнего опыта хардкор-разработки на регистрах. А если мне мало этого вашего БАЗОВОГО API? Что если мне на STM32F411 надо настроить 6 каналов АЦП в режиме циклического DMA, с запуском преобразования от таймера TIM2, и с периодической вставкой еще 3 инжектированных каналов в этот регулярный набор? ХДЕ В ВАШЕЙ АБДУРИНО ПЛАТФОРМЕ ФУНКЦИЯ КОТОРАЯ ЭТО ДЕЛАЕТ? А? А? А? Как мне через analogRead ардуиновский сделать ВОТ ЭТО?

А никак. Тут нужно понять ключевую, важнейшую вещь! Платформа Arduino работает ПОВЕРХ нативной платформы! Не ВМЕСТО нее, а именно ПОВЕРХ! То есть, функции Arduino внутри себя дергают функции нативной платформы, или регистры, проще говоря. Для STM32 это HAL, для ESP32 это ESP-IDF, и так далее. Для AVR это просто регистры AVR.

То есть, ВСЕ возможности, все функции, все регистры нативной платформы, доступны вам ВМЕСТЕ с API Arduino! Натив никуда не девается! Вы можете прямо в Arduino IDE, прямо в скетче ардуиновском, обратиться к любому регистру, или к любой функции нижележащей платформы! Вы можете ВООБЩЕ не использовать API Arduino в скетче, только натив! Вот это надо ОЧЕНЬ ЧЕТКО ПОНЯТЬ. Если вам не понятно, как продраться через абстракции Arduino, значит просто в этих абстракциях нужных нюансов нет, потому что они платформо-специфичны, а Arduino - это кроссплатформа между микроконтроллерами! Тогда, вы просто берете и напрямую обращаетесь к возможностям нативной платформы. К любым.

Но - если все так хорошо, почему все так плохо? Почему все так хейтят Arduino? Потому что - Arduino IDE. Это фуфло, очень неудачная IDE. И очень жирная. Она все портит, рушит всю красоту. Что же тогда делать? Вспоминаем теперь, что мы на Linux, и у нас - крен в сторону консольных утилит! То есть, мы должны выбросить неудачную IDE, и работать с консольными утилитами, как мы и привыкли.

И, внимание!!! Не обязательно выбрасывать саму платформу Arduino и фигачить на регистрах через avrdude в эти платы, как обычно все деды предлагают! Выборосить надо только IDE. С остальным уже можно работать и извлекать пользу.

На этом закончим с философией, в Части 2 поговорим о практике эффективного применения этой платформы юникс-ветераном.

★★★★★★★

Проверено: cocucka ()

Годно, но очень много патетики.

Ориентирование на «любителя-дачника, который хочет сделать автоматическую поливалку парника» напрочь убивает серьезность в повествовании. Тянет какой-то радиолюбительщиной. Хотя с абдуриной по-другому и не может быть, она по своей философии на это и ориентирована.

В Windows весьма неудобно работать с набором консольных утилит

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

Часть 1

Ну, с почином тебя, Глеб Егорыч! Дело полезное делаешь.

Oberstserj    
★★★★★★
Последнее исправление: Oberstserj (всего исправлений: 1)

Ubuntu / Firefox (NL)
Ответ на: комментарий от Oberstserj

Годно, но очень много патетики.

Во второй части не будет, там только по делу. А это такой водный ввод, чтобы рассказать про подход в целом.

Ориентирование на «любителя-дачника, который хочет сделать автоматическую поливалку парника» напрочь убивает серьезность в повествовании.

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

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

Например, на esp32 «детский» скетч, точно тот же, работает на двухядерном процессоре >200 МГц каждое ядро, имеет несколько мегабайт RAM и FLASH, и работает под многозадачной операционкой FreeRTOS. То есть можно прямо из скетча запускать параллельные потоки. И все это имеет сетевой WiFi стек, доступный прямо из скетча ардуино. Со всеми нужными TCP, UDP, HTTPS функциями. Хоть клиент, хоть сервер. Стоит такая готовая плата, с этим МК - 4$.

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

JamesHolden    
★★★★★★★
Android / Chrome (BY)
Ответ на: комментарий от Oberstserj

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

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

Это очень легко делать, именно потому что такие библиотеки напрямую с железом не работают, только дергают функции api arduino. А функций этих сравнительно мало.

Например, типичный драйвер TFT экрана. Он дёргает буквально три-четыре ардуиновские функции, из библиотеки SPI. Их реализация пишется с нуля за 15 минут, и драйвер начинает работать без платформы ардуино, прямо в нативном проекте.

Но почему-то, ардуинщики этого в упор не осознают. Они все уверены, что без Arduino IDE у них не будет драйверов. Этот миф надо активно развеивать!

JamesHolden    
★★★★★★★
Android / Chrome (BY)
Ответ на: комментарий от JamesHolden

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

А я и не высмеиваю, ни в коем случаю. Ардуино имеет шикарное прикладное применение. Для как раз вот тех самых дачников-поливальщиков.

С задачами вовлечения в более серьезную электронику и программирование проект тоже справляется. Но именно здесь же и кроется главная проблема - абстракция. Уровень, при котором начинающего электронщика-программиста отрывают от тех самых регистров, но при этом не подталкивают в них разбираться. Как ты сам пишешь, часть функционала в базовой IDE-шке просто отсутствует. И эти самые начинающие программисты могут десятилетиями сидеть на их недоIDE и даже не пытаться смотреть а что там под капотом.

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

Поэтому мне интересно, что ты дальше будешь писать. Если будешь заполнять этот пробел в информации, то это очень ценно.

Oberstserj    
★★★★★★
Ubuntu / Firefox (NL)
Ответ на: комментарий от JamesHolden

Но почему-то, ардуинщики этого в упор не осознают. Они все уверены, что без Arduino IDE у них не будет драйверов. Этот миф надо активно развеивать!

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

Например взять тот же LCD1602(HD44780). Общение с дисплеем наипримитивнейшее. Особенно если реализовывать через 8-битную шину (например через сдвиговые 595 регистры). Весь код занимает буквально с десяток строчек. Тащить библиотеку lcd в какую-нибудь восьминожку просто дико. И когда ты в этом разберешься, то понимаешь, что проще писать однотипный макрос, а не подключать библиотеку. И так с большей частью периферии ардуины. Ну…если конечно есть цель экономить место, использовать мелкий контроллер или просто из спортивного интереса.

Так что если ты планируешь показывать такие примеры, то аплодирую стоя.

Oberstserj    
★★★★★★
Ubuntu / Firefox (NL)
Ответ на: комментарий от Oberstserj

Собственно в этом моя главная претензия к ардуине как проекту. Платформа подменяет развитие комфортом.

Именно

Если будешь заполнять этот пробел в информации, то это очень ценно.

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

JamesHolden    
★★★★★★★
Android / Chrome (BY)

Зачем на Linux Ардуно если есть HAL и LinuxCNC содержащее помимо ЧПУ инструменты для разработки самых разных автоматов?
Единственное чего этой платформе не хватает это разнообразной переферии позволяющей её применять самыми разными способами.

torvn77    
★★★
Android / Chrome (RU)
Ответ на: комментарий от JamesHolden

Как заставить людей изучать то что нужно.

Не надо никого заставлять. Обучение (умение разбираться) - это вопрос всегда двусторонний. Первая сторона - это доступная информация и/или хороший учитель, а вторая(ОБЯАТЕЛЬНАЯ) - желание ученика учиться и разбираться.

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

Лично я не верю, что кого-то можно заставить сесть и вникнуть в вопрос.

Oberstserj    
★★★★★★
Ubuntu / Firefox (NL)
Ответ на: комментарий от torvn77

Зачем на Linux Ардуно если есть HAL и LinuxCNC содержащее помимо ЧПУ инструменты для разработки самых разных автоматов?

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

Единственное чего этой платформе не хватает это разнообразной переферии позволяющей её применять самыми разными способами.

Лютое 4.2

Oberstserj    
★★★★★★
Ubuntu / Firefox (NL)
Ответ на: комментарий от Oberstserj

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

А вот 3 часть - про работу с эмулятором Ардуино. Очень интересный проект, обязательно надо о нем рассказать, а в качестве примера как раз - в этом эмуляторе есть восьминожечник ATtiny85, есть LCD1602, есть сдвиговик 74HC595.

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

JamesHolden    
★★★★★★★
Linux / Chrome (BY)
Ответ на: комментарий от Oberstserj

Да причем тут LinuxCNC, тут речь о микроконтроллерах, а не управлении с компа или одноплатника.

JamesHolden    
★★★★★★★
Linux / Chrome (BY)
Ответ на: комментарий от JamesHolden

Лучше разбери как на ардуине сделать электроэразионную дрель или нагреватель ВЧ токами, а так же mppt контроллер умеющий паралельно соединятся с своими собратьями.

torvn77    
★★★
Последнее исправление: torvn77 (всего исправлений: 1)

Android / Chrome (RU)
Ответ на: комментарий от torvn77

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

JamesHolden    
★★★★★★★
Android / Chrome (BY)
Ответ на: комментарий от JamesHolden

и сборку этого всего под линуксом без IDE.

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

а в качестве примера как раз - в этом эмуляторе есть восьминожечник ATtiny85, есть LCD1602, есть сдвиговик 74HC595.

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

Лойс!

Oberstserj    
★★★★★★
Ubuntu / Firefox (NL)
Ответ на: комментарий от torvn77

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

Oberstserj    
★★★★★★
Ubuntu / Firefox (NL)

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

Kaschenko    
★★★★★★
Linux / Yandex (RU)
Ответ на: комментарий от Oberstserj

Я говорю о том, что может быть интересно реальному рукастому человеку, это:

  1. Солнечные электростанции.
  2. Электроэрозионная дрель.
  3. Индукционная плавильня.
  4. Сборка собственного кондиционера.

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

torvn77    
★★★
Последнее исправление: torvn77 (всего исправлений: 1)

Android / Chrome (RU)
Ответ на: комментарий от torvn77

Блять. Ща. Выдохнул.

Торвн. Ты это, маленьким был? Срал мимо горшка? Мел в школе ел? Или, сука, собрал кондиционер по принципу Майсюченко, работающий от солнечной электростанции, которую ты электроэрозионной дрелью в индукционной печи выплавил на уроке труда, пока девочки пироги за стенкой пекли?

ЭТО, БЛЯТЬ, ОБУЧАЛКА ДЛЯ НАЧИНАЮЩИХ.

Глаза продери уже наконец.

Oberstserj    
★★★★★★
Ubuntu / Firefox (NL)
Ответ на: комментарий от Oberstserj

ЭТО, БЛЯТЬ, ОБУЧАЛКА ДЛЯ НАЧИНАЮЩИХ.

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

Возьмём например linuxcnc, при этом я надеюсь что ты перед своими бравурными ответами его хорошо изучишь и будешь отвечать зная предмет.

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

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

Так вот, "детский", обучающий вариант это не требующая больших вложений работа через LPT порт, а работа через контроллеры это уже "взрослое" использование системы, при этом даже обучающий вариант может быть использован для построения рабочих систем.
С моей точки зрения именно такой и должна быть разница между обучающей и рабочей системой.

А учить систему которая заведомо ничего не может создать кроме хренотени имхо безполезно и не интересно.

torvn77    
★★★
Android / Chrome (RU)
Ответ на: комментарий от torvn77

А если я тебе скину фото моего ноутбука, ты обведешь на них LPT порт? А то я что-то найти не могу

JamesHolden    
★★★★★★★
Android / Chrome (BY)
Ответ на: комментарий от JamesHolden

На ноутбуках его не ставят, он есть только на atx и matx материнках, в данный момент как правило в виде гребёнки.

torvn77    
★★★
Android / Chrome (RU)
Ответ на: комментарий от torvn77

Возьмём например linuxcnc, при этом я надеюсь что ты перед своими бравурными ответами его хорошо изучишь и будешь отвечать зная предмет.

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

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

Oberstserj    
★★★★★★
Ubuntu / Firefox (NL)
Ответ на: комментарий от Oberstserj

ЭТО, БЛЯТЬ, ОБУЧАЛКА ДЛЯ НАЧИНАЮЩИХ.

Это не обучалка, это очередное я-прочитал-википедию копирайтерство, оправдывающее свой низкий уровень якобы нацеленностью на начинающих. Таких полон интернет, слава Бже, что дальше «первой части» они обычно не движутся.

bo4ok    

Linux / Chrome (RU)
Ответ на: комментарий от bo4ok

Высрался? Пройди теперь мимо нахер.

Oberstserj    
★★★★★★
Ubuntu / Firefox (NL)
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)