SSブログ

SmileDecoderR6Nを動かす。 [ds-DCCデコーダ]

 今週は夏休みですので、明日、明後日は家族旅行に出かけています。今日は、どっかに遊びに行こうかどうか悩みましたが、あまりに暑いのでやめて、お家でおとなしく実験です。

 で、なごでんの日記様からSmileDecoderR6N(12vD級アンプを用い走行音のみを出力するようにしましたが、想定以上にパワーがありすぎて現状の設計では耐えられないので再度見直しを行います。)の訳ありサンプルをいただきましたので、実験してみました。
 R6Nはこんな感じです。
re_DSC01697.jpg

 気を付けるところは、今までのSmileDecoderはどれもATMEGA328側がスマイルコネクタの〇□側なのですが、今回のは逆です。

 で、一緒に16Ωの大きなスピーカー(40㎜*30㎜)もいただきましたので、これで鳴らすことにします。大きさ的にはHOのゴードンの炭水車には載せられそうです。
 re_DSC01695.jpg

 ちょっと、鳴らしたら、やっぱりエンクロージャがないと全然音が小さいので、工作用紙で適当なエンクロージャを作ります。まあ、40㎜*30㎜*20㎜の容器作っただけですが。
re_DSC01696.jpg
 
 で、完成です。
re_DSC01698.jpg

 アンプ(PAM8006A)からの発熱は触っててそのうちアチッとなるので、50~60℃ぐらいと思われます。改造されたデコーダが一個しかなく、貴重なものなので、あまり長い間通電はさせていません。
 音は超大きいです。たぶんテンショウドウに勝てると思います。家でやるには単に迷惑な感じです。外のセミの声やヘリコプターの音、電車の通過音よりも大きいです。CV50(音の大きさ)は適当に調節しています。
せっかくですから、動画を載せておきます。
EL102D 吊りかけ音・・・振動でスピーカーが動いていきます。


EL102D VVVF音


SL102 SL音・・・ちょっと違うような気もするので、サンプリングデータをもう少し加工しようかと思いました。


DL106 ディーゼル音




 

Mp3V5の32KHz時の負荷低減について [ds-DCCデコーダ]

 青春18きっぷを買ってみました。大学生の時以来ですね。でも、そういえば行くところすら決めていません。
 碓氷峠鉄道文化むらとか日帰りでいいかなあとか思います。東海道線が高崎まで直通で、朝6時に家を出ると10時に横川に着くようですし。
 さて、標題の話題ですが、
・Mp3V5で走行音を出すと若者にはモスキート音(16KHz)が聞こえる。
→理由は16KHzのパルスで音の波形を作っているため。そのパルスもアンプで強調されてしまうため。
・パルス周期を32KHzにすれば16KHzの音が小さくなるかもと思って、32KHzに変更した。
→マイコンの負荷が高くなって、DCCのパケットを取りこぼしやすくなったためか、走行時に暴走しやすくなった。との報告。(ごめんなさい。実車に乗せて確認してないです・・・。)
 で、どうすればマイコンの負荷低減ができて、DCCのパケットをもらうプロセスをたくさん回せるか(→暴走しなくなる)という話になっているかと思います。

 で、とりあえずVVVF部分の負荷を低減できるか実験してみました。すべて、VVVF_Sound.cppの話です。

 まずは、へのへのもへじ様やあやのすけ様からお聞きして、私もVVVF音部分の割り込み時どのくらい時間を占有しているかを確認してみるため、割り込み関数「void vvvf_int1()」の最初と最後に

PORTD ^= _BV(PD7);

を入れて、割り込み時にピンから信号を出力をさせて、Arduino7ピンからオシロで波形を見てみました。
 なお、上記をやるためにはスケッチの一番最初に、

pinMode(7, OUTPUT);

の、おまじないをしないと出力されません・・・。

 で、結果波形が以下です。まずはEL102bスケッチ(16KHzのもの)です。Lowの時が割り込み中です。
走行時
EL102b走行時.png

停止時
EL102b停止時.png

走行時は周期が62usぐらいで、割り込み時間は16.7usです。
停止時は周期が62usぐらいで、割り込み時間は0.8usです。

次に、EL102cスケッチ(32KHzのもの)です。16KHzごとにパルスDutyを変えるスケッチになります。
走行時
EL102c走行時.png

停止時
EL102c停止時.png

走行時は周期が31usぐらいで、割り込み時間は17.1us、0.8usを繰り返します。
停止時は周期が31usぐらいで、割り込み時間は1,3us、0.8usを繰り返します。

また、せっかくですから、割り込み関数内の各命令がどのくらい時間を食っているのかもついでに確認してみました。
中身ですが
(1)2回に1回だけ命令を実行するためのトグル関数・・・0.8us(7ピンの出力含む)
flg = !flg;
if(flg)
{
return;
}

(2)VVVF音を出すかどうかの条件分岐・・・0.5us
if (pwm_shift != 8)

(3)波形の計算・・・4.5us(ただしpwm_shiftの値で若干変わる)
a = ((pgm_read_byte_near(&WAV_DATA1 [pwm_state1 >> SHIFT_PWM]) * 3 + pgm_read_byte_near(&WAV_DATA3 [pwm_state3 >> SHIFT_PWM])) >> pwm_shift)

(4)波形をTimer1に書く・・・6.9us
Timer1.setPwmDuty(VVVF_SOUND_PIN,a);

(5)波形の次のポイントへの移動・・・2.5us
pwm_state1 += pwm_add1;
if((pwm_state1 >= (WAV_LENGTH1 << SHIFT_PWM)))
pwm_state1 -= (WAV_LENGTH1 << SHIFT_PWM);
pwm_state3 += pwm_add3;
if((pwm_state3 >= (WAV_LENGTH3 << SHIFT_PWM)))
pwm_state3 -= (WAV_LENGTH3 << SHIFT_PWM);

仕事の改善提案ではありませんが・・・、明らかに(4)のDutyをTimer1に書くところが
やっていることに対して時間をとりすぎな感じがプンプンします。
ということで、Timer1ライブラリのsetPwmDutyを眺めてみました。
すると、
void setPwmDuty(char pin, unsigned int duty) __attribute__((always_inline)) {
unsigned long dutyCycle = pwmPeriod;
dutyCycle *= duty;
dutyCycle >>= 10;
if (pin == TIMER1_A_PIN) OCR1A = dutyCycle;
・・・
となっており、long型の掛け算をやっており、これは遅そうだと思いました。
 Timer1は16ビットのタイマーで、もともとTimer1の周波数を変更してVVVF音の音階を変えようと思っていたのですが、いろいろと試行錯誤をやっているうちに、パルス周期は一定で波形周期だけ変える形に変更したため、Timer1の高機能は現在いらなくなっています。32kHzだけ出ればいいんです。
 ということで、Timer1を取っ払ってしまうことにしました。
具体的には、
void VVVF_Setup()
{
//PWM出力ピン D9を出力にセット
pinMode(VVVF_SOUND_PIN, OUTPUT);
//Timer1使用
Timer1.initialize();
//初期設定
Timer1.pwm(VVVF_SOUND_PIN,0,0);
Timer1.attachInterrupt(vvvf_int1,current_period1);//interruptの設定
}
部分を、analogWriteでも使用している8ビットタイマーにしてしまっています。
以下になります。

void VVVF_Setup()
{
//PWM出力ピン D9を出力にセット
pinMode(VVVF_SOUND_PIN, OUTPUT);

//31KHzに設定(初期設定でPhaseCorrectPWMモードになっていると思う)
//D9,D10 キャリア周期:31kHz(分周無し)
TCCR1B &= B11111000;
TCCR1B |= B00000001;

//出力の設定
if(VVVF_SOUND_PIN == 9)
{
TCCR1A |= _BV(COM1A1);
}
else //10
{
TCCR1A |= _BV(COM1B1);
}

//interrupt設定
TIMSK1 = _BV(TOIE1);
}

で、割り込みはAVRでよく見る形に変えています。
関数名をポインタで指定するやり方がよくわからなくって・・・。
ISR(TIMER1_OVF_vect)
{
・・・
unsigned int a = ((pgm_read_byte_near(&WAV_DATA1 [pwm_state1 >> SHIFT_PWM]) * 3 + pgm_read_byte_near(&WAV_DATA3 [pwm_state3 >> SHIFT_PWM])));

if (VVVF_SOUND_PIN == 9)
{
OCR1A=a>>(pwm_shift + 2);
}
else//(VVVF_SOUND_PIN == 10)
{
OCR1B=a>>(pwm_shift + 2);
}
・・・
}

で、これでめでたく、割り込み時間が短くなりました。
EL102dスケッチ(こちら)になります。
走行時
EL102d走行時(Timer1やめ).png

停止時
EL102d停止時(Timer1やめ).png

走行時は周期が31usぐらいで、割り込み時間は10.4us、0.8usを繰り返します。
停止時は周期が31usぐらいで、割り込み時間は1,3us、0.8usを繰り返します。

 一応、世間的にいうと17.1us→10.4usなので「性能は1.5倍アップ!」です。
 でも、たぶん、割り込みのために、割り込み前、割り込み後に必要な退避とかがあるでしょうから、そんなにアップしてないんだろうなあとは思います。


DSBasicをMega2560で動かそうとしたが・・・。 [DCC/MM2シールド]

 ほぼこれは1年ぶりの話になります。
 DSBasicはArduinoだけで自動運転するために、ArduinoUnoにキーボードとモニタをつけてBasicのプログラムが動くという、かなり夢のデバイスだったのですが、記憶容量が1KByteしかなくて、なかなか、大作プログラムが作れませんでした。
 で、ArduinoMega2560だったらROMなどの容量が4倍あるからいいのではないかとのことで、Megaまでは買ったのですが、熱が冷めてしまい、そこで止まっていました。
 で、このごろ、HOゲージを動かそうとすると、どうも場所が足りないのと出し入れが面倒なので、この際だからHO用の鴨居鉄道でも作ってしまおうかと思って、それだったらついでに閉塞区間と信号機もつけて、そこらへんは自動にしてやって・・・と考えて、DSBasicを思い出した次第です。
 で、まずはMega用に組み立てです。
re_DSC01690.jpg

 Megaでは、VideoOutのピンが変わることが分かっておりますので、そこの部分だけ改造が必要です。
 まあ、9ピンと7ピンが11ピンと29ピンに変更になりますので、Arudinoへつける部分の9,7ピンを切ってしまいます。
re_DSC01691.jpg

 で、Megaに付けて、9ピンと11ピンにジャンパを飛ばして、7ピンからMegaの29ピンにジャンパを飛ばして完成です。
re_DSC01692.jpg

 で、試運転です。スケッチは全く直さなくとも、モニターはちゃんと映るし、キーボードも動きます。しかし、DCCの命令がこけまくります!なんだこれ。
 現象としては、キーボードやPCのシリアルからDSBasicのコマンド、pwr1とかspd5,0,10とか投げても半分ぐらいは無視されます。
 Aruduinoの問題かDSBasic基板の問題かわからなかったので、入れ替え実験をしてみました。
(1)Mega(互換品)を2枚用意して、DSBasic基板を2枚用意して、挿して、DSBasicスケッチで動きを確認。→命令半分ぐらい無視が再現
(2)ArduinoUno(互換品)にDSBasic基板(2枚用意)を挿して、DSBasic基板、スケッチで動きを確認→正常(命令無視なし)
(3)MegaにDSBasic基板(2枚用意)を挿して、DSGatewayスケッチを入れて、DesktopStationから操作する。→正常(命令無視無し)

→(2)(3)からDSBasic基板、Megaともに問題なしが分かって、そうすると、DSBasicスケッチをMegaで動かすと怪しいという風に見えました。
 なんか、SPIがこっそり違うのか?とか勝手に考えて、SPI周り(クロック分周とか、Delayとか)をこそこそと変えてみたりしましたが、全然挙動は変わりませんでした。SSのピン番号は一応違うようですが、Arudinoでは手動のようで、D10使うので問題なさそうですし。
 ということでお手上げです。うまくいったら、プログラム領域を広げてとか思っていたのですが。
 モニターとキーボード捨てれば、普通にArudinoUnoに信号用の制御プログラム書くだけでも構わないと言えば構わないですし・・・。ちょっと寂しいですけど。

Mp3V5用VVVF音アンプ負荷低減スケッチ [ds-DCCデコーダ]

 日曜日は所得を増加させる第一歩としてTOEICを受けに行ったのですが、なんと、腕時計を忘れて、教室には掛け時計もなく、仕方なく、時計なしでテストを受けたのですが、そんな心理状態だったので、なんか点数悪そうです・・・。
 で、なごでんの日記様から、走行音(VVVF音)部分から停止時も16KHzが出ているので、スピーカの負荷低減(というかアンプと5Vレギュレータが熱くなるのを低減という感じか)で、音を出さないときはパルスを出力するのをやめられませんか?と言われたので、やめるものを作りました。
 やっていることは、ノッチオフ時や停止時はボリュームというか波形を徐々に小さくして0にしてしまっているだけです。
 で、16KHzの音解析はMECY様からスマホで周波数解析できて、iAnalyzer Lite というソフトですとのことでしたがIPhone用でしたので、(私は持っていないので)適当なAndroid用ソフトで試しています。FFTWave Ver.1.3というアプリです。
re_DSC01689.jpg
 上段の赤い線が時間軸の波形で、下の緑色が現在のFFTでデータ数は2048でした。ピンク色が平均値で、ピーク値を黄色で周波数表示してくれます。(ちょっとアプリの設定をいじっています)

 まずEL102Bです。もともとの16KHzの搬送波が大きく出ているものです。停止時も走行時も16KHzが力強く?出ていることが分かります。(なお、私の耳は可聴周波数チェッカで確認したら残念ながら14KHzまでした聞こえませんでした。)


 次に、EL102cです。搬送波を32kHzにしています。16kHzはもちろん少なくなっています。(0ではない)


 で、最後に今回のEL102_0724です。停止時だけ音量を0にしますので、停止時だけ16kHzピークが消え、一応無音状態になります。


 スケッチ(EL102_0724)はこちらです。
 一つ注意点があって、CV50の走行音ボリュームですが、今まで0~8でしたが、今回から0~10にしています。今までの8相当のボリュームは10です。お気を付けください。

DCC/MMシールド向けDSjoyスケッチ改定 [DCC/MM2シールド]

 JoshinにHOのDE10とヨ8000を一緒の予約で頼んだのですが、車掌車が8月にずれ込んでいるため、「予約品は全部そろってから届けます。」ということで、届きません・・・。車掌車はキャンセルしようかしら。
 さて、D1S9様より、DCC/MMシールドでS88マスコンが2個つなぎで動かないと投稿ありましたので、確認しました。ごめんなさい。私のほうでも動きませんでした。
 原因は、多分二つで、
(1)S88マスコンからアクセサリ用に空パケットを送っているのですが、何も考えずにアクセサリの0番を叩きます。で、この命令、本来有り得ない命令なので、DSCoreが誤作動します。(少し前のDSMain用のDSJoyアップデートもこれです)
(2)時間を測ったわけではないので、言い切れないですが、DSCoreを頻繁に叩くと不思議な動き(デコーダがノッキングしながらファンクションを連打したような動き?)をします。
 ということで、(1)変なものを送らない。(2)DSCoreをいたわる。というコンセプトでDCC/MMシールド(DSJoy用)のソースを直しました。ただし、(2)についてはまだチューニング不足かもです。
 こんな感じで、オーバルレイアウトに電車を2両おいて、ワンハンドルマスコン二つを操って、若者にデバッグしてもらいました。
re_DSC01688.jpg

 スケッチはこちらです。
 (追記)コメントに「スピードを0にしても時々止まらないバグを修正」と書いてありますが、修正できていません。止まらないときは一度マスコンで加速(表示スピードを1キロ以上)にしてからブレーキをかけてください。
 
 

井出トマト農園に行った [その他]

 で、午後は完全に鉄道と関係ありません。
 会社の近くにあるトマトの水耕栽培をしている井出トマト農園にトマト狩りに行きました。
 私の世代(40代)だと、トマトの水耕栽培と言えば筑波の科学万博が強烈な思い出です。
 この農園のトマト狩りは甘いトマトが食べ放題で、生まれて初めてトマトでおなか一杯になりました。
 温室です。
re_DSC01682.jpg

 この時期、外は灼熱(30度ぐらい?)ですが、温室内も高温にして湿度も高かったです。トマトには24度ぐらいが一番最適な温度なので、トマト狩りに来るなら、3~5月のほうが甘いですよ。とのことでした。(トマトに暑過ぎるのか、来週でトマト狩りも終わりのようです)
 で、中です。
re_DSC01678.jpg

 水耕栽培ですが、根の部分は液肥の液にジャブ付けではなく、ロックウールを使っているとのことでした。
 re_DSC01679.jpg

 液肥を送り出す装置だったかと思います。
re_DSC01677.jpg

 温室内は各種センサーでログを取っているとのことでした。ただし、その情報だけから管理するとダメなので、もの(トマトの苗)をちゃんと見なければいけないそうです。
re_DSC01676.jpg

 あとは、トマト苗を一本一本上から吊るして調整していました。
re_DSC01680.jpg

 昔、水耕栽培を趣味でやってみたことがあるのですが、土から上の部分が液肥のおかげで巨大になるのですが、根の部分が液肥に浸しているだけなので、かなり風に弱く、トマトの苗が倒れるごとに、どうやって支えようかと悩んでいたのを思い出しました。

 

伊豆クレイル1周年記念イベントに行った。 [その他]

 本日の午前中は伊豆クレイル1周年記念イベントに行きました。
 少し早めに小田原駅に行って、新幹線ホームに入場券で入り、子供と二人で通過する”のぞみ”のパンタスパークを眺めていました。やっぱり新幹線を見るならこだま停車駅だなあと思いました。
 で、小田原保線技術センター会場です。
 re_DSC01675.jpg

 まずはレールスター乗車体験。レールスターというのは保線用のゴーカートみたいなもので、夜中の保線作業で使うそうです。エンジンが付いていて一回に小田原~根府川ぐらいまで走ったりするそうです。
re_DSC01665.jpg

 で、子供と乗りました。とても車高が低いのに、レールの上を走るので、とても乗り心地が良く不思議な感じでした。


 あとは、軌道モーターカー(400型)という保線用のディーゼル機関車がありました。
re_DSC01668.jpg

 非常停止ボタンを押す体験もでき、やってみました。割とボタンは軽かったです。まあ、実際押さなければいけない場面では、これで電車が止まると思うと、なかなか押すのに躊躇しそうだなあとは思いました。その隣に踏切の制御盤?もあり、見たことのない透明な大きなリレーがありました。
re_DSC01674.jpg

 高所作業車乗車体験もありました。90cm以上小学生以下しか乗れないということで、子供は乗りましたが、「大きなお友達」の私は乗れませんでした。ちょっと残念。
re_DSC01670.jpg
 作業者の運転席の上にはパンタグラフのようなものがあります。・・・説明を聞き忘れました。
re_DSC01672.jpg
 
 小田原保線技術センター会場からは、東海道線、踊り子、スーパービュー踊り子に加え、小田急の特急(VSE,MSE)、なども見え、かなり景色の良い所だと思いました。帰りにはExe αも初めて見ました。
 帰りの東海道線では、EF210を追い抜く東海道線に乗れて、ちょっと楽しかったです。


 あと、電車のペーパークラフトをたくさんもらって、子どもは大喜びでした。
re_DSC01685.jpg

 午後から他の用事があったので、肝心な伊豆クレイル自体は見ておりません。
 パンフレットを見た感じだと、旅行パックは2,3,4人限定の感じで、まあ、うちの家族(5人)旅行には使えなさあそうな感じかなあと思いました。
 

ゴードン用SLスケッチをブラックキューブスピーカーで鳴らす。(SL101) [ds-DCCデコーダ]

 さて、Yaasan様から蒸気音は低音がいっぱいだから音を高くしたほうが良いとアドバイスをもらいましたので、やってみることにしました。
 Audacityで音を高くしようとしたら、どのフィルタを使っても、Wavの時間が変わってしまうため、Bass,Treble調整でTreble(高音側)を大きくして、高い音を出すようにしてみました。
 今回のシステムはこんな感じです。
re_DSC01663.jpg
 CV値をたくさん書き替えないといけないのでDSBlueBoxを使用しております。で、そこからMp3デコーダ(SL101スケッチ)+ブラックキューブスピーカとつなぎ、別配線で線路ではゴードンがDSDecR3で動いております。
 動画は以下です。


 ちょっと、蒸気音のリアリティが下がりましたが、本物から加工した音です。大井川鉄道のトーマス(C11だかC12)ですが。
 で、CV値ですが、
走行音を目一杯、大きくするため、
走行音:CV50(0-8)→8
アンプ:CV59(0-30)→30(走行音が割れるようなら少しずつ小さくしていく)
Mp3音量:CV58(0-30)は音が割れるので、21
もちろんジョイント音はいらないのでCV48(0-3)→0
蒸気音の周期はKasoku配列を(現在)適当に再利用しているのでCV47(0-7)→0~4
です。
なお、モスキート音対策済みスケッチで若者(8歳?)に確認して、モスキート音は出ていません。
SLの蒸気音ですが、スケッチ中の
shu1_16k.h~shu4_16k.hでこれを変えると、そのまま蒸気音が変えられます。
back_***フォルダがその試行錯誤の跡です。
スケッチ(SL101)はこちらです。

ゴードン用のMp3デコーダSLスケッチ [ds-DCCデコーダ]

 ゴードンを買ったので、必死にMp3デコーダでSLスケッチを作るのをしておりました。
 で、とりあえず完成?しました。
 今回のシステムも、とりあえずBoseの外部スピーカーです。
re_DSC01662.jpg
 繋ぎはDSMainR5→Mp3デコーダ→Boseのスピーカーで、DCCは線路側に分岐させゴードンのスマイルデコーダR3につながっています。またFunctionを鳴らすためにS88 Analogをつないでいます。

 で、今回は、吊りかけ音の周波数を必死に鳴らしているTimer1をシュッシュッポッポの音にしています。どうやらスケッチには16kHz(8bit)で1秒までWavが入れられるようでしたので、0.24秒ずつちょっとずつ違う「シュッ!」という音を入れて、その鳴らし始め周期を変えることで蒸気音としています。(以前のスケッチのように再生周波数を変えるのはしておりません。やってみたら、なんか音が変だったので・・・。)それ以外の音はMp3側で鳴らすようにしています。
 で、動画です。




 今回わかったことは、
・このゴードン、人のスロットル操作に鈍感です。とても接触の悪いアナログNゲージみたいな動きをします・・・。
・シュッシュッポッポとピストンの動きを合わせるのがとても難しいです。
・ブラックキューブスピーカーで鳴らしたら、ゴードンのピストンのキュルキュルノイズ音のほうが大きくて、蒸気音が全然聞こえません・・・。なごでんの日記様の爆音デコーダに期待しています。
・スマイルコネクタを切るとゴードンのテンダーに入りそうですが、デバッグ中なので、コネクタ部分を切る気になりません・・・。

で、スケッチはこちらです。
・モーターが回るかは確認していません・・・。

Mp3デコーダ モスキート音の解消(DLスケッチ) [ds-DCCデコーダ]

 MECY様に確認していただき。DLスケッチもモスキート音が出ているとのことで、修正しました。
こちら(DL106)です。
・音が出ることは確認しましたが、モスキート音が消えたかは確認しておりません。
・モーターが回るかは確認していません。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。