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

в 7:41, , рубрики: arduino, Raspberry Pi, кнопка включения, питание

Многие наверняка знают, что подать питание на 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 к любому из пинов 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 (ссылка в конце статьи в разделе про утилиты).

Схемы

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

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

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

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

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

  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 тут.

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

Автор: fossid

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js