Автоматическая подсветка лестницы и MM5450

VitaliyD
Offline
Зарегистрирован: 10.05.2013

Недавно поднял свою М5451, решил воскресить идею плавного поджига. Однако так и не могу разобраться с подобной штукой const uint32_t mask = 0b11111111111111111111; для мну это тёмный лес

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

PS хотел добавить maksim читаю везде твои ответы в помощь и могу сказать что во всех темах где бы ты небыл всегда помогаешь своими намеками ))) побольше бы таких как ты здесь

izqbr
Offline
Зарегистрирован: 08.02.2014

Поделитель печаткой пожалуйста если есть у кого нибудь.....

Brutal
Offline
Зарегистрирован: 14.03.2013

Я делал печатку из ссылки на автора (1 странице в 1 моем посте). Только у меня драйвер ММ5450YN так я по питанию что то менял (моя вроде на 5В, точно не помню уж...)

VitaliyD
Offline
Зарегистрирован: 10.05.2013

ты использовал ШИМ ?

dimanok88
Offline
Зарегистрирован: 04.03.2014

Помогите разобраться, пожалуйста.

Есть лед драйвер M5451b7. Подключаю все ножки какие задействованы и получаю что плавного поджига нет. И не смог разобраться как зажигать светодиоды поочередно.
На данный момент они загораются сразу все.

#include "lightuino5.h"

void println(char*s);
void print(char*s);
void print(int i,char format=DEC);
void println(int i,char format=DEC);

// Standard Arduino "setup" function
void setup(void)
  {
  // Start up the serial port.  This is not required for the lightuino, I'm just doing it so I can print stuff.
  Serial.begin(9600);
  Serial.println("serial initialized");              // This line need to be removed if #ifdef is removed too!
  //pinMode(Lightuino_SER_DATA_LEFT_PIN, OUTPUT);
  //pinMode(Lightuino_CLOCK_PIN, OUTPUT);
  digitalWrite(Lightuino_CLOCK_PIN, HIGH);
  digitalWrite(Lightuino_SER_DATA_LEFT_PIN, HIGH);
  // Say hi so we know its working!
  println("Lightuino 4/5 Introduction Sketch V5.0");
  }
  
// Create the basic Lightuino 70 LED sink controller (the pins in the 2 40-pin IDE connectors)
LightuinoSink sinks;   
// Create the Lightuino 16 channel source driver controller (the 16 pin connector)

// This object PWMs the Lightuino sinks allowing individual LED brightness control, and provides array-based access to the Leds
FlickerBrightness pwm(sinks);


//?? Printf-style to the USB
void p(char *fmt, ... )
{
        char tmp[128]; // resulting string limited to 128 chars
        va_list args;
        va_start (args, fmt );
        vsnprintf(tmp, 128, fmt, args);
        va_end (args);
}

//?? A wrapper around delay so you can tweak how long the delays actually are...
/* Do a delay, but also wait for user input if a global var is set */
char waitInput=false;
boolean mydelay(int amt)
{
  char incomingByte =0;
  delay(amt);
  if (waitInput)
    {
      // Wait for input from serial or usb serial
      while ((Serial.available()==0))
        delay(10);
    }

  if (Serial.available())
    incomingByte = Serial.read();
  if (incomingByte == 's')
    {
      println("stop");
      waitInput=true;
    }
  else if (incomingByte == 'c')
    {
      println("continue");
      waitInput=false;
    }
  else if (incomingByte == 'n')
    {
      println("next animation");
      return false;
    }
  return true;
}

//?? This function demonstrates PWM control over the LED sinks
void SinkPwmDemo()
  {
  println("Now show brightness changes (PWM control)");
  sinks.setBrightness(30);
  // Start PWMing automatically at around 4000hz.  Generally you'd do this at the beginning of your sketch and leave it on the entire time, not at the beginning of a function.
  pwm.StartAutoLoop(4000);
  
  //pwm.brightness[0] = Lightuino_MAX_BRIGHTNESS-1;
  //delay(2000);
        
  for (int i=0;i<70;i++) 
    {
    p("PWM index %d\n",i);
    pwm.brightness[i] = Lightuino_MAX_BRIGHTNESS-1;
    mydelay(250);    
    } 
        
  for (int j=0;j<600;j++)
    {
    // You just set leds.brightness[LED_NUMBER] to the desired intensity (0 to LIGHTUINO_MAXBRIGHTNESS-1).
    // Note that you will see blinking at low intensities, so the minimum brightness you can set is around 30

    // Here I will set each LED to a slightly different intensity.
    for (int i=0;i<70;i++)
      pwm.brightness[i] = (((i*3)+j)*100)%Lightuino_MAX_BRIGHTNESS;  // Your homework is to figure out why this formula works! :-)
    
    // The CPU controls the rapid blinking that creates the variable brightness effect
    // so you must call leds.loop() rapidly to make it happen.
    // Note: You can also set it up so that the Lightuino library calls this function periodically automatically
    // by calling StartAutoLoop, which is what we have done above.
    //for (int i=0;i<400;i++) pwm.loop();
    
    delay(10);  // Because I am using "auto loop" I can do a normal "delay" and pwm.loop will be called in the background.
    }
    
    //  All done! So turn off all the LEDs
  for (int i=0;i<70;i++) pwm.brightness[i] = 0;
  pwm.StopAutoLoop();
  pwm.loop();
  }
  




void loop(void)
{
  SinkPwmDemo();
}

void println(char*s)
{
  Serial.println(s);
}

void print(char*s)
{
  Serial.print(s);
}
void print(int i,char format)
{
  Serial.print(i,format);
}

void println(int i,char format)
{
  Serial.println(i,format);
}

Задать яркость для светодиодов получилось используя  sinks.setBrightness(30); 
Если я правильно понял, то так можно указать яркость для любого светодиода pwm.brightness[0] = 255 ? Так у меня не зработало к сожалению. Загораются все светодиоды сразу.

Подскажите пожалуйста что делаю не так?
 

 

dimanok88
Offline
Зарегистрирован: 04.03.2014

если кому интересно нашел код где реализован и плавный поджиг и еще некоторые варианты зажигания светодиодов. http://effluviaofascatteredmind.blogspot.ru/2009/02/arduino-and-m5451-control-35-leds.html
Только не понимаю, как можно зажечь нужный мне светодиод. Например что нужно сделать чтобы загорелся светодиод №7 или 20?

Brutal
Offline
Зарегистрирован: 14.03.2013

dimanok88 пишет:

если кому интересно нашел код где реализован и плавный поджиг и еще некоторые варианты зажигания светодиодов. http://effluviaofascatteredmind.blogspot.ru/2009/02/arduino-and-m5451-control-35-leds.html
Только не понимаю, как можно зажечь нужный мне светодиод. Например что нужно сделать чтобы загорелся светодиод №7 или 20?

Ето если уважаемый Максим увидит, то думаю подскажет. Мне он очень помог !!!

Bierman
Offline
Зарегистрирован: 13.05.2014

dimanok88 пишет:

если кому интересно нашел код где реализован и плавный поджиг и еще некоторые варианты зажигания светодиодов. http://effluviaofascatteredmind.blogspot.ru/2009/02/arduino-and-m5451-control-35-leds.html
Только не понимаю, как можно зажечь нужный мне светодиод. Например что нужно сделать чтобы загорелся светодиод №7 или 20?

 

По Вашей ссылке в камментах пишут:

Anonymous, the "set" function takes a number whose binary representation corresponds to which LEDs are on (1=on, 0=off). For example, "1" turns on the first LED, "2" the second, and "3" both the first and the second. Not by pin number, but by "output" number (see the M5451 spec)
So to turn on pins 30,36,and 40. They correspond to outputs 28,22 and 18 respectively. So do:
leds.set((1<<18)|(1<<22)|(1<<28),0).

Тобиш... на примере: 30, 36 и 40й согласно даташита на их контроллере 5451 соответствуют 28, 22 и 18. =>

leds.set((1<<18)|(1<<22)|(1<<28),0)

 

 

denyang
Offline
Зарегистрирован: 05.08.2013

Что то ветка затихла... Неужели ни у кого не полчилось реализовать плавный поджиг? Из поста 106 я узнал как плавно поджигать один канал, а вот как заставить остальные продолжать светиться так и не понял.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

denyang пишет:

Что то ветка затихла... Неужели ни у кого не полчилось реализовать плавный поджиг? Из поста 106 я узнал как плавно поджигать один канал, а вот как заставить остальные продолжать светиться так и не понял.


А что тут обсуждать, лестница с подсветкой это ни в какой дизайн не засунуть. Зато секса с проводами вагон.

denyang
Offline
Зарегистрирован: 05.08.2013

На счет дизайна не скажи... Вон у изначального автора ( по чей статье ветка и появилась) на страничке видео работы подсветки. На мой взгляд очень даже ничего. С проводами - да, придется повозиться

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

denyang пишет:

На счет дизайна не скажи... Вон у изначального автора ( по чей статье ветка и появилась) на страничке видео работы подсветки. На мой взгляд очень даже ничего. С проводами - да, придется повозиться

 


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

Brutal
Offline
Зарегистрирован: 14.03.2013

У меня работает без нареканий. Плавная подсветка конечно интересно, но из практики, думаю не очень уместна будет, так как скорость подьема и спуска по лестнице почти всегда будет "быстрее" чем плавное засвечивание светиков. У меня на ступени всего по 1 светику стоит и глаза не слепит, а  яркости хватает более чем ! В полной темноте в комнате можно чуть не книжку читать ;). С проводками канешн немного потягать, повозиться, попаять надо, но оно того стоит ! Я еще примитивное бесперебойное питание к схемке пришаманил: есть 220 - работает от БП, нету - работает от АКБ (схема "бесперебойника" простая на диодах итд). Так что при пропадании сети 220 можно комнату освещать стоя возле датчика или положив чето на 1 и последнюю ступень;) - шутка.

Serg010
Offline
Зарегистрирован: 19.04.2013

А что ты хотел - лето, отпуск, природа, дача, у кого-то стройка или ремонт, да и вообще много разных интересных занятий. Ближе к зиме, я думаю, ветка опять оживет. Надо же как-то коротать долгие зимние вечера:))

Serg010
Offline
Зарегистрирован: 19.04.2013

denyang пишет:

Что то ветка затихла... Неужели ни у кого не полчилось реализовать плавный поджиг? Из поста 106 я узнал как плавно поджигать один канал, а вот как заставить остальные продолжать светиться так и не понял.

 

А что ты хотел - лето, отпуск, природа, дача, у кого-то стройка или ремонт, да и вообще много разных интересных занятий. Ближе к зиме, я думаю, ветка опять оживет. Надо же как-то коротать долгие зимние вечера:))

Bierman
Offline
Зарегистрирован: 13.05.2014

Brutal пишет:

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

а если немного уменьшить delay?

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

 

PS сколько тут оффтопа

Brutal
Offline
Зарегистрирован: 14.03.2013

Bierman пишет:

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

Я уже писал выше - У меня на ступени всего по 1 светику стоит и глаза не слепит, а  яркости хватает более чем !

dangear
Offline
Зарегистрирован: 09.04.2014

Всем привет! тоже озадачился созданием такого вот девайса, но ждать M5450 не стал и собрал на имеющемся регистре  74HC595 прототип из 8-и светодиодов. При желании их можно объединить в цепь из 3-4 регистров для длинных лестних, т.е. 4 регистра по 8 светодиодов = 32 светодиода.

В принципе все работает, но есть пару моментов:
- точно так же не разобрался с плавностью загарания и затухания. Впринципе не особо актуально, но у меня в проекте точно так же как и у автора на Хабре подсвечена первая и последняя ступень и хочется отрегулировать их яркость (чтобы глазане резало).
- думаю как реализовать подключение светодиодной ленты 12В. Есть мысли посадить каждый регистр на дарлингтон ULN2803A. Кто что скажет по этому поводу?
- Если будут рекомендации по правке и улучшению кода, то буду рад выслушать! Писалось все самостоятельно и собиралось отовсюду.

Что умеет:
- определять день/ночь
- тестовый режим при включении
- горят первая и последняя ступени (если указать в параметрах)

В процессе:
- нужно дописать сценарий при котором срабатывает датчик и сверху и снизу одновременно
- переделать тестовый запуск для проверки всех светодиодов (поморгать, пройтись по сценарию, произвольные фигуры)
- наивный поиск плавного свечения и установки яркости на первой и последней ступени

Собственно сам код (прошу обратить внимание, что все делалось для одной 74HC595 и функция срабатывания двух датчиков во время выполнения сценария одного из них тоже пока не работает):
 

#include <SPI.h>

// Датчик освещенности
int lightState = A0;

//Устанавливаем контакты для нижнего датчика
#define  T1  4
#define  E1  3

//Устанавливаем контакты для верхнего датчика
#define  T2  6
#define  E2  5

enum { REG_SELECT = 8 }; // пин, управляющий защёлкой (SS в терминах SPI)


// Биты для включения вверх 
static uint8_t stairUp[] = {
  B00000000,
  B00000001,
  B00000011,
  B00000111,
  B00001111,
  B00011111,
  B00111111,
  B01111111,
  B11111111,
  B11111110,
  B11111100,
  B11111000,
  B11110000,
  B11100000,
  B11000000,
  B10000000,
  B00000000,
};
// Биты для включения вниз 
static uint8_t stairDown[] = {
  B00000000,
  B10000000,
  B11000000,
  B11100000,
  B11110000,
  B11111000,
  B11111100,
  B11111110,
  B11111111,
  B01111111,
  B00111111,
  B00011111,
  B00001111,
  B00000111,
  B00000011,
  B00000001,
  B00000000,
};
// Биты режима ожидания
static uint8_t waitByte[] = {
  B00000000,
  B10000001,
};
// Биты при включении обоих датчиков
static uint8_t allSens[] = {
  B11111111,
};

int freez  = 3000; // Время задержки затухания
int pulsar = 200; // Время задержки между ступеньками
boolean mode = false; // Режим ожидания true|false
int dist = 50; // Расстояние срабатывания датчика
int lightInt = 400; // Чувствительность света

void setup()
{
  SPI.begin();
  pinMode(REG_SELECT, OUTPUT);
  pinMode(T1, OUTPUT);
  pinMode(E1, INPUT);
  pinMode(T2, OUTPUT);
  pinMode(E2, INPUT);
  pinMode(lightState, INPUT);
  
  // Тестируем при включении
  test(3, 300);
}

void loop()
{
  int light = analogRead(lightState);
  
  if (mode != 0 && light < lightInt) waitMode(1); // Проверяем включен ли режим ожидания и уровень света
  else waitMode(0);
  
  if (light < lightInt) { // Если в помещении темно
  int D1 = Ultrasonic(T1, E1); // измеряем расстояние нижнего датчика
  int D2 = Ultrasonic(T2, E2); // измеряем расстояние верхнего датчика
  // если срабатывает нижний датчик, то включаем подсветку наверх
  if(D1 > 0 && D1 < dist) // Проверям расстояние
  {
    up(); // Запускаем функцию подъема
  }
  // если срабатывает верхний датчик, то включаем подсветку вниз
  if(D2 > 0 && D2 < dist) // Проверям расстояние
  {
    down(); // Запускаемфункцию спуска
  }
  }
}


// Функция для движения вверх 
void up() {
  int count = sizeof(stairUp); // количество ступеней (вернее массив из данных для ступеней)
  int start = 0; // Начальный бит
  int D2 = Ultrasonic(T2, E2); // измеряем расстояние верхнего датчика
  if (mode != 0) { // Если включен режим ожидания (нужен для корректной работы режима ожидания)
    count = sizeof(stairUp) - 1; // Убираем последний бит из массива, который зажигает последнюю ступень
    start = 1; // Начинаем отсет со второго бита массива
  }
  for(int i = start; i < count; i++) {
    if (i == sizeof(stairUp)/2+1) { // Зажигаем все ступени поочереди, ждем (интервал указывается в параметрах) и гасим
      delay(freez);
    }
    if (D2 > 0 && D2 < dist) {
      allOn();
      break;
    }
      digitalWrite(REG_SELECT, LOW);
      SPI.transfer(stairUp[i]); // Записываем биты поочередно
      digitalWrite(REG_SELECT, HIGH);
      delay(pulsar);
  }
}


// Функция для движения вниз
void down() {
  int count = sizeof(stairDown);
  int start = 0;
  int D1 = Ultrasonic(T1, E1); // измеряем расстояние нижнего датчика
  if (mode != 0) { // Если включен режим ожидания (нужен для корректной работы режима ожидания)
    count = sizeof(stairDown) - 1; // Убираем последний бит из массива, который зажигает последнюю ступень
    start = 1; // Начинаем отсет со второго бита массива
  }
  for(int i = start; i < count; i++) {
    if (i == sizeof(stairDown)/2+1) { // Зажигаем все ступени поочереди, ждем (интервал указывается в параметрах) и гасим
      delay(freez);
    }
    if (D1 > 0 && D1 < dist) {
      allOn();
      break;
    }
      digitalWrite(REG_SELECT, LOW);
      SPI.transfer(stairDown[i]); // Записываем биты поочередно
      digitalWrite(REG_SELECT, HIGH);
      delay(pulsar);
    }
}


// Функция при одновременном срабатывании верхнего и нижнего датчиков (пока не работает)
void allOn() {
      digitalWrite(REG_SELECT, LOW);
      SPI.transfer(allSens[0]);
      digitalWrite(REG_SELECT, HIGH);
      delay(pulsar);
}


// Функция тестирования при включении
void test(int n, int d)
{ 
  /* Записываем значение в сдвиговый регистр */
  for (int x = 0; x < n; x++) {
    digitalWrite(REG_SELECT, LOW);
    SPI.transfer(255);
    digitalWrite(REG_SELECT, HIGH);
    delay(d);
    digitalWrite(REG_SELECT, LOW);
    SPI.transfer(0);
    digitalWrite(REG_SELECT, HIGH);
    delay(d);
  }
}

// Функция режима ожидания (подсвечивается нижняя и верхняя ступеньки)
void waitMode(int wstate)
{ 
  digitalWrite(REG_SELECT, LOW);
  SPI.transfer(waitByte[wstate]);
  digitalWrite(REG_SELECT, HIGH);
}


// Функиця датчика расстояния
int Ultrasonic(byte Trig_pin, byte Echo_pin)
{
  digitalWrite(Trig_pin, HIGH);
  delayMicroseconds(10);
  digitalWrite(Trig_pin, LOW);   
  return pulseIn(Echo_pin, HIGH, 20000)/29.0/2;
}

 

YRA
Offline
Зарегистрирован: 10.01.2015

Ну объясните что не так делаю. Плата ANDRUINO UNO.

1.Загружаю счкетч от уважаемого maksim  из поста#8 с помощью Andruino 1.0.6, мигает сетодиод"L". перемигавают светодиоды зеленого света "ТX","RX"- зажигается светодиод "L".

2 Получаю ответ от программы "Загрузка выполнена","Размер скетча в двоичном коде 1258 байт(из 32256 байт) и сведения об объеме скетча, а светодиод "L" горит постояно.

Далее подключаю к драйверу5450в7 согласно схемы от Лукьянова на монтажке и тишина.

Заливаю блинк"L" мигает. т.е платка рабочая. Может подскажите , как драйвер проверить?

 

maksim
Offline
Зарегистрирован: 12.02.2012

   

YRA
Offline
Зарегистрирован: 10.01.2015

Я, нашел, что диод "L" контролирует и  оповещает о наличии и состоянии уровня на 13 ноге. Далее, как я понимаю, на входе DATA  М5450В7 должна быть последовательность импульсов. Если поставить там светодиод, через сопротивление, ну так  Om  в 470, могу я увидеть что идет последовательность импульсов, не навредя  UNO, для контроля работы. Я прошу, конечно прощения, если что-то не так объясняю, но в 56 несколько тяжко разбираться.

YRA
Offline
Зарегистрирован: 10.01.2015

ЧИП АMTEGA328P-PU на ANDRUINO UNO R3. Если при записи скетча "BLINK" светодиод "L" мигает, при уменьшении значения в скетче значения delay(1000)на (100), частота мигания в десять раз возрастает.Это дает мне право считать что UNO работоспособна.Заливаю скетч от уважаемого MAXSIM из 8-го,  или из 17-го поста, собираю схему от Лукьянченко, но без подключения датчиков движения и датчика освещенности, т.к в скетчах  вышеуказанных они не участвуют, так можно или мне нужно схему собирать полностью????. Вопрос такого плана - насколько я понимаю строки

01 //Устанавливаем контакты для драйвера
02 #define  DATA  6
03 #define  CLOCK 7

 

задают выходы UNO R3 c чипом amtega 328P-PU c  которых я должен снять соответствующие  сигналы, что соответствует принципиальной схеме от  Автора. Питание на UNO R3 подаю с USB компа, а на плату монтажную с М5450В7 и светодиодами 12V через,резисторы 470Om, подключенными на общий минус, и на ноги драйвера со 2-й по -19-ю 9 вольт от отдельного источника, земли UNO и монтажки соеденены. Наиличие всех контактов проверено с помощью тестера и по контактам, и по наличию наружек.

Ну ничего не вижу далее, может у кого было такое? Драйвер поставил другой? новый, питание присутствует на ногах и драйвера, и светодиды красные на UNO горят, еще раз прошу сказать если, конечно, это известно, можно замерить тестером или светодиод поставть на 6 ногу разъема  UNO R3. Там же последватльность импульсов доkжна наблюлдаться/

 

dimanok88
Offline
Зарегистрирован: 04.03.2014

Мне кажется, что лучше нарисовать схему что и как подключено, чтобы не сидеть не представлять и так будет понятнее всем.

YRA
Offline
Зарегистрирован: 10.01.2015

 Да вот так, только  на проводах собрано на мотажке и между UNO R3  и мотажкой три провода

1. "-"

2. "DATA" 6-й контак.

3. "CLOCK" -7-й контакт

https://yadi.sk/i/U47fMCtKeXSi2

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

YRA

На VDD (20) драйвера подаёте 12v, на Brightness (19) 12v через резистор 1 кОм. С ардуино у вас все правильно. Минус общий (VSS(1), и все GRD). На ноги с 2 по 18 минусы светодиодов. Плюс на светодиодах общий. Т.е. по команде драйвер замыкает ноги (в Вашей схеме с 2-й по 18-ю и 39,40 ) на ноль (-).

Без датчиков движения скетч работать не будет. Даже с одним работает неодекватно (проверено на личном опыте).

YRA
Offline
Зарегистрирован: 10.01.2015

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

Я проверил осцилографом на входах- импульсы идут как по  даташит, и диодиы засветились, не преремигивая, правда пока, но может быть т.к нет датчиков движения, но в восьмом посте в скетче датчики не участвуют, как я понимаю. MAXSIM поэтапно развивал скетч. Спасибо за участие буду пробывать далее. "Упорство и труд-все перетрут!"

YRA
Offline
Зарегистрирован: 10.01.2015

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

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

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

Я заказывал два драйвера в Китае, один точно работает, а второй ещё не проверял.

Я ещё в схему добавил на выходы транзисторные сборки irf7314 и подтягивающие резисторы. В результате на каждый канал теперь можно вешать нагрузку до 5А. Железо работает отлично, а вот с программой нужно ещё поработать.

Спасибо maksim за сделаный им скетч, в нем хоть понятно что куда и как.

Хотелось бы ещё добавить:

1) Ночную подсветку (в пол накала) первой и последней ступени.

2) Плавный поджиг ступений (ШИМ).

Ну и уж совсем баловство.

3) Бегущую тень во время включонной подсветки.

Так как в програмировании к сожалению я полный профан, то одна надежда на местных гуру программирования, таких как maksim.

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

По хорошему М5450 лучше заменить на TLC5940NT. Она в три раза дешевле и найти её легче. Но там как я понимаю уже другое управление и надо всё заново рисовать и переписываать.

dimanok88
Offline
Зарегистрирован: 04.03.2014

На драйвере М5450 нет встроенного ШИМ. Он есть в драйвере М5451. Я на нем собирал схему там ШИП работает отлично.

Код я взял от сюда (давал ссылку ранее) http://effluviaofascatteredmind.blogspot.ru/2009/02/arduino-and-m5451-control-35-leds.html  и модифицировал его - убрал все лишнее, оставил только нужное. Дописал код для датчиков освещения и движения.  В коде (из ссылки) очень просто реализуется включение с определнной яркостью первой и последней ступенек.

Для тех кто пользуется linux могу посоветовать для программирвоания под ардуино ArduIDE http://www.mupuf.org/project/arduide.html  Во много раз лучше стандартной  от ардуино.

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

Тоесть на М5450В7 ШИМ, а вместе с ним и плавный поджиг работать не будет?

Ссылка не работает.

А включение с определённой яркостью первой и последней ступеней можно реализовать на М5450В7 ?

 

dimanok88
Offline
Зарегистрирован: 04.03.2014

kruzhnoff пишет:

Тоесть на М5450В7 ШИМ, а вместе с ним и плавный поджиг работать не будет?

Ссылка не работает.

А включение с определённой яркостью первой и последней ступеней можно реализовать на М5450В7 ?

В ссылке закрался в конце символ какой то, вот рабочая http://effluviaofascatteredmind.blogspot.ru/2009/02/arduino-and-m5451-co...

Если я сам правильно понимаю, то да ШИМ не получистя сделать через драйвер М5450. Возможно есть способ что-то добавить в схему для того чтобы просиходило плавное зажигание. Я на самом деле отказался от плавного зажигания каждой ступеньки, т.к. не вижу смысла в этом, поо этому поводу писали выше тоже. :-)  НА последний вопрос не знаю ответа, но предпологаю что если нет ШИМ то и задать определенную яркость не выйдет.

 

YRA
Offline
Зарегистрирован: 10.01.2015

kruzhnoff, а схемку , как Вы подключали   irf7314 и подтягивающие резисторы, можно? Я пока на монтажке воюю, но в принципе нарисовал уже печаку в электронном виде, так что надо будет поискать  сборку в городе и внести сразу изменения 

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

YRA

Поключал как на этой схеме, только без конденсаторов и резистор 47кОм заменил на 10кОм. 

 

Я щас не дома и свою схему и плату выложить не могу.

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

dimanok88 пишет:
Если я сам правильно понимаю, то да ШИМ не получистя сделать через драйвер М5450. Возможно есть способ что-то добавить в схему для того чтобы просиходило плавное зажигание. Я на самом деле отказался от плавного зажигания каждой ступеньки, т.к. не вижу смысла в этом, поо этому поводу писали выше тоже. :-)  НА последний вопрос не знаю ответа, но предпологаю что если нет ШИМ то и задать определенную яркость не выйдет.

Я вот тоже не сильный специалист в этих микросхемах, но когда заказывал у Китайцев то у них в названии продукта написано М5451 М5450В7.

http://www.aliexpress.com/item/2-M5451-M5450B7-ST-PDIP-40/1941916796.html

Вот я и думаю, может это одно и тоже.

Мне наоборот кажется что с ШИМ будет хорошо смотрется. Как будто лавина сходит или вода стекает. 

YRA
Offline
Зарегистрирован: 10.01.2015

Ну даташит у них один М5451 и М5450в7. Т.е. одна сборка на два бита. Да схема это дело второе.

dimanok88
Offline
Зарегистрирован: 04.03.2014

Я тоже покупал у китайцев но там написано было M5451B7, у вас явно написано на фотке М5450B7 что не является М5451 значит и ШИМа там нет. 

Я пока тестирую на светодиодах. На днях хочу  подключить светодиодные летные куски, которые будут крепится на ступеньки.  В коде если разберусь до конца может и сделаю ШИМ на ступеньки. Первоначальная задача схему сделать и плату собрать чтоб работало все, а то все пока на макетке на проводках висит :-)

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

dimanok88 пишет:
Я пока тестирую на светодиодах. На днях хочу  подключить светодиодные летные куски, которые будут крепится на ступеньки. 

На одном драйвере много ленты не запитаеш. Нужно транзисторы на выход ставить для увеличения мощности.

Щас смотрел даташит на М5450В7 он действительно один и на M5451 и М5450В7 и про отличия в ШИМ там нечего не написано ровно как и про сам ШИМ.

А если ШИМ не делать, то какой смысл от того скетча на который Вы давали ссылку?

Если скетч с Вашей ссылки полностью загрузить поменяв только в нем номера выходов (DATA, CLOCK) то он будет работать на нашей схеме? Хочу опытным путем проверить наличие ШИМ.

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

YRA пишет:
Т.е. одна сборка на два бита.
В одной сборке два Р-канальных полевых транзистора.

dimanok88
Offline
Зарегистрирован: 04.03.2014

Да я знаю что там на одном драйвере не уедишь ) собираюсь использовать  ULN2003 Для начала и посмотреть на результат.

Да тот скетч я загружал и все работало сразу и видно было как работает ШИМ и все остальное. Потом уже в коде разбирался что и для чего.

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

 ULN2003 не подайдёт! Я уже на эти грабли наступал.

Проблема в том, что ULN2003 управляется плюсом. Т.е. что бы транзистор открылся (а  ULN2003 это транзисторная сборка) нужно на базу транзистора подать плюс, а у нас контроллер замыкает на минус. По этому я использовал P-канальные полевые транзисторы у них как раз для открытия нужно замкнуть базу (управляющий электрод) на минус.

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

Попробывал сейчас загрузить скетч из Вашей ссылки. Может кроме номеров выходов (clock, data) ещё надо было что то поменять? А то у меня просто диоды светятся и всё.

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

Урааааа! Заработало!

Нашол скетч на другом ресурсе, загрузил всё работает. Затухает, переливается, медленно разгорается, пускает каметы и т.д. Вывод однозначный М5450В7 ШИМ поддерживает.

Теперь надо двигаться дальше и добавить эти спецэфекты в скетч от maksimа или наоборот.

YRA
Offline
Зарегистрирован: 10.01.2015

А ссылку на ресурс можно глянуть???

 

dimanok88
Offline
Зарегистрирован: 04.03.2014

kruzhnoff пишет:

 ULN2003 не подайдёт! Я уже на эти грабли наступал.

Проблема в том, что ULN2003 управляется плюсом. Т.е. что бы транзистор открылся (а  ULN2003 это транзисторная сборка) нужно на базу транзистора подать плюс, а у нас контроллер замыкает на минус. По этому я использовал P-канальные полевые транзисторы у них как раз для открытия нужно замкнуть базу (управляющий электрод) на минус.

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

YRA
Offline
Зарегистрирован: 10.01.2015
 Ага туплю с утра по ссылке из поста #132 , как я понял надо  в этих строках поменять
int myClockPin = 2;             // Arduino pin that goes to M5451 clock
int mySerDataPin = 3;           // Arduino pin that goes to M5451 data

2-6

3-7

 а если попробывать добавить с этот скеч строки про датчик  освещенности и расстояния???

dimanok88
Offline
Зарегистрирован: 04.03.2014

Я использую такой датчик http://www.uctronics.com/gy-30-bh1750fvi-intensity-digital-light-sensor-...

Пример подключекния посмотреть можно здесь http://blog.simtronyx.de/en/measurement-of-illuminance-with-a-bh1750fvi-...

Датчик движения взял такой http://arduino.cc/en/Tutorial/Ping?from=Tutorial.UltrasoundSensor   код использования там же.

Все это я совместил в один код, сейчас кинуть не могу свой код какой у меня получился, т.к. на работе нахожусь. Если кому нужно могу скинуть вечером, но код  еще не оптимизирован :-)

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

dimanok88 пишет:

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

Ну вот я также посмотрел, а когда стал уже подробно разбираться то уже понял, что лажа. У лукьянова между ULN2003A и М5450 ещё какие то контроллеры включены в схему. И хочу заметить, что он сам ту схему использовать не стал. У него как раз irf7314 на выходе стоят.

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

Я для теста использовал этот код:

Порты уже поменяны.

/* 
 * M5451 LED driver chip 
 * Author: G. Andrew Stone 
 * Public Domain 
 */ 

int myClockPin = 7;             // Arduino pin that goes to M5451 clock 
int mySerDataPin = 6;           // Arduino pin that goes to M5451 data 

void setup()                    // run once, when the sketch starts 
{ 
  Serial.begin(9600); 
} 


#define M5451_NUMOUTS 35 
#define M5451_CLK 0 
class M5451 
{ 
  public: 
  byte clockPin; 
  byte brightPin; 
  byte serDataPin; 
  M5451(byte clockPin,byte serDataPin,byte brightPin); 

  void set(unsigned long int a, byte b=0); 
  void setBrightness(byte b); 

  private: 
  void mydelay(int clk); 
}; 

void M5451::setBrightness(byte b) 
{ 
  if (brightPin < 0xff) 
    analogWrite(brightPin,b); 
} 

#define MaxBrightness 4096  //256 
class FlickerBrightness:public M5451 
{ 
  public: 
  FlickerBrightness(byte clkPin, byte dataPin, byte brightnessPin); 

  void shift(int amt=1) 
    { 
    offset+=amt; 
    if (offset>=M5451_NUMOUTS) offset -=M5451_NUMOUTS; 
    else if (offset< 0) offset +=M5451_NUMOUTS; 
    } 
  void loop(void); 

  int brightness[M5451_NUMOUTS]; 
  int bresenham[M5451_NUMOUTS]; 
  int iteration; 
  int offset; 
}; 

FlickerBrightness::FlickerBrightness(byte clkPin, byte dataPin,byte 
brightnessPin):M5451(clkPin,dataPin,brightnessPin) 
{ 
  for (int i=0;i < M5451_NUMOUTS;i++) 
  { 
    brightness[i] = 0; 
    bresenham[i]  = 0; 
  } 

  iteration = 0; 
  offset = 0; 
} 

void FlickerBrightness::loop(void) 
{ 
  int i; 
  byte pos; 
  unsigned long int a=0; 
  byte b=0; 
  boolean lvl=false; 

  for (i=0,pos=offset;i < M5451_NUMOUTS;i++,pos++) 
    { 
      if (pos>=M5451_NUMOUTS) pos=0; 
      bresenham[i] += brightness[pos]; 
      if (bresenham[i]>=MaxBrightness) 
        { 
          bresenham[i] -= MaxBrightness; 
          lvl = true; 
        } 
      else lvl = false; 

      if (i<32) a = (a<<1)|lvl; 
      else b = (b<<1)|lvl; 
    } 
  iteration++; 
  if (iteration > MaxBrightness) iteration = 0; 

  set(a,b); 
} 


M5451::M5451(byte clkPin, byte dataPin, byte brightnessPin) 
{ 
  int i; 

  clockPin = clkPin; 
  serDataPin = dataPin; 
  brightPin = brightnessPin; 

  pinMode(clkPin, OUTPUT);      // sets the digital pin as output 
  pinMode(serDataPin, OUTPUT);      // sets the digital pin as output 
  pinMode(brightPin,OUTPUT); 

  // Clear out the device so we can clock in items 
  digitalWrite(serDataPin,LOW); 
  for (i=0;i< M5451_NUMOUTS+2;i++) 
    { 
    mydelay(M5451_CLK); 
    digitalWrite(clockPin,HIGH); 
    mydelay(M5451_CLK); 
    digitalWrite(clockPin,LOW); 
    } 
} 

void M5451::mydelay(int clk) 
{ 
  int i; 
  for (i=0;i< clk;i++); 
  //delay(clk); 
} 

void M5451::set(unsigned long int a, byte b) 
{ 
  int i; 

  // Write the initial "start" signal 
  digitalWrite(clockPin,LOW); 
  digitalWrite(serDataPin,LOW); 
  mydelay(M5451_CLK); 
  digitalWrite(clockPin,HIGH); 
  mydelay(M5451_CLK); 
  digitalWrite(clockPin,LOW); 
  mydelay(M5451_CLK/2); 
  digitalWrite(serDataPin,HIGH); 
  mydelay(M5451_CLK/2); 
  digitalWrite(clockPin,HIGH); 
  mydelay(M5451_CLK); 
  digitalWrite(clockPin,LOW); 

  // Write the bits 
  for (i=0;i< M5451_NUMOUTS;i++) 
  { 
    int serDataVal; 
    if (i<32) { serDataVal = (a&1); a >>=1;} 
    else { serDataVal = (b&1); b>>=1;} 
    mydelay(M5451_CLK/2); 
    digitalWrite(serDataPin,serDataVal); 
    mydelay(M5451_CLK/2); 
    digitalWrite(clockPin,HIGH); 
    mydelay(M5451_CLK); 
    digitalWrite(clockPin,LOW); 
  } 
} 

void loop()                     // run over and over again 
{ 
  unsigned long int j; 
  int i; 
  FlickerBrightness leds(myClockPin,mySerDataPin,9); 
   Serial.print("clockpin: "); 
  Serial.println(myClockPin); 
  Serial.print("datapin: "); 
  Serial.println(mySerDataPin); 
  leds.setBrightness(255); 

  for (i=3;i>=0;i--) 
  { 
    for (j=0;j<35;j++) 
      { 
      leds.set(1L<< j,(j>=32) ? 1L<<(j-32):0); 
      delay(10*i); 
      } 
  } 

  // Proportional fading 
  if (1) for (j=0;j<200;j++) 
    { 
      for (i=0;i< M5451_NUMOUTS;i++) 
        { 
          int k = 1<<(j%13); 
          if ((i&3)<2) 
          { 
             if (leds.brightness[i] < 35) leds.brightness[i] = 35; 
             else leds.brightness[i] += 
leds.brightness[i]>>2; 
          } 
          else 
          { 
             if (leds.brightness[i] < 35) leds.brightness[i] = 
MaxBrightness; 
             else leds.brightness[i] -= 
leds.brightness[i]>>2; 
          } 
        } 
      for (i=0;i<100;i++) leds.loop(); 
    } 

  leds.set(0xffffffff,0xff);  /* ALL ON */ 
  delay(250); 
  leds.set(0,0);  /* ALL OFF */ 
  delay(250); 

  // Linear per-LED brightness method 
  if (1) for (j=0;j<4096;j++) 
    { 
      for (i=0;i< M5451_NUMOUTS;i++) 
        { 
          int k = j*10; 
          if (i&1) 
          { 
            leds.brightness[i] = abs((k&(MaxBrightness*2-1))- 
MaxBrightness); 
          } 
          else 
            leds.brightness[i] = MaxBrightness - 
abs((k&(MaxBrightness*2-1))-MaxBrightness); 
        } 
      for (i=0;i<10;i++) leds.loop(); 
    } 


  // ALL FADE using M5451 Brightness feature 
  leds.set(0xffffffff,0xff);  /* ALL ON */ 
  for (j=1;j<5;j++) 
   { 
   for (i=0;i<256;i++) 
      { 
      leds.setBrightness(i&255); 
      delay(j); 
      } 
   for (i=255;i>=0;i--) 
      { 
      leds.setBrightness(i&255); 
      delay(j); 
      } 
} 

  leds.setBrightness(255); 

  leds.set(0xffffffff,0xff);  /* ALL ON */ 
  delay(250); 
  leds.set(0,0);  /* ALL OFF */ 
  delay(250); 


  // MARQUEE 

  for (i=0;i< M5451_NUMOUTS;i++)  // Clear all LEDs to black 
    { 
      leds.brightness[i]=0; 
    } 

  // Turn on a couple to make a "comet" with dimming tail 
  leds.brightness[0] =  MaxBrightness-1; 
  leds.brightness[1] =  MaxBrightness/2; 
  leds.brightness[2] =  MaxBrightness/4; 
  leds.brightness[3] =  MaxBrightness/8; 
  leds.brightness[4] =  MaxBrightness/16; 
  leds.brightness[5] =  MaxBrightness/64; 
  leds.brightness[6] =  MaxBrightness/100; 

  for (j=0;j<100;j++) 
    { 
      leds.shift(1); 
      for (i=0;i<150;i++) leds.loop(); 
    } 

  for (j=0;j<100;j++) 
    { 
      leds.shift(-1); 
      for (i=0;i<100;i++) leds.loop(); 
    } 


  if (1) 
{ 
  leds.set(0xffffffff,0x7); 
  delay(1000); 
  leds.set(0xf0f0f0f0,0x7); 
  delay(10000); 
  leds.set(0x11111111,0x1); 
  delay(10000); 
} 

}

 

YRA
Offline
Зарегистрирован: 10.01.2015

 Ну да у меня такие же датчики движения HC-SR04, а вот датчик освещенности пока фоторезистор , включенный по схеме на первой странице.