FMトランスミッター(と言われる基板)

訳あってスマホのイヤホン端子の出力をFMで飛ばして車内で聞きたくなった。
そこで息子がデジットで購入していたFMトランスミッター基板(ジャンク)を奪い取って調べてみた。

その基板がこれ

FM-TX-DJK

FMトランスミッターといわれる基板

18pinDIPのICには「SI 3637 ED-9 720175」のマークがありますが、検索してもそれらしきものは見つかりませんでした。 27.147MHzの水晶が載っているのと、コイルがFMラジオの帯域にしては大きく見えるのが気になります。

そこで裏面の写真を撮り、PC上で反転したのと表面画像とを見比べながら・・・

FMトランスミッターといわれる基板裏面

裏面(これを反転画像にして表面と見比べた)

回路図にしてみました。

FMTX Schematic

回路図にしてみた。
(どこか間違っていたら容赦を)

ICにはDIPスイッチで何やら入力しています。またプッシュボタンを押すと2SA1015を経由してICの4pinにHレベルが入ります。  ICの出力は5pinで、ここがHの時、水晶発振回路が動作し2SC2001を経由して電波が発射される様です。

特に逓倍している様にも見えないので出力は27MHz帯だと思われます。ICはDIPスイッチに応じたシリアルコードを出していると予想しました。

とりあえず受信機を27.147MHzに合わせて横に置き、基板に電源(9V電池)をつないでみました。 すると電池をつないだ瞬間にLEDの点灯と共に受信機からビッビッと音が出ます。その後すぐにプッシュボタンを押しても何も起こらず、数秒経過してからボタンを押すと、再びビッビッが出ます。どうやら一度電波を出すと暫くは出ない様です。

受信周波数を27.147MHzの2倍、3倍に変えても同様に受信できます。出力が逓倍されているのか単に高調波を受信しているのかは分かりません。

ICからどういう信号が出ているのかを調べる為、ICの5pinの波形を見てみました。DIPスイッチの設定により信号が変化すると予想しています。

DIP-SW ALL OFF

DIPスイッチが全部OFFの波形

DIP-SW ALL ON

DIPスイッチが全部ONの波形

波形は2ブロックに分かれて出ており、受信機からビッビッと2度音が出る事と一致します。
またDIPスイッチ全てONと全てOFFとで途中のパルス幅が異なっている様に見えます。
やはり何らかのコードを出しているのでしょう。DIPスイッチの設定を細かく変化させながら波形を見ればもっと色々分かるのかもしれませんが、既に当初の目的であったFMトランスミッターとしては使えない事が分かったので深入りは止めておきます。

結局この基板は何だったのでしょう?
なにかのリモコン送信機(たとえば車庫の扉開閉とか)ではないかと想像します。
コードを調べて受信機を作ればラジコンに使えるかもしれません。

NONSAYAさん設計パーツ収納ボックス

レーザー加工機が完成したら作ろうと思っていたNONSAYAさん設計のパーツ収納ボックスを製作してみました。加工機はまだ完全に完成した訳ではありませんが、とりあえずはカットできる様になったので。

抵抗も入れたいのでオリジナルに比べて各ボックスの幅を10mm広げています。
また手持ちの関係でアクリルパーツは3mm→2mmに変更しました。

PartsBox

パーツ収納BOX

NONSAYAさんが横浜で設計された物が熊本でも同じ様に作れる。
これがデジタルファブリケーションってやつですね。

# データをアップ頂いてNONSAYAさんに感謝です。

Laser加工機製作 ~その15 安全スイッチ~

安全のため、稼働中に上蓋を開けるとレーザー発射を停止する様にします。

上蓋にリードスイッチを取付けて制御基板のレーザーイネーブル信号に入れる構想です。フォロカプラ(図中のIC1B)をOFFするとレーザー電源のイネーブル端子がオープンになりレーザーは発射されません。

LaserCtrl-A

赤で追記した箇所にセンサーを挿入します。

 

当初センサーにはこういうのを使おうと考えていました。生産ラインの装置では良く見かけます。

OMRON_GLS

OMRON磁気型近接センサ

http://www.fa.omron.co.jp/products/family/481/?WT.mc_id=1202600001403030

ショップで値段を見ると800円以上します。そこで裸のリードスイッチの購入を考えました。これだと100円前後です。 暫く悩んでいると息子から「ダイソーに同様のセンサーを使用したLED照明があるよと」の情報が。(こいつ、勉強はしないくせにこういう事には目ざとい)

そこで買ってきたのはこれ。

DisoLEDlightNo21

ダイソーLEDセンサーライト
即刻ばらした後の写真

磁気近接センサーの他にLED、制御回路、LR44バッテリx3個が入って税込み108円。いつもながら何でこんな値段で出来るのか不思議です。 白い長方形のが磁気センサーと磁石で、センサーにはリードスイッチが入っているものと思われます。 本来の用途では、これをドアと壁に取り付け、センサーと磁石の距離が離れるとスイッチがOFFになりLEDが点きます。 スイッチOFFでLEDをつける為、制御基板にはトランジスタらしきものが2個載っており、ざっと見たところ次の回路です。

LEDSenserLightSchematic

LEDセンサーライトの制御基板回路

今回はセンサー部分のみ使用するのでLEDと制御基板は取っておきます。

センサーは付属の両面テープでレーザー加工機に貼り付けました。

安全カバーセンサ

安全カバーセンサ

蓋を開けるとレーザー電源のイネーブル信号がOFFとなり発射されません。
本来モーターも止めるべきですが、こちらは蓋を開けたまま動かしたい場合もあり、またレーザー程も危なくないので止めません(会社でこういう仕様にしたら怒られるでしょうね)。

 

Laser使用中

Laserは物騒なので使用中を示す表示を部屋の入り口に取付けます。

まず、切り抜きデータを作成します。
こちらのサイトを参考に文字をdxfに直してjw-cadにもって行き、’O'や’A'等、切り抜くとこぼれ落ちてしまう文字を手修正しました。あとはレーザーのマーク等も書き加えて厚紙をレーザーカットします。

LaserSignMask

文字の切り抜きデータ

次にケースをカットします。

ケース

ダイソーの6mm厚MDFをカットして組み立てます。

そしてアクリルカバーをカットします。

LaserSignCover

赤系透明アクリルカバー

ケースの底には白い紙、側面にはアルミテープを貼り、赤色LEDと抵抗2個をグルーガンで貼り付けました。また文字マスクの空き部分にもアルミテープを貼っています。
本体とカバーとは両面テープで接合しました。

LaserSign

LaserSign組み立て中

電源には古い携帯電話の充電器を使用しました。

LaserSign PowerSource

mova時代の充電器

ドリルで壁に穴を開けて配線を通し、ドアの上に取付けて完成です。

LaserSign ON

点灯!

 

Laser加工機製作 ~その14 LinxCNCでレーザーラスター加工 まとめ~

前回まででLinxCNCによるレーザーラスター加工が可能になりましたが課題もあります。

  1. 中間階調が出ない。
    今の所ONとOFFのみで写真等は綺麗に描画できません。
    細かい点の密度で階調を表現する様にgmaskファイルを生成すれば出るかもしれません。あるいはPWMでレーザーパワーを調整する様にHALを書き換えるとか・・・
    いずれ試したいと思います。
  2. TouchOffボタンにより座標系原点を機械原点と異なる値にすると正常動作しない。
    HAL内でX軸の位置を取得している「axis.0.joint-pos-fb」は機械座標での位置を返す様です。TouchOffボタンでワーク座標系を機械原点と異なる値にすると*.gmaskに書かれたX位置と一致せず、正しい位置でレーザーが出ません。 何か方法がありそうな気がしてマニュアルを読んでいるのですが・・・わかったら報告します。

そんなこんなで色々とありますが最低限の動作はした、という感じです。

なおLinuxCNC自体についてはhttp://linuxcnc.org/が、
またドキュメントの一部を日本語化されているシマリス技研さんのサイトも大変参考になりました。

 

Laser加工機製作 ~その13 LinxCNCでレーザーラスター加工 Graster~

ここ何回かRastering With a Laserに沿ってLinuxCNCによるラスター加工について書いてきました。今回のGrastarをインストールする事で任意の画像データを変換しレーザー加工機で出力するまでの流れが完結します。

Grasterの動作

Grasterは画像データをLinuxCNCに喰わせる形に変換するプログラムで、Rubyで書かれています。
例えばKumamon.pngという画像ファイルをGrasterで処理すると、次の3つのファイルが生成されます。

  • Kumamon.png.raster.ngc
    ラスター描画時にレーザーヘッドの移動を制御するNCコードです。
  • Kumamon.png.raster.gmask
    ラスター描画時にレーザーのON/OFFを制御するデータです。上記NCコード実行時に読み込まれます。
  • Kumamon.png.cut.ngc
    外形カット用NCコードです。

まずはRuby関係のツールをインストール

Grasterを動作させる為、まずはRubyとその関連ファイルをインストールします。ほいほい堂のUbuntu上ではapt-getにより以下のツールをインストールしました。

sudo apt-get install ruby
sudo apt-get install imagemagick
sudo apt-get install librmagick-ruby1.8
sudo apt-get install rubygems1.8

前回の投稿でダウンロードしたGrasterファイル

Graster自体は前回の投稿に書いた通り、下記コマンドで入手します。
※前回の投稿は当初リンク切れのアドレスを載せていたので後日修正しています。

https://github.com/jedediah/graster/archive/master.zip

Grasterの動作確認と修正

ダウンロードしたGrasterを解凍するとgraster-masterディレクトリ下にbin/grasterというファイルがあります。これが実行すべきコマンドファイルですが、私の環境では次のエラー出ました。

$ ./bin/graster
/usr/bin/env: ruby -rubygems: そのようなファイルやディレクトリはありません

どうやらbin/grasterファイルの先頭行「#!/usr/bin/env ruby -rubygems」で引っかかっている様です。  /usr/bin/envでrubyへのパスを指定した場合、引数があると環境によってはエラーになるそうです。そこで次の様にrubyへのパスを直接指定してエラー回避しました。

$ diff graster.ORG graster
1c1
< #!/usr/bin/env ruby -rubygems
---
> #!/usr/bin/ruby -rubygems

これでとりあえずはエラー無く変換ができる様になったのですが、実際に加工機で描画してみると正しい場所でレーザーが出力されません。またレーザーヘッドの動作範囲が妙に狭い様です。
原因は次の通りと思われます。

  • Grasterはインチ単位の動作を前提に書かれている。
    私の加工機はLinuxCNCの設定で、ミリ単位を基本にしています。本来インチで書かれたNCコードをミリと解釈しているためレーザーヘッドの動作範囲が狭くなっています。
    また、xxx.raster.gmaskファイルにはX軸が所定の箇所に達したら次の動作(レーザーをON/OFFしたり)に移るという動作が書かれていますが、これもインチで書かれています。
    これに対し加工機がhalに知らせるX軸のポジションがミリなので、ここも上手く行きません。
  • xxx.raster.gmask中の記述が往復描画と片道描画が混乱している。
    ラスタースキャンではレーザーヘッドが往復する際に右向きと左向き両方で描画する方法と、片方向のみ描画する方法があります。速度と精度のトレードオフなのですが、生成されたgmaskはこの両方の方式が混ざって記載されている様で正しく制御できていませんでした。

以上2点の対策として次の方針で変更しました。

  • 単位はミリで出力する。
    あまりややこしく考えず、座標を出力するデータ全てに25.4を掛けるという方法で修正しました。 よって出力はミリ単位になっていますがオプション入力での数値はインチのままです。
  • 片方向描画に統一したgmaskファイルを生成する。
    とにかく片方向描画が正しく出来るファイルを生成する様に変更します。

これらを変更したところ、それっぽく動作する様になったのですが、描画の最後の方だけレーザーが出ないという問題が発生しました。 動作の最後の方になるとなぜかstreamerからデータが出てこなくなります(LinuxCNCのバグではないかと思っています)。結局原因は判っていないのですが、streamerのバッファにデータがたっぷりあればこの現象が発生しない様なので、gmaskファイル生成時にデータを余分に出す事で逃げています(全フィールド0の行を400行ほど余分に出力しています)。 本来LinuxCNCの最新バージョンでどうなるかを試すべきですが・・・いずれやってみます。

Graster修正結果

最終的に変更したのは次の内容です(それと上に掲載したbin/grasterもです)。

$ diff lib/graster.rb.ORG lib/graster.rb
177c177,178
<     @image.size[1].times {|y| @tiled_rows << tiled_row_spans(y, (forward = !forward)) }
---
>     #@image.size[1].times {|y| @tiled_rows << tiled_row_spans(y, (forward = !forward)) }
>     @image.size[1].times {|y| @tiled_rows << tiled_row_spans(y, (forward)) }
219a221
>     gmask.epilogue
$ diff lib/graster/gmask_file.rb.ORG lib/graster/gmask_file.rb
13,15c13,15
<         self << "0 0 0 %0.3f\n" % x1 if @begin_row
<         self << "0 0 1 %0.3f\n" % x1
<         self << "0 1 1 %0.3f\n" % x2
---
>         self << "0 0 0 %0.3f\n" % (x1*25.4) if @begin_row
>         self << "0 0 1 %0.3f\n" % (x1*25.4)
>         self << "0 1 1 %0.3f\n" % (x2*25.4)
17,19c17,19
<         self << "0 0 1 %0.3f\n" % x1 if @begin_row
<         self << "0 0 0 %0.3f\n" % x1
<         self << "0 1 0 %0.3f\n" % x2
---
>         self << "0 0 1 %0.3f\n" % (x1*25.4) if @begin_row
>         self << "0 0 0 %0.3f\n" % (x1*25.4)
>         self << "0 1 0 %0.3f\n" % (x2*25.4)
22a23,29
>
>     def epilogue
>       (0..400).each do |x|
>         self << "0 0 0 0\n"
>       end
>     end
>
$ diff lib/graster/gcode_file.rb.ORG lib/graster/gcode_file.rb
35c35
<           "#{k.to_s.upcase}%0.3f" % v
---
>           "#{k.to_s.upcase}%0.3f" % (v*25.4)

修正版一式

修正版一式をアップしておきます。

使用方法

次の様に使用します。
各種パラメーターはカレントディレクトリのgraster.ymlに書いておくとデフォルトとして使用されます。下の例では画像のドットを300dpiとして描画する様に指定しています。実行後、上に書いた3本のファイルが出来ています。

%graster –dpi 300,300 Kumamon.png

変換後のファイルもアップしておきます。