ラズパイを音楽プレイヤーにする


ラズパイを音楽プレイヤーにするには、
MPD (Music Player Daemon) を使用します。

MPD (Music Player Daemon) は、その名の通りデーモンで、操作画面はありません。
その代わりに、多くのクライアント・ソフトが存在します。
Android や iPhone などの機器からも操作できます。

インストール

$ sudo apt-get install mpd mpc
$ sudo apt-get install chkconfig

設定ファイル

$ sudo nano /etc/mpd.conf

共通の設定

# ディレクトリを変更する
music_directory "/home/pi/music"
playlist_directory "/home/pi/playlists"

# エラーが出ることがあるので、回避策
#bind_to_address "localhost"

# データベースの自動更新
auto_update "yes"

ラスパイのオーディオ端子に出力する場合

# デフォルトの設定です
audio_output {
        type            "alsa"
        name            "My ALSA Device"
}

ストリーム配信する場合

# alsa をコメントにして
#audio_output {
#        type            "alsa"
#        name            "My ALSA Device"
#}

# httpd を有効にする
audio_output {
       type            "httpd"
       name            "My HTTP Stream"
       encoder         "vorbis"  
       port            "8000"
       bind_to_address "0.0.0.0" 
       bitrate         "128" 
       format          "44100:16:1"
}

ディレクトリを作成する

$ mkdir /home/pi/music
$ mkdir /home/pi/playlists
$ chmod 755 /home/pi/music
$ chmod 755 /home/pi/playlists/

自動起動にする

$ sudo chkconfig mpd on

音楽ファイルの設定
/home/pi/music に音楽ファイルを入れる

mpd からアクセスできるようにする

$ chmod -R 755 /home/pi/music

クライアントの設定と操作
プレイリストを登録する

$ mpc ls  | mpc add 

プレイリストを再生する

$ mpc play

プレイリストを終了する

$ mpc stop

無線LANアクセスポイント化する
Android や iPhone などの外部機器から操作できるようにします。
具体的には 無線LANアクセスポイント化する をご覧ください。
SSIDを raspi-music にする。
無線LANのIPアドレスを 192.68.42.1 にする。

Android から操作する
MPDroid をインストールします。
無線LANのアクセスポイントに raspi-music を選択する。
Host に無線LANのIPアドレス 192.68.42.1 を設定する
Password は不要です。

こんな風に、音楽プレイヤーを操作します
20160801_mpdroid

iPhone から操作する
MPoD をインストールする

参考
Music Player Daemon – arch wiki
Raspberry Pi 2 Model Bでミュージックサーバを構築してみた
Music Player Daemon (MPD) を使ってみる
MPDroid の使い方
MPDroid – google play


Sumobot を Scratch から制御する


20160801_sumobot_scrach

Scratch と Python の連携 の応用として、
Sumobot を Scratch から制御します。

作成したプログラムは Github で公開しました。

主な作成手順
(1) MAC にて、Scratch プロジェクトを作成します。
画像をクリックすると、broadcast メッセージを送信する。
画像とメッセージの対応
– 上向き (forward) : “f”
– 下向き (backward) : “b”
– 左回り (left) : “l”
– 右回り (right) : “r”
– 停止 (stop) : “s”

(2) MAC にて、Python プログラムを作成します。
broadcast メッセージを受信して、Sumobot を移動する。
3秒後に停止する。

(3) Rapberry Pi (Sumobot) に転送します。

操作
(1) MAC から Rapberry Pi に VNC で接続します。
(2) Scratch プロジェクトを起動します。
(3) Python プログラムを起動します。
(4) Scratch の画像をクリックすると、Sumobot が移動します。


ラズパイ Open JTalk


20160610_openjtalk

Open JTalk は、入力された日本語テキストに基づいて自由な音声を生成する HMM テキスト音声合成システムです。

インストール

$ sudo apt-get install open-jtalk
$ sudo apt-get install open-jtalk-mecab-naist-jdic 
$ sudo apt-get install hts-voice-nitech-jp-atr503-m001

確認

$ echo "こんにちは" | open_jtalk -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice -x /var/lib/mecab/dic/open-jtalk/naist-jdic -ow /tmp/jtalk.wav
$ aplay /tmp/jtalk.wav

女性の声の設定
MMDAgent は、音声インタラクションシステム構築ツールキットです。

インストール

$ cd /tmp
$ wget http://downloads.sourceforge.net/project/mmdagent/MMDAgent_Example/MMDAgent_Example-1.6/MMDAgent_Example-1.6.zip
$ unzip MMDAgent_Example-1.6.zip
$ sudo cp -R ./MMDAgent_Example-1.6/Voice/mei /usr/share/hts-voice/

確認
-m オプションを MMDAgent にします

$ echo "こんにちは" | open_jtalk -m /usr/share/hts-voice/mei/mei_normal.htsvoice -x /var/lib/mecab/dic/open-jtalk/naist-jdic  -ow /tmp/jtalk.wav
$ aplay /tmp/jtalk.wav

参考
Raspberry piで日本語音声合成(Open JTalk)を試してみる。


ラズパイ 無線LANアクセスポイント化


20160610_wlan_ap

ラズパイを 無線LANアクセスポイント 化します。

準備するもの
無線LANの親機になるドングル
BUFFALO WLI-UC-GNM を使用しました

手順は大きく4つです
(1) 無線LANを固定IPアドレスにする
(2) DHCPサーバーの構築
(3) アクセスポイントデーモンの構築
(4) イーサネットと無線LANのルーティングの設定

無線LANのIPアドレスを 192.168.42.1 にして、192.168.42.10 から 192.168.42.50 まで配布するようにします。
有線LAN側のゲートウェイが 192.168.1.1 とします。

作成や変更したファイルは Github で公開しています

(1) 無線LANを固定IPアドレスにする
/etc/network/interfaces を変更する

# 下記のようにコメントにする
#allow-hotplug wlan0
#iface wlan0 inet manual
#    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
#allow-hotplug wlan1
#iface wlan1 inet manual
#    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

# 下記を追加する
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.42.1
netmask 255.255.255.0
gateway 192.168.1.1

(2) DHCPサーバーの構築
DHCP サーバーとして isc-dhcp-server をインストールする

$ sudo apt-get install isc-dhcp-server

/etc/dhcp/dhcpd.conf を変更する

# 下記のようにコメントにする
#option domain-name "example.org";
#option domain-name-servers ns1.example.org, ns2.example.org;

# 下記のコメントを外す
#authoritative;
authoritative;

# 下記を追加する
subnet 192.168.42.0 netmask 255.255.255.0 {
  range 192.168.42.10 192.168.42.50;
  option broadcast-address 192.168.42.255;
  option routers 192.168.42.1;
  default-lease-time 600;
  max-lease-time 7200;
  option domain-name "local";
  option domain-name-servers 8.8.8.8,8.8.4.4;
}

/etc/default/isc-dhcp-server を変更する

# 下記のように変更する
#INTERFACES=""
INTERFACES="wlan0"

(3) アクセスポイントデーモンの構築
hostapd をインストールする

$ sudo apt-get install hostapd

/etc/default/hostapd を変更する

# 下記のように変更する
#DAEMON_CONF=""
DAEMON_CONF="/etc/hostapd/hostapd.conf"

/etc/hostapd/hostapd.conf を作成する

interface=wlan0
driver=nl80211
ssid=fablab_raspi
hw_mode=g
channel=6
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=0456649009
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

(4) イーサネットと無線LANのルーティングの設定
/etc/sysctl.conf を変更する

# 下記のコメントを外す
#net.ipv4.ip_forward=1
net.ipv4.ip_forward=1

iptables コマンドで /etc/iptables.ipv4.nat を作成する

$ sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
$ sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
$ sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
iptables
$ sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"

/etc/network/interfaces を変更する

# 下記を追加する
pre-up iptables-restore < /etc/iptables.ipv4.nat

確認
再起動する

$ sudo reboot

dhcpd が起動している

$ ps auxw | grep dhcpd
root       649  0.0  0.8  10476  7928 ?        Ss   23:06   0:00 /usr/sbin/dhcpd -q -cf /etc/dhcp/dhcpd.conf -pf /var/run/dhcpd.pid wlan0

hostapd が起動している

$  ps auxw | grep hostapd
root       692  0.2  0.3   5920  2996 ?        Ss   23:06   0:01 /usr/sbin/hostapd -B -P /run/hostapd.pid /etc/hostapd/hostapd.conf

dhcpd のポートが開いている

$ sudo netstat -ap | grep dhcpd
udp     0   0 *:bootps          *:*         651/dhcpd       
udp     0   0 *:20899           *:*         651/dhcpd       
udp6   0   0 [::]:60482        [::]:*       651/dhcpd       
raw     0   0 *:icmp              *:*    7   651/dhcpd       

無線LANのIPアドレスが 192.168.42.1 になっている

$ ifconfig
wlan0     Link encap:Ethernet  HWaddr cc:e1:d5:3e:33:87  
  inet addr:192.168.42.1  Bcast:192.168.42.255  Mask:255.255.255.0
  inet6 addr: fe80::3640:cb77:8e64:6f8a/64 Scope:Link

ルーティングが設定されている

$ sudo iptables -L
...
Chain FORWARD (policy ACCEPT)
target     prot opt source      destination         
ACCEPT   all  --  anywhere    anywhere   state RELATED,ESTABLISHED
ACCEPT   all  --  anywhere    anywhere            
...

参考
How to Set up a Raspberry Pi as a Wireless Access Point
Raspberry Piのアクセスポイント化 & ルータ化がうまくいかない時はこの通りにやればおk
Raspberry Piの無線LANアクセスポイント化


ラズパイ WebIOPi


WebIOPi は、ラズパイの GPIO をWEBブラウザから制御できるフレームワークです。
本来は、RaspberryPi 1 です。
RaspberryPi 2 に対応するためのパッチが公開されています。

インストール

$ cd /tmp
$ wget http://sourceforge.net/projects/webiopi/files/WebIOPi-0.7.1.tar.gz
$ tar xvzf WebIOPi-0.7.1.tar.gz
$ cd WebIOPi-0.7.1

RaspberryPi 2 用に変更する

$ wget https://raw.githubusercontent.com/doublebind/raspi/master/webiopi-pi2bplus.patch
$ patch -p1 -i webiopi-pi2bplus.patch

ビルドする

$ sudo ./setup.sh
 ...
Do you want to access WebIOPi over Internet ? [y/n] <== y
 ...
WebIOPi successfully installed
 ...

起動スクリプトを設定する

$ cd /tmp
$ wget https://raw.githubusercontent.com/neuralassembly/raspi/master/webiopi.service
$ sudo mv webiopi.service /etc/systemd/system/

起動

$ sudo systemctl start webiopi

確認
WEBブラウザで下記にアクセスする

http://raspberrypi.local:8000/ 

認証画面が表示されるので、
ユーザー名は「webiopi」パスワードは「raspberry」を入力する。
20160606_webiopi_auth

WebIOPi Main Menu が表示されれば、OKです。
20160606_webiopi_main

前回の方法 では、26ピンしか表示されないが、今回は、40ピンが表示されます。
20160608_webiopi_40pin

GPIOにLEDをつけて、オンオフしてみる。

参考
「Raspberry Piで学ぶ電子工作」補足情報
p.227:WebIOPiのバージョンとインストール


ラズパイ WebIOPi (非推奨)


WebIOPi は、ラズパイの GPIO をWEBブラウザから制御できるフレームワークです。
本来は、RaspberryPi 1 です。
RaspberryPi 2 に対応するためには、若干の変更が必要です。

この方法はなく パッチを使う方法 をお勧めします。

ダウンロード
公式サイトからダウンロードする
6月時点の最新版は 0.7.1 です。

インストール

$ tar xvzf WebIOPi-0.7.1.tar.gz
$ cd WebIOPi-0.7.1

RaspberryPi 2 用に変更する

$ nano python/native/cpuinfo.c
if (strcmp(hardware, "BCM2708") == 0)
⬇︎
if (strcmp(hardware, "BCM2709") == 0)

RaspberryPi 2 用に変更する

$ nano python/native/gpio.c
#define BCM2708_PERI_BASE 0x20000000
⬇︎
#define BCM2708_PERI_BASE 0x3f000000

ビルドする

$ sudo ./setup.sh
...
Do you want to access WebIOPi over Internet ? [y/n] <== y
...
WebIOPi successfully installed
...

サービスデーモンをリロードする

$ sudo systemctl daemon-reload

起動

$ sudo /etc/init.d/webiopi start

確認
WEBブラウザで下記にアクセスする

http://raspberrypi.local:8000/ 

認証画面が表示されるので、
ユーザー名は「webiopi」パスワードは「raspberry」を入力する。
20160606_webiopi_auth

WebIOPi Main Menu が表示されれば、OKです。
20160606_webiopi_main

GPIO Header をクリックすると、ピン配置が表示される。
RaspberryPi 2 では 40ピンあるが、RaspberryPi 1 の 26ピンしか表示されない。
20160606_webiopi_gpio_header

GPIOにLEDをつけて、オンオフしてみる。

参考
第30回「WebIOPiでIoT!(1)導入&Lチカ編〜ブラウザからGPIOを操作しよう」


ラズパイ 音楽再生 (omxplayer)


OMXPlayer は、ラズパイのためのコマンドラインのプレーヤーです。
これは、XBMC Raspberry PI に実装のためのテストベッドとして開発されました。
ラズパイの公式サイトでも紹介されています。
PLAYING AUDIO ON THE RASPBERRY PI

インストールされているかの確認

$ which omxplayer

/usr/bin/omxplayer

使い方

$ omxplayer example.mp3

Audio codec mp3 channels 2 samplerate 44100 bitspersample 16
Subtitle count: 0, state: off, index: 1, delay: 0
have a nice day

キー入力で制御します。
停止/再開: Space か p
終了: q

参考
フリー音源 Mp3juices,cc


ラズパイ 音楽再生 (mpg321)


mpg321 は、コマンドラインの mp3 プレーヤーです。
mpg321 は、mp3 形式のファイルを wav 形式のファイルに変換するデコーダです。
主にCD録音のソフトウェアで使用するためです。

インストール

$ sudo apt-get install mpg321

使い方

$ mpg321 test.mp3

参考
フリー音源 Mp3juices,cc


ラズパイ WiringPi 連続回転サーボ


20160505_raspi_servo

LED明暗 に続いて、ラズパイで WiringPi を使って、連続回転サーボを制御します。
LED明暗と同様に、ハードウェア PWM を使います。

設定
設定には、5つの関数を使用します。
それぞれ、ラズパイの BCM2835 / BCM2836 のレジスタと関連しています。

pinMode
pin のモードとして、PWM_OUTPUT を設定します。
これを最初に設定しないと、以降の関数が効かなかったです。

pwmSetMode
PWMのモードを設定します。
PWM には、2つのモードがあります。
バランスド (balanced) と マーク・スペース (mark:space) です。
スペースは周期で、マークはパルス幅です。
バランスドは、デューティ比 50% です。
20160530_wiringpi_pwm_mode

サーボに必要なのは、下記のような信号なので、マーク・スペースに設定します。
20160425_servo_control_2

pwmSetClock
クロックの分周比を設定します。
PWMのクロックは、19.2 MHz です。
サーボでは、パルス幅 ±0.5ms で制御します。
制御の刻みを 100 とすると、分周比は 96 です。
0.5ms / 100 = 5μs (200 KHz)
19.2 MHz / 200 KHz = 96

pwmSetRange
PWMの周期となるクロック数を設定します。
サーボのパルス周期は、20ms なので、クロック数は 400 です。
20ms / 5μs = 4000

pwmWrite
パルス幅となるクロック数を設定します。
1.5ms のときは、300 です。
1.5ms / 5μs = 300

動作確認
サーボには3本の線があります。
赤を Pin4 (+5v)、黒を Pin6 (GND)、白を Pin12 (GPIO18) に接続します。

wiringpi_servo_pulse.py (github)
パルス幅のクロック数 を 200、290、300、310、400 と変化させて、
時計周り(高速)、時計周り(低速)、停止、反時計周り(低速)、 反時計周り(高速) となることを確認します。

wiringpi_servo_speed.py (github)
パルス幅で指定するのは使い難いので、速度で指定するようにしました。
速度の範囲は、−100 から 100 です。

オシロでの測定
周期 20ms、パルス幅 1.5ms となっています。
RPi.GPIO では、ジッタ が見られましたが、今回は綺麗です。

周期 20ms
20160530_wiringpi_pwm_20ms

パルス幅 1.5ms
20160530_wiringpi_pwm_1_5ms

参考
Raspberry Pi Specifics – Wiring Pi
・void pinMode (int pin, int mode)
pin に対して、mode として、INPUT、 OUTPUT、 PWM_OUTPUT、または GPIO_CLOCK のいずれかを設定します。

・pwmSetMode (int mode)
PWMジェネレータは、 2つのモードで実行することができます。
バランスド (balanced) と マーク・スペース (mark:space) です。
マーク・スペースが伝統的な方式ですが、ラズパイのデフォルトのモードはバランスドです。
mode にパラメータを設定することで、モードを切り替えることができます。
PWM_MODE_BAL か PWM_MODE_MS です。

・pwmSetRange (unsigned int range)
PWMジェネレータ内のレンジ・レジスタを設定します。
デフォルトは1024です。

・pwmSetClock (int divisor)
PWMクロックの分周比を設定します。

・void pwmWrite (int pin, int value)
指定されたピンのPWMレジスタに値を書き込みます。

Control Hardware PWM frequency – Raspberry Pi
PWMクロックは19.2 MHz です。
pwmSetClock の値で分周されます。
分周された周波数で、PWMカウンタが増加します。


ラズパイ WiringPi LED明暗


20160510_raspi_led

LED点滅 に続いて、ラズパイで WiringPi を使ってLEDを徐々に明くしたり暗くしたりします。

WiringPi では、ハードウェア PWM が使えます。
ラズパイ2では、2チャネルあり、1つは P32 (GPIO12) か P12 (GPIO18)、もう1つは P33 (GPIO13) か P35 (GPIO19) です。

P12(GPIO18) と P6(GND) の間に、LEDと1KΩの抵抗を直列に入れます。
20160510_raspi_led_gpio17

wiringpi_led_fade.py

import wiringpi
import time
PIN = 18 
INTERVAL = 0.05
MIN_BRIGHTNESS = 0
MAX_BRIGHTNESS = 1023
bright = 0
amount = 16
wiringpi.wiringPiSetupGpio()
wiringpi.pinMode(PIN, wiringpi.PWM_OUTPUT)
try:
	# endless loop
	while True:
		print bright
		wiringpi.pwmWrite(PIN, bright)
		bright = bright + amount;
		if bright <= MIN_BRIGHTNESS:
			bright = MIN_BRIGHTNESS
			amount = -amount
		elif bright >= MAX_BRIGHTNESS:
			bright = MAX_BRIGHTNESS
			amount = -amount
		time.sleep(INTERVAL)
except KeyboardInterrupt:
	# exit the loop, if key interrupt
	pass

参考
Core Functions – Wiring Pi
・void pinMode (int pin, int mode)
pin に対して、mode として、INPUT、 OUTPUT、 PWM_OUTPUT、または GPIO_CLOCK のいずれかを設定します。
PWM_OUTPUT は、WiringPi 1ピン (BCM_GPIO 18) のみサポートされています。
GPIO_CLOCK は、WiringPi 7ピン (BCM_GPIO 4) のみサポートされています。

・void pwmWrite (int pin, int value) ;
指定されたピンのPWMレジスタに値を書き込みます。
ラズパイ1はオンボードPWMピンを1つ持っています。
Wiring Pi 1ピン (BMC_GPIO 18、物理ピン12) です。
value の範囲は0〜1024です。
他のPWMデバイスは、他のPWM範囲を有することができます。

Raspberry Piで学ぶ電子工作
wiringPiを用いたハードウェアPWM信号によるサーボモーターの制御
Raspberry Pi Model B ではハードウェアPWM信号はGPIO 18からの1つのみしか出力できなかったのですが、Raspberry Pi Model B+以降(Raspberry Pi 2 Model B含む)では、ハードウェアPWM信号を2つ出力できます。
1つ目のPWM0はGPIO 18かGPIO 12のどちらかから、2つ目のPWM1はGPIO 13かGPIO 19のどちらかから出力できます。