Что сделать, чтобы увеличить количество светодиодов, которые можно запитать с помощью pro micro?

Я новичок в arduino, и у меня есть sparkfun pro micro, который я использую для питания полосы APA 102 длиной один метр (60 пикселей). В настоящее время я питаю его через USB, и у меня есть программа, которая отправляет ему инструкции по освещению. Кажется, я могу использовать только ~ 15 пикселей с полным диапазоном яркости и ~ 30, если я поддерживаю яркость примерно наполовину.

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

Прав ли я в этом предположении? и если да, то что я могу сделать, чтобы увеличить количество пикселей, которые я могу включить на полном диапазоне?

Я также опубликую свой код ниже на случай, если я смогу что-то сделать, чтобы увеличить количество пикселей:

#include <Adafruit_DotStar.h>
#include <SPI.h>

#define NUMPIXELS 60
#define DATAPIN    4
#define CLOCKPIN   5

Adafruit_DotStar strip(NUMPIXELS, DOTSTAR_BRG);

// Переменные
int mode;
int numColors;
int fadeSpeed;
int BBCC;
int R;
int G;
int B;
int Bright;

void setup() {

#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000L)
  clock_prescale_set(clock_div_1); // Включить 16 МГц на Trinket
#endif

  strip.begin(); // Инициализируем выводы для вывода
  strip.show();  // Выключить все светодиоды как можно скорее
}

int      head  = 0, tail = -10; // Индекс первых «включенных» и «выключенных» пикселей
uint32_t color = 0xFFFFFF;      // Цвет «Вкл.» (начинает с красного)

void loop() {

  //strip.setPixelColor(голова, цвет); // 'Включенный' пиксель в голове
  //strip.setPixelColor(хвост, 0); // пиксель 'Off' в хвосте
  strip.show();                     // Обновить полосу
  delay(20);                        // Пауза 20 миллисекунд (~50 FPS)

  getData();

  if (mode == 1)
  {
    for (int i = 0; i < (60); i++)
    {
      if (i % 2 == 0)
        strip.setPixelColor(i, G, R, B);
    }
    strip.setBrightness(Bright);
    strip.show();
  }
  else
  {
    for (int i = 0; i < (60); i++)
    {
      if (i % 2 == 0)
        strip.setPixelColor(i, 150, 200, 40);
    }
    strip.setBrightness(255);
    strip.show();
  }
}

int readLine(int readch, char * buffer, int len)
{
  static int pos = 0;
  int rpos;

  if (readch > 0)
  {
    switch(readch)
    {
      case '\r':
      {
        break;
      }
      case '\n':
      {
        rpos = pos;
        pos = 0;
        return rpos;
      }
      default:
      {
        if (pos < len-1) 
        {
          buffer[pos++] = readch;
          buffer[pos] = 0;
        }
      }
  }

  return 0;
}
}

void getData()
{
  char buf[80];
  bool redo = true;

  if(readLine(Serial.read(), buf, 80) > 0)
  {
    int i = 0;
    int j = 0;
    bool skip = false;
    char fin[3];
    if (skip == false)
    {
    do// режим
    {
      switch (buf[i])
      {
        case '\n':
        {
          skip = true;
          redo = false;
          break;
        }
        case '|':
        {
          mode = atoi(fin);
          //Serial.print(режим);
          i++;
          redo = false;
          break;
        }
        default:
        {
          fin[j] = buf[i];
          i++;
          break;
        }
      }
      j++;
    }while(redo);
    redo = true;
    j = 0;
    }



    if (skip == false)
    {
    do// количество цветов
    {
      switch (buf[i])
      {
        case '\n':
        {
          skip = true;
          redo = false;
          break;
        }
        case '|':
        {
          numColors = atoi(fin);
          //Serial.print(numColors);
          i++;
          redo = false;
          break;
        }
        default:
        {
          fin[j] = buf[i];
          i++;
          break;
        }
      }
      j++;
    }while(redo);
    redo = true;
    j = 0;
    }



    if (skip == false)
    {
    do//
    {
      switch (buf[i])
      {
        case '\n':
        {
          skip = true;
          redo = false;
          break;
        }
        case '|':
        {
          fadeSpeed = atoi(fin);
          //Serial.print(fadeSpeed);
          i++;
          redo = false;
          break;
        }
        default:
        {
          fin[j] = buf[i];
          i++;
          break;
        }
      }
      j++;
    }while(redo);
    redo = true;
    j = 0;
    }



    if (skip == false)
    {
    do
    {
      switch (buf[i])
      {
        case '\n':
        {
          skip = true;
          redo = false;
          break;
        }
        case '|':
        {
          BBCC = atoi(fin);
          //Serial.print(BBCC);
          i++;
          redo = false;
          break;
        }
        default:
        {
          fin[j] = buf[i];
          i++;
          break;
        }
      }
      j++;
    }while(redo);
    redo = true;
    j = 0;
    }



    if (skip == false)
    {
    do
    {
      switch (buf[i])
      {
        case '\n':
        {
          skip = true;
          redo = false;
          break;
        }
        case '|':
        {
          R = atoi(fin);
          //Серийный.принт(R);
          i++;
          redo = false;
          break;
        }
        default:
        {
          fin[j] = buf[i];
          i++;
          break;
        }
      }
      j++;
    }while(redo);
    redo = true;
    j = 0;
    }



    if (skip == false)
    {
    do
    {
      switch (buf[i])
      {
        case '\n':
        {
          skip = true;
          redo = false;
          break;
        }
        case '|':
        {
          G = atoi(fin);
          //Серийный.print(G);
          i++;
          redo = false;
          break;
        }
        default:
        {
          fin[j] = buf[i];
          i++;
          break;
        }
      }
      j++;
    }while(redo);
    redo = true;
    j = 0;
    }



    if (skip == false)
    {
    do
    {
      switch (buf[i])
      {
        case '\n':
        {
          skip = true;
          redo = false;
          break;
        }
        case '|':
        {
          B = atoi(fin);
          //Серийный.print(B);
          i++;
          redo = false;
          break;
        }
        default:
        {
          fin[j] = buf[i];
          i++;
          break;
        }
      }
      j++;
    }while(redo);
    redo = true;
    j = 0;
    }



    if (skip == false)
    {
    do
    {
      switch (buf[i])
      {
        case '\n':
        {
          Bright = atoi(fin);
          //Serial.println(яркий);
          i++;
          redo = false;
          break;
        }
        default:
        {
          fin[j] = buf[i];
          i++;
          break;
        }
      }
      j++;
    }while(redo);
    redo = true;
    j = 0;
    }
  }
}

, 👍3


3 ответа


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

4

Как уже упоминал Маженко, используйте отдельный блок питания.

  • Используйте эту мощность для питания светодиодных лент.
  • Используйте MCU для управления линиями данных и синхронизации.
  • Соедините земли вместе.
,

КВМ? Я действительно новичок, поэтому я не знаю, что это такое. Я использую выводы SCK и MISO. Это то же самое?, @BoatHouse

MCU — это блок микроконтроллера, ваш Arduino — это один (пример) MCU. SCK — это линия синхронизации (Serial Clock), а MISO (Master In Slave Out) — линии данных. Если вы погуглите SPI, вы узнаете, для чего предназначены SCK и MISO., @Michel Keijzers


2

Прав ли я в этом предположении?

Ага.

и если да, что я могу сделать, чтобы увеличить количество пикселей, которые я могу включить на полном диапазоне?

Просто: не питайте его от Arduino. Добавьте подходящий внешний источник питания, способный обеспечить требуемый ток.

,

3

Управление бюджетом электроэнергии — обычная часть проектов в области электроники. Вы можете потреблять только около 500 мА от USB-порта и меньше, чем от линии 5 В, если ваш Arduino питается от USB. Если вы подключите Arduino с напряжением ≈7 В к цилиндрическому разъему, вы, возможно, сможете получить полный ампер от шины 5 В, но это зависит от того, насколько сильно нагревается регулятор напряжения. Чем выше входное напряжение регулятора, тем больше тепла вы выделяете при заданном токе. На оригинальной плате Arduino регулятор напряжения должен иметь схему защиты от перегрева, которая отключит его, когда станет слишком жарко. Дешевые подделки могут просто сгореть.

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

,