Установка PlatformIO для работы с Arduino Uno
Как уже указывалось, ядро PlatformIO написано на Python 2.7, поэтому PlatformIO не поддерживает Python 3. В связи с этим рекомендуется установить Python версии 2 и затем переходить к установке PlatformIO IDE. PlatformIO представляет собой интегрированную среду разработки (IDE) и содержит в себе еще дополнительные инструменты (плагины, расширения) для работы с другими популярными IDE.
Можно произвести установку PlatformIO с такими текстовыми редакторами как Atom и Visual Studio Code. Нужно выбрать один из них. Если вы хотите больше кастомизации, всяких крутых плагинов и экспериментов – выбирайте Atom, если же вам нужно просто красивую, удобную IDE с отличным автодополнением кода из коробки, выбирайте Visual Studio Code. В этой статье мы выбрали Visual Studio Code.
Перейдем к установке PlatformIO для последующей разработки в ней кода для Arduino Uno.
Вначале установите Visual Studio Code с ее официального сайта. Ее установка ничем не отличается от установки обычных программ для Windows, поэтому здесь процесс ее установки мы рассматривать не будем.
Когда Visual Studio Code будет установлена она будет выглядеть примерно следующим образом:
Следующим шагом мы будем устанавливать PlatformIO используя VS Code Extensions (расширения кода для Visual Studio). Для этого в левом сайдбаре выберите квадратную иконку (пятую по счету если считать сверху) как показано на следующем рисунке. После клика на этой иконке в основном окне появится окно поиска (search box), в котором вы можете найти расширения для большинства известных языков программирования: C/C++, C#, Python, PHP, Go, JavaScript, TypeScript, Node.js и т.д.
Запустите в этом окне поиск “PlatformIO”, в результате этого вы увидите иконку PlatformIO с именем и описанием. Просто кликните на ней и установите PlatformIO. При этом может потребоваться некоторое время для установки наборов инструментов и других дополнений.
Когда процесс установки будет завершен, вы увидите интерфейс, показанный на следующем рисунке. Интерфейс включает все необходимые компоненты: New Project (новый проект), Import Arduino Project (импортировать Arduino проект), Open Project (открыть проект), Project Examples (примеры проектов) и т.д. После установки PlatformIO рекомендуется перезапустить Visual Studio Code Editor.
После этого PlatformIO будет готова к использованию. В ней мы запустим простую программу мигания светодиодом и загрузим ее в плату Arduino Uno.
Программирование STM32 с помощью PlatformIO
Для поклонников микроконтроллеров, построенных на основе платформы STM32, мы в данной статье рассмотрим их программирование с помощью PlatformIO. Процесс программирования STM32 будет практически таким же, как и рассмотренная процедура программирования Arduino UNO с помощью PlatformIO. Различие будет состоять в том, что необходимо будет выбрать соответствующую плату STM32 когда будете создавать новый проект для STM32. Достоинством PlatformIO в данном случае является то, что при работе в ней нет необходимости отдельно скачивать какие либо внешние пакеты для работы с любой платой, PlatformIO скачивает все необходимые пакеты автоматически, поэтому нам необходимо просто выбрать плату и затем можно переходить к редактору. Мы будем использовать внешний JLink/ JTAG/ STLink/ Serial Programmer чтобы загружать скетч в STM32. Также следует отметить, что STM32 можно программировать и с помощью Arduino IDE.
Чтобы произвести программирование STM32 с помощью PlatformIO выполните следующую последовательность шагов.
Дайте имя новому проекту – мы его назвали ‘Blink STM32’. Затем выберите необходимую плату STM32 – в нашем случае это ‘BluePill F103C8(Generic)’. Выберите фреймворк для Arduino. После заполнения всех полей нажмите на Finish и подождите некоторое время пока проект создастся и загрузит все необходимые пакеты для работы с STM32.
Повторное создание проекта для работы с STM32 произойдет гораздо быстрее потому что все необходимые пакеты будут уже загружены при создании первого проекта. Теперь перейдите в пункт меню Untitled(Workspace) -> src -> main.cpp как мы это уже рассматривали ранее в статье при работе с платой Arduino.
Следующим шагом идет выбор программатора – он весьма важный. Для программирования плат STM32 могут быть использованы такие программаторы как JTAG, STLink, JLink, Serial и т.п. Все они рабочие, но вам необходимо соответствующим образом сконфигурировать страницу конфигурации ‘platformio.ini’
В этом проекте мы используем программатор Serial Programmer CP210x USB to UART Bridge. Подсоедините этот последовательный программатор к плате STM32 (как показано в следующей таблице) и к вашему компьютеру.
USB to Serial Programmer | STM32 Board |
5V | 5V |
Gnd | Gnd |
Rx | A9 |
Tx | A10 |
После этого перейдите в менеджер проектов (project explorer), откройте в нем страницу ‘platformio.ini’ и внесите в нее изменения как показано на следующем рисунке. Протокол загрузки кода (upload_protocol) определяет какой программатор следует использовать ((STLink, JLink, Serial и т.д.). В качестве параметра upload_port следует указать используемый вами COM порт. Вы можете изменить/выбрать используемый COM порт в пункте меню ‘Devices’ на главной странице PlatformIO.
После этого перейдите в ‘main.cpp’ и напишите/измените программу мигания светодиодом. Далее загрузите код программы в плату. В случае успешной загрузки кода будут показаны параметры его загрузки. После загрузки кода вы сможете наблюдать мигание светодиода, подключенного к контакту PC13 платы STM32.
Connecting A Pushbutton
you release, the resistor provides 5 volts on the pushbutton
pin. Without the
resistor, the voltage could remain at zero. It is called a
«pullup» because it serves to pull the voltage back up when
you are not pressing the button.
You can verify the circuit works by connecting a voltmeter.
The red lead connects to the pushbutton pin and the black
lead connects to ground. Here is what you should see on
the meter.
Button Not Pressed | Button Pressed |
---|---|
It may seem strange to have zero when the button is pressed and
have 5 volts when it is released. This is called «active low»,
because the signal is low when the condition is happening. Active
low signals are very common practice in electronics, especially
for pushbuttons.
When you are confident the pushbutton circuit works, just connect
it to any unused pin. In this photo, it is connected to pin 7.
Синтаксис функции
pinMode(<номер пина>, <тип>)
Функция не возвращает значения.
Описание параметров
В параметре <номер пина> указываем порт, который хотим сконфигурировать. Как правило, функция используется для установки цифровых пинов, т.к. аналоговые пины ардуино чаще всего используются как входные, а входной режим используется Arduino по умолчанию.
В параметре <тип> указываем тип режима работы пина (более подробно о возможных режимах мы поговорим чуть позже).
Константы INPUT, OUTPUT и INPUT_PULLUP
В Ardino предусмотрены константы, обозначающие варианты типов:
- INPUT (значение по умолчанию);
- OUPUT;
- INPUT_PULLUP.
Примеры использования
- pinMode(13, OUTPUT); // Установили 13 пин как выход
- pinMode(2, INPUT); // Так делать не надо. По умолчанию, все пины работают в режиме входа.
Serial Monitor & Serial.print
void setup() { Serial.begin(38400); } void loop() { Serial.println("Hello World"); delay(1000); }
Inside the setup function, «Serial.begin(38400)» initializes the
communication. The number 38400 is the baud rate. The Teensy
always uses USB speeds, so this number doesn’t matter.
Then you can use Serial.print and Serial.println to send information.
This example just sends «Hello World» every second.
To actually see the messages, click the Serial Monitor button.
printing as your program runs.
create programs that do different actions based on real world input,
Serial.print becomes much more useful.
Создание приложения обработки прерывания от кнопки
Push buttonСветодиод36Кнопка38
dotnet-led-buttondotnet new console -o dotnet-led-button
\Projects\dotnet-led-button\
Шаг 3 — Добавление контроллера управления GPIO c драйвером LibGpiodDriver
Описание кода:
- controller.OpenPin(LED_PIN,PinMode.Output) — открывает контакт светодиода, и выставляет режим работы на — вывод;
- controller.OpenPin(BUTTON_PIN,PinMode.Input) — открывает контакт кнопки, и выставляет режим работы на — ввод (сигнал поступает от кнопки.
CallbackCallback
Описание кода:
Шаг 5 — Публикация для архитектуры ARM
\Projects\dotnet-led-button\
\Projects\dotnet-led-button\bin\Release\net5.0\linux-arm\publish\
\Projects\dotnet-led-button\bin\Release\net5.0\linux-arm64\publish\
Quick recap about pinMode
With Arduino you can use digital pins to either read (binary) data from a sensor, or write (binary) data to an actuator.
It’s quite simple. Either you set the pin as:
You are learning how to use Arduino to build your own projects?
Check out Arduino For Beginners and learn step by step.
Get this course for FREE for 14 days! Just click on the link above.
- OUTPUT: this is to write data to an actuator, for example an LED.
- INPUT: in this case you’re going to read data from the sensor. The value you’ll get will be HIGH or LOW (binary).
And… There’s also a 3rd option: INPUT_PULLUP. This option is the same as INPUT (you read data from the sensor), but in addition to that, an internal pull up resistor – between 20k and 50k Ohm – is enabled, to keep the signal HIGH by default.
What does that mean?
Well, let’s see with 3 different circuits doing the same thing: reading data from a push button.
Справочник языка Ардуино
Операторы
Синтаксис
Битовые операторы
|
ДанныеТипы данных
sizeof() Библиотеки
|
ФункцииЦифровой ввод/вывод
Аналоговый ввод/вывод
Только для Due
Расширенный ввод/вывод
Время
Математические вычисления
Тригонометрия
Случайные числа
Биты и байты
Внешние прерывания
Прерывания
|
Дребезг контактов
Очевидно, что при подаче на вход внешнего прерывания сигнала, искаженного дребезгом контактов, обработчик прерывания будет выполнен несколько раз. В некоторых случаях дребезг не является проблемой, например, если мы ожидаем нажатия на кнопку для выполнения в программе каких-либо действий: достаточно отключить отслеживание данного прерывания при входе в обработчик, а после выполнения нашего кода снова включить (подразумевается, что время выполнения наших действий превышает длительность дребезга контактов). Таким образом мы пропустим дребезг и обработчик будет выполнен только один раз. Другое дело, когда прерывания используются для регистрации событий. Хороший пример — механический энкодер вращения. В этом случае мы не можем отключить отслеживание прерываний, поскольку рискуем пропустить событие (импульс от энкодера). Принять решение о том, ложный это импульс или нет, обработчик не может, да и просто это не та задача, которой он должен заниматься. Поэтому единственным рациональным решением является применение аппаратных подавителей дребезга. Данной теме посвящены несколько моих публикаций, ссылки на них ниже:
Устранение дребезга контактов. Часть 1 — триггер ШмиттаУстранение дребезга контактов. Часть 2 — микросхема MC14490Устранение дребезга контактов. Часть 3 — микросхемы MAX6816/MAX6817/MAX6818
Использование интерфейса SPI в Arduino
Перед тем как начать обмен данными между двумя платами Arduino по протоколу SPI давайте рассмотрим основные принципы работы с библиотекой SPI (SPI library) в Arduino IDE.
Для того чтобы подключить использование этой библиотеки в программе применяется простая команда #include<SPI.h>. Далее для задействования протокола SPI в плате Arduino необходимо выполнить следующую последовательность шагов:
1. SPI.begin()
Инициализирует шину SPI при помощи установки режимов работы контактов SCK, MOSI и SS на вывод данных, подачи на контакты SCK и MOSI напряжения низкого уровня (low), а на контакт SS – напряжения высокого уровня (high).
2. SPI.setClockDivider(divider)
Используется для установки делителя (коэффициента деления) для сигнала синхронизации SPI по отношению к тактовой частоте микроконтроллера в плате Arduino. Можно использовать делители 2, 4, 8, 16, 32, 64 или 128.
Обозначение делителей:
• SPI_CLOCK_DIV2
• SPI_CLOCK_DIV4
• SPI_CLOCK_DIV8
• SPI_CLOCK_DIV16
• SPI_CLOCK_DIV32
• SPI_CLOCK_DIV64
• SPI_CLOCK_DIV128
3. SPI.attachInterrupt(handler)
Включает режим прерываний в ведомом (slave) устройстве. Прерывание будет возникать каждый раз, когда ведомое устройство будет принимать данные от ведущего (master) устройства.
4. SPI.transfer(val)
Эта функция используется для одновременного приема и передачи данных между ведущим и ведомым.
Arduino Internal Pull-up Resistor Tutorial
The following tutorial demonstrates how you can use INPUT_PULLUP with pinMode(), by monitoring the state of a switch through establishing a serial communication between your Arduino and PC.
Hardware Configurations:
Developed using Fritzing, For more circuit exmaples, do head here
- Connect two wires to the Arduino board
- Black wire connects ground to one leg of the pushbutton
- Second wire connects digital pin 2 to the other leg of the pushbutton
Software Configurations with Arduino Code
Step 1: Establish 9600 bits of data between your Arduino and your PC by entering the code below:
Step 2: Initialize digital pin 2 as an input with the internal pull-up resistor enabled:
Step 3: Enter the following line, making pin 13, with the onboard LED an output
Step 4: Establish a variable to hold the information coming in from your switch:
Step 5: Once your Arduino has read the input, make it print this information back to the computer by entering this code:
Now, when you open your Serial Monitor, you’ll see a stream of “0” if your switch is closed and a stream of “1” if your switch is open. The LED on pin 13 will illuminate when the switch is “High”, and turn of when it’s “Low” as well.
For the full Arduino code, you can head here
Объяснение программы для Arduino
Полный текст программы приведен в конце статьи, здесь же мы рассмотрим его основные фрагменты.
1. Сначала в программе нам необходимо подключить библиотеку для работы с ЖК дисплеем и инициализировать используемые контакты.
Arduino
#include<LiquidCrystal.h>
LiquidCrystal lcd (7,8,9,10,11,12); // Define LCD display pins RS, E, D4, D5, D6, D7
1 2 |
#include<LiquidCrystal.h>
LiquidCrystallcd(7,8,9,10,11,12);// Define LCD display pins RS, E, D4, D5, D6, D7 |
2. Внутри функции void setup () мы на экране ЖК дисплея покажем пару приветственных сообщений.
Arduino
lcd.begin(16,2);
lcd.setCursor(0,0);
lcd.print(«CIRCUIT DIGEST»);
lcd.setCursor(0,1);
lcd.print(«ArduinoInterrupt»);
delay(3000);
lcd.clear();
1 2 3 4 5 6 7 |
lcd.begin(16,2);
lcd.setCursor(,); lcd.print(«CIRCUIT DIGEST»); lcd.setCursor(,1); lcd.print(«ArduinoInterrupt»); delay(3000); lcd.clear(); |
3. Также в функции void setup () необходимо задать режим работы для контакта D13 (к нему подключен светодиод) – на вывод данных.
Arduino
pinMode(13,OUTPUT);
1 | pinMode(13,OUTPUT); |
4. Далее следует такая важная часть для нашей программы, как использование функции attachInterrupt() – это тоже происходит в функции void setup().
Arduino
attachInterrupt(digitalPinToInterrupt(2),buttonPressed1,RISING);
attachInterrupt(digitalPinToInterrupt(3),buttonPressed2,RISING);
1 2 |
attachInterrupt(digitalPinToInterrupt(2),buttonPressed1,RISING);
attachInterrupt(digitalPinToInterrupt(3),buttonPressed2,RISING); |
В первой из этих команд контакт 2 назначается для обработки внешнего прерывания, а функция buttonPressed1 будет вызываться всегда, когда будет происходить повышение уровня (с LOW до HIGH) на контакте D2. Контакт 3 назначается для обработки внешнего прерывания, а функция buttonPressed2 будет вызываться всегда, когда будет происходить повышение уровня (с LOW до HIGH) на контакте D3.
5. Внутри функции void loop() число i инкрементируется начиная с 0 и выводится на экран ЖК дисплея.
Arduino
lcd.clear();
lcd.print(«COUNTER:»);
lcd.print(i);
++i;
delay(1000);
1 2 3 4 5 |
lcd.clear();
lcd.print(«COUNTER:»); lcd.print(i); ++i; delay(1000); |
Также в функции void loop() функция digitalWrite() включает или выключает светодиод (в зависимости от состояния переменной output), подключенный к контакту D13.
6. Наиболее важная часть нашей программы – это создание функции для обработки прерывания, имя этой функции было определено при вызове функции attachInterrupt().
Поскольку в нашей программе мы используем 2 контакта для обработки прерываний, то, следовательно, нам понадобится и две функции для обработки прерываний.
Arduino
void buttonPressed1()
{
output = LOW;
lcd.setCursor(0,1);
lcd.print(«Interrupt 1»);
}
1 2 3 4 5 6 |
voidbuttonPressed1()
{ output=LOW; lcd.setCursor(,1); lcd.print(«Interrupt 1»); } |
Эта функция будет выполняться когда будет происходить повышение уровня на контакте D2. Эта функция будет изменять состояние переменной output на LOW, что будет приводить к выключению светодиода, а также будет выводить сообщение “interrupt1” на экран ЖК дисплея.
Arduino
void buttonPressed2()
{
output = HIGH;
lcd.setCursor(0,1);
lcd.print(«Interrupt2»);
}
1 2 3 4 5 6 |
voidbuttonPressed2()
{ output=HIGH; lcd.setCursor(,1); lcd.print(«Interrupt2»); } |
Эта функция будет выполняться при нажатии кнопки подключенной к контакту D3. Эта функция будет изменять состояние переменной output на HIGH, что будет приводить к включению светодиода, а также будет выводить сообщение “interrupt2” на экран ЖК дисплея.
Принципы работы интерфейса SPI
Для работы по принципу ведущий/ведомый (master/Slave) протокол SPI использует 4 линии (провода). В этом протоколе ведущий всегда один, а ведомых может быть несколько. В качестве ведущего устройства обычно выступает микроконтроллер, а в качестве ведомых устройств могут выступать микроконтроллеры, датчики, АЦП, ЦАП, ЖК дисплеи и т.д.
На следующем рисунке показан принцип работы протокола SPI с одним ведущим (Master) и одним ведомым (Slave).
SPI интерфейс для своей работы использует 4 линии – MISO, MOSI, SS, and CLK. Их назначение следующее:
- MISO (Master in Slave Out) – линия ведомого для передачи данных ведущему;
- MOSI (Master Out Slave In) – линия ведущего для передачи данных ведомому;
- SCK (Serial Clock) – по этой линии передаются сигналы (импульсы) синхронизации, формируемые ведущим;
- SS (Slave Select) – ведущий (Master) может использовать эту линию для включения и выключения определенных устройств (ведомых).
На следующем рисунке показан принцип работы протокола SPI с одним ведущим (Master) и несколькими ведомыми (Slave).
Чтобы начать связь (взаимодействие) между ведущим и ведомым нам необходимо установить на контакте ведомого Slave Select (SS) напряжение низкого уровня чтобы он мог взаимодействовать с ведущим. Когда на этом контакте напряжение высокого уровня (high) ведомый игнорирует ведущего. Это позволяет иметь множество ведомых устройств, работающих по протоколу SPI, использующих одни и те же (общие) линии MISO, MOSI и CLK ведущего устройства. Как вы можете видеть из представленного рисунка для 4-х ведомых устройств линии SCLK, MISO, MOSI общие для соединения с ведущим, а линии (контакты) SS каждого ведомого устройства подключены к отдельным контактам SS (SS1, SS2, SS3, SS4) ведущего устройства. При помощи установки на требуемом контакте SS напряжения низкого уровня (LOW) ведущий (master) может взаимодействовать с нужным ему ведомым (slave).
Программирование Arduino Uno с помощью PlatformIO
Мы рассмотрим программирование платы Arduino Uno с помощью PlatformIO на примере простой программы мигания светодиодом. Для этого выполните следующую последовательность шагов.
Выберите в PlatformIO вкладку “New Project” (новый проект) из меню быстрого доступа.
Дайте имя проекту (в нашем случае мы назвали его ‘Blink’). Выберите тип платы, с которой будете работать – в нашем случае это Arduino Uno. Поскольку мы собираемся работать во фреймворке Arduino, то в поле фреймворк (framework) необходимо выбрать Arduino. После заполнения всех полей нажмите Finish.
Подождите некоторое время пока ваш новый проект создастся и “подтянет” к себе необходимые ресурсы и расширения.
Когда проект успешно создастся вы увидите всплывающее сообщение “Project has been successfully initialized” как показано на следующем рисунке.
Чтобы открыть созданный проект пролистайте вниз Home Menu (главное меню) PlatformIO и вы увидите список всех созданных проектов. В правой стороне напротив интересующего вас проекта нажмите ссылку ‘Open’ чтобы перейти к редактированию проекта.
Когда проект будет открыт первоначально он будет отображаться как скрытый, но не беспокойтесь, PlatformIO имеет весьма продвинутые опции для работы с файлами, поэтому вы без труда найдете все файлы проекта. Просто идите в левый верхний угол и нажмите там ‘Untitled (Workplace)’. Когда вы нажмете эту ссылку, все файлы проекта появятся в выпадающем меню. Чтобы открыть окно редактирования кода, выберите в выпавшем списке ‘src’ и затем ‘main.cpp’. Окно редактора кода появится в главном экране (Home Screen) с открытием новой вкладки (Tab). После этого вы сможете писать/редактировать код вашей программы.
Напишите код программы для простого мигания светодиодом в плате Arduino Uno. Следует отметить, что PlatformIO по умолчанию не имеет прямого доступа к библиотекам Arduino, поэтому для написания даже самой простой программы (не требующей никаких библиотек) всегда добавляйте строку “#include <Arduino.h>” в самом начале программы.
Следующим шагом будет компиляция и загрузка кода программы в плату Arduino Uno. PlatformIO изначально выбирает тот COM порт, который стоит в системе по умолчанию. Но если это не тот COM порт, который вам нужен, то его можно изменить – это будет объяснено далее в статье. PlatformIO имеет такие функции для работы с кодом программы как Build, Upload, Upload to Remote Device (загрузка в удаленное устройство), Clean, Test, Run Task, Serial Monitor, New Terminal. Все эти функции доступны в левом нижнем углу редактора как показано на следующем рисунке. Когда вы будете наводить мышкой на иконки этих функций, то будет показываться их описание.
Чтобы скомпилировать скетч нажмите на ‘Build’, а чтобы загрузить его в плату Arduino – нажмите на ‘Upload’. Когда загрузка кода в плату будет закончена вы сможете увидеть время, которое потребовалось для загрузки кода, и другие параметры загрузки. Также появится сообщение “Success” (успех). Когда загрузка кода программы в плату будет закончена вы сможете увидеть результат работы программы.
Чтобы выбрать или изменить COM порт, перейдите на главный экран (Home Screen) PlatformIO, выберите там пункт меню Devices (устройства) как показано на следующем рисунке. После этого вы увидите все доступные (подключенные) устройства. Выберите нужный вам COM порт.
Логические переменные и операторы[]
Логические переменные — это переменные типа boolean. Этот тип данных обладает диапозоном из всего лишь двух возможных значений: true и false. В переводе с английского — истина и ложь. Так же их иногда записывают как 1 и , соответственно. Этими переменными можно описывать различные бинарные состояния: включен/выключен, вращать/не вращать, светить/ не светить.
Для переменных этого типа определены некоторые операции: логическое сложение (дизъюнкция) ||, так же называемое операцией ИЛИ, логическое произведение (конъюнкция) &&, так же называемое операцией И, и логическое отрицание обозначающееся как !.
Возьмем две переменные А и В. Ниже приведены таблицы для каждой операции.
Значение А | Значение B | A||B | А&&В | !A | !В |
---|---|---|---|---|---|
1 | 1 | 1 | 1 | ||
1 | 1 | 1 | |||
1 | 1 | 1 | |||
1 | 1 |
С помощью этих операций можно составлять условия для рассмотрения различных ситуаций. Рассмотрим создание таких условий на примере схемы с использованием кнопки. Так как у кнопки всего два состояния, boolean идеально подходит для описания её состояния.