中華製VFDで問題発生(CNC6040)

CNCの要と言えるスピンドルモーター、80mm直径、ER16、水冷式を購入、それに合わせてVFD(インバーター)も購入(HY01D511B)、物が届いたので、早速火入れをしてみた。

ところが、超低速では回るものの、周波数を上げると10Hzくらいで停止してエラーコードらしきものが表示され強制停止する。
「E.oL.A」
このエラー、マニュアルを見ても載っていない・・・
設定が悪いのかと思い、色々変更してみたが、同じようにエラー表示で停止する。
不具合の問題を切り分ける為、別のVFDに接続して回してみた(やはり中華製)、こちらでは、ギュンギュン回る、やはりVFDの初期不良のようだ、VFDの横にテクニカルサポートのメールアドレスが印刷してあるので、メールで不具合を聞いてみたら、モーターの型番を教えて欲しいとの事で、写真を撮って、メールを返した。
※英語の文書を作るのは翻訳エンジン頼みなので、イマイチだ・・・
今、ココ・・・
初期不良だとしても、送り返す手間や送料など、かなり面倒な事になる・・
まぁ仕方無い、それが中華品質だ・・・

そもそも、日本製のインバーターだと、100Vで使えるものが少ないうえに割高だし、少し調べた限りでは、100V、1.5KWはラインナップしていない。
かと言って200V用を買って、屋内配線を200V対応にするとか、かなりハードルが高い、昇圧トランスを買うにもコストが高い・・・
どうしたもんか・・・
まぁ、対応がアレな場合、修理するしか無いと思える。
それか、インバーターを自作するしか無いかも・・・

エラー表示のVFD
問題無く動作するVFD、非常に概観が似ているが、違うメーカーのようだ・・・

動作するVFDは、RS485で制御する事が出来ないようなので、追加で買ったのだが「ハズレ」を引いたようだ・・・

カテゴリー: CNC, 機械工作な日々, 気になった事を・・・ | コメントする

KIT-RX65Nラップタイマー(その1)

デジタルストレージオシロスコープは、部品が揃って無いので、保留状態となっており、新たにラップタイマーの実装を行っている、ゆくゆくはデータロガー的な物にしようと思う。
本当は「もて耐」で使う予定だったが、本業が忙しく間に合わなかった・・・

RX65N Envision Kit で何かを作る場合、ケースはどうするか?
ピッタリ収まるような汎用品を探したが、見つからない・・
※かなり大きく厚くなってしまう・・・
そうなると、作るしか無い、以前に「フォーレックス」と言う発砲プラスチックでケースを作った事がある、カッターで切れて軽くて作りやすいものの、意外と柔軟性が無く、簡単に割れたりもする。
そこで、専用ケースを作る為、とりあえず、一番安い3Dプリンターを買ってみた。
まだ組み立て中で調整も試運転もできていないが、前から欲しかった事もあり、ついついポチってしまったw
※比較的安い物を買ったので、安物買いのナントカにならないか不安ではあるのだが・・・

ラップタイマー的な物は、昔にAVRで作った事がある、液晶は128×64のモノクロで、今でも動作するのだが、かなり大きく(厚みがある)、バイクに付けるには少し大きすぎる・・
ラップタイマーだけなら、P-LAP などで十分だが、それなりの値段でもあるし、GPS を使った区間タイム表示、インジェクターパルスを収集して正確な燃費計など、やりたい事は色々あり、性懲りも無くまた作る事にした。
※今までに、何回もやり直してきたが、中途半端な状態でストールする苦い過去がある。
とりあえず、以前のリソースを元に液晶のGUIデザインなどをカットアンドトライで行っているのだが、解像度が高いので GUI のビットマップなどを作り直す必要がある、また、タッチパネルなので、それに合った操作性にする必要がある。

その前に、カラー画像を表示する為、BMPファイルのローダーをポーティングした。
BMPなら、比較的フォーマットが単純なので、メモリーを多く消費せず、また以前にアプリ用に実装したソースコードがほぼそのまま使える。
※少し前に JPEG のローダーをポーティングしたのだが、libjpeg では、構造上、一時メモリが必要で、メモリ不足で動作しなかった、libjpeg の API 操作だけで、一時メモリを必要としない方法もありそうだが、それに関連する情報が少なく、ライブラリソースを研究する時間的余裕が無く保留にしてある。
BMP でも、通常は、デコードした画像情報を一旦メモリーに蓄えて、フレームバッファにコピーする手法を取るのだが、余分なメモリーは無いので、デコードしながら直接フレームバッファに描画する。
BMP では、フルカラーは無圧縮、インデックスカラーはランレングス圧縮なので、ワーク用メモリを殆ど消費しない。
この為、BMP ローダーをテンプレート・クラスとして、描画クラスを参照で渡す仕組みに変更した。

template<class RENDER>
class bmp_in {
    RENDER&    render_;
...
    bmp_in(RENDER& render) : render_(render) ... { }
};

コンストラクターで、RENDER クラスの参照を渡す、BMP デコード時、このクラスを使ってフレームバッファに直接描画する。
※テストで使った BMP ファイルは24ビットカラーだけど、液晶は RGB565 なので、マッハバンドが気になる、またこの液晶は、視野角がかなり狭いのが痛い(低価格だから仕方無いのか・・)
※BMP 形式では、24、32、ビットフォーマットは圧縮されないので、やはりPNGなどもサポートする必要がありそうだー、その場合、Zライブラリーもポーティングする必要性がある。

GUI の部品は、bmc (ビットマップコンバーター)で変換した bitmap ストリームとして持っていて、他に、オブジェクトの横幅、高さ情報も保持している。
液晶が 128×64 くらいでは、この方法でも部品が小さいので問題無いが、480×272くらいだと、オブジェクトが大きく、速度の面でも、メモリーの面でも効率が悪い。
そこで、今後の事を考えて bmc に機能を追加して、簡単な圧縮フォーマットを実装する必要がありそうだー
とりあえず、カラーは考えないで、モノクロで、そこそこ、描画が効率良く行えるように、シンプルなフォーマットを考える必要がある。
※本来、モノカラーでも、「黒」、「白」の他に「透過」のアトリビュートが欲しいところではあるが、部品の描画を行うアプリ側で、細かく実装を行い、何とか見た目の問題を回避している、より複雑な GUI が沢山あると、これではマズイと思うのだが、その時考える事にしておく・・・

また、GPSから出てくるテキストのパースなどを実装する必要があり、実験したいのだが、部屋の中では、電波が弱くて受信出来ない、そこで外部アンテナを取り付けて、アンテナだけ外に出すようにした、実験してみると、窓枠に置いておけば、(窓が閉まっていても)ギリギリ受信出来る事を確認して、出てくる「経度、緯度」から、自宅の位置を確認した。
※以前にSUP500、GPSレシーバーを使っていたが、販売されていないので、10Hz出力が可能な物「GTPA013」を再度購入した、外部アンテナと、接続コネクターは秋月で入手出来た。
GPS関係では、データをロギングした後に軌跡を表示したりするアプリも作る必要があり、まだまだ調べたり実験する事が沢山あるので、これからの研究が必要な分野なので、まだまだ時間がかかりそうと思う。

カテゴリー: Motorcycle/Race, ソフトウェアー・エンジニアリング, 電子工作な日々 | コメントする

CNC-6040、リニアブッシュの交換(その2)

注文していた、オープン型リニアブッシュが届いたので、交換した。
やはり、以前の物とは明らかに違う、今度のは、ガタつきが無く(当然だけど・・)、シャフトに通すと、少し渋いくらいな感じだ、今回グリスではなく話題の「ベルハンマー」を購入したので、それをスプレーしたら、かなりスムーズに動くようになった。

ホルダーからリニアブッシュを抜く際に、何か良いものが無いか探したら、サランラップの芯が、ベストなサイズだった、しかも紙なのだが強度も十分にあり、キズも付かずに、簡単に抜く事が出来た。
向かって左側のホルダーは、少しきつめになるように加工(トゲ的な出っ張りを数箇所作って調整されていた)されているが、右側は、加工は無く、スルスル入る、ホルダーには、ブッシュを押さえる為と思われる、ネジ穴があり、そこに、ビスを付けて適度に締め付け(フライスなどのテーブルのカミソリを押さえるような)、ガタ付きをキャンセルできるようにしてあるので一応利用させてもらった。

次に、テーブルを固定するボルトが渋いので、タップを立て直す。
この時、タッピングペーストを使うが、以下の物が優れもので、穴あけでも抜群の威力を発揮する、この感覚は使った人じゃないと判らないが、CRCやオイルなどとは雲泥の違いがある、そんなに高い物では無く量も多くてリーズナブルだと思うので、穴あけなど、一度試してみる事をお勧めしたい!

Tスロット・テーブルを固定する穴は、かなりいい加減で、中心に空いていない箇所があり、ミニルーターを使って、適度に広げた、また、使っているビスが短い為、ネジが噛む部分が短く、強く締め付けられない、しかも普通形状のビスが使われているが、スロットを使う場合に「あたる」ので皿ネジか、低頭ネジを使うべきと思う、こうゆう質の悪さは、折込済みとは言え、やはりガッカリする、ほんの少しだけ気を使うだけで良いのに・・・
ステッピングモーターを固定するビスも、上部ユニットを固定するビスも短すぎて、ネジを噛む部分がほんの少ししか無い、強く締めたら簡単にネジ山が飛んでしまうだろう・・
剛性の強化も必要なので、少しづつ観察しながら進めていこうと思う。
※スピンドルモーターを買い間違えてしまい、注文しなおしたので、まだ先は長い・・

このCNCを載せる為、新たにメタルラックを購入して、天板を加工した、外は雨なので、家の中で電動ノコを使ったら、削りかすが凄くて掃除が大変だった・・・(当たり前だけど)
CNCを運転するまでに、左右と後ろ、前にボードを貼って、切子が飛散しないようにしないと大変な事になる、その板も購入してあるが、それはもう少し後で加工する事にする。
前は、透明な板とかにして、中が見えるようにしたいものだ・・・

カテゴリー: CNC, 機械工作な日々 | コメントする

RX24Tを使ったCNCコントローラーボード(その1)

CNCで、各軸を動かすモーター制御は、市販されているボードを使う事も出来るが、大抵はPCから制御するだけのボードで、PCを介さない状態で、手動で動かすインターフェースや、各軸の位置表示(PCの画面で行う)なども欲しいと思うので自作してみる事にした。
また、Gコードをパースするだけじゃない方法など色々なフォーマットや、インテリジェンスな制御系も試せる(カメラで画像認識を併用するなど)と思う、他にフライス盤をCNC化するのが中途な状態でもあり、最低2台は必要な事もある。

一般的に、Gコードのパース、制御では、「Mach3」が有名で、このソフトウェアーは非常に優れていて、柔軟性もあるのだが、ライセンス料が少し高い(自分にとっては)、また、ドライブのハードウェアーを簡単にする為、パラレルポートに直接駆動パルスを出力する仕組みで、PCの能力や、裏で動作するデーモン系の動作などに左右される印象を受ける(これは回避するHowToが十分整ってはいると思うのだが)、ハードやソフトを自作する方がよっぽど面倒で時間のかかる作業ではと思うのだが、「作ってみたかった」のが大きい。

マイコンは何にするか考えたが、自分の手持ちで手頃なのはRX24Tだ、このマイコン、元々はモーター制御などに適した構成のRXマイコンだけど、普通に他の用途に使っても十分な性能で、安く、CPの高いマイコンだと思う、ただ、USBは内臓されていないので、PCとのインターフェースはシリアル通信を使う事になる。(以前に10個まとめて買ったので、まだ沢山ある、@540)
・RX、32ビットコア
・80MHz動作
・PWMタイマーなどが80MHzで駆動できる。
・256Kのプログラムメモリーと16KのRAM
※最近では、CANインターフェース付きで、プログラムメモリーが512K、RAMが32Kの製品が、ほぼ同じ価格で販売されているようだ。(@570)

モーターはステップモーターなので、32段階のマイクロステップ動作が可能なドライバーを3台購入した。(1個7ドルほどだった)
「マイクロステップ」は、元々イギリスのベンチャー企業が始めたと思うのだが、磁気回路の特性に合わせて、相に流れる電流をベクトル制御する事で、見かけの分解能を再分割する技術だ、2相のステップモーターの場合、直交するXY軸の関係なので、それぞれ、サイン、コサインの電流割合で制御する事で、理論的には、無限大に分解能を上げる事が出来る。
今回買ったドライバーは、32段階までが可能なので、1回転200ステップのモーターなので、6400パルスで1回転の制御が出来る。
モーターの定格は、3Vで3Aのようだが、それは静特性で、動特性では、回転速度が速くなる程コイルのリアクタンスにより電流が流れにくくなるため、より高い電圧が必要になる、今回のドライバーは最大40Vで3.5Aまで可能なので、丁度良いと思う。
また、モーターを動かしたり停止したりを繰り返す場合、ドライバーはチョッパー動作でそれなりの効率ではあるが、モーターに蓄えらたエネルギーを吸収する必要があり、ドライバーはかなり発熱すると思うが、それなりに大きなヒートシンクが付いている。

とりあえず、モーターの回転は確認出来たので、ソフトを作りこんでいこうと思う。
まず、3軸同期で直線移動などだが、一般的には「ブレゼンハム」のアルゴリズムで、ステップパルスを生成するのが相場だろうが、自分は、分数を使う事にする(結果的にはほぼ同じだが・・)。
分数の場合、分母、分子を組で管理して、単純な足し算を使って行い、1以上になったら、パルスを発生させ、分子から分母を引く、このようにすると、切捨てが起こらないので、誤差が全く発生しない。
ハードウェアーは、リミットスイッチの入力インターフェースが無いので、それも載せる必要があるが、アイソレーションに使うフォトカプラが手元に無い・・
また、スピンドルモーターの制御用出力も載せる必要がある、スピンドルモーターは、三相モーターで、インバーターで制御するが、そのままだとOn/Offしか出来ない。
回転数の制御はボリュームなので、D/A出力も必要だろうか・・(シリアル接続で、コマンドで出来れば良いのだが、このインバーターには機能が無いようだ・・・)

カテゴリー: ソフトウェアー・エンジニアリング, 機械工作な日々, 電子工作な日々 | タグ: , | コメントする

CNC-6040を購入

東京から山梨の一軒家に引っ越して、もう9ヶ月になる。
いまだに、荷物整理などもままならない状況ではあるが、仕事も落ち着いて、多少時間を取れるようになったので、工作部屋の整理を始めた。

そして、中華のCNCを導入する事にして、今月の初めころ、物色していたが、オークションに出品されている物や、色々情報を集めた結果、「AliExpress」で買う事にした。
最初は、比較的手ごろで、バリエーションが多い「3020」系にしようと思ったが、イマイチ工作サイズが小さい、そこで奮発して「6040」系にする事にしたが、機材の値段は許容範囲でも、送料がかなり高い・・
それでも、日本の業者から買うよりはずっと安い。
このCNCは、基本、アクリルや、木材などがターゲットだが、アルミくらいなら、許容できる精度で削れるものと思う、また、改造すれば、剛性を上げたり色々出来るものと思う。

全て揃ったパッケージでは、日本向けに(電源電圧の仕様など)適当な物が少なく、バラで買う方が自分の好みの仕様に出来る事がわかって、バラで購入する事にした。

「バラ」と言っても、本体、ステップモーター、ステップモータードライバー、スピンドルモーター、スピンドルモータードライバー、くらいの分類で、色々選べる。

本体:
https://ja.aliexpress.com/item/Best-cnc-machining-aluminum-parts-mini-6040-CNC-router-lathe-assembled-motor-with-limit-switch/32868175584.html?spm=a2g0s.9042311.0.0.49974c4dSiOurA
先日、DHLで送られてきたー、送料だけで190ドル、本体600ドル。
本体は3軸分のステップモーターが付属しており、ちゃんとした?ボールスクリュー仕様で、剛性もそこそこありそうな物だった。
※探すと、もっと安い物はあるのだが、より剛性がありそうな物にしておいた。
ほぼ、組み立てられた状態で二つの箱に分けられて送られてきた、かなり重い(40キロ~50キロくらいある・・)

梱包を解いて取り出してみた、機材はほぼ組み立て済みで、Y軸とテーブル、XZ軸周りの二つになっている。
しかし・・・、いきなりトラブル、Y軸の移動は、オープン型の円形リニアガイドと20mmのシャフトが使われているが、指でラジアル方向に押すと明らかにガタつきがある・・・

どうやら不良らしいが、交換のやりとりや手間がわずらわしいので、リニアガイドだけ別途買って自分で交換する事にした。(LM20UUOP)
https://ja.aliexpress.com/item/MSM-Open-Type-Linear-Bearings-4pcs-lot-LM12UUOP-LM16UUOP-LM20UUOP-LM25UUOP-LM30UUOP-Shaft-Sliding-Ball-Bushings/32816522273.html?spm=a2g0s.9042311.0.0.49974c4dSiOurA
※4ピースで14ドル程度、一応、「高品質」な物を購入した。
日本でも大手のベアリングメーカーがリニアブッシュは扱っているが、オープン型は見つからなかった、また中華製だが、今度は大丈夫と思いたい・・(このくらいのトラブルは折込済みだ)
送料は無料だが、到着まで二週間くらいかかるようだ(多分船便なのだろう・・)

XZ軸部は、カバーのアルミが、おもっきり曲がってる・・・、梱包時に重いステップモーターの箱がこの上に乗っており、それで曲がったものと思う・・・

基本的に中華品質とは、そのような物で、その分安いので我慢する、それがイヤだったら、日本の業者から購入すれば良いだけの話。
※日本で買うと3倍以上のコストになると思う。
分解してみて、きり粉が、隙間に残っていたり、タップ立てがいい加減だったり、色々あるが、それくらいなら、自分で対応できる、基本的にそれが楽しめるくらいじゃないと駄目なんだと思う。
痛いのは、スピンドルモーターの仕様だ、写真の説明では65mmとなっていたので、直径65mmのスピンドルモーターを買ったが、実際には80mmのようだ・・・
スピンドルモーターは100ドルくらいなので買いなおすか、スペーサーを作って対応するか、思案中・・・
他に使いたい用途もあるので、物が届いたら、どうするか、また考える事にする。

追記:
よく調べたら、オープン型リニアブッシュ、日本製も扱ってた・・
ただ、値段は4倍くらいする(スチール製)、もう注文しちゃったので、それがイマイチなら、日本製に交換する・・
https://www.monotaro.com/g/00504277/

カテゴリー: 機械工作な日々 | タグ: , | コメントする

USBシリアル変換器を作る

お手製のUSBシリアル変換機は、ケースに入れた物が2個ある。
・FTDIのFT231XS
・Silicon LabsのCP2102
以前は、単品でデバイスを買って取り付けやすい事から、FT231XSを推していたのだが、RX64MマイコンとPC間でシリアル通信を頻繁に行うアプリを実験した時に、他のUSBシリアル(CP2102)と比較して能力が劣る事を体感した。
高いボーレートで、データが欠落するまでは調べていないが、CP2102と比較して明らかに転送能力が劣るようだ。(少し大きな容量を送る場合に分割されてしまい、転送時間が余分にかかる、これは、データを欠損していない事から、ドライバーの問題と思える)

少し調べると、「FT231XS」は、「FT232RL」より安い価格帯の製品なので、「FT232RL」より劣るように作ってあるようだった。
※そうしないと、より価格が高いデバイスの存在意義が無くなってしまう、もちろんFT232RLは、シリアル通信以外にも、色々フォーマットをサポートしており、その意味では差別化されているものの、USBシリアル以外で使う事は少ないと思うので、メーカーとして差別化をする必要があるのだと思える。

アマゾンでは中華製のUSBシリアルが沢山売られていて、その中でも、値段と機能が優れているCP2102のモジュールを数個買ったのだが、FT231XS単品より安価で、モジュールになっているのがありがたく、性能も良い、下記のモジュールは、全ての端子が配線されており、インジケーターLEDも付いている。

工作の実験では、電源を、3.3V、5V、の切り替えがほしい。
また、ケースに入れて、見栄えや、機能性、安全性を良くしたいなどの理由で、適当なケースに入るようにした。
http://www.takachi-el.co.jp/data/pdf/2016-01-057.pdf
※タカチ製CS75N
CP2102モジュールは、USBのコネクターが直に付いているので、外して、モジュール基板のみにして内部基板に組み込み、マイクロUSBコネクタに直す。
※最初から、デバイスだけ買った方が良さそうにも思うが、デバイスだけ買うよりモジュールを買って加工する方が安くて、扱いやすいし(QFPパッケージは工作しずらい)、既にバイパスコンデンサなど周辺回路が整っている。

AVRなどでは、5Vが主流だが、RXマイコンなどでは3.3Vが主電源になる為、USBシリアルから電源を供給出来た方が、何かと利便性が高い、デバイスにも3.3Vレギュレーターは内臓されているが、これは内部デバイス用で、外部で利用する用途ではないので、別途レギュレーターを載せる。(販売されている多くのUSBシリアル変換モジュールでは、3.3Vのレギュレーターが内臓された物がほぼ無い)
電源は、スイッチを付けて、切り替えを行う、ただ、3.3Vのマイコンに5Vを印加する間違いを起こす事はあるので、その点は十分注意する必要がある、以前に電源切り替えのスイッチにトグルスイッチを使ったが、物を上に載せた場合などに切り替わる場合があるので、スライドスイッチにした。

穴の加工が、面倒だが、プラスチックなので、ヤスリやドリルで忍耐さえあれば何とかなる、モジュールに載っているLEDの光を確認出来るように、LEDの真上に穴をあけてある、この穴は、グルーガンで塞ぐと、埃も入らないし、半透明で良い感じになる。

懸念事項として、シリアル出力(TXD、/RTS)からの電流問題がある。
通常、電源は、USBシリアルから供給するので、その場合は問題無いのだが、マイコン側で電源が用意してあり、信号のみ接続した場合に、マイコン側の電源が入って無い場合、USBシリアルの電源が入っていない場合の主に二りで、シリアル出力線を通して電源電流が流れてしまう事があった。

以前に、RX64Mでインサーネット接続用プログラムを組んでいた時に、シリアル接続をしているとネットワークが接続出来ない事があり、原因を調べたところ、USBシリアル出力からの電圧が、RXマイコンに流れて、それがインサーネットのPHYデバイスにも流れていた為、リセット時のbootstarp機能が正しく働かなくて、誤動作していた。
USBシリアルのTXDとRXマイコンのRXDに1K程度の抵抗を入れて、とりあえず回避したが本来はアイソレーションするべきと思う。
基板を起こす際には、それらを含めた回路を組むと思うが、今回は割愛した。

※一応、マジックで書いた上から、プリントした紙をはった。

カテゴリー: 電子工作な日々 | コメントする

KIT-RX65N、デジタルストレージオシロスコープ(その1)

RX65Nには、2ユニットのA/D変換器があり、分解能12ビット、最大2MHz程度のスループットがある。

このデバイスを利用して、デジタルストレージオシロスコープを作っている。
まだ、ソフトウェアーは開発中で機能追加を行っている段階ではあるものの、ハンドヘルドな測定器にする事が出来そうで楽しみが増えた。(前から作ってみたかった~)

画面もそこそこ広く、タッチスクリーンGUIで、操作も柔軟性があるので、ソフト次第で、かなり良いガジェットになりそうだー

実用的な物にするには、外部にプリアンプや、ゲインアンプを接続して、入力電圧の切り替えなども行う必要があるので、外部基板を作成する必要がある。

最初の問題は、LCDの描画だ、現在は16ピクセルRGB565シングルバッファで行っている。
これだと、描画の更新による書き換えが、画面に現れるので、具合が悪い。
理想的には、フレームバッファを二枚にして切り替える事だが、それだと、メモリーが足りない。
最初、256色のインデックスカラーにすれば、メモリーの問題は解決するものと思ったが、RX65NのLCDコントローラーは、フレームバッファのラインアドレスを64バイト単位で指定する為、8ビットだと、1ライン512バイト(32バイト無効になる)にしなければならず、やはり、メモリーが足りなくなる。
結局、1枚のバッファでも、書き換えの最適化を行う事で、リアルタイムの描画品質を改善する事ができた。
ただ、描画タイミングや配置を考慮する為、管理が面倒になる。

とりあえず、上記のような構成になっているが流動的な部分が多い為、仕様は変更になると思う。

基本的な操作では、CH0、CH1、時間軸、メニューの4つで画面分割をして、領域別に個々の移動を行うようにした。
※タッチすると、各領域を分ける赤い線が描画される。

肝心のA/D変換では、RX65Nに内臓のA/D変換ユニット(12ビット)を2つ同時に使い、ギリギリの変換時間(2MSPS)で2チャンネルのサンプリングが可能な事を確認した。

アナログ入力は、「AIN000」、「AIN114」を使った、これは、ボードのCN10から、又、電源は、CN8から出ている3.3V、5V、GNDを引き出し、5ピンコネクタを付けた、このコネクタを外部アンプボードに接続する。

外部アンプボードで、ゲインの切り替えや、リミッタ、電圧シフトなどを行う予定でいる。

A/D入力の配線や、A/D変換関係電源の品質などにより、S/Nがイマイチな気もするが、簡易的な物なので、目をつぶる事にする。

ただ、トリガー条件等を複雑なものにした場合、2MSPS(500ns)は厳しいのではないかと思うが、その場合は、トリガー条件を監視するループを遅くするしかない。

また、サンプリングするメモリーには余裕があるので、かなり大きなスパンで、波形を取得出来そうだが、波形をリコールする場合に工夫しないと、使い勝手が悪いと思う。

 

基本的な実験が出来たものの、小さい信号レベルから、大きい信号レベルを扱うプリアンプをどのような構成にするか、考える必要がある。

どのような部品を使って、どのような構成にするのが良いのか、検討中で、なるべく入手しやすく、性能とコストのバランスを取る必要があるので、この辺りは、もう少し時間がかかりそうー。

※アナログ回路は、最近あまり扱っていないので、知見や、技術が古く、最近のオペアンプのトレンドなどにも疎い・・

とりあえず、AD9833、DSDの波形をキャプチャーしてみた。

今回はここまで、作りこむには、アナログ部が必要なので、次回に、アナログ回路などの検討を行う。

カテゴリー: ソフトウェアー・エンジニアリング, 電子工作な日々 | タグ: | コメントする

まだあった、こんな初歩的なバグ・・・

以下のコードは、「format.hpp」にある、二進表記関数だ。
しかし、致命的なバグがある・・

void out_bin_(int32_t v) {
    char* p = &buff_[sizeof(buff_) - 1];
    *p = 0;
    uint8_t n = 0;
    do {
        --p;
        *p = (v & 1) + '0';
        v >>= 1;
        ++n;
    } while(v != 0) ;
    out_str_(p, 0, n);
}

バグの存在に気がついただろうか?

引数「v」が「負」の場合、「v」の右シフトは、符号が消えない為、「0」判定が正常
に機能しない為無限ループとなり、配列を超えて不正なアクセスが起こる。
※通常、プログラムはクラッシュするだろう・・

void out_bin_(uint32_t v) {

それで、上記のように、関数の引数を「int32_t」から「uint32_t」にすれば解決する。

「format.hpp」は、以前に、かなり広範囲にチェックしていたが、テストケースが抜けて
いた。
十分チェックしたつもりで、頑丈だと思っていたので、こんな危険なバグがあった事はショ
ックだが、仕方ない、よりよいテストを行う事と、危険な橋を避ける必要があるようだ。

format による二進表現は現在まであまり使わなかったので、この大きなバグによる弊害は
無かったが、危ない瞬間だった・・

カテゴリー: ソフトウェアー・エンジニアリング, 電子工作な日々 | コメントする

KIT-RX65N、レイ・トレーサー

ESP32やArduino系で走る「レイ・トレーシング」プログラムがある。

これを、RX65Nで、どのくらいのパフォーマンスなのか知りたくて、ポートしてみた。

元プログラムはC++で書かれたもので、良くできている。
※ソースコードは、ココから拝借したが、多少修正してある。
※ポーティングは極めて簡単だった。
RXマイコンは、浮動小数点の演算には定評があるので、少し期待していた。

結果は7.7秒と、まずまずの値ではある。
※速度比較の為、解像度320×240でレンダリングしている。

コンパイラのバージョン:

rx-elf-gcc (GCC) 6.4.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

最適化は「O3」

——-

Raytracing with ESP32
上記リンクには、各マイコンのレンダリングにかかる時間が載っている。
ESP32(160MHz)は、13秒みたいなので、それより低速(120MHz)のRXマイコン
はそれなりに優秀なのだと思う。
ただ、「STM32F7 (200MHz) 0.62 秒」に比べると、かなり見劣りする結果かもしれない・・
※クロックを差し引いても、かなり遅い・・・

全ソースは、GitHub にある。

——-
macsbug, cbm80amiga さんありがとう~

追記:
gcc の最適化によってどのくらい違うのかを確認しておいた。
・古い gcc-4.9.4 も確認したかったが、constexpr 関係がコンパイルできずにエラーとなったので、
コンパイラは gcc-6.4.0 のままだ。
・ベンチマークは「目安だ」プログラムの性質により大きく異なる場合が多いし、ほんの少し条件が変
わるだけで、結果が逆転する場合もある。
・ルネサス純正Cコンパイラでも評価したいところだが、環境を揃える事が難しいので、実験をしてい
ないが、ネットの情報を見ると、浮動小数点が多い場合は、gcc の方が優秀な場合があるようだ・・
※コメント欄のリンクを参照

コンパイラ 最適化オプション レンダリング速度 実行サイズ
gcc-6.4.0 -O3 7.7 140568
gcc-6.4.0 -O2 7.7 128180
gcc-6.4.0 -Os 13.2 106584

・O2、O3 でほとんど差が出ないが、バイナリーサイズは多少異なっている。

カテゴリー: ソフトウェアー・エンジニアリング, 電子工作な日々 | 5件のコメント

RX65N Envision Kit で実現するオーディオプレイヤー

I2Cの実装が、まともになったので、タッチパネルの操作を反映して、ファイラー
にも対応した。
これで、画面タッチでファイルを選択して、音楽を再生するガジェットがまともにな
った。

また、曲の再生では、一時停止や、次の曲などをタッチ操作対応にした。

本来ボタンを描画して、GUIで操作させるべきなのかもしれないが、それは、又後
で考える。
GUIに関しては、このボードの正規なサンプルプログラムとして既に公開されている
が(SEGGER)、GUIのような複雑な動作をCで書くのは、自分的にはありえない。
また、GUIの見た目や、操作の動作をエミュレーションする環境も必要な事を考える
と、少し複雑なGUIを作ろうとすると、この環境だけではかなり厳しいと思う。

以前に実装したリソースとして、Windows、OS-X で動作する Open-GL ベースの GUI
フレームワークがあるので、それをマイコン用にダイエットしてポートする予定でいる。
その時に、PC上で、見た目やリソースを作成するアプリなども作る予定でいる。
※その前にDRW2Dのエンジンを何とかしないと駄目なんだけど・・・
※DRW2Dエンジンの操作は、他のデバイスとは異なっていて、ライブラリーで提供
される、また、このエンジンに関係すると思われるレジスター群は、読み出し専用か、
書き込み専用レジスターとなっており、詳しい説明は省略され、ライブライーを使う事
を前提としている。

話がそれたが、オーディオプレイヤーのタッチ操作は以下のようになっている。
– 3点タッチ(離れた時)で、ファイラーが有効になる。
– 上下のドラッグで、ファイルフォーカス
– 右ドラッグでファイル選択(ディレクトリーの場合、そのディレクトリーへ移動)
– 左ドラッグで、一つ手前のディレクトリーへ移動
– 再生中、右へドラッグで次の曲
– 再生中、左へドラッグでリプレイ
– 再生中、2点タッチ(離れた時)で一時停止
– 再生中、3点タッチ(離れた時)で再生中断
– 再生中は、曲の再生が終了したら、次の曲を再生

現在、MP3、WAV形式のファイルをサポートしてあり、タグの表示にも対応してい
る。
タグは、ID3V2に対応しているが、V1タグは過去の物であり、あっても無視され
る。
タグは、曲名、タイトル、アーティスト、トラック、リリース日付、などの対応になっ
ている。
※WAV形式のタグも同じように対応している。

ジャケット画像をサポートする予定で、JPEGライブラリーをRX用にポートしたが、
一般的な方法では、メモリ不足で、デコードする事が出来ないので、こちらはそのうち
対応する事にする。(多分、一時メモリを使わず、直接フレームバッファに描画するよ
うにすれば可能なハズだが、リアルタイムにスケーリングもする必要があり、少しハー
ドルが高い)

オーディオ出力は、RX65NのDA0、DA1から出力する(量子化は12ビットだ
が)、無音は、3.3VとGNDの中間電圧、1.65Vとなっている。
バイパスコンデンサと抵抗だけで直にラインに繋げるのは心苦しいので、自分は以下の
回路を組んでいる。


※アンプの参考回路(以前にRL78で実装したWAVプレイヤーのもの)

量子化は12ビットだが、自分の耳では、そんなに悪い音に感じない。
※ブラインドテストで16ビットとの違いを聞き分けるのは難しいと思う。

現在DMACでD/Aに出力している部分をRSPIに変更して、多少改造すれば、外
部D/Aで鳴らせると思う。(いずれ、それも対応する予定でいる)
※SCIを使った簡易SPIだと、クロックを高速に出来ないので難しいかもしれない。
RX64Mだと、I2Sインターフェースがあるので、もっと簡単なのだが・・・
※自作音楽プレイヤーを前から作りたかったので、丁度良い。

GitHub AUDIO sample

カテゴリー: ソフトウェアー・エンジニアリング, 電子工作な日々 | コメントする