2014年12月15日月曜日

BeagleBone BlackのUbuntuのパワーマネージメントを有効にするために必要と思われる設定作業など

参考URL



  1. elinux.orgのページ
  2. BeagleBone BlackにUbuntuをインストールする
  3. BeagleBone Blackで遊ぼうのこーな

目標


とりあえずのゴールはBeagleBone Blackでサスペンドとハイバネーションが使えるかどうか確認すること.


初期インストール

まず,「BeagleBone Blackで遊ぼうのこーな」を参考に,マイクロSDにUbuntuを焼いて起動.

proxyの設定

以下の行の内容を.bashrcに保存

alias unset_proxy="unset http_proxy;unset https_proxy;unset ftp_proxy"
alias set_proxy='export http_proxy="http://ユーザ名:proxyパスワード@proxyホスト名:ポート番号/"; export https_proxy="proxyの定義"; export ftp_proxy="proxyの定義"'

パッケージの更新

http://gadget.ichmy.0t0.jp/intro/beaglebone/ubuntu/を参考に,パッケージを更新.

作業に便利なコマンドのインストール

とりあえず,シリアル接続で画面サイズの設定を簡単にするため,resizeコマンドを使えるようにする.あと,apt-getなどでコンプリーションを聞かせたい.最後が,パワーマネージメントを実行コマンドも必要.

というわけで,インストールすべきバッケージは以下の3種類

  • xterm
  • bach-completion
  • pm-utils


デフォルトインストール状態でのパワーマネージメント設定状況

とりあえず,デフォルトインストール状態でサスペンドやハイバネーションが利用できる状態にあるか否かをコマンドレベルで確認する.

pm-is-supportedコマンドは引数として指定した状態がサポートされている場合は0を返し,状態がサポートされていない場合は1を返すため,以下のコマンドで確認.

root@arm:~# pm-is-supported --suspend ; echo $?
0
root@arm:~# pm-is-supported --suspend-hybrid ; echo $?
1
root@arm:~# pm-is-supported --hibernate ; echo $?
1
root@arm:~#

ということで,サスペンド以外はサポートされていない.
(スワップが存在しないからハイバネーションできないのはあたりまえ)


スワップの追加

次に,スワップを追加してみる(スワップの作成の参考は参考URLの1番と2番).

以下は1024MBのスワップ領域を作る例

root@arm:~# mkdir -p /var/cache/swap/
root@arm:~# dd if=/dev/zero of=/var/cache/swap/swapfile bs=1M count=1024
root@arm:~# chmod 0600 /var/cache/swap/swapfile
root@arm:~# mkswap /var/cache/swap/swapfile
root@arm:~# swapon /var/cache/swap/swapfile

起動時にswapを有効にするため,/etc/fstabに以下を追加.

/var/cache/swap/swapfile    none    swap    sw    0   0

マシンを再起動してから,以下のコマンドでswapの状態を確認

root@arm:~# swapon -s
Filename                                Type            Size    Used    Priority
/var/cache/swap/swapfile                file            1048572 0       -1


BeagleBone Blackをシリアルで使う


参考URL



本論


今回BeagleBoneBlackを使うにあたり,ディスプレイやキーボードは繋ぎたくなかったので,まず最初はシリアルポート接続をしないといけない.

ftdiのチップが搭載しれたUSBシリアルのケーブル(秋月)は売り切れで来年(2015年)2月まで入荷しないとのことで,近い機能を持つケーブル(千石)を購入してきて,手元のマシンに接続し,ドライバをインストールしてみた.


問題は,PL2303HXのドライバがWindows8系列をサポートしていないこと.


いろいろ探ってみたところ,参考URLにあるejo090さんのページを発見して同じようにやってみたところ,一応つながるものの,/dev/consoleの出力が直前の2文字ほどが出力(エコーバック)されないという問題にあたってしまい.あまり使いづらいので,別の方法を探してみた.

すると,参考URLのkinnekoさんのページを発見したので,手元のArduinoに繋ぎっぱなしにしてあった,スイッチサイエンスのftdiチップ搭載のシリアルUSB変換ボードをつないでみたところバッチリ動作した.

ありがたや.


Android5.0はペアレンタルコントロールに使えるか.

lolipopが公開されたため,少し前に,手元のNexus4にイメージを焼いてお試ししてみた.

元々やりたかったのは,google playのアプリを子供からアクセスできなくした上で,SMSの着信や電話の発着信を子供にさせることを狙っていた.

Android4.4の時に,Xposed+MultiUserで制限プロファイルを電話でもできるようにしたものの,SMSや電話着信がまともに動かず,断念していた.

今回lolipopで電話にもマルチユーザ機能が搭載されるということで,実際に試した.
結論から言うと,「Lolipopのマルチユーザ機能はペアレンタルコントロールには使えない」でした.

単純にユーザを作って,着信を許すか否かはできるものの,作ったユーザに対して,利用できるアプリを制限することはできませんでした.
Lolipopに制限プロフィールが作れないと無理かも.

しかし,XposedのLolipop対応は,JavaVMがdalvikからARTに移った関係で苦労しているようで,XposedがLolipopで動くかどうかも微妙な状況.

というわけで,しばらくは様子見.


追記(2015年5月17日) : Xposedも試してみた

Xposed for lolipopがリリースされたため,インストールし,Multi-userモジュールも入れたが,もともとのlolipopとどこが違うのか不明.やはり,制限プロフィールは作ることができず,ペアレンタルコントロールにはまったく使えませんでした.

arduinoの気温測定で問題発生


以前の投稿「arduinoを使った温度測定webサーバ」でarduinoで室温を測定するwebサーバを作る日記を載せました.

長時間の運転でブレッドボードの上に回路があるのは嫌だったので,シールドを作成してみた.


上の写真は作ったシールドをMEGAに載せた写真.

このシールドを載せたArduinoを一ヶ月弱運転し続けたところ,Arduinoからの熱で室温が正しく測れないことがわかったため,再度ブレッドボード上に作ったセンサ回路につなぎ替えて運用している.





2014年10月7日火曜日

Raspberry Pi 用冷却ファンのための試作 (第3段 多分最終)

今回の課題は次の3点.

  1. ファンを中に収める.
  2. ファンにカバーをかぶせる.
  3. ファンの音を少しでも小さくする.



追加で使った部品

以下の部品を千石電商で買ってきた.(しかし,毎週土曜の午前の千石と秋月は混んでいる)


防振シリコンシート

防振シリコンシートを使おうと思った理由は以下の2つ


  1. ファンとファンをつける蓋の間に挟んで蓋の振動を抑える
  2. ファンと蓋の間に隙間を作らないと,ファンが回らない (笑)


2番目の理由

ファンの羽になにかが軽く触っただけで,羽が回らないため,羽のむき出しの側を蓋に向けて取り付けるためには何かでファンと蓋の間に隙間をつくらなくてはいけない.

試した3つの付け方


(1) 最初はボルトについてる金属のワッシャを入れてみたが,ワッシャが羽に当たって (T^T)


(2) 防振シートをそのまま挟んでみると,ネジ穴の位置が微妙にずれているのか(完全手作りだから),蓋が立体だからか,シリコンシートが少しあまり,その端かファンの羽にあたる.  (T^T)


(3) 仕方がないので,防振シリコンシートを切ることにした.





ファンの取付

ナットが金属の場合,どこかに触って電気が流れる嫌なので,ボルトをプラスチックのものにした.




完成図(写真だけど)

前回のと違って,ファンに蓋もついて,ファンも中に収まっているので,多少見栄えも良くなった.
(でも,穴の形が多少いびつなのがやはり悲しい)

ファンの右下のユニバーサル基板を見たらわかるように,L字型にユニバーサル基板を切ってます.



宿題


ファンの制御プログラムは次の宿題

Raspberry Pi 用冷却ファンのための試作 (第2段)

Raspberry Pi用のユニバーサル基板では,あまり外に出る部分が大きいので,CPUの上に基板があまりかぶらないように小型のユニバーサル基板で作ってみた.

実機の写真

ケースを加工する工具を持っていないので,無理やりヤスリとはんだごて,カッターナイフで穴を開けてみた.

CPUの上に基板が重なるといやなので,USBシリアル部分はケースの外に,ファンの回路は左端に寄せて作ってみた.





USBシリアルの接続

今回使ったのは,スイッチサイエンスから販売されているArduino用のUSBシリアル.


上の実機の写真を見てもらうとわかるように,今回は回路全体が裏向きになるようにしている.
その理由は,Raspberry Piのシリアルのピン割り当てが8番ピンと10番ピンでUSBシリアル回路を表向きにつけると,配線がクロスしてしまうため,反対向き(裏向き)にしている.

下は,前回の回路の配線図.USBシリアル回路は今回も同じ.



するとうまい具合に,下の写真のようにUSBシリアルとRaspberry PiのGPIOのピンの接続はストレートが2本と斜め横につながるGNDが1本で済む.

今回は,小型とユニバーサル基板とシール基板で作成.






ファンの接続


上の回路図では,ファンの回路は5V以外は20と22番ピンからとっていたが,今回の試作では,なるべくCPUから離すために,32~40番ピンで作成.USBシリアル回路と同じく,シール基板を活用.






部品が着いた側の写真 抵抗とトランジスタとショットキーダイオード.



蓋と合わせてみると,ファンの穴がファン用の回路の基板とかぶるため,ファンはやむなく箱の外側に.


蓋を閉じて,動作させてみると下の写真のように動く.(ファンが回ってる状態の写真)



ファンの羽がむき出しの上,少しうるさいし,ファンが飛び出しているのも悲しいので,もう一回試作することにする.


2014年10月6日月曜日

Raspberry Pi 用冷却ファンのための試作 (Raspberry Pi 用ユニバーサル基板)


サンハヤトのRaspberry Pi用ユニバーサル基板で作ってみた. 

回路図

回路図は前回のブレッドボードでの回路と同じ





実機の写真

でかい(笑)

当然ではあるが,ユニバーサル基板はケースの外に全部出すしか無い.



2014年9月29日月曜日

Raspberry Pi 用冷却ファンのための試作 (ブレッドボード)


設計


参考URLの回路より強力なファンにしようと最初思っていたんだけど,秋月のwebを見ながらより強力なファンをつけるためにトランジスタを別のにしようとして,あまりいい物を見つけることができず,ファンを電力があまりかわらないで,少しサイズが大きく,多少厚さが薄いものにしただけで他は参考の2番と同じのにしてしまった.

ファンと同時にシリアルコンソールを常設にするため,USBシリアルコンソールも同時にユニバーサル基板にハンダ付けすることにした.

参考URL


  1. https://sites.google.com/site/gpsnmeajp/raspberrypi/fancon
  2. http://suihan74.ddo.jp/blog/raspberry-pi-cool-down-2/
  3. http://suihan74.ddo.jp/blog/raspberry-pi-cool-down/


回路図


試作

ブレッドボードにUSBシリアルとファンの関係回路を作り,本体にヒートシンクを貼り付け.ファンの動作確認は,参考URLのスクリプトを見て,ファンをONするshellスクリプトとOFFするshellスクリプトを作成して,制御できることを確認.



次の計画

次はRaspberry Pi用のユニバーサル基板にブレッドボードで試作した回路を載せることだけど,ユニバーサル基板に部品を載せたら,箱のふたは閉まらないかも.

2014年9月27日土曜日

Raspberry Piの空冷ファン関係のお買い物@秋葉

前回までに記述したRaspberry Piをファンで冷却するための回路の試作のため,秋葉原に出かけてお買い物.今回回った店は以下の3店舗.




千石電商

買ったもの


上のスイッチサイエンスのFTDIのアダプタはarduinoで使ったことがあって,使っているPC(Windows)で確実に動作することがわかっているんだけど,ユニバーサル基板にハンダ付けできないから,最終的にブレッドボードに接続するときはこっちの方がいいかもと思って,予備で買ってみた.

















門田無線

買ったもの


  • ブレッドボード
  • ハンダ付けしないでケーブルを接続するクランプ
  • ジュンフロン線









買えなかったもの




9/27(土)に買いに行ったら,9/29(月)(約2日後)の昼に入荷と言われた (T^T)
千石や秋月にもまだ売ってないんだよね.

月曜日は出張で定時後まで御茶ノ水で会議だから,帰りに秋葉に寄るかなぁ.

秋月電子通商


  • 330Ωのカーボン抵抗
  • 3kΩのカーボン抵抗
  • ショットキーダイオード
  • トランジスタ
  • ピン







お昼ごはん

かんだ食堂(食べログのリンク)で生姜焼き定食650円(今日は生姜焼きとカツカレーがサービスデーだった)


Raspberry Piにおける冷却ファンの駆動方式


Raspberry Piの来年夏に向けての対策として,ファンをつけようと考えていました.
大きく分けて,以下の3種類程度かと思います.

  • ON/OFF制御
  • 電圧制御
  • PWM制御

いろいろ調べて考えた結果,一番古典的なON/OFF制御にしようと思っていますが,それぞれの方法の特徴をきちんと比較した資料は発見できなかったので,Raspberry Piのプラットフォームに適用する前提でなぜ,ON/OFF制御を選んだか比較しながら説明します.


ON/OFF制御

ON/OFF制御とは,冷却対象の回路の温度が一定以上にならないように,冷却ファンをON/OFFするだけで制御する方法.ファンに専用の電源を使わないとすると,Raspberry PiのGPIO端子の5Vをファンの電源として利用する必要があり,ON/OFF制御するスイッチの代わりとなる回路はGPIOで制御可能である必要がある.(詳細な回路図の例などは別途説明)

冷却効率としては一番最悪となるかわり,一番回路等は単純になる.



電圧制御

ファンと直列に負荷になる回路を接続することで,ファンにかかる電圧を調整し,ファンの回転数を制御する方法.ファンの回転数を下げる際に,負荷を大きくした時の消費電力の無駄が大きいのが問題.



PWM制御

参考URL : http://mfn.blog.so-net.ne.jp/2012-08-06-1
PCのファン等で用いられる方式で,PCのマザボード等から周期と幅の異なるパルス信号を入れることで,ファンの回転数を制御するインターフェース.PWM対応のファンは,PC用ぐらいしか市販では入手困難.入手する場合は,PC用で4端子のコネクタのついたファンを選べばよい.

Raspberry Piは,PWM制御に対応しているため,PWM制御に対応したファンを使えば,回転数制御自体の電力効率も良く,回路の温度に適した回転数で冷却してやることで,冷却の効率そのものも良くなる.

ただし,Raspberry Piで用いるためにはひとつ問題があり,PWM制御対応の市販のファンは基本的に12V駆動ということ.そのため,ファンのために12Vの電源回路を別に用意するか,メーカーの保証範囲外の電圧である5Vで動作するPWM対応ファンを発見するため,多数購入してあたりを探す必要がある.

さすがに,個人宅のNASサーバにそこまで行う財布もなく,12Vの配線を余分につけるのも不許可範囲なので,PWM制御は今回はパス.

もちろん,5V対応のファンを使って,5V電源で動作するPWM対応ファン互換の回路を自作すれば別.しかし,今回はとりあえずパス.


方式の絞込み

電圧制御は,電気の無駄が多すぎるのでパス.PWM制御はやはり12V問題で今回はパス.
とりあえず,最初はON/OFF制御で行い.5V動作のPWM制御対応ファンの作成は将来課題にすることとしました.


ON/OFF制御回路


https://sites.google.com/site/gpsnmeajp/raspberrypi/fancon
http://suihan74.ddo.jp/blog/raspberry-pi-cool-down-2/
http://www2u.biglobe.ne.jp/~kazuchan/jikoyuu.html



2014年9月21日日曜日

WiringPiのインストールをやってみた

WiringPiのdebファイルなんかは存在しないようなので,オリジナルサイトの手順道理にやってみた.

環境の確認


以前に,環境の最新版への更新をやっていたので,不要なはずだけど,とりあえず,手順どおりにやってみる.

gitのインストール

root@pi:/sys/class/gpio# apt-get install git-core
Reading package lists... Done
Building dependency tree      
Reading state information... Done
git-core is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
root@pi:/sys/class/gpio#

やはり,入ってた.

次に,環境の更新

root@pi:/sys/class/gpio# apt-get update;apt-get upgrade
Hit http://raspberrypi.collabora.com wheezy Release.gpg
Hit http://archive.raspberrypi.org wheezy Release.gpg
Hit http://mirrordirector.raspbian.org wheezy Release.gpg

いろいろ中抜き

Reading package lists... Done
Building dependency tree
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
root@pi:/sys/class/gpio#

というわけで,特に,更新なし.

ソースの入手

pi@pi /srv/src $ git clone git://git.drogon.net/wiringPi
Cloning into 'wiringPi'...
remote: Counting objects: 657, done.
remote: Compressing objects: 100% (599/599), done.
remote: Total 657 (delta 476), reused 95 (delta 58)
Receiving objects: 100% (657/657), 247.61 KiB | 79 KiB/s, done.
Resolving deltas: 100% (476/476), done.
pi@pi /srv/src $  cd wiringPi/
pi@pi /srv/src/wiringPi $ git pull origin
Already up-to-date.
pi@pi /srv/src/wiringPi $


ビルドとインストール

pi@pi cd wiringPi
pi@pi ./build

ビルドスクリプトでバイナリが/usr/localにインストールされてしまうのが嫌.

動作確認


pi@pi /srv/src/wiringPi $ which gpio
/usr/local/bin/gpio
pi@pi /srv/src/wiringPi $ gpio -v
gpio version: 2.20
Copyright (c) 2012-2014 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Raspberry Pi Details:
  Type: Model B+, Revision: 1.2, Memory: 512MB, Maker: Sony
pi @pi /srv/src/wiringPi $ gpio readall
 +-----+-----+---------+------+---+--B Plus--+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
 |   2 |   8 |   SDA.1 |   IN | 1 |  3 || 4  |   |      | 5V      |     |     |
 |   3 |   9 |   SCL.1 |   IN | 1 |  5 || 6  |   |      | 0v      |     |     |
 |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 1 | ALT0 | TxD     | 15  | 14  |
 |     |     |      0v |      |   |  9 || 10 | 1 | ALT0 | RxD     | 16  | 15  |
 |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 0 | IN   | GPIO. 1 | 1   | 18  |
 |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |
 |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  |
 |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
 |  10 |  12 |    MOSI |   IN | 0 | 19 || 20 |   |      | 0v      |     |     |
 |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |
 |  11 |  14 |    SCLK |   IN | 0 | 23 || 24 | 1 | IN   | CE0     | 10  | 8   |
 |     |     |      0v |      |   | 25 || 26 | 1 | IN   | CE1     | 11  | 7   |
 |   0 |  30 |   SDA.0 |   IN | 1 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |
 |   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     |
 |   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  |
 |  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     |
 |  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  |
 |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | GPIO.28 | 28  | 20  |
 |     |     |      0v |      |   | 39 || 40 | 0 | IN   | GPIO.29 | 29  | 21  |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+--B Plus--+---+------+---------+-----+-----+
pi @pi /srv/src/wiringPi $


Raspberry piと冷却ファン

すでに売っているRaspberry pi用の冷却ファンは端子の問題で使えないので,自分で作れるか調べる宿題をやってみる.

まず調べないといけない点


  • GPIOインターフェース経由で冷却ファンの電源を取る方法
  • GPIOインターフェース経由でPMW対応ファンの制御信号をすでに使う予定のある単位以外から出せるか否かの確認


調べたこと

Raspberry pi でのPWM制御の事例

Raspberry Pi + HP ProLiant G7 ML110 : ファン制御 [基板]

URL : http://mfn.blog.so-net.ne.jp/2012-08-06-1

似たようなことはやっているが,raspberry piのGPIOから電源は取得していない.あと,ファンの選択については特に記述がないのでそれを探す.


Raspberry Piの熱対策をやってみた。

URL : http://blogs.yahoo.co.jp/yama_soft/9694689.html

ファンの電源をGPIOから取得しているという意味では参考になる.でも,ファンはやはり再利用品でファン選択の参考にはならない.あと,PWM制御じゃないのでそこは参考にならない.


Raspberry Piの熱対策


URL : http://ameblo.jp/whitecomet-r205/entry-11892157028.html

上の例と同じで24時間ファンが回り続ける.単純にGPIOの5VとGNDにジャンクのファンをつないだだけ.


ファンの検索

どこにも詳しいことは書いてないので,仕方なく千石で調べてみた.

値段が安いやつで5V駆動のものを並べてみた.




大きさ,音,冷やす能力を考えると,「SHICOH F3010AP-05PCW (0310-5) DCファン(5V)」か「SHICOH F4010AN-05QCW(0410N-5) DCファン(5V)」かと.さすがに1辺あたり6cmはでかすぎる.

手持ちのケースのサイズを図ると,幅が5.5cm程度.4cm角,厚さ10mmのファンだと,横幅がギリギリなのと,失敗が許されなさそう.なんだけど,3cm角のと比べた場合に,消費電力2倍になるけど風力3倍,悩むところ.できれば4cm角のにしたいんだけど.他の部品も見てみたら,3cm角版は防振シートがなかった.

というわけで,購入希望トップは4cm角のやつとして,最後は店で相談かな.(購入予定リスト4cm角版)



勉強しないといけないこと


PMW制御を行う場合,GPIOの制御用ライブラリ「 WiringPi 」を勉強しないといけないらしい.

参考URL

  • https://projects.drogon.net/raspberry-pi/wiringpi/download-and-install/
  • http://www.sirmc.net/view/9001/
  • http://junkroom2cyberrobotics.blogspot.jp/2012/08/raspduino-raspberry-pi-gpio-1.html

Raspberry piとファンに関する調査

夏は終了したものの,来年に向けてエアコンの付いていない部屋でRaspberry piをNASとして運用した場合に,温度が問題になりそうなので,ファンを付けるつもり.

最終的には,CPUの温度でファンを制御する必要がある.

まず,ファンの種類,ファンの取り付け方法,ファンを制御するための技術的点について調べる.

レイアウト問題


以前のエントリにも書いたように,ヒートシンクや冷却ファン,GPIO経由の拡張基板の取り付けには配置上の問題がいろいろある.

Raspberry Pi Model B+用ユニバーサル基板 UB-RPI02上にスイッチサイエンスのUSBシリアル変換回路と冷却ファン用の電源端子をつけて,さらに,ヒートシンクや冷却ファンと干渉しないようにする必要がある.

サンハヤトのユニバーサル基板のページに有る図を見るとわかるように,このユニバーサル基板はリバーシブルなので,ファンやヒートシンクと干渉しないように,外付けにする(計画).

次に,ファンの選定だけど,「PiCoolFanという温度監視型ファンコントローラを使った例」(ソフトウェアエンジニアの素人電子工作さん)を発見.ただし少しお高いのと,シリアルコンソール用のGPIO端子をPiCoolFanについている制御基板の端子が使ってしまっているため断念.

以下の図は,ソフトウェアエンジニアの素人電子工作さんのページの制御基板をraspberry piに接続した場合の写真を加工したものですが,シリアルコンソールのために使いたい端子が塞がれているので,パスすることにしました.



他にぐぐると幾つかでてきますが,Just another Poor and Junk Siteさんに,ファンを取り付けた事例がのってます.

こちらの事例では,ジャンク品の12V駆動のPC用のファンを5Vで動作させています.

実現したい配置


以下の企業さんの製品ページなどの画像を活用させていただきました.

  • http://www.scythe.co.jp/faq/pwm-fan.html
  • http://www.sunhayato.co.jp/products/details.php?u=1650&id=07017
  • http://www.switch-science.com/catalog/1032/





上の図のような配置で回路を組みたいので,ファンをPWM対応にするか否か,PWM対応にする場合,制御はどのようにするのかなど調べないといけない.

Raspberry piによるPMWファンの制御(今後の宿題)


PiCoolFanを断念した理由の一つが,制御端子がUSBシリアルと被っている問題だったので,他の端子を使って,ファンをPMW制御できないか調べないといけない.

Raspberry piの今後の計画

当面の計画は以下の4種類(ハードが3,ソフトが2).これら全てが完了したら,きれいな箱かなにかに入れたい.(将来構想)

ハード


  • ヒートシンクの設置
  • 空冷ファンの取り付け
  • シリアルコンソールの常設化


ソフトウェア


  • 温度での空冷ファンの制御
  • 高温時の自動シャットダウン機能の追加


レイアウト問題


上記のソフトとハードの課題を見た時に,一番頭が痛いのはレイアウトの問題です.
Raspberry piの基板と購入してきたサンハヤトのraspberry pi用のユニバーサル基板を重ねてみるとCPUの上にかぶってしまうので,ヒートシンクをつけた上に,空冷ファンをつけると空気の流れが妨げられる危険がある.

Raspberry Pi Model B+用ユニバーサル基板 UB-RPI02このwebページにある(下の図はそのコピーです)を見るとわかるように,表向きに基板をつけるとCPUの上にかぶってしまう.

逆に,ユニバーサル基板を外側につけると接地面積が増えるし,ユニバーサル基板の印刷が使えなくなって面倒.




とりあえず,外側につけるか,ユニバーサル基板を切断する方法のいずれかで対応するつもり.

まずは,稼働実績のない,空冷ファンをつけて動作することを先に確認する予定




USBハードディスクの接続

Raspberry piを最終的にはNASとして利用するため,USBのHDDを追加した.

電力問題


以前,ノートPCのバックアップ用に利用していた1TのバッファローのUSB接続のHDDをつないでみたがうまく認識されなかった.GPIO接続のコンフィグも変えたのに. (T^T)

とりあえず,USB端子からの電力供給が不足しているという判断で以下の2つにトライ.


ソフトウェア的なUSBの電流出力の強化方法


参考URL http://akkiesoft.hatenablog.jp/entry/20140727/1406443999

上のURLに書いてある内容の大まかな内容は以下の通り

/boot/config.txtに次の内容を追加する

下のいずれかでOKのはずだけど,両方書いておいた.

safe_mode_gpio=4

max_usb_current=1

うちのHDDはこれでもだめだった.

セルフパワータイプのUSBハブを追加

金も配線の手間も,接地面積も嵩むのでやりたくなかったけど,しかたがないので実施した.
こんな時,近所に大きい電気屋が近所だと便利だ.(ヤマダ電機まで徒歩3~4分)

エレコムの4ポートUSBハブが1600円代(税抜き)だったのでそれを購入.

出力が2Aのスマートフォン用の充電器からとっていた本体の電源供給も購入したUSBハブに切り替え.これで無事に動作した.



USB HDDの設定


  • fdiskで全体を1つのLinux用パーティションに変更
  • mkfs -t ext4 /dev/sdなんとか   でファイルシステムを作成
  • /etc/fstabにエントリを追加




sambaの設定

OSは基本的にdebianと同じなので,特に変わったことはしていないのでメモ程度


/etc/samba/smb.confの変更点



  • プリンタ関係の定義はコメントアウト
  • /srvディレクトリ以下をエクスポートするため次のエントリを追加



[srv]
   comment = Srv directory
   read only = no
   locking = no
   path = /srv
   guest ok = no
   create mask=0755
   browsable=yes

うまく行かなかった点

smb.confを変更した時点でPCからアクセスできなかったので,いろいろ試すのに時間を使ったが,単にsambaレベルのユーザ追加を忘れていただけだった.

smbpasswd -a ユーザ名

が必要.



2014年9月20日土曜日

Raspberry piの設定

前回の投稿では,とりあえずブートしてネットに繋がるところぐらまでしかしてなかったので,その続き.

OSの更新


ぐぐったところ,aptでできるということなので,shellから「apt-get upgrade」でOSのバージョンアップは終了

パッケージの導入

メンテナンス作業をUSB経由のコンソールで行うこと,最終的にはNASサーバにする予定であることから,xtermパッケージ(resizeコマンドが欲しかっただけ)とsambaをインストール


コンソール利用時のresizeコマンドの嬉しさ

TeraTermでコンソールで作業していると,ウィンドウサイズを変更した時に楽しくないことが起きる.これを避けるために,resizeコマンドを使いたかったので,探してみた.(apt-fileでresizeという名前のファイルを探す.)







それと,ググった結果を合わせたところ,xtermのパッケージにresizeコマンドが入っているということだったのでxtermパッケージをインストール.






以上でめでたくresizeコマンドが利用可能.




何も考えずに,resizeコマンドを実行すると,現在利用中のコンソールの行数と列の数などが出力されるため,evalコマンドに食わせて完成.





今日は眠いのでとりあえず,ここまで.
次回はUSB-HDDをつけたりしたところを説明.



2014年9月19日金曜日

Raspberry piはじめました


じっくり編集している時間がないので,暫定公開します.(時間ができたら追記や見やすくなるなどの措置をします)

家にファイルサーバを置こうと思い,玄箱とかも考えたんだけど,結局Raspberry piにしました.購入したのはRSコンポーネンツから.RSを選んだ理由はRaspberry piが一番安いから.

RSから購入するとき注意すること

基本的にこの会社は取引先が法人であることを想定している(日本支社はそうではないが,英国本社の方針らしい)ので配送翌日だけど,週末や休日は対象外が基本になっている.金曜夕方までに頼むと,土曜配送してくれるが,金曜夕方に普通に発注すると翌週配達にされてしまうので,期日指定配達を注文時に選ばないといけない.(これでハマって,連休前に注文したので,連休明けまで佐川に留め置かれてしまった.)
佐川急便は期日指定の荷物の場合,受け取り先から期日より早くもってきて欲しいと電話しても,配達元が承認しない期日前に配達してくれない.((T^T)
次からは基本的に平日だろうがなんだろうが期日指定配達にしようと心に誓いました.

用意したもの

NASとしての利用を狙っているので,ネットワーク必須,USBポートへの給電が欲しいなどの理由からRaspberry pi B+(RSの購入ページはこちら)にしました.さらに,サーバなので「ヘッドレス運用」にするため,シリアル接続が必要.ということで,以下のものを用意しました.





ケースを店頭で買った時は,arduino等の棚にはなく,レジ前の本立ての上に載っていたので最初はわからず店員に聞きました)

とりあえず,OSの準備

今回はdebianベースのOSイメージ(RASPBIAN)をここからダウンロードしてマイクロSDカードに焼きました.


シリアル接続

FTDIのUSB接続用カードとraspberry piを接続するために,GPIOのインターフェースとUSBカードをつなぐ必要がありますが,以下の図(URLは元ネタのサイト)を参照して,ジャンパワイヤでGPIOインターフェースとUSBカードを接続しました.

http://pihw.wordpress.com/2013/01/30/sometimes-it-can-be-simple/


http://www.e-ark.jp/2013/03/04/raspberry-pi-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/


初回起動と初期設定

初回稼働時の設定変更などについてはここを参照しながら作業しました.(当然ではありますが,USBカードのドライバのインストールとTeraTermなどターミナルソフトのインストールは先にやる必要があります.)

arduinoを使った温度測定webサーバ


きっかけ

震災以来,会社で「節電要求」が厳しく,エアコンもぎりぎりまで絞られてしまい,会社の実験室が暑いため,管理部門に文句を言おうと思い,温度を自動で図る手段をarduinoで作ってみた.

実現した機能

LM35DZという温度センサーを用いて,0℃~100℃の温度をシリアルモニターに摂氏で表示させるのと,httpでのアクセスで測定結果を摂氏で答える機能を入れてみた.ついでに,設定値以上に温度がなった場合は,基板上のLEDがつきっぱなしになるようにもなっている.

参考URL

以下のようなwebの情報をみて作った.

  httpサーバおよび,温度センサ関連


  http://openhardware.gridshield.net/home/arduino-snmp-temperature-sensor
  http://d.hatena.ne.jp/a10i/20110607/1307453448
  http://homepage3.nifty.com/sudamiyako/zk/AVR_ADC/AVR_ADC.html

  pingのライブラリの情報


  http://playground.arduino.cc/Code/ICMPPing

使ったハードウェア


Arduino Ethernet R3

あちこちで売っているけど,千石電商の店頭で買ったので,リンクも千石のものARDUINO-A000068

スイッチサイエンスのUSBシリアルボード

電源供給とPCとのシリアル接続を兼ねてUSBインターフェースを追加.
FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き)

高精度IC温度センサ

これもあちこちで売っていると思うけどけど,秋月電子で買ったので,リンクも秋月のものLM35DZ

その他のパーツ(LEDなど)

他の部品は以前千石で買ったarduinoの初心者向けのパーツだけをまとめた部品キットのものを流用.ただし,キットのURLは見当たらない.

回路

arduinoでは皆がEagle CADを使っているみたいなので,それで書いた回路図からイメージファイルに変換したものを張っておきます.



Eagle CADの回路図

写真もつけておきますが,USBインターフェースは外したものになってます.


ソース

ソースコード(TemperatureWebServer.ino)は以下のようになってます.ソースが見づらいのは,また後で直します.



/*
  LM35DZを用いた温度測定(0℃~100℃)
  シリアルモニターに摂氏で表示させるのと,httpでのアクセスで答える
  参考URL
  httpサーバおよび,温度センサ関連
  http://openhardware.gridshield.net/home/arduino-snmp-temperature-sensor
  http://d.hatena.ne.jp/a10i/20110607/1307453448
  http://homepage3.nifty.com/sudamiyako/zk/AVR_ADC/AVR_ADC.html
  pingのライブラリ
  http://playground.arduino.cc/Code/ICMPPing
*/

/* 固定IP設定の時に,pingで設定を確認する機能を有効にする場合に定義する */
#define USE_PING

#include <SPI.h>
#include <Ethernet.h>
#ifdef USE_PING
#include <ICMPPing.h>
#endif /* USE_PING */

/*
 * 配線関連の定数
 */
int TempSensorPin = 0;  // センサ用のアナログI/Fは0番を利用
boolean useLED = true;  // インジケーター用LEDを用いる場合は true
/* 以下の定義は,インジケーター用のLEDを使わない場合は適当な整数で良い */
int RedPin=8;           // 赤色は8番ピン
int GreenPin=9;         // 緑色は9番ピン

/*
 * デバッグ関連
 */
boolean debugFlag=true; // デバッグ目的で,各種情報をシリアルに出力する場合は true

/*
 * 温度センサ関連の定数
 */
float v=5.0;            // MEGA2560やEthernet R3は5.0V駆動
float tempC   = 0;      // 摂氏値( ℃ )
float Threshold=28.0;   // 警告LEDをつける閾値(気温)
float offset = 0;       // センサの温度ズレを修正する変数

/*
 * ネットワーク関係の定数
 */
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0x92, 0x1A }; //アドレスは手持ちのarduinoのものに変更すること
boolean useDhcp = false; // DHCPで運用する場合は true に変更
                   // DHCPでのアドレス取得失敗時の対策や,長時間経過後のアドレス再割当て等は対応していない
/* 以下は固定IP運用の場合の変数 */
IPAddress ip(192,168,0,10);
IPAddress dnsServer(192,168,0,1);
IPAddress gatewayAddress(192,168,0,1);
IPAddress netMask(255,255,255,0);

#ifdef USE_PING
SOCKET pingSocket = 0;
char buffer [256];
#endif /* USE_PING */


/*
 * プログラム本体
 */

#ifdef USE_PING
ICMPPing ping(pingSocket, (uint16_t)random(0, 255));
#endif /* USE_PING */

EthernetServer server(80); // サーバオブジェクトの定義. 引数はポート番号

void setup()
{
  if (debugFlag) {
    // シリアル通信速度
    Serial.begin(9600);
  }
  if (useLED) {
    // LED用のピンの設定
    pinMode(RedPin,OUTPUT);
    pinMode(GreenPin,OUTPUT);
    // LEDで起動がわかるよう,短時間点灯する
    digitalWrite(RedPin,HIGH);
    digitalWrite(GreenPin,HIGH);
    delay(300);
    digitalWrite(RedPin,LOW);
    delay(300);
    digitalWrite(GreenPin,LOW);
  }
  // MACアドレスとIPアドレスの設定
  // 参考URL http://arduino.cc/en/Reference/EthernetBegin
  if (useDhcp) {
    if ((Ethernet.begin(mac)==0) && (debugFlag)) {
      Serial.println(\"Failed to configure Ethernet using DHCP\");
    }
  } else {
    Ethernet.begin(mac, ip, dnsServer, gatewayAddress, netMask);
#ifdef USE_PING
    // ルータのアドレスにping
    // 参考URL http://playground.arduino.cc/Code/ICMPPing
    Serial.println(\"Manual ip confuguration of ethernet\");
    ICMPEchoReply echoReply = ping(gatewayAddress, 4);
    if (debugFlag) {
      if (echoReply.status == SUCCESS) {
        Serial.println(\"Ping to Gateway address : success\");
      } else {
        Serial.println(\"Ping to Gateway address : fail\");
      }
    }
#endif /* USE_PING */
  }
  if (debugFlag) {
    // IPアドレスのシリアルへの出力
    Serial.println(\"IP address of Ethernet Interface\");
    Serial.println(Ethernet.localIP());
  }
  if (debugFlag) {
    // 温度センサの温度取得テスト
    Serial.println(\"testing temperature sensor : start\");
    float temperature = getTemperature(TempSensorPin,false);
    Serial.println(\"testing temperature sensor : done\");
  }
  // サーバの実行
  server.begin();
}

void loop()
{
  // 接続してきたクライアントを示すオブジェクトを生成
  EthernetClient client = server.available();
  if (client) {
    if (debugFlag) {
      Serial.println(\"Connection established by a client\");
    }
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read(); //一文字読み取り
        // if you\'ve gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == \'\\n\' && currentLineIsBlank) {
          // send a standard http response header
          client.println(\"HTTP/1.1 200 OK\");
          client.println(\"Content-Type: text/html\");
          client.println();
          
          // 温度読み取り  
          float temperature = getTemperature(TempSensorPin,useLED);
        
          client.print(\"Temperature: \");
          client.print(temperature);
          client.print(\" degrees Celsius\");
          client.println(\"<br />\");
          break;
        }
        if (c == \'\\n\') {
          // you\'re starting a new line
          currentLineIsBlank = true;
        } 
        else if (c != \'\\r\') {
          // you\'ve gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
  }
}

//
// 温度読み取り関数
//
float getTemperature(int pin,int ledFlag){
  float tmp;
  if (ledFlag) {
    digitalWrite(GreenPin,HIGH);
    delay(500);
  }
  tmp = analogRead( pin );
  tmp = ((v * tmp) / 1024) * 100;
  tmp = tmp + offset;
  if (debugFlag) {
    // 温度のシリアルへの出力
    Serial.println(\"temperature is\");
    Serial.println(tmp);
  }
  if (useLED) {
    digitalWrite(GreenPin,LOW);
    if (tmp > Threshold ) {
      digitalWrite(RedPin,HIGH);
    } else {
      digitalWrite(RedPin,LOW);
    }
  }
  return tmp;
}