黒電話をスマホの子機(Bluetoothヘッドセット)に!⑦

ラズパイ(Raspberry Pi)を使って、黒電話をスマホの子機にする工作をしています。

ちょっとお知らせ

実はこの作品を、
日経BP社の雑誌3誌が主催した「ラズパイコンテスト2017」に応募してました。

そしたら、なんとなんと!まさかの「優秀賞」をいただきました!
みんなのラズパイコンテスト |ラズパイマガジン、 日経Linux、日経ソフトウエア 主催
ありがとうございます!うれしいです。

本当は応募までにこの工作シリーズの記事を書き終えたかったのですけどね。意外に書くネタ多すぎw

ちなみに本シリーズの過去記事は、こちらから。
tokieng.hatenablog.com

前回までのおさらい

前回までで、ラズパイで黒電話のダイヤルとフックの状態を観測できて、さらにベルも鳴らすことができた。
ラズパイをスマホに接続して、ラズパイからスマホの電話機能の操作もできるようになった。

いよいよ、これをまとめて、黒電話アプリを作るぞ!
と思ったけど、ソフト作りの前にまずはハード作りだ!

回路(バージョン1)

バージョン1とわざわざ書いているということは、これは後で変更するんだなというネタバレを意味するけど、まぁ気にしない。
まずはこの回路を作ってみた。
f:id:tokieng:20171111163148p:plain
(回路図作成には、 水魚堂の回路図エディタ (BSch3V) を使用させていただきました )
回路の+3.3VとGNDは、もちろんラズパイのお好きなピンから引っ張ってきてください。

※おことわり:ちなみに私は回路作成初心者なので、この回路だと火災やケガや他人に迷惑かけることがあるかも。あくまでも、ご参考までに!

使用するGPIO端子は以下の通り。

GPIO端子 接続先 用途
GPIO17 (11番ピン) 黒電話のD1線 ダイヤルパルスの検出に
GPIO22 (15番ピン) 黒電話のD3線 ダイヤル回転中の検出に
GPIO24 (18番ピン) 黒電話のH1線 フック状態の検出に
GPIO13 (33番ピン) モータドライバTA7291PのIN1端子 ベルの制御に
GPIO5 (29番ピン) モータドライバTA7291PのIN1端子 ベルの制御に

回路図の上半分がダイヤルとフックの検出回路で、下半分がベルを鳴らす回路。
単に配線しただけ。
CN1~CN3は、黒電話と回路とを接続するための、コネクタ。繋げればなんでもよい。

まずはブレッドボード上に配線して、これでよいか動作を見てみよう。
そのためにもアプリを作らなきゃ。

あれ?受話器は?

そうそう、受話器もつながないと、電話機として足りないよねー。
黒電話の受話器からは、黒い線2本と、白い線2本が出ている。
f:id:tokieng:20170623195408j:plain
この白いのがマイクの線で、黒いのがスピーカーの線。

この線を、3.5mmのミニプラグの形に変換してみる。
線が2本しかないから(モノラルだから)、端子が2個(2極)のタイプでいいんだけど、なかなか見当たらないので3極のミニプラグを使ってみた。
f:id:tokieng:20171111173323j:plain
半田付けがひどいのは、ご愛敬ということで(^^;

ミニプラグをくっつけたら、本物の受話器を使ったマイクとスピーカーの完成!
f:id:tokieng:20171111173558j:plain

これをラズパイのUSBオーディオケーブルに繋いで、ラズパイで音を鳴らしてみる。

$ paplay /usr/share/sounds/alsa/Front_Center.wav

もし↑で音が鳴らなかったら、↓も試してみて。

$ pulseaudio --start -D  # ←pulseaudioが起動していないとき、起動させる
$ paplay /usr/share/sounds/alsa/Front_Center.wav

お!受話器のスピーカーから音が鳴った!
単純に繋ぐだけでいいみたい。複雑なことしなくて、よかったよかった。

アプリ作ったよ

黒電話アプリ、名付けて KurodenwaPi なのだ!プログラムをGitHubで公開します。
github.com
GitHubなのでうさんくさい英語で説明を書いてしまったけど、そもそも日本の黒電話との使用を前提としたアプリだから、英語で書いても誰も読まないや(笑)

準備

まずはインストールする。

$ cd
$ git clone https://github.com/tokieng/KurodenwaPi.git

完了。

ほかに必要なのは、これまでに登場した PulseAudio(バージョン10)、ofono、pigpio。インストール方法は過去記事を参照して。

ラズパイとスマホBluetoothペアリングも、過去記事が参考になるかも。
あ、スマホと接続するときにofonoがラズパイ上で動いていないと、スマホはラズパイをハンズフリー機器として見てくれないので、ご注意を。

さらに言うと、ラズパイにペアリングしている(登録している)Bluetooth機器は、1つだけにしてください。複数登録しているときは、bluetoothctlコマンドを使って1つだけにしてください。
これは、手抜きアプリの仕様です(汗)。
複数機器に対応しようかとも思ったけど、需要無い割りに面倒なので省略!


そして必要なソフトが、AquesTalkPi。
AquesTalk Pi - Raspberry Pi用の音声合成アプリ
日本語の文章をAquesTalkPiに渡すと、音声データを作ってくれる。
せっかくなので、黒電話にしゃべらせたいよねー。
ダウンロードしたら、以下のようにして展開すれば、準備完了。

$ cd
$ tar xfz aquestalkpi-20130827.tgz

あとは、受話器を上げた時の「ツー」という音と、電話が切れたときや話し中の「ツー、ツー・・・」という音と、呼び出し中の「プルルルル・・・」という音。
これもアプリで生成したかったけど、結構ややこしかったのでやめて、wavファイルを再生することにした。

必要なwavファイルは、以下の3つ。

  • tone.wav : 受話器を上げた時の「ツー」という音。トーン信号。400Hzのサイン波。
  • busy.wav : 相手が話し中の時の「ツー、ツー、ツー・・・」という音。ビジートーン。
  • ringback.wav : 相手を呼び出しているときに聞こえる、「プルルルル、プルルルル・・・」という音。リングバックトーン。

どこかからダウンロードしてきたはずなんだけどなぁ。どこからか分からなくなってしまった・・・。
どうにかしてwavファイルを工面したら、 /home/pi/KurodenwaPi/sound/ の中に置いてくださいませ。

アプリの実行

スマホとラズパイが接続している状態にして、以下のコマンドを実行する。

$ cd
$ KurodenwaPi/client

しばらく待って、

Ready.

と表示されたら準備完了。

電話かけたりしてみたいだろうけど、プログラムや回路にミスがあったら間違い電話をしてしまうかもしれないので、それは次回じっくりと説明する・・・つもり。

次回予告

このアプリを使って、電話の発着信をやってみる。あと、回路図バージョン2も?



ちなみに本シリーズの全記事は、こちらから。
tokieng.hatenablog.com

黒電話をスマホの子機(Bluetoothヘッドセット)に!⑥

前回までで、黒電話のダイヤルとフック操作をラズパイ(Raspberry Pi)が検出できるところまで出来た。
前回の最後に「アプリを作ろう」と書いてたけど、ベルの存在を忘れてた。

ということで今回は、ベルを鳴らそう!

過去記事は、こちらから。
tokieng.hatenablog.com

ベルの構造

一口に黒電話のベルと言っても、型番によって異なるっぽい。ここでは、今回の工作材料である600型に絞ってまとめることにする。

f:id:tokieng:20150609204522j:plain
黒電話(600-A2)のベル
黒電話のベル部分を見ていただくと、
左にある2つの丸いもの(本記事では鐘と呼ぶ)、2つの鐘の間にある棒(ハンマー)、右側にある茶色くて「E」という文字が見える部品が見える。
この右側の部品はコイル。小学校の理科の実験で、使ったことあるよね。
ということで黒電話のベルは、2つの鐘と、ハンマーと、コイルという3種類の部品で構成している。

各部品を簡単に説明すると、

2つの鐘:叩くと音が出る。微妙に大きさが違うので、それぞれから別の高さの音が出る。
コイル:電流を流すと電磁石になる。
ハンマー:左側の先端に球がついていて、逆の右側には磁石がついている。

コイルに電流を流して電磁石にすると、ハンマーについている磁石が引き寄せられて、ハンマーが動く。
ハンマーが動くと、ハンマー先端の球が鐘を叩く。

コイルに流す電流が一方向なら、コイルが作る磁界は一定方向なので、ハンマーは2つある鐘のどちらかを1回動くだけ。
これを、コイルに交流を流して電流の向きを変えてあげることによって、ハンマーは2つの鐘を交互に叩くようになる。
こうして鐘が鳴って、あのベル音を鳴らすことができる。

あぁ、だから電話線には交流16Hzが必要なのか・・・。

ベルを手で鳴らしてみる

ハンマーを手で動かしてみた。

ハンマーをゆっくり動かすと、ハンマー先端の球が鐘にあたらない。
その時の動画が、これ。
www.youtube.com

で、ハンマーを勢いよく動かすと、球が鐘に当たって、音が鳴る。
www.youtube.com

ハンマーの棒がしなることで、こうなるみたい。
こうすることで球は、鐘を一瞬たたくだけですぐ離れる。だからきれいな音が鳴る。
仮に球が鐘にくっついたままだと、たたいた鐘を指で押さえるようなものなので、ちゃんと鳴らないからね。

よく考えられてるなぁ~!

ハンマーを早く動かすと、(人によっては)懐かしい、黒電話のベル音を奏でる。
www.youtube.com

ベルをどうやって鳴らす?

ということで、コイルには交流16Hzの電気を流す必要がある。
しかも48V。3.3Vとかの低い電圧では、ハンマーを動かすような磁力が作れないっぽい。
げげ。
ラズパイでどうやって・・・。

そこで、別の方法でハンマーをたたけないか、検討してみた。

作戦① コイルを変える?

コイルを、もっと低い電圧でもよいものに置き換えれないかな、と。
足りない頭で考えてみたけど、電磁石の知識をどこかに置き忘れたみたいで、断念・・・。

作戦② モーターの回転運動を往復運動に変換して?

電気で動力を得る部品といえば、モーター。モーターは、回転運動。
でも今回欲しいのは、ハンマーを動かす往復運動。
工作用部品とかで、回転運動→往復運動に変える部品はないかな?
たとえばタミヤとか・・・。

そうそう、こんなの!
楽しい工作シリーズ 手こぎボート工作セット | タミヤ

変換はどういう原理なのかな?と思ったら、別の方が分かりやすい動画を公開されてた。
DCモーターを使ったクランク&プーリー構造 - YouTube

黒電話への内蔵は、むーりー。

作戦③ 別のモーター

サーボモーターというものがあるらしい。モーターの回転角を制御できるというものらしい。
普通のモーターは一方向に回転し続ける(前進あるのみ)だが、サーボモーターは、回転できる角度の範囲内で、自由に角度を変えられる、というモーター。
詳しくはこちらの方の記事をご参照。
http://www.katch.ne.jp/~n-yotaka/sub%202.htm

つまり、例えばハンマーを真ん中に置いたときを90°として、70°~110°に動かせば、往復運動のようなものが簡単に作れそう!
これか!

・・・と思ったが、黒電話にどうくっつけようかと悩んで、この案はいったん保留。

作戦④ やっぱり元のコイルを使う

そうこうしていたら、どうやら9V乾電池でも鳴らせそうだという文献を見つけた。
セマクアサク: [実験]黒電話のベルを鳴らす

9V乾電池!その存在をすっかり忘れてた!
これなら比較的高い電圧をコンパクトに得られそう!

実験

元のコイルをそのまま使って、ハンマーを動かせるか実験してみた。

9V乾電池を2本直列につないで18Vを作り、これをコイルに流してハンマーが動くのか?

コイルは、本連載4回目でご紹介したサイト(黒電話三代)の回路図では B かな?ということは、コイルに繋がっている線はB1線とB2線っぽい。

B1線とB2線の間に、9V乾電池×2個を繋いでみた。

チン

やった!ハンマーが動いて、鐘を叩いたよ。
写真も動画も残してないけどw

残る課題は、交流っぽい電流

とりあえず9V乾電池2個でハンマーは動かせた。
でも、コイルに流す電流の向きを反転させないと、2つの鐘を鳴らし続けることはできない・・・。
ラズパイからどうやって・・・。

色々調べてみると、モータードライバというICが使えそうだということが分かった。

電子工作の世界で有名らしい、何かと話題の東芝製TA7291PというICを使ってみる。
このICは、ビデオデッキ用に開発されたものらしい。
(今となってはピンとこない人が多そうだが、ビデオ、分かりますよね!?)

カセットに収められているテープは、ビデオデッキ内のモーターで巻かれたり巻き戻されたりするが、
 巻き戻す = モーターを逆回転させる = モーターに流す電流を逆方向にする
ということなので、モーターに流す電流を制御する必要があるからなんだろうな、と推測。

TA7291Pの公式資料は、こちらから。
http://toshiba.semicon-storage.com/jp/product/linear/motordriver/detail.TA7291P.html
あらま「生産終了予定」ですって!
東芝って、電器屋で売ってる家電以外にも実は非常に広い分野の製品を作っていて、陰でいろんな分野の支えになってるから、日本国内になんとか落ち着いていただきたいなぁ。)

TA7291P、モータードライバについては、マルツさんのサイトが分かりやすい。
https://www.marutsu.co.jp/contents/shop/marutsu/mame/81.html

TA7291Pを簡単に説明すると、

  • モーター側にはOUT1とOUT2の端子があって、OUT1→OUT2の向き、もしくはOUT2→OUT1の向きに電流が流れる。
  • どっち向きに電流を流すかは、IN1とIN2の端子で制御できる。
  • 電圧に関する端子が3つあるが、それぞれざっくりと以下の意味。
    • Vsは、モーターに流す電源を供給するもの。
    • Vccは、ICの回路の電源を供給するもの。
    • Vrefは、Vsが出力する電圧に影響するもの。

つまり、IN1端子とIN2端子をラズパイから制御することで、電流の向きを変えられるということ!

IN1とIN2に与える信号を、1/32秒ごとに切り替えれば、16Hzのような電流が作れそうだ。
しかも、上の調査の結果、コイルに与える電流は厳密に交流でなくても、ハンマーは鐘を叩いたらすぐに鐘から離れてくれるし。

元のコイルのままで、なんとかなりそうな気がしてきた。

次回予告

そろそろアプリのプログラムが完成(公開)!?


ちなみに、本シリーズの記事一覧はこちらからどうぞ!
tokieng.hatenablog.com

黒電話をスマホの子機(Bluetoothヘッドセット)に!⑤

黒電話をスマホの子機にしよう!という話の、第5回。

過去記事は、以下にあります。
黒電話をスマホの子機(Bluetoothヘッドセット)に!① - エンジニアらしき人のひとりごと
黒電話をスマホの子機(Bluetoothヘッドセット)に!② - エンジニアらしき人のひとりごと
黒電話をスマホの子機(Bluetoothヘッドセット)に!③ - エンジニアらしき人のひとりごと
黒電話をスマホの子機(Bluetoothヘッドセット)に!④ - エンジニアらしき人のひとりごと

前回までのあらすじ

ラズパイ(Raspberry Pi)を使って、黒電話をスマホの子機(Bluetoothヘッドセット)にしようと画策中。
スマホ⇔ラズパイ間をBluetoothで接続し、ラズパイからスマホの発着信操作ができた(②と③)。
黒電話のダイヤルは、ON/OFFを繰り返すスイッチのようなもので、なんとかラズパイに繋いでON/OFFが分かるようになった。

で、今回は

そろそろプログラムを書いて、何番がダイヤルされたかを検出できるようにしよう。

使う道具を決める

プログラムからGPIOを操作する方法がいくつかあるので、まずはどれを使うか選定する。

  • /sys/class/gpio/ へのファイル操作(④で使用した方法)
  • WiringPiライブラリ
  • RPi.GPIOライブラリ
  • pigpioライブラリ

http://abyz.co.uk/rpi/pigpio/

いろいろあるが、今回ではpigpioを使うことにした。pigpio本体はLinuxのデーモンとして動いていて、高速&高精度のGPIO操作が可能。そして、Pythonのアプリから操作するためのインタフェースとしてのライブラリが提供されている。
これを選んだ最大の理由は、特徴に以下の項目があったから。
>callbacks on GPIO 0-31 level change (time accurate to a few μs)

これの何が良いかというと、
何番がダイヤルされたかをカウントするために必要な、パルスの立ち上がり(0→1になる)タイミングを教えてくれる、ということ。

もしこの機能がなかったら、立ち上がりの検出処理を自分で実装する必要が出てくるので、ちょっと面倒だし、なんだかスマートな方法じゃない。
どういう処理かというと、定期的にGPIOポートの値をチェックして「0, 0, 0, 0, 0, 0, 0, 0, 1, あ!いま1になった!」というのを見つける、いわゆるポーリングの処理。

これをライブラリ側でやってくれるというのは、すごくスマート。プログラムが簡単になる。
しかも、数マイクロ秒の誤差で、ライブラリからアプリに通知してくれる。
おぉすごい!

ということで、Python + pigpio でプログラムを書いてみた。

簡単なコード

#!/usr/bin/python3

import pigpio
import time
from enum import Enum

HIGH = 1
LOW = 0

# D3ケーブルの接続ポート
PORT_DIALING = 22

# D1ケーブルの接続ポート
PORT_DIAL_PULSE = 17

# H1ケーブルの接続ポート
PORT_HOOK = 24

class KurodenGpio:
	Status = Enum("Status", "IDLE WAIT_PULSE PULSE_HIGH PULSE_LOW")

	gpio = None

	status = Status.IDLE

	# パルスの立ち上がりをカウントする
	dial_count = 0

	def __init__(self):

		# pigpioを生成
		gpio = pigpio.pi()
		self.gpio = gpio

		# 各ポートをINPUTに
		gpio.set_mode(PORT_DIAL_PULSE, pigpio.INPUT)
		gpio.set_mode(PORT_DIALING, pigpio.INPUT)
		gpio.set_mode(PORT_HOOK, pigpio.INPUT)

		# ノイズ対策
		gpio.set_glitch_filter(PORT_DIAL_PULSE, 1000)
		gpio.set_glitch_filter(PORT_DIALING, 1000)
		gpio.set_glitch_filter(PORT_HOOK, 1000)

		# パルスの立ち上がり/立ち下りを契機に、関数を呼び出してもらう
		gpio.callback(PORT_DIAL_PULSE, pigpio.EITHER_EDGE, self.callback_gpio_d1)
		gpio.callback(PORT_DIALING,    pigpio.EITHER_EDGE, self.callback_gpio_d3)
		gpio.callback(PORT_HOOK,       pigpio.EITHER_EDGE, self.callback_gpio_hook)

	def __del__(self):
		self.gpio.stop()

	def callback_gpio_hook(self, gpio, level, tick):

		if level == 0:
			print("受話器取った")
		else:
			print("受話器置いた")

	def callback_gpio_d3(self, gpio, level, tick):
		if level == 0:
			print("ダイヤル開始")
			if self.status == self.Status.IDLE:
				self.status = self.Status.WAIT_PULSE
				self.dial_count = 0
		else:
			print("ダイヤル終了")
			if self.status == self.Status.PULSE_LOW or self.status == self.Status.WAIT_PULSE:
				self.status = self.Status.IDLE
				if self.dial_count != 0:
					if self.dial_count == 10:
						self.dial_count = 0
					print("** Dial:", self.dial_count)

	def callback_gpio_d1(self, gpio, level, tick):
		if level == 1 and (self.status == self.Status.WAIT_PULSE or self.status == self.Status.PULSE_LOW):
			self.status = self.Status.PULSE_HIGH
		elif level == 0 and self.status == self.Status.PULSE_HIGH:
			self.status = self.Status.PULSE_LOW
			self.dial_count += 1

#####

if __name__ == '__main__':
	print("** START **")
	gpio = KurodenGpio()
	while True:
		time.sleep(1)

状態管理はいらんかな?とも思ったが、つけてみた。

このコードをgpiotest.pyとして保存し、以下のように実行している。

$ python3 gpiotest.py

何番がダイヤルされたかと、受話器の上げ下げが分かるようになった!

次回予告

そろそろ本格的にアプリを作ってみることにする。


ちなみに、本シリーズの記事一覧はこちらからどうぞ!
tokieng.hatenablog.com

黒電話をスマホの子機(Bluetoothヘッドセット)に!④

黒電話を、Raspberry Pi(ラズパイ)を使って、スマホの子機にしようという工作の記事。
過去記事は以下を参照。
黒電話をスマホの子機(Bluetoothヘッドセット)に!① - エンジニアらしき人のひとりごと
黒電話をスマホの子機(Bluetoothヘッドセット)に!② - エンジニアらしき人のひとりごと
黒電話をスマホの子機(Bluetoothヘッドセット)に!③ - エンジニアらしき人のひとりごと

一体、いくつの記事になるんだろう・・・。

そんな心配は忘れて、そろそろ黒電話をいじろう。今回は、いよいよ黒電話とラズパイを接続するぞ!


さてどうやって接続しよう。
まず思いつくのが、黒電話から延びている電話線。
これをラズパイに接続すれば、黒電話本体に手を入れずに済むかも!?

電話線って

電話線と言っても、その中に2本の線が入っている。

たった2本!?

たった2本でどうやって電話機はベルを鳴らしたり音声のやりとりをしているんだろう・・・?

そこで、ぐぐって先人の知恵を拝借することにした。
ありがたや、ありがたや(-人-)
http://www.nahitech.com/nahitafu/mame/mame5/telephone.html

どうやら電話線には、こんな電気が流れるらしい。
・直流48V
・受話器とると、電圧は5V程度に下がる
・着信すると、ベルを鳴らすために16Hzの交流信号が流れる
・相手が応答すると、2本の線の極性が反転する
・もちろん音声もこの電話線に乗る
 
もう、電気回路の素人じゃワケわからん・・・。

黒電話を分解する

やっぱり、分解することにする。分解して各パーツをラズパイに繋いだら、なんとかなるかもしれん。
分解すると、こんな感じだった。
f:id:tokieng:20150609204521j:plain
f:id:tokieng:20150609212558j:plain

あの銀色のかたまりは何だろう?その周りに、カバーから延びているいくつかの線がつながっている。

回路図も見つけた。ありがたや。この回路図には、配線の説明も書かれている。
参考にした回路図→ http://musen.server-shared.com/KURODENWA.html

が、回路の素人にはやっぱりさっぱり分からんので、さらに先人の知恵を拝借(-人-)
http://hiroe.hatenablog.com/entry/2013/12/23/223826

ふむふむ。黄色の線と、灰色の線が重要らしい。
黄色の線がダイヤルとつながっていて、灰色の線がフックとつながっている、と。

ダイヤルから延びる線

まずは一番気になる、ダイヤル。その構造を簡単にまとめると、以下のような感じになるらしい。

  • ダイヤルは、回路の接続/切断を繰り返すスイッチのようなもので、これを使って「パルス」信号を送信する。
  • パルスは、ダイヤルを回したときではなく、指を離してダイヤルが戻るときに送信される。
  • 「1」をダイヤルするとパルスが1個、「9」をダイヤルするとパルスが9個、「0」をダイヤルするとパルスは10個。
  • 600-A2電話機は、20個/秒という一定のペースでパルスを送信する。つまりパルス1個は50ms。

先ほど紹介したブログと回路図によると、DiとDsがダイヤルによるスイッチを表している。ここではDiスイッチとDsスイッチと呼ぶことにする。
Diスイッチの両端は、D1ケーブル(黒線のある黄色い線)とD2ケーブル(単なる黄色い線)に繋がっていて、
Dsスイッチの両端は、D2ケーブルとD3ケーブル(黒い点線のある黄色い線)に繋がっている。

なるほど。

さあラズパイの出番だ!

以下の回路図のように、ラズパイと黒電話を繋いでみる。
f:id:tokieng:20171001174059j:plain

そしてラズパイで以下のコマンドを実行してみる。

$ echo 17 > /sys/class/gpio/export
$ echo in > /sys/class/gpio/gpio17/direction
$ while true; do cat /sys/class/gpio/gpio17/value; done
# 数字が表示され始めたら、ダイヤルを回してみる。
# 飽きたら、Ctrlキーを押しながらCキーを押す(以下、Ctrl-Cと表記)
0
0
0
0
0
0

0が、ズラーっとと出てきた。ここでダイヤルを回してみると、時々1が出てくる。

同様に、D3ケーブルをGPIO22(15番ピン)につないで試してみる。

で、分かったことを図にすると、以下の感じになる。
f:id:tokieng:20171007145136j:plain

ということで、0→1に変化した回数を数えれば、その回数がダイヤルされた数字になりそうだ!
そろそろ、ちゃんとプログラムを書こう・・・。

ちなみにフックは

フックの状態も、同様の方法で分かる。
フックは、回路図ではHS1とHS2として表記されていて、灰色の線(H1とH2、またはH3とH4)に繋がっている。
受話器を置いている状態(オンフック)と、受話器を持ち上げた状態(オフフック)は、H1↔H2間、もしくはH3↔H4間のスイッチON/OFFで区別できそう。

次回は

ダイヤルとフックの状態が分かる、簡単なプログラムを書いてみたい。


ちなみに、本シリーズの記事一覧はこちらからどうぞ!
tokieng.hatenablog.com

NECの超軽量2-in-1 Windowsノート LAVIE Hybrid ZERO HZ300

買っちゃった。
まさかこんないい機種が、むちゃくちゃ手ごろな値段で買えるとは思わなかった。
http://nec-lavie.jp/pictures/pc/lavie/nt/201702/hz330gas/192x192.jpg

(この記事、基本的には「私のPC購入日記」ですが、HZ300に興味のある方向けの情報も入れてます)

3年ほど使ってる ASUS Transbook T100TA が、バッテリー不調(経年劣化?)により突然電源断することが増えてきた(保存してないデータも消えるし)ので、新しいノートPCを買うことにした。

そこで、3年間T100TAを使ってみて感じた、次のノートPCでかなえたい条件を考えた。
私の場合は、でっかいデスクトップPC(自作)があるのノートPCにはパワフルというより機動力が欲しい。具体的には、

  • CPUは、そこそこでいい
  • メモリは4GB以上
  • ストレージは64GB以上
  • バッテリは8時間以上
  • 軽量(できれば1.2Kg以内)
  • ディスプレイは11~13インチ台
  • できればフルHD
  • タッチパネル
  • 2-in-1だと嬉しいけど、予算との兼ね合いかな
  • お値段は、5万円台だとありがたいけど、7万円台以内で・・・
  • Officeは無くていいけど、あると嬉しい

・・・と、結構無茶な要求。

と思ってネットで探してたら、こんなサイト見つけた。

NEC Direct(NECダイレクト)

で、この機種が目に留まった。
LAVIE Hybrid ZERO [Windows 10 Home、Core m3、Office Home & Business Premium、ムーンシルバー、1年間保証] (NSLAA773HDGH1S)
f:id:tokieng:20170924144516j:plain
画像出典: NECアウトレット商品ノートPC

※2017/10/14追記 売り切れましたね・・・

ええ!これって、あのものすごく軽い LAVIE Hybrid ZERO なの!昔、電器屋の店頭で触ったことがあって、あまりの軽さにびっくりした記憶のある機種が!
それがまさか、税抜きとはいえ79,800円だなんて!消費税入れると8.7万円くらいと予算ややオーバーだけど、これは掘り出し物だ! 「アウトレット品」ですけどね!
出始めは、たしか15万円くらいしたような・・・。

なんてったって、2-in-1のWindows機なのにキーボード付けた重量が800g未満で、タッチパネルのフルHD液晶で、なのに10時間(公称)も持つバッテリー。
私の願望をすべて、予算よりちょっと出るだけで叶えてくれるなんて!

でも機種名書いてないな・・・。Hybrid ZEROは、古いモデルも含めていくつか機種あるみたいだし。むやみに飛びついても・・・。
[商品詳細]に書いてある条件といえば、

  • LAVIE Hybrid ZERO
  • 11.6インチ液晶 フルHD IPS液晶(タッチパネル)
  • CPU m3-6Y30
  • メモリ 4GB
  • ストレージ 128GB eMMC
  • LTE/3G通信機能なし
  • Office Home & Business Premium プラス Office 365 1年間
  • モバイルパワーキーボード
  • 本体のみ 398g、キーボード付けると786g
  • バッテリー 10.3時間

合致するのは、

  • PC-HZ300DA(2016年春モデル)
  • PC-HZ300FA(2016年秋モデル)
  • PC-HZ300GA(2017年春モデル)

あたりか。
ちなみに11.6型のHybrid ZEROには、HZ300以外にも、LTE内蔵のHZ330、キーボードがなくてスペックも若干抑え目なHZ100の3系統あるけど、表記している条件からすると明らかにHZ300系。

さて、DAかFAかGAか。
価格.com で価格の相場を調べてみると、

  • PC-HZ300DA:最安値で9万円ほど(税込み)
  • PC-HZ300FA:最安値で8.3万円ほど(税込み)
  • PC-HZ300GA:最安値で14.6万円ほど(税込み)

どうみても、GAではなさそう・・・。

(ちなみに、楽天で調べるともっと安い店舗も出てくるけど、本来はOffice付きのこの機種なのに [Officeなし] と書かれたものが出品されてて、怪しさ満点。箱開けてOffice抜いて売ってるんかい!)

スペックの相違を調べてみた。
http://nec-lavie.jp/navigate/products/pc/161q/01/lavie/hz/spec/index02.html
http://nec-lavie.jp/navigate/products/pc/163q/09/lavie/hz/spec/index02.html
http://nec-lavie.jp/navigate/products/pc/171q/02/lavie/hz/spec/index02.html

項目 DA FA GA
液晶 LED FullHD 同左 LED FullHD IPS
背面カメラ RealSenseカメラ。FullHD。200万画素 WQHD。500万画素 同左
本体重量 410g 398g 同左
総重量 798 786g 同左

スペックから判断すると、GAっぽいんだけどなー。
FAだったら他店舗のほうが安いかなー。NEC Directのアウトレットでポチッと買うかな~、どうしよっかなー。

と考えていたら、「もしかしたら秋葉原の店頭で何か別の機種の掘り出し物があるかもしれない!」と急に思い立って、秋葉原の市場調査に行くことにした。
展示品限りとか本日広告の品とか、いろいろ見て回ってきた。

そこで得た結論。
私の予算で買える範囲中で、HZ300を超えるものは全く見当たらない、と。メーカーの安心感もダントツだし。
他と比べて無茶苦茶安いアウトレットと銘打った商品だけど、メーカー直販だから安心だし(どっかの楽天の店舗とは違って)。

えぇい、ぽちっとな!

f:id:tokieng:20170924161732j:plain

買っちゃった。
てか、 PC-HZ300GAかいな!!2017年春モデル!今年の!
これはびっくり!
ハード的な差異は少ない(液晶が変わったかどうか?)ものの、うれしい。

あと、今回購入したHZ300GAではなくHZ300DA発売時の記事だけど、これすごい。
japanese.engadget.com
DAのカメラはRealSenseだけど、GAは違うっぽいので、そこのところ割り引いて読んでください。

というわけで

私の当初の希望をはるかに上回る機種が買えちゃった!

  • CPUは、そこそこでいい → Core m3!
  • メモリは4GB以上 → 4GB♪
  • ストレージは64GB以上 → 64GB♪
  • バッテリは8時間以上 → 公称10.3時間!!
  • 軽量(できれば1.2Kg以内) → 0.8kg未満!!
  • ディスプレイは11~13インチ台 → 11.6インチ♪
  • できればフルHD → フルHD
  • タッチパネル → やった♪
  • 2-in-1だと嬉しいけど・・・ → やった♪
  • お値段は、5万円台だとありがたいけど、7万円台以内で・・・ → 税込みだとちょっと足出たけど
  • Officeは無くていいけど、あると嬉しい → 付いてた♪

安心保証サービス月額版

で、2017年春モデルということは、NECが提供している「安心保証サービス月額版」の対象になっているということ。FAとGAは対象だけど、DAは対象外。
121ware.com > サービス&サポート > 安心保証サービス月額版 最大1年間無料
これは月額400円を払うことで、メーカー保証だけでなく落下や水に対する事故に対しても追加出費なく修理してくれるサービス。
同様の保証サービスを3~5年間前払いにて契約するというプランもあるが、何年使うか分からないのでちょっと躊躇してしまう。
しかしこれは月額制なので、止めたいときに止められる。しかも、はじめの1年間は無料!
やった!

結論

LAVIE Hybrid ZERO PC-HZ300GAが、アウトレット品ながら 税抜き79,800円で売ってる!
欲しい方は以下のページへ!
NECアウトレット商品ノートPC

買ったのに、あのページの「限定数」が減ってないなー。残数ではないんかな?

あと 安心保証サービス月額版の対象機種なので、特に外に持ち歩く人には(この機種は持ち歩くのに最適)おすすめ。

で、まだポチッと買っただけで届いてないので、商品の使用感は分かんない(笑)

とりあえず、買えると思ってなかった機種が、思ってもない金額で売ってたので、ほかに悩んでる人の参考になればと思い、記事書いてみました。

あ、そうそう。アウトレット品でなくても、メーカーカスタマイズでメモリ増やしたりして買えますよ!
NEC Direct(NECダイレクト)
LAVIE Direct HZ(D) が、HZ300とかの11.6型液晶タイプです。
LAVIE Direct HZ は、液晶が13.3型のタイプです。
てか上記バナー広告からサイトにアクセスすると、直接サイトに行ったときよりも割引率の高いクーポンがもらえるのね。知らんかった・・・。
あー、13.3型ひかれるなー(完全に私の予算オーバーだったけど)。いいなー。ほしいなー。

ひとつ気がかりなのは、そろそろ次の機種が発表される頃かな?ということくらい。
(まぁでも出始めはきっとお高くて、私には買えないでしょうけどー)

あと、ついでにこれ入れました。ご参考までにー。
ウイルスバスター公式トレンドマイクロ・オンラインショップ

黒電話をスマホの子機(Bluetoothヘッドセット)に!③

②の続き。
ラズパイ(Raspberry Pi)を使って、黒電話をスマホのヘッドセットにしようと工作してます。
tokieng.hatenablog.com
tokieng.hatenablog.com

PulseAudioのインストール

今回は、バージョン10をインストールしてみる。
なぜ10なのかは、前回の記事を参照のこと。

apt-getコマンドでインストールできるバイナリは公開されていないので、Linux(UNIX)らしくソースコードをダウンロードして、自分でビルドする必要がある。
ちなみに、以下のやり方で必ずうまくいく、というわけではない(メモ片手に書いてるだけで、あんまりちゃんと確認してない)ので、ご注意を。

ビルド

ここで公開されている。
https://www.freedesktop.org/wiki/Software/PulseAudio/

News
Jan 2017
2017-01-19: PulseAudio 10.0 has been released. (Changes)
1) ソースコードを持ってくる。tar.xz形式で圧縮されているので、展開する。
$ wget https://www.freedesktop.org/software/pulseaudio/releases/pulseaudio-10.0.tar.xz
$ tar xf pulseaudio-10.0.tar.xz
$ cd pulseaudo-10.0

※念のため書いておくと、最初の "$" は、シェルのプロンプトを表すので入力しないこと。

2) 必要なライブラリをインストールする
$ sudo apt install libtool intltool libcap-dev libsndfile1-dev libspeexdsp-dev libsbc-dev libcap-dev libssl-dev libasound2-dev libsamplerate0-dev liborc-0.4-dev libwebrtc-audio-processing-dev
3) いよいよビルド
$ ./bootstrap.sh ←いらないかも?
$ ./configure --sysconfdir=/etc --localstatedir=/var --disable-bluez4
$ make -j 4

makeコマンドに "-j 4" をつけると、ラズパイ2とかラズパイ3では、ビルドが少し早くなる。
エラーが出たら、必要なライブラリがないとかが原因なので、なんとかして解決する。

4) 既にインストールされているものを削除する

既にPulseAudioがインストールされている状態なので、インストール済みのものを消す。入っているものを探してみた。

$ apt list --installed | grep pulse

そしたら以下のものが出てきた。

libpulse-mainloop-glib0/stable,now 5.0-13 armhf [インストール済み、自動]
libpulse0/stable,now 5.0-13 armhf [インストール済み、自動]
libpulsedsp/stable,now 5.0-13 armhf [インストール済み、自動]
pulseaudio/stable,now 5.0-13 armhf [インストール済み、自動]
pulseaudio-module-bluetooth/stable,now 5.0-13 armhf [インストール済み]
pulseaudio-module-x11/stable,now 5.0-13 armhf [インストール済み、自動]
pulseaudio-utils/stable,now 5.0-13 armhf [インストール済み、自動]

あと、pavucontrolも。

ひたすら消す。
あ、libpulse0 は、消そうとするといろんなものがついでに消されてしまうので、とりあえず残しておいた。

$ sudo apt-get remove libpulse-mainloop-glib0 libpulsedsp pulseaudio pulseaudio-module-bluetooth pulseaudio-module-x11 pulseaudio-utils pavucontrol
5) インストールする
$ make install

起動してみる

PulseAudioをデーモン起動させる。
初期状態では時々勝手にPulseAudioが終了してしまうので、
/etc/pulse/daemon.conf に、
 exit-idle-time = -1
を追記しておく。

$ pulseaudio -D

"-D" をつけることで、デーモンとして起動する。(バックグランドで起動しつづけている)

起動に成功しているかどうかを確認する。数秒経ってから、以下を実行する。

$ ps aux|grep pulseaudio
  • PulseAudioが起動しているとき
$ ps aux|grep pulseaudio
pi        1044  0.4  1.9 109148  8448 ?        S<l  07:43   0:01 pulseaudio -D
pi        1069  0.0  0.4   3768  2036 pts/0    S+   07:49   0:00 grep --color=auto pulseaudio
# ↑pulseaudioのプロセス(1行目)が出力されているので、PulseAudioは起動中
$
  • PulseAudioが起動していないとき
% ps aux|grep pulseaudio
pi        1085  0.0  0.4   3768  2036 pts/0    S+   07:49   0:00 grep --color=auto pulseaudio
$ # ↑PulseAudioのプロセスが出力されず、grepのプロセスのみ出力されているので、PulseAudioは起動していない

ちなみに、PulseAudioデーモンを停止させるには、以下のコマンドを実行する。

$ pulseaudio -k

動作確認

まず、USBオーディオの設定

USBオーディオ変換ケーブルをラズパイに差している状態では、ラズパイからの音声出力先として、以下の3つが存在することになる。

  • 本体内蔵のHDMI端子から
  • 本体内蔵のアナログ出力端子(ヘッドフォン端子)から
  • USBに接続したオーディオ変換ケーブル出力端子から

なので、どこから出力するかを指定する必要がある。
どうやってやるのか忘れたw(おいおい)
思い出したら、追記しよう・・・。

音を鳴らしてみる。wavファイルが入っているので、それをpaplayコマンドで鳴らす。

$ paplay /usr/share/sounds/alsa/Front_Center.wav

音が鳴らなかったら、オーディオ出力先を再度確認するとともに、PulseAudioが起動中であることを確認すること。

スマホとラズパイをペアリングして、スマホの音を鳴らす

スマホもラズパイ(USB Bluetoothドングル)も、BluetoothA2DPに対応している(はず)なので、スマホで音楽を再生してみる。
A2DPは、音楽などをヘッドフォンで鳴らすためのプロファイル。

まずはスマホとラズパイをペアリングする。
GUIで操作してもよいが、ここではbluetoothctlを使ってみる。

$ bluetoothctl
[bluetooth]#

このときに、bluetoothctlのコマンドを入力する。どんなコマンドがあるかは、helpコマンド。

[bluetooth]# help

では早速、ペアリングしてみる。

[bluetoothctl]# discoverable on
[bluetoothctl]# pairable on
# ラズパイをペアリング可能なモードにする。
# ここでスマホのBluetooth設定画面に、ラズパイが出てくるはず。
# その画面で、ラズパイを選択すると、ラズパイ側では以下のような出力がされる。
[NEW] Device XX:XX:XX:XX:XX:XX Xperia XZ
# ↑ ラズパイがスマホ(ここではXperia XZ)を見つけた。
# XX:XX:XX:XX:XX:XX は、スマホのBluetoothアドレスなので、コピーしておく。
# ラズパイに「このデバイスと接続してもよいよ、信用して!」と伝えるために、以下のコマンドを実行する。
# (XX:XX:XX:XX:XX:XXの部分は、実際には上で検出された実際のBluetoothアドレスを入力する。さきほどコピーしたのをペーストする。
[bluetoothctl]# trust XX:XX:XX:XX:XX:XX
# うまくいくと、下の2行が表示される。
[CHG] Device XX:XX:XX:XX:XX:XX Trusted: yes
Changing XX:XX:XX:XX:XX:XX trust succeeded

Androidの場合は、以下のようになっていればよい。
f:id:tokieng:20170913224521p:plain
もし「メディアの音声」が表示されないときは、PulseAudioが起動中かどうかを確認して、再度試してみる。

ofonoのインストール

apt-getでは、ofono-devでもAPI入らないっぽい?
ということで、 ofono も buildする。

ビルド

# 1) まず必要なライブラリをインストール
$ sudo apt install libudev-dev libdbus-glib-1-dev mobile-broadband-provider-info
# 2) ソースコードを持ってくる。tar.xz形式で圧縮されているので、展開する。
$ wget https://www.kernel.org/pub/linux/network/ofono/ofono-1.20.tar.xz
$ tar xz ofono-1.20.tar.xz
# 3) 展開先に移動して、ビルド実行
$ cd ofono-1.20
$ ./configure --sysconfdir=/etc --localstatedir=/var --enable-test --enable-tools
$ make -j 4
# 4) うまくいったらインストール
$ sudo make install
# 5) サービスとして自動起動するように設定する
$ sudo systemctl enable ofono
$ sudo systemctl start ofono

ちなみに、configureコマンドのオプションに --enable-test を入れているのは、動作確認用のスクリプトもインストールしておきたいので。

PulseAudioの設定

ofonoを使うよ、とPulseAudioに伝える必要がある。
/etc/pulse/default.pa の以下の行を書き換える。
load-module module-bluetooth-discover
 ↓
load-module module-bluetooth-discover headset=ofono

書き換えたら、PulseAudioを停止させて、再度起動させる。

ofonoの動作確認

先ほどのインストール手順で、動作確認用のスクリプトもインストールしておいた。このスクリプトは /usr/local/lib/ofono/test/ に存在する。
このスクリプトはPython3で記述されていて、いくつかのライブラリが必要なので、まずそれらをインストールする。

$ sudo pip3 install dbus-python
  • /usr/local/lib/ofono/test/monitor-ofono
  • /usr/local/lib/ofono/test/dial-number
  • /usr/local/lib/ofono/test/answer-calls

monitor-ofonoは、Bluetoothのイベントを表示するもの。このスクリプトを実行すると、スマホの着信や発信などのイベントが表示される。
dial-numberは、スマホに発信させるスクリプト。例えば「117」(時報)とか「03177」(東京地方の天気予報)とかにかけてみる。
answer-callsは、スマホにかかってきた電話を取るスクリプト

うまくいけば、dial-number、answer-callsを使って、スマホでの発信・着信操作が行える。通話状態になったら、ラズパイのUSBオーディオ変換ケーブルに差したマイク・スピーカーを使って、会話ができる。

次回予告

うまくいったら、次はいよいよ黒電話の改造だ!



ちなみに、本シリーズの記事一覧はこちらからどうぞ!
tokieng.hatenablog.com

黒電話をスマホの子機(Bluetoothヘッドセット)に!②

黒電話をスマホのヘッドセットにする工作。
①のつづきです。前回はこちら。
tokieng.hatenablog.com


黒電話といえばダイヤルとベルだけど、まずは準備から・・・。

Raspberry Pi(以下ラズパイ)を、Bluetoothハンズフリー機器としてスマホと接続できるようにした。
f:id:tokieng:20170805180215j:plain

ラズパイをBluetoothハンズフリー機器にする

Bluetoothハンズフリー機器とは

Bluetoothハンズフリー機器とは、
1)イヤホン
2)マイク
3)着信(電話を受ける)
4)発信(電話をかける)
の4つの機能を備えたものをいう(ことにする)。

そもそもBluetoothは通信方式であって、その通信路を使ってどのような機能を実現するかは、「プロファイル」という形で規定している。
たとえば、ノートPCにBluetooth無線マウスを接続して使うことができる。これは、HIP(Human Interface Profile)というプロファイルが規定してあって、ノートPCとマウスの両方がHIPの機能を持っているためだ。

で、ハンズフリーの場合はどんなプロファイルかというと、HFP(Hands Free Profile)がそれにあたる。

Bluetooth内蔵のスマホHFPに対応しているので、あとはラズパイ側にもHFPの機能を持たせればよい。
まずはそこから作っていくことにした。

HFPのメモ

で試行錯誤していたら、やっぱりHFPの仕様を知らないと困ることが出てきた。
調べたら、仕様書があった(英語だけど)。
https://www.bluetooth.com/specifications/adopted-specifications

いろんな単語が出てくるので、キーワードをメモしておくと、
主な登場人物としては、この2人。

  • AG = Audio Gateway = 電話機
  • HF = Hands-Free unit = ヘッドセットとか

この2人の通信をサポートするのが、以下の方々。

  • HCI = Host Controller Interface
  • GAP = Generic Access Profile
  • SPP = Serial Port Profile
  • RFCOMM = RS-232Cをエミュレートするもの。

RFCOMMでつないだ後、ATコマンドを送るみたい。
RS-232Cを介してATコマンド、というあたりが、昔のアナログモデムっぽい。
参考になるのは、以下の章を中心に読むとよいと思う。
> 4.10 Transfer of Call, Call Setup, and Held Call Status

ちなみに、HFPとよく似たのに、HSP(Hands Free Profile)というものがある。
普通のBluetoothイヤホンマイクは「イヤホン」「マイク」「電話を取るためのボタン」「ボリューム調整」という機能を持っているが、HSPはまさにそれを実現するためのプロファイル。HSPは、スマホとイヤホンマイク間で「双方向の音声」「ボタンが押されたという通知」「ボリュームの上げ下げ調整」を行う程度の機能しかない。
HFPは、HSPのゴージャス版という感じ。

ラズパイにHFP機能を持たせる

以下のソフトウェアが必要となる。

  • BlueZ
  • oFono
  • PulseAudio

ここでは、これらを簡単に紹介する。

BlueZ

ラズパイ(というかLinux)でBluetooth機能を利用するには、BlueZというソフトが必須。BlueZは、Bluetooth機能全般を司るソフトで、いくつかのプロファイルを実装している。
以前はBlueZ単体でHFPをサポートしていたが、今ではoFonoというソフトがあるので、BlueZ(バージョン5以降)からHFP機能は削除されているという。
http://www.bluez.org/release-of-bluez-5-0/

Remove internal support for telephony (HFP and HSP) profiles. They should be implemented using the new Profile interface preferably by the telephony subsystem of choice (e.g. oFono which already supports this)

Raspbian(2017年7月時点)にインストールされているBlueZは、バージョン5だった。ということでHFP機能は無く、oFonoが必要になる。

oFono

電話関係の制御をするソフトウェア。つまりHFP機能を実装したもの。
Raspbianには入っていないので、手動でビルドしてインストールが必要。

PulseAudio

そしてPulseAudio。これは、ラズパイの音声全般をコントロールするソフトで、ここでは相手からの音声をスピーカーで鳴らしたり、相手に伝える音声をマイクから拾うために使う。

Raspbian(2017年7月時点)でインストールされているPulseAudioは、バージョン5.0。
しかしバージョン5は、HFPをサポートしていない(お前もかよ・・・)。
https://www.freedesktop.org/wiki/Software/PulseAudio/Notes/5.0/

So what's the way forward with getting the HSP and HFP profiles work with BlueZ 5? There is partial support for those in oFono (a telephony daemon), which will hopefully be completed soon, and the next PulseAudio release will then hopefully support HSP/HFP through oFono. This pulls in a telephony stack as a dependency for using your Bluetooth headset, which might be considered overkill. This issue is yet to be resolved with the BlueZ developers.

要約すると、

  • BlueZ 5 support (A2DP only)
  • だって BlueZ5がHSP/HFPサポートやめたから。
  • 次のPulseAudioのリリースでは、oFonoを経由したHSP/HFPのサポートをするよ。

ふむ、別のバージョンをビルドしてインストールしないといけないのか・・・。

で、バージョン6。
https://www.freedesktop.org/wiki/Software/PulseAudio/Notes/6.0/

BlueZ 5 HFP (hands-free) profile support via oFono
 The oFono HFP backend for BlueZ 5 naturally introduces a runtime dependency on oFono. The minimum supported oFono version is 1.13.

インストール条件は oFono >= 1.13

バージョン7~9には、BT関連のトピックなし。

バージョン10では、
https://www.freedesktop.org/wiki/Software/PulseAudio/Notes/10.0/

 Automatically switch Bluetooth profile when using VoIP applications
 Separate volumes for Bluetooth A2DP and HSP profiles

よく分からんが、きっとあると便利な機能が入ったんだろうな(笑)。

11にも、HFP関連のネタがいっぱいある。
https://www.freedesktop.org/wiki/Software/PulseAudio/Notes/11.0/
が、今回の工作時点では、まだ開発中っぽかった。

ということで、PulseAudioは、10のビルドを試みてみる。

長くなったので、次の記事では、PulseAudioとoFonoのインストールを行ってみる。③に続く。



ちなみに、本シリーズの記事一覧はこちらからどうぞ!
tokieng.hatenablog.com