Многие наверняка знают, что подать питание на 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 транзистор. Перейдем непосредственно к использованным частям.
Я использовал следующие «железные» части:
Для прошивки Arduino понадобится IDE, я использовал версию 1.5.8 BETA, но стабильная 1.0.6 тоже подойдет. Также понадобится моя маленькая библиотека для PowerButton (ссылка в конце статьи в разделе про утилиты).
Схема подключения выглядит так:
Принципиальная схема так:
Пояснения к схемам:
Cоединение c D2 пином не случайно: библиотека для кнопки использует прерывания, а у Arduino Nano только пины D2/D3 предназначены для этих целей (проверить какие пины на вашей Arduino поддерживают прерывания можно тут).
Большинство действий на себя берет библиотека, так что код очень прост.
Короткое видео с тестированием:
Как видно, визуально все работает. Но все-таки надо проверить напряжение между пинами TP1/TP2 (методика тут). У меня получилось значение ~4.6V, рекомендуемое значение больше 4.75V.
Несмотря на то, что все работает, все-таки есть подозрение что при подключении периферии тока от 5V пина Arduino будет недостаточно. 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 (ссылка в конце статьи в разделе про утилиты).
Схемы
Схема подключения выглядит так:
Принципиальная схема так:
Пояснения к схемам:
- D2 подсоединен к пину SIG у кнопки.
- D4 подсоединен к пину VCC у кнопки.
- 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 тут.
Так как это мой первый пост, отзывы и комментарии будут очень полезны.