マイコン工作実験日記

Microcontroller を用いての工作、実験記録

制御タスクを追加する

2016-03-31 23:25:49 | SLIC
これまでの作業で基本的な機能パーツが揃ってきましたので、これらを制御して電話として機能させるための制御タスクを用意することにしました。全体は、下図に示すように5つのタスクで構成することにしました。



VinTask音声信号の入力処理タスク。DTMFの検出も行う。
VoutTask音声信号の出力処理タスク。トーンの生成も行う。
SlicTaskフッキング検出並びに着信鳴動を生成するタスク。
WT32TaskWT32の音声入出力ならびにイベント解析を行うタスク。
PhoneTask全体の制御を行うタスク。LCDへの出力も行う。


VinTask, VoutTask, SlicTask, WT32Taskの各タスクはこれまでの実験で作ってきたものです。そして今回、全体を制御するタスクとしてPhoneTaskを作り始めました。

まずはトーン生成機能の追加。VoutTaskではダイアルトーンのような単一周波数のトーンを連続して生成する機能を持っていますが、ふたつの高さの音を繰り返して生成することはできません。そこでPhoneTaskから2つの周波数を切り替える指示をVoutTaskに送ることでこれを実現してみました。トーンの生成は、フッキングがトリガとなって開始、終了します。



HFP接続が無い状態でオフフックした場合には、400Hzと600Hzを交互に出すことでエラー通知とします。オンフックされたならば、トーン生成を止めます。



HFP接続が確立した状態ではオフフックを検出すると、400Hzを連続して生成することでダイアルトーンを出力します。

アイコン表示を使ってみる

2016-03-27 19:17:00 | Weblog
LCDをつけたので、やはり実際の動作と関連付けてアイコンを表示したくなります。



HFPで接続すると WT32は次のようなイベントを出力します。


Signalと battchg の出力に合わせてアイコンを表示してみました。ついでに、ネットワーク名も表示。




battchg は最大が5なので、レベル3を電池残量アイコンを外枠と中のセグメントの計3セグメントで表現してみました。ことろが、実際の
スマホの画面では電池残量が 79%となっています。どうやら、80%を下回るとbattchg の値が3になっているようで、スマホ画面での
電池残量とLCD上での表示から受ける印象の違いが大きすぎました。レベル3でももう1セグメント入れておき、レベル4とレベル5は
同じ扱いで満量表示した方が良さそうです。

STM32CubeMX 4.14.0

2016-03-25 20:24:39 | Weblog
STM32CubeMXの新バージョン4.14.0が出たので、早速インストール。このバージョンでは、ついに動作プロットフォームとして Mac OSがサポートされることになったのが嬉しい知らせです。ところが、わたしのEl Capitan環境では、ダウンロードしたファイルをダブルクリックしてインストールしようとすると、ファイルが壊れているというエラーが出てしまい、インストールできませんでした。



何度かダウンロードし直してみたものの、同じ症状。念のためにマニュアルをダウンロードしてインストール手順を確認してみると、間違いはありませんでしたが、もうひとつの方法としてコンソールから javaコマンドを使ってインストールする方法が紹介されていました。こちらを試してみたところ無事インストールに成功。




これまでのプロジェクトも開くことができ、今のところ問題なく動いているようです。ライブラリも新しいのをダウンロードして、ビルドし直してみると..




L476のHALドライバstm32_hal_rcc.c 内で未定義のエラーが発生してしまいます。確かひとつ前のHALドライバからこのエラーが発生するようになったようです。

const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4};

という定義を追加してやって、解決しておきます。この時、CubeMXが生成したコードを修正したのでは、次回に生成し直した時にまたエラーとなってしまうので、大元のレポジトリのコードを修正しておくようにします。Macの場合には ~/STM32Cube/Repository の下にインストールしたライブラリがあるので、ここのコードを修正しておきます。

機能的には大きな変化は無いようです。新しいチップやボードのサポートを追加して提供することがリリースの一番の理由になっているのではないでしょうか。

S60779

2016-03-20 16:36:36 | Weblog

S60779を点灯させてみました。AQM1248AはFSTNの128x48ドットでしたが、このLCDはSTNで128x64ドット表示できます。そのため、表示ドット数は多いものの画面は黄緑色っぽい色になります。どちらもコントローラとしてはST7565Rを使っていますが、S60779では以下の点に注意が必要です。
  • 横方向128ドットの表示アドレスは、カラムアドレス4から132の範囲となっている。カラムアドレス0から3の部分は表示されない。
  • アイコンはCOMSのドライバ上のセグメントに配置されている。ソフト的には8ページ目を選択して、対応セグメントに相当するカラムアドレスに1を書くことで、アイコンが点灯する。0を書くと消灯。

ST7565のデータシートを見ると65x132ドットのLCDドライバと書かれており、「どうして65ドットなのだろう?」と思っていましたが、65ドット目のCOMSはアイコンのような表示に使うことを意図して用意されていたのですね。



表示に使うフォントを探していたところ、GLCD ライブラリというのを見つけたので、フォントだけでなくドライバもこのライブラリを使って表示しています。



アンテナの1本、1本や電池残量毎にセグメントが割り当てられているので、アンテナ本数や電池残量もきちんと表現可能になっています。


仕切り直し

2016-03-19 15:38:23 | Weblog
Attendで買ったグラフィックLCD S60799, やはりAQM1248との載せ替えは無理があるので、基板を作り直しました。



スイッチをつけるスペースを残し、右にはみ出して配置しました。本体のA基板上のNucleoボードに重ねると、こんな具合。やはり、右端がはみ出してしまいました。



続いてLCDの動作確認に入ります。

LCDをつけたいが..

2016-03-16 12:25:54 | Weblog
ようやくと通話音声が通せるようになったので、SLICを介しての電話機制御の基本的な動作確認は一通りできました。これまでのコードを再整理して、Bluetooth電話機に仕上げるつもりですが、操作性を考えるとやはりLCD表示が欲しい。そこでSAIによる通話実験と並行して用意を進めていたのがこちら。



NucleoのMorphoコネクタを使って接続するLCDボードです。使用しているのは秋月のAQM1248です。ゆくゆくは漢字も表示できるようにと考えグラフィックLCDにしたのですが、B基板に比べてサイズが小さすぎですね。もうちょっと大きなサイズのLCDが欲しかった。。。

と、思っていたら、Aitendoに大きなLCDがあったので、ついつい反射的に購入。



うーん、今度はデカすぎてB基板からはみ出しちゃいます。でも、このLCDにはアンテナピクトのセグメントも用意されているので、今回の用途にはピッタシなんですよね。無理くり載せようかな。

WT32をつなげる -- build764からbuild992へ

2016-03-14 22:21:06 | WT32/BM20
SLICからの音声をSAIを使って送信できない問題で時間を潰してしまいました。

SAIの設定を変えてみても無音状態のままだったので、問題の切り分けのために試験データを使ってのSAIからの送信動作を確認してみることにしました。ロジアナで確認すると、用意したデータが正しくI2Sの信号となってWT32に送られているものの電話の通信相手には送られないことがわかったので、問題はSTM32のソフトではなくWT32側にあることが判明。WT32の設定はPS Key設定を確認してみたものの問題はなし。すがる思いでBluegigaのForumを探してみたら次のようなスレッドを発見。。

https://bluegiga.zendesk.com/entries/41721266-Connecting-two-WT-32-via-I2S

iWRAP5.0.2を使っているのですが、これまで使っていたイメージは build764でしたので、このビルドにはオーディオ信号のデジタル入力に問題があることになります。確認してみると現在は iWRAP 5.0.2のリーリースイメージは build992になっています。バージョンが同じでも、バグ修正されたビルドが出ていたんですね。気が付きませんでした。

iWRAPを更新してみると、無事双方向で音声がとおり、通話できるようになりました。

WT32をつなげる -- トリガの切り替え

2016-03-13 09:40:16 | Weblog
前記事でSAIの設定を行ったので、その方針に基づきSAIとADC/DACをつなぐコードを作成して、通話動作確認をしています。

通話時にはI2Sのフレーム信号に同期してADC/DACに外部トリガをかけることで音声を流しますが、通話していない時にはフレーム信号は流れないのでADC/DACの変換はこれまで通り、タイマを使ってトリガをかける必要があります。WT32から出力されるイベントメッセージを解析することで、通話中であることを判断してタイマートリガーとフレーム信号による外部トリガを切り替えることにしました。

このして下りの音声は正常に流れて受話器で再生することができるようになったのですが、なぜか上り音声が相手に伝わらず無音状態になってしまっています。SAIからの送信DMAの完了割り込みは定期的に発生しているので、SAI部分の送信は正常に動作しているようなので、これからさらなる原因調査を開始せねばなりません。


lftkryoのMarble Machine

2016-03-11 22:55:50 | Weblog
ちょっと前に、WintergatanのMarble Machineがネットで話題になっていました。先日紹介した10代工学のLinusさんがこの曲をコピーしてPocket Operatorで演奏した動画が投稿されたので、貼っておきます。



"素"の状態から、パターンやコード進行を入力していき演奏しているようですが、全てライブで連続して行われているところがスゴイです。入力段階からして"演奏”です。