От Код към Реалност: Интелигентната лампа с MLP невронна мрежа

В предишната ни публикация разгледахме математическата основа на многослойния перцептрон (MLP). Днес ще ви покажем как пренесохме тези формули директно върху силициевия чип, за да създадем лампа, която „мисли“ и реагира на околната среда.

Цел и задачи на проекта

Основната ни цел беше да създадем интелигентна система за управление на осветление, която регулира яркостта на LED диод не по твърди правила (if-else), а чрез елементарна невронна мрежа, работеща върху микроконтролер.

Какво изпълнихме:

  • Свързване и управление на микроконтролер ATmega328P (работно напрежение 5V със софтуерна филтрация на шума; използване на 10-битов аналогово-цифров преобразувател за фоторезистора; конфигуриран цифров вход с прекъсване за PIR сензора; генериране на 8-битов PWM сигнал за управление на LED; автономно изпълнение на невронната мрежа чрез 32 KB Flash памет).
  • Реализация на невронна мрежа (архитектура 2–3–1) директно в Arduino код (математическият модел на „изкуствения интелект“ е написан на езика C++, който Arduino използва и се изпълнява в реално време от самия микроконтролер, без нужда от връзка с компютър или интернет; Arduino е достъпна платформа с отворен код, която комбинира лесен за програмиране софтуер и хардуерна платка с микроконтролер; тя служи като „мозък“, който приема сигнали от заобикалящия го свят чрез различни сензори и взема решения как да задейства свързаните към него устройства; изключително популярна е в роботиката и автоматизацията, защото позволява бързо прототипиране на сложни идеи с минимални разходи; програмира се чрез компютър, но веднъж зареден, кодът работи напълно самостоятелно).
  • Управление на LED чрез PWM (Pulse Width Modulation - технология, която имитира различно напрежение чрез много бързо включване и изключване на тока) с алгоритъм за плавно (експоненциално) гасене.
  • Функционално тестване на системата с реални сензори.

Хардуерна архитектура: За реализацията на проекта използвахме специфични компоненти, които работят като ситемата и датчиците на нашата лампа:

1. ATmega328P

  • Микроконтролер - ATmega328P
    • Захранване: 5 V (USB).
    • Платка: Nano Terminal Adapter V1.0.
    • Методология: Конфигурацията и управлението на микроконтролера са базирани на изследванията, представени в научната публикация: „Управление на битови електроуреди чрез кабелна и Wi-Fi мрежа“ (Жейнов, Ж., Гелдиев, Е.), публикувана в сборника на IX International Scientific Conference "Industry 4.0" (Боровец, 2024, ISSN: 2535-0153).

2. Сетивата (Сензори):

  • Фоторезистор (LDR - Light Dependent Resistor): Следи околната светлина (свързан към аналогов вход A0).
  • PIR(Passive Infrared Sensor ; пасивен инфрачервен сензор за движение) сензор (HC-SR501): Засича движение чрез инфрачервена светлина (цифров вход D2).

3. Изпълнителят (Изход):

  • LED диод: Управлява се чрез PWM сигнал от пин D9, което позволява плавна промяна на яркостта.

Фигура 1: Принципна схема на свързване на сензорите и светодиода към ATmega328P.

Малък речник за откриватели (Хардуер):PIR сензор (работи чрез засичане на невидимото инфрачервено лъчение, което всяко топло тяло излъчва; използва специална леща (Френелова леща), която разделя пространството на зони, за да може сензорът да „види“ движението, когато топъл обект преминава от една зона в друга; изпраща дискретен цифров сигнал към микроконтролера – „високо ниво“ (High) при движение и „ниско ниво“ (Low) при покой; разполага с вградени потенциометри за ръчно регулиране на чувствителността и времето, през което сигналът да остане активен след засичане; нарича се „пасивен“, защото не излъчва никаква енергия, а само наблюдава промените в топлинния фон на околната среда; идеален за енергоспестяващи системи, тъй като консумира пренебрежимо малко количество ток в режим на изчакване).: Представете си, че тялото ни е малка печка, която излъчва топлина. PIR сензорът е „око“, което вижда тази невидима топлина и разбира, че в стаята има човек.PWM / ШИМ (съкращение от Широчинно-импулсна модулация; представлява метод за управление на мощността чрез изключително бързо включване и изключване на електрическия ток хиляди пъти в секунда; физически имитира ниско напрежение, като променя продължителността на „включеното“ състояние спрямо „изключеното“ в рамките на един цикъл; позволява на лампата да свети с различна яркост, без да се губи енергия под формата на топлина, както би станало при обикновен резистор; осигурява 256 нива на контрол при 8-битовите микроконтролери, което прави прехода между пълна тъмнина и максимална светлина напълно незабележим за човешкото око; основен инструмент в роботиката и автоматизацията за прецизно управление на светодиоди, мотори и нагреватели).: Използваме го, за да не мига лампата рязко. То изпраща тока на много бързи порции, така че окото ни вижда просто по-слаба или по-силна светлина.

Софтуерна архитектура: Как „мисли“ лампата?

Програмата е написана в Arduino IDE и се записва във Flash паметта – тя е като „дългосрочната памет“ на лампата, която не се изтрива при изключване.

Невронната мрежа (MLP 2-3-1 ; Multi-Layer Perceptron):

  • Входове: Светлина и Движение.
  • Скрит слой: 3 неврона, които обработват информацията чрез Сигмоидна функция (за плавни решения).
  • Тегла (Weights): Това са „записките“ на лампата, получени чрез обучение. Те казват кое е по-важно в момента.

Пълният програмен код:

C++

#define PIN_LIGHT A0  // фоторезистор
#define PIN_MOTION 2  // PIR OUT
#define PIN_LED 9     // PWM LED

// Тегла на мрежата
float w_in_h[2][3] = { { 4.29, -3.12, 5.07 }, { -2.15, 1.58, -2.56 } };
float w_h_out[3] = { -2.83, 6.82, -4.10 };

float sigmoid(float x) { return 1.0 / (1.0 + exp(-x)); }

float ai_predict(float light, float motion) {
  float hidden[3];
  for (int i = 0; i < 3; i++) {
    float sum = light * w_in_h[0][i] + motion * w_in_h[1][i];
    hidden[i] = sigmoid(sum);
  }
  float out = 0;
  for (int i = 0; i < 3; i++) { out += hidden[i] * w_h_out[i]; }
  return sigmoid(out);
}

float currentBrightness = 0.0;
const float fadeFactor = 0.98; // Коефициент на плавно гасене

void setup() {
  pinMode(PIN_MOTION, INPUT);
  pinMode(PIN_LED, OUTPUT);
}

void loop() {
  int rawLight = analogRead(PIN_LIGHT);
  int rawMotion = digitalRead(PIN_MOTION);
  
  float light = 1.0 - (rawLight / 1023.0); // Нормализиране: тъмно = 1
  float motion = (rawMotion == HIGH) ? 1.0 : 0.0;

  if (motion > 0.5) {
    currentBrightness = ai_predict(light, motion);
  } 
  else {
    currentBrightness *= fadeFactor; // Експоненциално "заспиване"
    if (currentBrightness < 0.01) currentBrightness = 0.0;
  }

  analogWrite(PIN_LED, (int)(currentBrightness * 255.0));
  delay(30); 
}

Логика и Алгоритъм (Блок-схема)

Логиката на системата следва прост път: Сензори (Вход) ➔ ATmega328P (Обработка) ➔ Невронна мрежа (Интелект) ➔ PWM (Действие) ➔ LED (Резултат)

Какво се случва 30 пъти в секунда (в loop):

  1. Четене: Вземат се данни от сензорите.
  2. Нормализация: Данните се превръщат в числа между 0 и 1 (езикът на AI).
  3. Решение: Ако има движение, AI изчислява яркостта. Ако няма – стартира експоненциално затихване (лампата бавно „изстива“, вместо да угасне рязко).
  4. Изпълнение: Изпраща се сигнал към диода и цикълът започва отново.

Проектът в действие

Тук можете да видите реалната реализация на макета и видео демонстрация на интелигентното поведение:


„Благодарим на инж. Г. Гелдиев за предоставянето на пълната техническа документация, софтуерният код на C++, чертежи и мултимедийни материали от неговите опити, които направиха тази публикация възможна.“

Въпроси за дискусия

Можем ли да обучим теглата на мрежата директно върху Arduino-то в бъдеще?

Да, това е напълно възможно чрез внедряване на алгоритъма "Backpropagation" директно в C++ кода, което би позволило на лампата да се самообучава спрямо вашите навици. Основното ограничение е малкото RAM памет (2KB) на ATmega328P, която изисква изключително оптимизиран код при по-сложни мрежи.

Какъв нов сензор бихте добавили, за да стане лампата още по-полезна?

Добавянето на сензор за шум (микрофон) би позволило на лампата да реагира на глас или пляскане, или сензор за влажност и температура (DHT11), за да променя цвета или интензитета си спрямо микроклимата в стаята. Още по-интересно би било добавянето на ултразвуков сензор за разстояние, за да може яркостта да зависи от това колко близо до лампата се намира човекът.