Помогите улучшить led cube 4x4x4

an4ous
Offline
Зарегистрирован: 21.09.2015

Вооот, теперь понял. Спасибо Вам за быстрой и понятный ответ. Ато голову уже сломал колдуя с цифрами) Сделали бы 5х5х5 rgb было бы супер) нашел ваш пост с кубиками на Гиктаймс, код мало понял т.к в програмирование слабоват. но код оформлен красиво.

Al_Ninyo
Offline
Зарегистрирован: 09.11.2014

125 RGB светодиодов дороговато получается :) Пока ограничусь одноцветными, всё же.

А про код. Спасибо за добрые слова. Я сам пока не очень в программировании, поэтому стараюсь более-менее комментировать код и структурировать его для удобства чтения. Главное, сильно не вчитываться в сам код, чтобы не возникло желания побить меня :)

an4ous
Offline
Зарегистрирован: 21.09.2015

Я пожалуй закажу с алика потом ргб,уж больно эффектно светится). Ну чтож, Буду ждать вашу новую работу)

popUP
Offline
Зарегистрирован: 09.10.2014

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

Я купил китайский набор для 4х4х4 (купил тут https://ru.aliexpress.com/item/4X4X4-3D-Light-Cube-Kit-Blue-Shield-LED-Precise-DIY-Kit/32630720293.html?spm=2114.10010208.1000016.1.UWRNRn&isOrigTitle=true)  и залил их стандартный пример (взято отсюда http://www.icstation.com/icstation-4x4x4-light-cube-arduino-p-5312.html)

В примере не разобрался от слова вообще. Начал с нуля :) со сдвиговых регистров http://arduino.ru/Tutorial/registr_74HC595 по совету из этого топика, кстати. Вот по чуть и разбирался. Схема  моего кубика почти как у ТС, только без ключевых транзисторов. И я добавил еще одну кнопку - чтобы регулировать частоту морганий. Корпус из крышек от CD дисков.

Код легко управляем, все завязано непосредственно на управление каждым диодом и слоями. Намного более тяжелый чем у  jeka_tm

Но, мне так было легче и понятнее. Может кому-нибудь тоже поможет разобраться с подобным кубиком.

Вот, в общем, что получилось

ну и мой код с 10 эффектами, которые легко можно править и изменять


const int latchPin = 8;        // Пин подключен к ST_CP входу 74HC595
const int clockPin = 12;       // Пин подключен к SH_CP входу 74HC595
const int dataPin = 11;        // Пин подключен к DS входу 74HC595
int LayerPin[] = {4, 5, 6, 7}; // указываем пины, к которым подключены слои кубика

int ButPin1 = 2;               // подключаем кнопку к выходу 2
int ButPin2 = 3;               // подключаем кнопку к выходу 3
int flag1 = 0;                  // флаг состояния
volatile int rejim1 = 0;        // Переключалка
int flag2 = 0;                  // флаг состояния
volatile int rejim2 = 0;        // Переключалка

int lastLayer = 0;
int layer = 0;                 //номер вертикального слоя
unsigned int bitsToSend = 0;    // переменная для хранения состояния каждого пина

int g = 0;
int h = 0;


int State1 = 0; // HIGH=1; LOW=0
int timeStop = 200;   //задержка внутри циклов подпрограмм

void setup() {
  Serial.begin(9600);

  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(ButPin1, INPUT);
  pinMode(ButPin2, INPUT);

  // все слои: LOW - вкл ,  HIGH - выкл
  for (layer = 0; layer < 4; layer++) {
    pinMode(LayerPin[layer], OUTPUT);
    digitalWrite(LayerPin[layer], HIGH);
  }
  attachInterrupt(INT0, ChangeRejim1, CHANGE);
  attachInterrupt(INT1, ChangeRejim2, CHANGE);
}   //конец setup

void loop() {

  //  ChangeRejim1();
  //  //  setRejim1();
  ChangeRejim2();

  Serial.print("R1- ");
  Serial.print(rejim1);
  Serial.print("  R2-  ");
  Serial.println(rejim2);


  switch (rejim2) {
    //************
    case 0:
      Serial.println("AllOn");
      hLayersAll(0) ;
      vLayersAll(1) ;
      break;
    //************
    case 1:
      Serial.println("fallDown");
      vLayersAll(0) ;
      fallDown (random(0, 15));
      break;
    //************
    case 2:
      Serial.println("raiseUP");
      vLayersAll(0) ;
      raiseUP (random(0, 15));
      break;
    //************
    case 3:
      Serial.println("Spiral");
      vLayersAll(0) ;

      for (layer = 0; layer < 4; layer++) {     // цикл для включения слоев свверху вниз
        //   for (layer = -3; layer <=0; layer++) {    // цикл для включения слоев снизу вверх
        digitalWrite(LayerPin[abs(layer)], LOW); // включаем слой
        //    }

        spiral2 (1);// в следующей подпрограмме включаем столбцы

        spiral1 (0);// в следующей подпрограмме вЫключаем столбцы
        digitalWrite(LayerPin[abs(layer)], HIGH);  // вЫключаем слой - для цикла движения по слоям
      }
      break;

    //************
    case 4:    // your hand is nowhere near the sensor
      Serial.println("circle1");
      vLayersAll(0) ;
      for (layer = 0; layer < 4; layer++) {     // цикл для включения слоев свверху вниз
        digitalWrite(LayerPin[abs(layer)], LOW); // включаем слой
        //    }
        circle1 ();
        digitalWrite(LayerPin[abs(layer)], HIGH);  // вЫключаем слой - для цикла движения по слоям
        lastLayer = abs(layer);
      }

      digitalWrite(LayerPin[lastLayer], LOW); // включаем слой
      circle1 ();
      digitalWrite(LayerPin[lastLayer], HIGH);  // вЫключаем слой - для цикла движения по слоям

      for (layer = -3; layer <= 0; layer++) {   // цикл для включения слоев снизу вверх
        digitalWrite(LayerPin[abs(layer)], LOW); // включаем слой
        //    }
        circle1 ();
        digitalWrite(LayerPin[abs(layer)], HIGH);  // вЫключаем слой - для цикла движения по слоям
      }

      //      fallDown (6);
      break;
    //************
    case 5:
      Serial.println("LineEvolution");
      for (int i = 0; i < 4; i++) {
        hLayersSingle (i, 0);
        vLayersSingle (i, 1);
        delay (timeStop);
        vLayersSingle (i, 0);
        hLayersSingle (i, 1);
      }

      for (int i = 3; i >= 0; i--) {
        hLayersSingle (i, 0);
        vLayersSingle (i, 1);
        delay (timeStop);
        vLayersSingle (i, 0);
      }

      for (int i = 0; i < 4; i++) {
        vLayersSingle (i, 1);
        delay (timeStop);
      }
      break;


    //************
    case 6:
      Serial.println("spiralFull");
      vLayersAll(0) ;                  //State1 = 0 -выкл, =1 - вкл
      hLayersAll(0) ;                      //State1 = 1 -выкл, =0 - вкл
      spiral1 (1);                   //State1 = 1 -вкл, =0 - выкл
      //  vLayersAll(0) ;                  //State1 = 0 -выкл, =1 - вкл
      //      delay (timeStop);
      //      spiral2 (0);
      break;

    //************
    case 7:
      Serial.println(" 7777");
      hLayersAll(0);
      vLayersAll(0);
      for (int i = 0; i < 4; i++) {
        vLayersSingle(i, 1);
        delay (timeStop);
        vLayersSingle(i, 0);
      }
      for (int i = 3; i >= 0 ; i--) {
        vLayersSingle(i, 1);
        delay (timeStop);
        vLayersSingle(i, 0);
      }

      for (int i = 0; i < 4; i++) {
        v2LayersSingle(i, 1);
        delay (timeStop);
        v2LayersSingle(i, 0);
      }
      for (int i = 3; i >= 0 ; i--) {
        v2LayersSingle(i, 1);
        delay (timeStop);
        v2LayersSingle(i, 0);
      }
      break;
    //************
    case 8:
      PointGrow (random(1, 8));
      break;

    //************ хаоссс
    case 9:
      vLayersAll (0);
      hLayersAll(1);

      g = random(0, 15);
      h = random(0, 4);

      hLayersSingle( h, 0);    //State1 = 1 -выкл, =0 - вкл
      bitToSend ( g, 1);
      sendToRegister ();    // Шлем в регистр
      delay (timeStop);
      hLayersSingle( h, 1);    //State1 = 1 -выкл, =0 - вкл
      bitToSend ( g, 0);
      sendToRegister ();    // Шлем в регистр
      delay (timeStop);

      break;

    //************
    case 10:
      Serial.println("AllOff");
      hLayersAll(1);                   //State1 = 1 -выкл, =0 - вкл
      vLayersAll(0) ;                  //State1 = 0 -выкл, =1 - вкл
      break;
  }     //конец  switch (rejim2)


}     //конец loop


/******************gthtxtym подпрограмм
  bitToSend ( Point,  State1);
  hLayersSingle( hLayer,  State1);    //State1 = 1 -выкл, =0 - вкл
  hLayersAll( State1);                //State1 = 1 -выкл, =0 - вкл
  vLayersAll( State1);                //State1 = 0 -выкл, =1 - вкл
  vLayersSingle(vLayer, State1);      //State1 = 0 -выкл, =1 - вкл
  v2LayersSingle(vLayer, State1)      //State1 = 0 -выкл, =1 - вкл


  snake1(State1);
  snake2(State1);
  spiral1( State1);
  spiral2( State1);
  circle1();
  fallDown (Point);
  raiseUP (Point);
  PointGrow (Point);
*/

//****функция передачи данных в сдвиговый регистр для зажигания светодиодов
void sendToRegister () {   // Шлем в регистр
  //Отключаем вывод на регистре
  digitalWrite(latchPin, LOW);

  // разбиваем наши 16 бит на два байта
  // для записи в первый и второй регистр
  byte registerOne = lowByte(bitsToSend);
  byte registerTwo = highByte(bitsToSend);

  // "проталкиваем" байты в регистры  - сначало в дальний
  shiftOut(dataPin, clockPin, MSBFIRST, registerTwo);
  shiftOut(dataPin, clockPin, MSBFIRST, registerOne);

  // "защелкиваем" регистр, чтобы биты появились на выходах регистра
  digitalWrite(latchPin, HIGH);
}

void bitToSend (int Point, int State1) {  //Запись в байт каждой точки
  bitWrite(bitsToSend, Point, State1);
  //        sendToRegister ();    // Шлем в регистр
}


//*********** функция смены режима по кнопке 1
void ChangeRejim1() {
  if (digitalRead(ButPin1) == HIGH && flag1 == 0)
  {
    rejim1 ++;
    flag1 = 1;
    if (rejim1 > 6)           // Если номер режима превышает количество эффектов,
    {
      rejim1 = 0;  // то отсчет начинается с нуля
    }
  }
  if (digitalRead(ButPin1) == LOW && flag1 == 1)
  {
    flag1 = 0;
  }
  switch (rejim1) {
    case 0:
      Serial.println("Light Speed");
      timeStop = 1;
      break;
    case 1:
      Serial.println("Fastest");
      timeStop = 25;
      break;
    case 2:
      Serial.println("Fast");
      timeStop = 50;
      break;
    case 3:
      Serial.println("Medium");
      timeStop = 100;
      break;
    case 4:
      Serial.println("Slow");
      timeStop = 200;
      break;
    case 5:
      Serial.println("Slowest");
      timeStop = 300;
      break;
    case 6:
      Serial.println("Slowest");
      timeStop = 500;
      break;
  }
}
//**********функция смены режима по кнопке 2
void ChangeRejim2() {
  if (digitalRead(ButPin2) == HIGH && flag2 == 0)
  {
    rejim2 ++;
    flag2 = 1;
    if (rejim2 > 10)           // Если номер режима превышает количество эффектов,
    {
      rejim2 = 0;  // то отсчет начинается с нуля
    }
  }
  if (digitalRead(ButPin2) == LOW && flag2 == 1)
  {
    flag2 = 0;
  }
}
//********
void hLayersSingle(int hLayer, int State1) { // функция для одиночных слоёв горизонтальных
  digitalWrite(LayerPin[hLayer], State1);
}
//********
void hLayersAll(int State1) { // функция для всех слоёв горизонтальных
  for (layer = 0; layer < 4; layer++) {
    digitalWrite(LayerPin[layer], State1);
  }
}
//******** функция для включения/выключения (State1) всех слоёв вертикальных
void vLayersAll(int State1) {
  for (int i = 0; i < 16; i++) {
    bitWrite(bitsToSend, i, State1);
    sendToRegister ();    // Шлем в регистр
  }
}
//******** функция для включения/выключения (State1) слоёв вертикальных по одному поперек
void vLayersSingle(int vLayer, int State1) {
  switch (vLayer) {
    case 0:
      for (int i = 0; i < 4; i++) {
        bitWrite(bitsToSend, i, State1);
        sendToRegister ();    // Шлем в регистр
      }
      break;
    case 1:
      for (int i = 4; i < 8; i++) {
        bitWrite(bitsToSend, i, State1);
        sendToRegister ();    // Шлем в регистр
      }
      break;
    case 2:
      for (int i = 8; i < 12; i++) {
        bitWrite(bitsToSend, i, State1);
        sendToRegister ();    // Шлем в регистр
      }
      break;
    case 3:
      for (int i = 12; i < 16; i++) {
        bitWrite(bitsToSend, i, State1);
        sendToRegister ();    // Шлем в регистр
      }
      break;

  }
}
//******** функция для включения/выключения (State1) слоёв вертикальных по одному вдоль
void v2LayersSingle(int vLayer, int State1) {
  switch (vLayer) {
    case 0:
      for (int i = 0; i < 16; ) {
        bitWrite(bitsToSend, i, State1);
        sendToRegister ();    // Шлем в регистр
        i = i + 4;
      }
      break;
    case 1:
      for (int i = 1; i < 16; ) {
        bitWrite(bitsToSend, i, State1);
        sendToRegister ();    // Шлем в регистр
        i = i + 4;
      }
      break;
    case 2:
      for (int i = 2; i < 16; ) {
        bitWrite(bitsToSend, i, State1);
        sendToRegister ();    // Шлем в регистр
        i = i + 4;
      }
      break;
    case 3:
      for (int i = 3; i < 16;) {
        bitWrite(bitsToSend, i, State1);
        sendToRegister ();    // Шлем в регистр
        i = i + 4;
      }
      break;
  }
}

// ЭФФЕКТЫ

///************* Зажечь/потушить змейку от 0 до 15
void snake1(int State1) {
  for (int i = 0; i < 4; i++) {
    bitWrite(bitsToSend, i, State1);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
  for (int i = 7; i > 3; i--) {
    bitWrite(bitsToSend, i, State1);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
  for (int i = 8; i < 12; i++) {
    bitWrite(bitsToSend, i, State1);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
  for (int i = 15; i > 11; i--) {
    bitWrite(bitsToSend, i, State1);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
}
//************** Зажечь/потушить змейку от 15 до 0
void snake2(int State1) {
  for (int i = 12; i < 16; i++) {
    bitWrite(bitsToSend, i, State1);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
  for (int i = 12; i > 7; i--) {
    bitWrite(bitsToSend, i, State1);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
  for (int i = 4; i < 8; i++) {
    bitWrite(bitsToSend, i, State1);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
  for (int i = 3; i >= 0; i--) {
    bitWrite(bitsToSend, i, State1);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
}
//************* Зажечь/потушить закручивающююся спираль снаружи внутрь
//по часовой стрелке
void spiral1(int State1) {
  for (int i = 0; i < 4; i++) {
    bitWrite(bitsToSend, i, State1);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
  bitWrite(bitsToSend, 7, State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);

  bitWrite(bitsToSend, 11, State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);

  for (int i = 15; i > 11; i--) {
    bitWrite(bitsToSend, i, State1);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
  bitWrite(bitsToSend, 8, State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);

  bitWrite(bitsToSend, 4, State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);

  bitWrite(bitsToSend, 5, State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
  bitWrite(bitsToSend, 6, State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
  bitWrite(bitsToSend, 10, State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
  bitWrite(bitsToSend, 9, State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
}
///************Зажечь/потушить Раскручивающуюся спираль изнутри наружу
//против часовой стрелки
void spiral2(int State1) {

  bitWrite(bitsToSend, 5,  State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
  bitWrite(bitsToSend, 6, State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
  bitWrite(bitsToSend, 10, State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
  bitWrite(bitsToSend, 9, State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);

  bitWrite(bitsToSend, 8, State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
  bitWrite(bitsToSend, 4, State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
  for (int i = 0; i < 4; i++) {
    bitWrite(bitsToSend, i, State1);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
  bitWrite(bitsToSend, 7, State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);

  bitWrite(bitsToSend, 11, State1);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);

  for (int i = 15; i > 10; i--) {
    bitWrite(bitsToSend, i, State1);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);

    bitWrite(bitsToSend, 10, State1);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
}
///********** одиночный огонек по кругу по часовой стрелке
void circle1() {
  for (int i = 0; i < 4; i++) {
    bitWrite(bitsToSend, i, HIGH);            //включили диод (столбик) 0-4
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
    bitWrite(bitsToSend, i, LOW);            //вЫключили диод 0-4
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
  bitWrite(bitsToSend, 7, HIGH);            //включили диод 7
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
  bitWrite(bitsToSend, 7, LOW);              //вЫключили диод 7
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
  bitWrite(bitsToSend, 11, HIGH);           //и т.д.
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
  bitWrite(bitsToSend, 11, LOW);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
  for (int i = 15; i > 11; i--) {
    bitWrite(bitsToSend, i, HIGH);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
    bitWrite(bitsToSend, i, LOW);
    sendToRegister ();    // Шлем в регистр
    delay (timeStop);
  }
  bitWrite(bitsToSend, 8, HIGH);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
  bitWrite(bitsToSend, 8, LOW);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);

  bitWrite(bitsToSend, 4, HIGH);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
  bitWrite(bitsToSend, 4, LOW);
  sendToRegister ();    // Шлем в регистр
  delay (timeStop);
}
//******************** Звездопад
void fallDown (int Point) {
  bitWrite(bitsToSend, Point, HIGH);
  // bitWrite(bitsToSend, random(0, 15), HIGH);

  sendToRegister ();    // Шлем в регистр
  for (layer = -3; layer <= 0; layer++) {   // цикл для включения слоев  свверху вниз
    digitalWrite(LayerPin[abs(layer)], LOW); // включаем слой
    delay (timeStop);
    digitalWrite(LayerPin[abs(layer)], HIGH);  // вЫключаем слой - для цикла движения по слоям
  }       //Если нужно включить все слои и работать со столбцами
  bitWrite(bitsToSend, Point, LOW);
  sendToRegister ();    // Шлем в регистр
}
//******************** Звездопад наоборот
void raiseUP (int Point) {
  bitWrite(bitsToSend, Point, HIGH);
  sendToRegister ();    // Шлем в регистр
  for (layer = 0; layer < 4; layer++) {     // цикл для включения слоев снизу вверх
    digitalWrite(LayerPin[abs(layer)], LOW); // включаем слой
    delay (timeStop);
    digitalWrite(LayerPin[abs(layer)], HIGH);  // вЫключаем слой - для цикла движения по слоям
  }
  bitWrite(bitsToSend, Point, LOW);
  sendToRegister ();    // Шлем в регистр
}
//***********рост из угла
void PointGrow (int Point) {

  switch (Point) {
    //**************
    case (1):
      //***рост из 1 (0,0)
      hLayersAll (1);
      for (int i = 0; i < 4; i++) {
        vLayersAll(1);
        hLayersSingle (i, 0);
        for (int y = 1 + i; y < 4; y++) {
          vLayersSingle(y, 0);
          v2LayersSingle(y, 0);
        }
        delay (timeStop);
      }
      break;
    //***************
    case (2):
      //***рост из 2 (3,0)
      hLayersAll (1);
      for (int i = 0; i < 4; i++) {
        vLayersAll(1);
        hLayersSingle (i, 0);
        for (int y = 1 + i; y < 4; y++) {
          vLayersSingle(y, 0);
          v2LayersSingle(3 - y, 0);
        }
        delay (timeStop);
      }
      break;

    //***************
    case (3):
      //***рост из 3 (15,0)
      hLayersAll (1);
      for (int i = 0; i < 4; i++) {
        vLayersAll(1);
        hLayersSingle (i, 0);
        for (int y = 0; y < 3 - i; y++) {
          vLayersSingle(y, 0);
          v2LayersSingle(y, 0);
        }
        delay (timeStop);
      }
      break;

    //***************
    case (4):
      //***рост из 4 ( 12,0)
      hLayersAll (1);
      for (int i = 0; i < 4; i++) {
        vLayersAll(1);
        hLayersSingle (i, 0);
        for (int y = 0; y < 3 - i; y++) {
          vLayersSingle(y, 0);
          v2LayersSingle(3 - y, 0);
        }
        delay (timeStop);
      }
      break;

    //**************
    case (5):
      //***рост из 5 (0,4)
      hLayersAll( 1);
      for (int i = 3; i >= 0; i--) {
        vLayersAll(1);
        hLayersSingle (i, 0);
        for (int y = 4 - i; y < 4; y++) {
          vLayersSingle(y, 0);
          v2LayersSingle(y, 0);
        }
        delay (timeStop);
      }
      break;

    //**************
    case (6):
      //***рост из 6 (3,4)
      hLayersAll( 1);
      for (int i = 3; i >= 0; i--) {
        vLayersAll(1);
        hLayersSingle (i, 0);

        for (int y = 0; y < i; y++) {
          vLayersSingle(3 - y, 0);
          v2LayersSingle(y, 0);
        }
        delay (timeStop);
      }
      break;


    //**************
    case (7):
      //***рост из 7 (15,4)
      hLayersAll( 1);
      for (int i = 3; i >= 0; i--) {
        vLayersAll(1);
        hLayersSingle (i, 0);
        for (int y = 0; y < i; y++) {
          vLayersSingle(y, 0);
          v2LayersSingle(y, 0);
        }
        delay (timeStop);
      }
      break;

    //**************
    case (8):
      //***рост из 8 (12,4)
      hLayersAll( 1);
      for (int i = 3; i >= 0; i--) {
        vLayersAll(1);
        hLayersSingle (i, 0);
        for (int y = 4 - i; y < 4; y++) {
          vLayersSingle(3 - y, 0);
          v2LayersSingle(y, 0);
        }
        delay (timeStop);
      }
      break;
  } // end of switch
} // end of PointGrow (int Point, int Layer)


 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да уж)) ты всю графику математикой сделал. и не лень было так много писать)) молодчик что довел до конца

popUP
Offline
Зарегистрирован: 09.10.2014

Я просо еще не понял, как графику использовать :)

Подскажите, для 3 сдвиговых регистров и более, принцип тот же? или в случае такого же РГБ куба лучше использовать что-то другое?

И еще удручают слои, хочется управлять КАЖДЫМ и ВСЕМИ диодами отдельно :)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

принцип тот же. так управлять каждым светодиодом или слоем несложно, делаются функции и делов то

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

popUP
Offline
Зарегистрирован: 09.10.2014

Не очень понимаю, как управлять каждым светодиодом при слоях. Например одновременно засветить столбик 1 слой 2 и столбик 2 слой 4. Получается что в обоих столбиках 1 и 2 светятся диоды в слоях 2 и 4. А если делать не послойно - то количество ног увеличивается в 2 раза, мне так кажется.

А что за контроллеры для цветных светодиодов вы рекомендуете? какое-нибудь наименование, если не сложно, или ссылочку :)

 

flat
Offline
Зарегистрирован: 05.02.2015

Прочитал ... увлекли... задумался... 

а не проще WS2812B использовать ? заказал 200 штук на али ... буду экспериментировать... 1 минус они в SMD корпусах... пока сажусь рисовать схемку соединений чтоб представить что будет по проводам ) 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

popUP посмотри мой код, в начале массив сгенерированный из 16 байт. просто так программа генерит, а так можно сократить до 8 байт. любой меняй бит, изменишь светодиод, определенные биты столбец или строка. просто надо представить это

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

flat с какой то стороны проще

popUP
Offline
Зарегистрирован: 09.10.2014

jeka_tm я смотрел ваш код. думал. 

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

Но я все равно не представляю, как можно ОДНОВРЕМЕННО включить только  2 диода -  1 слой 1 столбец и второй слой 2 столбец. У меня другое соединение, чем в вашей схеме, наверное. Отдельно могу управлять каждым диобом  в рамках одного столбца - только отключая слои. Поэтому, если включен один диод это означает, что включен весь столбец и отключены слои выше и ниже диода. если я включаю еще один любой столбец - то в нем горят все диоды , находящиеся на включенном слое.

Что-то путано, но , в общем, зажечь диагональ в любой вертикальной плоскости куба чтобы диоды горели одновременно, я не могу. только "быстро бегущие огни, сливающиеся визуально в линию, но и свечение тогда неяркое, и мерцание видно 

а

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

конечно не одновременно. динамическая индикация. за раз максимум горит один слой. у меня так сделано

свечение сильно падает потому что ты, если правильно понял, управляешь какой слой включить напрямую пином ардуины, а ардуина не может потянуть ток такого количества светодиодов. во вторых R500 это 500ом наверно. если да то неправильная запись. надо писать 500R. так как R500 это 0,5ома. итак если это 500ом то ток сильно уменьшен и яркость конечно будет очень слабая. дорабатывай схему

popUP
Offline
Зарегистрирован: 09.10.2014

Хорошо пошутили! 

Где я и где схема :) Я сложнее мультивибратора ничего не нарисую.

А схема была готовая, детальки подобраны , тока спаять аккуратно

http://www.icstation.com/icstation-4x4x4-light-cube-arduino-p-5312.html

даже пример кода был, правда как библиотека оформлен - я в такие дебри залезть не сумел, но, слава богу, тут нашел почти все ответы что и как программировать.

С кубиком временно наигрался, жду комплект РГБ диодов, буду думать как дальше и больше.

Возвращаюсь к машинке, на фотке хвастаюсь 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну так и есть. китайцы съэкономили на копеечных транзисторах. а чтобы не спалить выход поставили более высокоомный резистор чем нужно. халтуру продают

popUP
Offline
Зарегистрирован: 09.10.2014

Китайская продукция - она такая :) Халтура, но работает. Плохо и недолго :)

А мне этот набор в радость. Я не представляю себе как бы я плату делал, а поэкспериментировать с кодом хотелось. Теперь убедился - что мне по силам им управлять, можно и железяку самому собирать.

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

Спасибо всем, кто принял участие в этой теме, очень помогли

С уважением, 

я