SSブログ

VVVFをBEMFスケッチにつなげる [ds-DCCデコーダ]

(今回も字ばっかです)
 タイトルの作業をMECY様、Yaasan様とやっております。
 VVVFとBEMFの二つの機能をつなぐ方法はをいろいろ試しておりましたが、コンパイルまでは行きましたががなかなか動きませんでした。
 Yaasan様より、VVVFスケッチはTimer1で音+駆動させており、BEMFスケッチはキャリア周波数を35KHzにした、(人には無音に聞こえる)高周波PWMでanalogWriteで動かしているので、ここをTimer1に統合する必要があるという話がありました。
 VVVFスケッチ部分は昔、私がかなり場当たり的に作ったもので(その後も結局いつも場当たり的ですが・・・)、両方のソースを見比べたら、明らかにBEMFスケッチのほうが見やすかったので、そちらでとりあえずの統合をしてみました。
 ところで、
・BEMFは原理上、ときどき(10msに一回)1ms以下ぐらいでモーターの出力を止めて、現在のモーターのスピードを見るために電圧を測ります。これをフィードバックしてスピードを一定に保ちます。
・VVVFはモーターに可聴域の周波数でPWM制御することにより、モーターを震わせて音を出しています。
 で、この二つをくっつけてみたのですが、案の定、ときどきこっそりモーターが止まるので、かなり、だみ声の音が鳴る電車が出来上がりました。スケッチは一応これです。まだ高周波の時は良いですが、低周波の時(吊り掛け音風とか)はかなりカクカク感が激しいような気もします。BEMF検出部分の部分のソースを工夫するともう少しましにはなりそうです。
 で、さっき動画を撮ろうとしたのですが、配線を間違えて、モーター出力端子にDCC信号をつないでしまい、その瞬間一瞬DCC信号の音がスピーカーから聞こえたような気はしましたがその後聞こえなくなって、アンプ(PAM8408)が壊れたっぽいです。普通にVVVFでモーターは回りますが、スピーカーから音がしません・・・。
 ということではありませんが、路線を変更することにしました。少し前にrascal様から言われた、別系統で音を出せないかを検討してみました。
 VVVFスケッチには現状大きく3つの問題があります。
・音が小さい(一人で家で遊んでいるときはこれで十分だと思いますけど)
・モーターのPWMのキャリア周波数を変えながら加速/減速をするため、周波数によってパルスのDutyを同じにしたにもかかわらずモーターの回転数が全然違う
・トルクが弱く、勾配を登ろうとするとシャレにならないくらい遅くなる
 これらの問題もモーター駆動とモーター音を別にすることで、BEMFをフルに掛けつつ音もちゃんとなるので、多分、一挙に解決な予感がします。
 音を出すにはTimerからPWMを出さないといけませんがATMega328にはTimerが三つあります。
・Timer0は内部の基本的なDelayなどに使用するので、素人は使わないのが身のためのようです。
・Timer1はモーターの駆動に使用している16Bitの高機能タイマーです。ライブラリは、VVVFスケッチはTimer1、BEMFスケッチは標準のAnalogWrite(ただしキャリア周波数は変更)、で使用しているため使えません。
・Timer2はYaasan様のSoundOptionや私のMelodyで使用している8bitのTimerで、今回のスケッチでは使用していません。ただし、昔モーターを回しながらSoundOptionやMelodyを使おうとして、デコーダが止まっていましたので、高負荷な使い方(割り込みを頻繁に使う)はやめたほうがよさそうです。
 で、デコーダ開発ボードにはTimer2の出力がある3pinにアンプとスピーカーがつなげられるので、消去法でTimer2でやることにしました。
 Timer2の一番有名なライブラリはMSTimer2ですが、これは割り込みをするためのライブラリの様で、PWMだけ出したいときは使いにくそうです。次にFlexTimer2も使い方は割り込みを使うようで、やめておきました。
 トーン関数も使ってみましたが、時間を指定するため、その間制御が戻ってこないので、音を出している最中は他の処理(BEMFモーター制御、DCCパケット解析)ができないとなると、使い物になりません。
 で、一生懸命ネットを探したのですが、後は自分でレジスタをたたくものばかり見つかるので、仕方なく自分で作ることにしました。
 ベースはTimerOne-master(CCA3.0)で、Timer2でCTCモードでDuty128で矩形波が出てくるだけのライブラリです。朝からやってそこらができたのが夕方でした・・・。せっかくだから、矩形波でどこまで聞こえるかやってみたのですが、私(中年)は70us(14kHz)までは聞こえました。子供(小学生)に来てもらって聞かせたら55us(18.2kHz)ぐらいまではなんとなく聞こえると言っていました。「もう部屋に戻ってもいい?」とかなり不快に聞いてきたので、音が不快だったのか単なる反抗期なのか・・・。怖い怖い。
 で、完成したスケッチがこちら。BEMF側は全くいじらずに、メインのLoopからVVVFの音部分を呼んでいます。
 動画は以下ですが、デコーダ開発ボードを使用して、音はアンプを通すと大きすぎるので、Arudinoに直差しで、電車はアナログ電車(琴電)。BEMFはデフォルトなのでOffだったと思います。

 
 手前のDSMainR5の上にスピーカーを載せています。Timer2で生成させた矩形波をスピーカーで鳴らしていますので、ファミコンのファミスタでフライを上げたときのような音がします。ファミスタは下手だったので嫌いでしたけど。
毎度のことながらいくつか問題があり、
・VVVF部分はスムージングしないと聞くに堪えないのですが、スムージング部分が現在BEMFスケッチとリンクしていません。
・BEMFスケッチはCV5(最高電圧)を途中のスピードで切るように使っているのですが、スムージングなどを考えると、255で最高電圧になるようにして欲しい、と書きながら、よく考えるとDesktopStation側の速度規制も同じ方法ですね。(ある値以上のスピード命令を出さない)。VVVFの元スケッチは最高速度命令で最高電圧になるようにしています。
・音がファミスタです。(でもこういう音源だししょうがないか)
・新たに3pin(OC2B)を占有する。出力は11pinでも良いのだが、そちらでは、昔、スマイルコネクタと電気的に干渉して、スケッチが書き込めなくなる不具合があったことがある。
・Timer2は8ビットなので、音階の刻みが大きいようで、連続的に音階が上がるようには聞こえない場所があります。
・元クロックの分周比を変えるポイントがあり(80Hzぐらいか?)そこで、音が途切れることがあります。


コメント(0)  トラックバック(0) 

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0