Кодирование последовательных операций

Я использую 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);
}

, 👍0


2 ответа


5

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

Вот как это можно сделать с помощью двумерного массива:

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);
    }
}
,

2

Вы можете определить двумерный массив с именем 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}
};
,