Экран -из светодиодной ленты..

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Gpk, 20 дек 2012.

  1. Gpk

    Gpk Нуб

    Прошу помочь
    Купил Ленту 5 метров на 150 светодиодов с адресной микросхемой - пытаюсь разобраться как
    по отдельности - включать - светодиод - при этом управлять яркостью и цветом.
    светодиодная лента имеет адресную микросхему TM1809 - сылка на PDF микросхемы http://www.deskontrol.net/descargas/datasheets/TM1809.pdf , а в плане сделать
    экран 150 на 150 таких диодов....
    управление нужно такое - номер светодиода, цвет, яркость...
    как по пдф - понимаю что это возможно...
    за ранее благодарю и надеюсь что эта тема будет весьма интересна для многих...
    С уважением к Вам Всем. Александр - новичок в ардуино...
    У меня Mega 2560
     
  2. nailxx

    nailxx Официальный Нерд Администратор

    На ленте, наверное, 50 таких микросхем? Если да, то котнролировать каждый светодиод довольно просто. Смотрите страницы 4 и 5 даташита. Представим, что у вас лента на 9, а не на 150 диодов и хочется сделать свечение радугой. Тогда код примерно будет выглядеть так:

    Код (Text):

     
    void transferColor(unsigned long color)
    {
        // берём бит за битом 24 раза
        for (unsigned long mask = (1 << 23); mask; mask >>= 1) {
            digitalWrite(DIN_PIN, HIGH);
            delayMicroseconds((color & mask) ? 1200 : 600);
            digitalWrite(DIN_PIN, LOW);
            delayMicroseconds((color & mask) ? 600 : 1200);
        }
    }
     
    void transferReset()
    {
        digitalWrite(DIN_PIN, LOW);
        delayMicroseconds(30);
        digitalWrite(DIN_PIN, HIGH);
    }
     
    void loop()
    {
        transferColor(0xFF0000ul); // каждый
        transferColor(0xFF9900ul); // охотник
        transferColor(0xFFFF00ul); // желает
        transferColor(0x00FF00ul); // знать
        transferColor(0x00FFFFul); // где
        transferColor(0x0000FFul); // сидит
        transferColor(0xFF00FFul); // фазан
        transferColor(0xFFFFFFul); // белый
        transferColor(0x000000ul); // чёрный
        transferReset();
     
        delay(1000);
    }
     
     
    Когда светодиодов больше девяти, просто увеличивается количество вызовов transferColor.
     
  3. Gpk

    Gpk Нуб

    enum { DIN_PIN = 13 };


    void setup()
    {
    digitalWrite(DIN_PIN, OUTPUT);
    }



    void transferColor(unsigned long color)
    {
    // берём бит за битом 24 раза
    for (unsigned long mask = (1 << 23); mask; mask >>= 1) {
    digitalWrite(DIN_PIN, HIGH);
    delayMicroseconds((color & mask) ? 1200 : 600);
    digitalWrite(DIN_PIN, LOW);
    delayMicroseconds((color & mask) ? 600 : 1200);
    }
    }

    void transferReset()
    {
    digitalWrite(DIN_PIN, LOW);
    delayMicroseconds(30);
    digitalWrite(DIN_PIN, HIGH);
    }

    void loop()
    {
    transferColor(0xFF0000ul); // каждый
    transferColor(0xFF9900ul); // охотник
    transferColor(0xFFFF00ul); // желает
    transferColor(0x00FF00ul); // знать
    transferColor(0x00FFFFul); // где
    transferColor(0x0000FFul); // сидит
    transferColor(0xFF00FFul); // фазан
    transferColor(0xFFFFFFul); // белый
    transferColor(0x000000ul); // чёрный
    transferReset();

    delay(1000);
    }
    // Спасибо -.. Правильно ли я составил программу ? и можете посоветовать литературу для начинающих ?
     
  4. nailxx

    nailxx Официальный Нерд Администратор

    Да, всё так. Пробуйте.

    По литературе не силён: давно всему этому учился. Нужен просто хороший самоучитель по C++.
     
  5. Gpk

    Gpk Нуб

    Еще Вопрос с контактами на Arduino Mega 2560 - Правильно ли я использую 13 контакт ??
    При проверки - лента не загорается -... я при положительном результате вылажу все получилось
     
  6. nailxx

    nailxx Официальный Нерд Администратор

    Да, 13-й вполне подойдёт. Если ничего не загорается, проверьте правильно ли подали питание. Объединили ли вы земли источников питания?
     
  7. Gpk

    Gpk Нуб

    Все проверил не получается -- если что то вечером скину фото ))
     
  8. Gpk

    Gpk Нуб

    Размер скетча в двоичном коде: 1 650 байт (из 258 048 байт максимум)
    avrdude: stk500v2_ReceiveMessage(): timeout
    avrdude: stk500v2_ReceiveMessage(): timeout
    avrdude: stk500v2_ReceiveMessage(): timeout
    avrdude: stk500v2_ReceiveMessage(): timeout
    avrdude: stk500v2_ReceiveMessage(): timeout
    avrdude: stk500v2_ReceiveMessage(): timeout
    avrdude: stk500v2_getsync(): timeout communicating with programmer

    Это сообщение выдает софт Arduino
     
  9. Gpk

    Gpk Нуб

    вот ещё вопрос
    digitalWrite(DIN_PIN, HIGH);
    delayMicroseconds((color & mask) ? 1200 : 600);
    digitalWrite(DIN_PIN, LOW);
    delayMicroseconds((color & mask) ? 600 : 1200); вроде значение должно быть в наносекундах??
     
  10. nailxx

    nailxx Официальный Нерд Администратор

    Да, в наносекундах, я ошибся.

    По прошивке — много раз поднималось на форуме. Попробуйте reset в разные моменты времени понажимать, убедитесь что в меню выбрана Mega.
     
  11. Gpk

    Gpk Нуб

    С прошивкой разобрался
    поменял на нано - результат тоже ноль :)



    enum{ DIN_PIN = 13 };
    //int DIN_PIN = 13;

    void setup()
    {
    digitalWrite(DIN_PIN, OUTPUT);
    // pinMode(DIN_PIN, OUTPUT);
    }



    void transferColor(unsigned long color)
    {
    // берём бит за битом 24 раза
    for (unsigned long mask = (1 << 23); mask; mask >>= 1) {
    digitalWrite(DIN_PIN, HIGH);
    delayMicroseconds((color & mask) ? 1.2 : 0.6);
    digitalWrite(DIN_PIN, LOW);
    delayMicroseconds((color & mask) ? 0.6 : 12);
    }
    }

    void transferReset()
    {
    digitalWrite(DIN_PIN, LOW);
    delayMicroseconds(1.8);
    digitalWrite(DIN_PIN, HIGH);
    }

    void loop()
    {
    transferColor(0xFF0000ul); // каждый
    transferColor(0xFF9900ul); // охотник
    transferColor(0xFFFF00ul); // желает
    transferColor(0x00FF00ul); // знать
    transferColor(0x00FFFFul); // где
    transferColor(0x0000FFul); // сидит
    transferColor(0xFF00FFul); // фазан
    transferColor(0xFFFFFFul); // белый
    transferColor(0x000000ul); // чёрный
    transferReset();

    delay(1000);
    }
     
  12. nailxx

    nailxx Официальный Нерд Администратор

    Не всё так просто. delayMicroseconds принимает только целочисленные аргументы. `delayMicroseconds(1.8)` приведёт к задержке на 1 мкс, не 1,8. Для работы на наносекундном уровне, смотрите топик на англоязычном форуме.
     
  13. Gpk

    Gpk Нуб

    Доброе время суток всем))
    глянул форум-- с трудом что понятно ..
    вот вопрос в Нано секудах таков
    можно ли в самой программе давать целое значение только в Наносекундах ? как например в Микросекундах - delayMicroseconds(1800); например в delayNanоseconds ??? как завести переменную в нано
    секундах ?
     
  14. Gpk

    Gpk Нуб

    Вот рабочая програмка взята с http://arduino.cc/forum/index.php/topic,133044.0.html

    Теперь нужно понять как мне сделать
    чтоб управлять одним из светодиодов
    например
    XY -НОМЕР ДИОДА НА ЛИНЕЙКИ
    R ЯРКОСТЬ ЦВЕТА
    G ЯРКОСТЬ ЦВЕТА
    B ЯРКОСТЬ ЦВЕТА

    PIXEL = XY, R, G, B;
    А ЗНАЧЕНИЕ
    ДОЛЖНО БЫТЬ ТАК ,
    PIXEL XY = 10, R = 8, G = 5, B = 3;

    ВОПРОС ТАКОЙ КАК МНЕ выполнить код чтоб значение на диод а именно на Номер диода
    передавались определенные значения яркость чвета и сам цвет



    #include <FastSPI_LED.h>

    #define NUM_LEDS 3 // Количество диодов в линейке

    // Грубо Смена начального цвета с RGB на BGR
    // struct CRGB { unsigned char b; unsigned char r; unsigned char g; };
    struct CRGB { unsigned char r; unsigned char g; unsigned char b; };
    struct CRGB *leds;

    #define PIN 4

    void setup() // я так понимаю что это подбор библиотеке
    {
    FastSPI_LED.setLeds(NUM_LEDS);
    FastSPI_LED.setChipset(CFastSPI_LED::SPI_TM1809);
    //FastSPI_LED.setChipset(CFastSPI_LED::SPI_LPD6803);
    //FastSPI_LED.setChipset(CFastSPI_LED::SPI_HL1606);
    //FastSPI_LED.setChipset(CFastSPI_LED::SPI_595);
    //FastSPI_LED.setChipset(CFastSPI_LED::SPI_WS2801);

    FastSPI_LED.setPin(PIN);
    FastSPI_LED.setDataRate(0);
    FastSPI_LED.init();
    FastSPI_LED.start();

    leds = (struct CRGB*)FastSPI_LED.getRGBData();
    }

    void loop() {

    // random
    int i;
    memset(leds, 0, NUM_LEDS * 3);

    for(int j = 0; j < 5000; j++) {
    //for(int i = 0 ; i < NUM_LEDS; i++ ) {
    //memset(leds, 0, NUM_LEDS * 3);
    //randomSeed(analogRead(0));
    randomSeed(analogRead(0));
    i = random(0, NUM_LEDS);
    randomSeed(analogRead(0));
    leds.r = random(0, 255);
    randomSeed(analogRead(0));
    leds.g = random(0, 255);
    randomSeed(analogRead(0));
    leds.b = random(0, 255);
    FastSPI_LED.show();
    //delay(20);
    //}
    }

    // one at a time
    for(int j = 0; j < 7; j++) {
    for(int i = 0 ; i < NUM_LEDS; i++ ) {
    memset(leds, 0, NUM_LEDS * 3); //apagado
    switch(j) {
    case 0: leds.r = 255; break;
    case 1: leds.g = 255; break;
    case 2: leds.b = 255; break;
    case 3: leds.r = 255; leds.b = 255; break;
    case 4: leds.g = 255; leds.r = 255; break;
    case 5: leds.b = 255; leds.g = 255; break;
    case 6: leds.r = 255; leds.g = 255; leds.b = 255; break;
    }
    //delay(10);
    FastSPI_LED.show();
    //delay(10);
    }
    }

    // growing/receeding bars
    for(int j = 0; j < 7; j++) {
    memset(leds, 0, NUM_LEDS * 3);
    for(int i = 0 ; i < NUM_LEDS; i++ ) {
    switch(j) {
    case 0: leds.r = 255; break;
    case 1: leds.g = 255; break;
    case 2: leds.b = 255; break;
    case 3: leds.r = 255; leds.b = 255; break;
    case 4: leds[i].g = 255; leds[i].r = 255; break;
    case 5: leds[i].b = 255; leds[i].g = 255; break;
    case 6: leds[i].r = 255; leds[i].g = 255; leds[i].b = 255; break;
    }
    FastSPI_LED.show();
    //delay(10);
    }
    for(int i = NUM_LEDS-1 ; i >= 0; i-- ) {
    switch(j) {
    case 0: leds[i].r = 0; break;
    case 1: leds[i].g = 0; break;
    case 2: leds[i].b = 0; break;
    case 3: leds[i].r = 0; leds[i].b = 0; break;
    case 4: leds[i].g = 0; leds[i].r = 0; break;
    case 5: leds[i].b = 0; leds[i].g = 0; break;
    case 6: leds[i].r = 0; leds[i].g = 0; leds[i].b = 0; break;
    }
    FastSPI_LED.show();
    //delay(1);
    }
    }

    // Fade in/fade out
    for(int j = 0; j < 7; j++ ) {
    memset(leds, 0, NUM_LEDS * 3);
    for(int k = 0; k < 256; k++) {
    for(int i = 0; i < NUM_LEDS; i++ ) {
    switch(j) {
    case 0: leds[i].r = k; break;
    case 1: leds[i].g = k; break;
    case 2: leds[i].b = k; break;
    case 3: leds[i].r = k; leds[i].b = k; break;
    case 4: leds[i].g = k; leds[i].r = k; break;
    case 5: leds[i].b = k; leds[i].g = k; break;
    case 6: leds[i].r = k; leds[i].g = k; leds[i].b = k; break;
    }
    }
    FastSPI_LED.show();
    delay(3);
    }
    for(int k = 255; k >= 0; k--) {
    for(int i = 0; i < NUM_LEDS; i++ ) {
    switch(j) {
    case 0: leds[i].r = k; break;
    case 1: leds[i].g = k; break;
    case 2: leds[i].b = k; break;
    case 3: leds[i].r = k; leds[i].b = k; break;
    case 4: leds[i].g = k; leds[i].r = k; break;
    case 5: leds[i].b = k; leds[i].g = k; break;
    case 6: leds[i].r = k; leds[i].g = k; leds[i].b = k; break;
    }
    }
    FastSPI_LED.show();
    delay(3);
    }
    }
    }[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
     
  15. sochicity

    sochicity Нерд

    Вообще, чтобы из ленты делать экран существуют специальные контроллеры и софт. В софте рисуете экран (например Ваш пример 150х150), загоняете туда avi и делаете захват. После чего контроллер можно отключить от компьютера и он будет гонять Ваш ролик на самодельном экране уже офлайн. Если это экран, то не знаю какими познаниями в математике нужно обладать, чтобы что-то вразумительное вывести на него с Ардуино, если это цветовая эффект-панель, то другой разговор. И еще. Лента 150 не годится для экрана. Сам пиксель 0,5см а расстояние между пикселями 3,3см. Откройте любой рисунок фотошопом. Измените его размеры до 1050Х1050 пикселей, а теперь на каждый столбец в 1 пиксель 6 следующих закрасьте черным, то же самое сделайте по горизонтали. В итоге получите примерную симуляцию результата.
     
  16. Gpk

    Gpk Нуб

    на базе этой идеи хочется создать очень грандиозный проект - который построен на принципах настоящего проекта - как основа понимания принципов работы с пикселем - и обработкой видео потока
     
  17. sochicity

    sochicity Нерд

    Так же Вы написали, что у Вас в планах сделать экран 150х150 Я думаю Вы погорячились.
    Вы за 1х150 отдали примерно 2500 рублей, то есть у Вас в планах потратить еще примерно 375 000 рублей + около 80 000 рублей на блоки питания + контроллеры. Если покупать в китае, то дешевле, но таможня Вас так просто не отпустит с таким заказом. Можете четко обозначить Ваши цели, при таком вложении денег? Существуют другие технологии для создания экранов, а лента это в объемной букве фон подсветить.
     
  18. sochicity

    sochicity Нерд

    Вы изобретатель? Если для Вас главное принципы данного проекта и обработка видео потока через ардуино, то Вам хватит и одной ленты, зачем 150? Если Вам необходим грандиозный проект и главное результат того, что будет показано на экране, то Вам нужен специальный контроллер и изобретать велосипед не нужно. Вам нужен работающий экран или экран работающий через ардуино?
     
  19. Gpk

    Gpk Нуб

    РЕбята )))) Идея обработки -- и мне нужны хорошие умы - я большого проекта. на базе этого проекта будет создано весьма интересное и очень доступное..... я положил очень много времени для того чтоб отказаться - я знаю что все получится просто нужны или единомышленники которым могу открыть проект полностью или ваша частичная помощь в построении данного начального проекта
     
  20. sochicity

    sochicity Нерд

    В общем Вы хотите на базе ардуино сделать контроллер для самодельных экранов на базе лент с адресными схемами?