Arduino звуковой котроллер

Тема в разделе "Глядите, что я сделал", создана пользователем Arduiner001, 27 июл 2015.

  1. Arduiner001

    Arduiner001 Гик

    Насмотревшись видео про звуковые контроллеры на Arduino, я решил сделать собственный звуковой контроллер.
    [​IMG]
    В середине - клавиатура, которая позволяет воспроизводить 16 сэмплов.
    Рядом с ней - светодиод, который горит при отправке данных на компьютер.

    Структура данных
    <состояние>:<кнопка>
    Состояние - это p либо n.
    p - pressed
    n - not pressed
    Кнопка - это 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, *, #, A, B, C или D.
    Например, p:6 означает, что кнопка под названием 6 нажата.
    А n:6 означает, что кнопка под названием 6 отпущена.

    Программа
    Её делал в Visual Studio 2015.

    Ещё фото
    [​IMG]
    [​IMG]
    [​IMG]
    Как работает
    [​IMG]

    Все действия кнопок подписаны.
    Например: при нажатии кнопки D в программе можно выбрать сэмпл, который будет воспроизводиться при нажатии кнопки D на устройстве.

    Скетч:
    (к пину 10 подключён тот самый зелёный светодиод)
    Код (Text):
    int sendPins[4] = {2, 3, 4, 5};
    int receivePins[4] = {6, 7, 8, 9};
    char prev = ' ';

    void setup() {
      Serial.begin(115200);
      kbd_init();
      pinMode(10, OUTPUT);
    }

    void loop() {
      char kbd = kbd_read();
      if(kbd == ' '){
        if(prev != ' '){
          digitalWrite(10, HIGH);
          Serial.print("n:");
          Serial.println(prev);
          delay(3);
          digitalWrite(10, LOW);
        }
      } else {
        if(prev != kbd){
          digitalWrite(10, HIGH);
          Serial.print("p:");
          Serial.println(kbd);
          delay(3);
          digitalWrite(10, LOW);
        }
      }
      prev = kbd;
    }

    void kbd_init() {
      for (int i = 0; i < 4; i++) {
        pinMode(sendPins[i], OUTPUT);
      }
      for (int i = 0; i < 4; i++) {
        pinMode(receivePins[i], INPUT);
      }
    }

    char kbd_read() {
      char btn;
      btn = ' ';
      for (int i = 0; i < 4; i++) {
        digitalWrite(sendPins[i], LOW);
      }
      digitalWrite(sendPins[3], HIGH);
      if (digitalRead(receivePins[3]) == 1) {
        btn = '1';
      }
      if (digitalRead(receivePins[2]) == 1) {
        btn = '4';
      }
      if (digitalRead(receivePins[1]) == 1) {
        btn = '7';
      }
      if (digitalRead(receivePins[0]) == 1) {
        btn = '*';
      }
      digitalWrite(sendPins[3], LOW);
      digitalWrite(sendPins[2], HIGH);
      if (digitalRead(receivePins[3]) == 1) {
        btn = '2';
      }
      if (digitalRead(receivePins[2]) == 1) {
        btn = '5';
      }
      if (digitalRead(receivePins[1]) == 1) {
        btn = '8';
      }
      if (digitalRead(receivePins[0]) == 1) {
        btn = '0';
      }
      digitalWrite(sendPins[2], LOW);
      digitalWrite(sendPins[1], HIGH);
      if (digitalRead(receivePins[3]) == 1) {
        btn = '3';
      }
      if (digitalRead(receivePins[2]) == 1) {
        btn = '6';
      }
      if (digitalRead(receivePins[1]) == 1) {
        btn = '9';
      }
      if (digitalRead(receivePins[0]) == 1) {
        btn = '#';
      }
      digitalWrite(sendPins[1], LOW);
      digitalWrite(sendPins[0], HIGH);
      if (digitalRead(receivePins[3]) == 1) {
        btn = 'A';
      }
      if (digitalRead(receivePins[2]) == 1) {
        btn = 'B';
      }
      if (digitalRead(receivePins[1]) == 1) {
        btn = 'C';
      }
      if (digitalRead(receivePins[0]) == 1) {
        btn = 'D';
      }
      digitalWrite(sendPins[0], LOW);
      return btn;
    }
     
    robokop и Scrypto нравится это.
  2. robokop

    robokop Гик

    интересно !
     
  3. Limoney

    Limoney Гик

    Прикольно!!!
     
  4. Arduiner001

    Arduiner001 Гик

    Скоро будет обновление, ждите Megapad!
     
  5. robokop

    robokop Гик