Автоматизация освещения - ФОРУМ ДВ Робот dvrobot.ru
Пятница, 16.11.2018, 04:46
Главная Мой профиль Регистрация Выход
  • НАШ МАГАЗИН
  • Вы вошли как Гость | Группа "Гости"Приветствую Вас, Гость
    [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
    • Страница 1 из 1
    • 1
    Модератор форума: GRACH, Serg  
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Библиотека Проектов » Автоматизация освещения (Автоматическое управление светом)
    Автоматизация освещения
    m_wДата: Воскресенье, 23.12.2012, 05:24 | Сообщение # 1
    5 Вольт
    Группа: Пользователи
    Сообщений: 67
    Репутация: 2
    Статус: Offline
    Думаю трудно найти человека который бы никогда не просыпался ночью. Пытаясь добраться куда-нибудь в кромешной тьме, несложно споткнуться (об кота) и упасть (на него же). Короче, травмоопасно это. Ситуация немного улучшилась с появлением мобильных телефонов. Вот только нащупать телефон в темноте непросто. Так его и разбить можно. Устройство способное самостоятельно включать неяркий свет "увидев" человека и выключать его через какое-то время могло бы значительно улучшить ситуацию.

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

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

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

    Еще можно использовать ультразвуковой датчик расстояния. Выдает датчик одно и то же значение расстояния, значит никого нет. Изменились данные выдаваемые датчиком, значит появился кто-то. При этом сам ультразвук неслышим для человека. Уже лучше. Сразу скажу, что такие системы управления освещением существуют. Я же решил поискать еще варианты.
    Купить ультразвуковой датчик расстояния http://dvrobot.ru/shop/i160.ultrazvukovoy_datchik_arduino.htm

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

    В своей конструкции я решил остановится на последнем.

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

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


    Мой блог http://justforduino.blogspot.ru/
     
    m_wДата: Воскресенье, 23.12.2012, 05:36 | Сообщение # 2
    5 Вольт
    Группа: Пользователи
    Сообщений: 67
    Репутация: 2
    Статус: Offline
    Итак, фото собранного устройства.



    Купить LED RGB module http://dvrobot.ru/shop/i173.led_tri_cveta.htm
    Купить PIR Motion Sensor http://dvrobot.ru/shop/i15.infrakrasnyy_datchik_dvizheniya..htm
    Купить Light Sensor Module http://dvrobot.ru/shop/i23.datchik_osveschennosti.htm

    Более качественное изображение http://yadi.sk/d/8LxK6Cou1Nc0S (3 МБ)

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

    ATmega32u4 --- LED RGB module
    VCC --- V
    PD2 --- R
    PD1 --- B
    PD0 --- G

    ATmega32u4 --- PIR Motion Sensor
    VCC --- +5V
    PB0 --- OUT
    GND --- GND

    ATmega32u4 --- Light Sensor Module
    GND --- -
    VCC --- +
    PF0 --- S

    Добавлено (23.12.2012, 05:32)
    ---------------------------------------------
    Теперь о программе для микроконтроллера.

    Со светодиодом все просто. Ножки микроконтроллера к которым подключается светодиод настраиваются как выходы. Для этого необходимо записать 1 в соответствующие биты регистра DDRD. И в зависимости от того 0 или 1 записана в соответствующих битах регистра PORTD, светодиод светит или нет.

    Работать с датчиком движения ничуть не сложнее. Это цифровой датчик. В зависимости от того регистрирует он движение или нет на ножке OUT выставляется 1 или 0. Чтобы микроконтроллер смог прочитать эти данные необходимо соответствующую ножку микроконтроллера настроить как вход. Это можно сделать записав 0 в соответствующий бит регистра DDRB. В данном случае включать внутренний подтягивающий резистор микроконтроллера не нужно. Поэтому в соответствующий бит регистра PORTB следует также записать 0. Теперь прочитав то, что содержится в соответствующем бите регистра PINB мы можем узнать регистрирует датчик движение или нет.

    С датчиком освещенности все немного иначе. Этот датчик аналоговый. Напряжение на ножке S датчика пропорционально освещенности. Чтобы микроконтроллер узнал уровень освещенности, необходимо измерить напряжение на ножке S датчика. Иначе говоря, необходимо преобразовать аналоговые данные в цифровые. Сделать это можно с помощью аналого-цифрового преобразователя (ADC). В составе периферии ATmega32U4 есть десятиразрядный АЦП. В этом микроконтроллере АЦП выделены следующие регистры: ADC Multiplexer Selection Register(ADMUX), ADC Control and Status Register A (ADCSRA), ADC Control and Status Register B (ADCSRB), The ADC Data Register (ADCL, ADCH), Digital Input Disable Register 0 (DIDR0), Digital Input Disable Register 2 (DIDR2).

    Думаю будет не лишним указать названия битов этих регистров.

    ADMUX: REFS1, REFS0, ADLAR, MUX4, MUX3, MUX2, MUX1, MUX0.
    ADCSRA: ADEN, ADSC, ADATE, ADIF, ADIE, ADPS2, ADPS1, ADPS0.
    ADCSRB: ADHSM, ACME, MUX5, -, ADTS3, ADTS2, ADTS1, ADTS0.
    DIDR0: ADC7D, ADC6D, ADC5D, ADC4D, -, -, ADC1D, ADC0D.
    DIDR2: -, -, ADC13D, ADC12D, ADC11D, ADC10D, ADC9D, ADC8D.

    Биты отмеченные как "-" не используются. Их значение ни на что не влияет.

    Добавлено (23.12.2012, 05:34)
    ---------------------------------------------
    В регистры ADCH и ADCL помещается результат преобразования. В ADCH помещается старший байт, а в ADCL помещается младший байт. Но, так как АЦП десятиразрядный, то шесть битов не используются. А, от того 0 или 1 записан в бит ADLAR регистра ADMUX зависит какие именно.

    Если ADLAR = 0, то
    ADCH: –, –, –, –, –, –, ADC9, ADC8.
    ADCL: ADC7, ADC6, ADC5, ADC4, ADC3, ADC2, ADC1, ADC0.

    Если ADLAR = 1, то
    ADCH: ADC9, ADC8, ADC7, ADC6, ADC5, ADC4, ADC3, ADC2.
    ADCL: ADC1, ADC0, –, –, –, –, –, –.

    Так как на моей платке с ATmega32U4 не предусмотрено практически ни каких схемотехнических решений для повышения точности АЦП, то я установил ADLAR в 1. Все равно в младших битах результата преобразования будет мусор (случайные данные никак не связанные с показаниями датчика). И в работе программы их можно не учитывать. Тем более, высокая точность АЦП в данной программе не нужна.

    Но, прежде всего, АЦП нужно включить. Это можно сделать записав 1 в бит ADEN регистра ADCSRA. Иначе АЦП ATmega32U4 просто не будет работать.

    Теперь можно более подробно рассказать о прочих настройках АЦП.

    Биты REFS1 и REFS0 регистра ADMUX определяют, что будет служить источником опорного напряжения для АЦП. Если установить REFS1 в 0 и REFS0 в 1, то опорное напряжение будет браться с ножки AVCC микроконтроллера. В используемой мной платке AVCC и VCC микроконтроллера соединены. Соответственно опорным напряжением будет VCC.

    При этом значению ADCH близкому к 255 будет соответствовать напряжение на ножке S датчика близкое к VCC. А, значению ADCH близкому к 0 будет соответствовать напряжение на ножке S датчика близкое к GND.

    Я измерил напряжение на ножке S датчика в темноте. Получилось, как ни странно, чуть больше 0 вольт. Не долго думая, я решил что при напряжении на ножке S датчика меньше 0.5 вольта нужно включать свет. Этому значению аналогового сигнала соответствует значение ADCH равное 25.

    Также мной было измерено напряжение на ножке S датчика при свете дня. Получилось около 2.5 вольт. Я и здесь не стал мудрствовать лукаво. И решил что при напряжении больше 2 вольт на ножке S датчика подсветка не нужна. Этому значению аналогового сигнала соответствует значение ADCH равное 102.

    С этими числами и сравнивается результат преобразования в программе.

    Следует сказать, что АЦП ATmega32U4 может работать с разными ножками микроконтроллера. С какой именно ножкой он будет работать зависит от значения бита MUX5 регистра ADCSRB и значения битов MUX4, MUX3, MUX2, MUX1, MUX0 регистра ADMUX. Так как у меня датчик подключен к PF0 (ADC0), то все перечисленные биты должны быть 0.

    Нельзя не упомянуть биты ADPS2, ADPS1, ADPS0 регистра ADCSRA. От них зависит скорость работы АЦП. Чем медленнее работает АЦП, тем точнее результат преобразования. Разумеется, значение преобразовываемого аналогового сигнала во время работы АЦП не должно меняться. Ввиду отсутствия необходимости получения высокой точности все вышеперечисленные биты в моей программе сброшены в 0.

    Минимально необходимые настройки выполнены и можно начать преобразование. Для этого необходимо записать 1 в бит ADSC регистра ADCSRA. После окончания преобразования бит ADSC будет автоматически сброшен в 0.

    Добавлено (23.12.2012, 05:36)
    ---------------------------------------------
    Все пояснения даны. Показываю программу. Она написана на Си в AVR Studio.

    http://yadi.sk/d/LChKGp-l1NdGO

    Чуть не забыл. Задержка перед выключением света подобрана опытным путем. Она составляет, приблизительно, 15 секунд.

    Все. Устройство готово к установке в каком нибудь темном коридорчике. Пока датчик регистрирует движение, свет будет гореть.
    Прикрепления: 7546317.jpg(127.3 Kb) · mc_7_1.zip(14.3 Kb)


    Мой блог http://justforduino.blogspot.ru/
     
    SergДата: Воскресенье, 23.12.2012, 11:20 | Сообщение # 3
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Я положил исходники на форум, ведь не у всех есть учетная запись на Яндексе, что бы забирать файлы с Диска.
    А почему на чистом Си, почему не на синтаксисе Arduino?
     
    m_wДата: Понедельник, 24.12.2012, 03:14 | Сообщение # 4
    5 Вольт
    Группа: Пользователи
    Сообщений: 67
    Репутация: 2
    Статус: Offline
    Я начал программировать микроконтроллеры задолго до того как узнал об Arduino. Поэтому пишу на Си и ассемблере.

    PS У меня не получается нормальные ссылки в сообщения вставлять и архивы к сообщениям прикреплять. Этот форум первый на uCoz в котором пишу.


    Мой блог http://justforduino.blogspot.ru/
     
    SergДата: Понедельник, 24.12.2012, 16:58 | Сообщение # 5
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    У людей кругом голова пойдет от регистров biggrin .
    А сообщения мы подредактируем.
     
    DimaДата: Понедельник, 24.12.2012, 19:08 | Сообщение # 6
    3.5 Вольт
    Группа: Пользователи
    Сообщений: 16
    Репутация: 0
    Статус: Offline
    Вот такую штуковину, можно под кровать поставить.
    Опустил ноги - сработал датчик движения - включилась подсветка под кроватью.
    Спокойно надел тапочки и побрёл куда надо.
     
    m_wДата: Вторник, 25.12.2012, 04:21 | Сообщение # 7
    5 Вольт
    Группа: Пользователи
    Сообщений: 67
    Репутация: 2
    Статус: Offline
    Лучше сделать маленький декоративный светильничек и поставить его на тумбу рядом с кроватью. Датчик движения нужно направить вверх. Лежащего на кровати человека он не заметит. Но, если сесть на кровати да еще и поднять руки, то датчик сработает. И сразу станет светлее.

    Мой блог http://justforduino.blogspot.ru/

    Сообщение отредактировал m_w - Вторник, 25.12.2012, 04:32
     
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Библиотека Проектов » Автоматизация освещения (Автоматическое управление светом)
    • Страница 1 из 1
    • 1
    Поиск:

    ДВ Робот - Чат