Привет, друзья! 🛠🤖
Сегодня у нас на повестке дня особенно интересная и сложная тема: управление массивом сервоприводов при помощи Arduino. Не пугайтесь его сложности, мы вместе разберём этот код шаг за шагом, чтобы сделать его понятным даже начинающим. Этот код является частью проекта-победителя конкурса Школа Реальных Дел 2023 https://vk.com/wall-150494366_1304
#include <Servo.h>
Servo part0;
Servo part1;
Servo part2;
Servo part3;
Servo part4;
Servo part5;
Servo part6;
Servo part7;
Servo servos[] = { part0, part1, part2, part3, part4, part5, part6, part7};
int servosCurrentPos[] = { 90, 90, 90, 90, 90, 90};
int servosTargetPos[] = { 90, 90, 90, 90, 90, 90};
uint32_t servosTimer[] = { 0, 0, 0, 0, 0, 0 };
int sDelay = 30;
uint32_t servosDelay[] = { sDelay, sDelay, sDelay, sDelay, sDelay, sDelay };
void servoPosControl() {
for (int i = 0; i <= 7; i++) {
if (millis() - servosTimer[i] > servosDelay[i]) {
int delta = servosCurrentPos[i] == servosTargetPos[i] ? 0 : (servosCurrentPos[i] < servosTargetPos[i] ? 1 : -1);
servosCurrentPos[i] += delta;
servosTimer[i] = millis();
servos[i].write(servosCurrentPos[i]);
}
}
}
void parseSerialInput() {
String inputString = "";
int inputArray[8];
int inputIndex = 0;
while (Serial.available() > 0) {
delay(1);
char inChar = Serial.read();
if (inChar == '|') {
Serial.println(inputString);
char* ptr = strtok(inputString.c_str(), ";");
while (ptr != NULL && inputIndex < 3) {
inputArray[inputIndex] = atoi(ptr);
inputIndex++;
ptr = strtok(NULL, ";");
}
for (int i = 0; i <= 7; i++) {
servosTargetPos[i] = inputArray[i];
}
inputString = "";
inputIndex = 0;
} else if (isdigit(inChar) || inChar == ';') {
inputString += inChar;
}
}
}
void setup() {
part0.attach(30);
part1.attach(32);
part2.attach(34);
part3.attach(36);
part4.attach(38);
part5.attach(40);
part6.attach(42);
part7.attach(44);
}
void loop() {
parseSerialInput();//функция принимает на вход из Serial Monitor строку вида 90;90;90;90;90;90;90;90| и переводит все сервоприводы в указанное положение
servoController();
}
Код, который вы видите выше, создан для управления до 8 сервоприводов. Это может быть полезно в робототехнике для создания сложных механизмов, таких как манипуляторы.
Вот краткое разъяснение основных частей кода:
Объявление Сервоприводов: В начале кода вы видите 8 отдельных объектов класса Servo. Эти объекты будут управлять каждым из сервоприводов.
Массивы и Таймеры: Следующие массивы и переменные используются для хранения текущего положения сервопривода, целевого положения и времени последнего изменения для возможности контролировать скорость движения каждого из них.
Функция servoPosControl(): Эта функция отвечает за плавное перемещение сервоприводов от их текущего положения к целевому. Она проверяет, необходимо ли изменить положение, и если да, то изменяет его на 1 градус в нужном направлении.
Функция parseSerialInput(): Эта функция читает данные из Serial Monitor. Вы можете отправить строку вида 90;90;90;90;90;90;90;90|, и сервоприводы будут переведены в указанные положения.
Функция setup(): Здесь настраиваются пины для каждого сервопривода.
Функция loop(): Основной цикл программы вызывает функцию parseSerialInput(), которая затем применяет команды к сервоприводам через servoController().
Этот код может выглядеть сложным, но он красиво иллюстрирует, как можно эффективно управлять множеством сервоприводов. Он может быть основой для различных робототехнических проектов.
Если у вас есть вопросы или нужна дополнительная помощь в понимании какой-либо части кода, пожалуйста, пишите в комментарии.
Удачного программирования! 🚀👩💻👨💻