RPi1114 - Raspberry Pi 電源制御モジュール


■追記(2017年3月4日)■

下記記事に「モジュールの消費電流100mAを考慮して」と記載されていますが、実測で最大でも17mA程度です(LED点灯時。消灯時だと15mA程度)。

■追記(2017年2月22日)■

fabcross様に紹介記事を掲載していただきました!
Raspberry piをタイマでON/OFFできる「RPi1114-Raspberry Pi電源制御モジュール」

■RPi1114FDH28■

RPi1114は、Raspberry Piに重ねて使うモジュールです。モジュールに搭載したLPC1114でRaspberry piの電源をコントロールします。

お買い求めはこちらから(スイッチサイエンス社)

モジュールに5V3A程度のACアダプタを接続すると、モジュールからRaspberry Piへ電源が供給されます。電源供給はLPC1114によってON/OFF可能です。たとえば、太陽電池とバッテリを電源として屋外に設置したRaspberry Piとカメラを一定時間ごとに起動して撮影し、撮影が終わったら自動的にRPiの電源を切る、という使い方が可能です。

出荷時インストール済のプログラム(mbed.orgで公開)では、RPiからI2Cでコマンドを受け取ると、受け取った秒数経過後にRPiへの電源供給をonまたはoffにします。

例:
sudo i2cset -y 1 0x28 0x11 0x00 0x10 0x36 0x30 0x00 i …60秒後にoff
sudo i2cset -y 1 0x28 0x10 0x00 0x10 0x33 0x30 0x30 0x30 0x00 i …3000秒後にon

モジュール上のLEDを制御できます。
例:
sudo i2cset -y 1 0x28 0x20 0x00 0x00 i …led 消灯
sudo i2cset -y 1 0x28 0x20 0x00 0x01 i …led 点灯
sudo i2cset -y 1 0x28 0x20 0x00 0x02 i …led 点滅

アナログ入力ポートからデータを読み込めます。
例:ch #2(dp11)から読み込み
sudo i2cset -y 1 0x28 0x30 0x02 0x00 i
sudo i2cget -y 1 0x28 0x30 w

指定した間隔でアナログ入力ポートからデータを読み込み、まとめてRPiから取り込むことができます(最大100件まで)。この間、RPiは何もしなくて結構です。なおi2cgetでは最初の1語しか読めないので、データの取り込みにはnode, Python, c言語などを使用してください(この機能は2017-01-16現在、問題が発見され修正中です)。
例:ch1(dp10)から500m秒間隔で読み込みを開始し
sudo i2cset -y 1 0x28 0x32 0x01 0x10 0x35 0x30 0x30 i
sudo i2cset -y 1 0x28 0x34 0x01 0x10 0x00  i
sudo i2cget -y 1 0x28 0x34 w  ....i2cgetでは件数のみ取得できます
  

デジタルポートの読み込み
例:ch #1(dp6)から読み込み
sudo i2cset -y 1 0x28 0x50 0x01 0x00 i
sudo i2cget -y 1 0x28 0x50 w



デジタルポートの書き込み

例:ch #0(dp26)へ書き込み
sudo i2cset -y 1 0x28 0x60 0x00 0x10 0x31 0x00 i


PWM出力
例:ch #0(dp1)へ500hzの 20%PWM波(約0.64v相当) を出力
sudo i2cset -y 1 0x28 0x41 0x00 0x10 0x32 0x30 0x30 0x30 0x00 i
sudo i2cset -y 1 0x28 0x40 0x00 0x10 0x32 0x30 0x30 0x00 i

ファームウェアバージョン取得(戻り値 0xffffはver 1.00以前を示します)(2017-01-17)
sudo i2cget -y 1 0x28 0x00 w

なお、利用可能なchや詳細なコマンドについてはこのページの末尾を御覧ください。

モジュール上のLPC1114へはRaspberry Piからバイナリをアップロードすることができます。

DCジャックの近くにあるスイッチsw1は、プルアップしてdp25とgndにつながっています。スイッチを押すとdp25はLOW(0)になります。デモプログラムではスイッチを押して離した時にRPiへの電源を強制的にon / offすることができます。なお、スイッチを操作してもRPiへの通信等は発生しないので、sw1でoffするまえにちゃんとRPiをシャットダウン(sudo poweroff)しておいてください。sudo poweroffしたあと電源ケーブルを引っこ抜かずにRPiの電源を切ることのできるスイッチ使うと便利です(私自身、愛用しています)。

余ったスペースにユニバーサルパターンも用意しました。上下に電源ライン、中央部に縦2本の短絡ラインを設けています。LPC1114の余ったGPIOを外に引っ張り出せるようにピンに出しておきました。普通のLPC1114として利用することができますので、例えばLPC1114のADCを使ったアナログ入力や、GPIOを用いたロータリエンコーダーの読み取り処理など、RPiの苦手な作業を代行することも可能です(そのためのプログラムはご自身でお願いします。開発のご依頼は info@kurahashi-ya.com までご相談ください)。

末尾にrelease noteがありますので、ご参照ください。


■動作モードについて■

モジュール上のジャンパで、基板の動作モードを選択できます。どちらかのモードを選択してください。
  • from RPi
    RPiから3.3vを供給します。この場合は、このモジュールにはACアダプタを接続しないでください。
  • to RPi(出荷時設定)
    ACアダプタからこのモジュールに5Vを供給し、電源制御回路を経由してRPiへ電源を供給します。この場合にはRPiの電源供給用マイクロUSBには何も接続しないでください。

■このモジュールの他に必要なもの■

  • Raspberry Pi B以上
    Raspberry Piがなくてもこのボードは動きます(意味ないですが)。
  • 5V出力のACアダプタ(DCプラグは2.1mmセンタープラス)
    このボード自体の消費電流は100mA以下なので、お使いのRPiに合わせてください。

■このモジュールとRPiの接続について■

20x2ピン(40ピン)のピンソケットでRaspberry Piと接続します。ズレないように気をつけてください。ズレた状態で電源を入れるとRPi1114は確実に死にます(経験者・談)。

モジュールと接続されているピンは以下の通りです(詳細は回路図をご参照ください)。
  • 5Vまたは3V
    どちらかをジャンパで切り替えます。5VはこのモジュールからRPiへ電源を供給するモード、3.3VはRPiのマイクロUSBに電源を接続してこのモードへ電源を供給するモードです。詳しくは、後述の「動作モードについて」をご参照ください。
  • GND
  • GPIO23とDP24 / GPIO24とDP23
    RPiのGPIO23とGPIO24でLPC1114のRESET/ISP端子を制御しています。
  • TXDとDP15(RXD)、RXDとDP16(TXD)
    シリアルをクロス接続しています。LPC1114へプログラムを書き込む際に使用します。シリアル通信にも使えるはずですが、I2Cを使うほうが楽だと思います。
  • SCLとDP27、SDAとDP5
    I2Cです。RPiがマスタとして動作します。

■コネクタについて■

このモジュールはRPiのコネクタに直接接続して使用します。フラットケーブルなどを経由することも可能ですが、最大で2.5Aの電流が流れるので良質のものを使用してください。

秋月やスイッチサイエンスで売っているものは大丈夫だと思いますが、ダメなケーブルを使うと溶けます(経験者は語る)。ダメなケーブルの見分け方は、価格よりもニオイです。ダメなケーブルって異様に化学臭するんですよね。


■RPi1114上のLPC1114にプログラムを書き込む■

大まかな手順としては、
  1. ACアダプタを外す
  2. ジャンパピンを「from RPi」に差し替える
  3. RPiにマイクロUSBから電源を供給しRPiを起動する
  4. lpc21ispをインストールします
  5. なんらかの方法でLPC1114用バイナリを用意します
  6. lpc21ispで書き込みます
です。

■lpc21ispのインストール■

lpc21ispはオープンソースのISPツールです。RPiの場合にはシリアル経由でバイナリを書き込むことができます。

apt-getでもインストールできるのですが、apt-get版はRESET/ISPピンの制御ができないので書き込みできません。もしインストール済の場合には、sudo apt-get remove lpc21ispで削除してください。

インストールの手順は以下の通りです。
cd
git clone https://github.com/capiman/lpc21isp.git
cd lpc21isp
make
sudo cp lpc21isp /usr/local/bin
sudo chown root:root /usr/local/bin/lpc21isp

■LPC1114用バイナリの用意■

プリインストールされたデモプログラムを再インストールする場合は、githubからバイナリ(RPi_1114_LPC1114.bin)をダウンロードしてください。忘れたころにバージョンアップしていきますので、思い出したらチェックしてみてください :-)

上記デモプログラムに手を加えたり、オリジナルのプログラムを使いたい場合には手っ取り早くmbedのオンラインIDEを使います。mbed以外の方法もありますが、それは他の方の記事をご参照ください。

デモプログラムを例に説明します。
  1. mbed.orgにサインアップする
  2. mbedリポジトリを開き、import into compilerをクリック
  3. mbedオンラインIDEのページが開くのでダイアログ上でImportをクリック
  4. インポートされたRPi_1114のmain.cppを開き、コンパイルをクリック

これでMac / PCのダウンロードディレクトリに「RPi_1114_LPC1114.bin」が落ちてきます。

なお、mbedのオンラインIDEはRPi上のIceweaselブラウザでも使えるみたいです(私は試してません)

■lpc21ispで書き込み■

HDMI+USBマウス+キーボードの場合にはシリアルがあくので問題ないのですが、sshでRPiで接続している場合にはRPiのシリアルターミナルの機能を止めないとlpc21ispは「シリアルポート使えない」というエラーを出します。以下の手順でシリアルコンソールを止めてください。
  1. /boot/cmdline.txtを開いて console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 を削除
  2. rebootし、再度sshでログインした後、
    sudo systemctl stop serial-getty@ttyAMA0.service
    で、コンソールを停止にする
上記の2は、ラズパイ起動ごとに実行する必要があります。

また、RPi3でlpc21ispが動作しない(RPi1114上のLED D1がうっすら点灯していてSynchronizing (ESC to abort)..............が止まらない)場合には、/boot/config.txtの末尾に dtoverlay=pi3-miniuart-bt を追加してみてください(編集後に再起動)。

次にGPIO23とGPIO24を出力として有効にします(これもラズパイ起動ごとに1回)。
sudo echo 23 > /sys/class/gpio/export
sudo echo 24 > /sys/class/gpio/export
sudo echo out > /sys/class/gpio/gpio23/direction
sudo echo out > /sys/class/gpio/gpio24/direction
あとはlpc21ispで書き込むだけです。
sudo lpc21isp -gpiorst24 -gpioisp23 -controlinv -bin RPi_1114_LPC1114.bin /dev/ttyAMA0 115200 48000

うまく書き込みができたら、ボード上のLEDが1秒周期で点滅しているはずです。以下のコマンドで消灯すればたぶんOKです。
sudo i2cset -y 1 0x28 0x20 0x00 0x00 i

■回路図, 基板データ, 制御プログラム■


我ながら単純な回路ですが、すべてgithubにオープンソースとして公開します。ただし、Eagleの一部部品に他の方の作成したライブラリを使用しており、その公開ポリシーに従います。

作者の皆様方に感謝申し上げます。

■サポート■

ご質問などは、Google+「RPi1114サポート」にお願いします。


意味詳細
命令コード動作指示
0x00 - 0xFF
チャンネル番号GPIO, Analogポートなどの番号を指定
0x00 - 任意のチャンネル番号
モード指定パラメータがバイナリかASCII数字かを
指定
0x00 : バイナリ
0x10:ASCIIコードのc string
バイナリパラメータ32ビット符号なし整数 / little endian
ASCIIパラメータ"0" - ”2147483647”



ブロック動作commandchannelmodeパラメータ
ファームウェアファームウェアのバージョンを返します。
なお、ver 1.00のみ0xffffを返します。
0x00---
RPi電源パラメータで指定した秒数後にRPiの電源をON0x10-0x00 | 0x100秒以上(秒単位)
パラメータで指定した秒数後にRPiの電源をOFF0x11-0x00 | 0x100秒以上(秒単位)
LEDLEDを制御0x20-0x00 | 0x100 : 消灯
1:点灯
2:点滅
アナログアナログポートを読み込む0x300 - 20x00 | 0x10-
アナログ読み込みバッファを初期化0x310 - 20x00 | 0x10読み込み間隔
100ミリ秒以上
(ミリ秒単位)
アナログバッファへ読み込みを開始0x320 - 20x00 | 0x10
アナログバッファへ読み込みを停止0x330 - 20x00 | 0x10
アナログデータをダウンロード0x340 - 20x00 | 0x10
(バッファはチャンネルあたり256個まで)
PWMPWMを出力0x400-20x00 | 0x10
PWM周波数(周期)を設定0x410-20x00 | 0x10
デジタル入力ポートを読み込む0x500-1-
デジタル出力ポートへ値を出力する0x600-1-
※ファームウェア ver 1.01未満では0x30-0x34までに不具合があります。
※ファームウェア ver 1.00未満では0x31-0x34までに不具合があります。


GPIO役割channel番号
dp1PWM0
dp2PWM1
dp4Digital In0
dp5I2C SDL
dp6Digital In1
dp9ADC (analog digital converter)0
dp10ADC (analog digital converter)1
dp11ADC (analog digital converter)2
dp13GPIO(未使用)
dp18PWM2
dp25sw1
dp26Digital Out0
dp27I2C SCL
dp28Digital Out1

■既知のバグとfix状況■
2017-01-16 ver 1.00

  • 0x30-0x34のアナログ関連コマンドにバグ

2017-01-17 ver 1.01

  • バージョン番号表示機能を追加
  • 0x30アナログ入力コマンドバグ修正


■謝辞■

このプロジェクトに際し要求仕様を提示してくださった林さん、小瀬さんに感謝申し上げます。また、この製品の原型を実際にフィールドでお使いくださっている「かわごえ里山イニシアチブ」の代表理事増田純一さん、機会と美味しいお米をありがとうございました。

製品化にあたって、有益なアドバイスとバグ情報、Python版ツールを提供してくださった遠藤さん、ありがとうございます。

私の駄目な指示に負けることなくちゃんとしたプリント基板と製品を作ってくださったElecrowさんには感謝の言葉もありません。多謝!

最後に、Eagleライブラリなどを提供してくださった作者の皆さんの貢献に感謝と敬意を表します。いつか私が皆さんから受け取った以上のものをお返しできますように。

2 件のコメント:

  1. すばらしすぎます!!!神ですか!!

    メカトラックスのslee-piを利用して開発していましたが、「ちょっと高すぎるなぁ」「ATTinyで作ればコスト1/10だけど面倒だなぁ」と思っていた所にこれを見つけて即スイッチサイエンスで買いました。

    ADCがついてる、ユニバーサルパターンがついてる、PWMがついてる、i2cで制御できる、mbed部分をオープンソースで公開してる。

    しかもADCは本体オフでもバッファにためておけるとか!!
    何から何まで最高です。痒いところに手が届きすぎです。

    返信削除
    返信
    1. ありがとうございます。

      ADCのバッファは複数チャンネル分用意しているのでチャンネルごとの記憶数は多くないのですが、1chだけでよければもっと長く記録するように書き換えるのも簡単だと思いますので、ご遠慮なくソースをいじくり回してください:-)

      あ、何か改良点を見つけたらpull request送ってくださいね。

      RPi1114FDH28がお役に立つことを願っています。

      削除