Home Собратья по неразуму... Собратья... Автоматическая подсветка лестницы
Игорь (73 дом)

UPD: Друзья, вопросы задавайте здесь: http://bit.ly/1VPiVKX

По мотивам статьи в известном источнике родилась идея сделать подсветку лестинцы самостоятельно. Подсветка

Поскольку автор материала на Хабре, видимо, в коммерческих целях, скрывает некоторые вещи (и в определенном смысле даже усложнил решение, несмотря на то, что все файлы выложил в свободный доступ) - пришлось додумывать самому.

Замечу, что все не так сложно. Я не инженер-электронщик, уровень дружбы с электроникой - не выше чем запаять ведро. Хотя, кое над чем поразмышлять пришлось. Но в первую очередь потому, что автор определенные тонкости не раскрыл.

1. Общий замысел.

Электроника реализована абсолютно не так, как в указанной заметке. Все сделано из доступных деталей и, на мой взгляд, гораздо проще. (Например, где достать Драйвер светодиодов M5450 я не представляю. Понятно, что можно заказать в интерент-магазине, но срок получения в этом случае становится неопределенным.) В том числе, не осуществляется изготовление печатной платы - пайка всего двух микросхем производится на легко доступную в Москве готовую плату. Остальная пайка - необходимая распайка контактов и разъемов. При неспешной работе все можно спаять часа за полтора. Большую часть времени занимает нарезка, распайка ленты, прикрепление к ней разъемов, приклейка ленты к ступенькам, прокладка кабель-каналов, изготовление коробки, монтаж датчиков и т.п. В общей сложности на эту работу у меня ушло 4 вечера.

Проект сделан на контроллере Ардуино, требует минимум деталей но долгой возни.

Затраты на проект могут быть различными, в зависимости от того, что хочется получить.

 

Вот видео первого тестироваия. На съемке совершенно рабочий момент, кругом инструмент, мотки провода и бардак... Но оно работает! Суть происходящего: датчик освещения отключен - дело происходит днем, датчик движения срабатывает на прилетевший тапок. Иначе не удалось бы полностью снять всю лестницу.

Во-первых, сразу нужно решить вопрос с тем, будем ли мы управлять яркостью подстветки или нет. Обратите внимание - на приведенном на Хабре видео каждая ступенька не включается мгновенно, а зажигается плавно. У меня реализовано несколько по-другому. Последовательно полностью включается пара ступенек, а затем освещение предыдущих приглушается до половины. Опыт показал, что включение ленты полностью слепит глаза, половинного освещения ночью (да и днем, как видите) вполне достаточно. И это на 7-ваттной ленте.

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

Кстати, видео на Хабре вводит в заблуждение многих. Человек идет и перед каждым шагом зажигается следующая ступенька. Это или совпадение или сознательно темп шага для красоты "подогнан" под режим включения. Ступеньки включаются с заранее установленной скоростью и она не зависит от скорости движения. Представьте, сколько же надо иметь датчиков, чтобы действительно связать шаги с подсветкой. Сделать это можно, но стоит ли овчинка выделки?

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

У меня лестница имеет всего 15 ступенек. Контроллер Ардуино Мега 2560 как раз имеет 15 выходов управления, позволяющих управлять не только включением-выключением, но и яркостью. Купить его можно, например здесь. А если не торопиться, то у китайцев по почте можно купить еще дешевле. Но я буду давать ссылки именно на наши магазины - так быстрее.

Замечу, что во всей русскоязычной документации на Ардуино Мега 2560 указано, что количество каналов ШИМ (это как раз те каналы, которые управляют яркостью) у них 14, но не самом деле - 15! Тому подтверждение - оригинальный даташит (Digital I/O Pins 54 (of which 15 provide PWM output)). Но это для особо въедливых.

Что еще потребовалось из покупкок?

Вот такая плата. И то исключительно из-за лени - можно обойтись и без нее. И вот такие соединители к ней штуки две-три, с запасом. Соединители в необходимых местах припаиваются на эту плату, и плата вставляется в Ардуино. В общем, не пожалейте 250 рублей - это сильно ускорит процесс

Вот такие микросхемы. Их количество зависит от количества ступенек. Каждая микросхема обслуживает 7 ступенек. Раз у меня 15 - нужно было три. Но брать целую микросхему из-за одной ножки было бы не правильным, и я поменял их на две вот такие. Каждая из этих управляет 8 ступеньками. Кстати, можно схемы и комбинировать: ставить пару разных на 7 и 8 выходов.

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

Датчик освещенности. Нужно же днем подсветку автоматически выключать.

Также, нужен блок питания на 12 вольт с некоторым запасом по току. Ток посчитать можно так. 80 см (неяркой, 7 ватт на метр. А яркая и не нужна, потом будет ясно почему) светодиодной ленты потребляют ток (проверял лично) 0, 24 а. 15 ступенек х 0,24 ампера = 3,6 ампера. 3,6 ампера х 12 вольт = 43 ватта. Это для моего случая. У вас может быть по-другому, в зависимости от количествыа ступенек. Запас по питанию должен быть не менее 25%, то есть 43 ватта * 1,25 = 54 ватта. В общем, нужен источник питания на 12 вольт и 75 ватт. Найти можно, например, здесь.

Это все что требуется из электроники. Остальное - соединители, механика и сама светодиодная лента, собственно.

Замечу, что лента бывает разной мощности. Самая слабая - 7 ватт на метр, потом -14 ватт и так далее.

Маломощной - вполне достаточно. В реализованной мной схеме лента вспыхивает на полную можность (для красоты), а затем гасится до 50% и этого вполне достаточно для освещения и для того, чтобы глаза не резать светом.

Итак, кратко.

Для электронной начинки необходимы:

- палата Ардуино;

- монтажная плата на нее;

- 2-3 микросхемы управления светодиодной лентой (каждая может управлять 7 или 8 ступеньками);

- два датчика приближения;

- датчик освещенности;

- блок питания на 12 вольт;

- отвага, чтобы за все это взяться.

2. Как все это соединить?

Сначала плата.

lesenka01

Что перед вами? Перед вами схема распайки платы, которая сверху вставляется в плату Ардуино. А к ней присоединяются датчики и ленты.

На плате напаяны всего две микросхемы UNL2803. Все остальное - ножки и разъемы. По кругу платы в зеленых точках впаиваются эти соединителти вниз, для сращивания с платой Ардуино. Все остальное - выводы к лентам и датчикам. На плате указано. В пустующие кружочки по краю платы штырьковые соединители не впаиваются, отверстия должны оставляться пустыми.

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

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

0003

Вот как в итоге выглядит блок управления. Собрал я его "из того что было" - пластиковая коробка и оргстекло. На ближней стороне смонтировал три блока разъемов для лент и датчиков. Дальше видны синие платы Ардуино и сверху шилд с напаяными микросхемами. Еще дальше - белый блок питания и на противоположной панели сетевой ввод и выключателем (черный блок) и датчик освещенности.

На левой от нас стенке коробки (здесь не виден) есть вырез, в который вставляется шнур USB для соедиенения Ардуино с компьютером.

Такая странная компоновка объясняется вот чем. Управляющий блок находится под большой площадкой и сторона с датчиком и вводом питания повернута к окну. Это позволяет решить как задачу определения день/ночь, так и просто наклонившись - выключить всю систему. С обратной, внутренней, стороны осуществляется соединение всех проводов.

3. Замечания по общему монтажу.

Лестница в целом выглядит так:

0007

Далее происходит нудная механическая работа. Ленту надо нарезать подходящими кусками. На самой ленте указаны места возможного разреза. К каждому куску необходимо припаять два провода плюс (красного цвета) и минус (черного цвета). Рекомедную куски провода делать не только разного цвета (иначе при монтаже "убьешься" со всем этим разбираться), но и разной длины. В среднем, один провод длиной сантиметров 10, другой - 15. Это нужно, чтобы было удобнее соединять и изолировать провода в кабель-канале. Естественно, провода одного цвета должны быть одинаковой длины.

Концы проводов лучше всего заделать кримпером и поставить вот такие клеммы. Это обеспечит серьезное увеличение скорости при монтаже и возможность менять негодные куски ленты. При монтаже, также, придется пользоваться термоусадочной трубкой, чтобы заизолировать соединения.

0006

Лента приклеивается к ступенькам снизу. Я клеил на двухсторонний скотч - полне держится. Можно дополнительно закрепить ее степлером, но надо потренироваться на одном кусочке, чтобы не перерезать и не замыкать ленту.

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

0005

Провода к ступенькам, которые идут от кабель-канала и висят на этой фотографии в воздухе, впоследствии были убраны также в кабель-канал. Просто в момент съемки у меня его не было.

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

0004

Эта фотография промежуточного хода работ. Здесь уложены лишь синие провода - те что идут к минусу ступенек. Будет добавлен общий красный провод (+) для ступенек и три провода к верхнему датчику.

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

4. Код для загрузки в Ардуино.

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

// Для ArduinoMega 2560
// День/Ночь сенсор - для функции (SensorIn);

#define sensorPin A0 // Нога для фоторезистора;
#define ledNight 24 // Нога для LED - показывает включение ночного режима;
unsigned int sensorValue = 0; // Переменная для снятия показаний сенсора освещенности;
unsigned int sensorRef = 1010; // Референсное значение сенсора освещенности, выше которого считается ночь;
boolean night = 0; // Если 1 - то ночь;
//PWM ноги ArduinoMega 2560 от 2 до 13 и от 44 до 46;

int OutPins[15] = {2,3,4,5,6,7,8,9,10,11,12,13,44,45,46}; // Массив PWM ног;

// Подсветка;
int i; // Счетчик для зажигания и тушения диодов, определения день/ночь;
#define timer 20 //Таймер для задержек при включении/выключении последовательности диодов;
#define SwitchOffDelay 15000 // Задержка выключения посветки - 15 секунд;
#define SwitchOnBright 150 // Яркость включенных ступенек, максимально - 255;
#define NightBright 20 // Яркость подсвеченных ступенек в ночном режиме (первая, последняя);
int timeForBlink = 10; // Число циклов мерцания включенной подсветки;

//SEN00 - нижний ультрасоник;
#define pingPin00 30 // PWM Выход;

//SEN01 - верхний ультрасоник;
#define pingPin01 32 // PWM Выход;

#define LedUltra 25 // Нога светодиода - в ночном режиме показывает что любой ультрасоник схватил дистанцию, в дневном режиме просто светится;

unsigned int Distance=0; // Дистанция с ультрасоника;

//===================================================================================================================
// Setup
void setup()
{
Serial.begin(9600);
pinMode(ledNight, OUTPUT); // Ночной диод ;
pinMode(LedUltra,OUTPUT); // Диод, индикатор "день" а ночью - чтобы видно было как действует ультрасоник;
digitalWrite(LedUltra,LOW);

for(i=0; i<15; i++) // Режим работы PWM ног - выход;
{
pinMode(OutPins[i], OUTPUT);
}

}

//===================================================================================================================
// Loop
void loop()
{
NightIn(); // Получаем данные День/Ночь;
//Serial.print(night);
//Serial.print(" - boolean night");
//Serial.println();

if(night == 1) // Если ночь;
{
getDistance(pingPin00); // Опрашиваем нижний ультрасоник;
//Serial.print(Distance);
//Serial.print(" - First Distance");
//Serial.println();
//delay(1000);
if(Distance < 140) // Проверка дистанции для нижнего ультрасоника в сантиметрах (140 см.). Сделано для верхнего и нижнего раздельно.

{
SwitchOn(); // Включаем подсветку снизу вверх;
blink (timeForBlink); // Померцаем;
delay(SwitchOffDelay); // Ждем;
SwitchOff(); // Выключаем подсветку;
}

getDistance(pingPin01); // Опрашиваем верхний ультрасоник;
//Serial.print(Distance);
//Serial.print(" - Second Distance");
//Serial.println();
//delay(1000);

if(Distance < 55) // Проверка дистанции для нижнего ультрасоника в сантиметрах (55 см.).
{
SwitchOnDown(); // Включаем подсветку сверху вниз;
delay(SwitchOffDelay); // Ждем;
SwitchOffDown(); // Выключаем подсветку;
}
}
}
//====================================================================================================================

void SwitchOn() // Включаем снизу вверх;
{
digitalWrite(LedUltra, HIGH);
for (i=0; i<15; i++)
{
analogWrite(OutPins[i], 254); // Зажигаем полностью первый сетодиод;
delay(timer); // Пауза перед следующим;
if(i!=14) // Проверяем, чтобы не включить несуществующий диод;
{
analogWrite(OutPins[i + 1], 254); // Зажигаем полностью следующий светодиод;
delay(timer);
}
if(i!=13) // Проверяем, чтобы не включить несуществующий диод;
{
analogWrite(OutPins[i + 2], 254); // Зажигаем полностью еще светодиод;
delay(timer);
}
analogWrite(OutPins[i], SwitchOnBright); // Слегка гасим подсветку;
delay(timer);
}
}


void SwitchOff() // Выключаем снизу вверх;
{
for (i=0; i<15; i++)
{
analogWrite(OutPins[i], 254);
delay(timer);

if(i!=14)
{
analogWrite(OutPins[i + 1], 254);
delay(timer);
}

analogWrite(OutPins[i], 0);
delay(timer);
}
digitalWrite(LedUltra, LOW);
}

//=====================================================================================================================

void SwitchOnDown() // Включаем сверху вниз;
{
digitalWrite(LedUltra, HIGH);

for (i=14; i > -1; i--)
{
analogWrite(OutPins[i], 254);
delay(timer);

if(i!=0)
{
analogWrite(OutPins[i - 1], 254);
delay(timer);
}

analogWrite(OutPins[i], SwitchOnBright);
delay(timer*2);
}
}


void SwitchOffDown() // Выключаем сверху вниз;
{
for (i=14; i > -1; i--)
{
analogWrite(OutPins[i], 254);
delay(timer);

if(i!=0)
{
analogWrite(OutPins[i - 1], 254);
delay(timer);
}

analogWrite(OutPins[i], 0);
delay(timer*2);
}
digitalWrite(LedUltra, LOW);
}
//=====================================================================================================================
unsigned int getDistance(int pingPin) // Чтение ультрасоника;
{
unsigned int duration = 0;
pinMode(pingPin, OUTPUT);
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(15);
digitalWrite(pingPin, LOW);
delayMicroseconds(20);
pinMode(pingPin, INPUT);
duration = pulseIn(pingPin, HIGH);
Distance = duration / 29 / 2;

return Distance;
}
//===========================================================================================
boolean NightIn() // Чтение день или ночь;
{
sensorValue = 0;
unsigned int a = 0, b = 0;

for(i = 0; i < 50; i++)
{
sensorValue = analogRead(sensorPin); // Чтение показаний датчика;
if (sensorValue > sensorRef) a++; // Увеличиваем а, если темнее референсного значения;
if (sensorValue > (sensorRef - 25)) b++; // Увеличиваем b, если темнее чем референсное значение минус допуск на гистерезис;
}

if ((night == 0) && (a > 49)) // Если сейчас режим день и 50 раз значение датчика оказалось выше референсного,
{ // то переключаемся в ночной режим, включаем дежурную подсветку ступенек.
digitalWrite(ledNight, HIGH);
digitalWrite(LedUltra, LOW);
analogWrite(2,NightBright);
analogWrite(46,NightBright);
night = 1;
}

if ((night == 1) && (b == 0)) // Если сейчас режим ночь, и 50 раз значение датчика оказалось ниже референсного за
{ // вычетом запаса на гистерезис - включаем режим "день", гасим подсветку ступенек.
digitalWrite(ledNight, LOW);
digitalWrite(LedUltra, HIGH);
analogWrite(2,0);
analogWrite(46,0);
night = 0;
}

else {}

return night;
}
/*********************************************************************************************************************************************

Мерцание во время задержки

/*********************************************************************************************************************************************/

void blink (int timeForBlink)
{
unsigned char brightness = 0;

for (int a = 0; a < timeForBlink; a++) // Цикл определяет длительность мерцания;
{
for(i = 1; i < 15; i++) // Мерцаем диодами;
{
brightness = random((SwitchOnBright-25), SwitchOnBright);
analogWrite(OutPins[i], brightness);
delay(2); // Маленькая задержка;
}
}

//for(i = 1; i < 15; i++) // Восстанавливаем свечение лестницы;
//{
// analogWrite(OutPins[i], SwitchOnBright);
//}

return;
}

Все что необходимо - установить на компьютер одну программу, открыть ее, внести указанный выше код, соединить компьютер по шнурку USB с Ардуино и дать команду на загрузку в нее программы. После этого все должно заработать.

Лишь одно необходимо изменить применительно к вашим условиям.

Найдите в коде строку:

if(Distance < 140) // Проверка дистанции для нижнего ультрасоника в сантиметрах (140 см.). Сделано для верхнего и нижнего раздельно.

140 - расстояние (в сантиметрах) срабатывания ультрасоника на включение подсветки. Меняйте его в соответствии с вашими условиями. Такая же сторока есть и для верхнего ультрасоника.

В итоге что получилось.

 

Заключение. Что дальше...

В целом, это все. Те кто не сталкивался с Ардуино, возможно, будут слегка в замешательстве - сначала кажется все очень сложным. Мне тоже так казалось. Но здесь есть одно "но"... Реальной работы больше не с электронно-программной частью, а с монтажной. И, даже будучи не очень уверенным в своих электронных силах, пришел к выводу, что если у меня ничего не заработает, то, в конце концов, на смонтированную подсветку и 12-вольтовый болк питания лестницы можно поставить пару обычных выключателей или (чуть сложнее :-) ) китайский сумеречный выключатель.

В итоге, подсветка оказалась очень полезной практической штукой - ночью в зале хоть глаз выколи... 

Основнным недочетом, мне кажется, является неиспользование мной алюминиевого профиля для формирования направленного потока света от ленты.

Далее - для зацикленных на теме. (Замечу в свое оправдание вот что. Подсветку я начал собирать тогда, когда не соображал в теме практически ничего. По ходу дела тема заинтересовала и пришлось узнать много нового. Но для единичного изготовления подсветки - все это лишнее.)

Что можно усовершенствовать? В первую очередь, полагаю, можно сделать отдельное управление каждой лентой по протоколу I2C на основе модуля BlinkM. Но не на этих именно элементах, а на связке Attiny45(с прошивкой BlinkM) & UNL2003.

Это позволит:

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

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

- можно отказаться от Меги2560 в пользу более дешевой платы;

- позволит существенно расширить возможности цветового и светового оформления.

... лишь бы вкуса хватило :-)

 

P.S. Вот здесь код подсветки с плавным включением и выключением. И в целом, дальнейшее обсуждление вопросов идет также здесь.

Комментарии   

 
0 #27 Игорь (73 дом) 16.07.2015 13:34
Цитирую Владимир_66:
А почему именно ArduinoMega 2560 ???
Почему нельзя ардуинку (Pro mini)168 или 328 взять??? Ног должно хватить...

Ну если хватает - то можно конечно. У них по 7 PWM ног, хватает - берите.
 
 
0 #26 Олег 15.07.2015 15:01
Добрый день!!!
В наличие есть Arduino Nano, и лестница на 19 ступеней + дикое желание :lol: , с программировани ем туго, с паяльником на ты. Если применить 3 светодиодных драйвера ULN2803, возможно ли откорректироват ь прошивку?
 
 
0 #25 Владимир_66 16.05.2015 21:17
А почему именно ArduinoMega 2560 ???
Почему нельзя ардуинку (Pro mini)168 или 328 взять??? Ног должно хватить...
 
 
0 #24 Серёга1499 29.04.2015 21:54
И ещё как правильно загружать код и можно ли загружать его вмести с буквами
 
 
0 #23 Серёга1499 29.04.2015 21:53
Привет всем! сколько выходит вольт из каждого выхода микросхемы!
 
 
0 #22 Илья 19.04.2015 22:00
Игорь, большое спасибо за адекватную и понятную статью с нужными ссылками! Вдохновили еще одного ломастера на подсветку лестницы))
 
 
0 #21 Игорь (73 дом) 01.04.2015 17:43
Цитирую Сергей1499:
Снова привет ! Делаю всё по коду но не чего не получается , можешь расписать по твоему коду что и куда подключается? Заранее спасибо !!!

Больше чем здесь написано я уже написать не могу. Предлагаю тогда кого-то нанять. На сайте Амперки туча людей подтвердили работоспособнос ть этого устройства.
 
 
0 #20 Сергей1499 25.03.2015 23:44
Снова привет ! Делаю всё по коду но не чего не получается , можешь расписать по твоему коду что и куда подключается? Заранее спасибо !!!
 
 
0 #19 Игорь (73 дом) 09.03.2015 12:23
Цитирую Сергей14:
Привет ! На схеме указан датчик движения а куда подключать 2 датчик ?

Посмотрите внимательно код - там указаны номера ног к которым подключаются датчики.
 
 
0 #18 Сергей14 08.03.2015 12:33
Привет ! На схеме указан датчик движения а куда подключать 2 датчик ?
 

You have no rights to post comments

Подождите 30 секунд до нажатия кнопки "Отправить", иначе Вас сочтут спам-ботом.