Все статьиHardware

Детектор лжи на Arduino: полиграф своими руками

БА
Бексултан Айтен
CTO, Alashed
25 мая 2025 г.
8 мин чтения
Детектор лжи на Arduino: полиграф своими руками

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

Можно ли собрать полиграф в школьной лаборатории

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

Когда человек волнуется, его организм реагирует: сердце бьётся быстрее, потовые железы активизируются, температура кожи слегка меняется. Пот содержит соли, которые увеличивают электропроводность кожи -- это называется кожно-гальванической реакцией (КГР). Именно эти изменения и фиксирует наш прибор.

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

Проект рассчитан на учеников 7--9 классов и может использоваться на уроках физики, биологии или на кружках робототехники.

Необходимые компоненты

  • Arduino Uno (или Nano) -- 1 шт.
  • Металлические пластины (алюминиевые полоски, монеты или фольга на картоне) -- 2 шт.
  • Резистор 1 МОм (для делителя напряжения КГР) -- 1 шт.
  • Светодиоды (зелёный, жёлтый, красный) -- 3 шт.
  • Резисторы 220 Ом (токоограничивающие для светодиодов) -- 3 шт.
  • Пьезозуммер (пассивный) -- 1 шт.
  • Датчик пульса (опционально, модуль Pulse Sensor) -- 1 шт.
  • Макетная плата и провода-перемычки
  • USB-кабель

Базовый набор без датчика пульса обойдётся примерно в 3 000--5 000 тенге. Датчик пульса добавит ещё около 2 000 тенге, но без него проект полноценно работает на основе одной КГР.

Принцип работы датчика КГР

Схема датчика -- классический делитель напряжения. Резистор 1 МОм подключён между пином 5V и аналоговым входом A0. Металлические пластины подключены между аналоговым входом A0 и GND. Когда человек кладёт два пальца на пластины, кожа замыкает цепь и создаёт переменное сопротивление.

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

Схема подключения

Сборка детектора лжи на Arduino с датчиками
Сборка детектора лжи на Arduino с датчиками

Датчик КГР (пластины):

КомпонентПодключение
Резистор 1 МОм (вывод 1)5V Arduino
Резистор 1 МОм (вывод 2)Аналоговый пин A0 + пластина 1
Пластина 2GND Arduino

Светодиоды:

СветодиодПин ArduinoРезистор
ЗелёныйD3220 Ом
ЖёлтыйD4220 Ом
КрасныйD5220 Ом

Пьезозуммер: положительный вывод к пину D6, отрицательный -- к GND.

Датчик пульса (опционально): сигнальный провод к A3, VCC к 5V, GND к GND.

Компоненты детектора лжи на макетной плате
Компоненты детектора лжи на макетной плате

Полный код проекта

```cpp

// Детектор лжи (полиграф) на Arduino

// Измеряет кожно-гальваническую реакцию и опционально пульс

// Пины подключения

const int gsrPin = A0; // Аналоговый вход для КГР-датчика

const int pulsePin = A3; // Аналоговый вход для датчика пульса (опционально)

const int greenLed = 3; // Зелёный светодиод (спокойствие)

const int yellowLed = 4; // Жёлтый светодиод (лёгкое волнение)

const int redLed = 5; // Красный светодиод (сильное волнение)

const int buzzerPin = 6; // Пьезозуммер

// Переменные для обработки данных

int baselineGSR = 0; // Базовый уровень КГР

int currentGSR = 0; // Текущее значение КГР

int smoothedGSR = 0; // Сглаженное значение

int difference = 0; // Отклонение от базы

// Пороговые значения (настройте под свои условия)

const int thresholdLow = 30; // Порог для жёлтого уровня

const int thresholdHigh = 70; // Порог для красного уровня

void setup() {

// Настраиваем выходы

pinMode(greenLed, OUTPUT);

pinMode(yellowLed, OUTPUT);

pinMode(redLed, OUTPUT);

pinMode(buzzerPin, OUTPUT);

Serial.begin(9600);

Serial.println("=== Детектор лжи ===");

Serial.println("Положите два пальца на пластины и не двигайтесь.");

Serial.println("Калибровка начинается...");

// Калибровка: определяем базовый уровень КГР

// Снимаем 50 измерений за 3 секунды и берём среднее

long sum = 0;

for (int i = 0; i < 50; i++) {

sum += analogRead(gsrPin);

delay(60);

}

baselineGSR = sum / 50;

smoothedGSR = baselineGSR;

Serial.print("Базовый уровень КГР: ");

Serial.println(baselineGSR);

Serial.println("Калибровка завершена!");

Serial.println("Формат данных: КГР_сырое, КГР_сглаженное, Отклонение, Пульс");

// Тройное мигание зелёным -- калибровка завершена

for (int i = 0; i < 3; i++) {

digitalWrite(greenLed, HIGH);

delay(200);

digitalWrite(greenLed, LOW);

delay(200);

}

}

void loop() {

// Считываем текущее значение КГР

currentGSR = analogRead(gsrPin);

// Экспоненциальное скользящее среднее для сглаживания помех

// 70% предыдущего значения + 30% нового измерения

smoothedGSR = (smoothedGSR * 7 + currentGSR * 3) / 10;

// Вычисляем отклонение от базового уровня

difference = abs(smoothedGSR - baselineGSR);

// Считываем пульс (если датчик подключён)

int pulseValue = analogRead(pulsePin);

// Выводим данные для Serial Plotter (через запятую)

Serial.print(currentGSR);

Serial.print(",");

Serial.print(smoothedGSR);

Serial.print(",");

Serial.print(difference);

Serial.print(",");

Serial.println(pulseValue);

// Определяем уровень стресса и включаем индикацию

if (difference < thresholdLow) {

// Спокойное состояние -- горит зелёный

digitalWrite(greenLed, HIGH);

digitalWrite(yellowLed, LOW);

digitalWrite(redLed, LOW);

noTone(buzzerPin);

}

else if (difference < thresholdHigh) {

// Лёгкое волнение -- горит жёлтый

digitalWrite(greenLed, LOW);

digitalWrite(yellowLed, HIGH);

digitalWrite(redLed, LOW);

noTone(buzzerPin);

}

else {

// Сильное волнение -- горит красный, звучит зуммер

digitalWrite(greenLed, LOW);

digitalWrite(yellowLed, LOW);

digitalWrite(redLed, HIGH);

tone(buzzerPin, 1000); // Сигнал тревоги на 1000 Гц

}

delay(100); // Пауза между измерениями (10 раз в секунду)

}

`

Разбор кода

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

Сглаживание данных. Аналоговый вход Arduino подвержен электрическим наводкам и шумам. Экспоненциальное скользящее среднее фильтрует случайные скачки: каждое новое значение -- это 70% предыдущего сглаженного и 30% свежего измерения. Реальные тренды сохраняются, а шум отсекается. Это базовая техника цифровой обработки сигналов.

Три уровня реакции. Программа сравнивает отклонение от базы с двумя порогами. Зелёный -- человек спокоен. Жёлтый -- заметно волнение. Красный плюс зуммер -- сильная реакция. Пороги thresholdLow и thresholdHigh можно подстроить: если детектор слишком чувствителен, увеличьте их значения.

Визуализация через Serial Plotter. Данные выводятся через запятую -- это формат, который понимает встроенный инструмент Arduino IDE (меню Инструменты -- Serial Plotter). На графике видны все четыре значения в реальном времени: сырые данные КГР, сглаженные данные, отклонение и пульс.

Советы для занятий

  • Пластины должны плотно прилегать к коже. Используйте два соседних пальца одной руки. Можно обернуть пластины вокруг пальцев и закрепить резинкой.
  • Не двигайте пальцами во время измерения -- любое движение вызовет ложное срабатывание.
  • Начните с нейтральных вопросов ("Как вас зовут?", "Какой сегодня день?"), чтобы установить базовый уровень реакций, затем задавайте вопросы, на которые испытуемый может солгать.
  • Откройте Serial Plotter в Arduino IDE, чтобы ученики видели график реакций в реальном времени -- это самая наглядная часть проекта.
  • Обсудите с учениками, почему такой детектор не может использоваться как доказательство в суде -- это хороший повод для дискуссии о точности измерений и этике.

Как Alashed помогает

Все компоненты для этого проекта -- Arduino, резисторы, светодиоды, пьезозуммер и датчик пульса -- доступны в наборах Alashed Hardware, укомплектованных специально для школьных проектов. Для написания и загрузки кода используйте Alashed CodeStudio -- онлайн-среду разработки, в которой можно писать скетчи, компилировать и загружать их на плату прямо из браузера, без установки дополнительного ПО на школьные компьютеры.

Попробуйте Alashed бесплатно

Подключите школу к пилоту. Генерируйте КМЖ за 2 минуты, ведите CodeStudio уроки, заказывайте оборудование — всё в одном месте.

Попробовать бесплатноДемо