2015年04月17日

Raspberry Piに赤外線センサーを付けて、動きを検知してみた

今日のゴール

RaspberryPiに赤外線センサーを付ける。
動きを検知したら、LEDを点灯させる。

必要な道具たち

・Raspberry Pi 赤外線モーションセンサー PIR Infrared Motion Sensor


・抵抗(一般的なLEDなら、120 〜 330オームぐらいの範囲でいいらしいです)
・LEDライト
・ブレッドボード
・ジャンパーピン

配線する

下記になるように配線します。

RaspberryPi <------------------->  PIR Infrared Motion Sensor
3.3V     <------------------->   VCC(+)
GND     <------------------->   GND(−)
GPIO26   <------------------->   OUT

下の写真の通りPIR Infrared Motion Sensorの「VCC」「OUT」「GND」をRaspberryPiにつなぎます。
51H3HHOH6mL.jpg

LEDライトは下記の通りにRaspberryPiにつなぎます。足の長いほうがVCC(+)です。
RaspberryPi <------------------->  LEDライト
GPIO6     <------抵抗------->  【+】(長い方)
GND      <------------------->  【−】

※今回は、GPIO6とGPIO26につないでますが、好きに変えてください。
その場合ソースコードも変更する必要があります。

全体としては、以下の図のようにつなぎます。
抵抗に、極性は無いので、どちらの向きでも大丈夫です。
自分は、220オームの抵抗をつなぎました。(※下図は220Ωではないです。)
raspi_led.png
※センサーのイラストは実物とは異なります

Pythonで実装する

配線したら、RaspberryPiでプログラムを書きます。

まず、必要なモジュールのインストールです。
$ sudo apt-get update
$ sudo apt-get install python-rpi.gpio

それでは、「motion_sensor.py」という名前でファイルを作り、実装します。
$ sudo vi motion_sensor.py
#!/usr/local/bin/python
# -*- coding: utf-8 -*-
import time
import RPi.GPIO as GPIO

# LEDのGPIOピンの番号、センサーのGPIOピンの番号
let_pin = 6
pir_pin = 26

sleeptime = 100000
led_light_up_time = 1

GPIO.setmode(GPIO.BCM)
GPIO.setup(pir_pin, GPIO.IN)
GPIO.setup(let_pin, GPIO.OUT)
GPIO.output(let_pin, GPIO.LOW)

def motion_detected(pir_pin):
  print "検知"

  # 点灯
  GPIO.output(let_pin, GPIO.HIGH)
  
  # 待機
  time.sleep(led_light_up_time)

  # 消灯
  GPIO.output(let_pin, GPIO.LOW)


# コールバック登録
GPIO.add_event_detect(pir_pin, GPIO.RISING, callback=motion_detected)

try:
  while True:
    print "App Start"
    print "ctrl+c  :  if you want to stop app"
    time.sleep(sleeptime)
except KeyboardInterrupt:
  print "Quit"
finally:
  print "clean up"
  GPIO.cleanup()

32行目で、イベントにコールバックメソッドを追加しています。
検知したら、コールバックに登録したメソッドが呼ばれる仕組みです。

ループしてポーリングするやり方でも実装可能ですが、コールバックを使うほうがいけてます。

動かしてみる

下記コマンドで、先ほど作ったプログラムを実行します。
$ sudo python motion_sensor.py

手をかざしたりすると、「検知」と表示されるとともに、LEDが光ります。
$ sudo python motion_sensor.py
App Start
ctrl+c  :  if you want to stop app
検知
検知
検知


終了する場合は、「ctrl+c」を押してください。




posted by Raspberry Pi at 09:57 | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

2015年04月14日

Raspberry Piで気温を測ってみた【BMP180を使用】

【今日のゴール】
Raspberry PiにBMP180 気圧センサ(気温センサ付き)をつなげて、気温を測ってみる。

【用意するもの】
今回は、BMP180 という、気圧・気温センサーを使います。

大気圧センサーモジュール BMP180 Arduino、Raspberry Piに

また、RaspberryPiとBMP180を接続するために、「ブレッドボード」「ピンヘッダー」「ジャンパー(オスメス)×4本」を用意しします。

サンハヤト SAD-101 ニューブレッドボード



ジャンパワイヤ(オス〜メス) 10本セット



ピンヘッダピンソケット詰め合わせパック



I2Cの有効化

まずは、I2C(Inter-Integrated Circuit)を使えるよう、RaspberryPiの設定をします。
まずは、raspi-configから設定します。
$ sudo raspi-config

「8 Advanced Options」>「A7 I2C」
すべて「YES(はい)」にします。

I2C toolsのインストール

まず、/etc/modulesを編集します。
$ sudo vi /etc/modules
最後の行に「i2c-bcm2708」「i2c-dev」を追加します。
snd-bcm2835
i2c-bcm2708
i2c-dev
次に、i2c-toolsをインストールします。
$ sudo apt-get install i2c-tools libi2c-dev 

piユーザーをi2cグループに追加する

piユーザーをi2cグループに追加して、sudoなしでもアクセスできるようにします。
$ sudo gpasswd -a pi i2c

接続する

RaspberryPi - - - - - - -BMP180
「1:3.3V」 - - - - - - - - - -「VIN」
「6:GND」 - - - - - - - - - -「GND」
「3:I2C1_SDA」 - - - - - -「SDA」
「5:I2C1_SCL」 - - - - - -「SCL」


上記のようにつながるようにします。
RaspberryPiのGPIOのピン名は以下の図のとおりです。

GPIO.jpg

ピンヘッダーを4つ分切り取り、ピンヘッダーを介してBMP180とブレッドボードをつなぎます。
ちゃんと固定したい場合はハンダ付けをしてください。
また、ちゃんと接触していないと認識してくれませんのでご注意ください。

以下のようにつないだら準備完了です。
FullSizeRender.jpg

計測する

まずは、BPMがI2Cでつながっているか確認をします。
$ i2cdetect -y 1
以下のように、77が表示されればOKです。
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- 77                         
今回は、Pythonのモジュールを利用して計測します。

まず、PythonからI2Cをコントロールするための「python-smbus」をインストールします。
$ sudo apt-get install python-smbus

続いてAdafruitが提供しているライブラリをgitからcloneします。
$ git clone https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code.git
サンプルを動かし、計測します。
$ cd Adafruit-Raspberry-Pi-Python-Code
$ cd Adafruit_BMP085
$ ./Adafruit_BMP085_example.py
Temperature: 27.10 C
Pressure:    1009.77 hPa
Altitude:    29.43

無事計測出来ました



posted by Raspberry Pi at 10:01 | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

2015年04月10日

RaspberryPiのファームウェアをアップデートしてみる

【今日のゴール】
ファームウェアをアップデートして、RaspberryPiを最新の状態にする。

【やってみる】

そういえば、更新してなかったので、ファームウェアを更新することにします。

$ sudo rpi-update


再起動したら、完了です。




posted by Raspberry Pi at 15:49 | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

2015年04月09日

RaspberryPiのCPUの温度とか測ってみた

【今日のゴール】
RaspberryPiのCPUの温度とか、内部の情報を色々測ってみる。

【手順】
  • CPU温度を測る
  • ディスクの使用状況を調べる
  • サービスの稼働状況を調べる
  • プロセスの稼働状況を調べる
  • インストール済みのパッケージ一覧を調べる

CPU温度を測る

下記コマンドで計測することができます。ただし1,000分の1する必要があります。
例えば44388と表示された場合は、44.388度です。
$ cat /sys/class/thermal/thermal_zone0/temp

ディスクの使用状況を調べる

ここからはRaspberryPiとは余り関係ありませんが。
$ df
サイズの単位がわかりにくい場合は-hオプションがおすすめです。
$ df -h

サービスの稼働状況を調べる
$ service --status-all

プロセスの稼働状況を調べる
以下のコマンドで起動中のプロセスの一覧を表示します。
$ ps ax
ページングさせたい場合は、moreとパイプでつなぎます。
$ ps ax | more
文字列検索で引掛ったプロセスを表示させる場合はgrepとパイプでつなぎます。
$ ps ax | grep sshd
プロセスの負荷を確認する場合はtopコマンドを使います。
topコマンドから抜ける場合は「q」キーをクリックします。
$ top

インストール済みのパッケージ一覧を調べる

apt-getでインストールしたパッケージの一覧を表示します。
$ dpkg -l






posted by Raspberry Pi at 17:00 | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

2015年03月20日

Raspberry Piで【node.js】を使ってみる

【今日のゴール】
RaspberryPiにnode.jsをインストールして、node.jsを動かします。

web-accelerators-nodejs.jpg

【手順】
  • 「node.js」のインストール
  • もっと簡単に「node.js」のインストール
  • 「npm」のインストール
  • 「Socket.IO」のインストール
  • Hello World!!してみる
  • Expressを使ってHello World!!してみる
  • デーモン化してみる
node.jsのインストール

aptからインストールすると、バージョンが古い(v0.6.19)のでソースからインストールします。
2015年3月現在の最新評価版はv0.11.15ですので、このバージョンをインストールします。

最新のバージョンはWikipediaで確認するのが手っ取り早いです。

node.jsのディストリビューションの一覧は下記から確認できます。
https://nodejs.org/dist/

まずはNode.jsのビルドに必要なパッケージをaptでインストール
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install build-essential 
$ sudo apt-get install libssl-dev
$ sudo apt-get install libv8-3.8.9.20 libv8-dbg libv8-dev
pacoがインストールされていない場合はインストールします。
$ sudo apt-get install paco

node.jsをインストールしていきますが、ここで以下の問題が。
Error Compiling Armv6 (Raspberry Pi B+) #9163

そのままコンパイルしようとするとGoogle V8 JavaScript Engineのsnapshot.ccのコンパイルでエラーが発生してしまいます。 ですので、configureにオプションで「--without-snapshot」を付けてsnapshotを対象外にしてインストールすることにします。

node.jsのソースを取得し、ビルド、コンパイル、インストールします。
makeに数分かかります。ソースのバージョンは適宜変更してください。
$ cd /tmp
$ sudo wget https://nodejs.org/dist/v0.11.15/node-v0.11.15.tar.gz
$ sudo tar zxvf node-v0.11.15.tar.gz
$ cd node-v0.11.15
$ sudo ./configure --without-snapshot
$ sudo make
$ sudo paco -lD "make install"

下記コマンドを打ってバージョンが表示されれば、無事インストールされています。
$ node -v
もっと簡単に「node.js」のインストール

実は下記の「node-arm」というのを使って簡単にインストールできます。
http://node-arm.herokuapp.com/

node-armと言うのは、「An easy way to install node.js on the Raspberry Pi」(RaspberryPiに簡単にnode.jsをインストールする)とホームページに説明が書いてある通り、簡単にnode.jsをインストールできちゃいます。

$ sudo wget http://node-arm.herokuapp.com/node_latest_armhf.deb # ディストリビューションの取得
$ sudo dpkg -i node_latest_armhf.deb  # インストール

$ node -v  # インストールの確認

「npm」のインストール

Node.jsのパッケージを管理する「npm(node package manager)」をインストールします。
(インストールに数分かかります)
$ cd /tmp
$ sudo wget http://npmjs.org/install.sh
$ sudo ./install.sh
インストールが成功すれば、下記コマンドでバージョンが表示されます。
$ npm -v
とりあえずsocket.ioをインストールしてみます。(インストールに数分かかります)
[-g]オプションをつけると、グローバルにインストールされます。付けないと、カレントディレクトリにインストールされます。
$ sudo npm install -g socket.io

# インストール後の確認
$ sudo npm list -g
他にも、いろんなパッケージがあるので、必要に応じてインストールしてみてください。

Hello World!!してみる

適当なディレクトリで、「helloworld.js」というファイルを作り、以下のように編集します。
$ cd ~ 
$ sudo vi helloworld.js
var http = require('http');
var server = http.createServer(
function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.write('Hello World!!\n');
    res.end();
}
).listen(3000);
保存したら、nodeコマンドで先ほどの「helloworld.js」を指定します。
$ node helloworld.js 
WEBブラウザを開き、以下のアドレスを入力すると、ブラウザに「Hello World!!」と表示されます!

 ● RaspberryPiのブラウザからアクセスする場合「http://127.0.0.1:3000/」
 ● リモートでアクセス「http://RaspberryPiのIPアドレス:3000/」

Expressを使ってHello World!!してみる

せっかくなので Express というフレームワークを使ってみます。

まずはnpmでExpressをインストールします。 Expressをインストールしたら、「helloworld_exp.js」というファイルを作り、編集していきます。
$ sudo npm install -g express

$ cd ~ 
$ sudo vi helloworld_exp.js
require.main.paths.push('/usr/local/lib/node_modules');
var express = require('express');
var app = express();

app.get('/', function (req, res) {
    res.send('Hello, World Express!!');
});

app.listen(3000);
保存したら、nodeコマンドで実行しブラウザからアクセスすると「Hello, World Express!!」と表示されます。
$ node helloworld_exp.js
 ● RaspberryPiのブラウザからアクセスする場合「http://127.0.0.1:3000/」
 ● リモートでアクセス「http://RaspberryPiのIPアドレス:3000/」

デーモン化してみる

前項で作った、「helloworld.js」をSupervisorを使ってデーモン化してみます。

まずはこちらのエントリーを参照し、Supervisorをインストールしてください。
Raspberry Piに【Supervisor】をインストールして、motionをデーモン化してみた

Supervisorのhelloworld.js 用の設定ファイルを作成します。
$ sudo vi /etc/supervisor/conf.d/node_helloworld.conf
/etc/supervisor/conf.d/node_helloworld.conf
[program:helloworld]
command=/usr/local/bin/node /home/pi/helloworld.js 
numprocs=1
redirect_stderr=true
stdout_logfile=/var/log/helloworld.log
user=pi

# 設定、再読込
$ sudo supervisorctl reread
helloworld: available

# helloworldプロセスを追加→起動
$ sudo supervisorctl add helloworld
helloworld: added process group

# 起動確認
$ sudo supervisorctl status
helloworld                       RUNNING    pid 26200, uptime 0:00:11

プロセスが起動したら、ブラウザからアクセスします。無事に「Hello World!!」と表示されればOKです。

 ● RaspberryPiのブラウザからアクセスする場合「http://127.0.0.1:3000/」
 ● リモートでアクセス「http://RaspberryPiのIPアドレス:3000/」


※ ちなみに、今回はSupervisorを使いましたが、node.jsのデーモン化は、「forever」や「pm2」を使うのが一般的なようですのでこちらも試してみてください。


タグ:Raspberry Pi


posted by Raspberry Pi at 09:39 | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

2015年03月18日

Raspberry Piに【Supervisor】をインストールして、motionをデーモン化してみた

【今日のゴール】
Supervisorをインストールして、プロセスを監視する。
今回は、motionのプロセスをデーモン化してみます。

【Supervisorとは】
プロセス監視ツールです。自分で作ったスクリプトなどをデーモン化するときなどに便利です。

http://supervisord.org/
logo_supervisor.gif

【事前に】
事前に下記エントリーを参考にmotionをインストールしてください。
motion.confのdeamonはoffにしておいてください。

Raspberry Piを監視カメラにしてみた【motion】

【手順】
  • Supervisorのインストール
  • Supervisor の設定
  • Supervisorでmotionのプロセス監視

Supervisorのインストール

下記コマンドでインストールします。他の必要なモジュールも一緒にインストールされます。
$ sudo apt-get update
$ sudo apt-get install supervisor

Supervisor の設定

Supervisorをインストールしたら、「/etc/supervisor/conf.d/」ディレクトリの下に新しくmotion用の設定ファイルを作成します。
$ sudo vi /etc/supervisor/conf.d/motion_sv.conf
[program:motion]
command=/usr/bin/motion  ; 起動コマンド
numprocs=1   ; 起動するプロセス数
redirect_stderr=true  ; エラー出力を標準出力にリダイレクト
stdout_logfile=/var/log/motion.log  ; 標準出力ログのファイル名
user=pi   ; 起動ユーザー
上記のとおりに編集して保存します。

Supervisorでmotionのプロセス監視

下記コマンドで設定を再読み込みすると、motionが有効になります。
$ sudo supervisorctl reread
motion: available
motionをsupervisorのサブプロセスに追加します。
$ sudo supervisorctl add motion
motion: added process group
追加した時点でmotionのプロセスが起動します。下記のコマンドでステータスを確認すると「RUNNING」になっています。
$ sudo supervisorctl status
motion                           RUNNING    pid 7158, uptime 0:00:14
サブプロセスを停止したいときは、stopコマンドを使います。
$ sudo supervisorctl stop motion
$ sudo supervisorctl status
motion                           STOPPED    Mar 18 10:24 AM
サブプロセスを起動するとき
$ sudo supervisorctl start motion
サブプロセスを再起動するとき
$ sudo supervisorctl restart motion
わざわざログファイルを開かなくても、tailコマンドでログをtailできます。
$ sudo supervisorctl tail -1000  motion
$ sudo supervisorctl tail -f  motion

Supervisorのサブプロセスから削除したいときは、一度、停止してから削除します。
$ sudo supervisorctl stop motion
$ sudo supervisorctl remove motion

他のプロセスも追加したいときは「/etc/supervisor/conf.d/」の下に「〜.conf」という名前で設定ファイルを作り同様に「reread」→「add」すれば追加されます。

Supervisor自体の設定は「/etc/supervisor/supervisord.conf」を編集することで変更可能です。
$ sudo vi /etc/supervisor/supervisord.conf



タグ:Raspberry Pi


posted by Raspberry Pi at 11:10 | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

2015年03月17日

Raspberry Piを監視カメラにしてみた【motion】

【今日のゴール】
motionというソフトウェアを使ってRaspberryPiを監視カメラにする。

【使うもの】
WEBカメラ。自分は、下記のを使っています。

ELECOM Webカメラ 130万画素 マイク内蔵 イヤホンマイク付属 HD対応 ブラック UCAM-DLN130TBK

【手順】
  • WEBカメラを接続
  • motionのインストール、ffmpegのインストール
  • motion.confの設定
  • motion起動

WEBカメラを接続

WEBカメラをRaspberryPiにUSB接続します。

下記コマンドを実行し、認識しているか確認します。
$ lsusb
自分の場合は、以下のように表示されました。
Bus 001 Device 007: ID 056e:700d Elecom Co., Ltd


motionのインストール、ffmpegのインストール

motionをインストールします。motionをインストールすると、ffmpegも一緒にインストールされます。 ffmpegは動画をエンコードして保存するのに必要なソフトウェアです。
$ sudo apt-get update
$ sudo apt-get install motion

motion.confの設定

motionの設定をおこないます。motion.confのバックアップをとった後、編集していきます。
$ cd /etc/motion/
$ sudo cp -ip motion.conf motion.conf.org
$ sudo vi motion.conf

motion.confの設定に関しては、「motion.conf 設定」等のキーワードで検索 すると、色々と出てくるのでここでは割愛します。自分のお好みの設定で色々調整してみてください。


motion起動

デフォルトでは、motion.confのパーミッションが600になっており、rootユーザーでないと読み込めません。
sudoで実行するか、motion.confにread権限を付与します。

motion.confのパーミッションは変えず、sudo で実行
$ sudo motion
motion.confにread権限をつけて実行
$ sudo chmod +r /etc/motion/motion.conf
$ motion

こちらの記事に記載したBonjourのセットアップをしておき、motion.confの「webcam_localhost」を「off」に設定すれば

http://raspi.local:8081

のようなURLでブラウザからストリーミングを見ることができます。

【参考】
BonjourでRaspberryPiに接続してみた




posted by Raspberry Pi at 09:37 | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

2015年03月16日

Raspberry Piで写真を撮影してDropboxにアップロードしてみる

【今日のゴール】
RaspberryPiにWEBカメラを接続し、1時間に1回、写真を撮って、Dropboxにアップする。

【使うもの】
WEBカメラ。自分は、下記のを使っています。

ELECOM Webカメラ 130万画素 マイク内蔵 イヤホンマイク付属 HD対応 ブラック UCAM-DLN130TBK

【前提】
下記のエントリーを参考に、DropboxAPIでRaspberryPiからファイルアップロードができること

Raspberry PiでDropboxにファイルをアップロードしてみた

【手順】
  • WEBカメラを接続
  • fswebcamのインストール
  • シェルの作成、cronの登録

WEBカメラを接続

WEBカメラをRaspberryPiにUSB接続します。

下記コマンドを実行し、認識しているか確認します。
$ lsusb
自分の場合は、以下のように表示されました。
Bus 001 Device 007: ID 056e:700d Elecom Co., Ltd


fswebcamのインストール

fswebcamというソフトウェアを使って撮影します。まずはインストール。
$ sudo apt-get update 
$ sudo apt-get install fswebcam
インストールが完了したら、試しに撮影してみます。
[-F 100 ]オプションは露出時間です。デフォルトだと暗いのでオプションで設定しています。
$ fswebcam -F 100 /tmp/test.jpg

シェルの作成、cronの登録

撮影してDropboxにアップロードするシェルを作り、1時間に一回実行するようにcronに登録します。

シェルの作成
$ sudo vi /usr/local/sbin/take_picture_DboxUpload.sh
シェルを作成し、以下のように編集します。
#!/bin/sh

# 定数定義
# ファイル名, ファイルパス、露出時間
FILENAME=raspi`date +%Y%m%d%H%M`.jpg
FILE=/tmp/${FILENAME}
EXPOSURE=100

# 撮影する
fswebcam -F ${EXPOSURE} ${FILE}

# 写真が存在しかつ、ファイルサイズが1以上であれば、アップロードする
if [ -f $FILE -a -s $FILE ]; then
    dropbox_uploader.sh upload $FILE $FILENAME
else
    exit 1
fi

# 写真を削除
rm -f $FILE

# 終了
exit 0
保存したら、実行権限をつけます。
$ sudo chmod +x /usr/local/sbin/take_picture_DboxUpload.sh

cronの登録

今回は、1時間に1回(毎時10分)にpiユーザで先ほど作成したシェルを実行するように設定します。
cron.dの中に新しくファイルを作ります。
sudo vi /etc/cron.d/pic_dropbox_cron
以下の様に編集します。
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

10 * * * * pi /usr/local/sbin/take_picture_DboxUpload.sh
保存したら、パーミッションを644にします。
sudo chmod 644 /etc/cron.d/pic_dropbox_cron


以上で1時間に1回、自動的に撮影し、Dropboxにアップロードをしてくれるようになります。




ちなみに、今回は、/etc/cron.d の中にファイルを追加して設定しましたが、crontabに追加してもOKです。




posted by Raspberry Pi at 15:45 | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

2015年03月14日

Raspberry Piに現在時刻と、天気をしゃべらせてみた(Python)

【今日のゴール】

RaspberryPiに現在の日時と、天気をしゃべらせる。

tenki.png

【Python】

RaspberryPiの「pi」はPythonのパイ、ということで、Pythonで実装します。
RaspberryPiには最初からPythonが入っているので、特にセットアップの必要はありません。

【やってみる】

事前準備(open_jtalkのインストール)

事前に下記エントリーを参考に、open_jtalkを使った「jsay」コマンドを使えるようにしてください。

Raspberry Piにしゃべらせてみた(OpenJTalk 1.08、.htsvoiceファイル対応)

使用する天気予報API

livedoorの天気予報API「Weather Hacks」を使用します。
Weather Hacks、JSONのAPI仕様はこちら。

実装する

適当なディレクトリに「talk_weather.py」という名前でファイルを作ります。
$ sudo vi talk_weather.py
以下のように編集します。
#!/usr/bin/env python
# -*- coding:utf-8 -*-  

import shlex
import subprocess

from datetime import datetime

import urllib2
import json

CMD_SAY = 'jsay'

def main():
    say_datetime()
    say_weather()
    return

def say_datetime():
    d = datetime.now()
    text = '%s月%s日、%s時%s分%s秒' % (d.month, d.day, d.hour, d.minute, d.second)
    text = CMD_SAY + ' ' + text
    print text
    proc = subprocess.Popen(shlex.split(text))
    proc.communicate()
    return

def say_weather():
    city = '130010'; # Tokyo 
    json_url = 'http://weather.livedoor.com/forecast/webservice/json/v1' #API URL

    weather_text = u'%sの天気は%sです。'
    temperature_text = u'%sの予想最高気温、%s度、予想最低気温、%s度です。' 

    try:
        r = urllib2.urlopen('%s?city=%s' % (json_url, city) )
        obj = json.loads( unicode(r.read()) )

        title = obj['title']
        forecasts = obj['forecasts']
     
        # TODAY
        cast = forecasts[0]
        today_w_txt = weather_text % (cast['dateLabel'], cast['telop'])

        # TOMMOROW
        cast = forecasts[1]
        temperature = cast['temperature']
        tommorow_w_txt = weather_text % (cast['dateLabel'], cast['telop'])
        tommorow_t_txt = temperature_text % (cast['dateLabel'], temperature['max']['celsius'], temperature['min']['celsius'])
        
        # SAY
        weather_str = title + ' ' + today_w_txt + ' ' + tommorow_w_txt + ' ' + tommorow_t_txt
        weather_str = weather_str.encode('utf-8')
        
        text = '''%s '%s' ''' % (CMD_SAY, weather_str)
        print text
        proc = subprocess.Popen(shlex.split(text))
        proc.communicate()
    finally:
        r.close()

    return


### Execute
if __name__ == "__main__":
    main()
サーバーにもアップしてありますので、wget で取得することもできます。
$ sudo wget http://raspi.up.seesaa.net/bin/talk_weather.py

実行する

ファイルを保存したら、下記のように実行します。
$ python talk_weather.py

下記のように、現在時刻と天気予報が文字列として出力されるとともに、音声で読み上げます。
※ 音声データの生成に少し時間がかかります。
$ python talk_weather.py
jsay 3月13日、17時47分30秒
jsay '東京都 東京 の天気 今日の天気は晴れです。 明日の天気は曇のち晴です。 明日の予想最高気温、13度、予想最低気温、4度です。' 


ちなみに

ちなみに東京ではなく、別の地域に変更したい場合は、29行目のcity= の数字を変更します。

29行目 city = '130010';   # ←ここの数字を変更する

地域IDは全国の地点定義表(RSS) の「cityタグ」のidを参照して下さい。(例・佐賀県 伊万里=410020)


タグ:Raspberry Pi


posted by Raspberry Pi at 10:00 | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

2015年03月13日

Raspberry Piにしゃべらせてみた(OpenJTalk 1.08、.htsvoiceファイル対応)

【今日のゴール】
Open JTalkを使って、RaspberryPiにしゃべらせてみる
Open JTalkはバージョン1.05以前と1.06以降でhts_voiceのファイルフォーマットが異なります。

今回は、2015年3月時点で一番最新バージョンの「Open JTalk1.08」で喋らせてみます。

ちなみに、2015年3月現在、apt-getでインストールすると、バージョン1.05がインストールされますので、今回は、ソースからコンパイルしてインストールします。


【手順】
  • 事前準備(pacoのインストール)
  • インストール
  • 辞書ファイルの入手
  • MMDAgent音声ファイルの入手
  • しゃべらせる
  • 音周りの設定

事前準備

今回は、aptではなく、ソースからmake installでインストールをします。
make installでインストールしたアプリケーションを管理する「paco」というソフトウェアをまずインストールしておきます。
$ sudo apt-get install paco

インストール

1、hts_engine API(version 1.09)のインストール

/tmp にダウンロードして解凍
$ cd /tmp
$ sudo wget http://sourceforge.net/projects/hts-engine/files/hts_engine%20API/hts_engine_API-1.09/hts_engine_API-1.09.tar.gz
$ sudo tar zxvf hts_engine_API-1.09.tar.gz

ビルド、コンパイル、インストール(数分かかります)
$ cd /tmp/hts_engine_API-1.09
$ sudo ./configure
$ sudo make
$ sudo paco -lD "make install"

2、Open JTalk(version 1.08)のインストール

/tmp にダウンロードして解凍
$ cd /tmp
$ sudo wget http://sourceforge.net/projects/open-jtalk/files/Open%20JTalk/open_jtalk-1.08/open_jtalk-1.08.tar.gz
$ sudo tar zxvf open_jtalk-1.08.tar.gz

ビルド、コンパイル、インストール(数分かかります)
$ cd /tmp/open_jtalk-1.08
$ sudo ./configure --with-charset=UTF-8
$ sudo make
$ sudo paco -lD "make install"
3、確認

下記のコマンドを実行し「hts_engine_API-1.09」と「open_jtalk-1.08」が表示されればOKです。
$ paco -a
hts_engine_API-1.09  open_jtalk-1.08

辞書ファイルの入手

辞書ファイル(version 1.08) をダウンロードして、/usr/local/share/の下に置きます。

/tmp にダウンロード・解凍して配置
$ cd /tmp
$ sudo wget http://sourceforge.net/projects/open-jtalk/files/Dictionary/open_jtalk_dic-1.08/open_jtalk_dic_utf_8-1.08.tar.gz
$ sudo tar zxvf open_jtalk_dic_utf_8-1.08.tar.gz
$ sudo mkdir /usr/local/share/open_jtalk
$ sudo mv /tmp/open_jtalk_dic_utf_8-1.08 /usr/local/share/open_jtalk/

MMDAgent音声ファイルの入手

MMDAgent(version 1.4 ) をダウンロードして、/usr/local/share/の下に置きます。

/tmp にダウンロード・解凍して配置
$ cd /tmp
$ sudo wget http://sourceforge.net/projects/mmdagent/files/MMDAgent_Example/MMDAgent_Example-1.4/MMDAgent_Example-1.4.zip
$ sudo unzip MMDAgent_Example-1.4.zip
$ sudo mkdir /usr/local/share/hts_voice
$ sudo mv /tmp/MMDAgent_Example-1.4/Voice/mei /usr/local/share/hts_voice/


しゃべらせる

1、シェルの作成

/usr/local/bin の下にopen_jtalkを使って喋らせるためのシェルを作成します。
$ sudo vi /usr/local/bin/jsay
まず、「jsay」という名前で新しいファイルを作り、以下の通りに編集します。
#!/bin/sh

# 引数チェック
CMDNAME=`basename $0`
if [ $# -lt 1 ]; then
    echo "Usage: ${CMDNAME} [ text ]" 1>&2
    exit 1
fi


# 定数定義(出力ファイル名、辞書の場所、音声データの場所)
TMPFILE=`mktemp /tmp/tmp.XXXXXXXX.wav`
DIC=/usr/local/share/open_jtalk/open_jtalk_dic_utf_8-1.08/
VOICE=/usr/local/share/hts_voice/mei/mei_normal.htsvoice


# 音声データ生成
echo "$1" | open_jtalk \
-x ${DIC} \
-m ${VOICE} \
-ow ${TMPFILE} && \


# 生成した音声データを再生する
aplay --quiet ${TMPFILE}


# 生成した音声データを削除する
rm -f ${TMPFILE}

# 終了
exit 0

上記と同内容のものをサーバーに上げましたので、以下の通りwgetで取得することも可能です。
$ cd /usr/local/bin/
$ sudo wget http://raspi.up.seesaa.net/bin/jsay

「jsay」ファイルを保存したら、実行権限を付けます。
$  sudo chmod +x /usr/local/bin/jsay 

2、しゃべらせる

以下のようにjsayの引数に、喋らせたい文字列を渡すことでしゃべらせることができます。
$ jsay こんにちは



音周りの設定

出力先の変更

ヘッドフォン端子から音を出す場合
$ amixer cset numid=3 1
HDMIから音を出す場合
$ amixer cset numid=3 2
自動判別
$ amixer cset numid=3 0


ボリュームの調整

パーセントで指定します
$ amixer set PCM 20%



タグ:Raspberry Pi


posted by Raspberry Pi at 08:00 | Raspberry Pi | このブログの読者になる | 更新情報をチェックする