#  Машина снов на Arduino своими руками
vit01 (mira, 1) → All  –  12:27:52 2017-06-22

Прочитал в интернете недавно про такую штуку как машина сновидений. Грубо говоря, это картонный вращающийся цилиндр вокруг источника света, с прорезями, создающий мерцание частотой 8-13 Гц. Оптический эффект от этого мерцания вызывает резонанс в мозгу, в результате чего от просмотра бликов у человека едет крыша, возникают интересные "галюны".

Подробнее читаем здесь: https://ru.wikipedia.org/wiki/Машина_сновидений

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

Осторожно, девайс может вызвать приступ эпилепсии! Если станет плохо, ответственности не несу!

Итак, чтобы изготовить трип-девайс из подручных средств, нам понадобятся:

1. Arduino или Raspberry Pi (или любую другую плату для самоделкиных). В данном случае ардуино
2. Три разноцветных светодиода или один RGB-LED. У меня в DIY-комплекте, заказанном из Китая, как раз оказался RGB-светодиод, поэтому я решил воспользоваться именно им
3. Устройство для преломления, чтобы создавать на стенах красивые цветовые картинки и усилить "наркоманский" эффект. Я использовал в качестве преломлятеля хрустальный стакан с резным узором.
4. Кнопка для переключения частот (8-13 Гц), дабы настраивать сеанс "под свой вкус". У меня хорошей кнопки не оказалось, поэтому я взял вместо неё датчик обхода препятствий. На него не надо нажимать пальцем, а достаточно лишь провести рукой на близком расстоянии.
5. [Опционально] источник питания для контроллера, ради портативности.
6. [Опционально] увеличительное стекло, лупа. Поможет делать другие прикольные узоры на стенах и потолке.

Итак, в нашей программе мы будем случайно, через random(), подбирать нужный цвет и зажигать в этот цвет наш светодиод. Или несколько таковых (путём эффекта сложения цветов). Я сначала пробовал подбирать рандомный цвет сразу для трёх составляющих, но потом решил вызывать random() только один раз за проход цикла, дабы чуточку увеличить производительность. В остальные цвета просто поступает предыдущее рандом-значение, поэтому эффект случайности и хаотичности полностью сохраняется.

Исходник скетча для Arduino:

====
// периоды свечения/затухания светодиодов;
// соответствуют частотам от 8 до 13 Гц
int periods[] = {62, 56, 50, 45, 42, 38};

// светодиоды к аналоговым выводам, кнопку - к цифровому
int r = A0;
int g = A1;
int b = A2;
int button = 13;

byte selected_period_index = 0; // 1 период
int selected_period = 62; // 1 период
boolean pressed = false; // кнопка была нажата
boolean tmp_pressed = false;

// сохранённые значения цветов
byte last_r = 0;
byte last_g = 0;
byte last_b = 0;

void setup() {
randomSeed(0);
pinMode(button, INPUT);
pinMode(r, OUTPUT);
pinMode(g, OUTPUT);
pinMode(b, OUTPUT);
}

void changePeriod() {
if (selected_period_index < 5) selected_period_index++;
else selected_period_index = 0;

selected_period = periods[selected_period_index];
}

void color_enable() {
// переставляем цвета местами и добавляем
// на красный цвет рандом
last_b = last_g;
last_g = last_r;
last_r = random(50, 255);
// минимальное значение 50 нужно,
// чтобы избегать появления тусклых цветов

analogWrite(r, last_r);
analogWrite(g, last_g);
analogWrite(b, last_b);
}

void color_disable() {
analogWrite(r, 0);
analogWrite(g, 0);
analogWrite(b, 0);
}

void loop() {
color_enable(); // 1, 2, 3 - ёлочка, гори!

// если кнопка была нажата, меняем частоту мерцания
tmp_pressed = (digitalRead(button) == HIGH);
if (pressed && !tmp_pressed) changePeriod();
pressed = tmp_pressed;

delay(selected_period);
color_disable();
delay(selected_period);
}
====


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

Варианты эксплуатации:

1. Либо с открытыми глазами смотрим на стены и потолок (можно использовать линзы/лупу для ещё более прикольных узоров)
2. Или закрываем глаза и смотрим прямо на источник света.

Вот так выглядит моя самодельная хрень: https://ii-net.tk/ii/ii-point.php?q=/x/file/dream-arduino.jpg

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

Прошу комментариев/вопросов, если кому-то стало интересно.