Кодирование последовательных операций
Я использую Arduino r4 Wi-Fi для управления уникальными настройками угла для двух разных серводвигателей во время выполнения и работы устройства, которое я создаю.
Я хочу, чтобы сервоприводы использовали разные наборы значений угла для каждой из двадцати последовательных операций. Я могу написать код для одной операции одну за другой двадцать раз, но хотел бы сократить количество строк кода и сделать его более эффективным. например;
- 1-я операция с использованием углов: сервопривод 1 (25); и сервопривод 2 (65);
- 2-я операция с использованием углов: сервопривод 1 (40); и сервопривод 2 (60);
Какой подход к кодированию можно использовать для извлечения двух углов из списка из двадцати наборов парных углов? Я пробовал использовать функции, но безуспешно. Поскольку я новичок в программировании Arduino, мне нужны предложения по работоспособному и более эффективному способу кодирования, чем тот, который я использую сейчас.
#include <Servo.h>
Servo servo1;
Servo servo2;
Servo servo3;
void setup() {
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
servo1.attach(9);
servo2.attach(10);
servo3.attach(11);
servo1.write(0);
servo2.write(0);
}
void loop() {
digitalWrite(12, HIGH);
delay(2000);
digitalWrite(12, LOW);
delay(7000);
digitalWrite(12, HIGH);
delay(500);
digitalWrite(12, LOW);
delay(4500);
servo1.write(25);
servo2.write(65);
servo3.write(34);
delay(4000);
servo1.write(0);
servo2.write(0);
delay(2000);
digitalWrite(12, HIGH);
delay(2000);
digitalWrite(12, LOW);
delay(7000);
digitalWrite(12, HIGH);
delay(500);
digitalWrite(12, LOW);
delay(4500);
servo1.write(40);
servo2.write(60);
servo3.write(34);
delay(4000);
servo1.write(0);
servo2.write(0);
delay(2000);
}
@user1363363, 👍0
2 ответа
Когда вы хотите повторить ту же самую операцию с другими данными, где данные следуют заданной последовательности, наиболее удобным решением является Обычно используется для итерации по массиву. Можно использовать отдельный массив для каждого сервопривода или, в качестве альтернативы, один двумерный массив, каждый элемент которого представляет собой двухэлементный массив с позициями двух сервоприводов.
Вот как это можно сделать с помощью двумерного массива:
const int angle_count = 20;
const uint8_t angles[angle_count][2] = {
{90, 90}, // первое положение сервопривода, затем второе положение сервопривода
{110, 90},
// и т. д...
};
void loop() {
for (int i = 0; i < angle_count; i++) {
servo1.write(angles[i][0]);
servo2.write(angles[i][1]);
delay(500);
}
}
Вы можете определить двумерный массив с именем servoAngles[20][2], который содержит 20 наборов из двух углов.
const int servoAngles[20][2] = {
{25, 65},
{40, 60},
{30, 55},
{45, 50},
{35, 70},
{50, 65},
{28, 58},
{42, 62},
{33, 53},
{47, 67},
{26, 66},
{41, 61},
{32, 52},
{46, 56},
{36, 72},
{51, 63},
{29, 59},
{43, 63},
{34, 54},
{48, 68}
};
- Невозможно преобразовать 'int (*)[size]' в 'int**': Cannot convert 'int (*)[size]' to 'int**'
- Как удалить элемент из массива arduino?
- Есть ли функция Adafruit для инвертирования цветов моего экрана для языка Arduino?
- Как передать несколько переменных в функцию?
- Как вернуть значение массива символов в функции Arduino IDE?
- Проблема с функцией, имеющей параметр со значением по умолчанию
- Ошибка: Переменная или поле объявлены недействительными
- Как получить переменную из функции обратного вызова?