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

Arduino & Pi

1 378 постов 20 573 подписчика

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

Raspberry pi 5, часть 1. Особенности, первый запуск, удалённое управление через rpi-connect

источник

Raspberry pi 5, часть 1

Raspberry pi 5, часть 1. Особенности, первый запуск, удалённое управление через rpi-connect Китайские товары, AliExpress, Linux, Raspberry pi, Raspbian, Длиннопост

rpi5

Протестируем работу Raspberry pi 5, посмотрим особенности, а также проверим возможность удалённого управления интерфейсом. Тема нам интересна, ранее у нас были эксперименты с ARM, в начале канала описаны первые шаги.

Raspberry pi 5, часть 1. Особенности, первый запуск, удалённое управление через rpi-connect Китайские товары, AliExpress, Linux, Raspberry pi, Raspbian, Длиннопост

rpi-connect

Сразу отметим, что для полноценной работы rpi5 требуется мощный блок питания на 5А. В нашем случае на блоке питания на 3А rpi5 работала, но на рабочем столе всё время "сигналила". В реальности потребление было меньше, естественно, без подключения других компонент, только вентилятор:

Raspberry pi 5, часть 1. Особенности, первый запуск, удалённое управление через rpi-connect Китайские товары, AliExpress, Linux, Raspberry pi, Raspbian, Длиннопост

psu

Raspberry pi 5, часть 1. Особенности, первый запуск, удалённое управление через rpi-connect Китайские товары, AliExpress, Linux, Raspberry pi, Raspbian, Длиннопост

warning

(!) Для информации: на Али китайские коллеги часто продают абсолютно не подходящие по параметрам блоки питания, перед покупкой читайте комментарии.

По параметрам rpi5 превосходит rpi4 раза в 2: новый процессор, память, видео, поддержка быстрых дисков etc. Также есть приятные мелочи - кнопка включения; она работает так - при подключении питания rpi5 включается сама, далее выключить/включить можно с кнопки.

Raspberry pi 5, часть 1. Особенности, первый запуск, удалённое управление через rpi-connect Китайские товары, AliExpress, Linux, Raspberry pi, Raspbian, Длиннопост

working

Нагревается rpi5 прилично, поэтому ставить радиатор+вентилятор обязательно, об этом мы говорили ранее:

Raspberry pi 5, часть 1. Особенности, первый запуск, удалённое управление через rpi-connect Китайские товары, AliExpress, Linux, Raspberry pi, Raspbian, Длиннопост

cooling

Справедливости ради отметим, что управление охлаждением осуществляется автоматически, вентилятор включается сам при нагрузке, при простое он иногда выключается совсем. Это удобно, когда нужна нешумная плата.

Для проверки rpi-connect нужна десктопная версия системы:

Raspberry pi 5, часть 1. Особенности, первый запуск, удалённое управление через rpi-connect Китайские товары, AliExpress, Linux, Raspberry pi, Raspbian, Длиннопост

Raspberry PI Imager

После установки плата автоматически перезагружается несколько раз. Честно сказать, десктопной версией мы пользовались всего несколько раз. Тут ничего особенного нет. Советуем при запуске Raspberry PI Imager настроить:

  • логин/пароль пользователя

  • подключение к своей точке доступа, если нет кабельного подключения

  • включить ssh-сервер

Для проверки rpi-connect нужно обновить пакеты, ОС и установить пакет с последующей перезагрузкой:

sudo apt install rpi-connect

Все действия по настройке rpi-connect сделать только через консоль не получится.

Регистрация на сайте нужна (им для учёта нас) для возможности удалённого входа по логину/паролю из любого браузера. Ресурс для входа будет вида:

https://connect.raspberrypi.com/devices/qwertyui-1234-5678-zxcv-1234567890qw

Raspberry pi 5, часть 1. Особенности, первый запуск, удалённое управление через rpi-connect Китайские товары, AliExpress, Linux, Raspberry pi, Raspbian, Длиннопост

rpi-connect

Производитель ПО утверждает, что соединение производится peer-to-peer. Мы при работе из браузера наблюдали торможение, "шлейф" при ресайзе окон, иногда при наборе текста.

Наши выводы:

  • rpi5 - достаточно мощная плата, позже мы еще ещё постестируем её возможности

  • охлаждение и блоки питания - важные составляющие, на этом экономить нельзя

  • функция rpi-connect (beta) интересна, но пока притормаживает. Если нужно просто удалённо управлять платой с графической оболочкой - используйте. Нам пока хватает ssh

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

Светодиодные матрицы для "чайников" (часть 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

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

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

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

Определение направления вращения колёсика мыши (неоптической) Физика, 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 установка вайфай- невозможна, протянуть витую пару- невозможно. Отсюда вопрос: есть ли такие устройства в природе (кроме автомобильных сигнализаций), как они могут называться? Если нет, можно ли такое решение реализовать на ардуино? Если да, то обсудил бы цену со-специалистом, нужно два таких устройства.
Если подробнее, то алгоритм примерно такой: некто включает рубильник, затем идет к щитку и нажимает кнопку пуска, после нажатия кнопки устройство готово к работе, выключение устройства происходит отключением рубильника. Нужно что бы приходило уведомление в момент когда появляется питание (не важно, рубильник или кнопка) и нужно уведомление в момент, когда питание пропадает.

Отличная работа, все прочитано!