HOME > Various Tips > 音声合成利の活用 > LED点滅のカウントアップ


Raspberry PiでLED点滅のカウントアップ(2016/12/1)

サンプル動画

最初のサンプルは、Raspberry Piを利用してLEDの点滅テストを行います。初めて電子工作を始める時の定番です。
しかし、ただ点滅されるだけではつまらないので、今回は音声合成と連携させて点滅毎に回数をカウントアップし音声読み上げで通知させてみます。
音声の出力先はWindows 10 Mobile(スマートフォン)で、Wi-Fiを利用して通信します。このようにリモート通信を行うことでIoT機器から離れた場所にも通知できるようになります。

システムの構成は以下のようにしました。

Raspberry Pi(Client) 本体:Raspberry Pi3 B (旧型のRaspberry Pi Bでも動作する)
OS:Raspbian version 4.4.32
プログラム言語:Python version 3.4.2 (Rubyサンプルも公開)
LED回路(Client) LED:3mm赤色LED LT3U31P 波長660nm 明るさ250mcd(@20mA) VF 1.85V(~2.5V)
抵抗:240Ω
音声合成出力(Server) 本体:Freetel Katana 02(スマートフォン)
OS:Windows 10 Mobile version 1607
音声出力アプリ:Haruzira version 1.2.0

処理の流れは、大まかに次のようになります。

  1. 点滅テスト開始のメッセージを、英語・フランス語・日本語の順に音声で通知する。
  2. 点滅毎に回数をカウントアップし音声で通知する。(5回点滅を繰り返す)
  3. 終了のメッセージを、英語・フランス語・日本語の順に音声で通知する。


点滅テストの様子を動画にしました。









LED回路の配線図と回路図

LED回路はとてもシンプルな回路ですが、初めての方にもわかりやすいように配線図と回路図を作成しました。
動画ではRaspberry Pi 3 Bを使用していますが、旧型のRaspberry Pi Bでも全く同じ回路及び配線で動作します。
GPIOのピン数は増えているのですが、ピンの配置順などに変更はありません。


配線図





回路図




POINT

  • LEDは極性が有る。電流はアノード(足が長いほう)からカソード(足が短いほう)に流れる
  • 抵抗に極性はないので向きはどちらでもよい
  • 直流回路なので抵抗は、LEDの前でも後でも構わない
  • GPIOピン1本辺りの最大電流は、16mA
  • GPIO全体で供給できる最大電流は、50mA
  • 抵抗値は、LEDの仕様とRaspberry Pi本体の電圧(3.3V)、GPIOの仕様で計算する。
    この回路で使用したLEDはVF 1.85V(1.85V)で@20mA(20mA)まで電流を抑える必要がある。
    抵抗にかかる電圧: 3.3V - 1.85V = 1.45V
    電流量: 1.45V / 240Ω = 6.0mA
    今回使用した240Ω抵抗は、LEDの仕様20mA以内及びGPIOの仕様16mA以内に収まっているので問題ない。
  • 利用するGPIOピン: 電流をプログラムからON/OFFするピンと、GNDに対応しているピン。
    GNDは最終的に電気が流れる先。プログラムで制御するピンは、今回は部品が少ないので出力用にGPIO14(TXD)というシリアル通信用のピンを利用している。
    通常単純なON/OFFの場合は、特別な機能割り当てのないGPIO17,18,27など(入出力兼用)で問題ない。







制御プログラム

動画では、Raspberry Piを制御するプログラム言語として、Pythonを利用しています。Ruby用のサンプルプログラムも用意しているのでどちらでも動作できます。
通信先となるUWPアプリ「Haruzira」では、音声合成の通信ライブラリとしてPython, Ruby, .NET用のSDKを提供しています。
今回は、Raspberry Piの制御ということでPythonとRuby用のサンプルプログラムソースを公開しています。
また、SDKのユーザーマニュアルも公開していますので、詳細を知りたい場合は参照して下さい。



公開先


プログラムの補足

音声合成でテキストを読み上げるには、通常人間が話す速度と同程度の時間が必要となります。
SDKでは、音声読み上げが完了すると「読み上げ完了通知」メッセージが受信できます。今回はカウントアップの読み上げを完了してから次のLED点滅を行いたいので、「読み上げ完了通知」受信時にコールバック関数を呼び出してもらい同期をとるようにしています。
コールバック関数の中で、同期オブジェクトのロックを解除し次の処理に移行します。
同期用のオブジェクトにPythonは「event」、Ruby「Message Queue」を利用しています。
詳細は、ソースコードを参照してもらえれば理解できると思います。