Управление 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. parovoZZ

    parovoZZ Гуру

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

    parovoZZ Гуру

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

    parovoZZ Гуру

    А тактируется как? Там есть кварц на борту? Вместо ардуины подключи переходник USB-UART. Если нет такого, то из ардуины сделай.
     
  10. Нашел даташит для МК 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);
    }
     
  11. Теперь отрабатывает все команды. Написал маленький примерчик из 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);
    }