Линк на форум.

Обсуждение проекта на форуме Arduino.ru

воскресенье, 8 июля 2012 г.

Первый эффект

    Сегодня я посетил радио лавку, взял резисторов, чтобы поднять яркость куба, и набросал небольшой код первого эффекта. Позже я вылажу схему управляющей электроники.
    И так начнем со скетча. Я пока решил сильно не заморачиваться с первым эффектом и отдался магии случайных чисел, а именно из генератора случайных чисел я буду брать 3 координаты и по этим координатам буду инвертировать состояние того или иного диода.
    Сам скетч:


#define clock 3 //Тактовый контакт(SH)
#define latch 4 //Контакт защелки (ST)
#define data 2  //Контакт данных  (DS)

boolean matrix[8][8][8]; // массив который является внутренним
                         //представлением куба
byte i,j,k,x,y,z; // переменные для циклов

void setup() // функция установки начальных праметров
{

  //переводим все контакты в режим вывода
  pinMode(clock, OUTPUT);
  pinMode(latch, OUTPUT);
  pinMode(data, OUTPUT);
  // на всякий случай я заполняю виртуальный

  // массив ложными значениями
  for(i = 0; i < 8; i++){
      for(j = 0; j < 8; j++){
          for(k = 0; k < 8; k++){
              matrix[i][k][j] = false;
          }
      }
   
  }
  //Здесь стоит отметить что ложь значит, что диод

  //не горит, а правда значит что горит
}

void loop() // основная вызываемая функция
{
  // генерирую случайные координаты
  x = random(0,8);
  y = random(0,8);
  z = random(0,8);
  // инвертирую значение по координатам
  matrix[x][y][z] = !matrix[x][y][z];
  writeMatrix(); // отображаю куб
}

void writeMatrix(){ // функция которая отображает внутренний массив на кубе
  digitalWrite(clock, LOW);
  for(i = 0; i < 8; i++){ // цикл по этажам  координата Z
      digitalWrite(latch, LOW);
      //записываю 64 бита о одном из рядов
      for(j = 0; j < 8; j++){ //цикл по этажу(координата Y)
          for(k = 0; k < 8; k++){ // цикл по этажу(координата X)
              // сбрасываю сигнал на выходе данных
              digitalWrite(data, LOW);
              //проверка на истину
              if(matrix[i][k][j] == true){
                  // если истина то даю логическую 1 на выход DS
                  digitalWrite(data, HIGH);
              }
              // даем тактовый контакт и 
              // проталкиваем бит в регистры
              digitalWrite(clock, HIGH);
              digitalWrite(clock, LOW);
          }

      }
      // последние 8 бит информация о том,
      // какой из рядов зажигать
      for(j = 0; j < 8; j++ ){
          digitalWrite(data, LOW);
          if(i == j){
              digitalWrite(data, HIGH);
          }
              // даем тактовый контакт и 
              // проталкиваем бит в регистры
          digitalWrite(clock, HIGH);
          digitalWrite(clock, LOW);
      }
      // подаю сигнал на защелку тем самым фиксируя
      // внутренние данные в регистры на его выходы
      digitalWrite(latch, HIGH);
      digitalWrite(latch, LOW);
  }
}

      В итоге получается что за один цикл случайным образом один из диодов гаснет если горел или наоборот.
   Вот собственно и все для первого эффекта, прилагаю видео того как это выглядит в реальности.

Комментариев нет:

Отправить комментарий