STM32 Интерактивная шахматная доска.

alexlaw

✩✩✩✩✩✩✩
3 Янв 2020
93
2
Воронеж
Посоветуйте, как и где можно заказать плату, исходя из сегодняшних реалий.
 

alexlaw

✩✩✩✩✩✩✩
3 Янв 2020
93
2
Воронеж
Есть ветка посвящённая этому
Да, я видел. Но не подхожу под условия заявленные там.
Плату заказал в Китае. Жду. Кому интересно могут продать излишки.
Там минимальный заказ 5 шт
Как бонус обсудим программные и производственные вопросы.
Мне бы хотелось найти единомышленника, довести до готового решения.
 

alexlaw

✩✩✩✩✩✩✩
3 Янв 2020
93
2
Воронеж
C Attiny работает не стабильно, stm через раз читает правильно
Вопрос закрыл.
У меня же на STM UART настроен - parity even.
C:
Control register 1 (USART_CR1)
Bit 10 PCE: Parity control   
0: Parity control disabled
1: Parity control enabled
Bit 9 PS: Parity selection
This bit selects the odd or even parity when the parity generation/detection is enabled (PCE
bit set). It is set and cleared by software. The parity will be selected after the current byte.
0: Even parity
1: Odd parity   

        USART1->CR1 |= USART_CR1_PCE;
        USART1->CR1 &=~ USART_CR1_PS;
Включил parity even на Attiny, и все заработало как по маслу.

C++:
Биты UPM1 и UPM0 (USART Parity Mode) в регистре UCSRC отвечают за включение и тип контроля чётности:
C:
//Если бит UMSEL сброшен в 0, то модуль работает в асинхронном режиме
 //USBS Количество стопбитов. Если бит сброшен в 0, то передатчик посылает 1 стопбит,
 //если установлен в 1, то 2 стопбита.
 //UCPOL  При работе в асинхронном режиме он должен быть сброшен в 0. USART Mode: Asynchronous
 //UPM1 UPM0 - Управление схемой контроля четности - 0 0 Выключена
 UCSRC &= ~((1 << UMSEL) | (1 << USBS) | (1 << UCPOL) | (1 << UPM1) | (1 << UPM0)); // Clear bit
 // Настройка формата кадра:
 // - Even parity (UPM1=1, UPM0=0)
 // - 8 бит данных (UCSZ1=1, UCSZ0=1)
 // - 1 стоп‑бит (USBS=0)
 UCSRC |= (1 << UPM1); // Set bits
 //Определение размера слова данных - 8 бит
 UCSRC |= (1 << UCSZ1) | (1 << UCSZ0); // Set bits
 UCSRA &= ~(1 << UCSZ2); // Clear bit
А была даже мысль тактировать Attiny от кварца, но под рукой не было -затактировал от MCO
C:
    //enable clock access to GPIOA
    RCC->APB2ENR|=RCC_APB2ENR_IOPAEN;
    //Enable clock access to alternate function
    RCC->APB2ENR|=RCC_APB2ENR_AFIOEN;
   //Настраиваем порт в режим альтернативной функции
  GPIOA->CRH &= ~(GPIO_CRH_MODE8_Msk | GPIO_CRH_CNF8_Msk); //Сбрасываем биты в ноль
  GPIOA->CRH |= (0x03 << GPIO_CRH_MODE8_Pos) | (0x02 << GPIO_CRH_CNF8_Pos); //устанавливаем нужные биты 
  RCC->CFGR &= ~(RCC_CFGR_MCO_Msk); //Сначала устанавливаем все в ноль
 //Настройка вывода тактового сигнала
//через MCO-пин
//sourse - источник тактирования
// 0 - отключено
// 4 - SYSCLK
// 5 - HSI
// 6 - HSE
// 7 - PLL/2
  RCC->CFGR |= (6<<RCC_CFGR_MCO_Pos); //Устанавливаем источник тактирования
Но как писал выше - собака зарыта в parity even.
В общем сейчас работает стабильно)))
 

alexlaw

✩✩✩✩✩✩✩
3 Янв 2020
93
2
Воронеж
Попробовал часть схемы с WIFI - работает.
IMG_20260809_123018.jpg2026-08-09_12-31-31.png
Конечно без небольших косячков не обошлось))
Я рассчитывал запитать плату от 12 в , оказалось это нельзя!
Я иcпользовал AMS1117-5.0 , а AMS-ка - 7в умножить на сколько-то ма, рассеивает ввиде тепла и на ней можно жарить котлеты.
Благо нашел блок питания на 6 в и все ОК.
Ну и с типо размером некоторых деталей пошел в разнос,одни такие другие такие.
Зато научился паять 0603.
В общем движется потихоньку))
 

alexlaw

✩✩✩✩✩✩✩
3 Янв 2020
93
2
Воронеж
MAX на плате работает, можно собирать светодиодную подсветку из отдельных светодиодов.
IMG_20260812_232247.jpg

8x8_led.png
 

alexlaw

✩✩✩✩✩✩✩
3 Янв 2020
93
2
Воронеж
Продвинулся в решении одного важного вопроса.
Ход считанный Attiny при помощи герконов может содержать ошибки как аппаратные, так и пользовательские.
Например:
Сработал не тот геркон, по разным причинам (пользователь низко пронес фигуру над доской или поставил фигуру не туда).
В результате на движок поступит нелегальный ход.
Движок такой ход не примет. Нужно будет заново сформировать ход откуда-куда. А при многочисленных нелегальных ходах -
это может привести к зависанию STM.
Что делать?
Сначала хотел добавить генератор ходов в Attiny, и ход будет передан от Тиньки на STM, если он корректен.
Примерно так работает прога на Виндовс, там нельзя сделать нелегальный ход.
Написал генератор ходов.
Но потом решил по другому.
Этот генератор добавлю в STM, он создаст список ходов и если поступивший от Тиньки ход будет в этом списке,то ход будет передан движку.
Если нет хода, то Stm дернет Тиньку за ногу - нужен правильный ход. Тинька будет ждать от датчиков новое поле - куда,не меняя поле - откуда.
Назрел еще один вопрос.
Одного светодиода для подсветки поля доски не достаточно. Нужно четыре на одно поле.
Как используя MAX7219 вместо одного светодиода поставить четыре?
Кто сможет помочь с расчетами токов и напряжений и схемы соединения?
 

Bruzzer

★★★★✩✩✩
23 Май 2020
835
260
Одного светодиода для подсветки поля доски не достаточно. Нужно четыре на одно поле.
Не понятно, как вы собираетесь размещать "четыре на одно поле". Если поставить светодиоды в углах клеток (на пересечении линий), то задача сведется к управлению матрицей 9 x 9, что невозможно сделать на одной MAX7219, но можно или на двух MAX7219, Или на трех сдвиговых регистрах. Так же влияет, сколько одновременно клеток может быть подсвечено, какие используются светодиоды и т.д.

Под спойлером ответ ИИ на вопрос "В DIY проекте Arduino UNO надо подсвечивать светодиодами выбранную в данный момент клетку шахматной доски. Если бы светодиоды стояли по центру клеток, то я бы использовал микросхему MAX7219. Но чтобы светодиоды были всегда видны, я расположил их в углах клеток, и получается матрица 9 * 9. В каждый момент времени подсвечивается не более одной клетки, т.е. активны только четыре светодиода по углам одной клетки. Если ли в этом случае более оптимальный способ для управления матрицей 9 * 9, чем использовать две микросхемы MAX7219? "
Вы абсолютно правы в своих сомнениях. Использование двух микросхем MAX7219 для вашей задачи — это избыточно, дорого и потребует лишнего места на плате. MAX7219 создан для непрерывного свечения всей матрицы, а у вас в любой момент времени горят только 4 светодиода (углы одной клетки).

У Arduino UNO (ATmega328P) есть 18 свободных цифровых/аналоговых пинов (D2–D13 и A0–A5). Для матрицы 9×9 вам нужно ровно 9 строк + 9 столбцов = 18 пинов. Это идеальное совпадение!

Главная проблема, которую нужно решить — это яркость. При динамической индикации (мультиплексировании) 9 строк каждый светодиод горит только 1/9 времени (скважность 9). Чтобы светодиод светился нормально (в среднем 5 мА), через него нужно пропускать импульсный ток около 45 мА. Выводы Arduino не могут безопасно выдавать более 20 мА на пин.

Ниже приведены 3 оптимальных способа решения этой задачи, от самого простого до самого профессионального.

---

### Вариант 1. «Золотая середина»: ULN2803 + PNP-транзисторы (Рекомендуется)
Это самый надежный способ, который позволяет использовать обычные светодиоды и давать им достаточный ток для яркого свечения даже при дневном свете.

Суть: Мы используем Arduino только для управления ключами, а ток берут напрямую от линии 5V.
  • Столбцы (Катоды, 9 шт.): Используем 2 микросхемы ULN2803A (в DIP корпусе). Это сборка дарлингтонских транзисторов, каждая микросхема имеет 7 каналов (итого 14, нам хватит 9). Они отлично работают как «сток» (sink) и выдерживают до 500 мА на канал.
  • Строки (Аноды, 9 шт.): Используем 9 обычных PNP-транзисторов (например, BC327, 2N3906 или КТ3107).
* Эмиттеры подключены к 5V.
* Коллекторы — к строкам матрицы.
* Базы — к пинам Arduino через резисторы 1 кОм.
* Важно: Так как в каждый момент времени сканируется только одна строка, только один пин Arduino будет открыт (сигнал LOW), и только один транзистор будет потреблять базовый ток (~4 мА). Это абсолютно безопасно для микроконтроллера.

Токоограничивающие резисторы: Ставятся на каждый из 9 столбцов (между ULN2803 и катодами светодиодов). Рассчитываются исходя из нужного импульсного тока (например, 40 мА). Для красного светодиода это будет примерно 68–82 Ом.

---

### Вариант 2. Прямое подключение (Только для сверхъярких светодиодов)
Если вы используете современные сверхъяркие светодиоды (яркостью от 1000 mcd и выше), им для комфортной видимости достаточно среднего тока всего 1–2 мА.
При скважности 9 это дает импульсный ток 9–18 мА, что вписывается в лимиты выводов Arduino (максимум 20 мА на пин).

Суть:
  • 9 пинов Arduino идут напрямую к строкам.
  • 9 пинов идут к столбцам через токоограничивающие резисторы.
  • Плюсы: Не нужно паять транзисторы и микросхемы, схема максимально простая.
  • Минусы: Если в комнату попадет яркий солнечный свет, индикация может казаться тускловатой. Придется очень внимательно следить, чтобы сумма токов на один PORT микроконтроллера (например, PORTD) не превышала 100 мА.

---

### Вариант 3. Сдвиговые регистры (Если не хватает пинов)
Если вам нужны пины Arduino UNO для других задач (экран, кнопки, датчики), вы можете управлять матрицей 9×9 всего через 3 пина (SPI: SCK, MOSI, CS/LATCH).

Суть:
  • Строки: Сдвиговой регистр 74HC595 (или два) управляет базами тех же 9 PNP-транзисторов.
  • Столбцы: Либо те же ULN2803, управляемые еще одним сдвиговым регистром, либо специализированные светодиодные драйверы, например, TLC59281 (16-канальный драйвер с контролем тока, их нужно 3 штуки на 48 каналов, они сами стабилизируют ток и не требуют резисторов).
  • Плюсы: Экономия 15 пинов Arduino.
  • Минусы: Чуть более сложный код и больше деталей на плате.

---

### Как это будет работать в коде (Логика)

Поскольку у вас горит только одна клетка, код будет элементарным. Вам не нужны сложные библиотеки.
Допустим, выбрана клетка с координатами cellX и cellY (от 0 до 7).
Ее углы — это пересечения (cellX, cellY), (cellX+1, cellY), (cellX, cellY+1), (cellX+1, cellY+1).

В цикле мультиплексирования (опрос строк от 0 до 8) логика будет такой:

C++:
for (int row = 0; row < 9; row++) {
    // 1. Гасим всё
    turnOffAllRows(); 
    turnOffAllCols();

    // 2. Проверяем, относится ли текущая строка к углам выбранной клетки
    if (row == cellY || row == cellY + 1) {
        // 3. Включаем нужные столбцы
        turnOnCol(cellX);
        turnOnCol(cellX + 1);
        
        // 4. Включаем текущую строку
        turnOnRow(row);
    }
    
    // 5. Задержка для мультиплексирования (около 2-3 мс на строку)
    delayMicroseconds(2000); 
}
### Резюме
Откажитесь от идеи с MAX7219.
1. Если хотите максимальной яркости и надежности — собирайте Вариант 1 (2 микросхемы ULN2803 + 9 транзисторов BC327 + 9 резисторов). Это выйдет дешевле и проще в разводке, чем два MAX7219.
2. Если хотите минимум деталей — берите Вариант 2, но обязательно купите сверхъяркие (Ultra Bright / High Efficiency) светодиоды.
 

alexlaw

✩✩✩✩✩✩✩
3 Янв 2020
93
2
Воронеж
Не понятно, как вы собираетесь размещать "четыре на одно поле".
Как то так
https://yandex.ru/video/preview/178...opy_link&utm_medium=social&utm_campaign=share
В каждый момент времени подсвечивается не более одной клетки
Нет, клетки подсвечиваются под фигурами, итого одновременно может светится 32 клетки.
Я попробовал собрал на макетке такую схему
Capture.PNG
Купил TD62783APG в чип и дип за 85 р
IMG_20260831_202332.jpg
Поставил 4 светодиода на 1 SEG для пробы, но яркости мало да и ИИ говорит

Схема рабочая по идее, но есть одна проблема, которая убьёт MAX7219. Давайте по порядку. Что получится правильно SEG → TBD62783 → 4 LED → DIG — полярность совпадает. TBD62783 (и старый TD62783, и новый TBD62783A) включается высоким уровнем на входе. MAX7219 SEG в активном состоянии выдаёт ток наружу — это подтягивает вход TBD62783 вверх, выход открывается и sourcing-ует 12 В на цепочку светодиодов. Когда SEG выключен (на MAX7219 он притянут к GND), вход TBD62783 — низкий, выход закрыт. Всё правильно. 12 В хватит для 4 красных/жёлтых светодиодов:. Для зелёных тоже работает. А вот синие/белые — уже не хватает, нужно минимум 15–16 В. R_SET больше не управляет током светодиодов — ток теперь задаёт внешний резистор. R_SET можно поставить 47 кОм, как рекомендует даташит для режима внешних драйверов. ШИМ-регулировка яркости (через регистр intensity) сохраняется — она управляет скважностью мультиплексирования, а не током. analog.com +1 Что убьёт MAX7219 DIG-пины увидят до ~10–11 В, а абсолютный максимум по даташиту — V+ + 0,3 В = 5,3 В. Вот почему: когда разряд выключен (DIG в высокоимпедансном состоянии), а SEG для другого разряда активен, на анодах LEDs этого выключенного разряда — 11 В с выхода TBD62783. Через LED-цепочку ток не течёт (DIG разомкнут), но катод (DIG-пин) плавает вверх к напряжению анода за вычетом падения на светодиодах при нулевом токе. На практике DIG-пин увидит 6–11 В — и MAX7219 выйдет из строя. Решение: внешний sink на DIG-стороне Нужно добавить ULN2803 (или TBD62083) на DIG-выходы, как показано в готовой схеме из Embedded Lab"
 

alexlaw

✩✩✩✩✩✩✩
3 Янв 2020
93
2
Воронеж
Ответ ИИ по окончательной схеме (с учетом имеющихся у меня деталей )
SEG → TBD62783 → токоограничвающие резиторы (R_огр 130 Ом, 0,25 Вт)→ 4 green LED → ULN2803 →(поддтяжка 10 кОм к V+) → ULN2803 →(поддтяжка 10 кОм к +5 В) → DIG

12В → TBD62783 → R_огр(130 Ом) → 4 green LED → ULN#1 → GND
↑ ↑
MAX7219 SEG (токовый sink)

MAX7219 DIG → 10кОм к V+ → ULN#2 вход
ULN#2 выход → 10кОм к +5В → ULN#1 вход
Логика работы
SEG-сторона: TBD62783 (source) подаёт +12 В напрямую — полярность совпадает с active-HIGH выходом MAX7219.
DIG-сторона: две ULN2803 подряд — двойная инверсия. DIG активен (LOW) → ULN#2 выключен → подтяжка открывает ULN#1 → разряд горит. DIG неактивен (HIGH-Z) → ULN#2 включён → тянет ULN#1 вход вниз → разряд погашен.
MAX7219 защищён: SEG и DIG нагружены только на логические входы, высокого напряжения не видят.

Детали на один канал
Элемент Номинал Назначение
R_огр 130 Ом, 0,25 Вт ограничение тока LED
R_pull1 10 кОм вход ULN#2 от DIG к V+
R_pull2 10 кОм между ULN#2 выход и ULN#1 вход к +5 В
TBD62783 1 канал source (SEG)
ULN2803 ×2 по 1 каналу двойная инверсия + sink (DIG)

Токоограничительные резисторы
Зелёные LED, 20 мА, питание 12 В: 130 Ом на канал. Можно поставить один до или после светодиодов — либоsplit на два по 68 Ом.
Если ток 10 мА (экономный режим): 270 Ом.
На 8 разрядов
Деталь Количество
TBD62783 1 сборка (8 каналов)
ULN2803 2 сборки (по 8 каналов)
R_огр 130 Ом 8 шт.
R_pull 10 кОм 16 шт.
 

alexlaw

✩✩✩✩✩✩✩
3 Янв 2020
93
2
Воронеж
IMG_20260902_204417.jpg
Собрал на макетке по это схеме.
В данном случае клетки a1,b1,c1 т.е. на одном DIG сейчас 12 светодиодов.
Надо через регистр intensity увеличить яркость, сейчас
C:
  void max7219_init() {
  write_reg(DISPLAY_TEST_REG, 0);
  write_reg(SCAN_LIMIT_REG, 7);
  write_reg(DECODE_MODE_REG, 0);
  write_reg(SHUTDOWN_REG, 1);
  clear();
}
Хотя ИИ противоречит сам себе
Если вы настраиваете яркость через внешний резистор RSET, подключённый между V+ и ISET, то значение по умолчанию будет определяться его номиналом
ШИМ-регулировка яркости (через регистр intensity) сохраняется — она управляет скважностью мультиплексирования, а не током.
PS
Помогло
IMG_20260902_214254.jpg
C:
void max7219_init() {
  write_reg(DISPLAY_TEST_REG, 0);
  write_reg(SCAN_LIMIT_REG, 7);
  write_reg(DECODE_MODE_REG, 0);
  write_reg(INTENSITY_REG, 15);
  write_reg(SHUTDOWN_REG, 1);
  clear();
}
 
Изменено: