ARDUINO Управление 14-ю штуками ин-14

Alex_B

✩✩✩✩✩✩✩
9 Мар 2020
74
5
Приветствую! Очень доступный проект, все получилось с ин-12Б, ин-14, спасибо автору. Единственное что поменял - место неонки подключил точку на ИН-12Б. А написать собственно меня заставило вот что - есть некий проект где нужно управлять аж 14-ю штуками ин-14 разделенными на группы по 2, 3, 4 и 5 штук. Вопрос воот в чем можно ли масштабировать данный проект для управления таким количеством индикаторов? Поскольку я только начинаю начать работать с ардуино, пока не могу понять, хватит ли портов для данной задачи у nano 3.0. И сколько к155ИД1 может понадобиться (штуки 4?). И вообще будет ли работать динамическая индикация? Модуль питания ламп будет использоваться готовый с али, 14 штук потащит. Коротко девайс - это некие специализированные часы, у которых обычная индикация времени - второстепенная функция, основной режим - отображение некого 14-ти значного числа, зависящего от текущей даты, считай таймер. Никаких дополнительных функций кроме антиотравления не будет.
 

Alex_B

✩✩✩✩✩✩✩
9 Мар 2020
74
5
Спасибо модератору за перемещение темы в правильный раздел.
Еще раз формулировка вопроса, уважаемому сообществу:

Имеется проект, где нужно управлять аж 14-ю штуками ин-14 разделенными на группы по 2, 3, 4 и 5 штук. Вопрос вот в чем можно ли масштабировать проект Часы на ГРИ v.2 на arduino NANO для управления таким количеством индикаторов? Поскольку я только начинаю начать работать с ардуино, пока не могу понять, хватит ли портов для данной задачи у nano v.3, сколько К155ИД1 может понадобиться (штуки 4?), в этом случае нужна какая-то дополнительная логика, как я понимаю? И вообще будет ли работать динамическая индикация с достаточной частотой (не видимое глазом мерцание), то есть хватит ли для этого производительности NANO v.3? Или использовать статическую индикацию? Ограничений по размеру платы и числу компонентов не накладывается, хочется сделать "малой кровью" с точки зрения разработки. Модуль питания ламп будет использоваться готовый с али, 14 штук потащит. Коротко, девайс - это некие специализированные часы, у которых обычная индикация времени - второстепенная функция, основной режим - отображение некого 14-ти значного числа, зависящего от текущей даты, считай таймер. По нажатию кнопки на 10 секунд показывается текущее время, потом возврат к таймеру. Никаких дополнительных функций кроме антиотравления и однотонной подсветки с регулировкой ее яркости - не будет.
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
148
сколько К155ИД1 может понадобиться
вот базовая схема включения https://itworkclub.ru/arduino-часы-на-газоразрядных-индикаторах/
хватит ли портов для данной задачи у nano v.3,
нет, но ты можеш расширить их при помощи регистров 74595, которые будут управлять светодиодами оптопар

лучше всего сделать на каждый индикатор по п латке с оптопарой, т.к. платы одинаковые будут, то это будет дешевле
а регистр поставиш на основной плате
ну и надо будет код малость допилить
 
  • Лойс +1
Реакции: Alex_B

Alex_B

✩✩✩✩✩✩✩
9 Мар 2020
74
5
вот базовая схема включения https://itworkclub.ru/arduino-часы-на-газоразрядных-индикаторах/

нет, но ты можеш расширить их при помощи регистров 74595, которые будут управлять светодиодами оптопар

лучше всего сделать на каждый индикатор по п латке с оптопарой, т.к. платы одинаковые будут, то это будет дешевле
а регистр поставиш на основной плате
ну и надо будет код малость допилить
Спасибо за ответ!
Правильно ли я понимаю:
К портам ардуино по определённой схеме я подключаю N-е количество регистров 74595 что-бы получить расширение портов для требуемого количества дешифраторов? Тут вопрос еще вот в чем, а сколько дешифраторов нужно для 14 индикаторов? Кто-то делает один на 3, 4 и даже 6 индикаторов... для меня их количество не проблема... но хотелось бы ближе к оптимуму. Платка с оптопарой для каждой лампы - хорошая идея.
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
148
что-бы получить расширение портов для требуемого количества дешифраторов?
как раз таки дешифратор там один нужен, у него же все индикаторы висят на нем

на регистры надо вешать только светодиоды оптопар
но хотелось бы ближе к оптимуму.
оптимум это 1, т.к. там динамическая индикация и в один момент времени горит только один индикатор
если ты увеличиваеш количество индикаторов, то надо увеличить частоту переключения исходят из 50гц на каждый индикатор
т.е. если 6 индикаторов, то частота 50 х 6 = 300гц или сколько там это милисекунд

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

так что оптимально при большом количестве индикаторов использовать динамическую индикацию с одним дешифратором и если поставиш 2 регистра, то сможеш оприходовать 16 индикаторов

ну еще может 1 регистр на точки из светодиодов, если они тебе нужны вообще, вроде в этих индикаторах точек нет
 
  • Лойс +1
Реакции: Alex_B

Alex_B

✩✩✩✩✩✩✩
9 Мар 2020
74
5
@kalobyte,

Да, смысл вроде понятен:

1. Один дешифратор на все 14 индикаторов подключенных параллельно к соответствующим катодам (как в схеме по ссылке выше).
2. Два регистра дают в сумме 16 выходов, чего достаточно для управления 14-ю индикаторами поочередно через оптопару (отдельную для каждого индикатора) подключая анод каждого индикатора.
3. Получаем 50x14 = 700 Гц ~ 1,4285... милисекунд.

Точки есть в ИН-14, но я не планирую их задействовать.

Осталось разобраться с самими регистрами как подключать и что на них подавать...
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
148
регистры 74595, копеечные и в ардуине есть даже готовая функция
https://www.arduino.cc/reference/en/language/functions/advanced-io/shiftout/
или использовать аппаратный спи, но тогда там будет другая функция уже, но работать будет быстрее, хотя в данном случае это роли не играет

подается туда 16 битное число, в двоичном виде оно выглядит всегда как одна единица и эта единица двигается при каждом вызове функции отправки числа в регистр
т.е. тебе надо зажигать в один момент времени только один индикатор, и для этого в этой переменной 16 битной будет только одна единица (если смотреть в двоичном виде)
для побитного сдвига есть операторы >> <<

читай про динамическую индикацию и смотри примеры кода
 
  • Лойс +1
Реакции: Alex_B

Alex_B

✩✩✩✩✩✩✩
9 Мар 2020
74
5
Спасибо за подробные и доступные ответы, сэкономил мне массу времени!
 

Alex_B

✩✩✩✩✩✩✩
9 Мар 2020
74
5
Привет всем! Продолжение темы.

На макетке собрал схему, подключил регистры и дешифратор, научился по линейке из 14-ти светодиодов, подключенных к выходам 2х регистров пускать бегущий огонь и управлять выходами дешифратора на примере светодиодов. Подключил один индикатор через оптопару, как на схеме часов. Далее взял за основу скетч теста индикаторов nixieClock_2_test_v1.1 от Алекса Гайвера. Модифицировал, получилось перебирать цифры 0-9. Все хорошо, есть все 14 цифр перебирают синхронно одну и ту же последовательность. Но если перед текущим индикатором (в последовательности перебора анодов) просто включить другую цифру, но она будет фантомно отображаться на текущем инфикаторе. Перебирая значения параметров я добился минимальной яркости фантома, но он есть и виден. Как я понимаю это связано с быстродействием оптопары. Как можно побороться с этим эффектом? На текущий момент скетч выглядит так:

#define pinC 7 // управление регистрами
#define pinD 5 // управление регистрами
#define pinS 6 // управление регистрами

#define DECODER0 A2 // управление дешифратором
#define DECODER1 A3 // управление дешифратором
#define DECODER2 A4 // управление дешифратором
#define DECODER3 A5 // управление дешифратором

// распиновка ламп

byte digitMask[] = {8, 3, 2, 7, 6, 4, 5, 1, 9, 0}; // маска дешифратора платы in14

word opt[] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192}; //Для регистров


#include "GyverHacks.h"

volatile byte indiDimm[14]; // величина диммирования (0-24)
volatile byte indiCounter[14]; // счётчик каждого индикатора (0-24)
volatile byte indiDigits[14]; // цифры, которые должны показать индикаторы (0-10)
volatile byte curIndi; // текущий индикатор (0-3) 0-13


void setDig(byte digit) {
digit = digitMask[digit];
setPin(DECODER3, bitRead(digit, 0));
setPin(DECODER1, bitRead(digit, 1));
setPin(DECODER0, bitRead(digit, 2));
setPin(DECODER2, bitRead(digit, 3));
}

void setup() {
Serial.begin(9600);

// настройка пинов на выход
pinMode(DECODER0, OUTPUT);
pinMode(DECODER1, OUTPUT);
pinMode(DECODER2, OUTPUT);
pinMode(DECODER3, OUTPUT);
pinMode (pinC, OUTPUT);
pinMode (pinD, OUTPUT);
pinMode (pinS, OUTPUT);


// перенастраиваем частоту ШИМ на пинах 3 и 11 на 7.8 кГц и разрешаем прерывания по совпадению
TCCR2B = (TCCR2B & B11111000) | 1; // делитель 8
TCCR2A |= (1 << WGM21); // включить CTC режим для COMPA
TIMSK2 |= (1 << OCIE2A); // включить прерывания по совпадению COMPA

// яркость индикаторов (0 - 24)
indiDimm[0] = 24;
indiDimm[1] = 24;
indiDimm[2] = 24;
indiDimm[3] = 24;
indiDimm[4] = 24;
indiDimm[5] = 24;
indiDimm[6] = 24;
indiDimm[7] = 24;
indiDimm[8] = 24;
indiDimm[9] = 24;
indiDimm[10] = 24;
indiDimm[11] = 24;
indiDimm[12] = 24;
indiDimm[13] = 24;
}

void loop() {
// тупо перебираем числа от 0 до 1
for (byte i = 0; i < 10; i++) {
indiDigits[0] = 6; // Установлено фиксированное число
indiDigits[1] = i; // Подключен этот индикатор
indiDigits[2] = i;
indiDigits[3] = i;
indiDigits[4] = i;
indiDigits[5] = i;
indiDigits[6] = i;
indiDigits[7] = i;
indiDigits[8] = i;
indiDigits[9] = i;
indiDigits[10] = i;
indiDigits[11] = i;
indiDigits[12] = i;
indiDigits[13] = i;
delay(1000);
}

}

// динамическая индикация в прерывании таймера 2
ISR(TIMER2_COMPA_vect) {

indiCounter[curIndi]++; // счётчик индикатора
if (indiCounter[curIndi] == indiDimm[curIndi]) // если достигли порога диммирования

//Отключаем аноды
{
setPin(pinS, LOW);
shiftOut(pinD, pinC, MSBFIRST, 0>>8);
shiftOut(pinD, pinC, MSBFIRST, 0);
setPin(pinS, HIGH);
}

if (indiCounter[curIndi] > 2) { // достигли порога в 25 единиц
indiCounter[curIndi] = 0; // сброс счетчика лампы
if (++curIndi >= 14) curIndi = 0; // смена лампы закольцованная
{
// отправить цифру из массива indiDigits согласно типу лампы
byte thisDig = digitMask[indiDigits[curIndi]];
setPin(DECODER3, bitRead(thisDig, 0));
setPin(DECODER1, bitRead(thisDig, 1));
setPin(DECODER0, bitRead(thisDig, 2));
setPin(DECODER2, bitRead(thisDig, 3));

// Еще раз отключаем аноды (метод тыка... )
setPin(pinS, LOW);
shiftOut(pinD, pinC, MSBFIRST, 0>>8);
shiftOut(pinD, pinC, MSBFIRST, 0);
setPin(pinS, HIGH);


// включить анод на текущую лампу
setPin(pinS, LOW);
shiftOut(pinD, pinC, MSBFIRST, opt[curIndi]>>8);
shiftOut(pinD, pinC, MSBFIRST, opt[curIndi]);
setPin(pinS, HIGH);
}
}
}

Буду благодарен за любую помощь.