В современной электронике, а особенно в проектах робототехники, широкое применение находят серводвигатели (сервомоторы), которые отличаются небольшими размерами, энергоэффективностью и точностью. Также они обеспечивают большой крутящий момент и могут передвигать или поднимать различные грузы. В данной статье мы рассмотрим подключение серводвигателя к плате STM32F103C8, также известной под названием STM32 Blue Pill ("синяя таблетка"). Для регулировки положения сервомотора будет использоваться потенциометр, а угол поворота оси сервомотора будет отображаться на экране ЖК дисплея 16х2.
Ранее на нашем сайте мы рассматривали подключение серводвигателя к следующим микроконтроллерам (платам):
- к микроконтроллеру AVR;
- к плате Arduino;
- к плате Raspberry Pi;
- к плате Raspberry Pi Pico;
- к модулю ESP8266.
Необходимые компоненты
- Плата разработки STM32F103C8 (STM32 Blue Pill) (купить на AliExpress).
- Сервомотор SG90 (купить на AliExpress).
- ЖК дисплей 16x2 (купить на AliExpress).
- Потенциометр – 2шт. (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Схема проекта
Схема подключения серводвигателя к плате STM32F103C8 (Blue Pill) представлена на следующем рисунке.
В плате STM32F103C8 имеется 10 контактов АЦП (PA0-PB1), из них мы будем использовать только один (PA3) для подключения потенциометра и установки с помощью него угла поворота серводвигателя.
Также плата STM32F103C8 содержит 15 ШИМ контактов (PA0, PA1, PA2, PA3, PA6, PA7, PA8, PA9, PA10, PB0, PB1, PB6, PB7, PB8, PB9), в нашем проекте мы будем использовать только один из них для подачи импульсов на ШИМ контакт сервомотора (обычно он оранжевого цвета).
Более подробно про использование АЦП и ШИМ в плате STM32F103C8 (Blue Pill) вы можете прочитать в следующих статьях:
Соединения между платой STM32F103C8 и ЖК дисплеем представлены в следующей таблице.
Плата STM32F103C8 | ЖК дисплей |
GND | VSS |
+5V | VDD |
средний контакт потенциометра | V0 |
PB0 | RS |
GND | RW |
PB1 | E |
PB10 | D4 |
PB11 | D5 |
PC13 | D6 |
PC14 | D7 |
+5V | A |
GND | K |
Соединения между платой STM32F103C8 и сервомотором представлены в следующей таблице.
Плата STM32F103C8 | Сервомотор |
+5V | RED (+5V) |
PA0 | ORANGE (PWM pin) |
GND | BROWN (GND) |
Также в нашей схеме мы использовали два потенциометра. Потенциометр в правой части схемы для регулировки контрастности ЖК дисплея, его центральный контакт подключен к контакту V0 дисплея. Потенциометр в левой части схемы используется для задания положения оси сервомотора, его левый контакт подключен к контакту 3.3V платы STM32F103C8, правый – к контакту GND платы, а центральный – к контакту PA3 платы.
Объяснение программы для платы STM32
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Программировать плату STM32 мы будем с помощью Arduino IDE через USB порт без использования FTDI программатора. Таким образом, она будет программироваться фактически также, как и обычные платы Arduino.
Первым делом в программе подключим библиотеки для работы с серводвигателем и ЖК дисплеем.
1 2 |
#include<Servo.h> #include<LiquidCrystal.h> |
Затем укажем контакты платы, к которым подключен ЖК дисплей и создадим объект для работы с ним. Также объявим контакты, к которым подключаются серводвигатель и потенциометр.
1 2 3 4 |
const int rs = PB0, en = PB1, d4 = PB10 , d5 = PB11 , d6 = PC13, d7 = PC14; LiquidCrystal lcd(rs,en,d4,d5,d6,d7); int servoPin = PA0; int potPin = PA3; |
Далее создадим объект класса Servo для работы с серводвигателем и прикрепим его к ранее указанному ШИМ контакту.
1 2 |
Servo servo; servo.attach(servoPin); |
После этого считаем аналоговое значение с контакта PA3 (контакт АЦП) и преобразуем его из аналогового напряжения (0-3.3) в цифровую форму (0-4095).
1 |
analogRead(potPin); |
Поскольку контакты АЦП у нас имеют 12-битное разрешение (диапазон чисел от 0 до 4096), а допустимый угол поворота оси серводвигателя у нас лежит в диапазоне (0-170), то для преобразования из диапазона значений на выходе АЦП (0-4096) в диапазон (0-170) разделим значение с выхода АЦП на 24. Эту задачу можно также выполнить с помощью функции map.
1 |
angle = (reading/24); |
И, наконец, дадим команду серводвигателю на поворот его оси на заданный угол.
1 |
servo.write(angle); |
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#include<Servo.h> //подключение библиотеки для работы с сервомотором #include<LiquidCrystal.h> // подключение библиотеки для работы с ЖК дисплеем const int rs = PB0, en = PB1, d4 = PB10 , d5 = PB11 , d6 = PC13, d7 = PC14; //укажем контакты, к которым подключен ЖК дисплей LiquidCrystal lcd(rs,en,d4,d5,d6,d7); //создадим объект для работы с ЖК дисплеем int servoPin = PA0; //контакт, с которого мы будем управлять сервомотором int potPin = PA3; //контакт, к которому подключен потенциометр Servo servo; // создаем объект для управления сервомотором void setup() { lcd.begin(16,2); //указываем тип ЖК дисплея 16x2 lcd.setCursor(0,0); //устанавливаем курсор в 1-й столбец 1-й строки lcd.print("CIRCUIT DIGEST"); //puts CIRCUIT DIGEST in LCD lcd.setCursor(0,1); // устанавливаем курсор в 1-й столбец 2-й строки lcd.print("SERVO WITH STM32"); //puts SERVO WITH STM32 in LCD delay(3000); // задержка 3 секунды lcd.clear(); // очищаем экран дисплея servo.attach(servoPin); // присоединяем объект сервомотора к заданному контакту } void loop() { lcd.clear(); // очищаем экран дисплея int angle; // переменная для хранения угла поворота сервомотора int reading; //переменная для хранения значения с выхода АЦП reading = analogRead(potPin); // считываем значение с выхода АЦП на контакте PA3 angle = (reading/24); // делим значение с выхода АЦП на 24 чтобы получить максимальный угол поворота 170 градусов servo.write(angle); // вращаем ось сервомотора на угол angle lcd.setCursor(0,0); // устанавливаем курсор в 1-й столбец 1-й строки lcd.print("ANGLE:"); //выводим слово ANGLE на ЖК дисплей lcd.print(angle); //выводим значение угла на ЖК дисплей delay(100); //задержка 100 мс } |
Подключение серводвигателя к STM32F103C8 (Blue Pill)
Все это здорово...а мне надо подключить 8 сервоприводов и четыре шаговика....и как ,выдержит она по питанию или все просядет...Для Ардуино есть специальные доп. платы развязки для подключения серв с отдельным питанием.....
Добрый день. Скорее всего, такое количество двигателей по питанию она не выдержит и нужно использовать аналогичные как и для Ардуино схемы развязки, а для управления шаговыми двигателями использовать микросхемы драйверов двигателей или готовые модули на их основе