黒電話をスマホの子機(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のような電流が作れそうだ。
しかも、上の調査の結果、コイルに与える電流は厳密に交流でなくても、ハンマーは鐘を叩いたらすぐに鐘から離れてくれるし。

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

次回予告

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

黒電話をスマホの子機(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

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

次回予告

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

黒電話をスマホの子機(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で区別できそう。

次回は

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

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オーディオ変換ケーブルに差したマイク・スピーカーを使って、会話ができる。

次回予告

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

黒電話をスマホの子機(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のインストールを行ってみる。③に続く。

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

黒電話

ひょんなことから、黒電話をプレゼントされた(ふつうこんなの贈らないw)。
黒電話とは、電話を掛けるときにダイヤルをじーこ・じーこ・・・と廻すやつで、着信するとリーン・リーンする、黒いあれ。
f:id:tokieng:20150609203450j:plain
ということで、これをスマホの子機(ヘッドセット)に加工することにした。

ひっくり返すと裏に600-A2と刻印されている。600-A2型の黒電話だった。
うっすらと "76" という数字も見える。これは1976年製造の印。お、私よりも年上だ!
f:id:tokieng:20150609203736j:plain

で、ヘッドセットとして持たせたい機能は、以下の4つ。

  • ダイヤルで発信
  • 着信したらベルを鳴らし、受話器を取ったら応答する
  • 受話器のスピーカーから音が聞こえる
  • 受話器のマイクを使って、音を伝える

手元に、暇を持て余しているRaspberry Piが転がっていたので、それを使うことにした。

やりたいことを図にしてみた。
まず、普通にスマホ単体を使って通話するときの図が以下で、
f:id:tokieng:20170805180129j:plain
このスマホにイヤホンマイクを繋いだ場合が、以下の図で、
f:id:tokieng:20170805180150j:plain
さらに、このイヤホンマイクをラズパイ+黒電話に置き換えた以下の図が、今回の作りたいものになる。
f:id:tokieng:20170805180215j:plain

用意するもの

というわけで、以下の4つを用意した。

Raspberry Piは、側面の端子に音声出力はあるものの音声入力がないので、USBオーディオ変換ケーブルというものを使った。
本当は、Wi-FiBluetoothも内蔵しているRaspberry Pi3を使うのが楽なんだろうけど、単に持ってないので今回は使ってない(^^;

以下の手順で、工作を行うことにした。

  • ラズパイをBluetoothハンズフリー機器にする
  • 黒電話のダイヤルなどをラズパイの入力として使う
  • ラズパイから黒電話のベルを鳴らす

で、作ってみた。

いやー長かった。この苦労は次回以降のブログネタとして、とりあえず完成動画を。

ダイヤル廻すと、発信します。東京地方の天気予報(03-177)を聞いてみます。
画面左下のスマホの画面にもご注目!

黒電話(600-A2型)で発信 - ダイヤル廻して発信
ちゃんと受話器から音も聞こえるよ!

そして、スマホに電話をかけると、黒電話のベルが鳴ります。
受話器を取ったら、ちゃんとベルが止まります。

黒電話(600-A2型)で着信 - スマホに着信するとベルが鳴ります
え?ベルの鳴り方がちょっと違う?気づいたあなたは鋭い!
ちょっと回路に手を抜いたためにベルを鳴らすパワーが十分に得られなかったため、ちょっとごまかしてます(苦笑)。

f:id:tokieng:20170910162549j:plain

作るにあたっていろんなことを調べたり試行錯誤したので、せっかくなので作り方のメモを書こうと思います。次回に続く。