RGB подсветка мышки на Arduino

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

Решил я это сделать, потому что у моей мыши была обычная подсветка синего цвета.

RGB подсветка мышки на Arduino Arduino, Компьютерная мышка, RGB, Подсветка, Видео, Длиннопост

Внутри стояли три светодиода, которые просто горели и никак не управлялись.

И сразу фото результата.

RGB подсветка мышки на Arduino Arduino, Компьютерная мышка, RGB, Подсветка, Видео, Длиннопост

А теперь как это всё устроено.

RGB подсветка мышки на Arduino Arduino, Компьютерная мышка, RGB, Подсветка, Видео, Длиннопост

Приделал на двухсторонний скотч 8 светодиодов. Справа в посадочном месте стоял грузик, вместо него отлично встала ардуинка.

Световые эффекты в прошивке поделил на четыре зоны: левая кнопка, правая, четыре светодиода в центре, два внизу. Для реализации одного из эффектов подключил потенциометр колёсика к ардуине, чтобы определять вращается колёсико или нет.

Перейдём к коду прошивки.

********************************************

#include <Thread.h>

Thread bodyT = Thread();

Thread lbT = Thread();

Thread rbT = Thread();

Thread counterT = Thread();

Thread idlT = Thread();

#include <Adafruit_NeoPixel.h>

#ifdef __AVR__

#include <avr/power.h>

#endif

#define PIN 7

#define NUM_LEDS 8

#define IDLS 600 //idle mode delay in seconds

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);

const int wheelPin = A0;

uint16_t i=0, j=0; //body

uint16_t ti=0, tj=0; //tail

uint16_t jlb=0; //left button

uint16_t jrb=150; //right button

int bo[]={0,2,3,4,5,1}; //body order

int idlo[]={0,2,3,7,6,4,5,1}; //idle order

int wos=0; //wheel order position

byte wh=0;

bool idle=false; //idle state

int idlet=0; //idle time counter

int idlei=0; //idle led pos 1

int idlen=0; //idle led pos 2

void setup() {

#if defined (__AVR_ATtiny85__)

if (F_CPU == 16000000) clock_prescale_set(clock_div_1);

#endif

strip.begin();

strip.setBrightness(50);

strip.show();

bodyT.onRun(bodyF);

bodyT.setInterval(20);

lbT.onRun(lbF);

lbT.setInterval(15);

rbT.onRun(rbF);

rbT.setInterval(70);

counterT.onRun(counterF);

counterT.setInterval(1000);

idlT.onRun(idlF);

idlT.setInterval(3000);

}

void loop() {

if (counterT.shouldRun()) counterT.run();

if (!idle) {

if (bodyT.shouldRun()) bodyT.run();

if (lbT.shouldRun()) lbT.run();

if (rbT.shouldRun()) rbT.run();

} else {

if (idlT.shouldRun()) idlT.run();

}

if(wh==1) {

if(analogRead(wheelPin)>500) {tail();wh=2;}

} else {

if(analogRead(wheelPin)<500) {tail();wh=1;}

}

}

void counterF() {

if(!idle) idlet++;

if(idlet>IDLS) idle=true;

}

void idlF() {

strip.setPixelColor(idlo[idlei], Wheel(((idlei * 256 / strip.numPixels()) + j) & 255));

strip.show();

delay(75);

if(idlei==0) idlen=7; else idlen=idlei-1;

strip.setPixelColor(idlo[idlen], strip.Color(0, 0, 0));

strip.show();

if(idlei==7) idlei=0; else idlei++;

j++;

if(j>=256*5) j=0;

}

void tail() {

idle=false;

idlet=0;

for(ti=0; ti< 2; ti++) {

strip.setPixelColor(ti, Wheel(((ti * 256 / strip.numPixels()) + tj) & 255));

}

strip.show();

tj+=20;

if(tj>=256*5) tj=0;

}

void bodyF() {

for(i=2; i< strip.numPixels()-2; i++) {

strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));

}

strip.show();

j++;

if(j>=256*5) j=0;

}

void lbF() {

strip.setPixelColor(7, Wheel((7+jlb) & 255));

strip.show();

jlb++;

if(jlb>=106) jlb=0;

}

void rbF() {

strip.setPixelColor(6, Wheel((6+jrb) & 255));

strip.show();

jrb++;

if(jrb>=256) jrb=150;

}

uint32_t Wheel(byte WheelPos) {

WheelPos = 255 - WheelPos;

if(WheelPos < 85) {

return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);

}

if(WheelPos < 170) {

WheelPos -= 85;

return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);

}

WheelPos -= 170;

return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);

}

***************************************************

Вкратце по коду. Три функции: для каждой кнопки и средней зоны. Ещё одна функция для нижней зоны, которая срабатывает при вращении колёсика. Функция счетчика времени простоя. И функция для эффекта во время простоя, запускающаяся после 10 минут бездействия.

Также в этом проекте я освоил библиотеку Thread.h. Она позволяет как бы одновременно выполнять несколько функций. Но это не настоящая многозадачность конечно же. Ведь это ардуино.

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

Вот остальные фото и видео.

RGB подсветка мышки на Arduino Arduino, Компьютерная мышка, RGB, Подсветка, Видео, Длиннопост
RGB подсветка мышки на Arduino Arduino, Компьютерная мышка, RGB, Подсветка, Видео, Длиннопост
RGB подсветка мышки на Arduino Arduino, Компьютерная мышка, RGB, Подсветка, Видео, Длиннопост

На этом всё. Всем пока.

Инженериум DIY

412 постов4.3K подписчиков

Добавить пост

Правила сообщества

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

В сообществе будут попадаться посты для новичков, поэтому не стоит влетать в пост с минусомётом, направленным на задающих вопросы по теме поста.

5
Автор поста оценил этот комментарий
Ура, теперь твоя ненужная мышь за 3 доллара еще и светится как новогодняя ёлка, подчеркивая и без того безвкусный дизайн.
раскрыть ветку
5
Автор поста оценил этот комментарий

Прикольно конечно, но бессмысленно. 95% подсветки не видно во время работы.

раскрыть ветку
2
Автор поста оценил этот комментарий

Бесполезная хрень конечно, только потратил свое время. Но я тебя не осуждаю, это твое время, и делаешь ты с ним все, что хочешь. Так же можно наверное было использовать разноцветные светодиоды которые сами переливаются. Но ставлю плюс за старание, и за такой ум) я вот могу только бесполезные коменты писать в интернетах. Жду полезного поста, с таким же подробным описанием, и программированием)

Иллюстрация к комментарию
1
Автор поста оценил этот комментарий

Как бессмысленно потратить ардуинку, свое время и время тех, кто будет смотреть этот шлак.

1
Автор поста оценил этот комментарий
Круто наверное, а зачем?