Как выбрать аккумулятор для питания проекта Arduino Nano?

Мне было интересно, не захочет ли кто-нибудь научить меня, как логически выбирать/рассчитывать, какую батарею я должен/могу использовать для питания моего проекта Arduino nano (чтобы мне не пришлось хранить ее подключен к моему компьютеру, чтобы использовать его)? Я заинтересован в обучении, а не просто в том, чтобы получить ответ, потому что моя цель — понять это самостоятельно для моего следующего проекта. (Кроме того, я добился этого сам из-за большого количества проб и ошибок в дополнение к тому, что я прочитал как можно больше, но я не хочу покупать набор батарей для проб и процесса обучения.) Большое спасибо. .

Если вы хотите преподавать, я включил все подробности о моем проекте в приведенный ниже код, или, по крайней мере, я так думаю.

Прежде чем я перейду к своему коду, одна проблема (я думаю) заключается в том, что двухразрядный семисегментный светодиодный дисплей, который я купил для своего проекта, не имеет спецификации. Однако, даже если бы это было так, я не уверен, что понял бы, как им пользоваться. Я посмотрел на другие подобные светодиодные дисплеи, и если я понимаю, на что смотрю, они, кажется, используют от 2-3 В до 20-30 мА.

Я подумал, что, поскольку я видел 2-3 В на похожих светодиодных дисплеях, я смогу использовать 3-вольтовую батарею для питания моего проекта. Однако, когда я попробовал следующие две батареи для питания моего проекта, они не работали:

  1. Литиевая батарея CR2032 3 В (для LilyPad). Этой мощности было достаточно, чтобы приглушить индикатор питания нано, но недостаточно, чтобы включить свет в моем проекте.

  2. Батарея E-Textiles 3,7 В – 110 мА·ч (разрядка 2 C) — этого также было достаточно, чтобы тускло включить индикатор питания нано, но этого недостаточно, чтобы включить свет в моем проекте.

Поскольку они не работали, и это все, что у меня осталось, я попробовал 9-вольтовую батарею:

  1. Аккумулятор 9 В — отлично питает проект, но я надеялся рассчитать фактическое напряжение и/или ток, потому что надеялся использовать один из крошечных ионно-литиевых аккумуляторов с SparkFun.com (или где-либо еще) для питания моего проект, если это возможно.

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

/************************************************************************************************************************
Rebecca Wilson
12/17/18

Эта программа предназначена для использования arduino nano для запуска 2-разрядного 7-сегментного светодиодного дисплея. Я сделал это как счетчик жизней для
MTG, поэтому для начала отображается «20», и есть две кнопки, которые можно использовать для изменения общего количества жизней на +/- 1.

Вот куски, которые я использовал:

1x контроллер Nano 3.0, совместимый с USB-драйвером arduino nano CH340 (taydaelectronics.com; артикул A-2864)
*Вы должны выбрать «ATmega328P (Old Bootloader)» для процессора (иначе он не сможет загрузить файл в nano).
* Это также работает с arduino UNO, но я предпочитаю изменить отрицательный контакт кнопки на 13 для arduino Uno (я не
думаю, что контакт 13 работает на моем nano, потому что он подключен к тренировочному светодиоду, который прикреплен к плате).

1x светодиодный дисплей 7-сегментный 2-разрядный 0,28-дюймовый общий анод HI RED (taydaelectronics.com; SKU A-1701)

2x Tact переключатель 6x6мм 5мм сквозное SPST-NO (taydaelectronics.com; артикул A-5127)

2x 330 Ом, 1/4 Вт, 5% углеродно-пленочный резистор (taydaelectronics.com; артикул A-2067)

макетная плата и перемычки

Вот что я понимаю о светодиодном дисплее:
LOW означает, что сегмент включен
HIGH означает, что цифра включена, и когда эта цифра включена, все сегменты устанавливаются на LOW (включены).
*****************************************************************************************************************************/

//объявить константы
int tensDigit = 10; // Резистор 330 Ом между цифровым и нано-выводом
int onesDigit = 11; // Резистор 330 Ом между цифровым и нано-выводом

int pinA = 2;
int pinB = 3;
int pinC = 4;
int pinD = 5;
int pinE = 6;
int pinF = 7;
int pinG = 8;
int pinDP = 9;

int positiveButtonPin = 12; //а другая сторона кнопки подключена к контакту GND рядом с D2
int negativeButtonPin = A0; //а другая сторона кнопки подключена к контакту GND рядом с D2

//объявить переменные
unsigned long lastPositiveDebounceTime = 0;
unsigned long lastNegativeDebounceTime = 0;
unsigned long debounceDelay = 100;
unsigned long previousMillis = 0;

int currentPositiveButtonState = HIGH;
int currentNegativeButtonState = HIGH;
int lastPositiveButtonState = LOW;
int lastNegativeButtonState = LOW;
int trueLastPositiveButtonState = LOW;
int trueLastNegativeButtonState = LOW;
int buttonPushCounter = 0;
int startingValue = 20;
int currentValue = startingValue;


//объявляем функции
void delayTime(unsigned long milliseconds);
void setDigit(int place, int number);
void setNumber(int number);

void setup() { 

  pinMode(tensDigit, OUTPUT);
  pinMode(onesDigit, OUTPUT);
  pinMode(pinA, OUTPUT);
  pinMode(pinB, OUTPUT);
  pinMode(pinC, OUTPUT);
  pinMode(pinD, OUTPUT);
  pinMode(pinE, OUTPUT);
  pinMode(pinF, OUTPUT);
  pinMode(pinG, OUTPUT);
  pinMode(pinDP, OUTPUT);

  pinMode(positiveButtonPin, INPUT_PULLUP);
  pinMode(negativeButtonPin, INPUT_PULLUP);

  Serial.begin(9600);
}

void loop() {

  setNumber(currentValue);

  //читаем текущее состояние кнопки
  currentPositiveButtonState = digitalRead(positiveButtonPin);
  currentNegativeButtonState = digitalRead(negativeButtonPin);

  //если положительное состояние кнопки изменилось, то записываем новое текущее время
  if (currentPositiveButtonState != lastPositiveButtonState)
  {
    lastPositiveDebounceTime = millis();  
  }

  //если состояние кнопки не изменилось за время debounceDelay, то считаем это истинным изменением состояния и...
  if ((millis() - lastPositiveDebounceTime) > debounceDelay) 
  {
    //если последнее истинное состояние кнопки изменилось, то...
    if (currentPositiveButtonState != trueLastPositiveButtonState)
    {
      trueLastPositiveButtonState = currentPositiveButtonState;

      //если кнопка была нажата, то увеличиваем счетчик нажатий кнопки
      if (currentPositiveButtonState == LOW)
      {
        currentValue++;
        setNumber(currentValue);
        Serial.println(currentValue);
      }
    }
  }

  // изменяем последнее чтение кнопки на текущее чтение кнопки
  lastPositiveButtonState = currentPositiveButtonState;

  //если отрицательное состояние кнопки изменилось, записываем новое текущее время
  if (currentNegativeButtonState != lastNegativeButtonState)
  {
    lastNegativeDebounceTime = millis();  
  }

  //если состояние кнопки не изменилось за время debounceDelay, то считаем это истинным изменением состояния и...
  if ((millis() - lastNegativeDebounceTime) > debounceDelay) 
  {
    //если последнее истинное состояние кнопки изменилось, то...
    if (currentNegativeButtonState != trueLastNegativeButtonState)
    {
      trueLastNegativeButtonState = currentNegativeButtonState;

      //если кнопка была нажата, то увеличиваем счетчик нажатий кнопки
      if (currentNegativeButtonState == LOW)
      {
        currentValue--;
        setNumber(currentValue);
      }
    }
  }

  // изменяем последнее чтение кнопки на текущее чтение кнопки
  lastNegativeButtonState = currentNegativeButtonState;



}

void setNumber(int number) {

  int onesPlace = number % 10;
  setDigit(1, onesPlace); 
  delay(5);
  int tensPlace = number / 10;
  setDigit(10, tensPlace); 
  delay(5);
}


//место равно 1 при установке разряда единиц и 10 при установке разряда десятков
void setDigit(int place, int number) {
  switch(place)
  {
    case 1: 
      digitalWrite(onesDigit, HIGH);
      digitalWrite(tensDigit, LOW);
      break;
    case 10:
      digitalWrite(onesDigit, LOW);
      digitalWrite(tensDigit, HIGH);
      break;
  }

  switch(number)
  {
    case 0:
      digitalWrite(pinA, LOW);
      digitalWrite(pinB, LOW);
      digitalWrite(pinC, LOW);
      digitalWrite(pinD, LOW);
      digitalWrite(pinE, LOW);
      digitalWrite(pinF, LOW);
      digitalWrite(pinG, HIGH);
      digitalWrite(pinDP, HIGH);
      break;
    case 1:
      digitalWrite(pinA, HIGH);
      digitalWrite(pinB, LOW);
      digitalWrite(pinC, LOW);
      digitalWrite(pinD, HIGH);
      digitalWrite(pinE, HIGH);
      digitalWrite(pinF, HIGH);
      digitalWrite(pinG, HIGH);
      digitalWrite(pinDP, HIGH);
      break;
    case 2:
      digitalWrite(pinA, LOW);
      digitalWrite(pinB, LOW);
      digitalWrite(pinC, HIGH);
      digitalWrite(pinD, LOW);
      digitalWrite(pinE, LOW);
      digitalWrite(pinF, HIGH);
      digitalWrite(pinG, LOW);
      digitalWrite(pinDP, HIGH);
      break;
    case 3:
      digitalWrite(pinA, LOW);
      digitalWrite(pinB, LOW);
      digitalWrite(pinC, LOW);
      digitalWrite(pinD, LOW);
      digitalWrite(pinE, HIGH);
      digitalWrite(pinF, HIGH);
      digitalWrite(pinG, LOW);
      digitalWrite(pinDP, HIGH);
      break;
    case 4:
      digitalWrite(pinA, HIGH);
      digitalWrite(pinB, LOW);
      digitalWrite(pinC, LOW);
      digitalWrite(pinD, HIGH);
      digitalWrite(pinE, HIGH);
      digitalWrite(pinF, LOW);
      digitalWrite(pinG, LOW);
      digitalWrite(pinDP, HIGH);
      break;
    case 5:
      digitalWrite(pinA, LOW);
      digitalWrite(pinB, HIGH);
      digitalWrite(pinC, LOW);
      digitalWrite(pinD, LOW);
      digitalWrite(pinE, HIGH);
      digitalWrite(pinF, LOW);
      digitalWrite(pinG, LOW);
      digitalWrite(pinDP, HIGH);
      break;
    case 6:
      digitalWrite(pinA, LOW);
      digitalWrite(pinB, HIGH);
      digitalWrite(pinC, LOW);
      digitalWrite(pinD, LOW);
      digitalWrite(pinE, LOW);
      digitalWrite(pinF, LOW);
      digitalWrite(pinG, LOW);
      digitalWrite(pinDP, HIGH);
      break;
    case 7:
      digitalWrite(pinA, LOW);
      digitalWrite(pinB, LOW);
      digitalWrite(pinC, LOW);
      digitalWrite(pinD, HIGH);
      digitalWrite(pinE, HIGH);
      digitalWrite(pinF, HIGH);
      digitalWrite(pinG, HIGH);
      digitalWrite(pinDP, HIGH);
      break;
    case 8:
      digitalWrite(pinA, LOW);
      digitalWrite(pinB, LOW);
      digitalWrite(pinC, LOW);
      digitalWrite(pinD, LOW);
      digitalWrite(pinE, LOW);
      digitalWrite(pinF, LOW);
      digitalWrite(pinG, LOW);
      digitalWrite(pinDP, HIGH);
      break;
    case 9:
      digitalWrite(pinA, LOW);
      digitalWrite(pinB, LOW);
      digitalWrite(pinC, LOW);
      digitalWrite(pinD, HIGH);
      digitalWrite(pinE, HIGH);
      digitalWrite(pinF, LOW);
      digitalWrite(pinG, LOW);
      digitalWrite(pinDP, HIGH);
      break;
  }
}

, 👍0

Обсуждение

Кажется, в вашем сообщении есть два вопроса. Один из них, питание от батареи, хорошо документирован, и вы можете найти ответ на веб-сайте Arduino. Другой связан с пониманием 7-сегментного дисплея, которого нет в названии вопроса. Вы использовали токоограничивающие резисторы? Погуглите «7-сегментный резистор дисплея», и есть множество руководств (включая видео) по его использованию., @MichaelT

Как вы пытаетесь соединить различные батареи, которые пробовали?, @Majenko

Stackexchange лучше всего работает по одному вопросу за раз. Предполагаемая цель — создать доступную для поиска базу данных вопросов и ответов для других людей с похожими вопросами. Множественные вопросы и долгие дискуссии затрудняют реализацию этой цели. Тем не менее, аккумуляторы выбираются по ряду причин. Некоторые из них, например стоимость и вес, могут вас даже не волновать. Более того, для одного и того же приложения можно использовать несколько разных аккумуляторов. Так что, возможно, это сводится к мнению. Еще один формат, который обычно использует stackexchange..., @st2000

(1) Да, как я уже говорил в своем коде, я использовал резистор сопротивлением 330 Ом между каждым из двух семисегментных цифровых контактов и нано-контактом Arduino., @R. Wilson

(2) Я подключил положительную клемму моей батареи к контакту 30, который на Arduino Nano обозначен как VIN, а отрицательную клемму моей батареи к контакту 29, который находится рядом и помечен как GND., @R. Wilson

(3) Извините, мой вопрос, возможно, был неясен, потому что я был в таком замешательстве. Я не понимаю, как мой компьютер питает мой проект, и я подумал, что, когда я добавил другой источник питания, мне нужно было сделать какой-то расчет, чтобы определить, какое напряжение мне следует использовать в зависимости от того, что я вставляю в свою схему. Теперь я думаю, что никакого расчета нет. Существует огромное количество батарей на выбор, и я подумал, что этот расчет сузит выбор. Однако я думаю, мне следует использовать любую батарею напряжением от 7 до 12 В, и не имеет значения, что я вставляю в свою цепь., @R. Wilson


2 ответа


1

Рассмотрите время, необходимое для работы без внешнего источника питания, и средний ток, требуемый проектом. Умножьте эти два значения на Ампер-часы. Затем, учитывая разумные ампер-часы, выберите аккумулятор с удвоенной емкостью ампер-часов. Номинальные характеристики батареи обычно идеальны. В том, что чем медленнее мощность вытягивается из батарей, тем больше будет емкость батареи.

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

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

,

Спасибо за помощь. Я попытался следовать инструкциям, прилагаемым к моему мультиметру, и измерил ток моей цепи как 28 мА. Если я правильно понимаю, если я хочу, чтобы мой проект работал 4 часа за раз, мне следует купить аккумулятор емкостью не менее 224 мАч., @R. Wilson

Что касается напряжения, я чувствую себя очень глупо. По какой-то причине я воображал, что мне следует использовать закон Ома (или что-то еще) для выполнения каких-то вычислений (которые я не понимал), чтобы определить правильное напряжение используемой батареи. Однако буду ли я прав, если предположу, что мне не нужно делать никаких расчетов? Вместо этого мне просто нужно использовать напряжение от 7 до 12 В, потому что именно это сказано в инструкциях, что нужно нано, и на самом деле не имеет значения, какие части я вставляю в свою схему., @R. Wilson

Я считаю, что оба ваших комментария верны. Большинство аккумуляторов имеют емкость выше 224 мАч, поэтому легко найти даже небольшие аккумуляторы, соответствующие этому минимуму. Текущие требования к процессорам могут варьироваться в зависимости от того, что делает процессор. А увеличить срок службы батареи на порядок, а не вдвое, может быть разумным. При использовании любого встроенного стабилизатора, учитывая широкий диапазон допустимых напряжений, будьте осторожны и дважды проверьте, что вы подключаетесь к правильным контактам питания. Непосредственное питание процессора с напряжением 3 или 5 В этим более высоким напряжением может привести к повреждению процессора., @st2000

Должен добавить, что управление портативными устройствами на базе процессора для продления срока службы батареи — нетривиальная задача. Профессиональные разработчики тратят часы, если не дни, на выбор и настройку процессоров для правильной работы, в то время как в 90% случаев они «потягивают» только текущие nAmp и uAmps., @st2000


1

Не думаю, что это будет полноценный ответ, но я хочу рассказать вам о полезной альтернативе уже используемым вами батарейкам. Обычно я питаю свои проекты через 5-вольтовый «пауэрбанк», который делаю сам. Все, что вам нужно, это повышающая плата, такая как, например, 134N3P и любой аккумулятор Li-Po/Li-Ion 3,7V. 134N3P очень мал и содержит схемы защиты от пониженного напряжения и перегрузки по току, поэтому вы не разрушите ячейку. Это также позволяет безопасно заряжать эту ячейку с помощью любого зарядного устройства USB. Аккумуляторы Li-Po/Li-Ion бывают всех форм и размеров. Для миниатюрных проектов вы можете найти одну батарейку размером с две монеты, но для проектов обычного размера я предлагаю 18650 элементов как самый дешевый вариант.

,

Спасибо. Это очень интересно. Я не знал об этом варианте., @R. Wilson