Как вращать 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);
}
Спасибо :)
@Miraj, 👍0
Обсуждение1 ответ
Помимо вашей проблемы (не определены константы), то, о чем вы спрашиваете, можно легко решить, обратившись к библиотеке сервоприводов.
Сервобиблиотека сообщает вам, что
- Необходимо включить заголовок библиотеки сервоприводов:
#include <Servo.h> - Вам необходимо добавить переменную для хранения объекта:
Servo myservo; - Вам необходимо прикрепить объект к штифту:
myservo.attach(SERVO_PIN); - Наконец, вы можете переместить двигатель в любое положение (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)
- устаревшее преобразование из строковой константы в 'char*'
- Tower Pro MG996R сервопривод с высоким крутящим моментом 180 °, управляющий с помощью Arduino
- Какие есть другие IDE для Arduino?
- Esp8266 Vin контакт
- Как синхронно управлять двумя сервоприводами?
- Плата для разработки STM8 с Arduino IDE
- Бесполезная проводка коробки и код
- Поскольку double и float представляют один и тот же тип данных (обычно), что предпочтительнее?
И в чем проблема?, @gre_gor
Почему бы не использовать линейный сервопривод с ЭМГ-обратной связью по частоте пульса?, @Tony Stewart Sunnyskyguy EE75