So-net無料ブログ作成
  • ブログをはじめる
  • ログイン
ds-DCCデコーダ ブログトップ
前の10件 | 次の10件

Mp3V5というかR6n用のSLスケッチの更新(線形補間16KHz化) [ds-DCCデコーダ]

 SL103_8K_・・・ですが、KAKKA様からSL102でCV値の書き換えができないというお話があり、こちらでMp3V5で試して、書き換えは出来たのですが、そこから派生させているSL103_8Kで書き換えが出来たりできなかったり、(できなかったりが多い)というような状況ですので、調査しました。
 で、直りました。原因は割り込みと通常のどちらでも使う変数をvolatile宣言してやらないといけなかったのですが、していませんでした。で、現象は、その該当部分は普通に動くのだがCV値の書き込みができない、という不思議なバグ化していました。上記DesktopStation様のWiki内に対策したスケッチを上書きしてあります。直ってよかった。
 最新のSL、DLスケッチは元サンプリングデータ8KHzを線形補間してやり16kHz化した音による再生としています。音の違いは、気分的に音がちょっと柔らかくなります、という程度のものです。

 昨日からコメントに海外からスパムが入るようになりましたので、コメントを承認制に変更します。
コメント(6) 

Mp3V5のディーゼルスケッチをR6n、8kHz化して、起動音とホイッスルを加える [ds-DCCデコーダ]

 昨年、KatoのDE10のHOを買ったのですが、中を開けたらどうもMp3V5が入れられるような隙間が無いということが分かったので、R6n用のディーゼルスケッチを作りたいなあとなんとなく思っていました。
 MecyさんのスケッチDL109にはDL用の起動音や汽笛のMp3も入っていましたので、そこからR6n用を作ってみました。
 そして、実験環境は変わり映えの無い、以下。(このごろ、毎週この写真と変わらなくないか?)
re_DSC02245.jpg
 で、格闘すること2日!なんでそんなにかかるかというと、毎回場当たり的に作っているため・・・。あとはMECYさんもいじっているソースで、打合せもせずに仕様書無しで作っているので大変なことに。よくそんなんで作っているなあとも思いますが。ソースはこちら(DL109_8k_2)。(私のホームページの容量はパンクしたので、DesktopStation様のWikiにファイルの置き場所をお借りしています。)
 出来上がったのがこちら。


 今回のスケッチは、電源入れてもディーゼル音はしません。F3を押すと起動音に続き、アイドル音が鳴りはじめます。なお、エンジン停止音は作ってみませんので、ブツっと切れます。F3はエンジンの入/切、F4は回転数の高回転ロック、F5は起動音単独、F6はホイッスルです。
 昨年、電子工作連合の飲み会で、DCCはギミックかけられるから最初にエンジン掛けないとモーター動かないようにしてしまおうか?などと話していましたが、今回のはデフォルトで、エンジンがかかっておりません。(モーターは動くけど)

 SLでへのへのもへじ様からドラフト音と汽笛の大きさが・・・というご指摘を受けておりますが、こっちのスケッチも同じ問題があります。さて、どうしましょうか?(もともとの音源の音の大小を加工するか、それとも、再生時に音の大きさを変更するか。)来週に続きます・・・か。
 あとは、ホイッスルの音が最初変で直しました(252ごとに周期的なノイズが入る)。ということで、SL103のR6n用も同じ不具合を抱えていますが、あちらは変な音に気づかなかったからいいか。
コメント(10) 

Mp3V5というかR6n用のSL103のIMA ADPCM 8kHzバージョン [ds-DCCデコーダ]

 なごでんさんからSL103のスケッチが大きすぎてコンパイルできないというので、確認しようと思い、Arduinoのホームページから1.6.5のIDE環境を落としてきたのですが、解凍がうまくいかず(CRCが一致しない!)あきらめました。(私は1.8.3を使用しています。)ちょっとだけ、音を短くしたりもしてみたのですが、IMA ADPCMは256byteごとのブロックで分けられているため、少しだけ音を短くするではサイズが減らないです・・・。VVVF_sound.cppの474行目からの音の選択の所でcase 5のreturn ・・・をreturn 128;などとすれば、一つヘッダの参照が減るので、小さくなるかとは思います。
 そして、人によってIDEのVersionが違うからこうなるんだと思って、ArduinoのWebEditorを試してみました。スケッチのサイズはわたしのローカルとおなじように98%に収まるのですが、スケッチを書き込む段で、書き込み装置経由でやるやり方が分からなかったのでやめました。
 ということで、R6n専用と割りきっているし、音は悪くなるがもう少し長く音が入れられるように、IMA ADPCMの8kHzサンプリングのバージョンとつくってみました。スケッチはこちらです。「短い汽笛」、「中くらいの汽笛」に加え、「長い汽笛」と言っても2秒ぐらいのを入れました。
 少し前から、改造のしやすさを考えて、Audacityのプロジェクトをフォルダに入れていたのですが、スケッチをアップロードするSonetサーバーの無料分が一瞬にしてパンクしてしまいましたので、余計なものを入れるのをやめました。(SL103とSO103もAudacity分を消したやり方に入れ替えしました)



コメント(10) 

R6n用のSL汽笛付き [ds-DCCデコーダ]

 今日は雪で寒かったので、先週、いろいろな方から言われたMp3V5用というかR6n用のSLスケッチに汽笛を入れる件をやっていました。
 かなり苦労したのと、多分、また、割り込み的にぎりぎりだと思われるので、Nゲージでは京急のときのようなこと(集電でエラーが起きると、全体的に破たんする)があるかもです。
 やったことはSLスケッチの音部分を容量を無圧縮のWAVから半分ぐらいに圧縮できるIMA ADPCMに変更しています。16KHzのままですが、多分、今まで1秒分しか入らなかったものが、今回ので、2.1秒ぐらい入るようになりました。1秒分はSLのドラフト音4気筒分です。で、短い警笛が0.5秒、それよりも少し長い警笛が0.6秒といったところです。たぶん、8KHzにすると、もっと入るようにはなると思いますが、音も悪くなるので、やっていません。
 実験環境は写真の通り。
re_DSC02238.jpg

 DSBlueBoxで制御して、デコーダ開発ボードにアンプ386基板を付けて大きなスピーカーから音を出しています。
 使い方はF3が蒸気音のOnOff,F4,F5,F6が音のなるファンクションですが、F4,短い汽笛、F5少し長い汽笛を入れたら、もう容量がないです・・・。
 そして、スケッチはこちら。何となくなごでんさんの命名規則にのっとっていますが、もちろん非公認です。
 動画は以下です。何やっている動画かわかりづらいと思いますが、まあ、ドラフト音が鳴っているときに汽笛を鳴らすと、もちろんドラフト音は消えます・・・。が、重要なところでしょうか?


 あと、ホワイトノイズで蒸気音してみたらどうかという意見がありましたので、とりあえず、Audacityのジェネレーター→ホワイトノイズを使って、何となく作ってみました。ちょっと音が高いけど、SLにのせれば良さそうな音に聞こえそうですね。


 先週の運転会、情報交換会でへのへのもへじさんのNの蒸気が良い音を出していたので、私もAitendoから、エンクロージャ付きのスピーカーをいくつか買って見ました。
re_DSC02239.jpg

 まあ、今週はここら辺はいじらずに、DSAirを作っていく予定です。


コメント(6) 

アクセサリデコーダのアドレスの説明 [ds-DCCデコーダ]

 昨日は子供と久しぶりに横浜の原鉄道模型博物館に行きました。子どもは大宮の鉄道博物館に行きたいと言っていましたが、今、リニューアル中のようですので。
 10:20に行ったら、11:00からの動鉄実習に参加できました。以前は混んでてなかなかできなかった印象があるのですが、空いてきたんでしょうね。ドイツのえんじ色とクリーム色の機関車を子供が動かしました。運転台はブレーキの圧力計の赤いメーターも動く本格的なものでした。
re_IMG_20180310_110006.jpg

 その後、ジオラマがを見ていると、少し前にへのへのもへじさんの記事で見かけたSBBクロコダイルが走っていて、電機機関車でロッドがあって、ボンネットがあるという個性的な姿そのままでした。これは確かに一家に一台欲しいかもと思いました。が、価格、高いですね。
 re_IMG_20180310_112949.jpg

 で、本題です、N様から、昇圧ポイントデコーダのスケッチについて質問があり、調べました。
 質問は、アクセサリのアドレスの話で、スケッチ(ino)では、

// This function is called whenever a normal DCC Turnout Packet is received
void notifyDccAccState( uint16_t Addr, uint16_t BoardAddr, uint8_t OutputAddr, uint8_t State)

命令でアクセサリのアドレスが来たらOn,Offしているけど、
このイベントを起こすnmraDCCライブラリ側を見ると、
BoardAddress =(((~pDccMsg->Data[1]) & 0b0111 0000) << 2) | (pDccMsg->Data[0] & 0b0011 1111 )
OutputAddress = pDccMsg->Data[1] & 0b0000 0111
OutputIndex = OutputAddress >> 1
Addr = (BoardAddress - 1) * 4 + OutputIndex +1

なので、BoardAddressに3とかが来ると、Addrは9~12とかになって、アドレスが一致しない気がするというお話でした。
 私はnmraDCCライブラリお任せで、中身を見ていませんでしたので、調べてみました。
 nmraDCCの仕様書、9.2.1の9ページ目に説明があります。
抜粋すると、
---
Basic Accessory Decoder Packet Format
The format for packets intended for Accessory Digital Decoders is:

{preamble} 0 10AAAAAA 0 1AAACDDD 0 EEEEEEEE 1

Accessory Digital Decoders can be designed to control momentary or constant-on devices, the duration of time each output is active being controlled by configuration variables CVs #515 through 518. Bit 3 of the second byte "C" is used to activate or deactivate the addressed device. (Note if the duration the device is intended to be on is less than or equal the set duration, no deactivation is necessary.) Since most devices are paired, the convention is that bit "0" of the second byte is used to distinguish between which of a pair of outputs the accessory decoder is activating or deactivating. Bits 1 and 2 of byte two are used to indicate which of 4 pairs of outputs the packet is controlling. The most significant bits of the 9-bit address are bits 4-6 of the second data byte. By convention these bits (bits 4-6 of the second data byte) are in ones complement.
---
で、アドレス部分は1データ目のAAAAAAと2データ目のAAAです。ボードアドレスへの変換は
BoardAddress =(((~pDccMsg->Data[1]) & 0b0111 0000) << 2) | (pDccMsg->Data[0] & 0b0011 1111 )
です。9桁しかありませんので、2の9乗で512しか取れません。
 しかし、DCCのアクセサリは2044まであります。どうしているかというと、今度は2データ目のDDDのうち1,2ビット目の取りうる値0~3を使います。これがサブアドレスみたいな感じです。
Dの0ビット目はいわゆるポイントの直進、分岐を制御するビットになります。
 桂庵様のページに説明が載っております。ここではアドレスとは言わずにF1~F4と表現されているようです。
 ここら辺をそのまま書くと、

アドレス ボードアドレス Dの2,1ビット
1 1 0 0
2 1 0 1
3 1 1 0
4 1 1 1
5 2 0 0
6 2 0 1

という感じです。ボードアドレスが1~511ぐらいで、各々のアドレスに対して4つのサブアドレスを持っているイメージです。コマンドステーションからは1~2044を送っているように見せかけて、内部でボードアドレスとサブアドレス(のようなもの)に分けて送っています。
 1データ目、2データのまんまの値がどうなっているかというと、Nuckyさんの日本式信号機でのちょっと複雑なアドレス表がそのままです。いままでNuckyさんのこの信号表、なんでこんな面倒なことになっているのかと思っておりましたが、謎が解けました。
 この表のとおりにして、2データ目の最下位ビットを直進か分岐かの値に書き換えてやることで、多分アクセサリデコーダのDCC信号になります。




コメント(0) 

Mp3V5で順繰りアナウンス機能搭載? [ds-DCCデコーダ]

 さて、おしゃべりするNゲージ様の記事で、「★「ギガって凄い」ってこと ・・・あれ?みんな 気がついてない」と書いてありました。 そういえば忘れてました。
 でも、現在のSDカードだと何曲まで入れられるんでしょうかね?昔だと1フォルダ当たり256ファイルぐらいだったような気もしますが、Mp3V5デコーダのICだと、Mp3のファイルの作り方から類推すると4桁は入るんでしょうか?そして、今のDCCだとファンクションが29個しかないので、普通に考えて29種類程度の音しか入れられません。ということで、ワンマン電車とかバスにありがちな「ボタンを押すと案内アナウンスがでるアレ」を作ってみました。スケッチはこちらです。
 今回の実験環境は以下の通り、Mp3V5、スピーカー、D101です。コントローラがD101でなく、DSMainR5やDSBlueBoxでも良いですが、プッシュボタンの使い勝手的に、D101のほうが楽ちんです

re_DSC02229.jpg

 操作は
・F8のプッシュでアナウンスが順繰りに進んでいきます。
・F7はリセット機能です。1番目からの音(0051.mp3)に戻ります。
 音は、Mp3フォルダに0051~0099まで入れられるようにしました。動画の声は息子と一緒にYoutubeの江ノ電前面映像を眺めながらアナウンスを聞いて、息子が言いなおしています。よくわかりませんが著作権怖いですし。
 動画です。


(注意)
・E104から派生させていますので、ここ以外の部分はE104と同じです。
・F7,F8をアナウンスのために潰してしまっています。本当はCVで、On/Off出来るようにすべきかなあと思いつつ。まあ、この機能は現状突っ込みどころ満載ですので。
・集電不良対策でCV値にアナウンスの現在番号を書き込んでいますので、途中電源が途切れても、F8を押すと次のアナウンスが流れます。
・終点からの折り返し運転には対応していません。まあ、逆方向ってアナウンス違うし、どうしましょうかね?F6辺りに方向でも持たせて、順繰りアナウンスは2種類持たせるというのが現実的ですかね?
・(メモ)録音はTASCAMのDR-05を使用しています。音の編集はAudacityを使用しています。編集は、
Audacityで音を、駅ごとに分ける加工
1.トラック→ステレオからモノラルへ で、モノラルにする
2.エフェクト→正規化 で、音を大きくする。
3.前後の無音部分を消して、Mp3で保存する。
という作業をアナウンスごとにしております。

 いや、SmileDecoderR6n用にIMA ADPCM入れようとしてたのですが、どうも難しくって。
コメント(3) 

SmileDecoderR6n用の音(サウンドオプション) [ds-DCCデコーダ]

 12月になごでん様からR6n用にスマイルデコーダのサウンドオプション使えるようにしたいとの話がありました。で、やっととりあえず作りました。
 実験環境はこんな感じです。デコーダ開発ボードにアンプ基板386と秋月の大きなスピーカーをつないで実験です。なお、対策はしたのに、16kHzのピークが周波数解析で聞こえたので、ちょっとどうしようかという感じではあります。
re_DSC02196.jpg

 動画はこんな感じです。


 スケッチはこちらです。MP3V5_SO1でSOはSoundOptionの略です。
 音ファイルは、スマイルデコーダのサウンドオプションあたりを眺めて作ってください。
 音のスケッチへの統合は、VVVF_sound.cppの最初のあたりで、いまのところ4つ並べています。
#include "E233_Alert1.h"
#define WAV_DATA1 E233_alert1_data
#define  WAV_LENGTH1 E233_alert1_length

を自分のオリジナルに差し替えれば自分の好きな音を鳴らせます。
ただし、容量はかなり小さいのでお気を付けください。
あと、サンプリング周波数は8kHzにしています。
227行目の
if(flg == 0x03) //4回に1回だけ値を変更32kHZ→8kHz

if(flg == 0x01)
とすると、16kHz
if(flg == 0x07)
にすると4kHzとかに変えられます。

ファンクションの割り当ては現在F3~F6としていますが、
MP3V5_SO1.inoの522行目の
VVVF_Cont(gFuncBits[3] | (gFuncBits[4] << 1) | (gFuncBits[5] << 2) | (gFuncBits[6] << 3));
を変えてやれば、ほかのファンクションに割り当てできます。

以上です。




コメント(2) 

Mp3デコーダでディーゼル音のための実験2 [ds-DCCデコーダ]

 さて、今週も一応やってみたのですが、ほぼ進んでいません。
 かなり久しぶりにMp3デコーダとDSBlueBoxを引っ張り出してきて実験です。
re_DSC02149.jpg
 浦島太郎です。スマイルコネクタ経由でのMp3デコーダへの書き込みでエラーがでてパニクリそうになっていました。
 一回目は失敗するお約束でしたね。
 で、まあ、サンプリングした音0.5秒の繰り返しで以下です。音は、加速中の一定音のところです。このあともうちょっとスピードが上がると、速度比例の音に変わったような気がします。


 位相を0.25秒ずらして2音だとこうでした。


 位相を0.16秒ずらして3音にしたらこうでした。


 うーん。あまり変わらないので、1音でいいかという感じです。

 問題はこっちではなくて、加速時の音階です。
 0.5秒、16kHzサンプリングデータのデータ数が8000個ほどなのですが、現在のデータのアドレスを小数指定するためのUnsigned intで扱える長さは65536個です。
音階を変えるときは8000データを65536個を超えない2の乗数で小数扱いするのですが、65536/8000 = 8.192で、整数以下は8分割しかできません。
 つまり、元サンプリング音の周波数と倍の周波数の音までの刻みが8個しか取れません・・・。
 ほぼ、ピアノの白鍵盤音階と一緒なので、スピードを変えると離散的にドレミファ・・・みたいに
音階が変わっていきます。キハはドレミファじゃないんだが・・・。
 もちろん、unsigned longにしてしまえば4,294,967,295まで扱えるらしいので、この問題は解決のような気がするのですが、なんかunsigned longにしたら、どうも音のデータでないところまで参照を始めてしまいFAXのような音がします。バグっています。
 一度Mp3デコーダでのヤマ勘実験はやめて、シリアルで確認しながらやった方が良いかなあとちょっと思いました。
 さて、先は長そうだが、時間がない・・。

コメント(2) 

Mp3デコーダでディーゼル音のための実験1 [ds-DCCデコーダ]

 さて、3連休でしたが少々仕事が忙しくてあまり休めませんでした。なんかこういう状態が年度末(3月)ぐらいまで続きそうな感じです。嫌ですね。
 で、私もホビセンのジャンク市に行きたいなあ、C56欲しいなあと思いましたが、少し前のディーゼルで盛り上がっているときに予約していたものが、心が少々冷めた後に届いており、
re_DSC02148.jpg
 キハ58とDE10にはデコーダ入れたいし、そのためにはなんか、ちょっともう少しちゃんとした音にしておきたいというのもあり、実験です。(測色センサはどうなった?という突っ込みはしないでください。また気が向いたらやろうと思います)
 ですが、今日はAudacity(WindowsのWAVをいじれるソフト)上で音を確認しただけです。
 八高線のキハ110は音としては、低速時は一定の高音が続き、そのうちギアがつながったように低音から高音まで音が変わるという感じのようなのですが、いわゆるバスとかのディーゼル音ではなく、ヒューンいう音なので、今の疑似音の仕組み(0.5秒ぐらいの音を振幅で±0になるところで切り出して、それをリピートさせて音を出しつつ周波数を変えて回転数を表現)だと、どうも音のつなぎ目が分かってしまい、違うよなあと感じていました。
 音で言うとヒューンヒューンヒューンと0.5秒周期ぐらいで鳴り続ける感じです。まあ、電車でGo!の気動車でもそんな感じの音が鳴っているようなもしますが。本物はヒュー――――とずーっと同じ音が鳴っています。
 今回は、音のつなぎ目がなくならないかなあと思い、このサンプリングした0.5秒周期の音を、位相を0.1~0.2秒ぐらいずらしていくつか一緒に鳴らすといい感じにならないかなあと思って、実験をしました。
 まずは、適当に音を0.5秒切り出しです。今回の音は近くで女子高校生がしゃべり続けていたため、音を切り出せる場所がかなり限られてしまいました。会話は、「みやぞん」がどうのこうのと話しているのですが、テレビに出ている「みやぞん」のことなのか、だれか友達のあだ名が「みやぞん」なのかはよくわかりません。(どうでもいいよなあ、そんなことと思いながら、どこの音が切り出しにいいかなあと思いながら何度も繰り返し聞いていると、その話が聞こえてきてしまって。)
切り出し部分.png
 会話の無い場所で、低速の高い一定音の所から切り出しています。
 Audacityは、適当に時間で範囲を選択した後、Zキーを押すと適切に時間的に近くの振幅±0の場所に直してくれます。
 そして、この状態でShift+Spaceを押してリピートで音を聞いてみて、いい感じ(音の印象が元と似ている、周期音が気にならない)なら、その部分をコピーします。
 で新しいプロジェクトを作って、貼り付けます。
切り出し後.png
 適当に音を大きくしておきます。エフェクト→増幅または正規化でしょうか?
 一緒に、音のモノラル化とサンプリング周波数を16KHzにしておきます。
切り出し後_モノラル_16khz_増幅(-4db).png

 で、本日のメイン部分、「位相を変えた波形を加えたら自然にならないか?」です。
切り出し後_モノラル_16khz_増幅(-4db)_位相変更重ね_勾配あり.png
 まずはリピートする波形は、つなぎ目が目立たないように時間中央は大きく、開始と終了の波形は小さくひし形の音量の波形にしてみました。で、これを位相をちょっと変えて4chぐらいミックスして音を聞いてみました。
 うまくいくと思ってやってみたのですが、どうも音量が小刻みに震えているようで、
 元々の波形ではヒューンヒューンヒューンヒューンと音が鳴っていたのですが、
 今回の波形ではヒュンヒュンヒュンヒュンヒュンと、どうもディーゼル音ではない何か違う機械音を作ってしまいました。失敗です。
 音量変えなくていいんじゃないのかと思い、次はそのままの波形をリピートさせつつ、何Chかミックスして聞いてみました。
切り出し後_モノラル_16khz_増幅(-4db)_位相変更重ね.png 
 今度はさっきよりいい感じです。ヒューーーーーにはなりませんが、ヒューヒューヒュー位にはなっています。
 ということで来週以降ここら辺の位相を変えつつ複数チャンネルでの音というのをMp3デコーダに入れてどんな感じか聞いてみたいと思います。
・ATMega328は16KHzで大体1秒ぐらい無圧縮のWAVを入れることができます。
・0.5秒はアイドリング音のWAV、0.5秒は走行時の音のWAVとして、走行時の低速(高音一定音)、高速(速度比例音)は、WAV波形の全体長さを加工して周波数が変わったように聞こえるようにしようと思っています。
・なお、マイコンに入る音の長さですが、前回のディーゼル音はIMA ADPCM(圧縮できる)で時間を贅沢に使ったのですが、波形が圧縮されているため、音のデコード時にときどき出てくる圧縮情報の読み取り部分と、WAV波形の全長を変える部分がおそらくバッティングして、そんなプログラムは書けないとおもったので、今回は普通のPCMを使用します。

コメント(4) 

スペンサー(HO)にMP3V5のSLスケッチを入れてみたが その3 [ds-DCCデコーダ]

 今回で終了です。
 めでたくちゃんと動きました。
 前回、いろんな方から助言をいただいて、一番うまくいきそうな、なごでんの日記様の、「もともとついていたLPFをつける」をやりました。
 まあ、つまり、モーター周りはもともとのDCの状態(ノイズ用コンデンサ103+LPF回路(と思われれるもの))にしています。
 写真ではこうです。左のモーターについているのがノイズ防止用のコンデンサ103で右側のコイルが見える基板が、コイルとコンデンサ、ポリスイッチが載っている基板です。
re_DSC02093.jpg

 そして、その時のデコーダのモータ出力端子の波形がこれです。これが良くなっているのかどうか私にはわかりません。結構モーターオフ時の波形がビョンビョンしちゃってBEMFは辛そうです。
mp3v5_mot_LPF.png

 そして、スマイルコネクタ部分の5V波形がこれです。あまり、見かけは以前と変わらないかもです。
mp3v5_5Vスマイルコネクタ_LPF_拡大.png

 ただし、前よりもトリガーをかけにくくなりました。
 そして、デコーダのリセットや暴走は皆無になりました。
 皆さんありがとうございます。

 で、せっかくだからYoutube動画です。ゴードンと違い、大きなスピーカーなので、音も大きいです。蒸気は出ませんけど。


 なお、子供に遊ばせたらこうです。ゴードンもいますが。この動画、スペンサーの従輪がビビッてしまってうるさいです。後でグリスを塗ったら静かになりました。


 これでやっと次の作業ができます。(キハとかDE10とか・・・。)

コメント(1) 
前の10件 | 次の10件 ds-DCCデコーダ ブログトップ