ステッピングモータを楽器にする
モータの励磁音っていいですよね。
東京で電車の発車のときにドレミファソラシド聞こえた時にはテンションあがりました。
というわけで、いつか何かに使うと思って放置していたステッピングモータを引っ張り出して演奏してみます。
しくみ
MIDIで外部機器につなぐ場合、MIDIケーブルが必要ですが、ありがたいことにhairless-midiserialを使用するとPC内に仮想MIDIケーブルを作ってくれるため音源部との接続はUSBケーブル一本で済みます。
詳しいことは下記ブログを参照してください。
インストールからArduinoでMIDIを受け取るところまで解説されています。
spinelify.blog.fc2.com
やったこと
今回は上記ブログに付け加えて音源部の作成を行いました。
音程とはいえ、所詮振動だろうということで、音階ごとの周波数を調べました。
tomari.org
ドなら262Hz
レなら294Hz
ミなら330Hz・・・
とまぁこんなところです。
あとはこの周波数のパルスでステッピングモータを駆動するだけです。
駆動にはArduinoからduty比0.5のPWMを送ってやります(パルス周期を変えるのでPPMが正しい?)
ちなみにArduinoでこれをやろうとすると、ArduinoのPWM機能が固定周波数のため、avr/io.hをインクルードしてレジスタを叩く必要があります。
で、実装して冒頭の動画に戻ります。
無事仮説どおりドレミファソラシドを演奏することが出来ました。
今後はもっと音階を増やして、何かしらの音楽を演奏するところまで目指していきたいと考えています。
あとは、せっかくNCフライスもあることだし、イケメンなガワを作ってみるのもアリかも。
KiCADで設計した回路をNCフライスで削る
今回はKiCADで設計した回路をNCプログラムに変換して切削する方法を解説します。
Windows向けです。
まず、KiCADで回路を設計。
加工に使用するツールにもよるかとは思いますが、今回は配線幅0.8mmで設計しました。
これ以下の幅だと銅箔が剥がれて断線してしまいました。
外注するときのデータと共用したかったのですが、難しいですね。
ちなみに、使用していたツールはこちらです。
Amazon | (SHINA )TiAIN/TINコーティング彫刻ビット PCB彫刻用 CNCビッド ルータツール 3.175mm 20度 0.1mm (5) | フライス盤アクセサリ
ファイル→プロットを選択して次の画面をだします。
出力フォーマットは「ガーバー」を選択。
今回は片面のみの基板となるので、B.Cuのみを出力します。
「製造ファイル出力」をクリックしてガーバーデータを出力します。
(ここまでは業者に発注するときの手順と同じかと思います)
つぎに、ガーバーデータをdxfファイルNCプログラムに変換します。(2017/05/17訂正)
sourceforge.net
pythonスクリプトで、現在の最新版は2016-11-09となっていますが、うまくいかなかったです。
一つ前のバージョンの2015-04-17にリリースられたものを使用します。
DLして解凍してセットアップをします。
使用しているパッケージのインストールが必要で、こちらのサイトに詳しいことは書いてあります。
pyGerber2Gcode - Linux工作室
pyGerber2Gcodeを回答したあとのファイル構成はこのようになっています。
「gerber_data」に先程生成したガーバーデータを入れておきます。
「gcode_data」にNCプログラムが出力されます。
「pyg2g.conf」で加工条件や変換対象のファイル名を設定します。
設定ファイルの内容の解説はこちらでされています。
CNCフライス盤による基板作成/Gコードへの変換 - ちょっと工業系が通りますよ @ ウィキ - アットウィキ
FRONT_FILE:表面のガーバーデータ名
XY_SPEED :XY軸送り速度(NCプログラムのFの値)
CUT_DEPTH :Z軸切り込み量
TOOL_D :ツール径
あたりはよく使うパラメータなのではないでしょうか。
実行はコマンドプロンプトから行います。
pythonでpygerber2gcode_cui.pyをpyg2g.confの設定で実行します。
出力されたデータをNCVCで確認します。
主軸回転開始終了の命令が抜けていたのでそこを手で追記。
生成されたプログラムの加工開始点が(0,0)ではなかったので、加工開始地点をNC側で(0,0)に設定するとあらぬ場所から加工を始めてしまいます(ソフトリミットの警告が出てました)
今回のプログラムでは加工開始前に(106.75,-125.0)でツール先端を接近してから加工を行うようなので次のような対処を行いました。
・G54座標軸でX105.Y-125.Z0で初期化
・加工開始場所のおおよその場所に主軸を移動させてツールをワークに触れされてNC上の現在値を(105.,-125.,0)に設定
で、加工開始。
こんな具合になりました!
ドリルデータも出力して自動で穴開けても良かったのですが、ツール交換など段取り中に位置がずれて穴位置がずれるのもいやだったので、自分で開けました。
完成。
ちなみに、配線幅を細く設定するとこんな感じになってしまいます。
溝が切粉で埋まっているというのもありますが、配線が基盤ごと剥がれてしまっています。
ツールが彫刻用ビットで、エンドミルとは違って切り込むほど工具径が太くなってしまうということもあるとは思いますが、手持ちの工具に細いエンドミルがないため、配線幅を太めにすることで対処しました。
最後に総括。
NCフライスでKiCADで設計した基板を切削して作成することが出来るようになった。
ただし、ツールのせいなのか基板を削るという特性上なのか、外注やエッチングで出せるほどの線の細さは不可能で、最低でも0.8mmが必要。
簡単な回路や、ちょっとした試作回路程度なら心強い。
また、今回の例では加工に2時間30分を要し、量産には向かない。
画像データをNCプログラムに変換する
前回
NCフライスで楽しく遊ぶために、画像データ(jpeg,gmp,png)をNCプログラムに変換する手順をまとめます。
つぎの工程で変換を行う。
①画像データを.dxfファイルに変換。
使用したい画像を読み込んで、したのバーをいじったり、輪郭切抜・線図地図を切り替えてみたりしていい感じに調整する。
カラー画像でもいけます。
デフォルトで出力データはIGESにチェックが入っているため、DXFに変更してカットデータ出力。
出力スケールを聞かれるため、ワークスペースや作りたいサイズに合わせて入力し、「コンポジットカーブ」にチェックを入れて出力。
②レイヤ情報を持ったCADデータ作成。
設定→レイヤから0グループのレイヤ0を「ORIGIN」に、レイヤ1を「CAM」に名称変更。
CAMレイヤを編集状態にして、ファイル→DXFファイルを開くから①で出力したDXFファイルを読み出す。
ここまでやると、先程のレイヤ情報がなぜか失われているので、もう一度同じ設定をする。
原点を特に指定したい場合はORIGINレイヤを選択して円を書いておきます。
この円の中心が原点となります(画像では原点設定はしていません)
未設定の場合でもNCVCで中央や左下など設定できます。
最後にファイル→JWCファイルで保存(JWWでもいけます)
③CADデータをNCプログラムに変換。
NCVCを起動して、オプション→CADデータの読み込み設定を次のように設定。
②で原点レイヤに原点をしていない場合はこの画面の「原点データがないとき」で設定する。
②で作成したJWCデータを読み込む。
オプション中にある「工作機械の設定」と「切削パラメータの設定」を行う。
初期ファイルはNCVCがインストールされているフォルダ内(デフォルトはC:\Program Files (x86)\NCVC)のInit.mmcとinit.nciです。
これらを開いて、加工機や加工条件に合わせてパラメータを入力する。
自分の場合は、加工パラメータだけはワークが発泡スチレンということで主軸回転数と切削送り速度を初期値よりも大きめに設定しています。
ファイル→NCデータ生成→標準生成でNCプログラムを出力する。
このとき、必須ではないが「NCプログラムをコード生成後に開く」にチェックを入れておくと左側にプログラムが表示されるので確認に便利。
この画面でF5で加工シミュレーション実行、Shift+F5で一時停止もう一度F5でステップ実行、Ctrl+F5で停止ができる。
生成されるファイルは.ncdになっておりMach3の指定形式ではないが、中身はNCプログラムなので拡張子からdを抜いて完成。
あとはこのプログラムを加工機に送って加工します。
今回の手順を応用してこんなことも出来ます!
一応Z軸の切り込みは-1.0mmとして設定してあってプログラムもそうなっているはずだけど、-3mmまで切り込まれてるようなので、その問題が未解決…
NCフライスかった。
NCフライス買いました!
1ドル110円くらいのときで、送料関税込みで13万に収まるくらいでした。
OMIOCNC社のX3-300-USBです。
今回はセットアップして自動で動かすところまでをまとめたいと思います。
本記事の内容により万一損害が生じたとしても、いかなる場合もその損害について一切の責任を負いません。
非常停止スイッチに手をかけたり、可動部に挟まれないように危険には十分注意してください。
今回構築したシステムは次のとおりです。
①それなりのスペックを持ったPCをメインPCとします。
ここではCADで設計をし、CAMを使ってNCプログラムを作ります。
ここでつくったNCプログラムは②のNCフライス制御用PCと共有しているフォルダに入れておきます。
②中古で12,000円くらいで買ってきたクソザコ控えめな性能のPCをNCフライス制御用PCとします。
OMIOCNCが販売しているNCフライスは附属のバージョンのMach3を使用することを推奨しており、その環境がWindowsXP、7だったので今回はWin7マシンを使用しています。
こちらの操作はメインPCからリモートデスクトップ接続を使って行います。(基本的にMach3にNCプログラムを読み込ませてサイクルスタートを指令することだけを想定しているため)
③今回の主役NCフライス(X3-300)
NCフライスはパラレルポートに接続するものが多いようですが、今回のものはUSB接続で動かすことができるので非常に助かりました。
では開封
各軸のモータと制御装置が切り離されているので、組み立てます。
リミットスイッチは使わない端子は折り曲げてあります(梱包の具合で曲がったとかではないです、ノーマルオープン接続です)
リミットスイッチは機械原点に戻すために使っているようです。
機械原点を設定してソフトリミットを活用することで可動範囲外に動こうとしてしまってぶつけてしまうようなうっかり事故を防ぐことが出来ます。
各軸のモータは4本のボルトをスペーサに通して固定するのですが、このスペーサが曲者で穴の位置が合っていない・・・。
おかげでボルトが内側に寄ってしまって本機に組み付かない・・・。
無理やりつけようとすると本機側のネジ山が削れていってしまうため、ここはおとなしくスペーサ側をヤスリで削って穴を広げました(組み立ててここが一番時間かかりました…)
で、モータ取り付けてケーブル配線して完成。
つぎに制御用PCにMach3をインストールします。
インストーラは注文後にOMIOCNCからメールで送られてきます。
手動で動作チェックします。
↑:Y+
↓:Y-
→:X+
←:X-
PageUp:Z+
PageDown:Z-
youtu.be
次にX3-300\2-UserManual\Test-Gcode中のSpindle-run.txtでランニングをかけてみます。
①Load G-CodeからSpindle-run.txtを選択
②非常停止を解除
この時機械側の非常停止スイッチも解除、制御装置に電源が入っていることを確認。
③主軸先端を機械の中央に移動し、X・Y・Zに0を入力してEnterを押します。(高さ方向Zも中央に)
ここが加工開始点となり、加工はこの点を原点として行います。
④サイクルスタートをします。
ソフトリミットの警告が出る場合は、座標表示の左側にあるREF ALL HOMEをクリックして機械原点に戻してから③に戻ってやり直してください。
結果。
youtu.be
最後にテストカットをしてみます。
プログラムは先程のプログラムと同じ場所にあるX3-Helper_120X70X0.5_PJ3_3002.ncです。
このままだと主軸の回転指令がないため、頭に
M03 S10000(主軸を10000min^-1で回転)
末尾に
M05(主軸停止)
を追加してください。
附属のφ3の一枚刃エンドミルを使用します。
ワークをセットし、電源を落とした状態でモータを回す(機械原点がずれるためおすすめしない)か、電源を入れた状態で手動テストと同じ要領で加工開始地点に刃先を持っていき(X・Y)、刃先をワークに触れされます(Z)
あとは自動テストと同様にプログラムを読み込んで実行。
youtu.be
めっちゃ周りが汚れるので気をつけてくださいw
完成はこんな感じ。
さすがにφ3のエンドミルでは文字が潰れます。
これでセットアップは終了です。
問題点
今回つくったシステムの問題として、制御PCをRDTでつなげているため、手動で動かしている時に通信不良が起きたらこわいなぁということが上げられます。
実際キーを離しても停止しない時があって、そのときは即座に緊急停止スイッチを押せる状態にあったため無事停止できたということがありました。(原因が制御PC側にあるかもしれないですが、未検証です)
やはり、ランニングかけるのはリモートでやるにしても、実際に使っていても手動での軸の移動など調整が出来るように制御PCにもモニタとキーボードを取り付ける必要を感じます。
横着をしすぎました。。。
次回以降、加工や画像データをNCプログラムに変換することをやって行こうと思います。
ツカサブラシレスのギアヘッドを外す
CNCのスピンドルモータに使うためツカサ電工のブラシレスモータ(TG-55N-AMD-5-KA)のギアヘッドを外してみました。
と、いうわけでコレがそのモータです!
さっそくギアヘッドを外したいのですが、ここで問題発生!
ギアヘッドを固定しているらしきネジが見当たらない・・・
もともとギアヘッドは使わず、自作の減速器をモータに直付けするつもりだったので、ここは筋肉で黒いところをこじ開けてみます!(ドリルで穴開けて、マイナスドライバ突き刺して取り外しました)
ギアヘッド固定ネジ発見!
というわけでここまでバラすことが出来ました。
先述の通り、自作の減速器に直付けなので、ピニオンが邪魔です。
そこで、タミヤのミニ四駆用のピニオンプーラを使って外しちゃおうと思います!
実はこのピニオンプーラ、そのままではモータ軸が太くて入らなかったので少し削ってやりました。
これで無事自作の減速器を取り付けることができるようになりましたとさ。
後から知ったのですが、黒い部分の取り外しは今回のような方法でなくて、叩いて外すことができるそうです。
@katosun_pom 手遅れ感満載だけど、ツカサのモーターはギヤヘッドをコンコン叩くとフタ外れるよ
— リュート@マミさんに頭なでられる為に (@RyutoSouma) 2016年7月31日
@katosun_pom このへんやねー pic.twitter.com/uyNUvQmGOp
— リュート@マミさんに頭なでられる為に (@RyutoSouma) 2016年7月31日
ツカサのブラシレスモータのギアヘッドを交換することはあってもピニオンまで外しちゃう需要は無いかもしれないですが、ピニオン外す必要がある!という変わった人のお役に立てば幸いです。
RaspberryPi2からつぶやく その2
仕様変更
・Twitterライブラリをtwythonからtweepyに変更。
ストリーム取得の実装がtweepyだと楽だったため(結局ストリームを監視するのではなく時限式に変更してしまいましたが...)
参考までに↓no6.hatenablog.com
・トリガーをリプライではなく時限式に変更。
リプライを受け取る→撮影→返信をするためにTLストリームを監視するようにしていたが、研究室の回線ではなぜか数分経つとストリームの取得が出来なくなってしまったため。
以上です。
3番目の実装に関しては後ほど。
写真を撮影しツイートに添付して投稿する
今回は今後画像解析とかしたいからという建前のもと、使い慣れているopenCVを使いました。
カメラから画像を取得して、jpegで保存します。
保存した画像をtweepyを使ってつぶやく簡単なプログラムです。
#get picture and tweet def upload_picture(message): api = tweepy.API(auth_handler=auth) capture=cv2.VideoCapture(0) capture.set(3,640) capture.set(4,480) if not capture: print "Could not open camera" ret, im = capture.read() cv2.imwrite('cap.jpg', im) api.update_with_media('cap.jpg', status=message)
pythonで全角文字を使用する
pythonのデフォルトの文字コードはASCIIとなっており、このままだとツイートの内容を日本語にすることができない。
そこで、文字列の直前にuを付け加えることでpythonにユニコード文字だと教えて日本語でツイートの内容を記述します。
d.hourは現在の時間です。
upload_picture(str(d.hour)+u"時のようすだよ!")
時限式でつぶやく
今回、毎時0分につぶやくためにcronを使用します。
ターミナルに「crontab -e」と入力し、実行タイミングと実行プログラムを登録します。
* */1 * * * python (.pyファイルの絶対パス)
ちなみに、
分 時 日 月 曜日 コマンド
の並びになっています。
参考
cron の設定ガイド
こうして毎時0分に写真付きでツイートが投稿されるようになりました!
さらに自動エサやり機能も付けたいと思いますが、これは卒論が終わってから気が向いたらやると思います...
【作ってみた】ゆっくり時計【眩しくない!】
夜ふと起きてしまい、時間が気になる。
でもスマホや目覚まし時計を見るとバックライトが眩しくて目がさめてしまう・・・。
と、いうわけでそんな時に便利な
_人人人人人人人人人_
> 眩しくない時計 <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
を作ってみました!!!!
仕様
・外の明るさに合わせて7セグLEDの明るさを調整する。
・しゃべる!!!!
・時計としての必要最低限な機能(時刻表示、時刻調整、電源がなくなった場合のバックアップ)
・表示する情報は時刻と月日
・マイコンはATmega168Pを使用する(これ大事!!)
回路図
7セグLEDはカソードコモンのものを使用し、シンクドライバにそれぞれのGNDをつなぎダイナミック点灯で数字を表示します。
明るさ調節機能
明るさのセンサとしてフォトトランジスタを使用しました。
照度センサ(フォトトランジスタ) NJL7502L (2個入): センサ一般 秋月電子通商 電子部品 ネット通販
CdSという選択肢もありましたが、こちらのほうが見た目がカッコイイのでw
マイコンでAD変換して、その値に合わせて
(本当なら)PWMでシンクドライバのGNDにつなげたFETをスイッチングして明るさの調整をします!!(したかった!!!!!)
こういうやりかたって出来ないんですね、勉強になりました。
このFETで点灯を間引くとすべての7セグのその瞬間に光らせようとしていたセルが光ります。
しかたがないので、割り込みの中で間引いていくことに・・・。
とはいえ、この割り込みは7セグのダイナミック点灯のために240Hzの割り込み(ひとつの7セグ点灯周期は60Hzで4個の7セグがあるため)をしており、これを利用したため、明るさは4段階のみ、点滅周期が長すぎて目に見えてちらつきます。
しゃべる!!
今回、音声にはAQUEST社の音声合成LSIを使用しました(今回の部品で一番高かったw)
音声合成LSI ATP3011F1−PU(ゆっくりな女声): 半導体 秋月電子通商 電子部品 ネット通販
こちらの資料に載ってる通りにアンプとスピーカーを取り付けて完成。
アンプ↓
低電圧1.2WオーディオアンプIC HT82V739 2.2〜5.5V動作 2個入: 半導体 秋月電子通商 電子部品 ネット通販
今回はI2Cで接続したので、PD2をGNDに、PD3をVCCに接続してI2Cモードにしました。
音量は可変抵抗で調整可能です。
時計機能
マイコンで時間を数えても良かったのですが、電源入れ直す度に時間設定するのは面倒だったので、RTCモジュールを使用しました。
RX−8025NB使用 I2C接続リアルタイムクロック(RTC)モジュール: 半導体 秋月電子通商 電子部品 ネット通販
バックアップ電源には1Fのコンデンサを使用。
これで電源がなくなっても一週間近く持つそうです。
こちらもI2Cで接続。
時刻調整機能もバッチリ。youtu.be
使ってみた!!
写真ではわかりにくいですが、めっちゃ便利です!
ちゃんと安眠を妨害しない程度には暗くなってくれるか心配でしたが、杞憂でした。
時報機能もつけようかと思いましたが、夜中になりだしてもこまるので付けなくて正解でしたw
ATmega168P
このマイコンは僕が電子工作を始めて初めて触ったマイコンで、かなり思い入れがあります。
ゆえに学生最後の趣味の工作としてはピッタリかな、と思って選びました。akizukidenshi.com
最近秋月ではディスコン扱いになってしまったらしく、寂しい感じです(まぁ上位互換の328と値段あまり変わらないし、あっちはArduinoで使ってたりしてるから仕方ないね)
今回、基板上のICなども魅せるようにしたいと思っていたので、最終的に使わない部品は極力載せたくありませんでした(回路設計ミスで使ってないFETが残ってしまいましたが......)
外部に接続する手段が書き込みしかなく、デバッグの方法も限られ、開発もなかなか辛かったですが、なんとか完成までこぎつきました。
ここまで育ててくれた168に感謝です。