Бегущий поворотник на Digispark ATMEL Attiny85

  • У нас появились СТАТЬИ! Левая кнопка в меню навигации. Любую тему можно преобразовать в статью (в настройках темы И при её создании): первое сообщение станет текстом статьи, а остальные - комментариями. На форуме много достойных тем, думаю стоит навести порядок в первом сообщении с учётом всех остальных постов, красиво оформить и перевести их в статьи. Хорошие темы должны быть на "витрине"! Данное объявление можно отключить крестиком (куки должны быть включены)

vikn72

✩✩✩✩✩✩✩
31 Июл 2018
31
4
перенесено в "разработку" по причине не соответствия разделу.
ребята помогите разобраться вот тут накидал скетч, вернее немного переделал чейто, с целью уменьшения размеров плат , чтоб всю електронику можно было спрятать прям в поворотник и на каждый поворотник отдельную схему собрать. лента ws2812b 144 пикселя на мерт
#include <Adafruit_NeoPixel.h>

//несколько общих комментариев
// я отключил по одному крайнему светодиоду, т.к. они отсвечивали на декоративные панели стоек
//видно на примере этого цикла for (int i=1; i<23; i++ )
//если отключать не нужно, заменяем на for (int i=0; i<24; i++ )

//задний ход и аварийка у меня не используются, т.к. в первом случае яркость никакая, во втором надо подключать входы к лампам поворотников

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

// Пин для подключения управляющего сигнала светодной ленты
const int PinLS = 5;

//Пины для подключения датчиков
//если более удобно будет подключать контакты в другом порядке - просто поменяйте значения переменных
const int buttonPinL = 3;
const int buttonPinR = 4;

//начальные статусы входов (подтянуты к плюсу)
int buttonStateL = HIGH;
int buttonStateR = HIGH;

// пауза pause_pov1 (в миллисекундах) нужна, чтобы синхронизировать циклы "пробегания" полоски и включения лампочки поворотника
// такое может быть, если используется меньше половины светодиодов
// в моем случае паузы нет (pause_pov1 = 0)
int pause_pov1 = 3;

// этой паузой регулируем длительность состояния, когда все светодиоды выключены
//я определял опытным путем - включал поворотник, засекал по отдельности время ста мыргов лампочкой и ста беганий полоски, разницу делил на 100, на полученное время увеличивал или уменьшал значение переменной (в зависимости от того, отставали или убегали вперед лампочки)
int pause_pov2 = 15;

// переменная для значения ускорения
int ix;

Adafruit_NeoPixel strip = Adafruit_NeoPixel(24, PinLS, NEO_GRB + NEO_KHZ800);

void setup() {
pinMode(buttonPinL, INPUT);
pinMode(buttonPinR, INPUT);

strip.begin();
// гасим ленту
for (int i = 0; i < 24; i++ ) strip.setPixelColor(i, strip.Color(0, 0, 0));
strip.show();

}

void loop() {


// если включена аварийка
if (buttonStateL == LOW && buttonStateR == LOW) {
for (int il = 1; il < 24; il++ ) {
strip.setPixelColor(24 - il, strip.Color(103, 31, 0));
strip.setPixelColor(il + 24, strip.Color(103, 31, 0));
strip.show();
delay(pause_pov1);
}
for (int il = 0; il < 24; il++ ) {
strip.setPixelColor(24 - il, strip.Color(0, 0, 0));
strip.setPixelColor(il + 24, strip.Color(0, 0, 0));
strip.show();
delay(pause_pov1);
}
delay(pause_pov2);
}

// если включен ЛЕВЫЙ ПОВОРОТНИК
if (buttonStateL == LOW && buttonStateR == HIGH) {
for (int il = 0; il < 24; il++ ) {
strip.setPixelColor(il + 24, strip.Color(103, 31, 0));
strip.show();
delay(pause_pov1);
}
for (int il = 0; il < 24; il++ ) {
strip.setPixelColor(il + 24, strip.Color(0, 0, 0));
strip.show();
delay(pause_pov1);
}
delay(pause_pov2);
}
// если включен ПРАВЫЙ ПОВОРОТНИК
if (buttonStateL == HIGH && buttonStateR == LOW) {
for (int il = 0; il < 24; il++ ) {
strip.setPixelColor(24 - il, strip.Color(103, 31, 0));
strip.show();
delay(pause_pov1);
}
for (int il = 0; il < 24; il++ ) {
strip.setPixelColor(24 - il, strip.Color(0, 0, 0));
strip.show();
delay(pause_pov1);
}
delay(pause_pov2);
} //правый поворотник конец

} //конец условия else Стоп
 
Последнее редактирование:

vikn72

✩✩✩✩✩✩✩
31 Июл 2018
31
4
по идее должно работать но я не програмировал дигиспарк никогда. буду заказывать контролер. хотел спросить правильно я сделал скетч или нет . на контролере пинов мало мне по идее всего 3 пина нужно задействовать через оптопару к подянутому плюсу постоянно2 пина на сигналы поворотов и на саму ленту 1 пин
 

vikn72

✩✩✩✩✩✩✩
31 Июл 2018
31
4
Так, а с чем разобраться, что не работает?
ЗЫ: м.б. это лучше в программирование?
Нет в программировании не пойдёт хочу именно сделать проект чтобы был готов и всем доступен хочу как можно максимально меньше сделать плат и удобно чтобы было установить в поворотник всю конструкцию. Есть готовые проекты на плате Arduino но там нужно сделать целую коробочку тянуть кучу проводов я немного хочу модернизировать всё отдельно не делать на ардуине а только Бегущий поворотник и всё это дело минимизировать и спрятать непосредственно в самом поворотник
 

Wan-Derer

★★★★✩✩✩
Команда форума
31 Июл 2018
1,350
249
Москва
wan-derer.ru
Ну, вряд ли здесь кто-то будет разбирать твой скетч. Получишь плату - будешь отлаживать. Будут конкретные проблемы - задавай конкретные вопросы, тогда, возможно :) , помогут.
 
  • Лойс +1
Реакции: vikn72

Nick

✩✩✩✩✩✩✩
1 Авг 2018
28
8
Скетч посмотрел, какой то он корявенький=)
Но прежде чем писать скетч необходимо определиться со схемой вашего устройства.
У вас я так понял лента. 144 диода на метр.
Сколько светодиодов будет в поворотнике?
Что за машина ? Какой объём пространства в поворотнике? Как машина цепляется к контролеру ? Мы же не экстрасенсы):cool: Кароче схемку набросать необходимо, а патом с железом мудрить.

Кстати судя по скетчу у вас 20 диодо по 10шт на поворотник.:D
 

vikn72

✩✩✩✩✩✩✩
31 Июл 2018
31
4
машина bmw e34 вот пару фото. плафон задний но его ставить не буду это тренировочный плафон если сломаю то не жалко. на нём все репетиции . планирую закинуть в плафон по 3 кусочка леты на поворотник подключив дигиспарк. скетч там примерный и нужно подправить количества светодиодов . в кусочке получается 24 пикселя
20180731_230135.jpg20180728_144402.jpg1533096595523-1241758756.jpg
 

Nick

✩✩✩✩✩✩✩
1 Авг 2018
28
8
Вот уже понятней.
А как с питанием ? Диоды напрямую от платки не пойдут их слишком много. Питание устройства должно быть стабилизировано. В приделах 5вольт.

Три кусочка соединяются последовательно ? Там форма какая то изогнутая или вы что то своё придумали?
 

vikn72

✩✩✩✩✩✩✩
31 Июл 2018
31
4
думаю диоды паралельно соединить от одного пина а питание кинуть отдельно на них через
-5245858901095462611.jpg
формы особо нет никакой. ленты внутри немного изогнуты будут
20180731_230125.jpg
 
Последнее редактирование:

vikn72

✩✩✩✩✩✩✩
31 Июл 2018
31
4
ребята
} //конец условия else Стоп
[/SPOILER]
в скетче думаю надо убрать режим аварийка. Digispark будет стоять в каждом поворотнике и у каждого будет своя личная задача включать поворотник при поступлении сигнала на него если включать аварийку на машине сигнал автоматически будет идти на оба контроллера это же Логично поэтому необходимость в аварийке отпадает я дтак думаю
 

Nick

✩✩✩✩✩✩✩
1 Авг 2018
28
8
Приблизительное пиковое потребление для лент длиной 1 метр:
144 диода на метр 35 ватт (7A при 5V) Я думаю такого преобразователя будет малавато.
 

vikn72

✩✩✩✩✩✩✩
31 Июл 2018
31
4
Приблизительное пиковое потребление .
там будет 72 пикселя на одну сторону я думаю будет достаточно около 3А выдаёт понижайка. тем более белым светить там ничего не будет на максимальной яркости а только моргает жёлтым всего лишь навсего Я бы и ленту поставил подешевле но переливаться в стиле Audi не может никакая другая Лента кроме ws2112. Буду замерять мультиметром когда приедет контроллер digispark На крайний случай один кусочек ленты в 24 пикселя можно будет убрать и останется в поворотники 48 пикселей в два кусочка ленты Но это в крайний случай
 
Последнее редактирование:

Nick

✩✩✩✩✩✩✩
1 Авг 2018
28
8
Я так понимаю что то типа этого должно получиться. Куски ленты друг над другом распалогаются?рмапм.png
 

Nick

✩✩✩✩✩✩✩
1 Авг 2018
28
8
Если есть возможность дайте ссылку на видео. Может вы уже где то видели подобное. Хоть посмотреть как это должно выглядеть в реале.
 

vikn72

✩✩✩✩✩✩✩
31 Июл 2018
31
4
Да ещё на том видео скетчь очень большой и в digispark не влазит там не хватает места поэтому я хочу другой скетч применить
 

Nick

✩✩✩✩✩✩✩
1 Авг 2018
28
8
По идее скетч должен поместиться. А почему ардуино не захотели? Pro mini например 168, она у китайцев рублей сто с копейками. Там памяти побольше.
 

Nick

✩✩✩✩✩✩✩
1 Авг 2018
28
8
Могу предложить вам такой тестовый скетч
//Digispark ATMEL Attiny85
#include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel pixelsL = Adafruit_NeoPixel(24, 0, NEO_GRB + NEO_KHZ800);// параметры ленты 24 пикселя 0 пин подключения, pixelsL название ленты - используем для инициализации нескольких подключённых лент
void setup() {
Serial.begin(9600);//Частота монитора порта
pixelsL.setBrightness(100);//Яркость светодиодов
pixelsL.begin();//инициализация ленты
pixelsL.show();//задействуем диоды
pinMode(1, INPUT);//Пин (1) для подключения кнопки, используем два состояния HIGH / LOW
}
void loop() {
if (digitalRead(1) == LOW) {//состояние LOW отсутствие напряжения на пине
Serial.println("Batton+");
Serial.println("pixelsL LOW");
for (int i = 0; i <= 23; i++) {//Цикл перебор светодиодов от 0 до 23 закрашиваем диоды
Serial.println(i);//отоброжение переменной в мониторе порта
pixelsL.setPixelColor(i, 103, 31, 0);// выбираем цвет R,G,B
pixelsL.show();
delay(100);//задержка 100мс (скорость отображения ленты / закрашиваем)
}
Serial.println("Batton-");
for (int i = 23; i >= 0; i--) {//Цикл перебор светодиодов от 23 до 0 закрашиваем диоды
Serial.println(i);//отоброжение переменной в мониторе порта
pixelsL.setPixelColor(i, 0, 0, 0);// стираем перебором в 0 (гасим)
pixelsL.show();
delay(100);//задержка 100мс (скорость отображения ленты / стираем)
}
}
}
Соберите свою конструкцию, а там дальше видать будет.
Что то мне подсказывает что ваша задумка с контролером в каждом плафоне не очень хорошая.
 
  • Лойс +1
Реакции: vikn72

vikn72

✩✩✩✩✩✩✩
31 Июл 2018
31
4
Могу предложить вам такой тестовый скетч
//Digispark ATMEL Attiny85
#include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel pixelsL = Adafruit_NeoPixel(24, 0, NEO_GRB + NEO_KHZ800);// параметры ленты 24 пикселя 0 пин подключения, pixelsL название ленты - используем для инициализации нескольких подключённых лент
void setup() {
Serial.begin(9600);//Частота монитора порта
pixelsL.setBrightness(100);//Яркость светодиодов
pixelsL.begin();//инициализация ленты
pixelsL.show();//задействуем диоды
pinMode(1, INPUT);//Пин (1) для подключения кнопки, используем два состояния HIGH / LOW
}
void loop() {
if (digitalRead(1) == LOW) {//состояние LOW отсутствие напряжения на пине
Serial.println("Batton+");
Serial.println("pixelsL LOW");
for (int i = 0; i <= 23; i++) {//Цикл перебор светодиодов от 0 до 23 закрашиваем диоды
Serial.println(i);//отоброжение переменной в мониторе порта
pixelsL.setPixelColor(i, 103, 31, 0);// выбираем цвет R,G,B
pixelsL.show();
delay(100);//задержка 100мс (скорость отображения ленты / закрашиваем)
}
Serial.println("Batton-");
for (int i = 23; i >= 0; i--) {//Цикл перебор светодиодов от 23 до 0 закрашиваем диоды
Serial.println(i);//отоброжение переменной в мониторе порта
pixelsL.setPixelColor(i, 0, 0, 0);// стираем перебором в 0 (гасим)
pixelsL.show();
delay(100);//задержка 100мс (скорость отображения ленты / стираем)
}
}
}
Соберите свою конструкцию,
я обязательно ваш скетч попробую но мне чтото подсказывает что провод придётся протягивать ко второму плафону.
 

vikn72

✩✩✩✩✩✩✩
31 Июл 2018
31
4
#include <Adafruit_NeoPixel.h>

//несколько общих комментариев
//видно на примере этого цикла for (int i=1; i<23; i++ ) возможность отлючить по одному светодиоду
//если отключать не нужно, заменяем на for (int i=0; i<24; i++ )

// Пин для подключения управляющего сигнала светодной ленты
const int PinLS = 12;

//Пины для подключения датчиков
//если более удобно будет подключать контакты в другом порядке - просто поменяйте значения переменных
const int buttonPinL = 3;
const int buttonPinR = 4;

//начальные статусы входов (подтянуты к плюсу)
int buttonStateL = HIGH;
int buttonStateR = HIGH;

// пауза pause_pov1 (в миллисекундах) нужна, чтобы синхронизировать циклы "пробегания" полоски и включения лампочки поворотника
// такое может быть, если используется меньше половины светодиодов
// в моем случае паузы нет (pause_pov1 = 0)
int pause_pov1 = 5;

// этой паузой регулируем длительность состояния, когда все светодиоды выключены
//я определял опытным путем - включал поворотник, засекал по отдельности время ста мыргов лампочкой и ста беганий полоски, разницу делил на 100, на полученное время увеличивал или уменьшал значение переменной (в зависимости от того, отставали или убегали вперед лампочки)
int pause_pov2 = 15;

Adafruit_NeoPixel strip = Adafruit_NeoPixel(24, PinLS, NEO_GRB + NEO_KHZ800);

void setup() {
pinMode(buttonPinL, INPUT);
pinMode(buttonPinR, INPUT);

strip.begin();

// гасим ленту

for (int i = 0; i < 24; i++ ) strip.setPixelColor(i, strip.Color(0, 0, 0));
strip.show();

}

void loop() {
buttonStateL = digitalRead(buttonPinL);
buttonStateR = digitalRead(buttonPinR);

// если включен ЛЕВЫЙ ПОВОРОТНИК
if (buttonStateL == LOW && buttonStateR == HIGH) {
for (int il = 0; il < 24; il++ ) {
strip.setPixelColor(il + 24, strip.Color(100, 60, 0));
strip.show();
delay(pause_pov1);
}
for (int il = 0; il < 24; il++ ) {
strip.setPixelColor(il + 24, strip.Color(0, 0, 0));
strip.show();
delay(pause_pov1);
}
delay(pause_pov2);
}
// если включен ПРАВЫЙ ПОВОРОТНИК
if (buttonStateL == HIGH && buttonStateR == LOW) {
for (int il = 0; il < 24; il++ ) {
strip.setPixelColor(24 - il, strip.Color(100, 60, 0));
strip.show();
delay(pause_pov1);
}
for (int il = 0; il < 24; il++ ) {
strip.setPixelColor(24 - il, strip.Color(0, 0, 0));
strip.show();
delay(pause_pov1);
}
delay(pause_pov2);
} //правый поворотник конец

} //конец условия else Стоп
 

mechanic

Сверлит текстолит когтями
Команда форума
31 Июл 2018
420
116
Хммм, а вполне симпотно получилось!
 
  • Лойс +1
Реакции: vikn72

vikn72

✩✩✩✩✩✩✩
31 Июл 2018
31
4
парни вот есть код скетча
// NeoPixel-KnightRider

//-----------------------------------------------------------------------------

#include <Adafruit_NeoPixel.h>

// SETUP YOUR OUTPUT PIN AND NUMBER OF PIXELS
#define PIN 12
#define NUM_PIXELS 24

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

void setup() {
strip.begin();
clearStrip(); // Initialize all pixels to 'off'
delay(1000);
}

void loop() {
knightRider(3, 32, 8, 0xFFFF00); // Cycles, Speed, Width, RGB Color (original orange-red)

clearStrip();
delay(1);

// Iterate through a whole rainbow of colors
for (byte j = 0; j < 252; j += 7) {
}
clearStrip();
delay(1);
}

// Cycles - one cycle is scanning through all pixels left then right (or right then left)
// Speed - how fast one cycle is (32 with 16 pixels is default KnightRider speed)
// Width - how wide the trail effect is on the fading out LEDs. The original display used
// light bulbs, so they have a persistance when turning off. This creates a trail.
// Effective range is 2 - 8, 4 is default for 16 pixels. Play with this.
// Color - 32-bit packed RGB color value. All pixels will be this color.
// knightRider(cycles, speed, width, color);
void knightRider(uint16_t cycles, uint16_t speed, uint8_t width, uint32_t color) {
uint32_t old_val[NUM_PIXELS]; // up to 256 lights!
// Larson time baby!
for (int i = 0; i < cycles; i++) {
for (int count = 1; count < NUM_PIXELS; count++) {
strip.setPixelColor(count, color);
old_val[count] = color;
for (int x = count; x > 0; x--) {
old_val[x - 1] = dimColor(old_val[x - 1], width);
strip.setPixelColor(x - 1, old_val[x - 1]);
}
strip.show();
delay(speed);
}
for (int count = NUM_PIXELS - 1; count >= 0; count--) {
strip.setPixelColor(count, color);
old_val[count] = color;
for (int x = count; x <= NUM_PIXELS ; x++) {
old_val[x - 1] = dimColor(old_val[x - 1], width);
strip.setPixelColor(x + 1, old_val[x + 1]);
}
strip.show();
delay(speed);
}
}
}

void clearStrip() {
for ( int i = 0; i < NUM_PIXELS; i++) {
strip.setPixelColor(i, 0x000000); strip.show();
}
}

uint32_t dimColor(uint32_t color, uint8_t width) {
return (((color & 0xFF0000) / width) & 0xFF0000) + (((color & 0x00FF00) / width) & 0x00FF00) + (((color & 0x0000FF) / width) & 0x0000FF);
}
как мне его добавить в мой проект ,прикрутить в скетч чтоб именно так аварийка работала
может там чего лишнего? или может вывести 1 пин на доп кнопку чтоб такой ефект получить
 
Последнее редактирование:

Nick

✩✩✩✩✩✩✩
1 Авг 2018
28
8
Скетч Knight Rider
Там пиксель бегает туда сюда за ним шлейф из более тусклых пиксельей и это всё меняет цвет.
Так выглядит оригинал из сериала с него и берут эту идею.
В сериале машина ещё разговаривать умеет:D
 
  • Лойс +1
Реакции: vikn72