Как вращать 3 серводвигателя, когда горят 6 светодиодов, используя сигналы ЭМГ

Я полный новичок в Arduino и пытаюсь сделать школьный проект, в котором я смогу управлять тремя пальцами с помощью серводвигателя, используя сигналы ЭМГ. Сейчас я могу считывать сигналы. Мне просто нужно изменить код так, чтобы, когда на моём устройстве для считывания ЭМГ загораются все шесть светодиодов, сервопривод поворачивался на 90 градусов. А когда все светодиоды погаснут, сервопривод возвращался в исходное положение, то есть поворачивался на 90 градусов. Мне очень нужна помощь. Вот код:

 #define NUM_LED 6  //устанавливает максимальное количество светодиодов
#define MAX 45     //максимально возможное значение. ИЗМЕНИТЕ ЭТО ЗНАЧЕНИЕ!!
int reading[10];
int finalReading;
byte litLeds = 0;
byte multiplier = 1;
byte leds[] = {8, 9, 10, 11, 12, 13};

void setup(){
  Serial.begin(9600); //начать последовательную связь
  for(int i = 0; i < NUM_LED; i++){ //инициализируем светодиоды как выходы
    pinMode(leds[i], OUTPUT);
  }
}

void loop(){
  for(int i = 0; i < 10; i++){    //снять десять показаний за ~0,02 секунды
    reading[i] = analogRead(A0) * multiplier;
    delay(2);
  }
  for(int i = 0; i < 10; i++){   //усреднить десять показаний
    finalReading += reading[i];
  }
  finalReading /= 10;
  for(int j = 0; j < NUM_LED; j++){  //записать все светодиоды в низкий уровень
    digitalWrite(leds[j], LOW);
  }
  Serial.print(finalReading);
  Serial.print("\t");
  finalReading = constrain(finalReading, 0, MAX);
  litLeds = map(finalReading, 0, MAX, 0, NUM_LED);
  Serial.println(litLeds);
  for(int k = 0; k < litLeds; k++){
    digitalWrite(leds[k], HIGH);
  }
  //для последовательной отладки раскомментируйте следующие две строки.
  //Serial.println(finalReading);
  //задержка(100);
}

Спасибо :)

, 👍0

Обсуждение

И в чем проблема?, @gre_gor

Почему бы не использовать линейный сервопривод с ЭМГ-обратной связью по частоте пульса?, @Tony Stewart Sunnyskyguy EE75


1 ответ


1

Помимо вашей проблемы (не определены константы), то, о чем вы спрашиваете, можно легко решить, обратившись к библиотеке сервоприводов.

Сервобиблиотека сообщает вам, что

  1. Необходимо включить заголовок библиотеки сервоприводов: #include <Servo.h>
  2. Вам необходимо добавить переменную для хранения объекта: Servo myservo;
  3. Вам необходимо прикрепить объект к штифту: myservo.attach(SERVO_PIN);
  4. Наконец, вы можете переместить двигатель в любое положение (0 <= x <= 180) с помощью синтаксиса myservo.write(val);

Таким образом, в вашем коде есть переменная litLeds, которая сообщает количество светодиодов. В частности, если у вас 6 (или больше) светодиодов, вы переместитесь на 90°, а если их 0 (или меньше — даже если это не имеет смысла), вы сбросите значение до 0. Полный код выглядит так:

#include <Servo.h>

int finalReading;
byte litLeds = 0;
byte multiplier = 1;
byte leds[] = {8, 9, 10, 11, 12, 13};
Servo myservo;

void setup(){
    Serial.begin(9600); //начать последовательную связь
    for(int i = 0; i < NUM_LED; i++){ //инициализируем светодиоды как выходы
        pinMode(leds[i], OUTPUT);
    }
    myservo.attach(SERVO_PIN);
    myservo.write(0);
}

void loop(){
    for(int i = 0; i < 10; i++){    //снять десять показаний за ~0,02 секунды
        reading[i] = analogRead(A0) * multiplier;
        delay(2);
    }
    for(int i = 0; i < 10; i++){   //усреднить десять показаний
        finalReading += reading[i];
    }
    finalReading /= 10;
    for(int j = 0; j < NUM_LED; j++){  //записать все светодиоды в низкий уровень
        digitalWrite(leds[j], LOW);
    }
    Serial.print(finalReading);
    Serial.print("\t");
    finalReading = constrain(finalReading, 0, MAX);
    litLeds = map(finalReading, 0, MAX, 0, NUM_LED);
    Serial.println(litLeds);
    for(int k = 0; k < litLeds; k++){
        digitalWrite(leds[k], HIGH);
    }
    if (litLeds >= 6)
        myservo.write(90);
    else if (litLeds <= 0)
        myservo.write(0);

    //для последовательной отладки раскомментируйте следующие две строки.
    //Serial.println(finalReading);
    //задержка(100);
}

Обратите внимание, что некоторые define отсутствуют (например, MAX, NUM_LED и SERVO_PIN)

,