Управление 4х4х4 LED RGB кубом

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем BlackBug Engineering, 18 фев 2018.

Метки:
  1. Здравствуйте! Уважаемые форумчане, прошу посильной помощи советом.
    (Заранее прошу прощения, если написал не в ту ветку, но поиском ничего похожего не нашел.)
    Собрал из набора 4х4х4 куб из светодиодов.


    У него есть возможность управления с Arduino. И вот здесь-то меня поджидало главное разочарование...
    Подключается он по UART. Пример кода, функции DemoALL_ON, DemoALL_OFF, DemoRise - из примера производителя, функция DemoALL_RGB - написана мной:
    Код (C++):

    //Arduino_3D4RGBCube_Control
    //www.dianzifashaoyou.com email:dianzifashaoyou@hotmail.com
    //Achieve ALL on, ALL off, upward flow animation, turn off the display command
    //Command must be at 57600 baud
    //0XAD command to open the function, all waiting to enter the open test
    //serial data show ARDUINO,display command data 194,Each time data 0xEA+192+0xEB
    //0XED command to exit the function, turn off all functions, access the main menu

    #define LAYER_COUNT 4  
    #define COLUMN_COUNT 192

    void setup()
    {
      byte i;  
      delay(1000);
      Serial.begin(57600);  
      for(i=0; i<70; i++)
      {
      Serial.write(0xAD); // Переводит куб в режим управления
      }  
    }

    void loop()
    {
      byte pCube[COLUMN_COUNT];
      byte j;
      for(j=0; j<10; j++)
      {
      delay(1000);
      //DemoALL_ON(pCube); //Зажигает все светодиоды по всем трем каналам RGB
      delay(1000);
      //DemoALL_OFF(pCube); //Отключает все светодиоды
      delay(1000);
      //DemoRise(pCube); //Зажигает все светодиоды случайным образом
      delay(1000);
      DemoALL_RGB(pCube); //Зажигает все светодиоды по порядку каждым цветом RGB
      delay(1000);
      }
    }

    void DemoALL_ON(byte *pCube)
    {
      byte i,j;
      j = 0x80;
      while(j--)  
      {
      for(i=0; i<192; i++)
      {
      pCube[i] = 0xff;
      }  
      funPrintCube(pCube);
      }
    }

    void DemoALL_OFF(byte *pCube)
    {
      byte i,j;
      j = 0x80;
      while(j--)  
      {
      for(i=0; i<192; i++)
      {
      pCube[i] = 0x00;
      }  
      funPrintCube(pCube);
      }
    }

    void DemoRise(byte *pCube)
    {
      byte i, x, y, j;
      j = 0x80;
      while(j--)  
      {  
      for(i=0; i<192; i++)
      {
      pCube[i] = random(0, 255);
      }  
      funPrintCube(pCube);
      delay(1000);
      }
    }

    void DemoALL_RGB(byte *pCube)
    {
      byte i, x, y, j;
      j = 0x80;
      for(x=0; x<192; x++)
      {
      //while(j--)  
      //{  
      for(i=0; i<192; i++)
      {
      pCube[i] = 0x00;
      }  
      pCube[x] = 0xff;
      funPrintCube(pCube);
      delay(1000);
      //}
      }
    }

    void funPrintCube(byte *p)
    {
      Serial.write(0xEA);
      Serial.write(p,COLUMN_COUNT);
      Serial.write(0xEB);
    }
     
    Результат функции DemoALL_ON:
    1.jpg
    Результат функции DemoALL_OFF (здесь уже видно, что два светодиода явно не подчиняются командам):
    2.jpg
    Результат функции DemoRise:
    3.jpg
    Результат функции DemoALL_RGB:


    В результате оказалось, что не каждая команда срабатывает и результат практически непредсказаем.
    Прошу подсказки, может я что-то неправильно понимаю: в массиве pCube 192 элемента которые описывают подряд состояние 64 светодиодов по трем каналам R, G, B соответственно. Но результат не так очевиден - возможно имеет место искажение команды при передаче?
     
    ostrov нравится это.
  2. Интересно, в чем причина полного молчания? Принципиальная позиция? Не актуально? Нечего сказать?
     
  3. ostrov

    ostrov Гуру

    Надеюсь, на адресных? Если нет, то вам в музей.
     
  4. Адресных?
     
  5. ostrov

    ostrov Гуру

    В музей или к любителям ретро (с мазохистами).
     
  6. Никак не могу понять, куда вы меня посылаете? Выражайтесь яснее, если есть, что сказать!
     
  7. danya plotnik

    danya plotnik Гик

    Вам бы побольше вежливости...
     
  8. Не хотел обидеть Ваших чувств высказыванием в адрес другого собеседника. Вы вот, например, почему не высказываетесь "по делу"? Принципиальная позиция? Не интересно? Нечего сказать?
     
  9. parovoZZ

    parovoZZ Гуру

    Там написано 57600. В кубе такая же скорость? МК куба как тактируется?
     
    BlackBug Engineering нравится это.
  10. В мануале написана эта скорость. Для проверки попробовал на других, но тогда железка не реагирует совсем.
     
  11. parovoZZ

    parovoZZ Гуру

    МК куба как тактируется? Что там вообще за МК?
    К компу подключи и из терминалки попробуй управлять.
     
  12. 1.jpg
    МК - STC. Буду благодарен, если подскажете, как еще, кроме как через плату управления куба, можно подключить.
     
  13. parovoZZ

    parovoZZ Гуру

    А тактируется как? Там есть кварц на борту? Вместо ардуины подключи переходник USB-UART. Если нет такого, то из ардуины сделай.
     
  14. Нашел даташит для МК stc15f2k60s2
    Параллельно пришел к мысли, что МК не успевает читать команды с Arduino, подправил функцию отправляющую команды funPrintCube, проставив задержки. Предельное значение задержки определил опытным путем - в моем случае получилось, что при 160 микросекундах отрабатывать не успевает, при 170 все работает.
    Код (C++):
    void funPrintCube(byte *p)
    {
      Serial.write(0xEA);
      delayMicroseconds(170);
      for(byte i=0; i<192; i++)
      {
        Serial.write(p[i]);
        delayMicroseconds(170);
      }
      Serial.write(0xEB);
      delayMicroseconds(170);
    }
     
  15. Теперь отрабатывает все команды. Написал маленький примерчик из 3-х функций. Результат в видео.


    Код (C++):
    #define LAYER_COUNT 4  
    #define COLUMN_COUNT 192

    void setup()
    {
      byte i;
      delay(1000);
      Serial.begin(57600);
      for(i=0; i<70; i++)
      {
        Serial.write(0xAD); // Переводит куб в режим управления
      }    
    }

    void loop()
    {
      byte pCube[COLUMN_COUNT];
      byte j;
      for(j=0; j<10; j++)
      {
        DemoALL_RGB(pCube);
        DemoALL_RED(pCube);
        delay(500);
        DemoALL_GRE(pCube);
        delay(500);
        DemoALL_BLU(pCube);
        delay(500);
      }
    }

    void DemoALL_RGB(byte *pCube)
    {
      for(byte x=0; x<192; x++)
      {
        for(byte i=0; i<192; i++)
        {
          pCube[i] = 0x00;
        }    
        pCube[x] = 0xff;
        funPrintCube(pCube);
        delay(100);
      }
    }
    void DemoALL_RED(byte *pCube)
    {
      for(byte x=0; x<192; x++)
      {
        pCube[x] = 0xff;
        x++;
        pCube[x] = 0x00;
        x++;
        pCube[x] = 0x00;
      }
      funPrintCube(pCube);
    }

    void DemoALL_GRE(byte *pCube)
    {
      for(byte x=0; x<192; x++)
      {
        pCube[x] = 0x00;
        x++;
        pCube[x] = 0xff;
        x++;
        pCube[x] = 0x00;
      }
      funPrintCube(pCube);
    }

    void DemoALL_BLU(byte *pCube)
    {
      for(byte x=0; x<192; x++)
      {
        pCube[x] = 0x00;
        x++;
        pCube[x] = 0x00;
        x++;
        pCube[x] = 0xff;
      }
      funPrintCube(pCube);
    }

    void funPrintCube(byte *p)
    {
      Serial.write(0xEA);
      delayMicroseconds(170);
      for(byte i=0; i<192; i++)
      {
        Serial.write(p[i]);
        delayMicroseconds(170);
      }
      Serial.write(0xEB);
      delayMicroseconds(170);
    }