t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

Linuxで暗号化されたRAID10を構築したので概要を解説

今回はAlmaLinux OS 9で暗号化されたRAID10を構築してみた。
作成した暗号化ボリュームはSambaファイルサーバーの共有ファルダで使用する予定である。

※物理的なサーバーの組立は前回の記事を参照
thom.hateblo.jp

RAID(レイド)とは、複数のストレージ(HDD・SSD等)を組み合わせて使うことで速度アップしたり、故障時のデータの消失リスクを下げるためのテクノロジーである。

今回はLinuxのmdadmというツールでRAID10という仕組みを構築し、さらにそこに暗号化ボリュームを作って/mnt/encryptedにマウントし、そこにSambaの共有フォルダーを作成するという構成にした。保存領域の全体像はこんな感じ。

ごちゃごちゃしてよく分からないと言われてしまいそうなので順を追って説明する。

まずハードディスクを買ってSATAケーブルでマザーボードに接続すると、/dev/sdaのように認識される。
※複数のHDDを接続した場合はsdb、sdc…という風に続く。

そこにRAID用のパーティションを作成する。

これを複数セット用意してミラーリングさせたのがRAID 1と呼ばれる構成。

RAID 1の構成だとディスクを増やしてもバックアップに使われるので保存可能なデータ容量が増えないけど、ディスクの数だけバックアップがあるようなものなので、HDDが全滅しない限りはデータが消えないというメリットがある。

一方で、Raid 0という構成ではデータを切り分けて複数のディスクにそれぞれ別の部分を保存する。

HDDはアクセス速度が遅いけどRAID 0だと1つのデータに対して複数のHDDが分担して読み書きを行うのでその分アクセススピードが向上する。

そして、いま説明した2つの仕組みを組み合わせたのがRAID 10である。※1+0と表記されることもある。

今回は採用しなかったが、逆の組み合わせはRAID 01と表記される。※0+1と表記されることもある。図の都合で上から読みそうになるけど逆なので注意。

一見違いが分かりにくいかもしれないが、下図を見ていただくと対障害性でRAID10が勝っていることが分かる。

RAID 01の方はsdaが故障した時点で左側のRAID 0が機能しなくなるため、右側の2本で運用することになる。このうち1本が壊れたらシステムが完全停止となるので障害には弱い。
対してRAID 10はsdaが故障してもミラー先のsdbが生きているので左側のRAID 1はセーフ。この状態でsddが故障してもミラー先のsdcが生きているので右側のRAID 1もセーフ。よって全体を構成するRAID 0もセーフとなり、システム全体は正常に稼働を続ける。
まぁこの図だと4台しかないので、sdaとsdbが同時故障した場合は逆にRAID01の方がセーフということになるんだけど、台数が増えるとグループを跨いだ故障に強いRAID10に軍配が上がるという訳である。


RAIDには専用の基盤を用いるハードウェアRAIDとOS上のアプリケーションで実行するソフトウェアRAIDの2種類がある。
ハードウェアRAIDは専用基盤なのでCPUに負担がかからないけど高額、ソフトウェアRAIDは特に追加で購入する部品などは必要ないがCPUリソースを必要とするので一長一短である。

最初はハードウェアRAIDを考えていたけど、今回Amazonで比較的安価で販売されていたRAID10拡張カードのレビューコメントを見ると、これRAID 0+1だよって書かれているものがあったので気持ちが萎えた。RAID01のメリットは知らないので本当かどうかは分からない。ただどうやら調べてみると販売業者もRAID10とRAID01との区別がついておらず、どちらでも一緒だと考えてる人がいるようで、微妙なものをつかまされても困る。

今回はそもそも家庭で使うファイルサーバーなので、どのみちCPUリソースは持て余すことになる。ということで今回はLinuxのmdadmというツールを用いたソフトウェアRAIDを採用した。

作成したRAIDボリュームはmd0という名前を付け、/dev/md0というデバイス扱いになった。

この時点で同期処理が始まるので終わるまで待機し、完了したらLUKS(Linux Unified Key Setup)という仕組みでmd0を暗号化する。LUKSはディスク暗号化の仕様の名前なので、実際の暗号化にはcryptsetupsというツールを使用し、ボリューム名は参考にした記事に倣ってcryptdataとした。

このcryptdataボリュームにLinuxで一般的なext4形式のファイルシステムを構築しこれを/mnt配下に作成したencryptedフォルダにマウントする。マウントするときに暗号化キーを求められるが、これはキーファイルとして保存しておくことでOS起動時に自動マウントさせることができる。この仕組みだとOSが起動してしまえばデータは見えてしまうわけだけど、仮にディスク単体を抜き取られて盗み出されても他のPCからデータを見ることはできないので安全性は向上している。

さて、これでLinuxから/mnt/encryptedにアクセスすることで実際に暗号化されたRAID10領域を普通のファイルやフォルダを作成することができるスペースとして利用することができる。

ということで今回作成した暗号化RAIDの概要説明はここまで。

実際の手順は以下の2サイトを参考にほぼそのまま対応したのでここでの説明は割愛しようと思う。
ja.linux-console.net
e-penguiner.com

次回はここにSambaを構築する際に若干苦労した点や実装した独自機能について書こうと思う。

スリムPCケースとホットスワップ鍵付きHDDベイでプロフェッショナルな見た目のサーバー機を組み立てる

今回はIN WIN社のスリムPCケース IW-CE685/300P とStarTeck.comの簡易鍵付きHDDベイSATSASBP425を使ってなるべく業務用っぽい見た目のサーバー機を組み立ててみた。

ケースはこちら。

※同じ見た目のケースで型番違いも販売されているが、搭載電源の認定がBronzeかPlatinumかの違い。
通常サイズだとどうしてもクライアントPCっぽさが全開になってしまうので理想を言えばデータセンターにあるラックマウントサーバーが良いんだけど、個人での保守性を考えると無理があるのでなるべくスリムで飾り気がなく、横置きできるケースを選定した。

ケースの前面に装着するHDDドライブベイはこちら。

最初はホットスワップに対応したPCケースを見繕っていたんだけどシルバーストーン社くらいしか選択肢がなく、設置場所の都合で諦めた。
このHDDドライブベイは簡易的な鍵付き※で誤って開けてしまうこともなさそうなので完璧。
※付属の鍵でなくても、多分ラジオペンチ等の工具で突起部をつかんで強引に開けることは可能と思われる。破損しそうなのでやってない。指では無理だったのであくまで簡易ロック。

唯一気に入らない点はHDDのアクセスLEDが青色ということ。

そこは緑かオレンジにしてほしかった。青LEDはコンシューマー受けを狙った家電に多く使われていることもあって私が思い描くプロフェッショナルな見た目からは遠ざかる。なんか格好よく見せようとしてる感が鼻につくのだ。
まあでも、その他は理想的なので目をつむろう。見てるうちに慣れてきた気もするし。

サーバー機を新規調達する背景

2022年4月頃に導入した富士通のラックマウントサーバーだが最近フロントパネルの警告ランプが点滅するようになってしまった。
thom.hateblo.jp

修理しようにも機器が特殊すぎて診断のノウハウもないし、保守も切れてるので交換部品が分かったところでオークションの出品を待つことになる。
加えて、ようやく修理できたところで2024年6月には今使っているCentOS 7がサポート切れになり、他にこのハードでまともに動くOSは未確認。
ということで今回思い切って新規調達することにした。また同様のトラブルに備えてなるべく汎用部品で構成するというのが今回のミッションである。

その他の部品

マザーボードはこちらを調達。

コンシューマー向けの基盤は大半が黒に染まってしまった昨今、緑基盤のマザーボードは逆にレアになってしまった。ゲーミングPCでこれはないけど、サーバー用に使う分にはむしろ緑のほうが業務用っぽくて格好いい。Intel 12世代CPUに対応しつつ、緑基盤で今どき珍しいCOMポートが付いているってのが逆にすごい。
ちょっと最近保証問題で炎上騒ぎがあったのでどうかなというところではあったけど、まぁマザーボードメーカーは特定地域に偏ってるのでカスタマー対応にカルチャーがでてしまっているというのが正直な感想。だから本質的にはどこも似たり寄ったりだというのが現状の見立て。

それはいいとして2点気に入らない機能があって、キーボード未接続だと起動時に警告メッセージとビープが鳴ってしまうことと、モニター未接続だと電源LEDがずっと点滅しっぱなしになることだ。キーボード警告はネットで調べながらBIOS上でOFFにする方法を探したけど見つからず、モニター警告のOFFはその他重要な機能のチェックと共通になっているのでOFFにすると故障診断が心配。あくまでパソコン用のメインボードなのでサーバーとしての使われ方は想定されていない。それがネックになった。

仕方がないのでとりあえずVGAダミーを調達して到着待ち。

HDMIダミーのほうがコンパクトだけどなぜか販売品はツヤっとしてて形状も丸みを帯びていかにもコンシューマー向けっぽいので避けた。
そこ、なんでターゲティングミスるかな。そんなマニアチックな商品求める層なんて、飾り気のない業務用志向が強いに決まってるのに。

CPUはCeleron。

Intel 12世代の最弱CPUだがそれだけに消費電力の低さはピカイチ。今回はそんなに計算リソースを使わないけど24h x 365d稼働のファイルサーバー用途なので発熱しにくい点も魅力的。ただ需要が限定的なためか全然流通してないようで価格は高騰しており、同世代のCore i3よりも高い値段での調達となってしまった。

メモリ・SSDはCrucial

メモリやSSDは聞いたことないような企業が沢山あって迷いがち。Crucialはアメリカの大手半導体会社マイクロンが擁するブランドで、値段はピンキリだけど廉価品でも品質に定評があるので迷ったらCrucialでいいと思う。

そしてフロントのHDDベイに付けるのがウエスタンデジタルのBlue。

Raid10を組むため、4本購入した。

本当はWD Red NAS 2.5インチが欲しかったんだけど、Amazonでは在庫切れで再販の目途も不明。HDDは大容量化に柁をきっているせいか2.5インチはSSDが主流で、2.5インチHDDはだんだんと選択肢が限られてきているように感じる。

部品は以上。

組立て

作業に夢中でそんなに写真は取ってなかったけど、マザーボードにM.2 SSD、CPU、リテールクーラー、メモリの順で搭載してケースへ入れて固定したところ。

全体的に緑と黒。ひと昔前はこれをダサイと感じてたんだけど逆にレアになってしまって一周まわってこの飾り気のなさが格好よく見えてくる。

フロントパネルのIOケーブルの取り付けに当たってはLEDの極性が分からなかった※ので念のためテスターのダイオードモードで確認するなど、電子工作の知識が活きる場面もあった。

※まぁケーブルの色通りだろとは思っていて結論その通りだったんだけど、ボードに挿すとLEDと書かれた印字が見えない向きになってしまうのでまさかと思って念のため確認した。

あとケースのフロントパネルケーブルはどんなマザーボードにも適合できるようにバラバラになってるのでそれぞれマザーボードに挿していく作業がすごくイライラする。効率の意味では本末転倒ではあるが、更に面倒くさい中間ケーブルの自作をすることで満足のいく組立になった。

電子工作でおなじみのデュポン端子なので道具やカラーケーブルは一通りそろってる。

極性が無い電源スイッチ・リセットスイッチは同色ケーブル2本で、極性がある電源LED・HDD-LEDはマイナスを白で元のケーブルと合わせた。

満足。あとはマザーボードに挿すだけ。

ただまぁどれだけ綺麗に収めようとしても、裏配線の無いケースではこれくらいが限界だった。

サーバー機の用途

今回組み立てたサーバー機にはAlmaLinux OS 9 を入れてSambaサーバーを動かしている。自宅で使うのにNASではなくあえてファイルサーバーにした理由として、私は多少プログラムが書けるのでLinuxサーバーにしておくことで独自機能を実装できるためだ。

従来サーバーで実装していたのがこちら。

  • 書きこんだデータを自動的に読み取り専用のフォルダーに移動させる簡易WORM(Write Once Read Many)機能
  • ファイルを暗号化してAmazon S3バケットに保管するアーカイブ機能

加えて、今回新たに実装したのがこちら。

  • 一定時間で自動削除されるTempフォルダー
  • ディスクレベルでの暗号化

これはこのあとまた別の記事で紹介したいと思う。

ということで今回はここまで。

2024年1月1日

まずは、地震により被害を受けられた皆さまに、心からお見舞い申し上げます。

私自身の住んでいるところに影響がありませんでしたが、実家が警報区域内で海沿いのため気が気ではない状況で1日を過ごしました。

取り急ぎ家族の安否確認は取れたので一旦落ち着いたところです。

大きな災害のときネットの意見は割れがちですが、皆さん善意の形が違うだけで、なんとかしたいという想いは共通しているはずです。善意と善意がぶつかって揉めているのを見るとやるせない気持ちになりますね。
※ごく稀に本当に酷いことを言う方もいらっしゃいますが、目立つだけで決して多数派ではありません。そういう方はよほどひどい人生を送られてきたのでしょう。我々にはどうすることもできませんので哀れみの気持ちと共にミュートしましょう。

被災者とひとくちにいっても実際にはいろんな境遇・いろんな性格の方がいらっしゃるので、自粛ムードが配慮を感じて嬉しいという方も居れば、避難生活の中でも日常を感じたいという方もいらっしゃると思います。

いろんな意見があるからいろんな方が救われるという面もあるので、ネット上で無理に意見を戦わせて白黒つけなくても、各々が自分の信念に基づいて良いと思ったことをするのが一番かなと思います※。どちらにも正義があるので戦ったところで平行線です。情報は取捨選択できる時代なので、その時々で自分に合わないものとは一旦距離を置くことが大切なのではないでしょうか。
※ただし、公的機関からのアナウンスには従ってください。

さて、私は日常に戻ろうと思います。
負の感情に飲み込まれることなく、残る連休を満喫し、心身の調子を整えて仕事に戻り経済を回す。被災地の方々には申し訳ないのですが、結局自分にできることは自分が負の感情の発信源にならないことくらいです。
ちょうど年末に色々取り組んでいたので、書きたい記事もあります。

もう新年をお祝いするようなムードではなくなってしまいましたが、それでもこれを最後まで読んでくださった方は命は無事、ブログを読む余裕もあるということで、とりあえず新年あけましておめでとうございます。

既に最悪な始まりではありますが、なんとか頑張って良い1年にしていきましょう。

Fusion 360でラズパイ3B+ with PoEハットのケースを設計したので手順紹介

今回はネットで入手できるラズパイ3B+の3Dモデルを使用してラズパイとPoEハットがピッタリおさまるケースをモデリングしてみたので、備忘録を兼ねて手順をここで紹介することにした。

Fusion360で私がやりたかったケース製作については参考書を見てもちっともわからず海外のYouTubeとかで調べるしかなかったので、同じ悩みを抱えている方が少しでも操作のヒントが得られると良いなと思って記事にしてみた次第である。

私はCADの素人なのでプロから見ると非効率なやり方をしている部分も多々あると思うがご容赦いただきたい。

目次

モデルの入手

ググると簡単に見つかる。

ダウンロードにはAutodeskのアカウントが必要だが、Fusion 360を使用している時点でアカウントを登録しているはずなのでそれでログインしてダウンロードしてzipを展開しておく。

プロジェクト準備~モデル読み込み

まず適当な名前で新規プロジェクトを作成。

次にダウンロードしたモデルをプロジェクトにアップロードする。

私の環境だとアップロード待機に6分ほどかかった。途中フリーズしたようになる場合もあるが10分くらいは我慢。

アップロードが完了したら一旦ファイルメニューから空のデザインを保存しておく。無題のままだとラズパイを挿入したときにエラーがでる。

ラズパイを見つけて右クリックし、現在のデザインに挿入する。見つからない場合はプロジェクト名をクリックすると読み込まれる場合がある。

ラズパイを基準に基盤サイズの矩形をスケッチ

スケッチ作成を押して原点を展開し、その中のXYを選択する。

作成メニュー→投影/取り込み→プロジェクトを選択し、ラズパイ基盤の4辺を選択する。

ラズパイを非表示にして線分作成モードを選択し、スケッチパレットからコンストラクション(補助線)を選択。
線の切れ端から角度に気を付けて真っすぐ補助線を伸ばす。

同じ方法で左上と右下に補助線を引いて交点を作る。

矩形作成に切り替え、左上の交点から右下の交点までの四角形を作図する。(これも補助線でOK)

作成した四角形の辺をそれぞれ選択した後オフセットツールを選択し、スケッチパレットからコンストラクションをオフ(実線に戻る)にしたうえで外側に1ミリのオフセットを作成する。

これで最初のスケッチは完了。

(余談)ラズパイモデルを参照した押し出し高さの調整

ここでは普通のラズパイケースを想定してモデルの高さを利用したサイズ調整をやってみる。実際にはPoEハットが付くので今回この方法は採用しなかったが、一応紹介。

押し出しツールでスケッチ上面を選択し、方向を両側、サイド1の範囲のタイプをオブジェクトに指定する。
ラズパイを表示させて右手に回り込み少し拡大すると、USBの一番上の直線と曲線のつなぎ目を点として選択できる。

これでその点の高さまで押し出しが実行される。一方で下方向はうまく選択できる点が無かったので範囲のタイプを距離のままとし、そのまま矢印をを引っ張って押し出す。

確定させる前に、両サイドともオフセットを1ミリつける。サイド2は専用のオフセット項目はないが、距離欄は足し算が使えるので+1と書き足す。

これでラズパイを基準にした押し出しは完了。
今作った箱は実際にはケースの内部空間になるので割とラズパイサイズギリギリにしているが、今回私はPoEハットを付けるので別の高さ基準を採用した。したがってこの余談部分はキャンセルして次項から私が実際に採用した作業方法で説明する。

PoEハットを想定した押し出し高さの調整

まずは採寸。ラズパイ基盤裏を基準に一番厚みがでるファンのネジ頭までを計測した結果を切上げて、基盤裏から21ミリを確保することにした。

スケッチモードで原点のYZを選択し、ラズパイを表示させて右手に回り込む。
作成メニュー→投影/取り込み→プロジェクトでラズパイの基盤低面のエッジを選択。

作成メニューから点を選択し、スケッチパレットからコンストラクション(補助線)に切り替えて適当にUSBの上あたりに点を打つ。
スケッチ寸法モードに切り替えて取り込んだエッジからの距離を21ミリに設定し、スケッチを修了する。

後は前項の余談で説明したのと同じ要領で押し出しを行う。その際に今描いたスケッチを表示させておいて先ほど作成した点をターゲットに押し出し範囲を指定する。

今回も下方向は一旦矢印を直接引っ張って調整したが、後で設計ミスが発覚してやり方を変えたので後程紹介する。
※あえて今修正方法に言及しないのは、そのまま作業を進めてしまって後で気づいても手戻りを最小限にする修正方法が存在するためそちらを紹介したい趣旨。

これでラズパイがすっぽり埋めこまれた箱が完成。

※コネクタ差し込み口が若干はみ出しているが後で穴が開くので問題ない。

箱を上下に分けて外殻(シェル)化する

ラズパイを非表示にして修正メニューからシルエットを分割を選択。
ビュー方向に天面を選択した後にボディーを選択し、ソリッドボディ―を分割にしてOKをクリック。

これでボディーが上下に分割される。

上のボディを非表示にしてシェルツールで下ボディの天面(切断面)を選択。

外側・2ミリを選択して完成。元の箱がちょうど収まるような外殻が形成される。

上のボディを表示に戻し、外殻化した下のボディーを非表示にする。
底面が見えるようにアングルを変更した後、上ボディーの底面(切断面)を選択。

同じように外側・2ミリで外殻化させる。

ここまでの成果物がこちら。

設計ミスの修正

今回のケースは底面にインサートナットを埋め込んで六角スタンドオフでラズパイを固定する前提で設計している。

使用予定の六角スタンドオフのネジ部分が6ミリあるのだが、基盤天面からケース底面まで6ミリ確保できていないのでこのままだと底面をネジが突き破ることになる。

これを修正するために、まず選択モードに切り替えて左下のタイムラインからスケッチ2を開き、基盤天面から6.5ミリの位置に点を挿入する。

スケッチを修了すると元の状態に戻るので再度タイムラインから押し出しを開き、サイド2の範囲のタイプをオブジェクトに変更した後に先ほどスケッチした点を選択する。修正スケッチの段階で0.5ミリのオフセットを取ったのでここではオフセットは追加しない。

押し出しの修正を完了させると後続のタイムラインは自動で更新されるのでボディの分割やシェルの作成をやり直す必要はない。
計測してみるとちゃんと基盤天面からケース底まで6.5ミリ確保されている。

ケース底にネジ止め用の固定土台を作成

スケッチモードに切り替えて上ボディ―とラズパイはを非表示にし、ケース内底面をクリックする。

スケッチモードに切り替え後はラズパイを表示させ、投影/取り込み機能で4つのネジ穴の中心点を取り込む。誤ってネジ穴内周を選択しないよう注意。

固定土台のサイズはラズパイ基板のネジ頭用の余白に直径を合わせることにした。

ラズパイを非表示にして取り込んだ4つの中心点を基準に直径6mmの円を4つ配置する。

同様に4か所にそれぞれ直径3.5mm, 3mm, 2.5mmの円を追記する。

これはインサートナット挿入用に次のような段を作る為の準備である。

スケッチを終了して押し出しモードに切り替え、Ctrlキーを押しながら先ほどスケッチした円周の最外周の面を選択していく。
細かいので拡大しながら選択すると良い。Ctrlキーを離してしまうと複数選択が解除されるので注意。


範囲のタイプをオブジェクトにしてラズパイの基盤底面を選択するのだが、ボディが邪魔で狙えないので一旦非表示にしてラズパイを表示させて選択する。

ただしボディを非表示のまま押し出しを確定してしまうと次のようにボディが分割されてしまう。

これを避ける為には再度ボディを表示させた状態でOKをクリックすれば良い。

押し出しが終わるとスケッチは非表示になってしまうので再度表示させて外から2番目のリングを選択する。

先ほどと同様の方法で基盤裏をターゲットに押し出しを行うが、その際にオフセットを1mm指定する。

最後にもうひとつ内側のリングに対して同様の操作をオフセット3mm指定で実施する。

上から覗き込んだときにこんな風に段々になっていればOK。

上蓋のネジ止め穴を設計

実は上蓋のネジ止め穴は試作で失敗を経験済なので反省を活かして下図の右の方式で設計することにした。

下から覗き込むようなアングルに変更して下側のボディを非表示にし、スケッチモードで上蓋の内側天面にスケッチを描く。

余計なスケッチを非表示にしてから前回同様に基盤ネジ穴の中心点を取り込む。

ここでネジ頭とドライバーの直径を計測。

少し余裕を見て穴を6ミリに決定。壁厚は少なくとも1ミリ欲しいので8ミリの柱を形成することにした。

先ほど取り込んだネジ穴中心点を基準に8ミリ円をスケッチしてスケッチ終了。

次に高さを計算。
ラズパイ基盤底面からPoEハット基盤天面までが約12ミリ。(計測位置で微妙に異なるので12ミリとして丸めた)

ここに5ミリ高さのスタンドオフスペーサーを付けるので基盤底面を基準に17ミリの位置に上蓋の柱の先端が来るようにする。

基準点を作るため原点のYZ面にスケッチを作成。

基盤底面を取り込んでから適当な位置に点をスケッチしたら、基盤底面と点の距離を17ミリに指定してスケッチを終了する。

もう一度上蓋を内側から覗き込むアングルに変更して押し出しツールで4つの円をCtrlを押しながら選択。
範囲のタイプをオブジェクトにして先ほどスケッチした点を指定してOK。

次に天面のスケッチ。点の取りこみはいつも通りなので割愛し、円はネジ穴用の3ミリ・ネジ頭の窪み用の6ミリをそれぞれスケッチする。

まず外周の押し出し。4か所選択して範囲のタイプをオブジェクトに指定し、裏面に回り込んで柱の先端を選択。オフセットに-1ミリを指定してOK。

天面に残った円柱部分も同じ方法で押し出すがここではオフセットを指定せずに単純穴にしてしまう。

完成したのがこちら。

プラグ穴の加工

下のボディとラズパイを表示させた状態でケース内側に回り込みスケッチを作成。

スケッチモードに入ったらまずHDMI端子の形状を取り込む。
ボディは邪魔になるので一旦非表示にし、HDMI端子の正面に回り込んで取り込み作業を行う。
真横から見てしまうと奥行が分からず奥の線を取り込んでしまうため角度を変えながら作業する。

ラズパイを非表示にしてボディーを再度表示させ、内側に回り込むと綺麗に取りこみできている。

ただ実は拡大してみると繋がっていない線がある。

また、点が見えるのは拡大して繋がっているように見えても実際には重なっているだけで繋がっているわけではないのでこれを繋げる作業を行う。

まずはオブジェクトとのリンクを解除ておく。

具体的には選択モードに切り替えて後ろから平面で見えるようにアングルを調整し、マウスドラッグで取り込んだ線をすべて選択した後に右クリックメニューからリンクを解除する。

次に拘束メニューの固定を使用して曲線パーツをすべて固定する。

窪み部分の直線のつなぎ目は切れているので下側の点を固定する。

選択モードで固定していない直線を掴んでバラバラにしておく。

更にそれぞれの線の端を掴んで角度も元の角度から変更する。また一番下の辺は2つの線に分かれてしまったので片方は削除して良い。

この後、点と点を一致拘束させることで元の形に戻していく際に角度・長さが同じままだと一致拘束させていない方が重なってしまい選択しづらくなるため、角度の変更はそれを避ける準備である。

注意点として、事前準備で角度を変更した際に水平にしてしまうと自動で水平拘束が入ってしまう場合があるので右クリックして削除しておく。

選択モードで一旦エスケープキーを押して何も選択していない状態にしてから拘束メニューの一致を使って点と点を繋いでいく。最初に基準となるパーツを固定したのはこの為。

これで点がない図形が完成。

選択モードで線全体を選択した後、右クリックメニューから標準/コンストラクションで補助線に切り替えておく。

※実際に押し出し加工に使うのはこの線にオフセットしたラインなので実線のままだとリング状の押し出しになってしまう為。

次に0.5ミリのオフセットを指定する。正しく線が接続されていればチェーン選択で順番にクリックして一周分選択できる。

一部未拘束扱いになってしまったが気にせずスケッチを終了する。

あとは通常の押し出しで穴を空けるだけ。

他の穴も同じように処理していくが、Micro USB端子はどこを外周として取り込むのか難しい形状をしているので最大外周を取り込みつつ、曲線部は小さくなるので直線を固定してから一致拘束で曲線サイズが直線に合うように作りこんでいく。

オフセット含めてできた図形がこちら。

なお、円弧と直線の接続が窪みになっているのに気づくかもしれないが、気にしなくて良い。

拡大作業していると忘れがちだけど、これは0.1ミリ以下の話なのだ。どのみちそんな精度でプリントは出来ない。

イヤホンジャックは単に円形なので割愛し、すべて押し出して完了。

USB・LANポートもスケッチは下側ボディーの内側にする。はみ出してスケッチしても問題ない。押し出すときに上下ボディを合わせて対象にできるのでスケッチは片側でOK。これはただの四角形にするので適当に4辺ずつ取り込む。

角度に気を付けながら辺を延長し、補助線で交点を作っていく。

次に補助線で矩形を書く。始点・終点ともに交点にピッタリ重ねる必要がある。なお画像で△マークが出ているのは線の中点スナップなので今回合わせたい位置とは違う。拡大等も駆使しつつ交点にぴったり位置合わせをする。

次に実線でオフセットをスケッチする。色々と線が重なってオフセット元の図形選択を選択しづらいが、最初に交点を作っていない角は矩形の線しか無いので選択しやすい。

スケッチを終了し、選択モードでCtrlを押しながら全て選んでいく。ボディの切れ目で面が分かれている。

次に上側ボディも表示にして押し出し。デフォルトでは表示されていれば一緒に切り取ってくれるが、切り取るオブジェクトという項目を展開すると指定もできるようになる。片側しか切り取り対象にならない場合は確認してみると良い。

SDカード穴・吸気ファン穴の作成

3Dカード取り出し口は背面にスケッチして押し出しで作成する。
今回は幅18mmで作成することにした。これは私のひとさし指のサイズが17mmだったため。
作成方法はこれまで紹介した手法とそんなに変わらないので詳細な説明は割愛。

押し出し後に修正メニューからフィレットを追加している。

ファンの位置はノギスで測って穴あけ。

底面排気口の作成

底面の内側で穴同士を横に繋ぐ補助線を作成。

このあとスケッチパレットは実線に戻しておく。
作成メニュー→スロット→スロット全体を選択し、上の補助線の中点(△が出る位置)を始点としてクリック、終点をそのまま真っすぐおろして下の補助線の中点をクリックしたあとサイズ3ミリを入力して確定。

作成したスロットを選択メニューから範囲選択で選択し、矩形パターンツールで対称指定する。
横向きの矢印を引っ張って数量を指定、最後は距離・数量を数値で微調整して完了。数量は奇数を指定しないと対象にならない。

私は20ミリの7個を指定した。

いつも通り押し出しを実行して完了。

ゴム脚シールの位置合わせ用の窪みを作成

下ボディーの底面からスケッチで表のミリネジ土台からスケッチを取り込んだあと、正面側の2つはリンクを解除して正面端からの寸法を個別指定する。

押し出しツールで0.4ミリだけ凹ませる。

仕上げ

外側の四隅に2mmフィレットを追加。

印刷に備えて上側ボディをひっくり返す。
具体的には選択ツールで上側ボディを選択してから移動ツールで180度回転と横スライド(くっ付いてなければ距離は適当でOK)を適用する。

これで完成。

STLファイルのエクスボート時にラズパイごとSTL化するんじゃないかと心配してたけどそんなことは無かった。非表示でやったからかもしれない。

免責時効

これを実際に印刷してうまくいくのかどうかはまだ分からない。
個人的にかなり怪しいと思っているのがHDMI上の0.2ミリのところ。

これは印刷できたとしても強度が出ないので取っ払ったほうが良いかもしれない。
まぁダメだったらペンチで切るか。

オーディオジャックの上も0.4ミリしかないので割と怪しいのだが。

印刷してみてうまくいかなかったらタイムライン上でどこがまずいのか試行錯誤しながら修正しく必要がある。

冒頭で書いたように記事公開の目的は操作のヒントを見つけていただくことなのでこの通りやってうまくいかないと言われても責任は負いかねる旨あしからずご了承いただきたい。

以上

Arduino Dueでオシロスコープに画像を表示してみた。

これは前回の続き記事となる。
thom.hateblo.jp

前回は円を描いただけなんだけど今回はモノクロビットマップデータを表示してみた。

といっても適当なモノクロ画像がなかったのでとりいそぎHello Worldと書いた画像を使用。

出力した結果はこちら。

波形はこんな感じ。


これ実は1マス5ミリ秒くらいに調整するとすごく分かりやすい波形になっていて面白い。


ソースコードはこんな感じで配列化した画像データが直書きされている。

※はてな記法でうまくソースコードを認識しなかったので画像で貼り付けました。もし真似したい方がいれば頑張って写経してください。

容量節約のため黒点が存在するところだけX,Yデータを格納している。

今回は150x150サイズの画像を使ったのだがDAC出力には0~4095を指定できるのでそのまま入力するとかなり表示が小さくなってしまう。そこでソースコード上で座標を10倍している。それでもX・Yの最大は1500なので20倍で良かったかもしれない。オシロ側で表示位置とサイズを調整する際にけっこう拡大する羽目になってしまった。


画像をデータ化する際は次のPythonプログラムを利用した。

from PIL import Image

img = Image.open('sample.png')
width, height = img.size

x_list = []
y_list = []

for y in range(0, height):
    for x in range(0, width):
        if sum(img.getpixel((x, y))) == 0:
            x_list.append(x)
            y_list.append(y)

print(x_list)
print("--------")
print(y_list)

PILライブラリで画像の縦・横サイズ分ループでピクセルごとのカラーを取得し、R・G・B値の合計が0なら黒と見做してX・Y座標をそれぞれのリストに格納していくという処理である。

1点注意が必要なのはピクセルのY座標とオシロのY座標が反転して表示されるということ。

プログラム上で工夫しても良いけど、画像の上下反転の方が楽なので今回はこんな感じで反転させてからデータ化した。

当初やりたかった任意画像の表示ができたので今回はここまで。

Arduino DueのDAC機能を使ってでオシロスコープに円を描いてみた。

今回はオシロスコープのXYモードを利用してArduino Dueで円を描いてみた。

オシロスコープのXYモードでは2つのアナログ電圧を座標としてプロットすることができる。

CH1をX軸、CH2をY軸として、それぞれの電圧の位置に輝点が現れる。

電圧を変化させると新しい場所に輝点が現れるが、古い輝点は一定時間画面に残り続けるため、これを使うと任意の絵を表示させることができる。

どれくらいの時間輝点が残るかは波形を同時に表示させると分かりやすい。
円を描くための電圧としてCH1にサイン波・CH2にコサイン派を入力しているのだが、下図では谷・山のパターンが7回ほど繰り返されているのが分かる。


波形の横軸1マスが50ミリ秒という設定にしているので50ミリ×12マスで600ミリ秒。約0.6秒間輝点が残る計算である。
つまり、見ている瞬間は7周分の円が重なって描かれていることになる。

これを1マス10ミリ秒(全体で0.12秒)に変更しても1周分は確保できるのでキレイに円が描ける。

1マス5ミリ秒(全体で0.06秒)では1周分の波形が確保できないので欠けた円がくるくる回転するような表示になる。

原理的にはこんな感じ。

あとはアナログ電圧をどうやって確保するかが問題である。
Arduino Uno R3やRaspberry Piでアナログ電圧を出すのは外部にデジタル・アナログコンバーター(DAC)を準備する必要があるので割と面倒くさい。

Arduino Uno R3のアナログピンは入力専用で、出力の調整はPWMしか用意されていない。PWMでは固定電圧をON・OFFする間隔を調整することで疑似的に出力を落としてモーター速度やLED照度の調整に使っているのだが、これをオシロで見ると出力どおりON・OFFの矩形波になってしまう。

最近発売されたArduino Uno R4には本当のアナログ出力ができるDACが付いているのだが、DACに使えるピンが1つしかないため今回やりたりX・Yの二軸出力はもう一つDACピンが欲しい。

そこで今回はArduino Dueという製品を調達してきた。
これはArduinoシリーズの中でもDACが2つ付いている珍しいタイプで今回の目的にちょうど良い。

他にもESP-WROOM-32にもDAC出力ピンが2つあるらしいのでそちらを持っている方はそちらでも良いと思う。

コードはこんな感じ。

double i=0.0;
void setup() {
  analogWriteResolution(12);
}
void loop() {
  analogWrite(DAC0, 2048 + 2048 * sin(i));
  analogWrite(DAC1, 2048 + 2048 * cos(i));
  i+=0.01;
}

オシロの初期の設定だとマス目の中心が0Vなので右上に小さく表示されてしまう。

オシロのつまみでCH1とCH2をそれぞれ位置とサイズを調整することで画面いっぱいに表示できる。

今回はシンプルなコードでただの円を表示させただけだが、今後はもう少し何か絵っぽいものを表示させてみたい。
また今回は手軽にやりたくてデジタルオシロを使ったけど、アナログオシロの方が味があって良さそうだ。
KENWOODのCS4135というオナログオシロを持っているので暇があれば試してみたいと思う。

参考サイト:
rokkophysicsclub.github.io

以上

Raspberry Pi Picoでマイクラ作業用にマウス・キーボードマクロ作成

久々にMinecraftで遊んでいるんだけど、土台敷き作業が結構面倒くさい。

操作としてはShift+S+D+マウス右を押しっぱなしにするだけなんだけど、気を抜くとシフトが外れて落下するため自動化することにした。

ソフトウェアマクロという手もあるけど途中で手動ホイール操作を加えたり、頻繁にオフにしてアイテムをインベントリにセットしなおしたりするので物理スイッチでオフ・オンできるハードウェアマクロの方が使い勝手が良い。

今回選択したのは買ったまま1年以上眠っていたラズパイPico。
最初はいつもどおりArduino Leonardoで作るつもりだったんだけど行方不明だったので慣れないラズパイPicoを試してみることにした。

構成はシンプルにGP15ピンとGNDをスイッチを繋げただけ。

スイッチは以前作った実験用のトグルスイッチ。シンプルで使いやすい。
thom.hateblo.jp

調べてみるとラズパイPicoでキーボードマウス入力をシミュレートするには標準のMicro PythonではなくてAdafruitから出てるCircuit Pythonを使うらしい。

コードはこんな感じ。

import usb_hid
from adafruit_hid.mouse import Mouse
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycode
import digitalio
from board import *
import time

mouse = Mouse(usb_hid.devices)
kbd = Keyboard(usb_hid.devices)

LED = digitalio.DigitalInOut(GP25)
LED.direction = digitalio.Direction.OUTPUT
SW = digitalio.DigitalInOut(GP15)
SW.direction = digitalio.Direction.INPUT
SW.pull = digitalio.Pull.UP
mode = 2

while True:
     if SW.value == False:
         LED.value = True
         if mode == 1:
             mouse.click(Mouse.LEFT_BUTTON)
         else:
             kbd.press(Keycode.SHIFT)
             kbd.press(Keycode.S)
             kbd.press(Keycode.D)
             time.sleep(3)
             mouse.press(Mouse.RIGHT_BUTTON)
     else:
         if mode == 1:
             pass
         else:
             LED.value = False
             mouse.release(Mouse.RIGHT_BUTTON)
             kbd.release(Keycode.S)
             kbd.release(Keycode.D)
             time.sleep(1)
             kbd.release(Keycode.SHIFT)
     time.sleep(1)

ちなみにmodeが1のときはゾンビピグリンを殴るだけのマクロなので今回は関係ない。

マクロ切替はハードコーディングによる変数値の変更で行うという雑な仕様だけど目的は果たしている。

参考にしたのはこちらの記事。
hf-labo.net

1点だけ私の環境が記事と違ったのはThonny(Pythonエディタ)のポート選択でPicoが表示されず、CircuitPython CDC controlを選択したこと。

これはひょっとするとMicro PythonのUF2ファイルを導入せずに最初からCircuit Pythonを入れたためかもしれない。

おわりに

PCやマイクラに詳しい方からするとこんな単純なことのためにわざわざマイコンを持ち出して自前でHIDデバイスを作るのは大げさだと思うかもしれない。スニーク固定はゲーム機能としてあるし、そもそもロジクールのG304マウスを使っているのでG-HUBでマクロ化するという手もあった。

そんなことしなくてももっと楽にできるのにと思ってモヤモヤした方もいると思うけど、私にとっては今回の一連の作業を含めて道楽の一部として楽しんでいるので大目に見ていただきたい。

それに今回ようやく眠っていたラズパイPicoの活用先が見つかって良かった。
とりあえず買ってみたもののしばらく使っていなかった理由としてはなんだかんだ慣れ親しんだArduinoを手に取ってしまうということが大きい。

Pythonの方がCよりも文法的にスッキリしてて初心者に優しいからPicoの方が初心者向けだという意見も目にするんだけど、発売日の差でネットの情報量では圧倒的にArduinoに軍配が上がるためまだまだArduinoの方が調べやすい。

ただ実際に使ってみたところ欲しい情報や参考にするコードはすぐに入手できたし、そろそろPicoに関してもネットの情報が成熟してきたなと感じる。
次から何かつくるときはPicoを第一候補として選定しても良いかもしれない。

なによりArduinoより安いのに高性能。唯一ネックだった情報量の問題が解消されつつあるなら使わない手はない。

以上

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。