スクラッチ&スクラップ

簡単なプログラミングや電子工作など。しょうもない工作の記録。

複数のフォーマットにまとめてエクスポートする SolidWorksのマクロ

f:id:macrochelys99:20191121010644p:plain

SolidWorksモデリングした各部品を中間フォーマットに変換しようとするときは、 指定保存 から拡張子をプルダウンで選んで変換するフォーマットを選びます。しかし対応している形式がとても多いのでプルダウンメニューから探すのがわりと面倒くさいんです。

というわけでマクロを組みます

Excelのマクロでおなじみ、VBAです。UI も Excel のと同じですね。

f:id:macrochelys99:20191121001906p:plain

Excelのマクロは解説している書籍やサイトがたくさんありますが、SolidWorksのマクロを解説している資料は少ないので、まずは操作を記録させてどういうコードが生成されているか観察するところから始めました。

モデルをエクスポートする際、ファイル名を(日付を含めるとか)変更することがほとんどなので、マクロを実行するとファイル名を入力するテキストボックスを開きます。するとエクスポート用のフォルダを作ってそのなかに IGESSTEPSTL、そして パラソリッド に変換して保存するようにしました。

f:id:macrochelys99:20191121002501p:plain

Option Explicit

Dim swApp As Object

Dim Part As Object
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long

Sub main()
    
    '変換したファイルを保存するフォルダを設定
    Const SAVEFOLDER = "_exported"
    
    Dim filename As String
    Dim message As String
    Dim format As String
    Dim warnmsg As String
    
    Set swApp = Application.SldWorks
    Set Part = swApp.ActiveDoc
    filename = ""
    warnmsg = ""
    
    '保存するファイル名を入力
    'While filename = ""
        filename = InputBox("ファイル名(" + SAVEFOLDER + " フォルダに出力)")
    'Wend
    If (filename = "") Then Exit Sub
    
    ChDir (swApp.GetCurrentWorkingDirectory())
    
    If Dir(SAVEFOLDER, vbDirectory) = SAVEFOLDER Then
        '何もしない
    Else
        MkDir (SAVEFOLDER)
    End If
    
    Part.SaveAs (SAVEFOLDER + "\" + filename + ".IGS")
    Part.SaveAs (SAVEFOLDER + "\" + filename + ".STEP")
    Part.SaveAs (SAVEFOLDER + "\" + filename + ".x_t")
    Part.SaveAs (SAVEFOLDER + "\" + filename + ".STL")

End Sub

ところが

IGES STEP パラソリッド は出力されるのですが、STL が出力されません。

Part.SaveAs (SAVEFOLDER + "\" + filename + ".STL")

のところを

Part.SaveAs ("C:\tmp\hoge.STL")

と直接パスとファイル名を指定すれば出力されました。しかしこれでは汎用性がなくて使えません。

結論

書き方や設定を変えてみたりいろいろ試してみたのですが、STL を最初にエクスポートすると全部出力されました。

    Part.SaveAs (SAVEFOLDER + "\" + filename + ".STL")
    Part.SaveAs (SAVEFOLDER + "\" + filename + ".IGS")
    Part.SaveAs (SAVEFOLDER + "\" + filename + ".STEP")
    Part.SaveAs (SAVEFOLDER + "\" + filename + ".x_t")

エクスポートする順番が影響するって何でしょうね。
Windows7 + SolidWorks2015 SP3 のマシンでも、Windows10 + SolidWorks2017 SP3 のマシンでも、どちらも再現したので個別の環境による問題ではなさそうです。

次の目標

アセンブリ内の部品を全部まとめてエクスポート、できたらちょっと楽になるかな?
ネジとか要らない部品まで変換されちゃいますね。

おまけ

STL のビューワは L-Phinus が軽くて使いやすいです。
https://l-phinus.jp/index.html

f:id:macrochelys99:20191121003438p:plain

人感センサーでUSB電源をスイッチする

洗面所の蛍光灯がすぐ切れます。電球ならLED電球に付け替えれば良いのですが、蛍光灯は管だけ交換みたいにお手軽にはいきませんね。

そんなわけで、USB電源のLED照明を追加で付けていました。

しかしケーブルの途中にスイッチが付いてブラブラしているので、ちょっと使いにくいです。センサーで自動点灯できるといいな。

センサーどれにしよう?

赤外線パッシブ

超音波

電波


使うならこのあたりが定番でしょうか。 超音波は比較的正確な距離を測れますが、動かすにはマイコンが必要だし距離精度は必要ないので除外します。

レーダー(電波)も評判は良さそうですが、今回は赤外線タイプを使います
ボリュームで感度や点灯時間が簡単に調整できるのが良さそうです。

回路図

f:id:macrochelys99:20191016003655p:plain:w400

赤外線センサーの出力で、チップの MOSFET をドライブするだけです。

基板図

f:id:macrochelys99:20191016004122p:plain:w400
のせる部品が少ないので、ほとんどベタGND。

f:id:macrochelys99:20191016004238p:plain
Micro USB は、パターンごともげやすいので、スルーホールタイプを使用します。端子のハンダ付けが難儀すると思われるのでSMDパッドも大きめに修正します。

基板実装

f:id:macrochelys99:20191016005058j:plain:w400

f:id:macrochelys99:20191016005214j:plain:w400
裏は部品なし。

f:id:macrochelys99:20191016005358j:plain:w400
センサー取り付け。スペーサーは M2 の 11mm です。

ケースのモデリング

f:id:macrochelys99:20191016030729p:plain:w400

f:id:macrochelys99:20191016005830j:plain:w400
ジャストフィット!

f:id:macrochelys99:20191016005908j:plain:w400
フックの強度確保のため、フタは立てて造形します。

完成

f:id:macrochelys99:20191016010046j:plain:w400
f:id:macrochelys99:20191016010057j:plain:w400

使用感

f:id:macrochelys99:20191016010140j:plain:w400
センサーの感度が高すぎて、洗面所の前の廊下を通るだけで点灯してしまいます。
感度ボリュームをめいっぱい下げてもダメなので、センサーのレンズ左半分にマスキングテープを貼りました。

「どうせ消費電力小さいし」と、今までこのLED照明を常時点灯で使っていたのですが、アダプター(USB充電器)がかなり熱くなり気になっていました。

センサー化によってアダプタが熱くならなくなったのが一番のメリットかな?

シリアルモニターを作る

f:id:macrochelys99:20190916014352p:plain

Arduinoなどのマイコンの動作状態をパソコンのモニタに表示させたい場合、大抵はシリアルモニタを使いますでしょうか。

作ったものを他人に使ってもらう場合、それだけのために Arduino IDE をインストールしてもらうのも勝手が悪いですよね。使い方の説明もしなきゃならないし。

一般的には TeraTerm かな?

f:id:macrochelys99:20190916014825p:plain

それはそれで、ポートの設定とか説明しなければなりません。

というわけで、シンプルなシリアルモニターを作ってみます。開発環境は Visual Studio Community 2017、言語は Excel のマクロでおなじみの VB にしました。

サンプルコードも豊富でわかりやすかったサイトがこちら。
VB.NETでシリアル通信を行う

送信機能は省略しました

f:id:macrochelys99:20190916015942p:plain
受信した文字列をテキストボックスに羅列するだけのアプリです。

接続済のポートと事前に設定したボーレートを表示して起動するので、接続ボタンを押すだけで使えます。

ハマったところ

切断ボタンで SerialPort1.Close() をすると、アプリが固まって反応しなくなりました。

検索すると、InvokeBegenInvoke にすると良いとか、 BufferSize を大きくすると良い、という記事や投稿がありました。しかし、試してみるも効果なし

受信した文字列をテキストボックスに追記するところで固まっているようだったのでテキストボックスのプロパティをいじりまわしたところ、ScrollBarsNone から Vertical にしたら正常に動くようになりました。

もうちょっと機能を入れてみる

ステッピングモーターの位置を方位磁石のように表示する機能を付けました。

モーターの動作は、Arduinoにプログラムされています。

Arduinoステッピングモーターを動かすごとにステップ位置をシリアルで送ってくるので、1周のステップ数から計算してモーターの角度を表示しています、


シリアルモニターを作る

位置を示す赤い矢印は、外形の座標を計算してプロットしています。学校で習った三角関数が試験以外で役に立ったレアケース。

グラフを描く部分

    Dim deg As Single = 0       'degree
    Dim pos As Integer = 0      'position
    Dim spr As Integer = 0      'steps per round
    Dim offset As Integer = 0   'offset for zero adjust

    Private Sub DrawCompass()
        Dim canvas As New Bitmap(PictureBoxCompass.Width, PictureBoxCompass.Height)
        Dim cw As Integer = canvas.Width - 1
        Dim ch As Integer = canvas.Height - 1

        Dim g As Graphics = Graphics.FromImage(canvas)

        '図の外形円を描く
        g.DrawEllipse(Pens.Black, 0, 0, cw, ch)

        '図の目盛りを描く
        For d As Integer = 0 To 360 Step 15
            Dim l1 As Integer = 40  'primary leader line length
            Dim l2 As Integer = 10  'secondary leader line length
            Dim dxa As Integer = (cw / 2 - 1) * Math.Sin(CSng(d) / 180.0 * Math.PI) + 0.5
            Dim dxb As Integer = If(d Mod 90 = 0, cw / 2 - l1, cw / 2 - l2) * Math.Sin(CSng(d) / 180.0 * Math.PI) + 0.5

            Dim dya As Integer = (ch / 2 - 1) * Math.Cos(CSng(d) / 180.0 * Math.PI) + 0.5
            Dim dyb As Integer = If(d Mod 90 = 0, cw / 2 - l1, cw / 2 - l2) * Math.Cos(CSng(d) / 180.0 * Math.PI) + 0.5

            Dim sl As Point() = {
                New Point(cw / 2 + dxa, ch / 2 + dya) _
                , New Point(cw / 2 + dxb, ch / 2 + dyb)
            }
            g.DrawPolygon(Pens.Black, sl)
        Next

        '中心点を書く
        g.FillEllipse(Brushes.Red, CSng(cw / 2 - 4 + 0.5), CSng(ch / 2 - 4 + 0.5), 8, 8)


        If spr <> 0 Then

            'マーカーを描く
            Dim aw As Integer = 5       'Arrow Width
            Dim al As Integer = 40      'Arrow Length
            Dim ao As Integer = 2       'Arrow Offset
            Dim an As Integer = -4      'Arrow Notch
            Dim dx1 As Integer = (cw / 2 - ao) * Math.Sin(deg / 180.0 * Math.PI) + 0.5
            Dim dx2 As Integer = (cw / 2 - al) * Math.Sin((deg + aw) / 180.0 * Math.PI) + 0.5
            Dim dx3 As Integer = (cw / 2 - al - an) * Math.Sin(deg / 180.0 * Math.PI) + 0.5
            Dim dx4 As Integer = (cw / 2 - al) * Math.Sin((deg - aw) / 180.0 * Math.PI) + 0.5
            Dim dxe As Integer = (cw / 2 - ao) * Math.Sin((deg + 180.0) / 180.0 * Math.PI) + 0.5

            Dim dy1 As Integer = -(ch / 2 - ao) * Math.Cos(deg / 180.0 * Math.PI) + 0.5
            Dim dy2 As Integer = -(ch / 2 - al) * Math.Cos((deg + aw) / 180.0 * Math.PI) + 0.5
            Dim dy3 As Integer = -(ch / 2 - al - an) * Math.Cos(deg / 180.0 * Math.PI) + 0.5
            Dim dy4 As Integer = -(ch / 2 - al) * Math.Cos((deg - aw) / 180.0 * Math.PI) + 0.5
            Dim dye As Integer = -(ch / 2 - ao) * Math.Cos((deg + 180.0) / 180.0 * Math.PI) + 0.5

            Dim ps As Point() = {
                New Point(cw / 2 + dx1, ch / 2 + dy1) _
                , New Point(cw / 2 + dx2, ch / 2 + dy2) _
                , New Point(cw / 2 + dx3, ch / 2 + dy3) _
                , New Point(cw / 2 + dx4, ch / 2 + dy4)
            }
            g.FillPolygon(Brushes.Red, ps)

            '矢の軸を描く
            Dim cl As Point() = {
                New Point(cw / 2 + dx1, ch / 2 + dy1) _
                , New Point(cw / 2 + dxe, ch / 2 + dye)
            }
            g.DrawPolygon(Pens.Red, cl)

        End If

        g.Dispose()
        PictureBoxCompass.Image = canvas

    End Sub

まとめ

f:id:macrochelys99:20190916032223j:plain
折れ線グラフを表示するシリアルプロッターが Arduino IDE にありますが、自分が使いやすいようカスタムした表示ができたら用途も広がるし楽しそうなので試してみました。

ボタン押したらシリアル送信してモーターを指定に位置に、とかできたら使い道ありそうです。

「スコープに宣言がありません」と怒られたらプロトタイプ宣言してみよう

f:id:macrochelys99:20190912001645p:plain

Arduinoでスケッチが長くなってきたら

機能ごとにファイルを分割したりしますよね。

で、コンパイルすると宣言がないと怒られたわけです。

でも

タブを切り替えるとちゃんとある。
f:id:macrochelys99:20190912002012p:plain

実際のスケッチは関数名が長いので、打ち間違えていないか一文字ずつ指差し確認

でも一致しているように見える。
テキストエディタにコピペして並べてみてもやっぱり同じだ。

おっかしいなぁ.....。

プロトタイプ宣言

f:id:macrochelys99:20190912002424p:plain

見つからないって言うんだから、見つかるようにプロトタイプ宣言してみようか。
Arduinoコンパイル時に自動でやってくれるから本来は要らない。)

あっ.......

f:id:macrochelys99:20190912002701p:plain

別のタブの別の関数で、ネストのカッコ閉じを失敗していました。

カッコを直したら

f:id:macrochelys99:20190912002848p:plain

プロトタイプ宣言を削除しても無事コンパイルが通るようになりました。

まとめ

正しく宣言がされているにも関わらずコンパイラに「宣言がない」と怒られたら、その関数をプロトタイプ宣言してみよう。

すると、真の原因が見つかるかもしれない。

おもちゃの修理を頼まれた(アンパンマン掃除機編)

f:id:macrochelys99:20190820004445p:plain

「余計に壊れて復元不能になっても知らないからね!」を条件に、小物の修理を引き受けていたらだんだん 面倒 厄介なモノも持ち込まれるようになってきました。

f:id:macrochelys99:20190820005527j:plain
https://www.amazon.co.jp/dp/B00HFID516/

切れたホースをつなげ

f:id:macrochelys99:20190820010003j:plain
せめてもうちょっと真ん中らへんで切れてくれれば、ビニルテープぐるぐる巻きとかやりようがあるのですが。

f:id:macrochelys99:20190820010108j:plain
ホースの両端はグリップに合わせて成型されており、汎用品を切って使っているのではなく専用品のようです。

接続用のパーツをモデリング

f:id:macrochelys99:20190820010932p:plain
まずは蛇腹ホース。

f:id:macrochelys99:20190820011107p:plain
グリップの中の空間もざっくり採寸

f:id:macrochelys99:20190820011526p:plain
蛇腹ホースは円筒ボディーをかぶせる。

f:id:macrochelys99:20190820011716p:plain
2つのパーツをロフトで連結。

f:id:macrochelys99:20190820011906p:plain
先端は挿し込みやすいようにテーパをつけて、蛇腹側は結束バンドを巻くための突起をつける。

f:id:macrochelys99:20190820012255p:plain
蛇腹ボディーを引き算して断面をみるとこんな感じ。

f:id:macrochelys99:20190820012817p:plain
挿し込みが固そうなので割り込みを入れておく。

f:id:macrochelys99:20190820013019p:plain
2つに割って完成。

造形

f:id:macrochelys99:20190820013115j:plain
同じものを2個作ります。

組立て

f:id:macrochelys99:20190820013219j:plain
ホースを挟んで

f:id:macrochelys99:20190820013337j:plain
押し込む!

f:id:macrochelys99:20190820013445j:plain
爪も折れることなく入りました。すっぽ抜けないか心配でしたが、かなり固くはまっています。
あとは結束バンド巻いて完成です。

反対側が切れた

f:id:macrochelys99:20190820013827j:plain
直ったと思ったら、ホースの反対側が切れました。

f:id:macrochelys99:20190820013923j:plain
ビニールテープぐるぐるではなくクリアの収縮チューブを使いました。
しかし、かなり蛇腹ホースの劣化が進んでいるようです。またすぐ違うところが切れるでしょう

おまけ

「おもちゃの音が出なくなった」系の故障は、スピーカーの交換で今のとこ復活しています。(N=3)

f:id:macrochelys99:20190820015740j:plain
https://www.amazon.co.jp/dp/B01I9FBIOE/
スピーカーの抵抗を測定し、断線してそうなら交換。

f:id:macrochelys99:20190820015826j:plain
5年分ぐらい届いたよ!

3Dプリンタでの造形物を三脚に付けたい

f:id:macrochelys99:20190719025400j:plain

3Dプリンタで作ったケースをカメラ用三脚に付けたい

だけどネジ穴をモデリングしてもすぐ潰れてしまいそうです。
ということで思い付いた一案。

カメラネジアダプターをねじ込む

三脚を取り付ける位置に直径 9mm の孔をモデリングしておき、C面も2~3mmぐらい付けておきます。

f:id:macrochelys99:20190719023123p:plain

そこにカメラネジアダプターをねじ込む。


モデリング

NEMA17 ステッピングモーターを三脚に取り付けて

f:id:macrochelys99:20190719021854p:plain

その上で小さなテーブルをぐるんぐるんさせよう。

f:id:macrochelys99:20190719022219p:plain

造形

f:id:macrochelys99:20190719022415j:plain

カメラネジアダプターの取り付け

マイナスドライバーでねじ込んでいきます。

f:id:macrochelys99:20190719023540j:plain

なんとか入った。

f:id:macrochelys99:20190719023658j:plain

まっすぐねじ込むのが難しい

軸をまっすぐに保つのが難しく斜めに入ってしまいます。

めいっぱいねじ込んであれば気にならないけど、ちょっとネジをゆるめて浮かせるとわかります。

f:id:macrochelys99:20190719024851j:plain

幅 10mm の大きめのマイナスドライバーでも、カメラアダプターの溝にギリギリかかる程度でツルっと先端が滑り、PLAの硬さも相まって手こずりました。

本来はネジ穴の大きさを変えるためのパーツですので、タップタイトのように使うには向いていなかったようです。

これだけネジ山が高いとハンダゴテで熱溶着も無理がありそうです。きっと三脚に適合するインチタイプのインサートナットもあると思うのですが、見つけられませんでした。

macrochelys99.hatenablog.jp

まとめ

三脚に取り付けたところ、思ったより安定していました。

先端がこんな形状のドライバーがあったら、アダプターの軸を垂直に保ちつつしっかり回せそうです。

f:id:macrochelys99:20190719025221p:plain

3Dプリントした造形物にビットインサートの熱溶着を試す

f:id:macrochelys99:20190630021625j:plain

3Dプリンタで作ったパーツをネジで固定したい

今回は知人が親子でダンボールキッチンを作っていたので、ガスコンロをもうちょっとかっこよくできるかも?と、ツマミゴトクを贈呈しました。

こちらは完成時。テーブルの高さ 40cm、幅60cmぐらい。
f:id:macrochelys99:20190630031754j:plain

3Dプリントしたパーツの組立てでネジを使う場面は、大抵はネジボスを立ててそこにタップタイトのネジで固定でしょうか。今回は強度に不安があったのでビットインサートの熱溶着を試してみました。

モデリング

ツマミ

上から順に、ツマミ、台座、留め具です。台座を段ボールにボンドで貼って、ツマミを取り付けたら裏から留め具をネジで固定。ツマミはちゃんと90度回って止まる予定。

f:id:macrochelys99:20190630022855p:plain

ゴトク

黄色がゴトクで赤が留め具です。

f:id:macrochelys99:20190630023215p:plain

ボンドや両面テープでの接着だけだとすぐ剥がれてしまいそうな気がしたので、段ボールに穴をあけて裏から留め具でも固定します。

f:id:macrochelys99:20190630023317p:plain

ビットインサートの熱溶着

3Dプリントしたものをタップタイトネジで固定しても、すぐに割れて外れてしまいそうな気がします。そこで、ビットインサートを熱溶着してコネジで固定します。

f:id:macrochelys99:20190630025307j:plain

今回使ったビットインサートはこちら。


Φ4.5mm の下穴をあけておき(ビットインサートの径より少し小さい)
ビットインサートをあてがって

f:id:macrochelys99:20190630024052j:plain

300℃のハンダゴテでぐぐっと押し込む。熱せられたビットインサートがプラを溶かしながら埋まっていく。

f:id:macrochelys99:20190630024439j:plain

3Dプリントの素材は PLA なので、300℃では温度が高すぎたようです。

白光FX600 なら下は200℃まで下げられるので、めいっぱい下げると良いかもしれません。

うまく付いたように見えましたが

f:id:macrochelys99:20190630025008j:plain

裏から見るとはみ出ちゃってる!しかも溶けたPLAのくず中に入り込んでしまいネジが入りにくい

f:id:macrochelys99:20190630025047j:plain

裏から留め具を付けるとこんな感じです。

f:id:macrochelys99:20190630025211j:plain

ツマミもゴトクと同様にビットインサートを熱溶着してボンドと留め具で取り付けます。

f:id:macrochelys99:20190630025452j:plain

牛乳パックを積み上げて骨組みを作り、段ボールで壁をつくり、その上に壁紙のようなシートを貼っているそうです。流し台も内側にアルミテープを貼ってピカピカ。廃材で作った割にオシャレに仕上がっています。

まとめ

  • 3Dプリンタで作った物をネジで組み立てるのは、タップタイトネジでは強度や割れの心配があったが、インサートナットの使用で使い勝手は良くなる。

  • インサートナットの内側にハンダが付くとネジが入らなくなるので、コテ先は未使用品が良い。コテ購入時に付属していた円錐形のコテ先が未使用のまま残っていたので今回はそれを使用。

  • インサートナットを差し込む方向ネジとは逆方向からだと、インサートナットの中に溶けたプラのくずが入り込んでしまいネジが入りにくくなってしまった。インサートナットはネジと同じ方向から差し込むのが良さそう。

  • ツマミ側はネジと同じ方向からインサートナットを入れたのでネジの入りはスムーズで問題なかった。

  • プラの素材がPLAだったので、ハンダゴテの温度が300℃は高すぎた。すぼっと軽く入ってしまい、やや傾いてしまっている。

  • ツマミを回しきったときのクリック感が欲しくなる。

  • お子様にも気にいってもらえたようで何よりです。 f:id:macrochelys99:20190630031431j:plain