ATMEGA2560 умер внутри схемы аркадной игры

Я создаю аркадную игру с 10 кнопками игрока (по 5 для каждого игрока) и одной кнопкой запуска. Все кнопки имеют встроенный светодиод внутри. Кнопки проигрывателя имеют светодиод на 12 В, а кнопка запуска — на 5 В. Я использую кабана ATMEGA2560 pro. У меня также есть 4 дисплея TM1637 (по два для каждого игрока), показывающие время и счет. Я использую адаптер 12 В. Это моя схема:

schematics

Это тестовый код, который у меня был:

#include <Arduino.h>
#include <TM1637Display.h>

#define BTN_A1_PIN 16
#define BTN_A2_PIN 18
#define BTN_A3_PIN 28
#define BTN_A4_PIN 26
#define BTN_A5_PIN 47

#define BTN_B1_PIN 44
#define BTN_B2_PIN 36
#define BTN_B3_PIN 39
#define BTN_B4_PIN 46
#define BTN_B5_PIN 37

#define LED_A1_PIN 13
#define LED_A2_PIN 17
#define LED_A3_PIN 11
#define LED_A4_PIN 15
#define LED_A5_PIN 19

#define LED_B1_PIN 25
#define LED_B2_PIN 27
#define LED_B3_PIN 23
#define LED_B4_PIN 21
#define LED_B5_PIN 29

#define BTN_START_PIN 32
#define LED_START_PIN 35

#define DISPLAY_A_SCORE_CLK 20
#define DISPLAY_A_SCORE_DIO 10

#define DISPLAY_A_TIME_CLK 40
#define DISPLAY_A_TIME_DIO 43

#define DISPLAY_B_SCORE_CLK 42
#define DISPLAY_B_SCORE_DIO 33

#define DISPLAY_B_TIME_CLK 34
#define DISPLAY_B_TIME_DIO 38

typedef struct
{
  uint8_t btnIn;
  uint8_t ledOut;
} btn_t;

btn_t btn[] = {
    {
        .btnIn = BTN_A1_PIN,
        .ledOut = LED_A1_PIN,
    },
    {
        .btnIn = BTN_A2_PIN,
        .ledOut = LED_A2_PIN,
    },
    {
        .btnIn = BTN_A3_PIN,
        .ledOut = LED_A3_PIN,
    },
    {
        .btnIn = BTN_A4_PIN,
        .ledOut = LED_A4_PIN,
    },
    {
        .btnIn = BTN_A5_PIN,
        .ledOut = LED_A5_PIN,
    },
    {
        .btnIn = BTN_B1_PIN,
        .ledOut = LED_B1_PIN,
    },
    {
        .btnIn = BTN_B2_PIN,
        .ledOut = LED_B2_PIN,
    },
    {
        .btnIn = BTN_B3_PIN,
        .ledOut = LED_B3_PIN,
    },
    {
        .btnIn = BTN_B4_PIN,
        .ledOut = LED_B4_PIN,
    },
    {
        .btnIn = BTN_B5_PIN,
        .ledOut = LED_B5_PIN,
    },
    {
        .btnIn = BTN_START_PIN,
        .ledOut = LED_START_PIN,
    },
};

TM1637Display displayAScore(DISPLAY_A_SCORE_CLK, DISPLAY_A_SCORE_DIO);
TM1637Display displayATime(DISPLAY_A_TIME_CLK, DISPLAY_A_TIME_DIO);
TM1637Display displayBScore(DISPLAY_B_SCORE_CLK, DISPLAY_B_SCORE_DIO);
TM1637Display displayBTime(DISPLAY_B_TIME_CLK, DISPLAY_B_TIME_DIO);

void setup()
{
  for (int i = 0; i < 11; i++)
  {
    pinMode(btn[i].btnIn, INPUT_PULLUP);
    pinMode(btn[i].ledOut, OUTPUT);
  }
  displayAScore.setBrightness(0x0f);
  displayATime.setBrightness(0x0f);
  displayBScore.setBrightness(0x0f);
  displayBTime.setBrightness(0x0f);

  displayAScore.showNumberDec(1111, false);
  displayATime.showNumberDec(2222, false);
  displayBScore.showNumberDec(3333, false);
  displayBTime.showNumberDec(4444, false);
}

void loop()
{
  for (size_t i = 0; i < 11; i++)
  {
    if(0 == digitalRead(btn[i].btnIn))
    {
      digitalWrite(btn[i].ledOut, HIGH);
    }
    else
    {
      digitalWrite(btn[i].ledOut, LOW);
    }
  }
}

А вот как это выглядит внутри:

аркадный ящик внутри

передняя часть аркадной коробки

Проблема в том, что ATMEGA2560 только что сгорел. Сначала я тестировал его без TM1637 (они были подключены к питанию, но в то время я не использовал для них lib), и все работало нормально (кнопки загорались при нажатии).

Затем я добавил в код библиотеку для TM1637 и в течение 2 секунд видел "1111" «2222»; ... итак как в коде, чтобы не было плохого соединения. Но через 2 секунды начал гудеть (видимо сработала температурная защита линейного регулятора) и ATMEGA просто сгорела.

Теперь, когда я подключаю 12 В, MCU довольно быстро нагревается. Я могу измерить напряжение 5 В на линейном регуляторе, чтобы он не был закорочен. Я всегда подключал только 12В и никакого питания от USB. Я знаю, что мои провода не самые короткие, но я бы не ожидал, что MCU выйдет из строя. Не могли бы вы помочь, пожалуйста? Я не хочу вставлять следующую фишку в 20 евро только для того, чтобы увидеть еще один дорогой дым.

, 👍2

Обсуждение

либо что-то неправильно подключено, либо компонент не тот, что вы думаете... возможно, кнопки имеют внутреннюю связь между переключателем и светодиодным индикатором, @jsotola

@jsotola спасибо за ответ. Я дважды проверил каждое соединение, и оно было правильным. Нет, кнопки не связаны со светодиодами, @andz

Контакт 5 В на плате, вероятно, не является подходящим местом для подачи питания на дисплеи. Я уверен, что это больше, чем он может дать. В идеале у них должен быть собственный источник питания., @Delta_G


1 ответ


Лучший ответ:

1

Вы поджарили его, потому что нарушили правило №1: «Ардуино НЕ является источником питания!». Ваши дисплеи сами по себе могут вытянуть 320 мА. Это более 2 Вт мощности, прежде всего. Когда вы купите новый, купите понижающий преобразователь и запитайте светодиоды от него с выходным напряжением 5 В, а для питания используйте 12 В. Насколько я понимаю, рекомендуемая максимальная рассеиваемая мощность регулятора Mega составляет 1 Вт. Таким образом, при подаче на стабилизатор 12 В максимальный ток составляет около 140 мА (1 Вт / (12 В – 5 В)). Это не считая ваших светодиодов.

,

Я рассчитывал на схему защиты регулятора, у этих линейных она есть. Но странно, почему ATMEGA сгорела, а регулятор выдает 5В. Я использовал отдельное питание для ATMEGA и дисплеев, и теперь оно работает. Спасибо за ответ., @andz