作業部屋のパソコン机を作る

作業部屋で、CNC、3Dプリンターなどを制御する為、以前に中古パソコンを買ってみたー、本当は自作PCを組むつもりだったけど、中古パソコンで性能がそこそこの物がかなり安く入手できる事を知ったのと、メーカー製PCを一台も持っていない事もある為で、HDD仕様だけど、余っている240GBのSSDを追加してシステム関係を移動、やはり余っていたメモリに交換して8GBにした、モニターは、以前メインPCで使っていた24インチを使った、性能的にも能力的にも、これでも十分(一応i7なので)となった。

パソコンを置く台だが、エレクタもどきで、適当な物が余っていたのでそれを組み立て(車輪付き)、キーボード台を自作して改造した。

キーボード台は、ホームセンターおなじみの「パイン集成材」を利用した、この板は、反りが少なく、頑丈で加工しやすい特徴がある。

また、スライドレールで長さが丁度良い物が余っていた(台所の引き出しに使うつもりで間違った長さを買った余剰品が沢山ある・・)ので、それを取り付ける為のガイドを作り、取り付けた、適当な板を張り合わせて、丁度良い大きさに加工した、エレクターへは、タッピングビスで固定した。

「木」は加工が簡単で、それなりに強度があり、適度に柔軟なので、DIYには都合の良い材料で助かる、ただ、切断時(電動丸ノコ)に切りくずが凄いので外で加工する事になり、「晴れていて昼」のみ加工できる。

エレクタもどきの天板は、そんなに重量のある物を置かないので、5mm厚のMDFを使ったが、湿気などを考慮して、何か塗る必要がありそうだ・・・

左右の取り付け位置が微妙で、多少「建てつけ」が悪いが、強度も十分でちゃんと使えそうだ。(このキーボード台も何か塗った方が良いだろうなぁ・・)
※このスライドレール、途中で止める機構が無いので何かストッパーが必要だな・・
※現状、キーボードを乗せた状態で引き出しを閉める事が出来ないので、要改修が必要なのに気がついた・・

旋盤を作業台に載せた話

以前に購入した入門用小型旋盤を使っていたが、主軸のベアリングが駄目になったようで、削った場合に「模様」が入るようになった。
分解して、ベアリング交換をしようと思っていた矢先、山梨に引越した。

本業が一段落したので、直そうかと思っていたが、「小型」(チャックが80mm)で、剛性が足りないと思っていた、そしたら、ヤフオクで少し大型の旋盤を売っているのを見つけてしまった。
通常このサイズ(チャックが125mm)は、120キロ以上なのだが、「振り」が短く80キロ程度だった、それに「送り」は金属ギヤーで、ブラシレスモーター、プーリー駆動(静か)、インバーター速度制御、かなり充実した内容だった。

このサイズと重さなら、何とか屋内に設置可能と思いポチッた(本来は、中古の本物旋盤が欲しいが、重量が少なくとも数百キロ以上あり、三相200Vなので普通の部屋に置くのは厳しい)、しかし、物が来たが、工作部屋の整理が進んでいないので、しばらく玄関に放置していた。
先日、ようやく、工作部屋のスペースを確保して、旋盤を設置した。

80キロだと大人二人なら何とか持ち上げられるが、知り合いをその為に呼ぶのも気が引ける、何とか一人で作業台に載せられないか・・
しばし考え、パソコン台用を向かい合わせにして、バイクを車で運ぶ際に使う、ラチェット式タイダウン、サブベルト、通常のタイダウンなどを駆使して、少しづつ引き上げ、作業台に載せる事ができた。

作業台は、「エレクター」もどき、ホームセンターではお馴染みのアイテムで、分解や組み立てが簡単で、高さや大きさ、板の枚数が自由に選べ、かなりの重さに耐える。(以前から持っていたものを再利用した)
ただ、天板は、骨構造なので、ホームセンターで購入したメラニンボードを適当に切り、載せている。(表面がスベスベで油が染み込まず、掃除が楽)

この旋盤の刃物台は、以前の物より少しばかり大きく、剛性も高い、そこで、以前使っていた10mm角より少し太い12mm角のホルダーを新たに購入した、海外ではかなり安く売っているが、送料が「重い」と高い・・、それでも国内で買うより十分安く、チップも一通りついている。

主軸の触れは問題なく、三爪の保持では0.05mmほどあるが、これは、三爪の特性と、このスクロールチャックの性能で、まぁ許容範囲だろうと思う。

貫通穴は、35mmの丸棒が余裕で通る。
※その為、MT3などのホルダーを取り付けたい場合は、アタッチメントを用意する必要がある。

モーターは回してみたが、何の問題もなくスムーズで静かだ、回転速度も安定しており、自動送りも問題なく機能している。

早速削ってみたいとこだが、切子を避ける板などや、照明を準備するのでそれが出来たら紹介しようと思う。

簡易二重窓を取り付ける

大月に越して、1年が経とうとしている。
12月に入って、寒い日が続くようになった、大月は、都内に比べると5度~10度は温度が低いと思う。
家があるのは、大月市内より山寄りで、少しだけ標高も高い、今日の朝は「-8度」くらいだった・・
一軒家は、以前に住んでいたアパートに比べて、機密性が低いのか、かなり寒く、暖房器具が欠かせない。
夜に作業をしていると、寒いのでファンヒーターやストーブを使うが、燃料代がバカにならないので、以前にホームセンターで提案していた、簡易二重窓を付けてみた。
中空のポリカーボ板と、それを囲う枠やレールなどで構成されていて、かなりお手軽に作る事ができて、それなりに安いコストでも効果は抜群と言う触れ込みだった。(どのくらい効果があるのかは、これから判ると思う)
ただ、普通に考えて、窓1枚では、機密性は最悪で、ガンガン暖かい空気が逃げてしまう、また、結露が凄い。

まず、計測。
しかし、メジャーで正確な計測は意外と難しい。
また、窓枠が厳密に長方形とは限らないし、角が直角とも限らないので、最終的には現物合わせとなる。
窓のレールは、上用の深い物と、下用の浅い物があり、ホームセンターのサンプルでは、左右のレールは、上と下のレールを囲う少しだけサイズが異なる物だったが、45度にカットして、共通の物とした。
※自分では正確に切断したつもりでも1mmくらいはずれてしまう場合があった、あんまし器用とは言えない・・
レールは、両面テープで貼るので、お手軽だ。
カットは、ジグソーで行った。
※ポリカーボの板はカッターで切れるが、長い直線を切るのはそれなりに難しい、工作用に買ったアルミのコの字アングルをガイドに使ったが、力加減が難しく、気を抜くと簡単にズレてしまう。

ホームセンターのサンプルでは、カットは垂直にして窓枠を組んでいたが、仕上がりを気にして、45度カットにして合わせたが、45度のカットが中途半端で正確性に欠け、隙間なく綺麗に合わさるまでには至らなかった・・
イマイチな仕上がりとなったが、まぁ、及第点としておこうw。

長方形に仕上げたつもりだが、微妙に台形となっており、イマイチだが、レールの深さがそれなりにあるので、隙間はほぼ無い。

外の窓は10.6度

中の窓は21.9度
と、10度くらい温度差があるので、かなり効果があるものと思う。

RXマイコン関係ソースコードを整理する

RX66T関係を追加する過程で、RX関連ソースコードを整理した。

今まで、RX24Tに始まり、RX64M、RX71M、RX65Nとサポートデバイスを広げてきたが、RX66Tを加えるにあたり、重複しているファイルや、醜い部分を整理した。
基本はRX64Mとなっている。
・RX64M、RX71Mはほぼ同じ
・RX651/RX65Nは、微妙に異なる
・RX24Tは別品種(割り込み関係が異なる)
・RX66Tは、RX24TとRX64M系の中間的
こんな感じだが、デバイスのレジスター関係は、全てにおいて共通部分が多く、共有出来る。
異なるのは、デバイス(自分のフレームワークでは、ペリフェラルと呼んでいる)の有無。
RX64M、RX71Mは非常に沢山のペリフェラルを持っているが、RX24Tなどは、それに比べて少ないが、中でも「割り込み」ベクターが大きく異なる。
これをどのように表現するかが大きな課題となっていたが、とりあえず、テンプレートにしておけば何とでもなる事が判った。
また、今までは、似ているけど少し異なるような場合は、「#if」などで、分けて凌いでいたが、基本的に各デバイスで、ファイルを分けて対応する事にした。
懸念事項としては、同じコードを全てのデバイス専用ファイルにコピーする必要があり、この場合、一つの修正が、他のデバイスのソースも同じように修正する必要が出てくる・・
一つのファイルで共有して「#if」で細かく分ける書き方だと、かなりトリッキーで読みにくくなる、どちらが良いかは、ケースバイケースで何とも言えないが、保守より読みやすさを優先した。

ペリフェラル:
各デバイスには、「peripheral.hpp」があり、このファイル内で、「enum class」により、「peripheral」型で、利用できるペリフェラルが列挙してある。
この「列挙型」の違いにより、ポートの設定、消費電力設定、割り込み制御など、大まかな動作を分けている、ペリフェラルを直接叩くドライバーは、たとえば割り込みベクター型の違いを考慮する必要が無いように実装してある。

RX24Tのペリフェラルでは、割り込みベクターは、通常ベクターに全て割り当てられているが、RX64Mなどペリフェラルが多いデバイスでは、通常ベクターの数が足りずに、グループベクター、選択型ベクターを新規に設け、それらに割り当てるように工夫されている為、そのままでは同じように扱う事が出来ない。
この違いを吸収して、デバイスドライバーを共通化する為、考えた結果、以下のような実装を行う事でかなりスマートに解決出来た。

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
/*!
        @brief  CMT I/O クラス
        @param[in]  CMT チャネルクラス
        @param[in]  TASK    タイマー動作クラス
*/    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
template <class CMT, class TASK = utils::null_task>
class cmt_io {

...

};

上記はCMTの制御クラスの型だが、「CMT」は、CMTペリフェラルクラスで、CMTの制御レジスターを定義したものになっている、通常CMTは0~3まで4チャネルある。
RX64M、RX71M、RX65Nでは、CMT0、CMT1の割り込みは「通常」ベクターだが、CMT2、CMT3は「選択型」ベクターとなっていて、割り込みの設定手順が異なる。

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
/*!
    @brief  CMT 定義基底クラス
    @param[in]  base    ベース・アドレス
    @param[in]  per     ペリフェラル
    @param[in]  INT     割り込みベクター型
    @param[in]  ivec    割り込みベクター
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
template <uint32_t base, peripheral per, typename INT, INT ivec>
struct cmt_t {

...

};
#if defined(SIG_RX24T) || defined(SIG_RX66T)
    typedef cmt_t<0x00088002, peripheral::CMT0, ICU::VECTOR, ICU::VECTOR::CMI0> CMT0;
    typedef cmt_t<0x00088008, peripheral::CMT1, ICU::VECTOR, ICU::VECTOR::CMI1> CMT1;
    typedef cmt_t<0x00088012, peripheral::CMT2, ICU::VECTOR, ICU::VECTOR::CMI2> CMT2;
    typedef cmt_t<0x00088018, peripheral::CMT3, ICU::VECTOR, ICU::VECTOR::CMI3> CMT3;
#elif defined(SIG_RX64M) || defined(SIG_RX71M) || defined(SIG_RX65N)
    typedef cmt_t<0x00088002, peripheral::CMT0, ICU::VECTOR, ICU::VECTOR::CMI0> CMT0;
    typedef cmt_t<0x00088008, peripheral::CMT1, ICU::VECTOR, ICU::VECTOR::CMI1> CMT1;
    typedef cmt_t<0x00088012, peripheral::CMT2, ICU::VECTOR_SELB, ICU::VECTOR_SELB::CMI2> CMT2;
    typedef cmt_t<0x00088018, peripheral::CMT3, ICU::VECTOR_SELB, ICU::VECTOR_SELB::CMI3> CMT3;
#endif

上記のように、テンプレートパラメータで「INT」(割り込みベクター型)を設ける事で、cmt_t クラスは、どの型のベクターなのかを意識しなくて済むようになっていて、「typedef」だけで対応できる。

cmt_io クラスでは、ベクターの型を元に、割り込み設定の方法を分ける事ができ、面倒な「#if文」から開放される。
また、C++ では、ベクター型の違いによる分岐は、コンパイル時に決定できるので、最適化により、余分の分岐一切が無くなるので、速度の面もリソースの面も好都合となる。
このような仕組みは、C言語だと、スマートに実現する事は難しい、C++ が組み込みマイコンのプログラムに向いた言語である事の一例であると思う。
※C言語プログラマは、#define で実現可能と思うかもしれないが、#define では、正確で厳密な「型」チェックは行われないし、構造的や論理的に誤ったコードをエラー無くコンパイルしてしまう可能性があり、テンプレートとは雲泥の差がある。

C++ のテンプレートでは、構造的や論理的に誤った構造は、「ほぼ」エラーになるので、最初の設計が必要十分な要素を詰め込んであれば、自ずと正しい方向に誘導してくれる感じがある。
大雑把に言うと、コンパイルエラーが無くなったら、プログラムも正しく動く事が多いとも言える。

自分が実装したソースでは、「#define」でマクロ的な定義を行う事は一切していない。