Category Archives: Raspberry Pi

a Respberry Pi MQTT sample

MQTTのPublisher(リモコン)からのメッセージは、MQTTのbrokerを経由して、自宅Raspberry Pi にMQTTのSubscriber(受信機)受信し、液晶表示盤にテキスト表示、LEDバックライトのON/OFFするできた!

MQTTのbrokerはsango(時雨堂という会社が無償提供) MQTT サーバーを利用。

MQTTのPublisher(リモコン)は、MQTTLens利用。

MQTTのSubscriber(受信機)サンプルコード!

var fs = require('fs');
var mqtt = require("mqtt"),
    config = require("./config.json"),
    client = mqtt.createClient(config.port, config.host, config.options);
var exec = require('child_process').exec,
    child;

client.subscribe(config.topic + "/#");

client.on("message", function(topic, message) {
                console.log(topic, message.toString());

                switch (topic){
                case 'chen420@github/led':
                command = (message!='0'?1:0);

                fs.writeFileSync('/sys/class/gpio/export', 9);
                fs.writeFileSync('/sys/class/gpio/gpio9/direction', 'out');
                fs.writeFileSync('/sys/class/gpio/gpio9/value', command);
                fs.writeFileSync('/sys/class/gpio/unexport', 9);
                break;

                case 'chen420@github/lcd':
                child = exec('/usr/local/bin/lcdprint ' + message,
                        function (error, stdout, stderr) {
                        // console.log('stdout: ' + stdout);
                        // console.log('stderr: ' + stderr);
                        if (error !== null) {
                        console.log('exec error: ' + error);
                        }
                        });
                break;
                }
}
);

参考文献の設定ファイルを利用した。LEDバックライトは、gpio 9番に設定、テキスト表示は、PCD8544-utils のlcdprint コマンドを利用した。

Subscriber の実行:

$ node mqtt-led.js

MQTTブローカーのそれぞれTopicに メッセージが下記の動作が発生

  • chen420@github/led | 0 または1 | バックライトのON/OFF
  • chen420@github/lcd | ”表示メッセージ” | 表示

Subscriberの永続化(サービスとして動く)が次の課題に。

参考文献 : 肩に乗せてもらった巨人達

Raspberry PiでMQTT通して連携

この数週間Raspberry PiにによりHome Automationなどを再考して、Node.js、WebIOPiなど、サーバとして可能性を調べているが、なぜかMQTTに出会って、実装までして、全く違う方向へ進行した。

先週たまたま Ruby – Raspberry Pi で室内の温度を可視化するよー – Qiita 記事を見て、「Sango を介して(MQTT で)結果を Graphite に飛ばす」とはなにか、調べてみた。

MQTTは、M2MやIoT向けの軽量プロトコル。いろいろとメリットあるが、Raspberry PiでMQTT通して連携するメリット考えると

  1. ルータに穴を開ける必要がない
  2. サーバ公開する必要がない
  3. セッション維持する必要がない
  4. 重いHTTPサーバもつ必要がない

実は2年前も自宅に、Raspberry Pi wireless 温度計の制作 をしたが、サーバ公開してないので、外から見れない。もちらん公開する方法もあるが、自宅サーバ際クラウドへ移転などするので、Raspberry PiだけのためにDDNSメンテナンスする気がならない。MQTTならブローカーに繋がれば、いろいろ連携プレーが考えられる。

早速自宅温度データをSango にPubして、他所からSubで見れるようになった。

それからMQTTを通して、自宅Raspberry Piの液晶表示版にテキスト表示、LEDバックライトのON/OFFもできた!

これから、MQTTのメッセージをMongoDBに保存、Google spreadsheetsに保存、グラフ表示、plot.lyのグラフ表示など、やってみたいと思う。

そうそう、AppInventorから、MQTTを通して、Raspberry Piの状態表示、GPIOのコントロールもしてみたい。

Raspberry Pi 液晶表示盤のLED制御

数か月前、Raspberry Pi に液晶表示盤を付けたが、バックライトのLEDは常にONのため、夜は眩しい。GPIOからON/OFF制御可能にしたい。

回路図がないのため、ネットでいろいろ調べて、バックライトのLEDは、GPIOに繋ぐと、3.3V に直結したタイプあるそうです。

WebIOPiをインストールして、ブラウザから、すべてGPIO端子ON/OFFして見たが、バックライトのLEDがON/OFF現象が認めない。つまり、購入したものは3.3V に直結したタイプらしい。

基盤の結線を探し、切断してGPIOにつなぎ直し方法もあるが、なかなか決心とタイミングが必要ね。

たまたま液晶表示盤は、PCD8544 LCD使うらしい。そのPCD8544の制御方法を探す際、PCD8544-utils ( https://github.com/acidum/PCD8544-utils )見つかり、おまけに、液晶表示盤改造でバックライトのLED制御する方法まで書いた。小さな抵抗を溶かして、180度回転し、ジャンパー線でコネックターまで繋ぐ方法。

タイミングを見て、改造に取り込んだ。特に上記URLに説明した凹みを作って結線することなく。ケース入りだからそのまま結線でも問題ないと。

2015-04-27 21.51.582015-04-27 21.52.45

結線の正面と裏面、遂に成功した。手元に結線がなく、古い結線付きコネックターの結線をカットして再利用。

2015-04-27 21.51.58

近眼鏡と虫眼鏡の組み合わせて些細作業を進み、一度小さな抵抗が跳ねて見失い、諦めかけた時もあった。

2015-04-27 21.56.23

セット組み直して、WebIOPiから、21番PIN(GPIO9)のON/OFFで、バックライトのLEDがON/OFFが確認した。

これてRaspberry Piに状態変更があるとき、メッセージが届いたとき、バックライトのON/OFF、Blinkなどで表現する手法も増えた。

 

参考文献 肩に乗せてもらった巨人達:

Raspberry PiにWebIOPiをインストール

Raspberry PiのGPIOをブラウザから操作したいので、WebIOPiをインストールした。

まずパッケージをダウンロードして、解凍、セットアップ

1)sudo wget http://webiopi.googlecode.com/files/WebIOPi-0.6.0.tar.gz

2)tar xvzf WebIOPi-0.6.0.tar.gz

3)cd WebIOPi-0.6.0

4)sudo ./setup.sh

インストール終わったら、下記のメッセージが表示。Python のライブラリーがあり、細かい制御可能。またREST APIは下記にまとまっている。
RESTAPI – webiopi – Internet of Things framework – Google Project Hosting

REST APIなので、いつかApache/phpで制御する仕組みをやってみようと思う。

WebIOPi successfully installed
* To start WebIOPi foreground   : sudo webiopi [-h] [-c config] [-l log] [-s script] [-d] [port]
* To start WebIOPi background   : sudo /etc/init.d/webiopi start
* To start WebIOPi at boot      : sudo update-rc.d webiopi defaults
* Look in /home/chen/WebIOPi-0.6.0/examples for Python library usage examples

起動させる

5)sudo /etc/init.d/webiopi status

6)sudo /etc/init.d/webiopi start

ブラウザからアクセスする

7)http://raspbian-ip:8000/ for log in from other computer

8)http://localhost:8000/ for log in from Raspian itself

9)user name=webiopi and password=raspberry

image

ここで GPIO Header を開くと、実物順のRaspberry Pi GPIO表示され、適当に設定可能。

image

GPIO Listをクリックすると、Raspberry Pi GPIO番号順に表示され、適当に設定も可能。

image

サービスの停止

10)type sudo /etc/init.d/webiopi stop to stop webiopi service

Android アプリもある

11)from play store,download DrGPIO to Android phone to control the Pi

これがあると、GPIOの検証が楽だろう。

Raspberry Pi に液晶表示盤の回路図がないのため、基盤の結線を感で探すから、GPIO端子ON/OFFして見ると判断の手助けになる。

参考文献 -  肩に乗せてもらった巨人達:

Raspberry Piの通信対戦シューティングゲーム

付録のサイトを参考しながら進む。ExpressとSocket.IOを使用している。

$ git clone git://github.com/coppieee/node-shooting-demo.git
$ cd node-shooting-demo
$ npm install
$ node app

動かしてみるが、ShootingサンプルStart押して、白画面になり、反応がなく、304 Not Modified沢山でたので、どこが問題だ

chen@juno ~/node-shooting-demo $ node app
Express server listening on port 3000
GET / 200 173ms – 297
GET /stylesheets/style.css 200 162ms – 296
GET /javascripts/jquery-1.8.0.min.js 200 160ms – 90.39kb
GET / 200 28ms – 297
GET /stylesheets/style.css 304 23ms
GET /javascripts/jquery-1.8.0.min.js 304 25ms
GET /game 200 13ms – 442
GET /stylesheets/style.css 304 24ms
GET /javascripts/jquery-1.8.0.min.js 304 16ms
GET /javascripts/client.js 200 43ms – 3.54kb
GET /images/unit.png 200 42ms – 1.45kb
GET /images/bullet.png 200 40ms – 852
GET /game 200 18ms – 442
GET /stylesheets/style.css 304 61ms
GET /javascripts/jquery-1.8.0.min.js 304 49ms
GET /javascripts/client.js 304 25ms
GET /images/unit.png 304 30ms
GET /images/bullet.png 304 30ms

備考:

翌日気を取り直して、再テストしたら、上手くできた!

 

スクリーンショット 2015-04-17 21.05.40

参考文献 肩に乗せてもらった巨人達:

Raspberry Piのチャットサービス

Raspberry PiにNote.js、ExpressとSocket.IOを使用して簡単なチャットアプリを作ってみる。

chen@juno ~ $ npm install -g express
chen@juno ~ $ npm install socket.io

サンプルコードのダウンロードと実行、Socket.IOを使ったアプリではクライアントからメッセージを受け取り、処理した内容をクライアントに送信するといった処理になる。

chen@juno ~ $git clone git://github.com/coppieee/node-chat-demo.git
chen@juno ~ $cd node-chat-demo
chen@juno ~ $npm install
chen@juno ~ $node app

ブラウザからアクセスしてみる

image

複数ブラウザからチャットできると、確認した。コンソールからもログが出る

chen@juno ~/node-chat-demo $ node app
Express server listening on port 3000
GET / 200 222ms – 463
GET /stylesheets/style.css 200 233ms – 110
GET /javascripts/client.js 200 125ms – 568
GET /javascripts/jquery-1.8.0.js 200 230ms – 252.32kb
GET / 200 27ms – 463
GET /stylesheets/style.css 304 29ms
GET /javascripts/jquery-1.8.0.js 304 14ms
GET /javascripts/client.js 304 14ms

RaspberryPiにNode.js

Node.jsとは、JavaScriptの一種で、サーバーが構築できる言語。

「リアルタイムweb」とは、ほぼタイムラグなしにブラウザ上情報の更新を反映する、FacebookのメッセージやGoogleDocsなどの感じ。

Nodeには「ページに新しい情報が来たよ!」と教えてくれる機能があり、Socket.IOというパッケージにて実装できる。

間隔を開けてサーバにポーリングなどいらない分、サーバの負担が軽減てき、より多数のブラウザが接続できる。

環境構築

まず、Node.jsのバージョンを管理するためのマネージャをまずインストールする

chen@juno ~ $ curl -L git.io/nodebrew | perl – setup
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
Dload  Upload   Total   Spent    Left  Speed
0     0    0     0    0     0      0      0 –:–:– –:–:– –:–:–     0
0     0    0     0    0     0      0      0 –:–:–  0:00:02 –:–:–     0
100 22630  100 22630    0     0   5045      0  0:00:04  0:00:04 –:–:– 14432
fetching nodebrew…
install nodebrew in $HOME/.nodebrew

========================================
Add path:

export PATH=$HOME/.nodebrew/current/bin:$PATH
========================================

chen@juno ~ $ vi .bashrc
chen@juno ~ $ source .bashrc

 

Node.jsのインストール

Node.jsをバイナリからインストール。参考サイトの言われたままに、Raspberry Pi向け(arm-pi)の最新版バイナリが用意されていないため、v0.10.28を使用。

chen@juno ~ $ nodebrew install-binary 0.10.28
fetch: http://nodejs.org/dist/v0.10.28/node-v0.10.28-linux-arm-pi.tar.gz
######################################################################## 100.0%
Install successful
chen@juno ~ $ nodebrew use 0.10.28
use v0.10.28
chen@juno ~ $ node -v
v0.10.28
chen@juno ~ $ npm -v
1.4.9
chen@juno ~ $

Hello Worldの表示

以下のコードをapp.jsというファイル名で保存して、Node.jsで実行してみよう。

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello Worldn');
}).listen(1337, "127.0.0.1");
console.log('Server running at http://192.168.0.207:1337/');

実行して見る:

chen@juno ~ $ node app.js
Server running at http://192.168.0.207:1337/

ブラウザから確認:

image

Raspberry Pi にWordPressを動かすまで(Lighttpd編)

Raspberry PiのApacheから、軽いLighttpdに切り替えた記録。

Raspberry Pi は2台購入して、一台目はメモリ256Mのみ、2台目のメモリは512Mに増強した。そのため一台目最初からLighttpdで運用し、2台目余裕があると思って、最初はApacheで運用したが、いろいろ用途が増やすとやはりメモリ不足に落ち、Lighttpdに切り替えた。

# /etc/init.d/apache2 stop
# dpkg -l | grep apache

ii  apache2-mpm-prefork                   2.2.22-12                          armhf        Apache HTTP Server – traditional non-threaded model
ii  apache2-utils                         2.2.22-12                          armhf        utility programs for webservers
ii  apache2.2-bin                         2.2.22-12                          armhf        Apache HTTP Server common binary files
ii  apache2.2-common                      2.2.22-12                          armhf        Apache HTTP Server common files
ii  libapache2-mod-php5                   5.4.4-14+deb7u3                    armhf        server-side, HTML-embedded scripting language (Apache 2 module)

# apt-get –purge remove apache2.2
# apt-get –purge remove libapache2-mod-php5
# apt-get install lighttpd
# lighty-enable-mod fastcgi
# lighty-enable-mod fastcgi-php
# vi /etc/lighttpd/lighttpd.conf  // 設定を確認
# lighty-enable-mod ssl
# /etc/init.d/lighttpd force-reload
# lighty-enable-mod ssl

WordPressのリダイレクト設定は、Apacheと違うので結構ネットぐぐったけど、試行錯誤で下記の設定がOKでした。

url.rewrite-if-not-file = (
“^/{$rewrite_path}(wp-.+).*/?” => “$0”,
“^/{$rewrite_path}.*?(?.*)?$” => “/{$rewrite_path}index.php$1”
)

マルチドメインの場合、さらに複雑なり、下記の書き方がいいらしい。

url.rewrite-if-not-file = (
“^/(.*/)?files/$” => “/index.php”,
“^/(.*/)?files/(.*)” => “/wp-includes/ms-files.php?file=$2”,
“^(/wp-admin/.*)” => “$1”,
“^/({_0}+/)?(wp-.*)” => “/$2”,
“^/({_0}+/)?(.*.php)$” => “/$2”,
“^/(.*)/?$” => “/index.php/$1”
)