Сообщество - Arduino & Pi
Добавить пост

Arduino & Pi

1 377 постов 20 571 подписчик

Популярные теги в сообществе:

Светодиодные матрицы для "чайников" (часть 2)

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

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

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

Светодиодные матрицы для "чайников" (часть 2) Arduino, Программирование, Длиннопост, Светодиоды, Видео, Без звука

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

Светодиодные матрицы для "чайников" (часть 2) Arduino, Программирование, Длиннопост, Светодиоды, Видео, Без звука

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

uint16_t mapTable[][2] = {

{ 206, 340 },

{ 181, 354 },

{ 156, 369 },

{ 132, 383 },

{ 107, 398 },

{ 89, 404 },

{ 89, 385 },

{ 95, 357 },

{ 101, 329 },

{ 107, 301 },

{ 114, 273 },

... // и так далее, для всех 180 диодов

};

struct ledCoords {

uint16_t x;

uint16_t y;

};

ledCoords mapIdxToXY( byte index ) {

return { mapTable[index][0], mapTable[index][1] };

}

void loop() {

for ( byte i = 0; i < NUM_LEDS; i++ ) {

ledCoords lc = mapIdxToXY(i);

leds[i] = effectColorByCoords(lc.x, lc.y);

}

FastLED.show();

}

На практике это оказывается не очень удачным решением. Координаты - штука относительная. У кого-то линейка в дюймах, а у кого-то 4К картинка с четырехзначными координатами. Замучаешься подгонять масштаб анимации под каждое устройство. Чтобы избежать этого выполняют нормализацию координат.
Звучит страшно, но на практике это просто пересчет в некую фиксированную систему координат. Например, давай примем за правило, что минимальная координата по X среди всех диодов это 0 в нашей "нормализованной" системе, а максимальная - 1. И все остальные координаты пересчитаем пропорционально Xn = ( x - Xmin )/(Xmax - Xmin). Аналогично поступим с координатами Y.

Теперь у нас все координаты на любом устройстве лежат в пространстве 0..1
Такой подход используется в программируемых контроллерах Pixelblaze.

Казалось бы, можно закончить занудствовать на этом, но позволь еще немного помучать тебя.

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

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

  • Ну и в-третьих, тут уж мое личное мнение, куча дробных чисел в формулах снижает читабельность кода, а отладка такого кода вызывает у меня тихий ужас.

И тут ты подкидываешь наивную идею: "А можно как-то так чтобы координаты остались целыми, но не такими большими и более-менее схожей размерности на разных устройствах?"

Можно!

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

Светодиодные матрицы для "чайников" (часть 2) Arduino, Программирование, Длиннопост, Светодиоды, Видео, Без звука

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

byte mapTable[][2] = {

{ 12, 18 },

{ 11, 19 },

{ 9, 20 },

{ 7, 21 },

{ 6, 22 },

{ 5, 22 },

{ 5, 21 },

{ 5, 19 },

{ 6, 18 },

{ 6, 16 },

{ 6, 15 },

... // и так далее, для всех 180 диодов

}

Вроде неплохо получается.

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

byte mapTableIndex[23][27] = {

{ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 27,

255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },

{ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 26, 255,

28, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },

{ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 25, 77,

29, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },

{ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 78, 255,

76, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },

{ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 24, 255, 255,

255, 30, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },

{ 255, 255, 255, 255, 255, 255, 255, 255, 255, 23, 255, 79, 117,

75, 255, 31, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },

... // и еще 17 строк

}

Тогда функция мэппинга и рабочий цикл будут выглядеть как-то так:

byte mapXYtoIdx( byte x, byte y ) {

return mapTableIndex[y][x];

}

void loop() {

for ( byte y = 0; y < 23; y++ ) {

for ( byte x = 0; x < 27; x++ ) {

byte ledIndex = mapXYToIdx(x,y);

if ( ledIndex == 255 ) continue;

leds[ledIndex] = effectColorByCoords(x, y);

}

}

FastLED.show();

}

Конечно, хранить такие большие массивы с таблицами мэппинга в оперативной памяти не стоит, обычно их загоняют во flash используя PROGMEM.

Собираем все полученные знания в кучу и зажигаем)

(Продолжение следует, stay tuned)

Показать полностью 3 1

Кнопка с подсветкой на Ардуино

Сразу скажу - я полный нуб в Ардуино. Задумал тут один проект, что-то типа баттон бокса. Только мне нужны кнопки с подсветкой. Вот такие:

Кнопка с подсветкой на Ардуино Arduino, Вопрос, Нужен совет

Кнопки будут на 5V.

Есть ли какой-то способ подключить эти кнопки к плате, чтобы при включении загоралась зеленая подсветка? Или всё таки нужно мудрить через блок питания?

Показать полностью 1

Светодиодные матрицы для "чайников" (часть 1)

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

Светодиодные матрицы для "чайников" (часть 1) Arduino, Программирование, Длиннопост, Светодиоды, Видео, Без звука

Итак, адресный RGB светодиод отличается от обычного трехцветного наличием встроенного контроллера, вон тот черный прямоугольник на картинке. Эта чудесная микросхема принимает со входа Din пакет данных, откусывает от него первые 24 бита и отправляет оставшиеся данные на выход Dout. А откушенный кусочек превращает в прекрасное свечение определенного цвета.

На мой взгляд, определение “адресный” не совсем подходит для этого контекста, так как адреса и нет вовсе, а есть только порядковый номер диода в конкретной конструкции. Если снесут дом на улице, остальные дома останутся при своих номерах, а если убрать на светодиодной ленте первый диод, то второй станет первым.

В программе контроллера работа с адресными диодами обычно сводится к созданию массива с количеством элементов равным количеству диодов в сборке, где каждый элемент определяет цвет соответствующего диода. Этот массив нужно передать на диодную сборку.На примере самой популярной библиотеки FastLED это выглядит так:

CRGB leds[NUM_LEDS];
leds[0] = CRGB::Red;
FastLED.show();

И все, мы зажгли первый светодиод на ленте красным цветом.

Я опустил инициализацию библиотеки для конкретной ленты, подсмотришь в последующих примерах или документации на FastLED.

Большинство эффектов для светодиодных конструкций представляют собой некую функцию определяющую цвет светодиода в текущий момент времени по его координатам в конструкции.

С лентами вроде все понятно, одномерный объект, одна координата равная порядковому номеру диода на ленте.

А как быть с матрицами? Они уже двумерные, там у каждого диода есть две координаты - столбец и строка. Не паникуй, оказывается среднестатистическая матрица это та же лента уложенная рядочками. Так что, технически, обращение к конкретному диоду выполняется все так же, по его номеру. Слышу твое возмущение, и ты конечно же прав, матрица двумерная и обращаться к диодам хотелось бы по понятным двум координатам. Выручит небольшая функция, которая будет пересчитывать две координаты в номер диода. В общем случае, для прямоугольной матрицы размером WIDTH х HEIGHT, получится как-то так:

int XY( int x, int y ) {
return y * WIDTH + x;
}

Это преобразование обычно называют мэппингом ( mapping )

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

Берем самую распространенную китайскую матрицу 16х16 с диодами WS2812, первый диод в левом верхнем углу, там же и начало координат. Все координаты и индексы начинаются с нуля. Цепляем матрицу по схемам из интернета к контроллеру и пишем первую программу.

#include <FastLED.h>
#define DATA_PIN 12
#define WIDTH 16
#define HEIGHT 16
#define NUM_LEDS WIDTH * HEIGHT

CRGB leds[NUM_LEDS];

byte XY( byte x, byte y ) {
return y * WIDTH + x;
}

void setup() {
FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
FastLED.clear();
for ( byte y = 0; y < HEIGHT; y++ ) {
for ( byte x = 0; x < WIDTH; x++ ) {
leds[XY(x,y)] = CRGB::Red;
FastLED.show();
delay(100);
}
}
}

void loop() {
}

Компилируем, прошиваем. Работает!!!

Так, стоп! У нас цикл для X идет по возрастанию от 0 до 15, почему же тогда каждая вторая строка матрицы заполняется в обратном порядке?
Помнишь я говорил что матрица это лента уложенная рядочками? Так вот ленту удобнее укладывать змейкой, что производители и делают) Раскладка так и называется - serpentine ( aнгл. змеевидный ).

Что же делать с нашим примером, ведь мы хотим зажечь диод с координатами (2,1) а зажигается диод (13,1). Немного поскрипим извилинами и изменим функцию мэппинга так чтобы каждый второй ряд считался в обратном порядке.

byte XY( byte x, byte y ) {
if ( y%2 == 0 ) {
return y * WIDTH + x;
} else {
return ( y + 1 ) * WIDTH - x - 1;
}
}

Не буду разжевывать математику, прикинешь на пальцах, сообразишь сам что к чему.

Теперь все ок.

С адресацией матрицы разобрались, можем творить красоту.

(Продолжение следует. Stay tuned)

Показать полностью 3

Конкурс для мемоделов: с вас мем — с нас приз

Конкурс мемов объявляется открытым!

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

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

А пока предлагаем посмотреть видео, из которых мы сделали шаблоны для мемов. В главной роли Валентин Выгодный и «Пакет» от Х5 — сервис для выгодных покупок в «Пятёрочке» и «Перекрёстке».

Реклама ООО «Корпоративный центр ИКС 5», ИНН: 7728632689

Определение направления вращения колёсика мыши (неоптической)

Возникла мысль об использовании энкодера мыши в Ардуино. И стало интересно как определяется направление вращения колёсика. В интернете информация конечно есть, но в основном по оптическим. Провел небольшой эксперимент. Делюсь результатами.

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

Определение направления вращения колёсика мыши (неоптической) Физика, Arduino, Эксперимент, Мышь, Энкодер, Электроника, Самоделки, Видео

Если смотреть с этой стороны, то правой крайний пин общий, остальные переменные.

Попробую использовать, если получится сделаю пост о том, что получилось.

Показать полностью 1

Xbox 360 пропатчен !

долго собирал необходимый инструмент, но в итоге, я это сделал, Xbox 360 пропатчен.

Xbox 360 пропатчен ! Xbox 360, Пиратство, Rasberi PI, Длиннопост
Xbox 360 пропатчен ! Xbox 360, Пиратство, Rasberi PI, Длиннопост
Xbox 360 пропатчен ! Xbox 360, Пиратство, Rasberi PI, Длиннопост
Xbox 360 пропатчен ! Xbox 360, Пиратство, Rasberi PI, Длиннопост
Xbox 360 пропатчен ! Xbox 360, Пиратство, Rasberi PI, Длиннопост
Xbox 360 пропатчен ! Xbox 360, Пиратство, Rasberi PI, Длиннопост
Xbox 360 пропатчен ! Xbox 360, Пиратство, Rasberi PI, Длиннопост
Xbox 360 пропатчен ! Xbox 360, Пиратство, Rasberi PI, Длиннопост
Xbox 360 пропатчен ! Xbox 360, Пиратство, Rasberi PI, Длиннопост
Xbox 360 пропатчен ! Xbox 360, Пиратство, Rasberi PI, Длиннопост

PS

Это мой 3й Xbox360, чтото все время жизнь меня с ними разлучает, но я не сдаюсь и вот вновь получил возможность прикоснуться к прекрасному 😃

PS PS

Это моя консоль, которую я купил, что хочу, то с ней и ворочу) Волков бояться, на торренты не заходить ;)

Показать полностью 10

OEM компьютер AntexGate

OEM компьютер AntexGate Электроника, Linux, Сборка компьютера, Raspberry pi, Умный дом, Автоматизация, Промышленность, Встраиваемые системы, Контроллер, Компьютерное железо, Гаджеты, Длиннопост

Наконец новый промышленный компьютер на базе процессора broadcom, который полностью совместим с софтом для raspberry можно взять на тест бесплатно. Производство РФ.

Чат - техническая поддержка, и инструкция.

Запрос образца на тест в свободной форме.

Особенности устройства:

  • Интерфейс Etnernet 100Mb — 1шт;

  • Интерфейс Etnernet 1Gb — 1шт;

  • Интерфейс CAN-BUS – 1шт;

  • Интерфейс RS485 ISOLATED– 2шт;

  • Интерфейс RS232 – 1шт;

  • Интерфейс 1Wire – 1шт;

  • Интерфейс USB – 2шт;

  • Дискретные входы оптопара- 4шт;

  • Релейные выходы – 2шт;

  • Выход оптопара – 1шт;

  • Разъем HDMI;

  • Разъем для подключения GSM-антенны;

  • Разъем для подключения WiFi-антенны;

  • Разъем m.2 – 1шт Для диска NVMe SSD

  • Разъем mPCIe – 1шт (Lora; WiFi; 3G/LTE; NB-IOT; Zigbee; Z-Wave):

    Рабочая температура: -25°C… +80°C.

    Потребляемая мощность Питание: клеммы DC 12-48В; Passive Poe AC/DC 12-48В; Мощность: 1.56-5.8 Вт в зависимости от конфигурации.

    Системные характеристики

    Процессор: BCM2711 на базе Raspberry Pi CM4; ЦПУ: 4-ядерный Cortex-A72 (ARM v8) 64-bit SoC @ 1.5GHz Flash: 8/16/32GB eMMC. RAM: 1/2/4/8GB

    Поддерживаемые протоколы

  • ModBus;

  • Dmx 512,

  • MQTT,

  • Profinet;

  • LoRaWAN;

  • CAN;

  • OPC UA

  • и другое.

    Поддерживаемых платформы и ПО

  • NodeRed;

  • OpenHab;

  • CoDeSys;

  • MasterSCADA 4D;

  • Home Assistant;

  • iRidiumMobile;

  • Z-Wave.me

  • Совместимый софт с raspberry pi4

    Поддерживаемые веб-сервисы

  • ApacheHTTP;

  • NGINX.

    Операционная система

  • Linux,

  • Ubuntu,

  • Debian,

  • Astra Linux,

  • OpenWrt

Показать полностью 1

Нужно устройство, которое будет оповещать о включении питания

Здравствуйте уважаемые! Возникла необходимость установить некое устройство, которое будет по смс или телеграм или вацап оповещать о том, что на контакте появилось питание. Контакт (-ы) 380V установка вайфай- невозможна, протянуть витую пару- невозможно. Отсюда вопрос: есть ли такие устройства в природе (кроме автомобильных сигнализаций), как они могут называться? Если нет, можно ли такое решение реализовать на ардуино? Если да, то обсудил бы цену со-специалистом, нужно два таких устройства.
Если подробнее, то алгоритм примерно такой: некто включает рубильник, затем идет к щитку и нажимает кнопку пуска, после нажатия кнопки устройство готово к работе, выключение устройства происходит отключением рубильника. Нужно что бы приходило уведомление в момент когда появляется питание (не важно, рубильник или кнопка) и нужно уведомление в момент, когда питание пропадает.

Угадайте звездного капитана юмористической команды «Сборная Красноярска» по описанию одного из участников

Ну что, потренировались? А теперь пора браться за дело всерьез.

Показать полностью

RGB портативный Wi-Fi светильник

В продолжение поста Портативный RGB светильник с управлением по Wi-Fi

RGB портативный Wi-Fi светильник Электроника, Самоделки, Своими руками, Светильник, Видео, YouTube, Длиннопост

В этот раз светильник собран в квадратном корпусе размерами около 120*120*27мм. Светодиодов здесь уже не 18, а 25, но и аккумулятор чуть большей ёмкости, поэтому в режиме одного цвета на максимальной яркости он также проработает до 2 часов от одного заряда.

За основу был взят потолочный встраиваемый светильник, от которого использовался корпус и рассеиватель. Внутрь установлена лента на WS2812, питающаяся от одного литиевого аккумулятора через преобразователь на МТ3608. За заряд отвечает модуль на ТР4056: USB-C разъём выведен на торец корпуса, рядом с ним - два светодиода (зарядка идёт, зарядка завершена).

RGB портативный Wi-Fi светильник Электроника, Самоделки, Своими руками, Светильник, Видео, YouTube, Длиннопост

Одно фото из процесса сборки:

RGB портативный Wi-Fi светильник Электроника, Самоделки, Своими руками, Светильник, Видео, YouTube, Длиннопост

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

Под всю начинку я начертил и заказал вот такой корпус:

RGB портативный Wi-Fi светильник Электроника, Самоделки, Своими руками, Светильник, Видео, YouTube, Длиннопост

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

RGB портативный Wi-Fi светильник Электроника, Самоделки, Своими руками, Светильник, Видео, YouTube, Длиннопост

Лентой управляет ESP8266 с прошивкой WLED. Веб-интерфейс содержит все необходимые настройки и позволяет активировать множество разнообразных эффектов, в частности для прямоугольных матриц.

Как и предыдущий светильник, этот предназначен для фото- и видеосъёмки: им можно и освещать что-то в кадре (есть и белый цвет, и различные оттенки), и применять в самом видео.

Для вопросов, на которые я не могу отвечать здесь, есть почта - matvey6191@gmail.com

Показать полностью 5 1
Отличная работа, все прочитано!