Харчування 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.3 V вихід з 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 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("Ні actions".);
}


Більшість дій на себе бере бібліотека, так що код дуже простий.

Тестування рішення
Коротке відео з тестуванням:
Як видно, візуально все працює. Але все-таки треба перевірити напругу між пінами TP1/TP2 (методика тут). У мене вийшло значення ~4.6 V, рекомендоване значення більше 4.75 V.

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

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


Так як це мій перший пост, відгуки і коментарі будуть дуже корисні.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.