So-net無料ブログ作成
検索選択
前の10件 | -

ドッチーモアダプタを試す [その他]

 ひでろん様のドッチーモアダプタを試しました。
 その原理はMECY様のBlogで紹介されています。
 ここで嫌な予感がした人は正解です。いまはちょっとすぐに搭載するモーター車がなくて、今回もハウルの動く城で確認です。
 re_DSC01034.jpg
 一応、配線がどうなっているかを紹介します。
 ぼろぼろっと取れる感じですが、一番上がモーター車→ドッチーモアダプタ→スマイルデコーダR4→アンプ基板386→なごでん様キューブスピーカーとつないでおります。
 re_DSC01035.jpg
 大量の電解コンデンサがついておりますが、それぞれほかのパーツのことを考えずにつけておりますので、これでは電車に入らない・・・。
 で、以下がDCC時の動画です。VVVFスケッチなのでスピーカーから音が鳴ります。

 で、次がDC時の動画です。DCCじゃないので、もちろん音はなりません。

 
 確かに魔法の基板です。
 なお、 部屋が汚いのは気にしないでください。

 あと、初めはMP3スケッチにつけちゃおうと思ったのですが、MP3スケッチはRailIn、モーターOutともにスマイルデコーダとはついている場所が結構違うため、今回はやめました。

ターンテーブルの調査その3 [ds-DCCデコーダ]

 さて、久しぶりにターンテーブルです。
 今回から Tomixの1631 TCS Electric Turntableをやります。
 制御装置を使ったやり方はすでにスマイラー様がやっておりますので、今回はデコーダから直接動かすための確認を進めていきます。
 これです。
re_DSC01033.jpg
 早速分解です。
re_DSC01029.jpg
 転車台の運転席の中は以下のようになっています。
re_DSC01030.jpg
 右のモーターが位置ロック用で左のモーターが転車台の回転用でした。で、転車台の回転用からブリッジダイオード経由で黄色い点滅内蔵LEDにつながっています。多分この点滅LEDは3.3Vで、ブリッジダイオードはB6Sとかいてありましたが、1.0V程度の電圧降下と考えると、4~5V程度でモーターを回しているものと考えられます。
 ケーブルと動作を確認していくと、リボンケーブルの黒いほうを1番として
(1)転車台回転用モーター①
(2)線路給電(黒)
(3)位置ロックモーター①
(4)位置検出スイッチ(白)
(5)転車台回転用モーター②
(6)線路給電(白)
(7)位置ロックモーター②
(8)位置検出スイッチ(黒)
です。
説明すると
・(2)、(6)は線路給電なのでとくにいうことはありません。
・(4)、(8)の位置検出スイッチは回転時は導通、線路とあっている場所では開放です。
・位置ロックモーターは、(3)、(7)が
 -、+の時は解除
 +、-の時はロック
・転車台用モーターは、(1)、(5)が
 -、+の時は反時計回り
 +、-の時は時計回り
です。

ですので、モーターが二つあるので昇圧ポイントデコーダーがあれば制御できて、(TB6643KQはかなりオーバースペックですが)、電圧を5V程度に変更して使います。
順序としては
1.1段の回転命令を受けたら
2.ロックを解除する
3.転車台を回転させる
4.位置検出スイッチが開放されるまでループで待つ
5.位置検出スイッチが解放されたら、転車台回転をやめる
6.ロックする
という感じなので、割と簡単にマイコンで実現できそうです。
今度やってみようと思います。

 全日本模型ホビーショーに行った。 [その他]

 全日本模型ホビーショーに行きました。一応、トミックスの自動運転のデモも見てきました。在線検知とポイントを駆使して、
 複線自動往復4列車運転をしていました。
 電気屋の毎日様の記事の通り、自動運転の各説明はrailwaysしんゆり湘南ラインさんのレポートが詳しいです。
 で、実際のデモですが、(動画撮っていない・・・。)写真は以下。
re_IMG_20160924_103445.jpg
 制御装置はこれでした。
re_IMG_20160924_103456.jpg
 で、レイアウトはわたしの記憶で言うと、以下の形です。
Tomix自動.png
 青が在線検知センサで、赤がポイント番号、トミックスのポイントは完全選択式なので、ポイントをかませば、ギャップを切れます。
 駅は青番号で1,2,5,6,7,8,11,12のところにあります。
 4つの電車の初期位置は青番号で1,2,11,12です。細かい順番は忘れましたが、
(1)1→5、12→8と電車が動く
(2)2→7、11→6と電車が動く
(3)8→11、6→2と電車が動く((2)、(3)を合わせて、11→6→2と途中駅に止まらずに運転していた)
(4)7→12、5→1と電車が動く
という感じのデモでした。
 電車が最高速で走ってセンサを踏んだ瞬間に緊急ブレーキ状態で止まっており、プラレールじゃないんだから、もうちょっと本物っぽくしないのかなあとちょっと思いました。
 後は、そのうちの一電車を自分で動かせるのと、閉塞区間の考え方から、入ってはいけないところのセンサを踏むと勝手に電車が止まっていて、面白かったです。
 お子様でも、安全に自動運転の一部をできるところが売りのようです。
 また、駅にベルがありましたが駅に内蔵されているそうです。(そういえばホーム用デコーダ作ろうと思っていた時期があった。忘れてた)
 DCCと違い、DC運転は電車が入れ替わっても、線路に電源をながすだけなので、難しい制御にならないので、いいなあと思いました。
 ROKUHANですが、コントローラの基板が緑色になっていました。そろそろ量産でしょうか?サウンドはタブレットをつなげておりそこから出しているようです。そのため、高機能なこと(電車の走行音(スピードに応じた高さの音)+警笛など)をだせており、据え置き型だとこういう芸当ができるよなあと思いました。
re_IMG_20160924_105522.jpg
re_IMG_20160924_105454.jpg
 あとはグリーンマックスのところで、コアレスモーターの分解写真があったので、撮りました。集電板から突起が出てモーターのプラスとマイナスに繋いでいるようですので、DCC化はそんなに難しくなさそうと思いました。(これが簡単に分解できるものならば)
re_IMG_20160924_110531.jpg

電車でGoコントローラをS88規格につなげるための2番目の実験 [S88]

 前回はプレイステーションのコネクタをうまく取れなくて四苦八苦していましたが、いいやり方を見つけました。まず、いきなり基板とコネクタを持って折ります。そうすると、コネクタは壊れずにはんだ部分は基板からパッドごと取れます。あとは、はがれたパッドを適当に半田ごてで取ってやれば、美しい(熱変形していない)コネクタが回収できます。このやり方に気づいたのはコネクタもぎ取り4つ目でした・・・。
 で、本題です。
 S88バスに繋ごうと思うと、格好の基板が家にいっぱい転がっています。S88の6ポート基板です。この頃、注文したので、潤沢にあり使いたい放題ですので、それにATMEGA328P-PUやLED、セラロックなどを付けて、マスコン用のライブラリはDSMainR5に入っているものを流用です。
re_DSC01022.jpg

re_DSC01025.jpg
 S88デコーダーのOut/Inについてはもともとある自分のS88のスケッチをほぼ流用します。
 受け手側のDCC/MM2シールドはDSGatewayスケッチを適当にS88の部分のデコードだけに特化するように改造しています。
 なお、DesktopStationForumでYaasan様からかなり、ハイスペックを要求されていますし、同じ時期にあやのすけ様がLocoNet用に高機能はコントローラを製作中ですが、自分の身の丈に合ったところからやらないと人生挫折しますので、私は、Yaasan様の「やり方3」から開始です。(やり方1~2に上がっていくかどうかは未定)

以下、掲示板のYaasan様が挙げたタイプの抜粋
----------------------------------------
やり方1:DCCのフレームをそのまんま送る。
やり方2:独自にフレームを作る。5バイト送るなら、5回送信するとか(16bitあるけどヘッダフッタを考えたら1バイトがギリギリ)
やり方3:スロットルの状態だけを送る。処理はコマンドステーションに任せる(こうすると拡張性が乏しい・・・)
----------------------------------------

マスコンから出た信号のS88バスへの流しについては、
0~11ビット:速度指令(0~1024)
12~15ビット:Select,Start,A,B,Cボタン(順番がこれじゃなかったかも)
です。

 S88デコーダ側のスケッチはこちら
 DCC/MM2シールド側のスケッチはこちら
 S88スケッチについてはYaasan様の方から詳しく出ていますので、それを見ながらだと分かりやすいかと思います。なお、DSGatewayLibへWaitなしで連続して命令を出すと、結構、Arduinoが止まりますので、適度にDelayを入れたほうがよさそうです。
DCC/MM2シールド側で、これをデコードして、電車に速度指令を流してやります。
スケッチはかなり手抜きで、なんと、方向転換(Startボタン)と速度(128ステップ固定)という杜撰さです。
コントローラは2つ限定です。(ただし、増やすことは多分可能)
 一個だけ繋いでいると、今までのS88ポートに繋いでいるのと見分けがつきませんので、2個作ってつないで見ました。
re_DSC01023.jpg
 そして、今日のシステムです。
re_DSC01026.jpg
 大昔(一年半ぐらい前)にPCのUSBに変換アダプタ経由でマスコンをつないで、DCC/MM2シールドにシリアル通信で指令を送って、3列車まで走らせるのを作りましたが、今回は、PCレスです。電源を入れたら勝手に線路電源も入ります。(電源オフはACアダプタを引っこ抜くしかないですが。)
 そして、一応2コントローラ動いていますよという動画です。子供が寝た後ですので、妻に頼んで一列車動かしてもらったのですが、夜、大人二人で無言で電車動かすのってかなり違和感がありました。今度は子供とやろうと思いました。二人してかなりへたっぴで非常ブレーキと最高加速しか使っていないし・・・。やっていることは同じループに2列車を走らせて、駅に来たら止めるというのを繰り返しているだけです。

 そして、もう一つ、VVVF音とBEMFスケッチをくっつけてVVVF音をスピーカーに繋いだ件ですが、LPFを変更して、今まで1.5KHzで切っていたものを15KHzで切るようにコンデンサを0.1uF→1uFに変更しました。抵抗は100Ωのまま。前よりも音は明瞭になりボー音からプ―音に変わっているのが分かるかと思います。ボー音もプ―音もまあどっちもどっちですが。

 音が出てるとマスコンでも結構操作しやすいのですが、音がないと速度が分からず、マスコンではすぐにスピードの出しすぎになります。そうすると、そのうち作ろうと思っているS88のマスコンデコーダは液晶かなんかでスピード表示も入れたほうが良いかなあと思いました。 
 明日は、全日本模型ホビーショーに行こうと思っています。
 と思ったらまとめページがすでにある。

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

 前回、早々にモーターにVVVFパルスを入れるのはあきらめたのですが、今回は、前回の続きで、スケッチをすこしずつ直しながら電車に入れました。
 まずは、ArduinoUnoの3ピン相当ピンから出るようにしたので、幻のDSDecR4を使って、名古屋電鉄様の特製スピーカーに繋ぎました。いい音もなるしちゃんと動きますが、デコーダのレギュレータ―が触れないぐらい熱くなりました。スマイルデコーダR4はNゲージのモーターを回すぐらいで使ってねと注記がありますしね。
re_DSC01016.jpg
 次に、前回DCC信号でアンプ部分を壊してしまったMP3デコーダに繋ぎます。こちらは3ピンは出ておりませんので、表面実装のATMega328の足に直接つなぎます。
 で、こちらももちろんいい音が鳴りますし、モーターも回りますが、ATMega328が熱くなってきました。多分、スピーカーを駆動するのは荷が重いのでしょう。
re_DSC01018.jpg
 ということで、いにしえ(と言っても作ったのは去年の今頃)のアンプ基板386を使って、音を出してみました。こちらは12Vから電圧を取りますので、もうレギュレータもATMEGA328も熱くなりません。あとは、音量が調節できるし。(かなり微妙な調節になりましたが)
re_DSC01019.jpg
 で、スケッチはデバッグをしていくつか機能の追加と修正をしました。スケッチはこちら(K4_)
・スピードを落とすとノッチオフモードになる。
・CV5の最高電圧設定をコマンドステーションから最高速が来た時に最高電圧になるように計算を変更した。(VVVF側の刻みをできるだけ細かく取りたいため)
大きなところはこれだけです。(あと細かいところはおいおい直していきます)
 で、少し前に作った動力すっきり改造キット仕様の鉄コレ動力に付けました。
re_DSC01020.jpg
 嫌な予感がしている人は正解です。
 re_DSC01021.jpg
 名付けて、ハウルの動く電車(上のほうは動かないけど)。
 鉄コレの電車の中には全然入りませんでした。
 で、動画です。
 吊り掛け音はそれなりの音のような気もしますが、VVVF音のほうは聞くに堪えない音でしたので、今回は割愛いたします。




電車でGoコントローラをS88規格につなげるための最初の実験 [S88]

 少し前にYaasan様達とお会いした時に、S88に電車でGoのマスコンを複数接続しよう!という話があり、思わず私がやる!と後のことを考えずに手を上げてしまいました。
 でも、よく考えると、江ノ島登山鉄道を作りたいし、DSBasicはArduinoMegaを買ったところでほっぽっているし、ターンテーブルも途中だし、・・・・。
 まあ、それは置いておいて、実験を開始です。まずはDSMainでの動きを見るために、Yaasan様のWikiの電車でGo部分を確認です。貧乏性ですので、電車でGoのマスコンのプレイステーション用のコネクタ部分を切ってつなげるというのはやめました。(でも絶対にプレイステーションではもう遊ばないと思うけど)。
 で、Wikiと同じように、まずはUSB-プレステコントローラ接続変換器からメスコネクタを取ろうと思いました。
 取ろうと思った一個目のなれの果ての姿です。
re_DSC00994.jpg
 なんでこうなったかというと、ヒートガンで取れないかなあと思って熱したのですが、半田が溶けるよりも先にプラ部分が溶けました。まあ、当たり前ですよね。で、一個お釈迦です。
 次に2P用の変換器を持ってきて、今度は堅実に半田吸い取り線で吸ってから、一本一本コネクタの足を小手先で温めながら剥がしました。で、できましたが、やっぱり温めすぎているのか、こんな感じでひしゃげていてコネクタの刺さりが微妙に引っかかって固いです。
 re_DSC00993.jpg
 半田の盛りもおおくて、大事な(大事か?)はんだ吸い取り線の減りもすごい早いです。
 ということで、そのうち基板を作ろうと思っているのですが、世の中にプレステ用のコネクタ(メス)が売っていないかを検索してみたらありました。
 国内だとこちら。海外ではこちら。海外で一個100円で売っていて、国内で650円です。650円だと、ハードオフに行って中古の変換器買ってきて、コネクタをぐにゃぐにゃにしながら、取ったほうがいいかなあと思いつつ、結局、海外に10個注文してみました、2週間ぐらいで着いて、送料は一番安いものを選んだので、追跡無し郵便です。で約2000円。(それ普通に650円で買ったほうが安くないか?と思いました。後で。)
 基板を作って国慶節前にElecrowに頼もうかと思っていましたが、ものが揃うのが国慶節後かなあと思っています。
 で、次にソフトの確認です。DSMainR5の制御スケッチを見ると,、DenshaMasconというソースがあり、これがS88のポートの信号を変更して電車でGoコントローラを制御しています。
 将来的には、S88のバスに1コントローラあたり、16ビットぐらいを占有してマスコンを複数つなげられるようにしたいと思いますが、まずは、この上記ソースの動きを確かめるためにArudinoUnoに繋いで、動作を確認しました。
re_DSC00992.jpg
 で、マスコンも繋いで確認です。
re_DSC00991.jpg
 ちゃんと動きました。といってもS88バスに流すのではなく、USB接続のPCからマスコンの状態が見えるだけです。次はこれに6ポート用のS88基板をつなげて、DSMainR5ソフトからマスコンの状態を見えるようにしたいと思います。で、決めることがたくさんあります。全然考えてません。こうしてほしいという意見がありましたら、
・プロトコルどうすんだという話があります。
・つなぐなら、Locoネットみたいに高機能なコントローラも繋げるようにするべきだとかいう人もいるかもと思います。(ボタンだけならデコーダがあるが)
・コントローラの状態をそのままDSMainに出すべきか、それとも、電車の速度情報に変更してから出すべきかとか、少し先にそういう話がすぐに出てくるかなあと思います。電車の速度情報に変更するとなると、加速や減速具合の情報をプレステーS88変換基板で持つようになるが、まあ、ArduinoUnoベースなので、やること自体はあまり難しくない。ただ、プレステーS88変換基板からLoco番号を変更するとか始まると、最初にちゃんとプロトコルを考えておいたほうが良いのかなあと思います。
・S88のRailData(だったか)に5VのDCC信号を出す話があり、そうなると、S88のくせに双方向通信ができるが、それを取り入れると突然かなり(ソフト的に)面倒になりそうな予感がします。

 なにかこうすべきだとか、意見や質問のあるかたは、desktopstationのフォーラムに書いてください。一応それ用の新規投稿はしておきます。(今回そのアイディアを入れるかどうかは別の話ですが)。
 (Yaasan様、そういうのにフォーラム使うなというのでしたら言ってください。)

 

動力すっきり改造キットを作ってみる [電車]

 さて、二日ほどずっとソフトばかりやっていて、飽きてしまったので、鉄道模型コンベンションで買ったトレジャータウン動力すっきり改造キットを作りました。これは鉄コレの動力車のモーターを縦置きから横置きに変えて、見かけをすっきりさせるものですが、これでDCCのデコーダーを置きやすくなるかなあと思っています。デコーダーを載せて今からいろいろと実験する予定もありますし。
 で、商品の説明には、「日頃プラキットの工作に慣れている方なら完成できる内容です」と書かれております。ここは、私にとってはトラップでした。私は「昔プラキットはいくつか作って、やっぱ完成品のほうが楽だ。」と思いやめた口ですので、少々難しかったです。
 まず、内容品です。モーター押さえと、おもりと特製集電板が入っています。
re_DSC00996.jpg
 まずモーターを押さえるプラ部品を作ります。細かい部品でピンセットや固定のために金尺を二個使いました。(で、この部品、私は結局使いませんでした。)
re_DSC00997.jpg
 次に、鉄コレ動力のTM-10Rをばらばらに分解します。今回のモノはわたし的には当たり品で、台車が簡単に外れてよかったです。あとはプロペラシャフトをなくさないように気を付けます。昔、無くして、IMONに行ってパーツがないか聞いてみましたが、鉄コレ用の分売パーツなどあるわけもなく、似た長さのトミックス製の部品を買って帰りました。
re_DSC00998.jpg
 で、モーターの所ももっと分解します。
re_DSC00999.jpg
 この製品は、このモーターを縦置きから横置きにするという製品になります。イメージはこんな感じですが、もちろん干渉しまくりなので、削り続けることになります。
re_DSC01000.jpg
 まずは説明書に従って真ん中のモーター部分を削ります。説明書には、ドリルで穴を開けながら丁寧にやりましょうと書いてありましたが、私はホットナイフで適当に切ってしまって、その後デザインナイフで削りました。以下はホットナイフで切った直後です、先は長いです。
re_DSC01002.jpg
 この状態でモーターを横置きしても、フライホイールが干渉しており、全然高さは低くなっておりません。
re_DSC01005.jpg
 次にフライホイールの干渉部分を削るのですが、説明書にはフライホイールの干渉する前後左右を0.5mmぐらいデザインナイフで削りますと書いてありますが、どう見ても、0.5mm削ってもモーターが底面まで行くとは思えません。で、ホームページの写真を見てみたら、下部を全部削ってフライホイール見えているじゃん。ということで、フライホイールのためにホットナイフ大穴を開けます。(対応はTM-10で私の動力がTM-10Rだからこうなったのかもしれません)
re_DSC01006.jpg
 で、干渉がなくなるまでまた削ります。確かに大穴を開けた後は前後左右部分を0.5mmぐらいずつ台車フレームを削る必要があります。これは説明書にはデザインナイフで削りましょうとありましたが、私はリューターでやりました。あとはフライホイール位置が低くなるので、プロペラシャフト部分も干渉するようになりますので、そこも削ります。結構、強度的には弱くなってきます。このぐらい削りました。
re_DSC01009.jpg
 そして、モーターとフライホイールが入りました。良かった良かった。
re_DSC01008.jpg
 次に集電板ですが、写真上のようにオリジナルのものが付いています。しかし、今回はDCC化するので、モーターとレールを接触させる必要がないので、元々の集電板(写真の下のほう)を使うことにしました。
re_DSC01010.jpg
 で、モーター、集電板にはんだ付けして、モーターの所をポリイミドテープで巻いて絶縁をして、組み立てて一度完成です。
re_DSC01011.jpg
 一度と言ったのは、写真左側の集電板押さえの下でリード線とはんだ付けしてしまったので、押さえ板が時限爆弾のように取れてしまいました。ということで、半田付け場所変更です。(同じ失敗を昔もしたような記憶がある。
re_DSC01012.jpg
 ちょっと内側にしました。これでOKです。
re_DSC01013.jpg
 付属のおもりを載せて完成です。
re_DSC01014.jpg
 動きはOKでした。もちろん窓からモーターは見えません。床下にモーターとフライホイールが見えますが、なんかフライホイールが見えているのがカッコいいように思えてたりします。
re_DSC01015.jpg
 これを使って今後いろいろ実験しようかなあと思っています。
 なお、工作時間ですが、昼の12時ごろに始めて、完成した時間は4時ごろですので、半日仕事かと思います。
 というか、モーターを横置きにして、こういう風になるなら、鉄コレの動力は最初からモーター横置きで作ってほしいなあと思います。

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ぐらいか?)そこで、音が途切れることがあります。


VVVFのみスケッチ [ds-DCCデコーダ]

 VVVFスケッチからメロディーを抜いて、説明してくださいとの依頼がありました。こちらのスケッチになります。(今回、延々と文字だけが並ぶ話です)
 このスケッチの説明をしますと、
 CV47に2を設定して吊りかけ音は50~440Hzです。
 CV48は無視。
 CV2が起動電圧(0~255)、
 CV3が加速時のスムーズ値(0~255)(大きくするとスムーズになる)
 CV4が減速時のスムーズ値(0~255)(大きくなるとスムーズになる)
 CV5が最大電圧(0~255),
 です。
 ファンクションは
 F0:Offでモーター音On、Onでモーター音Off
 
 です。

・loop関数はステートマシンになっていますが、最初のループがl_pre_dccで、次のループからl_dccです。

・VVVF音が鳴る制御部分はMotor_Control関数で、中身を説明します。
・motor_control関数にはnotifyDccSpeed関数でときどき書き込まれるgSpeedCmdとgPwmDirが入力になります。
・まずLPF部分(スピードをスムーズにする)になります。DCCは128スピードしかありませんから、これをそのまま周波数にしてしまうと全部ドレミファインバーターのカッコ悪いのになってしまいますので、これをスムーズにしています。あとはついでに方向が変わったら急停止になるようにしています。
入力スピードはgSpeedCmd(0~255)で、出力スピード(スムーズになった後)はaPWMRef(0~1023)です。
-------------------
  //LPF routin
  float instruct_speed = (float)(gSpeedCmd * 4);//change from 256 to 1023
  float speed_step = 0;
  if( gPrevSpeed < instruct_speed )
  {
    //Acceleration
    accel_flag = true;
    speed_step = 1024 / (1 + (float)gCV3_AccRatio * 16);//  "* 16  " is because of smooth speed 
    gPrevSpeed += speed_step ;
    if (gPrevSpeed > instruct_speed)
    {
      gPrevSpeed = instruct_speed;
    }
  }
  else if( gPrevSpeed > instruct_speed )
  {
    //Deceleration
    speed_step = 1024 / (1 + (float)gCV4_DecRatio * 16);//  "* 8  " is because of smooth speed 
    gPrevSpeed -= speed_step ;
    if (gPrevSpeed < instruct_speed)
    {
      gPrevSpeed = instruct_speed;
    }
  }
  //when direction is different
  if(preDir != gPwmDir)
  {
    //stop
    gPrevSpeed = 0;
  }
  preDir = gPwmDir;
  aPWMRef = (uint16_t)gPrevSpeed;

-------------------
・次が、はじめの一回(vvvf_first_flag==true)はVVVF行列(kasoku[][])をロードしています。なんでこんなところに持ってきているかというと、Setupに入れたら、頭でっかちになってしまい、Directモード書き込みなどのタイミングに間に合わなかったためです。(l_pre_dccに入れてもよさそうですが)
・次に、スムーズ後のスピードであるaPWMRefとVVVF行列(kasoku[][])からVVVF音の周波数を計算してその時の周期current_period1,currnet_period2を求めます。currnet_period2はモーター音を重厚にしようと思った名残で残っているだけで、今回は使っていません。(またそのうち使うかも)
 そして、モーターの回転やトルクを出すためのduty比であるpwm_dutyを計算します。周波数によってかなりトルクが変わるため、これもVVVF行列[kasoku[][])にいっしょに入れてあります。
 次に、方向情報を付けて最終的にcurrent_duty_a,current_duty_bでDuty比を出してやります。
 なお、随所に「//interruptで渡す」と書いておりますが、やっていません。motor_control関数の最後にTimer1に書き込んでいます。
--------------------
  if(aPWMRef != 0)
  {
    //初期化 一回だけ行う
    if(vvvf_first_flag == true)
    {
      vvvf_first_flag = false;
      //安全策
      if(gCV47_SoundSwitch > 8)
      {
        gCV47_SoundSwitch = 8;
      }
      int kasoku_offset =  (int)pgm_read_word_near(&progmem_ref_kasoku[gCV47_SoundSwitch]);
      uplimit = (int)pgm_read_word_near(&progmem_ref_kasoku[gCV47_SoundSwitch+1]) - kasoku_offset;
      for(int i = 0;i < uplimit;i++)
      {
        for (int j = 0;j < 8;j++)
        {
          kasoku[i][j] =  (int)pgm_read_word_near(&progmem_kasoku [i + kasoku_offset][j]); 
          Serial.print(kasoku[i][j],DEC);
          Serial.print(",");
        }
        Serial.println("");
      }        
    }
    for(int i = 0;i < uplimit;i++)
    {
      if ( (kasoku[i][0] <= aPWMRef ) and ( aPWMRef <= kasoku [i][1]))
      {
        //音色側
        //周波数1
        pwm_freq = (double)kasoku[i][2]
                 + (double)(kasoku[i][3] - kasoku[i][2]) / (double)(kasoku [i][1] - kasoku [i][0])
                 * (double)(aPWMRef - kasoku [i][0]);
        current_period1 = (double)1000000 / pwm_freq;//interruptで渡す
        //Serial.print(pwm_freq,DEC);
        //Serial.print(F(" Hz,"));
        //周波数2
        pwm_freq = (double)kasoku[i][4]
                 + (double)(kasoku[i][5] - kasoku[i][4]) / (double)(kasoku [i][1] - kasoku [i][0])
                 * (double)(aPWMRef - kasoku [i][0]);
        current_period2 = (double)1000000 / pwm_freq;//interruptで渡す
        //Serial.print(pwm_freq,DEC);
        //Serial.print(F(" Hz,"));
        //電力側
        pwm_duty = (double)kasoku[i][6]
          + (double)(kasoku[i][7] - kasoku[i][6]) / (double)(kasoku [i][1] - kasoku [i][0])
          * (double)(aPWMRef - kasoku [i][0]);
        //CV2,CV5で修正
        pwm_duty = (double)gCV2_Vstart * 4 + (double)pwm_duty * (double)(gCV5_Vhigh - gCV2_Vstart) / (double)255;
        if (pwm_duty >1023)
        {
          pwm_duty = 1023;
        }
        //Serial.print(F("Duty:"));
        //Serial.println(pwm_duty,DEC);
        if(gPwmDir > 0)
        {
          //interruptで渡す
          current_duty_b = 0;
          current_duty_a = pwm_duty;
        }
        else
        {
          //interruptで渡す
          current_duty_a = 0;
          current_duty_b = pwm_duty;
        }
      }
    }
  }
  else
  {
    //interruptで渡す
    current_duty_b = 0;
    current_duty_a = 0;
  
  }

--------------------

・その次が(今は残骸のF0によるヘッドライトテールライトルーチンが・・・)
--------------------
  //F0
  if(gPwmDir > 0)
  {
    //F0
    exec_function( 0, FunctionPin_CCW_Light, HIGH );
    exec_function( 0, FunctionPin_CW_Light, !F0_flag );
  }
  else
  {
    //CCW
    exec_function( 0, FunctionPin_CW_Light, HIGH );
    exec_function( 0, FunctionPin_CCW_Light, !F0_flag );
  }

--------------------
・その次に実際にTimer1にPeriodとDutyを書き込んでやっています。この時、F0_Flagが1ならcurrent_periodを20,000Hz(中年には聞こえない高い音)にして、Current_Dutyを適当に1.9倍して、無音走行(ノッチオフ)にするというのもやっています。F0_Flagが0なら、上のほうで求めたPeriodとDutyでモーターを動かします。
 Back EMFにするなら、目標スピードがaPWMRefで実際の指示スピードがpwm_dutyになると思います。
 現在、pwm_dutyはkaosku[][]から求めていますが、BackEMFからうまくいくなら、個々の配列部分はすべて無視で「VVVF音あり」、「音無し」共に行けるかなあと思います。
---------------------
  //実際の命令
  //if(accel_flag == false)
  if(F0_flag)
  {
    current_period1 = (double)1000000 / 20000;
    current_duty_a *= (double)1.9;
    current_duty_b *= (double)1.9;
    if( current_duty_a > 1023)
    {
      current_duty_a = 1023;
    }
    if( current_duty_b > 1023)
    {
      current_duty_b = 1023;
    }
  }
  Timer1.setPeriod(current_period1);
  Timer1.setPwmDuty(MOTOR_PWM_A,current_duty_a);
  Timer1.setPwmDuty(MOTOR_PWM_B,current_duty_b);

---------------------
ところでaccel_flagですが、加速中はVVVF音、定速になったり減速時は無音というのをやるために作った(作り途中の)flagです。


サウンド江ノ電 [その他]

 音つながりということでサウンド江ノ電です。
 子供が持っていたので、音の大きさがどのくらいだったっけと思い借りてきました。
 電源オンで発車ベルが鳴ります。動かすと(手で動かすのでも良い)ガッタンゴットンと警笛が鳴って、止めると、プシューと鳴ります。

 モーター音のスピーカーよりは大きいです。というか1階で遊んでいると、2階まで結構な音で聞こえてきます。
 これで1,500円とは安くて驚きですが、中を見てみます。
re_DSC00990.jpg
 下の真ん中のねじを緩めて開けると、右に電池ボックス、左にスピーカーのエンクロージャーがあります。
 で、もっと開けると、基板が出てきます。
re_DSC00989.jpg
 赤黒が電池ボックスで、スイッチは緑でどっかで赤か黒とつながっているのでしょうか。オレンジ色2本が転がした時のタクトスイッチ、青2本がスピーカーのようです。肝心の制御と音を出すICはChip On Board実装のようで、分かりません。電源オンで発車ベル、タクトスイッチが押されたらガッタンゴットン音、タクトスイッチが押された後、ある程度時間がたったら、プシュー音がなるというステートマシンっぽいです。
 鉄道模型もモーター音鳴らしながらガッタンゴットンと速度比例で音を出したら、私は楽しそうだなあと思いますが、何を”リアル”と感じるかは人それぞれのような気もするなあと思いました。

前の10件 | -