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
回答が正確であるかを判断するために分かっていることをあえて質問しています。
正直なところすごい。作ってくれたプログラムはそのまま修正しなくても動く(;´Д`)
今回はわざと意地悪に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
3Dマウス⑤ 外装の設計・造形
2023.01.29
前回の3Dマウスの記事はこちら
https://randol-news.net/art/00577.html
ファームウェアがだいぶ進展したので
外装をテスト用ではなく実用に向けて設計してみます。
まずUSBケーブルはL字型を採用。これで煩わしいケーブル問題は大幅に軽減。
上蓋との連結はM3ネジ2本で行うことにした。
本音を言えば3本でやりたかったけど、
いろいろと干渉することが分かったから仕方なく(;´Д`)
まぁ、問題ないっしょ。
L字コネクタに合わせて干渉しないように上蓋にカットをいれます。
カットしたところのフタも用意。上蓋と一体化させて造形させます。
ジョイスティックのデュポンコネクタが邪魔になっていた件。
下に折り曲げれば上蓋が干渉せず入ることが分かったので、
1本ずつラジオペンチで曲げて対処。
ボタンはつけなくていいかな~~なんて思っていた時がありました。
でも、ムリ(;´Д`)
ジョイスティックのテストでぐりぐり動かしているとボタンの必要性が沸々と湧いてきます。
まず、ジョイスティックを押しながら方向を操作するのは厳しい。
つまりパンを操作するときは別のボタンを用意するべきかなと思い至りました。
あと、ポイントを複数選択するときにシフトキーを押しながら行いますが、
いちいちキーボードに手を移動してたら面倒で仕方ない。
そのボタンも無いと不便かなと。
つまり最低でも2個は追加しないと実用に乏しいと判断。
ではどんなボタンをどんなふうにつけるのかと考えるに
ORBIONで採用されてるボタンも考えたけど、ちょっと大きすぎてスペースが無い。
あと、やっぱりクリック感がほしいと思いました。
そこでリミットスイッチを採用することに。安いし入手性もいい。
場所は、ロータリーエンコーダーとジョイスティックの間に並べて装備。
リミットスイッチのレバーは上蓋から露出させて直に押すようにします。
使いづらかったらレバーに何か装着しますかね。
ロータリーエンコーダーは上蓋で支えることに。
リミットスイッチも上蓋で。
造形が複雑になるのでFDMだとちょっと苦しいけど、
印刷さえできてしまえば、説明書なしでもすぐに組み立てられるくらい
シンプルなデザインじゃないかなと思う。
印刷は本気モード(;´Д`)
0.2mmノズル装着でベッドの高さもしっかり調整。
強度と長期実用を踏まえABSで印刷。
反り防止のための対策はきっちり。
本来ならば、メッシュベッドを使うべきところだけど、
メッシュベッドはラフトが前提になってしまいます。
ラフトって反りは軽減するけど底面が乱れまくるのよね。
今回は精度重視の印刷なので、ガラスベッドを使いました。
印刷位置が左奥寄りになってますが、
Cetusのようにフレーム片持ちの3Dプリンターは
フレームから遠く離れたところの振動が大きくなりがちです。
印刷物が荒れるので、それを回避するため
なるべく左奥にまとめて印刷を行います。
これも少しでも精度を高めるための工夫です。
完璧です。
7時間のロングランだけども反りはゼロ。
糸引きもなし、底面上面の塗り残しなし。
0.2mmノズルはいいね。仕上がりが美しい。
ただし、詰まり安く、印刷に時間が掛かり、
設定も煮詰めるのにめちゃくちゃ時間が掛かるけど(;´Д`)
バシっと設定が決まっているうちに細かいのも全部印刷してしまいます。
いいね、射出成型みたい(*'▽')
一番の問題は上蓋。
FDMの限界に挑戦といわんばかりの形。サポートは必須になってしまいます。
何回か試したけど、逆さまで印刷したほうがサポートの処理がしやすく
倒壊の心配がなかった。
内側にはロータリーエンコーダーの部分がちょっと制度が必要なので、
サポートがごちゃごちゃつくと整えるのは困難だなと・・。
どうせ磨くのなら外周の方が楽でいいので、
今回は逆さまに印刷したほうがいいと考えた。
でもFDMでこの印刷はやっぱり厳しい。
積層痕が強烈に見えてくる。
球状は0.1mm積層をやめて0.05mm積層ができるならその方が良いと思う。
確実に印刷できるようにするには、パーツを分割して接着剤で連結する形の方がいいかもしれない。
つまりFDM専用のデータを考えるべきと思った。
サポート面が荒れていたので軽く研磨。
ABSなので簡単に削れる。PLAとは違うのだよ、PLAとは(;´Д`)
研磨すると白く変色してしまう。すると積層がより目立って印刷の荒れが目立つ。
でも予定通り。
光硬化パテで積層の隙間を埋めていく。
ついでに積層割れが原因で起きた印刷ミスをプラモ用接着剤やパテで修正。
1日太陽にあてておけばカチカチです(*'▽')
待っている間に光造形で印刷。こちらもサポート跡がすごい(;´Д`)
見た感じはミスはなさそうだ。
裏面もきれいに印刷できているように見えるが、
角が丸くなったり膨らんだりする現象が起きている。
光造形といえども完璧ではないね。
FDM式、SLA式両方で印刷したものを研磨した様子。
FDM式は400番の耐水ペーパー、
SLAは削れやすいので600番の耐水ペーパーで磨きました。
硬さはレジンの方がある感じ、ABSは柔軟さを感じる。
だけど、1mm厚のパーツなので、
力をいれるとABSは積層割れが起きそうな感じ、
レジンの方は力入れて磨くと割れそうな感じ。
もう少し厚みを付けるべきだったかな(;´Д`)
後々積層割れが起きたらイヤなので内側から対策をば。
3Dプリンター用の電熱ヘラで表面をなぞります。
一度溶けて再溶着するので積層割れの恐れが軽減します。
これを施した後は、驚くくらいフニャフニャ感が消えました。
サーフェイサーを吹いてみた。
左が光造形(レジン)、右がFDM(ABS)。
双方、もう少しやすり掛けが必要なことが分かる。
ABSの方は穴の縁をもう少し修正できるかも。
ある程度整ったので塗装。
左が光造形(レジン)、右がFDM(ABS)。
ABSは磨きが足りなかったかな・・少しデコボコが残ってる。
200番で整えてから400番すればよかったかな。
球面だから加減がよくわからん(;´Д`)
まぁ、実用十分だけど。
パーツがそろった(;´Д`) ↑はABS用に用意したパーツ類。
今回ABSとレジンの2種類で印刷したけど、精度的に割と正確なのはABSの方。
上蓋は曲面が多かったので荒まくったけど、
ほかの部品は±0.1mm程度誤差を容認できるなら何も問題はない仕上がり。
0.2mmノズルを使っている効果が絶大、
それに比べレジンはミクロの世界ではかなり美しいけど、
1mmとかいう大きいレベルでゆがみが出ることがある。
ひどいときには3mmも長さが合わないことも。
底板のパーツは綺麗な円になりませんでした。光硬化パテで修正しました。
塗装したから今じゃわからないけどね。
一長一短だなぁ(;´Д`)
次の3Dマウスの記事はこちら
https://randol-news.net/art/00582.html
https://randol-news.net/art/00577.html
ファームウェアがだいぶ進展したので
外装をテスト用ではなく実用に向けて設計してみます。
まずUSBケーブルはL字型を採用。これで煩わしいケーブル問題は大幅に軽減。
上蓋との連結はM3ネジ2本で行うことにした。
本音を言えば3本でやりたかったけど、
いろいろと干渉することが分かったから仕方なく(;´Д`)
まぁ、問題ないっしょ。
L字コネクタに合わせて干渉しないように上蓋にカットをいれます。
カットしたところのフタも用意。上蓋と一体化させて造形させます。
ジョイスティックのデュポンコネクタが邪魔になっていた件。
下に折り曲げれば上蓋が干渉せず入ることが分かったので、
1本ずつラジオペンチで曲げて対処。
ボタンはつけなくていいかな~~なんて思っていた時がありました。
でも、ムリ(;´Д`)
ジョイスティックのテストでぐりぐり動かしているとボタンの必要性が沸々と湧いてきます。
まず、ジョイスティックを押しながら方向を操作するのは厳しい。
つまりパンを操作するときは別のボタンを用意するべきかなと思い至りました。
あと、ポイントを複数選択するときにシフトキーを押しながら行いますが、
いちいちキーボードに手を移動してたら面倒で仕方ない。
そのボタンも無いと不便かなと。
つまり最低でも2個は追加しないと実用に乏しいと判断。
ではどんなボタンをどんなふうにつけるのかと考えるに
ORBIONで採用されてるボタンも考えたけど、ちょっと大きすぎてスペースが無い。
あと、やっぱりクリック感がほしいと思いました。
そこでリミットスイッチを採用することに。安いし入手性もいい。
場所は、ロータリーエンコーダーとジョイスティックの間に並べて装備。
リミットスイッチのレバーは上蓋から露出させて直に押すようにします。
使いづらかったらレバーに何か装着しますかね。
ロータリーエンコーダーは上蓋で支えることに。
リミットスイッチも上蓋で。
造形が複雑になるのでFDMだとちょっと苦しいけど、
印刷さえできてしまえば、説明書なしでもすぐに組み立てられるくらい
シンプルなデザインじゃないかなと思う。
印刷は本気モード(;´Д`)
0.2mmノズル装着でベッドの高さもしっかり調整。
強度と長期実用を踏まえABSで印刷。
反り防止のための対策はきっちり。
本来ならば、メッシュベッドを使うべきところだけど、
メッシュベッドはラフトが前提になってしまいます。
ラフトって反りは軽減するけど底面が乱れまくるのよね。
今回は精度重視の印刷なので、ガラスベッドを使いました。
印刷位置が左奥寄りになってますが、
Cetusのようにフレーム片持ちの3Dプリンターは
フレームから遠く離れたところの振動が大きくなりがちです。
印刷物が荒れるので、それを回避するため
なるべく左奥にまとめて印刷を行います。
これも少しでも精度を高めるための工夫です。
完璧です。
7時間のロングランだけども反りはゼロ。
糸引きもなし、底面上面の塗り残しなし。
0.2mmノズルはいいね。仕上がりが美しい。
ただし、詰まり安く、印刷に時間が掛かり、
設定も煮詰めるのにめちゃくちゃ時間が掛かるけど(;´Д`)
バシっと設定が決まっているうちに細かいのも全部印刷してしまいます。
いいね、射出成型みたい(*'▽')
一番の問題は上蓋。
FDMの限界に挑戦といわんばかりの形。サポートは必須になってしまいます。
何回か試したけど、逆さまで印刷したほうがサポートの処理がしやすく
倒壊の心配がなかった。
内側にはロータリーエンコーダーの部分がちょっと制度が必要なので、
サポートがごちゃごちゃつくと整えるのは困難だなと・・。
どうせ磨くのなら外周の方が楽でいいので、
今回は逆さまに印刷したほうがいいと考えた。
でもFDMでこの印刷はやっぱり厳しい。
積層痕が強烈に見えてくる。
球状は0.1mm積層をやめて0.05mm積層ができるならその方が良いと思う。
確実に印刷できるようにするには、パーツを分割して接着剤で連結する形の方がいいかもしれない。
つまりFDM専用のデータを考えるべきと思った。
サポート面が荒れていたので軽く研磨。
ABSなので簡単に削れる。PLAとは違うのだよ、PLAとは(;´Д`)
研磨すると白く変色してしまう。すると積層がより目立って印刷の荒れが目立つ。
でも予定通り。
光硬化パテで積層の隙間を埋めていく。
ついでに積層割れが原因で起きた印刷ミスをプラモ用接着剤やパテで修正。
1日太陽にあてておけばカチカチです(*'▽')
待っている間に光造形で印刷。こちらもサポート跡がすごい(;´Д`)
見た感じはミスはなさそうだ。
裏面もきれいに印刷できているように見えるが、
角が丸くなったり膨らんだりする現象が起きている。
光造形といえども完璧ではないね。
FDM式、SLA式両方で印刷したものを研磨した様子。
FDM式は400番の耐水ペーパー、
SLAは削れやすいので600番の耐水ペーパーで磨きました。
硬さはレジンの方がある感じ、ABSは柔軟さを感じる。
だけど、1mm厚のパーツなので、
力をいれるとABSは積層割れが起きそうな感じ、
レジンの方は力入れて磨くと割れそうな感じ。
もう少し厚みを付けるべきだったかな(;´Д`)
後々積層割れが起きたらイヤなので内側から対策をば。
3Dプリンター用の電熱ヘラで表面をなぞります。
一度溶けて再溶着するので積層割れの恐れが軽減します。
これを施した後は、驚くくらいフニャフニャ感が消えました。
サーフェイサーを吹いてみた。
左が光造形(レジン)、右がFDM(ABS)。
双方、もう少しやすり掛けが必要なことが分かる。
ABSの方は穴の縁をもう少し修正できるかも。
ある程度整ったので塗装。
左が光造形(レジン)、右がFDM(ABS)。
ABSは磨きが足りなかったかな・・少しデコボコが残ってる。
200番で整えてから400番すればよかったかな。
球面だから加減がよくわからん(;´Д`)
まぁ、実用十分だけど。
パーツがそろった(;´Д`) ↑はABS用に用意したパーツ類。
今回ABSとレジンの2種類で印刷したけど、精度的に割と正確なのはABSの方。
上蓋は曲面が多かったので荒まくったけど、
ほかの部品は±0.1mm程度誤差を容認できるなら何も問題はない仕上がり。
0.2mmノズルを使っている効果が絶大、
それに比べレジンはミクロの世界ではかなり美しいけど、
1mmとかいう大きいレベルでゆがみが出ることがある。
ひどいときには3mmも長さが合わないことも。
底板のパーツは綺麗な円になりませんでした。光硬化パテで修正しました。
塗装したから今じゃわからないけどね。
一長一短だなぁ(;´Д`)
次の3Dマウスの記事はこちら
https://randol-news.net/art/00582.html
3Dマウス④ ジョイスティックの制御
2023.01.20
前回の3Dマウスの記事はこちら
https://randol-news.net/art/00576.html
前回は配線のミスが無いこと、ソースの書き換えが正常に行えたこと、
キーボードとマウスの制御が問題なくできることを確認しました。
今回はある程度3Dマウスに近い動作ができるまで
実験を進めていきたいと思います。
if (Joy_Switch_POS == LOW) {
Keyboard.press(KEY_LEFT_SHIFT);
Mouse.press(MOUSE_MIDDLE);
delay(2);
Mouse.move(1,1,0);
Keyboard.releaseAll();
Mouse.release(MOUSE_MIDDLE);
delay(2);
Mouse.move(-1,-1 ,0);
}else{
Keyboard.releaseAll();
Mouse.release(MOUSE_MIDDLE);
}
delay(10);
この処理が怪しい(;´Д`)
マウスカーソルの移動が10pxならうまく処理されるが、
1pxにすると、まったく動かなくなる。
なぜだ(;´Д`)
マウスカーソルをもとの位置に戻さなければ1pxでも正常に動く。
なぜだ(;´Д`)
解せぬ・・
厳密には6pxでも動くが、マウスホイールが動いたと錯覚したのか、
拡大縮小現象もおきる(笑)
安定して動くのが10px
意味不明。
拡大縮小が突然おきる原因は時間がかかったけど判明(;´Д`)
犯人はマウスのホイールボタンのダブルクリックに
「モデルを画面に合わせる」が組み込まれているため、
これが反応している模様。こんなん使ったことない。初めて知ったわ(;´Д`)
隠れたショートカットがまだまだあるんだなーと。
6px未満はドライバーによってダブルクリック認定されるかされないか
際どいラインなんだと思う。
これはPCの性能とマウスドライバーの良しあしでだいぶバラツキが出そうだ。
やばい、詰んだか?(;´Д`)
10pxを最小として組んでいけば?となるが
でもこれだと最小なのに目で追えないほど回転速度が速くて実用的じゃない。
じゃdelayを変化させて速度をコントロールするか?
そうなるとなめらかさを失うしな・・・ 困った。
しかもX、Yの両方向を同時に動かすのにdelayだけで管理するのは無理がある。
ORBIONがなぜマウスカーソルの動きに補正を入れないのか疑問だったが、
ようやく理解した(;´Д`)
3日間悩みに悩んだが、1pxレベルのオービットは必要。これは避けられないと思った。
7pxや10px刻みだと、複雑なものを作っているときに、
狙った角度を正面にできないことが多いからだ。
そこでどのように解決するかというと、1px~7pxまでの動きはカーソルが動くのを許容した。
8~10pxの場合は移動量が多すぎてすぐ画面端に激突したり、
FUSION360のウインドウからはみ出たりするので
元の座標にとどまるように位置修正を施す。
これでお茶を濁す。
ジョイスティックと移動量の関係は計算式ではなく、
表管理することにした。
思いついた当初は、配列で管理するつもりだったけど、
微調整するとき見づらく面倒だったので、
とりあえずIF文の羅列で実験してみたが、処理落ちもしないし、
可読性も高いしこのままでいいかもしれない(;´Д`)
マウスの中央ボタンがダブルクリックになってしまう問題。
これを解決するために、「カーソルは移動させるがボタンは押さない」
という処理を中間に挟んで回避する策を採用。
マウスはクリックとクリックの間に大きいカーソル移動があれば
いくら連射速度が速くともダブルクリックにならないという性質を利用してます。
動作を動画にとって見ました。
なめらかさと速度のバランスを取るのに苦労したけど
これからループ内に他の処理が加わっていくので動きは若干速めに調整。
まぁいいところに落ち着いたんではないかと思う。
ジョイスティックの傾斜が緩いときはカーソルも動き、
急なときはカーソルは止める。割と違和感ない。
回転を遅くしたい時というのはは微調整の為がほとんどなので、
よほど狭いモニターを使っていない限り端に激突することは珍しい。
問題点があるとすれば高速回転をさせたとき、
マウスカーソルがチカチカするくらいか。
高速で行ったり来たりしてるからね、仕方ないね。
ま、これは妥協(;´Д`)
ロータリーエンコーダーは特に工夫もなく、
前回コーディングしたものを入れ込むだけで動いた。
拡大縮小とオービットが実装されたことで、
だいぶ3Dマウスっぽくなってきた。
ファームウェアで残す部分は
パン操作と、ボタンを追加した時の処理、
あとFusion360に合わせて作っているけど、
2,3種は別ソフトでも動くようにしておきたいな。
とは言っても液晶を付けてないので、ソースファイル内で選択させる形だけど。
次は外装のデザインを進めるかな。
次の3Dマウスの記事はこちら
https://randol-news.net/art/00581.html
https://randol-news.net/art/00576.html
前回は配線のミスが無いこと、ソースの書き換えが正常に行えたこと、
キーボードとマウスの制御が問題なくできることを確認しました。
今回はある程度3Dマウスに近い動作ができるまで
実験を進めていきたいと思います。
if (Joy_Switch_POS == LOW) {
Keyboard.press(KEY_LEFT_SHIFT);
Mouse.press(MOUSE_MIDDLE);
delay(2);
Mouse.move(1,1,0);
Keyboard.releaseAll();
Mouse.release(MOUSE_MIDDLE);
delay(2);
Mouse.move(-1,-1 ,0);
}else{
Keyboard.releaseAll();
Mouse.release(MOUSE_MIDDLE);
}
delay(10);
この処理が怪しい(;´Д`)
マウスカーソルの移動が10pxならうまく処理されるが、
1pxにすると、まったく動かなくなる。
なぜだ(;´Д`)
マウスカーソルをもとの位置に戻さなければ1pxでも正常に動く。
なぜだ(;´Д`)
解せぬ・・
厳密には6pxでも動くが、マウスホイールが動いたと錯覚したのか、
拡大縮小現象もおきる(笑)
安定して動くのが10px
意味不明。
拡大縮小が突然おきる原因は時間がかかったけど判明(;´Д`)
犯人はマウスのホイールボタンのダブルクリックに
「モデルを画面に合わせる」が組み込まれているため、
これが反応している模様。こんなん使ったことない。初めて知ったわ(;´Д`)
隠れたショートカットがまだまだあるんだなーと。
6px未満はドライバーによってダブルクリック認定されるかされないか
際どいラインなんだと思う。
これはPCの性能とマウスドライバーの良しあしでだいぶバラツキが出そうだ。
やばい、詰んだか?(;´Д`)
10pxを最小として組んでいけば?となるが
でもこれだと最小なのに目で追えないほど回転速度が速くて実用的じゃない。
じゃdelayを変化させて速度をコントロールするか?
そうなるとなめらかさを失うしな・・・ 困った。
しかもX、Yの両方向を同時に動かすのにdelayだけで管理するのは無理がある。
ORBIONがなぜマウスカーソルの動きに補正を入れないのか疑問だったが、
ようやく理解した(;´Д`)
3日間悩みに悩んだが、1pxレベルのオービットは必要。これは避けられないと思った。
7pxや10px刻みだと、複雑なものを作っているときに、
狙った角度を正面にできないことが多いからだ。
そこでどのように解決するかというと、1px~7pxまでの動きはカーソルが動くのを許容した。
8~10pxの場合は移動量が多すぎてすぐ画面端に激突したり、
FUSION360のウインドウからはみ出たりするので
元の座標にとどまるように位置修正を施す。
これでお茶を濁す。
ジョイスティックと移動量の関係は計算式ではなく、
表管理することにした。
思いついた当初は、配列で管理するつもりだったけど、
微調整するとき見づらく面倒だったので、
とりあえずIF文の羅列で実験してみたが、処理落ちもしないし、
可読性も高いしこのままでいいかもしれない(;´Д`)
マウスの中央ボタンがダブルクリックになってしまう問題。
これを解決するために、「カーソルは移動させるがボタンは押さない」
という処理を中間に挟んで回避する策を採用。
マウスはクリックとクリックの間に大きいカーソル移動があれば
いくら連射速度が速くともダブルクリックにならないという性質を利用してます。
動作を動画にとって見ました。
なめらかさと速度のバランスを取るのに苦労したけど
これからループ内に他の処理が加わっていくので動きは若干速めに調整。
まぁいいところに落ち着いたんではないかと思う。
ジョイスティックの傾斜が緩いときはカーソルも動き、
急なときはカーソルは止める。割と違和感ない。
回転を遅くしたい時というのはは微調整の為がほとんどなので、
よほど狭いモニターを使っていない限り端に激突することは珍しい。
問題点があるとすれば高速回転をさせたとき、
マウスカーソルがチカチカするくらいか。
高速で行ったり来たりしてるからね、仕方ないね。
ま、これは妥協(;´Д`)
ロータリーエンコーダーは特に工夫もなく、
前回コーディングしたものを入れ込むだけで動いた。
拡大縮小とオービットが実装されたことで、
だいぶ3Dマウスっぽくなってきた。
ファームウェアで残す部分は
パン操作と、ボタンを追加した時の処理、
あとFusion360に合わせて作っているけど、
2,3種は別ソフトでも動くようにしておきたいな。
とは言っても液晶を付けてないので、ソースファイル内で選択させる形だけど。
次は外装のデザインを進めるかな。
次の3Dマウスの記事はこちら
https://randol-news.net/art/00581.html
3Dマウス③ Arduino Pro USB-Cが届いた!
2023.01.04
前回の3Dマウスの記事はこちら
https://randol-news.net/art/00572.html
小いさっ!(笑)
Type-Cのバージョンはいくつかあるみたいですが、
紫基盤の一番小さいタイプを選んでみました。
Arduino Proはピンが少ないので
割り当てを上手にしないといけませんね。
Arduino Proで割り込みに使えるのは
D0,D1,D2,D3,D7のみです。
画像でいうところの水色の数字がデジタルピンとなります。
液晶系にI2C通信がよく使われているのでね、今のところ付ける予定はないけど
D2/D3(SDA、SCL)ピンは確保しておきたい。
なのでD0,D1,D7が空きとなります。
ピンの並びを見ると、D0(RX)、D1(TX)、GNDがきれいに並んでいるので
この3つをロータリーエンコーダーに使いましょうか。
USBでPCと通信している最中に、
このRX、TXのピンを使っていいのかはこれから調べてみますが、
ダメだったらI2Cはあきらめる(;´Д`)
Arduino ProをRX,TXで2個繋げてキーボード操作している文献を見たことあるから
おそらく大丈夫だと思うけど。
とりあえずこのように配線した。
特に問題なければソースファイルもこのピンでカスタマイズします。
ジョイスティックは5V、GND、VRx、VRy、SWの5配線必要。
VRy(緑)をD18(A0)に。
VRx(青)をD19(A1)へ、
SW(黄)をD20(A2)へ。
赤はVCC、灰はGNDへ。
基盤の固定が甘かったらピンホールをネジ穴に使おうかな。
基板の角に位置するD9(A9)、RAWのピンホールは使わないのでここがよさげ。
ちょっと押さえが弱いようならD10(A9)も犠牲になってもらおう(;´Д`)
極小の穴なので1mmネジで通るかなって感じだけど、
まぁ、大量に集めた中古ネジストックにあるでしょ。
テスト部品をいつまでも段ボールの上に張り付けておくわけにはいかないので、
Arduino Proに合わせた土台を試作します。
前回試作したジョイスティックの土台の位置を継承して、
完全固定の台座を用意。
ジョイスティックの底面は半田でデコボコしてるのでスペーサーを用意。
FDMだと複雑な造形を一部品にすると難易度が上がるので、
こうやって分けて印刷すると出来上がりがきれいです。
スペーサーが乗るゲタ。
足が2本生えてますが、これは強度が弱いのでおまじない程度だけど、
Arduinoを上から押さえつける役割を与えました。
位置関係はこんな感じ。
Arduino Proはジョイスティックの下に隠れるようにしました。
USB-Cケーブルのコネクタの処理が思いつかなくて
ここ以外ではスペース的に厳しかったんです(;´Д`)
とはいっても、最適解だと思ってます。
おかげで空間はかなり余裕ができました。
上蓋はこんな感じ。
普通にドーム型にして、ジョイスティックが干渉しないように穴を設ける。
ロータリーエンコーダーは上蓋に取り付けるイメージです。
上蓋はFDMでの印刷は困難だけど、そこはおいおい考えるとして、
試作はレジンで光造形します。
底面のベースをFDMで印刷。素材はABSを使ったけど、盛大に失敗(;´Д`)
0.2mmノズルを使っているのに、0.4mm設定で印刷したものだから、
印刷ラインや吐出量などがガタガタ。よく完走したなという感じ。
普通ならノズルが詰まってスロートに逆流してもおかしくない。
出来上がったものはガタガタだけど、ま、いいか(;´Д`)
実際にジョイスティックを載せてみた図。
ネジ穴に微妙な問題が出てる。ネジ山が崩れてしまったようだ。
もしかしたらインフィルの設定をかなり粗いメッシュにしたかもしれない(;´Д`)
今回の印刷は何から何までダメダメだわ。
コストを下げるためにインセットナットを使わない設計にしたつもりだけど、
この試作では使わざるをえないか(;´Д`)
USB端子部分は、同じくFDMで印刷した留め具を用意し、M2ネジで固定。
これも微妙。穴はあらかじめ用意せずピンバイスで自分で開けた方がよさそうだ。
あと留め具の強度も弱い。改善点が多々見つかっていく(;´Д`)
配線はArduinoの上にこれだけスペースがあれば十分通せそう。
ここは思い通りに行きそうだ。
Arduinoは上からの押さえのおかげか遊ぶ様子もなくしっかり固定されている。
うん、悪くない。
では配線してみますかね。
いい感じだが、ジョイスティックのデュポンコネクタが
思いのほか邪魔になっていることに気が付く(;´Д`)
これは外装を固定するときの障害になりそうだ。
ORBIONの二の舞か?(笑)
ちょっと工夫しなくてはならんね。
左手を上に置いてみた感じ、なかなかしっくりくる(*'▽')
これ外装いらない説?(笑)
配線とソースの書き換えが正常にできているか動作確認。
問題なく動いているようだ。よしよし。
では、キーボードとマウスの動作をPCに送れるのか実験。
キーボードの操作方法は前回の記事で調査していたので万全です。
マウスも同じような方法で使用可能でした。
Mouse.hをincludeして
SETUPにMouse.begin();
を追加で使用可能。
カーソルの操作は
Mouse.move(x,y,ホイールをスクロールする量);
こんな感じで行けるっぽい。
マウスのボタンは
MOUSE_LEFT:左ボタン(デフォルト)。
MOUSE_RIGHT:右ボタン。
MOUSE_MIDDLE:中ボタン。
この3つが制御可能で
Mouse.press(ボタンの種類);
で行います。
Mouse.release(ボタンの種類);
を実行するとマウスのボタンを押すのをやめます。
とりあえず、ジョイスティックを押したらShift押しながら
マウスの中央ボタンを押しつつカーソルを右に移動するというのを組んでみる。
これが動けばおおむね動作確認はOKだ。
100msの速度で10pxずつの移動で実行してみました。
映像は暗いですが深夜にスマホで撮ったものですのでご容赦を。
反応は良好。100msは遅いかな?もう少し早くても良さそう。
時々シフトキーを押し忘れることがあるね。
これはシフトボタンを押してマウスを動かすまでウエイトが無いことが原因かな。
課題が見えてきた(;´Д`)
とりあえず今回はここまで。
次はジョイスティックの動きに合わせて移動量を変化する部分をつくりますかね。
あ、仕事の合間に作っているので進行が遅いです(;´Д`)
次の3Dマウスの記事はこちら
https://randol-news.net/art/00577.html
3Dマウス② ファームウェアを作り始めよう。
2022.12.15
前回の3Dマウスの記事はこちら
https://randol-news.net/art/00569.html
ロータリーエンコーダーとジョイスティックの検証は済んでいたので、
まずは2つを混合させるだけの簡単な仕事から。
まずピン設定や変数、定数の宣言はIncludeで取り込む形にして
よく使うファイルを見やすくすっきりさせた。
今後ソースが肥大化するにつれて視認性の確保と
カスタマイズ性が失われることを防ぐためにも重要。
部品の位置や配線の都合により、X軸、Y軸の値の向きが逆になったりすることもあり得るので
フラグで正位置、逆位置を指定できるように。
0~1024という値を返すジョイスティックは少々扱いにくいと考え、
-512~512で受け取れるように加工。0がニュートラルを示すように分かりやすくした。
実際のニュートラルは個体差があるので、Setupが動いたときに0補正するようにした。
試験用に用意したArduino Nano
中国の互換機です。本家だと思って買ったら偽物だったという奴(;´Д`)
本家との大きな違いはUSB接続。CH320のドライバーを入れないとつながりません。
まぁ動作検証するだけなら十分でしょう。
実はこの企画はATmega32u4を搭載したArduinoじゃないと動きません(;´Д`)
Arduino ProかLeonardoじゃないと実現できないのです。
なぜならキーボードとして認識させる機能がNanoにはないからですね。
でもまぁ、いま使えるのが無いので仕方ないね(;´Д`)
ちょっと急ぎでLeonardoを注文しとこう。
ジョイスティックのVRX(緑)をA1へ、VRY(青)をA0に。SW(オレンジ)をD4へ。
赤線は5V、黒はGNDへ。
ロータリーエンコーダーの緑縞線をD3、青縞線をD2へ。青線をGNDへ。
Arduinoを挿しているこのソケットがかなり便利。
デュポンのオスを挿してもいいし、裸線をさしてもいい。
ネジを締めれば簡単には抜けないので試作では大変重宝しています。(*'▽')
走らせてみた。
実行、修正を数回繰り返し何とか満足いくレベルに。
次はFusion360にキーボードの信号をどうやって送るかを考える。
私は初めて使うライブラリだけど、Arduinoには便利なものが最初から用意されている。
ただしArduino Pro(Leonardo)を使っている場合のみ使用可だけど・・。
いちいちドライバーやらなにやらを自分で組む必要はないみたい。
そして使い方は簡単らしい。
Keyboard.hをIncludeして、setupにKeyboard.begin()を入れ込めば
パソコンはArduinoをキーボードとして認識してくれるとのこと。チョー簡単。
あとは
Keyboard.print(文字データ);
Keyboard.press('文字データ');
これらを使うだけで文字を送れるという話。
文字じゃない特殊キーはKeybord.h内に定数が用意されていて、
#define KEY_LEFT_CTRL 0x80
#define KEY_LEFT_SHIFT 0x81
#define KEY_LEFT_ALT 0x82
#define KEY_LEFT_GUI 0x83
#define KEY_RIGHT_CTRL 0x84
#define KEY_RIGHT_SHIFT 0x85
#define KEY_RIGHT_ALT 0x86
#define KEY_RIGHT_GUI 0x87
#define KEY_UP_ARROW 0xDA
#define KEY_DOWN_ARROW 0xD9
#define KEY_LEFT_ARROW 0xD8
#define KEY_RIGHT_ARROW 0xD7
#define KEY_BACKSPACE 0xB2
#define KEY_TAB 0xB3
#define KEY_RETURN 0xB0
#define KEY_ESC 0xB1
#define KEY_INSERT 0xD1
#define KEY_DELETE 0xD4
#define KEY_PAGE_UP 0xD3
#define KEY_PAGE_DOWN 0xD6
#define KEY_HOME 0xD2
#define KEY_END 0xD5
#define KEY_CAPS_LOCK 0xC1
#define KEY_F1 0xC2
#define KEY_F2 0xC3
#define KEY_F3 0xC4
#define KEY_F4 0xC5
#define KEY_F5 0xC6
#define KEY_F6 0xC7
#define KEY_F7 0xC8
#define KEY_F8 0xC9
#define KEY_F9 0xCA
#define KEY_F10 0xCB
#define KEY_F11 0xCC
#define KEY_F12 0xCD
この定数を利用すれば特殊キーの動作をさせることが出来るっぽい。
例えばコピペで使うCTRL+Vはこんな記述。
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press('v');
Keyboard.releaseAll();
FusionもCTRLとかSHIFTとか使うからこれの応用だね。
実際に動かしてみたいけど、Arduino Proがないので届くまでお預け(;´Д`)
仕方ないので、その間他のことを考える。
電流はどれくらい流れてどのくらいの太さの配線でいいのか確認してみよう。
これも結構大事な事。
まずは、ジョイスティックから。
アイドル時に流れている電流は19.3μA
ぐりぐり動かしているときの電流19.4μA
全く同じ。0.1違うのは誤差の範囲です。
こんなに小さいのね。
これはロータリーエンコーダーのアイドル時、GNDラインに落ちる電流の様子。
1.5μAとほぼ無いに等しいレベル。
これはぐりぐり回しているときのGNDラインの様子。
写真では18.8μAまで上昇をとらえてるけど、最大25μAくらいまではあがるっぽい。
それにしたって、こんなもんなんだなー。
XとY軸のうちの信号線を1本をひろってスティックをぐりぐりしている様子。
だいたい25μAが上限だね。
ジョイスティックの様子は一応動画でも残してみた。
オシロスコープのように値をリアルタイムに表示することはできないけど、
だいたいの様子はわかる。
ま、予想はしてたけど、ジョイスティックもロータリーエンコーダーも、
極細配線で十分という結果に。
ネットで買おうとすると一番細いのは30AWG・・・ ま、こんなのは切れやすくもあるので
28AWGあたりが細さの限界値か・・
まぁ28AWGより細い線はそうそうないので、見かけた一番細い線を使えばいいね。
なるべく柔らかいやつ(;´Д`)
次の3Dマウスの記事はこちら
https://randol-news.net/art/00576.html