DreamerDreamのブログ

夢想家の夢です。〜揚げたてのモヤっとしたものをラフレシアと共に〜

3Dスキャナーを自作する ④調整する

前回、とりあえず出来たので動作させましたが結果があまり思わしくありませんでした。

dreamerdream.hateblo.jp

 

まあ何でも一発で完成なんてこたぁ無いですよね^^;

気を取り直して調整出来るとこを調整します。

 

まずはFreeLSSのSettingsメニューからレーザー、カメラの距離をきちんと調整します。

 (記事下の方に設定方法の解りにくかった箇所を記します。)

カメラやレーザーの位置がおかしいと当然出来る図もおかしくなります。

ちなみに、FreeLSSのXYZ軸方向は3Dプリンターのそれとは異なる事に注意です。

3DプリンターのXY軸方向は真上から見下ろした状態で、高さがZ軸ですが、FreeLSSのXY方向はカメラを通して左右がX軸、上下がY軸、奥行きがZ軸です。

原点は回転台の中心と考えます。

f:id:DreamerDream:20181214133443p:plain

 

Settingメニューでこの辺がごっちゃになると軽くパニックですので図示しておきます。

 

その他調整中にいろいろと気付くことがありました。

・取得するファイルを.stlから.plyへ変更しました。

3Dプリンター出力に適した.stlファイルですが色情報が無いので何を取得しているのか解り辛いのです。.ply形式は色情報が反映されるので変なデータであってもどこが壁だとか物体だとかが解ります。

・背景と回転台を黒色である必用があります。

必ず必用という訳ではなさそうですが、その方がレーザー光と外光との判別がうまくいくようです。

 

 

スキャンは左右どちらか一個のレーザー、あるいは両方のレーザーを使った3パターンの検出が可能だそうです。

両方使った方が精度が良いだろう!と踏んで設定していたのですが実験的にレーザーを分けてみたところ、それが仇になってうまくスキャン出来ていなかったことに気が付きました。


FreeLSS実験2

左のレーザーでスキャンした場合

f:id:DreamerDream:20181212161404p:plain

うおっ!それっぽいの出来てるじゃんっ!!(なんか歪んでる気がするけど)

 

右のレーザーでスキャンした場合

f:id:DreamerDream:20181212161417p:plain

新種のキノコかな?

 

左のレーザーのほうが表面が綺麗に検出できています。

が、少し押しつぶされたようにも見えます。

右のレーザーでは凹み部分が上手く認識できていないようです。

全体の型は右の方が合っているように思います。

両方を合わせて比べると

f:id:DreamerDream:20181212161434p:plain

全然違います。んー、これではうまくいかないはずです。

 

ちなみに、両方のレーザーを使ったモードでスキャンしたものがこちら

f:id:DreamerDream:20181212161447p:plain

なんだこれ??

ちなみに、上の輪っかはどうやら壁をスキャンした結果のようです。

 

とりあえず結果の良かった左のレーザーで他のものもスキャン実験することにします。

コーヒーカップのスキャン

FreeLSS実験3

 

そうそう、取手が取れた方が収納は楽だよねー!っておいっ!!

f:id:DreamerDream:20181212161609p:plain

取手が勝手に取れました!

 

いろいろスキャンして調整してみて解った事が1つあります

どうやらカメラの水平がとれていない!

ということです。

 

カメラのマウントを適当なアルミ板にしていたので細かな修正が効きません。

f:id:DreamerDream:20181214101606p:plain

仕方ないので3Dプリンターで微調整の出来る部品を作って改良することにしました。

f:id:DreamerDream:20181214133819p:plain

 

 

各軸の設定の方法です

※注意 (以下、設定項目で日本語表示されているところはGoogleブラウザの自動翻訳によるもので、実際は英語です。)

例えばカメラのY軸(回転台からカメラまでの高さ)を90mmに設定した場合

f:id:DreamerDream:20181213120338p:plain

カメラのガイドを通してみるとこのように見えます。

赤い十字を参考に垂直、水平が調整できます。

しかし、これでは回転台の中心位置が解りません。

f:id:DreamerDream:20181213120315p:plain

 

カメラの高さを75mmに設定してみますと

f:id:DreamerDream:20181213120405p:plain

見えますか?

f:id:DreamerDream:20181213120417p:plain

垂直の赤ラインの下の方にちょこっと水平の赤ラインが出ています。 

ここが回転台の中心になるようにカメラを合わせるようです。

 

f:id:DreamerDream:20181214120147p:plain

綺麗に調整できました。

 

レーザーとカメラ位置の設定はX軸とZ軸で行なうようです。

レーザーとカメラのZ軸は固定、つまり同じ位置に設定する必用があります。どこに合わすのかといいますと↓

https://lh3.googleusercontent.com/-AQEzip0HUfg/VOS27ldH5ZI/AAAAAAAAAAk/MBF1XBgq9xo/w770-h491-no/Locations.png

要はレーザー角度の問題なので実際にはカメラ手前でも奥でも問題無いようです。

カメラの中心軸から見てレーザーの延長線上の点をレーザーの距離Xとして設定します。

注意点として、右レーザーは「160mm」等と設定しますが、左レーザーは「-160mm」と、マイナス値になるということです。(僕はここの設定ミスしてきちんと像が作れずに悩みました。)

 

 

レーザー光はレーザーモジュールの適切な位置を指定した後、キャリブレーション設定することで適切なラインを読むことができるようです。

f:id:DreamerDream:20181213120501p:plain

方法ですが、公開されているデータの中のキャリブレーション用柄を印刷して垂直に立てます。

回転台の中心軸に置き、キャリブレーションボタンを押すだけです。

f:id:DreamerDream:20181213120519p:plain

成功です。

f:id:DreamerDream:20181213120448p:plain

 

とりあえず調整後のスキャン実行をしてみます。

左レーザーでスキャンした結果

f:id:DreamerDream:20181213125601p:plain

前のものと比べてみるとカメラの水平が取れたからでしょうか?しっかりと垂直になっています。

f:id:DreamerDream:20181213125633p:plain

右レーザーも、前よりは良い感じです。

f:id:DreamerDream:20181213125657p:plain

 さて、この切れ目は?

ひょっとしたら回転がうまくいっていないのかも?

 

立方体スキャンで実験してみます。

f:id:DreamerDream:20181214085914p:plain

 

ありゃりゃ。

f:id:DreamerDream:20181214085818p:plain

これは、物理的に360°回転していないにも係らず360°スキャンした結果ですね。

確認してみます。0°時点

f:id:DreamerDream:20181214085914p:plain

360°回転後

f:id:DreamerDream:20181214085926p:plain

ソフトウェア的な問題なのか物理的な問題なのかの切り分けが必用そうです。

 

モーター軸を確認してみますと

f:id:DreamerDream:20181214101527p:plain

オイルが染みてきています。

もしかしたらこれがプーリーを滑らしてしまったのかもしれません。

実験的にプーリーに傷を入れてみます。

f:id:DreamerDream:20181214101539p:plain

0°時点

f:id:DreamerDream:20181214101323p:plain

360°回転後

f:id:DreamerDream:20181214101332p:plain

ありゃ、今度は行き過ぎてしまってる?

とりあえずこのままスキャン

f:id:DreamerDream:20181214104854p:plain

あんれー?マシにはなってるけど完全じゃありません。360°回転し切れていません。

もしかしたら他にも原因があるかも、、360°回転で問題が無く、スキャン中に問題が出るということから、物理的な要因としてはプーリーにダイレクトに回転が伝わっていない可能性が考えられます。伝達が輪ゴムですから各ステップごとにイチイチ伸縮しているのかも?

ソフト的な要因としてはラズパイからモータードライバへ適切な信号が送られていないのかもしれません。

とりあえず物理的な方から攻めてみます。
輪ゴムプーリー式のものを

f:id:DreamerDream:20181215095932p:plain

ギア式に変えて

f:id:DreamerDream:20181215095943p:plain

ギアに換えると回転方向が逆になるのでモーターも逆回転が必用です。ステッピングモーターのDIR信号のLi/Loを切り替えると出来るのですが、そのような設定項目が無かったので物理的に切り替えます。

ステッピングモーターの場合、どちらかの層の一方の配線を入れ替えるだけです。

f:id:DreamerDream:20181215095955p:plain

写真の方向が違いますが、このようにすれば逆回転ができます。

f:id:DreamerDream:20181215100006p:plain

ステップモードも1/4モードから1/8モードへ変更

ステップ反応速度も脱調しないよう変更。

f:id:DreamerDream:20181215100240p:plain

テストで360°回転も無事に成功!

ギア式にして振動が大きくなったので検出物にも両面テープを貼付けました!

これで物理的要因は排除した!カンペキ!

いざ!スキャンしてみた結果

 

!!?

f:id:DreamerDream:20181215100359p:plain

見事な三角!!!
なんでやねんっ!!

 


そういえば、スキャン中に時々ステップの振動が飛んでる気がしました。
もしかしたらソフト側の問題でしょうか?

以下のようにいろいろと実験してみました。

 

実験1:とりあえず、ステッピングモーターのフルステップモード できちんと360°回転(120stepモーターをギア駆動、ギア比1:5なので600step)できるか試しました。

結果:問題無し!

 

実験2:フルステップのままスキャン実行しました。

結果:動かない!(うんともすんとも)

 

実験3:フルステップモードのまま倍の1200step指定で360°か回転するか試しました。

結果:当然2回転しました。

 

実験4:2回転すると予想しながら1200step指定のままスキャン実行しました。

結果:360°回転でキチンとスキャンできました!(???)

 

実験5:モータードライバ1/2ステップモードにして2400step指定でスキャンしました。

結果:4面体が6面体になりました。

 

実験6:実験5の結果を踏まえて1800step指定でスキャンしました。

結果:きちんと四角になりました!

f:id:DreamerDream:20181217143459p:plain

よくわかりませんが、原因はソフトウェア側の問題というか、勝手なモーターに変えたこちらのせいですがよく解らないなりに解決しました。

フルステップモードで1200step/360°か、1/2ステップモード1800step/360°指定でとりあえずスキャンできるようにはなりました。

最初のに比べると精度もすごくよくなっています。

f:id:DreamerDream:20181217145038p:plain

初っぱなでグチャグチャデータだった置き時計のスキャン

f:id:DreamerDream:20181217161142p:plain

ぐちゃぐちゃですが時計?らしきものは取得できているようです。

反射する材質+透明ガラス+黒色材質というスキャンには悪条件の揃ったテストには辛いオブジェでした。

 

まだまだ改善の余地はありますが今回は大まかな形状が取得できたので今回はこれでOKとします。

 

ちなみに、スキャン中にプビューすると黒い回転台にモデルが形成されていくのが見えます。これは地味に楽しいです。

f:id:DreamerDream:20181217143440p:plain

 

両方のレーザースキャンモードで左右のレーザーの位置の設定がおかしいと、このようにズレてスキャンされます。

f:id:DreamerDream:20181219153920p:plain

スキャンをプレビューで確認しながら微調整しましょう。

f:id:DreamerDream:20181219153931p:plain


 

実験の途中、ギア歯をヘリカルギアにアップデートしました。15mm+75mm

f:id:DreamerDream:20181217143807p:plain

こういうのをサクッと作れるのが3Dプリンターの良いところですよね。

dreamerdream.hateblo.jp

 

面倒なギアの作成はこちらのサイト↓を利用させていただきました。

Gear Model For 3D Printer

 

レーザーはレンズの精度が悪いのか、広がる傾向にあったため複数段のレンズをテープで塞ぎ1つに絞りました。レーザーは細い方が良さそうです。

安物のレーザーだからなのか、どうも最初から左右のレーザーの広がりが違うようで綺麗にスキャン出来る方だけ使うことにしました。

f:id:DreamerDream:20181217151457p:plain

 

 

 

 

今回は長くなりましたが、とりあえず無事に動いたので今のところ調子の良い設定値を備忘録として残します。

f:id:DreamerDream:20181219162431p:plain

f:id:DreamerDream:20181219162443p:plain

f:id:DreamerDream:20181219162453p:plain





 

動作の様子


FreeLSS実験4

 

マシン全体は電源含めこのような感じでまとまりました。

f:id:DreamerDream:20181219161945p:plain

<今後の課題>もっと精度を良くするために

・レーザーをもっと質の良い物(広がりの少ないもの)に変える。

・フルステップモードのままギアを足してステップ数を増やしてみる。 

・光沢のあるオブジェの検出が難しいので乱反射を防ぐ為に偏光板を利用してフィルターをかける。

・外光の影響も関係しそうなので暗室にしてLED照明を付ける。

・レーザー以外の赤色光線を除外する(カメラとラズパイの動作赤LED隠蔽、照明を青緑光のみにする)。

 

長くなりましたが・・・

<まとめ>今回の設定や実験で解ったこと。

・カメラレビューモードの360°回転が成功したからといって実スキャンで360°回転できるとは限らない!

・フルステップモードが一番精度良い。

・左レーザーのX軸設定は「−(マイナス)」値の指定をしましょう。

・レーザーは精度が良ければ1つで作れる。

・レーザーは精度の良い細いラインのものが望ましい。

・レーザー2つのモードだと互いのレーザー距離設定がシビア。

・レーザーは不検出エリアが増えるのでカメラからあまり離しすぎない方が良い。

・ギアードモーターは煩い。

・回転は一方向(半時計回りのみ)なのでギアードモーターでもバックラッシュの問題は起こらない。

・ラズパイ2でも3でもスキャンスピード自体はそんなに変わらない。

・レーザーのキャリブレーションはSettingsで指定したスキャンに使う側のレーザーのみに対して行なわれる。

・スキャン対象物は白色マット調の物が望ましい。

・黒色、反射する白色や金属、透明のものはスキャン困難。

・僕みたいにテキトーな材料で作ると後で調整が大変(あたりまえ)。

 

とりあえず今回取得したようなそのままでは使えないようなデータでも、例えば機械のパーツやスマホのケースを作る時には位置決めの参考になります。

3Dデータ取得後にソフトを使って表面処理をするともっと綺麗な3Dデータになります。

次回は、取得したデータの表面処理について触れます。

dreamerdream.hateblo.jp

 

3Dスキャナーを自作する ③筐体を作る

前回↓ 

dreamerdream.hateblo.jp

 

今回はスキャナの本体を作ります。

とはいっても通常の公開されているデータ通りに3Dプリンターで出力するだけでは面白くありませんから(おい)適当な廃材をフルに活用して作ります。

 

モーターにはギアードモーターを採用したので精度にかなり難があります。

ということでよりスムーズな回転と繊細なステップ角を目指してプーリーで回転比率を変えることにしました。

減速機構ですが、プーリーの比率は正直よく解らないし3Dプリンターでは精度に限界があるのでいろいろ作ってみることにします。トライ&エラーですね。

 

しかし、やってみると陶芸のロクロのようなスムーズな回転機構というのは工作で作るには非常に難しく、一度ベアリングを使って3Dプリンター部品試してみましたが調整が難しくあまりうまくいきませんでした。どうしても端っこが上下にフラフラしちゃう・・・。

ということで、今回は分解したHDDのモーター軸を利用することにしました。どのみち用途の無いモーターで一応取っておいたものでしたから再利用出来てよかったです。

f:id:DreamerDream:20181210154905p:plain

しっかり台座に固定するとこんな感じ。

あ、台座は前回の古いCD-RWドライブの筐体を利用します。天板が丁度フラットな形状なので使いやすそうです。

f:id:DreamerDream:20181210154915p:plain

CD-RWドライブの中にステッピングモーター用回路も問題無く収まりそうです。

固定は面倒なので、ショートだけしないようにマスキングテープ(雑!)

カメラとレーザーのマウントは、これまた古いプリンターの部品でラズパイはエナメル線で宙づりにしました(雑!v2)

f:id:DreamerDream:20181210154930p:plain

ちゃんとレーザーの固定位置は距離を測ってますので大丈夫(なはず)!

配線ぐちゃぐちゃですが本体が閉まれば見えないのでスッキリします(笑)

 

あと、このままじゃブラウザかSSH経由でしか電源が切れないので、接続が切れた時でも本体から電源を切れるようにラズパイのシャットダウンスイッチとプログラムを仕込みました。結構便利です。

<参考>過去記事

dreamerdream.hateblo.jp

カメラのマウントはこれまた適当なアルミ板で固定。

一応大まかな完成の図です。回転台はCDを採用することにしました。なんとCDの穴がHDD軸にピッタリなんです。こりゃいいや。

f:id:DreamerDream:20181212155523p:plain

この状態でワクワクの初スキャン実験です!


FreeLSS実験

 

STLファイルでデータを取得しましたら

f:id:DreamerDream:20181212155747p:plain

 

@□@!!!なっ!??

なんじゃこりゃー!!!???

 

やはり、一筋縄ではいかなさそうです。
次回、調整です。

dreamerdream.hateblo.jp

 

 

3Dスキャナーを自作する ②回路を作る

前回は3Dスキャナソフト「FreeLSS」をラズパイにインストールしてブラウザで挙動を確かめました。 

dreamerdream.hateblo.jp

 

 

今回はFreeLSSの回路を構成します。

FreeLSS: The Free 3D Printable Laser Scanning System For the Raspberry Pi

 

公開されている回路は以下の通り

モータードライバとトランジスタアレイ、その他レーザーの出力調整や回路保護用コンデンサからなる簡単な回路です。

 

 

https://s3.amazonaws.com/freelss/bb.png

ラズパイ側のGPIO回路は

18、22、27がステッピングモータ制御用

17、23がレーザー制御用

以上です。

 

 

もし、「ステッピグモーターとは何ぞや?」とおもわれましたら、コチラの記事を参考にしてみてください。↓

dreamerdream.hateblo.jp

 

 

 

さて、ラズパイではGPIO番号で読みますが、freelssはWiringpiというパッケージを利用しているのでfreelssの設定時にはWiringpiの番号が必用です。

GPIOの番号とWiringpiとのピン番号が異なることに注意です!

freelssが起動しているということは依存パッケージのWiringpiもインストールされているので、コマンド

gpio readall

を実行することで確認できます。

f:id:DreamerDream:20181207110805p:plain

ステッピングモーター制御

GPIO18:WiringPi1

GPIO22:WiringPi3

GPIO27:WiringPi2

レーザー制御用

GPIO17:WiringPi0

GPIO23:WiringPi4

です。

 

これに合わせてブラウザからfreelssのピンを設定しましょう。

ピンの設定はSettingsメニューのSetup項目です。

f:id:DreamerDream:20181207111136p:plain

f:id:DreamerDream:20181207111143p:plain

f:id:DreamerDream:20181207111156p:plain

f:id:DreamerDream:20181207111205p:plain

LightingPinは解りませんが、被らないようにセットしましょう。

多分ですが照明の制御が出来るのでしょう。

 

ブレッドボードにテスト回路を組んで実験(スキャン実行)したのがこちらです。


freelss回路動作確認

レーザー照射(LED)とモーター回転が確認できます。

やはりギアードモーターだと1/16ステップモード(1920ステップで1回転)でも精度が悪い気がします・・・
 

とりあえずソフトも無事に動くことは解ったのでユニバーサル基盤に回路を組んで実験しました。(「部品選択がテキトーすぎるだろ!」というツッコミが聞こえてきそうです。はい、手元にあったものでテキトーに組んでます。ICソケットなんて割ってぶち込んでますw 真面目な方は公開データ通りに組んでくださいね。)

f:id:DreamerDream:20181210101354p:plain

モーターとモータードライバーだけはコネクターで簡単に変更出来る仕様にしました。その他は基盤に直付けです。

レーザーモジュールは車用の激安ラインレーザーテールライト、これならマウンターが最初から付いているので取り付けが楽ですし12V直付け仕様なので抵抗も要らないでしょう(たぶん)。

レーザーの制御も手元にあったトランジスタC1815を使ってダートリン接続しています。<参考>ダーリントントランジスタ

一応、ソフトで照明の制御も出来るようなので、レーザー2と照明用に3セット回路を組みました。

本当はFreeLSSの回路図ではULN2003Aというトランジスタアレイが使われています。このようなもの↓

 

モータードライバはお買い得なA4988互換品

 

 

電源としているのは昔分解した古いCD-RWドライブ

f:id:DreamerDream:20181210101451p:plain
中身はUSB=IDE内蔵ドライブのを変換しているだけなので、丁度12Vと5VのIDE電源端子があるので今回の用途にはピッタリ!中にラズパイとか収まりそうだし。

ドライブの消費電力は平均13W最大22Wと書いてありました。ラズパイ2なら消費電力4.5Wで、あとはまあ計算してませんがなんとなく余裕でしょう。

ということで実際にこんな感じで動作しました。フルステップモード(3°)なので回転角はメチャ荒い!


FreeLSS回路テスト

テストで得られたSTLファイルはこんなもの。ぐちゃー

f:id:DreamerDream:20181210102107p:plain

まあ適当にカメラの画像を拾って処理しただけなので当然ですね。

ちゃんとモーターとレーザーとカメラが動いてSTLファイルデータで取得できることが解ったので回路はひとまずこれでOKです。

次は、組み立てます。工作は実はこの筐体を作るというのが一番の手間だったりします。

dreamerdream.hateblo.jp

 

3Dスキャナーを自作する ①ソフトウェアのインストール

 以前に3Dスキャナーって自作できるらしいという記事を書きました。

dreamerdream.hateblo.jp

 

今回、実際にソフトをインストールしてみました。

 

その前に、ラズパイ用のラズパイカメラは必用不可欠ですので予め準備しておきましょう。

 

ソフトのインストール方法は簡単です。

こちらのFreeLSSというプロジェクトから

FreeLSS: The Free 3D Printable Laser Scanning System For the Raspberry Pi

Githubに飛び、Readmeファイルの内容をそのまま実行するだけです。

 

まずは、お決まりのRaspbianを最新状態にします。

sudo apt-get update
sudo apt-get upgrade

 

次に依存関係のあるパッケージをインストールします。

sudo apt-get install libpng-dev libjpeg-dev git-core gcc build-essential unzip sqlite3 libsqlite3-dev libmicrohttpd-dev libcurl4-openssl-dev libiw-dev libssl-dev wiringpi

 

FreeLSSをダウンロードします

sudo git clone https://github.com/hairu/freelss

 ダウンロードしたディレクトリに移動します

cd freelss/src

 

ビルドします

sudo make

 

以上でインストールは完了です。

 

実行します。

sudo ./freelss

 

これで80番ポートが開いてWebサービスとして起動します。

ブラウザでラズパイのアドレスへアクセス、もしくはラズパイ自身のブラウザから「localhost」アドレスを開いてみましょう。

f:id:DreamerDream:20181206105000p:plain

なんともシンプルなフォームです。これで起動成功です!

 

カメラを起動させるとラズパイカメラの映像が映ります。

f:id:DreamerDream:20181206105034p:plain

 

さて、ここから注意点です!

ラズパイを起動するたびに自動的にFreeLSSを開始するには下記コマンドを実行します。

sudo make startup

 

と、書かれていますが、↑これをやると、設定でエラーが出てしまって任意のGPIOポートやステップ角の設定が出来ない事態に陥ることが判明!

実は、freelssのデフォルトで設定されているGPIOと回路図に記載されているGPIOポートが違うのでポートが設定出来ないとなると致命的なのです。

ERROR

Error opening properties file for writing:

 

 

コミュニティでも問題ありということで、その理由と解決策が挙がっています。

FreeLSS:Error saving settings (and wrong pin defaults?) (Page 1) — ATLAS 3D & FreeLSS — SoliForum - 3D Printing Community

 

どういうことかというと、piユーザーで実行した場合、/home/pi/に任意のpropertiesファイルを作られるんだけど、自動起動のサービスはrootから実行されるので/home/root/にpropertiesファイルが見つからないから無理だよー!

ということだそうです。

試しに/home/rootディレクトリを作ってfreelssを入れてみたんだけどそういう問題じゃないらしい。

公式のReadmeには「FreeLSSはroot(またはハードウェアのピンにアクセスできる別のユーザ)として実行する必要があります。」

と書かれているのでsudo権限のあるユーザーで実行すれば問題ないと思ったんですけどね。

 

さて、解決策としてはコミュニティに書かれている通りなんですけど、

既にmake startupをしちゃった場合には

sudo update-rc.d freelss remove

を実行して自動起動を取消ます。

piのホームディレクトリ、/home/pi に

cd /home/pi

sudo nano freelss.sh

としてfreelss.shというスクリプトを作ります。

freelss.shの中は

#!/bin/bash
sudo freelss

と、sudo freelssを実行するというコマンドを書きます。

 

そのまま

sudo bash freelss.sh

としてfreelssが立ち上がればスクリプトはOKです。

 

次に、起動時にこのスクリプトを読み出すようにします。

/home/pi/.config/autostart ディレクトリにfreelss.desktopファイルを生成します。

 

通常、.から始まる隠しファイルを見るにはls に-aオプションを付けてみましょう。

sudo ls -a /home/pi/

.configディレクトリはデフォルトで存在していると思います。

もし、存在していなければ以下の方法が実行できるかどうかは解りません。

sudo ls /home/pi/.config/

で既にautostartディレクトリがあるか確認します。なければmkdirコマンドで作りましょう。

sudo mkdir /home/pi/.config/autostart

freelss.desktopファイルを作ります。

sudo nano /home/pi/.config/autostart/freelss.desktop

 

freelss.desktopの中には

[Desktop Entry]
Type=Application
Exec=bash /home/pi/freelss.sh
Terminal=false
Notify=false

と書き、保存します。

 

再起動してブラウザで確認しましょう。

「SEttings」メニューの中から「setup」を選択して

f:id:DreamerDream:20181207105802p:plain

Unit of lengthで単位をInchesからMillimetersに変更してSaveしてみましょう。

エラー無く正常に保存されれば成功です。

f:id:DreamerDream:20181207105906p:plain

 

無事にソフトウェアがインストール出来たのであとはポートの設定と回路の作成をしてカメラとレーザーを固定すれば使えます。 (先が長い・・・)

 続↓

dreamerdream.hateblo.jp

 

RapberryPiでステッピングモーターを制御する ④制御

今回は実際にラズパイから制御してみます。

前回はGPIOとドライバーとの接続でした。

dreamerdream.hateblo.jp

 

f:id:DreamerDream:20181205154059p:plain

 

適当なpythonコードを書いて制御してみます。

#!/usr/bin/python
#coding:utf-8

import RPi.GPIO as GPIO
import atexit
import time

Dir = 27 #DIRピン設定
Step = 17 #STEPピン設定

def end():  #終了時に呼ぶ
  GPIO.cleanup()  #GPIOの開放

def init():  #GPIO初期化
  GPIO.setmode( GPIO.BCM )  #BCMモード
  GPIO.setup( Dir , GPIO.OUT )  #Dirピンを出力モードへ
  GPIO.setup( Step , GPIO.OUT )  #Stepピンを出力モードへ
  atexit.register( end )  #強制終了時にもGPIO開放するよう設定


def act( dir = 0 , step = 1 , sec = 1): #dir:回転方向、step:ステップ数、sec:秒

  GPIO.output( Dir , dir )  #正逆転セット

  step = step *2  #STEP信号はHiごとに1stepなので2倍にしておく
  sleep = float( sec ) / float( step ) #step間の待ち時間を算出
  for i in range( step ):  #step数繰り返し
    GPIO.output( Step, 1 - GPIO.input( Step ) )  #反転出力
    print GPIO.input( Step ), GPIO.input( Dir )  #動作確認用
    time.sleep( sleep )  #step間の待ち時間


def fwd( step , sec ):  #正転
  act( 0 , step, sec ) #dirだけ決めてact()に投げる

 

def rvs( step , sec ):  #逆転
  act( 1 , step, sec )  #dirだけ決めてact()に投げる

 

def test():  #動作テスト
  for i in range( 3 ):

    for j in range( 10 ):
      fwd( 10 * ( j+1 ) , 1 )
      print j
    for j in range( 10 )[::-1]:
      fwd( 10 * ( j+1 ) , 1 )
      print j

    for j in range( 10 ):
      rvs( 10 * ( j+1 ) , 1 )
      print j
    for j in range( 10 )[::-1]:
      rvs( 10 * ( j+1 ) , 1 )
      print j

 

if __name__=='__main__':
  init()  #初期化
  test()  #動作テスト

 

これを実行すると、画面にSTEPに出力されている信号が01でズラーっと出て来ます。

そして、モーター側はこうなります。


ステッピングモーター動作テスト

当然回ります。はい、モーターですのでね。

このギアードモーターの最短パルスは400/s程度でした。それを超えると脱調という現象が起きて正確な制御が出来なくなります。


ステッピングモーターテスト3(脱調)

 

HDDから取り外したモーターも回してみました。

これは4線全てが内部で繋がっているステッピングモーターで機構が違うのでとりあえず2線だけで繋いでいます。

実際どうやって正常に動かすのかよくわかりませんが、とりあえず動くように繋いでみました。

ばりばり脱調していますが、周波数がピッタリ合うと水を得た魚のように元気に回転します。


HDDモーターテスト1

 

実験の結果、だいたい200/s程度のパルスで安定して回るようです。


HDDモーターテスト2

このように、ステッピングモーターによって特性が全く違うので動かしたいモーターの特性はデータシートが無ければ実験して把握するしかありません。

 

回るだけじゃ面白く無い!

ということで、古いエプソンのスキャナから取り外したステッピングモータ制御の直動機構も動かしてみました。

f:id:DreamerDream:20181205164511p:plain

減速ギアの組まれたこんな立派なモーターです。

 


ステッピングモーターテスト2

固定は面倒なのでテープ固定(笑)すっごい雑だけどちゃんと動いています。これも安定して動くパルス調があります。

この機構をXY軸で組めば単純なプロッタマシンですね。

 

いろいろなモーターの実験をしましたが、実際にモーターを高回転で安定して制御する場合に脱調を起こさないためにはArduinoなどのバックでOSやら何やら動かない単純なマイコン制御の方がコスパが良いでしょう。

ラズパイでPyhtonからだとどうしても正確なタイミングでのGPIO制御には限界があります。

 

このように、モータードライバーを使えば結構単純な回路でステッピングモーターの制御が可能になります。

工作の幅が広がりますのでLチカに飽きたら是非試してみてください。

 

 

作例として ↓この自作3Dスキャナでもステッピングモーターとドライバーを使っています。

dreamerdream.hateblo.jp

dreamerdream.hateblo.jp

 

RapberryPiでステッピングモーターを制御する ③接続

 前回は部品選択でした。

dreamerdream.hateblo.jp

 

今回は部品の繋ぎ方です。

 

まずは、ラズパイから制御できるようGPIOのポートをチェックしましょう。 

ステッピングモータードライバーを制御するには、最低DIRとSTEPとGNDが必用になります。

今回はピン番号9,11,13のGND、GPIO17,GPIO27を利用することにします。

https://www.bigmessowires.com/wp-content/uploads/2018/05/Raspberry-GPIO.jpg

 

 モータードライバーのピンアサインは最近ではこの配置に定着しつつあるようです。

http://image.itmedia.co.jp/mn/articles/1609/09/hi_mo03.jpg

A4988データシート

 

VMOT:ステッピングモータ用電源(8V-35V)
GND:ステッピングモータ用電源GND
2A/2B:1A/1B:ステッピングモータ接続端子
VDD:制御ボード用電源(3.3Vまたは5V)
GND:制御ボード用電源GND
DIR:モータの回転方向(High・Low)
STEP:回転制御パルス(1.8度/1stepのモーターでFull stepに設定したとき200stepで一回転する)
SLEEPーRESET:短絡しておく
MS1~MS3:マイクロステップ設定用端子

(各PinのHigh・Lowでマイクロステップを設定できる)

MS1 MS2 MS3 Microstep
Lo Lo Lo Full (1/1)
Hi Lo Lo Half (1/2)
Lo Hi Lo Quarter (1/4)
Hi Hi Lo Eighth (1/8)
Hi Hi Hi Sixteenth (1/16)

 

つまり1ステップごとに制御出来る回転角がモードによって違い、1.8度角のステッピングモーターの場合、

・Fullの場合は、1step信号ごとに1.8度単位(360度回転に200step)

・Halfでは、1step信号ごとに0.9度単位(360度回転に400step)

・Quarterでは、1step信号ごとに0.45度単位(360度回転に800step)

・Eighthでは、1step信号ごとに0.225度単位(360度回転に1600step)

・Sixteenthでは、1step信号ごとに0.1125度単位(360度回転に3200step)

となる。
ENA:Enable端子。ドライバの動作と停止を制御できる。Loで動作する。

 

必用に応じて使用する端子を選ぶのだけど、基本的に細かい設定は最初からプルアッププルダウンしてあるみたいなので

VMOT/GND:モーター用電源12V

VDD/GND:制御回路用電源5V

DIR:正転/逆転

STEP:ステップ信号

1A/1B:ステッピングモータ1相コイル

2A/2B:ステッピングモータ2相コイル

を繋げばFullStepモードとして動作する。

ということです。

 

実際に実験で接続した写真です

黒線:GNDー共用

灰色:GPIO17ーSTEP

白色:GPIO27ーDIR

青線:5Vですが、今回は別電源から取ったので繋いでいません

f:id:DreamerDream:20181205154059p:plain

モータードライバーの

緑、赤、黄、白は実際にモーターのコイルへ伸びている線

ピンクはモーター用電源+12V電源

赤色は5V電源

GNDは共用(12V、5V、ラズパイ共に)

あと、RESETとSLEEPを直結しています。

 

もし、この状態でなにもしていないのにモーターがガリガリ音を立てて回転するようならSTEPからノイズ信号が入っています。

これは、ポートがHiでもLoでもないどっちつかずのフラフラした状態で自然界の電磁ノイズ(商用周波数とか)を拾っているためです。GPIO制御時には必ずHiまたはLoになるので安定しますが、気になる場合はSTEPに10kΩ程度の抵抗を入れてGNDに繋ぐ事で回避できます(プルダウン)

 

次回はこの回路でモーターを動かします。

dreamerdream.hateblo.jp

 

RapberryPiでステッピングモーターを制御する ②部品選択

前回、ステッピングモーターの制御にはユニポーラ制御とバイポーラ制御がありますという説明をしました。 

dreamerdream.hateblo.jp

 

ユニポーラの方が構成回路は簡単になりますが専用のドライバは少ないのでマイコンを用いて自前で組むことになるでしょう。

マイコンからモーターやリレーといった大電流の流れる可能性のあるコイルを使った部品の制御というのは実は厄介なもので、単純にFETを繋げば良いというものではありません。

起電流誘導電流ノイズという問題に対処しないといけませんし、適切な電流を流さないと発熱による部品の損傷も起こり得ます。

 

ましてやバイポーラ制御を目的に電流の方向が変わるフルブリッジ回路をマイコンで制御するには切り換えのタイミングやプログラムや配線のミスでユニポーラ制御よりショートさせやすくなります。

停止時にコイルに流す電流も考慮しなければなりません。無駄無く正確に制御する為には「チョッピング電流」というPWM波を発生させて流しっぱなしにならないようにしないと低速時のモーターの発熱が凄いことになります。その他の熱や過負荷の保護機構も考えないといけません。

僕は実際にパイポーラ駆動用の回路をマイコンで組んだ事がありますがなかなかな苦労をした末に結局ノイズの問題に対応出来ず失敗しました。

 

しかし、現在そんな苦労をせずとも簡単にステッピングモータ制御するための専用の基盤が200円弱で手に入るのです。

代表的なステッピングモータードライバー「A4988」

www.switch-science.com

マイクロステップという細かい角度制御が可能、電流調整のボリューム付き、回転速度に応じたチョッピング制御、各種保護回路内蔵。

本物は1つ1000円を超えますが、これの模造品が格安で出ています。信じられないことに5個入りで1000円以下です。

 

 

これでも充分に機能します。

但し、こういった激安品は検査が甘く(無く?)たま〜に短絡している物があるらしいのでちゃんとチェックしてから使うようにしましょう!

※最初は正常に動作してるのに使っていると異常発熱や動作を起こす物もあるのでしばらくは様子を見る期間も必用です(経験あり)。

もしこの時点で「部品のチェック方法なんか解らん!無理無理!」という方はお値段は張っても正規のA4988チップを購入してください。ラズパイを燃やすより断然安いです。

商品ページから説明文を抜粋、本家A4988のデータシートも参考に日本語が変なところを含め解説します。

A4988特徴:
1.8V未満~35V2Aのステッピングモータを動かすのに適当である。
2.非常に簡単なステップ方向コントロールインタフェース。
3.5つの、種々の、段をつけているモード:全部、半分、1/4、1/8、および1/16。
4.調整可能な電位差計は最大の現在のアウトプットを調整できる よりよいステップレートを得ることができる。
5.自動的な現在の腐敗モード検出選択。
6.高い熱は結果として生じる 回路切断、不足電圧ロックアウト、クロスオーバー電流保護。
7.ショート保護とロードショート保護を接地しなさい。

 

①8V〜35V、2Aまでの幅広いステッピングモーターに対応しています。

②基本的に「STEP」(回転ステップ数)と「DIR」(回転方向)という端子に信号を与えるだけで機能します。

③「マイクロステップ」と呼ばれる機能で、5段階あります。1.8度角のステッピングモーターであれば最大1.8/16=0.1125度という細かいステップ角で制御が可能になります。

④本体に付いているボリュームで最大電力をコントロールすることが可能になります。

⑤チョッピング制御方法を自動で選択します。

⑥過熱時切断回路、低電圧ロッック回路、過電流保護回路があります。

⑦接地故障検出回路、ショート時保護回路があります。

 

う〜ん、これだけの機能のものをこのサイズで作るのは素人工作では無理!200円以下なんてとんでもないことです!

やはりモータードライバーは機能面からも激安なので買うべきです。

<参考>

dreamerdream.hateblo.jp

 

 

ステッピングモーターは用途に応じた物を選びましょう。

上で上げたモータードライバーを使うにはバイポーラ制御用を選びましょう(ユニポーラ制御用でも場合によっては使えます)

 

モーター本体は、基本的に1.8度のモノが多いです。

3Dプリンターでつかわれているのもこのタイプのもので、トルク等の特性もあり値段も様々です。

 

 

 

 

小型のステッピングモーターもあります。但し力は弱いです。

力を必用としない用途、車のタコメーターにも使われているタイプです。

 

 

小型のステッピングモーターの力を補う為にギアを内蔵した「ギヤードモータ」と呼ばれる種類のものもあります。

結構力は強く、水洗の電磁弁として使われていることもあります。

 

 

 

 次回は部品の接続です。

dreamerdream.hateblo.jp

 

 

kampa.me