3Dマウス⑦ ファームの調整
2023.02.28


前回の3Dマウスの記事はこちら
https://randol-news.net/art/00582.html

また外装に手を入れてました(;´Д`)
すこしずつ良くなっていく実感があります。
これでプロトタイプは完成形。

ファームウェアですが、ボタンの処理を追加するだけで完成~~とはいかなくて
実際に動かしてみてオービットしているときにボタンを押したらどうなるかとか、
そういうのを検証していくと、ソースは短くとも結構奥深いんだなと感じました。

GOTO文なんてためらわず使ってます(笑)



ボタンA(左側)をシフトキー(複数選択するときに使う)の機能に
ボタンB(右側)をパン用の機能に当てました。
Fusion360用として微調整を行い、ほぼイメージ通りの動きが再現できました。

自分で言うのもなんだけど、かなり快適。
リミットスイッチのクリック感もいい感じ。
Orbionの出番はもうないと思う(笑)

問題点は左手でオービット操作しているときに、
右手で掴んでいるマウスカーソルを動かすと、
回転が誤動作する。
「動かすな」という話なんだけど、
ちょっとした拍子に動いてしまう事だってままある。
これはArduino側ではどうにもならないので、
Windows側に管理アプリを走らせないと止められないと思う。

管理アプリを使うということは
カーソル情報やボタンの情報をシリアルで通信で受け取るという事なので、
Arduino Pro(Leonardo)じゃなく安いArduino Nanoて良くね?
という元も子もない結果になりそうだ(;´Д`)

とりあえず現バージョンはここで完成ということで
Nano対応版の制作は次のバージョンと言うことにしよう。

本体が小ぶりなのもちょっと気になりだしてきた。
男の手だともう二回り大きくてもいいかもしれない。
作り直したいのはやまやまだけど、仕事がゴタゴタしてるし
作業場移設で今後しばらく3Dプリンターは使えないので
とりあえずこのプロトタイプをVer1.00としていったん情報を整理しておこう。

このデータ欲しい人が多ければ配布も考えます。
希望者がいればコメントどうぞ。



一応3Dマウスの管理アプリは時間がかかりつつも並行して進めてます。
プログラムの流れは以下の通り

1.起動直後から一定周期でCOMポートを走査。
Arduinoが使っているCOMポートを見つけ出し接続する。
接続が完了したらCOMポートの走査を終了し別のステージへ。

2.Fusion360がアクティブウインドウになった時だけアプリが制御するように
アクティブウインドウのプログラムが何なのかを一定周期で監視。
大体1秒刻みでいい気がする。

3.Fusion360がアクティブウインドウの時で、3Dマウスがオービットを始めたときに
マウスカーソルの制御を入れる。
3Dマウスがオービットを終えた時にはマウスカーソルはフリーになる。

たったこれだけのプログラムだけど、
Fusion360が簡単にハンドルを取得させてくれなかったので結構てこずった(;´Д`)
昔よく使ったシリアル通信を行うコンポーネントも最近のDelphiには対応してなくて
インストールするにはかなり手間がかかってしまった・・

あと、管理アプリ側でオービットやパンを制御したとき、
パソコンの処理速度によってだいぶ差が出るんじゃないか?という懸念がでてきた。
そういったことも考慮して、速度調整ができるようにもしないと・・

私の使う言語はマイナーなDelphiなので、
シリアル通信のコンポーネントをインストールするのに知識も必要だし
オープンソースはちょっときびしいか(;´Д`)
EXEファイルをArduinoのソースと一緒に同梱する形になるなぁ・・
3Dマウス⑥ 組み立て
2023.02.13
前回の3Dマウスの記事はこちら
https://randol-news.net/art/00581.html


前回作ったパーツでは組付けがきつ過ぎて、
かなりの量をやすりで削らないと填まらないという事件があったので、
クリアランスに余裕を持たせて再印刷しました(;´Д`)
組み立て途中の画像では光造形の物とFDMの物が混在してるけど、
細かいことは気にしない。



まずはロータリーエンコーダーのホイールを組み立てます。



軸受けはかなり小さいパーツなので、
3Dプリンターの印刷ではきれいな六角穴は厳しいです。
そのため強引に差し込むとTPUのグリップが効きすぎるので、
シャフトに300度くらいの熱を与えて穴を成型しなおします。



きれいに成型できました。



シャフトを挿してもキツ過ぎず、適度なテンションになりました。



他のパーツを合体させます。



外側から6mmのイモネジ2本で締めます。



こんな感じでしっかり固定。もうはずれません



ベアリングの軸受けをTPUで作っていますが、
あまりにも小さいパーツなので穴が正確に造形できていません。



強引にシャフトを突っ込んで、先ほどのように熱を加え成型しなおします。



こんな感じまで挿しときます。



軸受けもキレイに成型できました(*'▽')



ホイールにシャフトピンを挿しこむ。



上蓋にあてがって、上からシャフトピンを押す。
このとき力を変な風に入れると印刷したパーツが折れてしまうので、
かなり気をつかう(;´Д`)



上にはロータリーエンコーダーのカバーを付けるので、
シャフトピンは飛び出ないようにしっかり入れる。
設計上では2mm程度は奥まってさしこめるはずだと思って押し込んだら、
思ってた通り入った。 Good



急遽用意したボタンを固定するフレーム。
2個あるフレームは形がそっくりに見えるけど、
上蓋のアーチに合わせているので実は微妙に違う。
間違って取り付けないように突起を用意して
分かるようにしてみた。



こんな向きでスイッチを固定する。
ネジはM2の10mm。
結構穴がきついのでナットが無くても動かなそう。
動いてもネジの頭を内側に持ってきているので抜けないように設計している。
ナットを付けない場合は8mmで十分。
コストを抑えるなら8mmだね。



Arduinoをベースパーツにはめる。
Arduinoサイズの個体差を考えてスペースに余裕をもって設計したけど、
少しやり過ぎたかと後悔。0.5mmほど小さくしてもいいかもしれない。



配線はこんな感じ。
ボタンの部分の配線を追加。



USBコネクタを上から押さえつけます。
M2の4mmを使いますが、本音は3mmを使いたいけど売ってない(;´Д`)
4mmネジ、スプリングワッシャー、ワッシャーで調整。
下穴は1.6mmのピンバイスで調整してみたけど、
無くてもしっかり噛みそう。



Arduinoの上にジョイスティックの台座を置く。
これはArduinoを上から押さえつけて動かなくする役割も持たせている。



スペーサーをジョイスティックの背面にあてがう。
このとき半田がスペーサーの厚みより高い場合はカット。
中華おばちゃん手工業なので、絶対に均一にはできてない(;´Д`)



スペーサーが外れないように、台座に載せてネジ止め。
ネジはM3の6mm



なかなかいいじゃない(*'▽')



高さや、角度を調整したい時は、
↑のようにワッシャーを挟んで調整できるなと考えていた。
先に結論を書いておくと、私はこの位置にワッシャーをいれることで
ジョイスティックの可動域がちょうど良くなった。



ケースにつけたホイールにロータリーエンコーダーを取り付ける。
結構デリケートな造形だから隙間を多めに作って設計してたけど
光造形(レジン)で作ったのはうまく入らない。
リューターで削って対処。
次のバージョンでは0.1mm程度スキマを増やそう(;´Д`)
ちなみにFDMで作った方は正確にできててスコっと入った。



スイッチを付ける。向きがあるので切り欠きに合わせて装着。



M2の4mmを使って固定。ここもM2の3mmがベストだったんだけど、
手に入らないのでワッシャーとスプリングワッシャーで調整。
レジンだとネジ山が崩れる印象が強いが、
無理にトルクをかけなければちゃんと効く。



ボタンに配線をハンダ付け。



ロータリーエンコーダーが外れないようにカバーをかける。
無くても外れないかもしれないけど、一応設計して用意したので使おう。



溝にきっちり填まると余程のことがない限り外れないだろう。



ケースのネジ受けにナットを入れる。



そのまま入れただけだと逆さまにしたら落ちてくるので
ナットに瞬間接着剤をちょこっとつけて外れないようにした。



ボタンの配線(デュポンコネクタ)を接続。



ケースとベースをドッキングさせてM3ネジ2本で締め上げ。
ところがネジの頭が収まらない。
つまり穴が小さいことにここで気が付く(;´Д`)
5.5mm必要なんだけど、5mmでデザインされていたようだ・・
ドリルで揉んで穴拡張。
次のバージョンは6mmにしとこう(;´Д`)



プロトタイプ完成。
光造形で作ったケースにゆがみが出ていて、
FDMで作ったベースの円ときれいに一致しない。
おそらくは2次硬化の時に歪んだものと思われる。
次のバージョンでは変形を予防するための加工と、
ベースをドッキングさせたまま二次硬化できるように工夫をしようとおもう。

ま、なかなかいいじゃない。そこそこ思い通りに出来上がっていると思う。
リミットスイッチはいろいろ種類あるけど、板バネの先端が特殊なものにしてみた。
これが意外と押しやすい。



動かしている様子を撮影してみた。
ちょっと小さく作りすぎたかな?という感がいなめない。
ジョイスティックをもっと横に寝せたほうが使いやすかったかも・・
といろいろ思わせるところが出てくる。
ま外装はしばらく使って課題がまとまったら、造形しなおすか・・・(;´Д`)

さて、あとはファームウェアだなぁ・・
今の段階ではボタンの機能が無い。
それを追加してみて少しずつ修正を加え熟成させよう。

次の3Dマウスの記事はこちら
https://randol-news.net/art/00585.html
CHAT GPTに技術的なことについて聞いてみた。
2023.02.11
最近評判のCHAT GPTですが、技術的な話を問いかけたらどうなるのか検証してみました。
回答が正確であるかを判断するために分かっていることをあえて質問しています。

正直なところすごい。作ってくれたプログラムはそのまま修正しなくても動く(;´Д`)
今回はわざと意地悪にDelphiとArduinoの連携で質問してみましたが、
両方の文法やライブラリをしっかり理解しているようで、間違いの無いコードが返されました。

某掲示板に質問するくらいならCHAT GPTに投げかけた方が
絶対適切な回答が得られます(;´Д`)

では質問と回答は以下の通り。

Q FDM式の3Dプリンターでノズル詰まりが良く起きる原因を教えて。
A 3Dプリンターのノズル詰まりは、いくつかの原因が考えられます。以下は一般的な原因です:

 フィラメントの硬化:
  長時間使用しない場合、フィラメントは硬化し、ノズルから通りにくくなります。

 ノズルの汚れ:
  フィラメントの硬化物や残留物がノズル内に溜まることがあります。
  これはノズル詰まりの原因となります。

 ノズルの温度が低い:
  ノズルの温度が低い場合、フィラメントが正常に溶けないため、ノズルが詰まります。

 フィラメントが不適切な直径を持っている:
  フィラメントの直径が大きすぎると、ノズルから通りにくくなります。
  また、直径が小さすぎると、フィラメントが正常に溶けない可能性があります。

 これらの問題を解決するためには、定期的にノズルをクリーニングし、
 フィラメントを正常な状態に保つことが重要です。また、ノズルの温度を適切に調整し、
 フィラメントの直径を適切に選択することも大切です。

Q 3DプリンターでABS素材を使って印刷する場合、反りをなくす方法は?
A ABS素材で印刷すると、反りが発生することがあります。
 この問題を解決するためには、以下の方法があります:

ベッド温度:
  ABSは高温で印刷する必要がありますが、
  ベッド温度が高すぎると反りが発生します。
  ベッド温度を適切に調整することが重要です。

 ベッドアドハーズメント:
  ABSはベッドとの接触面積を最小限にすることが重要です。
  ベッドアドハーズメントを使用することで、
  ABSとベッドとの接触面積を最小限にすることができます。

 印刷速度:
  ABSは印刷速度が遅いと反りが発生します。印刷速度を適切に調整することが重要です。

 上層の設計:
  ABSを印刷する際には、上層の設計が反りに影響することがあります。
  上層の設計を見直し、反りを最小限にするよう調整することが重要です。

 これらの方法を試して、ABS素材で印刷する際の反り問題を解決することができます。

Q 3Dプリンターでデルタ型と直行型、どちらが精度がいい?
A 3Dプリンターには、デルタ型と直行型があります。
 どちらが精度がよいかは、使用目的や製造物によって異なります。

 デルタ型3Dプリンターは、三角形のアーム構造を採用しており、
 印刷中に構造のバランスを維持することができます。
 このため、デルタ型3Dプリンターはより高い精度を実現することができます。
 また、デルタ型3Dプリンターは小さな部品の作成や精密な構造の印刷に適しています。

 一方、直行型3Dプリンターは、直線的なアーム構造を採用しており、
 シンプルで安価なため、広い範囲に普及しています。
 直行型3Dプリンターは印刷速度が速いため、大量生産に適していますが、
 デルタ型3Dプリンターに比べて精度は劣ります。

 結論として、精度においてはデルタ型3Dプリンターが優れていますが、
 使用目的や製造物によって直行型3Dプリンターが適している場合もあります。
 使用目的や製造物に合わせて、適切な3Dプリンターを選択することが重要です。

Q Arduinoのコーディングでledを10個使い、1秒ごとに順番に光らせる方法を教えてください
A 以下のコードは、Arduinoで10個のLEDを使用し、1秒ごとに順番に光らせる方法を示します。



 このコードでは、LEDのピン番号を配列で定義しています。
 また、setup関数では、全てのLEDのピンを出力に設定します。
 loop関数では、for文を使用して順番にLEDを点灯・消灯するように設定しています。
 各LEDの点灯・消灯には、digitalWrite関数を使用しています。
 また、delay関数を使用して1秒待つように設定しています。

Q Windows上で動かすDelphiで作ったプログラムとArduinoとでデータのやり取りをするには、
 ArduinoとDelphiにそれぞれどのようなコードを書けばいい?


A


Q Windows上のDelphiプログラムからArduinoと繋がっているサーボモーターを動かすようなプログラムはできますか? 動かす角度を自由に指示したいです。

A

- CafeNote -