Как стать автором
Обновить

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

Время на прочтение4 мин
Количество просмотров55K
Многие наверняка знают, что подать питание на 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 тут.


Так как это мой первый пост, отзывы и комментарии будут очень полезны.
Теги:
Хабы:
+4
Комментарии15

Публикации

Изменить настройки темы

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн