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

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

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

前回までで、回路に若干の改良の余地を残しながらも、ハードとソフト(KurodenwaPi)が出来上がった!

ということで、今回の作品の紹介だ!

屋外でも発信できます

ラズパイは、スマホ用のモバイルバッテリーを電源として使えるので、外に持ち出してみたよ。

黒電話(600-A2型)を持って散歩してみた①

もちろん、屋外でも着信できます


黒電話(600-A2型)を持って散歩してみた②

トーン信号も送れます

今どきの普通の電話機は、「1」~「9」と「0」「#」「*」のボタンがあって、話しているときにそのボタンを押すと、「プー」とか「ポー」とか音が出せるよね。あの音がトーン信号。
クロネコヤマトとか日本郵便の再配達依頼を、電話で申し込んだことがある人は分かると思うけど。

で、あの再配達依頼は、トーン信号が出せる電話機じゃないと手続きができないから、黒電話からは無理。
だって黒電話だとトーン信号が出せないんだもん(黒電話は、トーン信号が発明される前の電話機だからね)。

だからせっかくなので、トーン信号を出せるようにアプリ作ってみたよ。

その動画がこちら。

Raspberry Pi内蔵の黒電話で、トーン信号を送信

フックを短く押すと、「*」の音が出るの。
(だって、日本郵便の再配達依頼の電話サービスは、最初に「*」を押せって言われるからねー)


黒電話なのになぜそんな音が出せるのかというと、実はトーン信号を作っているのは、黒電話でも、ラズパイでもなくて、Bluetoothで接続したスマホだからなのだ。

この記事の2回目で紹介したように、ラズパイ↔スマホ間は、BluetoothHFPというプロファイルで通信しているんだよね。
tokieng.hatenablog.com

で、HFPには「1のトーン信号を相手に伝えよ」とかのコマンドがあるんだ。
なので、

黒電話で1をダイヤルする
→ ラズパイがそれを検知する
→ ラズパイがスマホに「1のトーン信号を相手に伝えてね」と指令を出す
→ スマホが、電話で話している相手に「プー」という音を鳴らす

という仕組みで、トーン信号を出せるのだ。


よし、日本郵便の再配達を、黒電話から依頼するぞ!
・・・と思ったけど、僕宛の贈り物ってないからなぁ。再配達の依頼もできないやw

ほかにも!

せっかくなので、ラズパイを生かした機能欲しいよねー。
でも電話機でできる機能って・・・。

あ、旅館やホテルの客室にある電話で出来る、あれだ!

モーニングコール!

というわけで、その機能もKurodenwaPiに入ってるよ!
黒電話から 7番 に電話してみてくださいな o(^-^)o


Raspberry Pi内蔵の黒電話で、モーニングコール

0700とダイヤルしたらちゃんと「7時ちょうど」と言うし、0815とダイヤルすると「8時15分」と言ってくれる。
これは、ダイヤルされた数字をもとに、音声合成しているから出来る技なのだ。
ラズパイならではだね!

この音声合成は、以前紹介した AquesTalkPi によるもの。
ラズパイは、いろんな人が作ったいろんなソフトを使うことができるから、いろんなことができるんだねー。ありがたいよね。


旅館っぽさを醸し出すために、番号案内のプレート作って置いてるよ。
f:id:tokieng:20170820125610j:plain

え?2番?w



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

次回予告

さて、回路の改良かなー。
またトランジスタの勉強だー。

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

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

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

前回のあらすじとしては、
回路ができたんだけど、ベルを鳴らす電池がすぐに減ってしまう・・・
ということに気が付いたよ、というとこまで。

ということで、今回はちょっと回路を改良してみる。

どこを改良?

バージョン1の回路図を、再び載せてみる。

f:id:tokieng:20171111163148p:plain
回路バージョン1

この回路は、上下で2つに分かれているよね。
この下半分がベルを鳴らす回路で、電源は乾電池(9V乾電池×2本)。

で、この乾電池から回路を辿ってみると、どこにもスイッチがない。
モータードライバに、常に電気を供給している状態。これはベルを鳴らしていない時でも、ラズパイが電源OFFの時でも。
こりゃ電気の無駄だ!

ということで、スイッチを付けることにしたよ。

スイッチを手でON/OFFするの?
いえいえ、トランジスタの力を借りるの!

トランジスタを使った、スイッチング回路です。

・・・あ、作ってみたけど、ちょっと失敗したことに気づいたので、回路図はまた今度・・・(汗)。

次回予告

作ったソフトの話でも・・・。

ちなみに本シリーズの記事は、以下から読めます。
tokieng.hatenablog.com

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

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

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

前回までで、なんとか回路とアプリを作ったよ。
必要なソフトなどは、前回までにインストール済みだよね。

まずは回路の動作確認

回路がちゃんと動くのかのテストをしよう。(今のところ、ダイヤルとフックのチェック用にしかならないけど)
以下のコマンドを実行する。

$ cd
$ KurodenwaPi/test_circuit

しばらく待って、

Ready.

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

黒電話のダイヤルを回したり、受話器を取ったり置いたりすると、ラズパイが反応するはず。

黒電話の操作をラズパイで受け取っている様子

ラズパイはちゃんと反応するかな?
特にダイヤルの1~9と0は、すべてが正しく動くかどうかを確認だ!正しく番号を認識しないと、間違い電話をしてしまうからね。

あ、ベルの動作確認ツールは、今のところ無いです。

アプリの実行

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

$ cd
$ KurodenwaPi/client

しばらく待って、

Ready.

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

うまくいったけど・・・

数日経ってまた使ってみたら、なんだかベルの鳴り方が弱くなった気がする。
どうやら乾電池が減ってるみたい。

そうだよねー。前回の回路図(バージョン1)だと、モータードライバー側の回路が常にONだもんねー。

ということで、次回は回路の改良をやってみよう。



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

里芋の収穫体験もどきをしてきた@手賀沼周辺

このブログは、技術系ネタを中心に書いてるんだけど、ひょんなことから観光ネタを書くことに・・・。

ことのはじまり

はじまりは、このチラシ。
f:id:tokieng:20171123225552j:plain
「とうかつの味覚を満喫!まんぷく体験ツアー」の開催について/千葉県

「食べ放題」「無料」
こんなにうまい話があるだろうか!?
えい、応募しちゃえー!

これに応募したところ、なんとめでたく参加できたのだ!そこですごくおもしろい体験をしてきたので、簡単に紹介みよう。

体験ツアーの紹介をしてもよいけど、あんまりおもしろく書けそうにないので、それよりも、手賀沼周辺でどんな体験ができるかをまとめてみた。

手賀沼!?

唐突に出てきた単語「手賀沼」。今回の舞台は千葉県北部にある「手賀沼」という沼の周辺なのだ。

手賀沼って初めて聞いた!

で、初対面した手賀沼は、こんな感じ。
f:id:tokieng:20171123130826j:plain
f:id:tokieng:20171123130852j:plain

え?沼!?
大きな橋も架かってるし、これは川じゃないの?

地図で見ると、川じゃなかった。
https://www.google.co.jp/maps/place/%E6%89%8B%E8%B3%80%E6%B2%BC/@35.8576934,139.9919207,13z/data=!3m1!4b1!4m5!3m4!1s0x60189d3e42ba17db:0xa897ff648e6ef57!8m2!3d35.8504551!4d140.0572767

大きいなぁ。
たぶんあとで書くけど、遊覧船の船長さんが「手賀沼の水深は、深くても80cmくらい」とおっしゃってた。

なるほど、川でもなく、池でもなく、沼でした。

で、今回ご紹介する施設

あの体験ツアーで、以下の施設でいろんな体験したり食べたりした。

近隣の畑(里芋の収穫体験)、道の駅しょうなん(ランチ+買い物)、手賀沼(遊覧船で周遊)、鳥の博物館(見学)、水の館(買い物+プラネタリウム鑑賞)。

ということで、これらを簡単に紹介~。

畑で収穫体験

株式会社農彩土という、地元の農家の方々が立ち上げた会社が、農作物の収穫体験を企画しているという。
TOP - 都心からすぐ、旬野菜の収穫体験・体験農園・野菜狩り | 千葉県柏市手賀の丘“農菜土”

春頃から秋ごろまで、さまざまな農作物の収穫を体験させてくれるんだって!
今年(平成29年・2017年)の収納体験の募集は既に終わったけど、また来年も開催されるみたい!

で、今回のツアーでは里芋堀り。
本当は外の畑で行う予定だったけど、「開催当日の午前は雨」という予報だったので、前日に土から掘り起こしていただいた里芋を、参加者が小分けするという感じに。収穫体験もどき、かな。

f:id:tokieng:20171123104050j:plain
里芋は既にかごの中に
f:id:tokieng:20171123104220j:plain
「土から掘り起こしたばっかり!」という状態の里芋たち

で、ひとかたまりを持ち上げると、
f:id:tokieng:20171123104613j:plain
こんな感じ。

芋なので、親となる種芋がある。里芋は、その周りに子の芋がたくさんできて、一つの塊になってるらしい。

この塊を地面にたたきつけると、子の芋が取り出せる。
f:id:tokieng:20171123104651j:plain

たたきつける→外れた芋を拾う→楽しい→またたたきつける→拾う→楽しい→面倒なので芋を手でちぎって取り出す→やっぱり楽しい

で、一人一袋の分け前が、あっというまに収穫。
f:id:tokieng:20171123105539j:plain


今回の里芋は、不格好だけど、粘りがすごいのが特徴らしい。

アルミホイルで包み焼にしていただいた。皮ごと包んで蒸し焼きに。皮は手でつるっとむける。
f:id:tokieng:20171123105817j:plain

ほくほくだ。!焼くだけでいいし、塩や塩コショウをつけてもうまい!

で、あまりにも粘りが特徴的なので、とろろにしていただいた。
皮をむいて、
f:id:tokieng:20171123110331j:plain

すりこぎで、ごりごりと・・・
f:id:tokieng:20171123110527j:plain

生卵と、めんつゆと、白だしを、てきとーに足して、
f:id:tokieng:20171123110620j:plain

できあがり。
f:id:tokieng:20171123110742j:plain

これまたうまい!

いいなぁ。

この時に伺ったのが、

  • 芋は、収穫してすぐはおいしくない。1週間くらい置いてから。

(スーパーや道の駅で売ってるのは、1週間くらい置いた状態のもの)

  • 芋は冷やしたらダメ。6度以下はNG。だから冷蔵庫には入れない。
  • 保存は、新聞紙でくるむか、段ボールに入れる。ビニール袋は、空気が通らないからNG。

だとか。
ということは、今日「収穫」したこの里芋は、来週までおあずけかー。ぐぐ。

ほかにも、白ネギのおいしいところの試食とか、落花生の落花生たるゆえんとか、すごくおいしくためになる話も伺えた。

来年は収穫体験に行きたいぞー!

今年はこういう収穫体験を開催されてたんだって。
収穫体験トップ - 都心からすぐ、旬野菜の収穫体験・体験農園・野菜狩り | 千葉県柏市手賀の丘“農菜土”

もうこんなに書いちゃった

ほかの体験のことも書こうと思ったけど、長くなったのでまた次回。
キーワードは「とうかつのいいところ」。


ちなみに

この記事を書いたのは、今回の「ツアー体験モニター」募集要件の6番目に

<6>SNSもしくはブログを活用し、施設をPRできる方。

ってあるからなのだw
頂いた分は、きちんとお返ししないと!

・・・頂いた分のお返しができるかどうか分からないけど。

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