3Dプリンター(8)2015年11月19日

3Dプリント・サーバー

ArduinoやRaspberry Piをいじってきましたが、3Dプリンターでそれらを全て使用することになりました。なんか嬉しくなります。

以前なら購入していたRaspberry Pi B+のケースを作りました。オープンなデザインがいっぱいあります。ケースの肉厚が薄いので印刷時の設定で100% infillで印刷しなければいけなかったのですが70% infillで印刷してしまいました。ちょっとスカスカして弱い感じがします。今度時間のあるときにでも印刷し直そうかと考えています。

ベースOSにRaspbianをインストールし、octoprintをインストールして3Dプリンターのプリントサーバーに仕上げました。

Raspberry Piのネットワークは無線LANで設定したので電源さえあればどこでも動作できるので機動性が増しました。消費電流は0.5A程度ですからモバイルバッテリーでも動作できるのですが印刷時間を考えるとバッテリーが持つかどうか難しいところです。なによりoctoprintはタブレットでも操作できるのでなかなか重宝しています。操作できる機能はもprintrunより優れていると感じています。(個人の感想です)

3Dプリンター用に300WATX電源を使用していますが、PC用の電源からはいろいろな電圧が出力されています。もちろんRaspberry Piが使用する5Vも出力されています。赤色の線は5Vですが、ATX電源の電源スイッチを切ると出力されません。3Dプリンターの電源スイッチを切るとRaspberry Piも電源が切れてしまいます。これではちょっと不便です。しかし、ATX電源には5VSB(スタンバイ)という出力があり、電源スイッチの状態に関係なく常に5V 2Aが出力されています。これを利用すればRaspberry Pi用の電源を別に用意する必要がなくなり、不用意に電源を切ってしまうこともありません。マザーボードに接続する20ピンまたは24ピンのATXコネクター配線の中に紫色の線を探してください。この線と黒色の線(グランド)間には電源スイッチに関係なく常に5Vが出力されています。そこにUSB A-typeコネクターを取り付け、適当な大きさのケースを作成すればRaspberry Piが利用できるUSB電源が完成です。Raspberry Piを接続する前にテスターで電圧、極性をチェックしてください。過電圧や逆極性で接続するとRaspberry Piを壊しますので注意してください。

Raspberry PiのGPIO利用2015年06月21日

Raspberry Pi2 B、B+でI2C接続LCD、RTC

Raspberry PiならIntel PCにはないGPIO(汎用入出力)端子があります。その中には単なるON/OFF動作だけではなく特定の用途に特化した端子があります。1-wire、I2C、SPI、シリアルインターフェースです。詳細はこちらで。1-wire温度センサーで取得した温度データでグラフがかけましたがやっぱり現在の温度をキャラクターLCDに表示したくなりました。Raspberry Piなら簡単にキャラクターLCDを接続することができます。

  • 16桁2行のキャラクターLCD
I2C接続LCDは以前紹介したI2CインターフェースIC PCF8574を使用した16桁2行のキャラクターLCDを使用しました。表示プログラムはlcdi2cというプログラムを見つけました。shellからLCDに文字を表示することができます。日時を表示するshellスクリプトと温度を表示するshellスクリプトを作成しました。
  • リアルタイムクロックモジュール
Raspberry Piはボード上にはクロックモジュールを持っていないためNTPサーバーから正確な時刻データを取得してシステム時間を合わせています。Arduinoに接続していた秋月のリアルタイムクロック(RTC)モジュールを接続してみました。これでネットワークに接続されていない状態でも正確にシステム時間を合わせられます。時刻合わせはhwclockコマンドでできるように設定します。
時計モジュールをRaspbian OSで管理する
・Raspberry Pi2 Bではhwclockが素直に動いてくれません。
 こちらを参照してください。コンパイルしたhwclockは
 エラーなく動作しました。
  • GPIO(汎用入出力)端子を使う
センサー類は1-wire、I2CやSPIインターフェースを使用して接続しますが、スイッチのON/OFFを読み取ったり、LEDを点滅させたりするためにはGPIO(汎用入出力)端子を使用します。何かをするためにはそれなりの物理的なインターフェースが必要ですのでそれを考えることにします。GPIO端子には何も保護回路が入っていませんのでブレッドボードなどで回路をいじる場合はには注意してください。特に電源電圧(3.3V)と+-極性には注意が必要です。最悪、ボードを壊します。
GPIOを操作したり、GPIOから状態を読み取ったりするソフトウエアはファイルにアクセスする要領でアクセスできます。
// GPIO24 を使うという指示
$ echo 24 > /sys/class/gpio/export

// 入出力の設定
$ echo out > /sys/class/gpio/gpio24/direction

// ONは1 OFFは0をvalueに書き込む
$ echo 1 > /sys/class/gpio/gpio24/value
$ echo 0 > /sys/class/gpio/gpio24/value

// GPIO24の開放
$ echo 24 > /sys/class/gpio/unexport
shellで直接実行させる場合の例です。GPIO24に接続したLEDを点灯させ、そして消灯しています。このような具合です。
echo 22 > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio22/direction
echo "low" > /sys/class/gpio/gpio22/direction

#5秒間押されるまで待つ
cnt=0
while [ $cnt -lt 5 ] ; do
  data=`cat /sys/class/gpio/gpio22/value`
  if [ "$data" -eq "1" ] ; then
    cnt=`expr $cnt + 1`
  else
    cnt=0
  fi
  sleep 1
done
echo "End of script...."

$ echo 22 > /sys/class/gpio/unexport
スイッチを読み取る場合はもうちょっと複雑です。サンプルプログラムは5秒の長押しを検出して終了します。でも通常はアプリが必要とするあいだ常時、スイッチのON/OFF状態を監視し状態に応じた処理を行う必要があります。ArduinoならLoopさせれば済みますが、Raspberry PiではLoopさせたら他のプログラムに影響が出てしまいます。割り込み→イベント→非同期フロー処理ができると良いのですが。node.js + onoff.js + async の環境で実現できそうです。onoff.jsのサンプルフォルダーの中にlight-switch.jsというのがありました。
"use strict";

var Gpio = require('../onoff').Gpio,
  led = new Gpio(25, 'out'),
  button = new Gpio(21, 'in', 'both');

function exit() {
  led.unexport();
  button.unexport();
  process.exit();
}

button.watch(function (err, value) {
  if (err) {
    throw err;
  }

  led.writeSync(value);
});

process.on('SIGINT', exit);
このスクリプトはGPIO#21にプルダウンしたタクトスイッチをGPIO#25に電流制限抵抗とLEDを接続して、スイッチが押された時だけLEDを点灯させるといったスクリプトになっています。LEDの代わりにソリッド・ステート・リレー(SSR)キットなどを接続すればAC100Vの機器をON/OFFできます。

あると便利なアイテムを探してみました。

サーバーがダウン2015年06月01日

Raspberry Pi 2 BでSoftEther VPNサーバー

長年使っていたCentOSのIntelサーバーがCPU温度の異常でダウンしてしまいました。IP PBX(Asterisk)はRasPBXに移行中だったので幸いにも復旧しています。SoftEtherサーバーはせっかく調子よく動き始めたところでしたのでちょっとショックです。5年以上動いてくれたでしょうか。SofutEther VPNが動いてくれればいいので早々RSにRaspberry Pi 2 Bを注文しました。折を見てIntelサーバーは復旧させることとしましょう。Raspberry Pi 2 BはRaspberry Pi B+とサイズや部品の配置は殆ど変わりませんが、レジストのロゴが小さい、CPUが700 MHz / ARM1176JZF-S 1コアから900MHz / ARM Cortex-A7 4コアに強化変更され、メモリーも倍の1GBに増強されたバージョンです。MicrosoftもWindows10でサポートを表明しているバージョンになります。
このボードコンピューターにOSとしてLinux Raspbian、SoftEther VPNサーバーnode.jsをインストールしました。DDNSの定期更新shellも入れています。BBルーターの変更とVPNサーバーの稼働で外からインターネット経由で自宅のネットワークに入れるようになりました。IP電話も接続OKですし、これでネットワーク接続の機器制御も可能です。
SDカードをストレージとしている機器でサーバーは無茶だとは思いますがSDカードイメージをバックアップしておけば簡単に復旧できるので手軽さを優先しています。Intelサーバーの修理が終わるまでと割り切っていますが、Raspberry Piだとファンレスなので静かなんです。裸では不安なので一緒にクリアケースも注文しました。

Raspberry Pi は起動ディスクとしてSDカードを使用します。東芝製の8GB SD Class10 40MB/sを使用していますが、ノーブランドの8GB Class10 SDカードではShutdown後にSDカードを取り出しているにもかかわらずファイルが破損するという事象が発生しています。書き込み速度が遅いことが原因?

BBルーターをBUFFALO製の無線LANルーターWHR-1166DHPに交換しました。SSL VPN、L2TP IPsec両接続に対応させるためでしたが、結果としてはインターネットアクセスも速くなりました。無線LANも2.4GHzと5GHz帯両対応になり、11acにも対応しました。これで目標のLANとVPN環境は整ったかな。

Raspberry Piを電話交換機にする。2015年05月24日

Raspberry Pi B+とRasPBXでIP電話交換機

Raspberry Piの詳細はウィキペディアなどを参照してください。85.60 mm × 56.5 mmサイズの手のひらに乗るワンボードコンピューターです。数種類のLinux OSが用意されていますのでSDカードを作製して電源を入れると立ち上がります。HDMI端子にLCDを接続すればXwindowも起動します。有線LAN、USB 4個、その他GPIO端子もあります。
今回はRasPBXというプロジェクトのLinux OS (Raspbian) に contains Asterisk 11 と FreePBX 12 がプレインストールされたものを使用します。PBXの設定と管理はFreePBXで行い、インストール後は外線設定と電話機設定を入れるだけ使用することができます。実際には自宅の環境にマッチした設定しなければなりません。configファイルを直接いじってきた身としてはFreePBXの設定は慣れるまで結構大変です。

  • 内線電話機を設定する
    5台分の内線電話機を設定します。FreePBXの内線設定はApplications - ExtensionsでGeneric CHAN SIP Deviceを追加します。Voice Mailを使用する場合はここで設定します。

  • NTTひかり電話を設定する
    一番肝心なところです。これができないとPBXを容れる意味無いですから。しかし、ひかり電話を収容するにはもう一つLANが必要ですのでUSB接続のNICを探してきました。ELECOMのLAN-TXU2Cというアダプターです。/etc/network/interfacesにeth1を追加してRebootすると簡単に認識します。
    FreePBXの設定はConnectivity - TrunksでSIP(chan_sip) Trunkを追加します。PR-200NE側で設定したusername、内線番号、パスワードを設定します。
    また、本機のMACアドレスをPR-200NEの使用する内線番号に設定します。

  • InBound RoutesとOutBound Routesの設定
    0発信設定などはOutBound Routesに設定します。

  • ダイヤルプランを設定する
    一番難しいところですがとりあえず外線からの着信は200番台の内線電話機をCallするようにRingグループを作成し、InBound Routesに設定します。

  • 参照したサイト
    Raspberry Piでひかり電話を持ち歩こう①~③
    voip-info.jp FreePBX
    FreePBX:5:トランク:ひかり電話(ホーム)
ここまでの設定でひかり電話を使用した発着信と、内線電話機間での通話はできるようになりました。その他に設定しなければいけないのはパーク保留と保留音、三者通話設定、IVR設定、エージェント登録、最終的にはAMIマネージャーとの連携をできるExtensionsを作成することです。