Питание Raspberry Pi с использованием Arduino

Многие наверняка знают, что подать питание на Arduino от Raspberry Pi не трудно, для этого просто нужен USB шнур. Обратная задача выглядит сложнее, так как у большинства контроллеров Arduino нет USB выхода (Due — исключение). Тем не менее, это возможно сделать с помощью пинов GPIO, и я хочу рассказать о конкретном примере для Arduino Nano V3.0 и Raspberry Pi B rev.2. Помимо самой подачи питания, также расскажу как можно контроллировать это питание используя кнопку и MOSFET транзистор.

Теоретическая возможность

Большинство Arduino-совместимых контроллеров изпользуют 5V пины. Исключение составляет разве что Arduino Due и 3.3V выход из Arduino, но сейчас не об этом. Также известно, что один из способов подать питание на Raspberry Pi — это использование 5V и GND пинов на 26-ти контактном разъеме P1:

Казалось бы, что решение очевидно — надо подсоединить Raspberry Pi к любому из пинов Arduino, и все заработает. Моя попытка сделать это привела к тому, что Raspberry Pi засветил светодиодом PWR, но светодиод ACT так и не зажегся. Причина — очень маленькая сила тока от пинов Arduino (порядка 40-50 мА). Но у Arduino есть отдельный пин 5V, который (согласно ссылке) может выдавать около 400-500 мА. Теперь необходимо проверить, хватит ли такого тока для питания Raspberry.

Для нормального питания Raspberry Pi с двумя подключенными USB устройствами необходимо порядка 700 мА. Каждое USB устройство может потреблять до 140 мА (источник). Малина может потреблять еще больше тока, если она разогнана (моя — нет). Таким образом, если использовать неразогнанную RPi без USB устройств, то силы тока от Arduino 5V пина должно вполне хватить.

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

Необходимое аппаратное и программное обеспечение

Я использовал следующие «железные» части:
  • Raspberry Pi B rev. 2;
  • Arduino Nano V3.0;
  • кнопка для контроля питания (я использовал кнопку с фиксацией и сигнальным проводом);
  • MOSFET транзистор (у меня оказался IRF530N);
  • Breadboard и несколько проводов.

Для прошивки Arduino понадобится IDE, я использовал версию 1.5.8 BETA, но стабильная 1.0.6 тоже подойдет. Также понадобится моя маленькая библиотека для PowerButton (ссылка в конце статьи в разделе про утилиты).

Схемы

Схема подключения выглядит так:



Принципиальная схема так:



Пояснения к схемам:

  1. D2 подсоединен к пину SIG у кнопки.
  2. D4 подсоединен к пину VCC у кнопки.
  3. D5 подсоединен к затвору MOSFET.


Cоединение c D2 пином не случайно: библиотека для кнопки использует прерывания, а у Arduino Nano только пины D2/D3 предназначены для этих целей (проверить какие пины на вашей Arduino поддерживают прерывания можно тут).

Исходный код программы для Arduino

#include <PowerButton.h>
 
#define POWER_PIN_SIG  2
#define POWER_PIN_VCC  4
#define POWER_FET_GATE 5
#define POWER_PIN_INT  0
 
PowerButtonSwitch pbs;
 
void onPowerOn(){
  Serial.println("Power On");
  digitalWrite(POWER_FET_GATE, 1);  // Открываем затвор (gate)
}
 
void onPowerOff(){
  Serial.println("Power Off");
  digitalWrite(POWER_FET_GATE, 0);  // Закрываем затвор (gate)
}
 
void setup() {
  Serial.begin(9600);  
 
  // Вывод сигнала от Arduino к затвору MOSFET (gate)
  pinMode(POWER_FET_GATE, OUTPUT);
  digitalWrite(POWER_FET_GATE, 0);
 
  // Начальная настройка кнопки питания
  pbs.setupPowerButton(POWER_PIN_SIG, POWER_PIN_VCC, POWER_PIN_INT);
 
  // Считываем текущее значение
  // Если есть сигнал от кнопки,
  // включаем Raspberry Pi
  int st = pbs.getSwitchStatus();
  if (st == POWER_ON) {
    onPowerOn();
  }
 
  // Добавляем обработчики событий
  pbs.onPowerOn(onPowerOn);
  pbs.onPowerOff(onPowerOff);
}
 
void loop() {
  // Пустой цикл
  delay(1000);
  Serial.println("No actions");
}


Большинство действий на себя берет библиотека, так что код очень прост.

Тестирование решения

Короткое видео с тестированием:

Как видно, визуально все работает. Но все-таки надо проверить напряжение между пинами TP1/TP2 (методика тут). У меня получилось значение ~4.6V, рекомендуемое значение больше 4.75V.

Заключение

Несмотря на то, что все работает, все-таки есть подозрение что при подключении периферии тока от 5V пина Arduino будет недостаточно. MOSFET и кнопка работают отлично в паре, такая связка может пригодится для дальнейших проектов.

Утилиты и библиотеки, использованные для написания:
  • Fritzing: использовалась для рисования схем, доступна тут.
  • собственно библиотека для PowerButton: можно взять с GitHub тут.


Так как это мой первый пост, отзывы и комментарии будут очень полезны.
Поделиться публикацией

Комментарии 15

  • НЛО прилетело и опубликовало эту надпись здесь
      +10
      Может я не выспался сегодня. Но что то мне не ясна суть задумки? Я надеюсь эта схема — не окончательно решение? Ибо иначе использовать вычислительных мощностей ардуино — кощунство.

      Я внимательно изучил ваш код:
      1. Ваш код имитирует кусок провода (уж простите, но это так)
      2. Для чего вам библиотека? Такой простой «функционал» можно сделать стандартными средствами wiring-а.
        +2
        Да, решение не окончательное. Сделал именно так больше для собственного удобства и показать что так можно сделать.

        В действительности, Ардуино должен выполнять роль Power Management контроллера. В функции будут входить wake/reset/shutdown на разного рода события (кнопка power одна из них и самая часто используемая). Сейчас больше похоже на «имитацию провода», прекрасно понимаю. На самом деле, блок питания, естественно, будет, правда пока, думаю какой именно.
        +5
        К вопросу у том, куда делось 0.4 вольта: у вас MOSFET не той серии, у IRF* напряжение полного открытия около 15 вольт, вам нужен транзистор серии IRL, который управляется от уровней ТТЛ.

        Описание работы с полевыми транзисторами easyelectronics.ru/upravlenie-moshhnoj-nagruzkoj-postoyannogo-toka-chast-3.html

        Нужный график — Fig1 на странице 3 даташита www.irf.com/product-info/datasheets/data/irf530n.pdf.

        Хотелось бы также видеть результаты измерения тока, проходящего через RPi и напряжения, падающего на транзисторе.
          +1
          Спасибо, приобрету и попробую.
          +8
          Ардурина тут выполняет роль кнопки что ли?
            –2
            ну зачем вы так — она выполняет роль контроллера питания
              +5
              Она бы была контроллером питания, если бы например через неё был контроль заряда аккума и принуждение входа малинки в какой нибудь энергосберегающий режим или в спячку по достижению пороговых значений заряда.
            +4
            Замечательно. «Мигание светодиодом» с выпендрежным блекджеком и неумелыми куртизанками. Что дальше? Переоткрытие закона ома? Или туториал по использованию Arduino в качестве молотка?
              +2
              Брр брр брр, целая библиотека «слушающая» прерывания, ардуина и питания через неё…
              Малинка в режиме сна много потребляет или вообще не умеет засыпать?
              Ну и наверное правильнее всё же подавать питание не через ардуинку, а от отдельного источника питания, сомневаюсь что всё это нагромождение с ограниченным током будут стабильно работать.
                0
                Забирать 5V с Arduino — довольно грубо, как Вы все понимаете, ибо данная игрушка чаще всего питается от USB порта того же компьютера, отсюда ограничение тока в 500мА на стороне хоста, то есть, ПК. А если дополнительно подключить к тому же порту (допустим, через USB-хаб, да ещё и без дополнительного питания) другие достаточно мощные потребилети (USB-HDD, USB-RTL-тюнеры, etc...) то есть риск, что либо порт прекратит раздачу халявных 5V из-за перегрузки, устройства будут работать некорректно, либо будет повреждена материнская плата в области южного моста (неприятно, да).
                Так что… понимаю, управление питанием, как таковое, работает… но действительно, зачем?
                В принципе, RPi может отключить от питания сама себя (допустим, тем же реле), либо более «хитрым» триггером на паре полевых транзисторов (тех же, IRL*) и нескольких резисторах.
                  +5
                  Вы написали целую статью о том, как запитали Распберри пай от линейного стабилизатора 7805, расположенного на Ардуино, при этом, сделав ключ на полевом транзисторе. Мое предложение уместилось на пару строк и полностью передает смысл вашей статьи. Без обид, но, реально, зачем? Ардуино все-равно подключаете к тому же USB-адаптеру, либо USB-кабелю, который подключаете к компьютеру. Если нет микро-USB, то возьмите любой USB-кабель. Разрежьте его, и подключите красный провод к 5V, Черный — Gnd. Зачем придумывать непонятный велосипед? И вообще, если у вас используется какая-то связка Ардуино + Распберри пай, то логично, чтобы не одно питалось от другого, а чтобы и то и то питалось от одного источника, скажем так. Для каждого девайса отдельный питающий кабель.
                    +1
                    Даже мигание светодиодом кажется верхом утилитарности, чем вот это изделие.
                      +1
                      Казалось бы, что решение очевидно — надо подсоединить Raspberry Pi к любому из пинов Arduino, и все заработает. Моя попытка сделать это привела к тому, что Raspberry Pi засветил светодиодом PWR, но светодиод ACT так и не зажегся. Причина — очень маленькая сила тока от пинов Arduino (порядка 40-50 мА).
                      Прежде, чем пытаться что-то сделать, нужно сначала почитать datasheet на ATmega168 (или что у вас там) и в разделе Electrical characteristics посмотреть в табличку Absolute maximum ratings и узнать, что:
                      • DC current per I/O pin — 40.0mA
                      • Stresses beyond those listed under “Absolute Maximum Ratings” may cause permanent damage to the device. This is a stress rating only and functional operation of the device at these or other conditions beyond those indicated in the operational sections of this specification is not implied. Exposure to absolute maximum rating conditions for extended periods may affect device reliability

                      Проще говоря, пытаться выжать 40 мА и более из пинов ATmega168 — это изящный способ выстрелить себе в ногу. Внимательнее надо быть, это же не программирование, тут девайс спалить можно (в данном случае — пин).
                        0
                        Скажите, пожалуйста, можно ли напрямую запитать Rapsberry Pi 3 Model B, с помощью LIPO battery 7.4v-3500mAh 25C 2s, если к нему подключена Camera Module Board REV 1.3For Raspberry Pi 3? Если нет, то как лучше сделать, потому что LIPO с меньшим напряжением я не нашел.

                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                        Самое читаемое