Как запустить несколько двигателей постоянного тока по разным схемам?

Я полный новичок в программировании и надеюсь, что кто - то сможет помочь мне здесь. Я занимаюсь тактильным исследовательским проектом, где 8 монетных вибрирующих двигателей постоянного тока будут установлены на пальцах испытуемых (исключая большие пальцы), и испытуемый должен ответить на количество пальцев, на которых он чувствует вибрации.

Каждое испытание должно иметь различную схему выходов, скажем: в первом испытании активируются 4 двигателя-двигатель 1, двигатель 5, двигатель 8 и двигатель 3. В одном испытании двигатели должны иметь общую задержку в 150 мс и перерыв в 4 секунды после следующего запуска.

Мой вопрос заключается в том, что в 8 двигателях возможны 255 различных паттернов активации. Как определить все эти 255 паттернов и рандомизировать их последовательность? Я использую мега-плату и подключаю каждый двигатель к ШИМ-контакту, и все они имеют общую землю.

Вот пример кода с 3 такими комбинациями (здесь подключено только семь двигателей):

#define viboutpin 2
#define viboutpin1 3
#define viboutpin2 4
#define viboutpin3 5
#define viboutpin4 6
#define viboutpin5 7
#define viboutpin6 8


void setup() {
     pinMode(viboutpin,OUTPUT);// определить контакт как выход
     pinMode(viboutpin1,OUTPUT);
     pinMode(viboutpin2,OUTPUT);
     pinMode(viboutpin3,OUTPUT);
     pinMode(viboutpin4,OUTPUT);// определить контакт как выход
     pinMode(viboutpin5,OUTPUT);
     pinMode(viboutpin6,OUTPUT);  
}
       

void loop() {    
    digitalWrite(viboutpin,HIGH);
    digitalWrite(viboutpin1,HIGH);
    digitalWrite(viboutpin2,HIGH);
    digitalWrite(viboutpin3,HIGH);
    digitalWrite(viboutpin4,HIGH);
    digitalWrite(viboutpin5,HIGH);
    digitalWrite(viboutpin6,HIGH);
    delay(150);
    digitalWrite(viboutpin, LOW);
    digitalWrite(viboutpin1,LOW);
    digitalWrite(viboutpin2,LOW);
    digitalWrite(viboutpin3,LOW);
    digitalWrite(viboutpin4,LOW);
    digitalWrite(viboutpin5,LOW);
    digitalWrite(viboutpin6,LOW);
    delay(2000);
    
    digitalWrite(viboutpin2,HIGH);
    digitalWrite(viboutpin6,HIGH);
    delay(150);
    digitalWrite(viboutpin2,LOW);
    digitalWrite(viboutpin6,LOW);
    delay(2000);
    
    digitalWrite(viboutpin4,HIGH);
    delay(150);
    digitalWrite(viboutpin4,LOW);
    delay(2000);
}

, 👍1


1 ответ


1

Почему бы не сгенерировать случайное число psuedo от 0 до 255 и не использовать его в качестве кода, для которого должны быть активированы двигатели - бит 0 == viboutputpin0 и т. Д.? Затем одна функция может посмотреть на каждый бит по очереди и активировать этот двигатель, если бит установлен, задержать и остановить двигатели.

Вы, вероятно, захотите проверить свой код с помощью нескольких заранее определенных тестовых шаблонов вместо случайных, и как только вы убедитесь, что он работает, случайным образом посеять генератор случайных чисел, так что ваш проект будет генерировать другой шаблон каждый раз. Один из способов сделать это-попросить оператора через терминал нажать кнопку "Отправить" (или нажать пробел, если вы используете отдельный эмулятор терминала, который отправляет ключ за ключом). Измерьте время от запроса до ответа в микросекундах, отбросьте 2 или 3 наименее значимых бита результата и сохраните следующие 8. Разрешение функции micros() составляет 4 usec при 16 МГц, что является причиной отбрасывания этих 2 нижних бита.

,