2015年6月3日水曜日

RaspberryPi2同士でシリアル通信

RaspberryPi2は、起動時にHDMI経由でモニターに繋いでセットアップしますよね?
はっきり言って面倒です。

よく考えたら、普通のLinuxなりBSDが動く訳ですから、シリアル接続してminicomで繋げばモニター不要じゃない?
という訳でやってみました。

※もっと面倒だって思うでしょうが、そんな大人の意見はあえて聞きません。

必要なモノはこちら。

1.ラズパイ2台(今回はみんな大好きRaspbianを使用)
2.ジャンパーコード(メス-メス)を3本
参考までに、秋月さんのページ。

ジャンパーコードで、以下のようにラズパイ2台をつなぐのです。

PIN#6(Ground) - PIN#6(Ground)
PIN#8(TX) - PIN#10(RX)
PIN#10(RX) - PIN#8(TX)

ピン番号はこちらを参考にどうぞ。

なお、シリアルコンソールは「/dev/ttyAMA0」になります。

次は、OSをインストールしたという前提で、シリアルコンソール出力を見たいラズパイにminicomをインストールします。
# apt-get update
# apt-get install minicom

「/boot/cmdline.txt」を編集します。「console=ttyAMA0,115200」を消して保存します。
# vi /boot/cmdline.txt
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

「/etc/inittab」の最後の行をコメントアウトします。
# vi /etc/inittab
 #T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

終わったら一旦再起動します。
再起動後、minicomで接続すると、シリアルコンソールから見ることができます。
# minicom -b 115200 -o -D /dev/ttyAMA0

終了したい場合は、「CTRL-a」を押して「q」で、プロンプトに「YES」と答えます。

お試しあれ。

PHP + MySQLのフェイルオーバー(mysqlnd_msを使う)

PHPをお使いの方、mysqlnd_msというPECL拡張モジュールをご存知でしょうか?
http://php.net/manual/ja/book.mysqlnd-ms.php

mysqlndを使って、レプリケーションやロードバランシングするモジュールです。
以前取り上げたPerconaなどのMySQLマルチマスタレプリケーションを組み合わせると、
お手軽にフェイルオーバー構成が出来ちゃいます。(もちろん自己責任で!!!!!)

CentOS7でのインストール方法は以下の通りです。
# yum -y install php_mysqlnd
# pecl install mysqlnd_ms

インストール後、モジュールの読み込みに必要な設定をphp.iniまたは設定ファイルに記述します。
CentOS7なので、「/etc/php.d/」の下に「mysqlnd_ms.ini」と名前をつけて保存します。
内容は下記の通りです。
extension=json.so
extension=mysqlnd.so
extension=mysqlnd_ms.so
mysqlnd_ms.enable = 1
mysqlnd_ms.disable_rw_split = 1
mysqlnd_ms.force_config_usage = 1
mysqlnd_ms.multi_master = 1
mysqlnd_ms.config_file = "/etc/mysqlnd_ms.json"

なお、json.soは、後ほどコマンドラインで実行するために追記しています。
今回はマルチマスタ構成なので、mysqlnd_ms.multi_master=1としています。
mysqlnd_ms.config_fileには、設定ファイル(JSON形式)の絶対パスを記述します。

設定ファイルはこのようにしました。
{
  "myapp": {
    "master": {
      "master_1": {
        "host": "10.0.0.6",
        "port": "3306"
      },
      "master_2": {
        "host": "10.0.0.7",
        "port": "3306"
      }
    },
    "slave": {},
    "filters": { "roundrobin": [] },
    "failover": { "strategy": "loop_before_master", "remember_failed": true }
  }
}

"myapp"は、mysqli関数を呼ぶ際にホスト名の代わりに入力する文字列です。後ほどPHPのサンプルを確認してください。
マルチマスタなので、masterの中にmaster_1、master_2と記述があります。
2台のサーバーへラウンドロビンで接続するので、"filters"に"roundrobin"を設定します。
ここまで設定してhttpdを再起動すると、phpinfoでmysqlnd_msの設定が反映されます。

そして、実験用PHPプログラムはこちらです。nameに$iを入れて10回ループします。
$mysqli = new mysqli("myapp", "username", "password", "testdb");

for ($i=0; $i<10 i="" p="">
  echo $mysqli->query("insert into test(name) values('".$i."');") . "\n";
}

$mysqli->close();

今回は、無停止で動作するとわかりにくいので、独立した2台のMySQLサーバーにデータを書き込んで確認してみます。

最初は2台とも動作している場合です。5件ずつ交互にデータが追加されています。
# php -c /etc/php.d/mysqlnd_ms.ini test.php
# mysql -u username -h 10.0.0.6 -p test.db
Enter password:

> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | 0    |
|  2 | 2    |
|  3 | 4    |
|  4 | 6    |
|  5 | 8    |
+----+------+
5 rows in set (0.00 sec)

> exit
# mysql -u username -h 10.0.0.7 -p test.db
Enter password:

> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | 1    |
|  2 | 3    |
|  3 | 5    |
|  4 | 7    |
|  5 | 9    |
+----+------+
5 rows in set (0.00 sec)

> exit


master_1を停止して実行してみましょう。master_1が停止しているので、master_2に10件追加されています。
# php -c /etc/php.d/mysqlnd_ms.ini test.php
# mysql -u username -h 10.0.0.6 -p test.db
Enter password:

> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | 0    |
|  2 | 2    |
|  3 | 4    |
|  4 | 6    |
|  5 | 8    |
+----+------+
5 rows in set (0.00 sec)

> exit
# mysql -u username -h 10.0.0.7 -p test.db
Enter password:

> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | 1    |
|  2 | 3    |
|  3 | 5    |
|  4 | 7    |
|  5 | 9    |
|  6 | 0    |
|  7 | 1    |
|  8 | 2    |
|  9 | 3    |
| 10 | 4    |
| 11 | 5    |
| 12 | 6    |
| 13 | 7    |
| 14 | 8    |
| 15 | 9    |
+----+------+
15 rows in set (0.00 sec)

> exit


master_2を停止して実行してみましょう。master_2が停止しているので、master_1に10件追加されています。
# php -c /etc/php.d/mysqlnd_ms.ini test.php
# mysql -u username -h 10.0.0.6 -p test.db
Enter password:

> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | 0    |
|  2 | 2    |
|  3 | 4    |
|  4 | 6    |
|  5 | 8    |
|  6 | 0    |
|  7 | 1    |
|  8 | 2    |
|  9 | 3    |
| 10 | 4    |
| 11 | 5    |
| 12 | 6    |
| 13 | 7    |
| 14 | 8    |
| 15 | 9    |
+----+------+
15 rows in set (0.00 sec)

> exit
# mysql -u username -h 10.0.0.7 -p test.db
Enter password:

> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | 1    |
|  2 | 3    |
|  3 | 5    |
|  4 | 7    |
|  5 | 9    |
|  6 | 0    |
|  7 | 1    |
|  8 | 2    |
|  9 | 3    |
| 10 | 4    |
| 11 | 5    |
| 12 | 6    |
| 13 | 7    |
| 14 | 8    |
| 15 | 9    |
+----+------+
15 rows in set (0.00 sec)

> exit


最後に、2台とも動かして実行してみましょう。5件ずつ追加されています。
# php -c /etc/php.d/mysqlnd_ms.ini test.php
# mysql -u username -h 10.0.0.6 -p test.db
Enter password:

> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | 0    |
|  2 | 2    |
|  3 | 4    |
|  4 | 6    |
|  5 | 8    |
|  6 | 0    |
|  7 | 1    |
|  8 | 2    |
|  9 | 3    |
| 10 | 4    |
| 11 | 5    |
| 12 | 6    |
| 13 | 7    |
| 14 | 8    |
| 15 | 9    |
| 16 | 0    |
| 17 | 2    |
| 18 | 4    |
| 19 | 6    |
| 20 | 8    |
+----+------+
20 rows in set (0.01 sec)

> exit
# mysql -u username -h 10.0.0.7 -p test.db
Enter password:

> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | 1    |
|  2 | 3    |
|  3 | 5    |
|  4 | 7    |
|  5 | 9    |
|  6 | 0    |
|  7 | 1    |
|  8 | 2    |
|  9 | 3    |
| 10 | 4    |
| 11 | 5    |
| 12 | 6    |
| 13 | 7    |
| 14 | 8    |
| 15 | 9    |
| 16 | 1    |
| 17 | 3    |
| 18 | 5    |
| 19 | 7    |
| 20 | 9    |
+----+------+
20 rows in set (0.00 sec)

> exit


PHPプログラムの接続時のホスト名のみ変更するだけで、プログラム自体を変更することなく導入できることがわかってもらえたかと思います。

なお、WindowsでもDLLがコンパイルできれば利用可能なようです。
http://php.net/manual/ja/install.windows.building.php

※追記 2015/06/03
こちらから各バージョン用DLLがダウンロードできます。
http://pecl.php.net/package/mysqlnd_ms/1.5.2/windows

なお、ドライバが対応しているので、mysqli関数のみならず、PDOやmysql関数からも利用できます。
http://php.net/manual/ja/mysqlnd-ms.quickstart.usage.php

お手軽にできるという点で、試してみる価値はあると思います。



2015年5月31日日曜日

Windows10 IoT Core でLチカ(Windows10 + VisualStudio2015じゃん...)

せっかくWindows10 IoT Coreを準備したので、GPIOを使ったLチカでもやってみましょう。

ブレッドボードの上はこんな感じです。

オレンジ色のケーブルは#01のピン(3.3v)に、黒のケーブルは#29のピン(GPIO05)に接続します。
詳しくはこちらでピンの詳細を確認しましょう。
http://www.element14.com/community/servlet/JiveServlet/previewBody/73950-102-4-309126/GPIO_Pi2.png

開発はWindows10+VisualStudio2015で行います。

File->New->Project を選択し、VisualC#->Windows->Window Universalから「Blank App」を選びます。
あとは、Referencesに「Windows IoT Extension SDK」を追加して、以下のソース(MainPage.xaml.cs)をコンパイル、実行します。

----- MainPage.xaml.cs -----
using Windows.UI.Xml.Controls;
using Windows.Devices.Gpio;

namespace App1
{
  public sealed partial class MainPage : Page
  {
    // Raspberry Pi 2 の GPIOのピン番号
    private const int LED_PIN = 5;
    public MainPage()
    {
      this.InitializeComponent();
      this.InitGPIO();
    }
    private void InitGPIO()
    {
      var gpio = GpioController.GetDefault();
      // GPIO#05のピンに接続
      var pin = gpio.OpenPin(LED_PIN);
      // 出力モードにセット
      p.SetDriveMode(GpioPinDriveMode.Output);
      // 05をLowにすると電流が流れてLEDが光るのでLowにセット
      p.Write(GpioPinValue.Low);
    }
  }
}
--------------------------------------

コンパイルする場合は、ターゲットを「ARM」に、Remote Machineにセットして実行しましょう。
アプリがRaspberryPi2に転送されたらLEDが点灯します。

ピンを選んで、データ入力を読み込む/データを出力する、という流れで開発するというのは分かりやすいかと思います。

あとは、Taskを使って点滅させたり、いろいろ遊べるかと。

WinRMでログインしたシェルから、コマンドでGPIOを直接いじれると、より柔軟に開発できるんじゃないかと思いましたので、その辺は次のバージョンに期待でしょうか。

2015年5月20日水曜日

FlashAir プロトタイピングボード MTO-EV101でLチカしてみる

FlashAirで直接GPIOを制御できるので、FlashAirハッカソンで入手したMTO-EV101を使ってブレッドボード上のLEDを点滅させてみます。
もちろんLuaです。

その前に、ハードが苦手な私は四苦八苦しましたので、こちらで確認を。
http://yone2.net/MTO-EV101

DAT1からブレッドボードへ、そこからGNDへ接続します。
実際はこんな感じです。



LuaからLEDを5回点滅させるためには、以下のようにします。
for i=0, 4, 1 do
  s,id=fa.pio(0x1f,0x00)
  sleep(100)
  s,id=fa.pio(0x1f,0x1f)
  sleep(100)
end

ビットの割り当てはこちらで。
今回は面倒なので、全ビットをオン/オフしてます...

このプログラムを動かすと、この動画のようになります。

もちろん、読み込みもいけます。
実は、人感センサーで値を読み込むこともできてるので、その辺は後ほど。

消費電力が小さくWi-Fi機能があるので、FlashAirはもっといろんな場所で使えそうですね。


2015年5月18日月曜日

Windows10 IoT Core搭載ラズパイ2をWebブラウズ専用機にする

Windows、それは私からもっとも遠いOS。
しかし、IoT云うなら避けて通れないということで、
Windows10 IoT をWebブラウズ専用機にできないかと。

もちろん、Visual Studio は申し訳ないが死ぬほど使いにくいので、
以下のブログをまるごと参考にして、XAMLにWebView貼って表示です。
http://www.moonmile.net/blog/archives/7071

出来上がったスクショがこれ。


TextBoxにURLを入れて、ボタン押して読み込むだけ。
確かに動いてる。
Flashのバナーも動いてるw

しかし、ここで大きな落とし穴が。
IMEどうやって使うんだ?
Windows10 IoT Core でIME動くのか?

うーん...



2015年5月12日火曜日

Visual Studio Code + mono で、Webサーバーがシャットダウンできない

地味な小ネタです。

AppleWatchやらドローンやらIoTっちゅーかFlashAirやらインフラやらの合間に、
MacOSX に Visual Studio Code を入れてみました。

このサイトが一番確実ですね。
http://qiita.com/TsuyoshiUshio@github/items/48d28d123239fea4c42d

で、このサイトのチュートリアルを進めていったんですが、
https://code.visualstudio.com/Docs/codebasics

kestrel(開発用Webサーバー)をシャットダウンする方法が見当たらない。

そんなときは、「control + z」で停止して、monoプロセスをkillします。
なんと原始的なw

2015年5月11日月曜日

AppleWatch買って思ったこと

まだ2000年の頃、周りに「パソコンからキーボードとマウスを無くさないとダメだ」と言ってきた。
パソコンの画面が机の上のメタファー「デスクトップ」なら、書類を手に取り書き込んで、ポストに投げるようにメールに添付して相手に送信し、ポイっとゴミ箱に捨てる。
オフィスをコンピューターに再現するなら、隣り合ったパソコンのデスクトップをレイアウトした仮想空間があってもいいだろう。

それから15年たって、キーボードやマウスを必要とする割合は減ってきた。
携帯が普及し、iPhoneが登場し、iPad以降安価なパソコンはタブレットへ。
机の上にあった書類は、今やクラウドへ。

そしてAppleWatch。
もちろんスマートウォッチは以前からも出ているが、Appleが出したことでそれなりに知名度を得ていくジャンル。
買ってしばらく使ってみて、なかなかの発見があった。

そもそも、クラウドが登場して以降、このような全体像をある程度のゴールとして定義することができるだろう。



自動的にある程度のデータを取得してクラウドに集約し、手元のデバイスをビューワーとしてみるアレだ。

AppleWatchを使って気づいたことというのは、ビューワーにどのぐらいの情報量があればいいのか、だ。
メッセージなどの着信は、最低限の事柄(誰から、内容のサマリー、など)がわかれば良いとすると、今までスマホを取り出して見てたときと比べると、あっという間に確認できてしまう。
その程度の情報、というとアレかもしれないが、これで事足りる場面が多いと感じた。

メガネをまったく付けない自分は、GoogleGlassなどのメガネ型デバイスは正直不快だったのだけれども、腕時計ならOKかなーと。

今後の期待するポイントは、心拍数以外のあらゆるバイタルサインのリアルタイム計測だろうか?
脳波なども皮膚の電気信号から計測できるので、いろいろ期待しちゃうところでしょうか。