Arduino Nano самопроизвольно перестает работать и отключается от компьютера

serial arduino-nano led-matrix

Я пытаюсь реализовать игру Arkanoid на матрице RGB 16x16 (библиотека Adafruit_NeoMatrix). Блоки представляют собой квадраты 2x2, и есть 3 ряда по 8 блоков в каждом. Текущее состояние игры (какие из блоков все еще присутствуют) хранится в массиве 8x3 int с именем blocks. 0 означает отсутствие блока, а 1–3 означают блок определенного цвета (цвет выбирается случайным образом при настройке).

Вот функция, которую я использую для рендеринга блоков (SIZE_X равен 16, BLOC KS_HEIGHT равен 3, а matrix — это экземпляр Adafruit_NeoMatrix, используемый для управления матрицей):

int blocks[BLOCKS_HEIGHT][SIZE_X / 2] = {
  { 1, 1, 1, 1, 1, 1, 1, 1 },
  { 2, 2, 2, 2, 2, 2, 2, 2 },
  { 3, 3, 3, 3, 3, 3, 3, 3 }
};

void renderBlocks() {
  Serial.println("renderBlocks");

  for (int i = 0; i < SIZE_X / 2; i++) {
    for (int j = 0; j < BLOCKS_HEIGHT; j++) {
      if (blocks[j][i] > 0) {
        uint16_t color;
        
        switch (blocks[j][i]) {
          case 1:
            color = matrix.Color(200, 0, 0);
            break;
          case 2:
            color = matrix.Color(0, 200, 0);
            break;
          case 3:
            color = matrix.Color(0, 0, 200);
            break;
        }

        matrix.drawPixel(i * 2, j * 2, color);
        matrix.drawPixel(i * 2 + 1, j * 2, color);
        matrix.drawPixel(i * 2, j * 2 + 1, color);
        matrix.drawPixel(i * 2 + 1, j * 2 + 1, color);
      }
    }
  }

  matrix.show();
}

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

Вот что отображается в последовательном мониторе:

Последовательный монитор

Когда я подключаю Arduino, он ждет некоторое время, затем показывает это на матрице, печатает "rend" и отключается. (Похоже, он не заканчивает выполнение Serial.println("renderBlocks") в начале моей функции.) Обратите внимание, что блоки отображаются в неправильном порядке: зеленый, затем красный, затем синий, хотя жестко закодированный массив означает красный, зеленый, синий. Также обратите внимание, что синие блоки мигают (это более заметно, чем на видео). Я прошу объяснить все эти странные вещи.

Arduino, похоже, не завис (все остальное, что я в него загружаю, работает). Матрица тоже работает правильно (в других скетчах, работающих с ней, ничего странного не происходит).

Ниже представлен цикл:

void loop() {
  if (millis() - lastRenderTime >= 1000) {
    lastRenderTime = millis();
    renderBlocks();
  }
}

Я не могу использовать delay, потому что в реальной игре мне придется слушать кнопки управления. И я не забыл сделать Serial.begin(9600) при настройке.

ПРАВКА: Arduino не выключается полностью (светодиод питания горит), он просто отключается.

ПРАВКА №2: lastRenderTime — это unsigned long.

, 👍0

Обсуждение

Я думаю, что вашего блока питания недостаточно для всей вашей установки., @tepalia

@tepalia Источником питания является мой компьютер, и этого достаточно для Arduino + матрица, так как другие скетчи, связанные с матрицей, работают., @SNBS

какой тип данных имеет lastRenderTime?, @Juraj

@Juraj беззнаковый длинный, @SNBS

пожалуйста, не публикуйте изображение текста... публикуйте текст вместо этого... вы скопировали и вставили код, сделайте то же самое с последовательным монитором, @jsotola

@jsotola Есть ли какой-нибудь текст, кроме «разрывать»?, @SNBS

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

@jsotola *"Когда я подключаю Arduino, он ждет некоторое время, затем показывает это на матрице, печатает "rend" и отключается."* — картина была полностью описана в тексте., @SNBS

подключено ли что-то к контактам D0 или D1?, @Juraj

@Juraj Нет, они бесплатные., @SNBS

Честно говоря, это действительно похоже на проблему с питанием. Вы питаете проект через USB? Сколько светодиодов горит одновременно (каждый NeoPixel на самом деле представляет собой 3 светодиода, по одному на цвет)? Похоже, у вас будет 3x8=24 блока по 4 пикселя в каждом, что составляет 96 пикселей, каждый пиксель будет иметь один цвет немного ниже полной яркости. Так что, скажем, 15 мА на пиксель означает 1,44 А, потребляемые матрицей. Это немного много для USB-порта ПК (без согласования более высокой выходной мощности с USB-контроллером)., @chrisl

@chrisl Я реализовал анимацию огня на этой матрице, которая заняла то же место, и она хорошо работала., @SNBS

Извините, но "анимация огня" - очень размытая информация. Для этой темы нам нужно поговорить о текущих значениях. Вы можете это проверить: используйте встроенное мигание светодиода в настройках (чтобы увидеть сброс микроконтроллера) и включите проект с помощью зарядного устройства USB (номиналом не менее 2 А). В противном случае я бы попытался найти точное место, где он сбрасывается, показывая светодиоды на каждой итерации внутреннего цикла и добавляя задержку, чтобы вы могли визуально увидеть, в каком блоке происходит сброс, @chrisl

Под «Arduino Nano» вы подразумеваете одну из оригинальных плат на базе ATmega168/328P, а не другую из множества других плат, которые сейчас носят это название?, @timemage

@timemage ATmega 328P старый загрузчик, @SNBS

Сколько пикселей включается в вашей "анимации огня" одновременно? Сравните это с количеством пикселей, включаемых в игре. (Пожалуйста, [отредактируйте] свой вопрос, чтобы добавить такие пояснения. Дополнительный материал трудно найти в комментариях, но его легко просмотреть.), @the busybee

@chrisl Моя матрица поддерживает дополнительный блок питания. Попробую подключить, но не сегодня, @SNBS

Я думаю, вам нужно пересмотреть функцию renderBlocks, добавив дополнительные отладочные операторы и проверки мощности., @tepalia

Проблема была решена подключением дополнительного блока питания. Спасибо всем, кто принял участие!, @SNBS


1 ответ


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

1

Если вы не разместите схему или изображение аппаратной установки, я предполагаю, что питание светодиодной матрицы поступает от Arduino или порта USB. Почти всегда Arduino сбрасывается в середине такой операции, это происходит из-за падения напряжения или короткого замыкания. Если у вас есть осциллограф, вы можете контролировать входное напряжение Arduino. Я подозреваю, что питание падает слишком сильно. Попробуйте запитать матрицу от ее собственного блока питания и соедините GND блока питания и usb/arduino вместе, чтобы создать общее заземление.

,

Да, я уже решил эту проблему таким образом., @SNBS