ABS と PLA も試したけど PETG (Polyethylene terephthalate glycol-modified) が最良と思っている。

  • ABS のような反りがなく・寸法安定性が良い
  • PLA ほど耐熱性が低くない
  • ベッドへの接着性が高い・層間の接着性が高い
    • 造形中に剥れて失敗することが少ない
    • ベッドを必要以上に綺麗にする必要もない (基本的にスプレーのりもいらない)
  • 価格的にもABS・PLAとそれほど変わらないか少し高価な程度
  • 強度もあるが硬すぎるというほどでもなく割れにくい (靭性がある)
  • プリント後の加工も可能
    • ABS よりは加工性が悪いが、PLAのような苦労はしない
  • 臭いがほとんどない (ABS みたいな臭さもないし、PLA みたいな甘い臭いもしない)
  • ノズルが詰まりにくい気がする (PLA は詰まりやすい)

一方でPETG独特の問題もある

  • 条件によって糸ひきが多い
    • ノズル付近にゴミが溜りやすく、気をつけないと造形物を破壊する
      • ノズルにシリコンカバーをつけると良い
    • フローが多すぎると危険
      • 100% インフィルとかだと失敗しやすい
  • 適切な温度の範囲が狭い
    • 低すぎると接着性が悪い
    • 高すぎると猛烈に糸をひく

ということで、設定は

  • ノズル 235〜240℃ ヒートベッド 80℃
    • 235℃あたりの低めから徐々にあげて調整するのが良い。糸がひきはじめたら下げる
  • プリント速度は気持ち早め、フローは気持ち低め (98%とか微調整)

にするとうまくいきやすかった。フローは温度を決めてからテストプリントで見極める。接着性が高いのでサポート材の使用量に注意が必要。あんまり細かいところにサポートを入れると外すことができない (Simplify3D はサポート材が剥しやすいほうだけど、それでも)。

まぁとにかく PETG がおすすめ。

RepRapper もつれ無し PETG樹脂製 3Dフィラメント 1.75mm径 1kg 靴の中敷きの注文生産に適した高い研磨性能 (ブラック) -

5.0 / 5.0

備考:ABS のプリントはヒートベッドがあっても難しい

とにかく反り対策が難しい。

特に冬は絶対やめたほうがいい。膨張率が高いおかげで反りが激しいので、設計時にすら気を使う必要がある。当然スライサでプリント方向も気をつけないといけない。

ある程度大きなパーツを作るのはとても難しい。小さなパーツでもベッドとの接着が甘いと剥れてくるし、層を重ねると反ってくる。設計通りに寸法を出すのは、設計段階から気をつけるレベルでないとかなり難しい。つまり構造的に反りにくいようなリブをつけたりする必要がでてくる。

ヒートベッドは万能ではなくて、下層の反りを軽減してベッドから剥離することは防止することはできても、高さがある造形物が途中から反っていくのにはあまり効果がない。これを抑えるには室温を上げる必要があるが、実際はなかなか難しい。冬でも箱があれば30℃程度まで室温を上げられるが、この程度では反り対策にはあまり効果を感じない。

そもそもヒートベッドを100℃前後まで過熱するのは80℃前後まで過熱するよりも、余計にかなり時間がかかる。プリント開始されずもどかしい。ここで時間がかかるとそもそも試行錯誤しにくいということも罠のひとつ。

備考:PLA はプリント後に微調整がしにくい

PLA はとても硬いのでやすりで微調整したり、ニッパーで強引にパーツの一部を切り取るとかがやりにくい。試行錯誤しようと思うとプリントしなおす前にプリント部品を修正してモデルに反映させてとやりたくなるけど、やりにくい。諦めてプリントしなおしたほうが精神的に楽に思えるぐらい。そうすると時間的にもフィラメント的にもコスト増である。

また耐候性がないので屋外で使えず、耐熱性が低いので高温になる場所 (高温といっても60℃ぐらい) では使えないので、用途が限られる。「プリントしやすい」以外は利点があまりないと感じる。けど肝心のプリントしやすさも、ノズルの詰まりやすさでスポイルされる部分がある (フィラメントに少量油を塗るオイラーが必要)。

  1. トップ
  2. tech
  3. 3Dプリント用の素材のオススメは圧倒的にPETG

工具用のバッテリーを流用する場合、以下のようなメリットがある。

  • 出力電流がそれなりとれると期待できる
  • 入手性が良く、性能が安定している。サードパーティの互換バッテリーがあったりもする
  • 充電時間が短い

工具用バッテリーは工事現場で使われるようなものなので、モバイルバッテリーのようなものより要求仕様が高い。サイズも容量にしては大きめで価格も高めだが汎用性が高い。

マキタの 10.8V リチウムイオンバッテリーシリーズには BL1015 (1.5Ah) BL1040B (4Ah) がある。Ah 表記だが、10.8V での Ah だとすると、それぞれ、16.2Wh、43.2Wh になる。このバッテリーは一般向け充電掃除機で使われているので工具以外でも馴染がある人は多いだろう。

マキタ(Makita) リチウムイオンバッテリー BL1015 10.8V 1.5Ah A-59841 -

5.0 / 5.0

マキタ(Makita) 充電式クリーナ 10.8V バッテリー・充電器付 CL107FDSHW -

5.0 / 5.0

ニッケル水素 1900mAh 1.2V 10本直列だと 22.8Wh なので、1.5Ah のモデルはちょっと少なめに感じる。が、リチウムイオン電池は重量効率が良いのと、工具用バッテリーは上記の通り充電器が良くできていて充電速度が早いので、これを汎用的に使えると便利でしょう。

みてみるとバッテリー側には5端子ある。工具側には3端子。残り2つは充電器用っぽい。バッテリー側の表面をよく見てみるとプラスとマイナスの表示が書いてあり、普通に出力が常にされている。おそらく工具用にはプラス・マイナス・サーミスタの3端子だと思う。充電器用についてる2つの端子は何かわからない。(バッテリーの充電バランス用かもしれない)

マキタのリチウムイオンバッテリーは 10.8V のほか、 36V 18V 14.4V 7.2V のラインナップがある。14.4V 以上は価格が非常に高くなり、7.2V は小型工具しかない。基本的に家庭向けには 10.8V 一択に見える。10.8V には差し込み式のバッテリーもラインナップされてるが、スライド式のほうが良い(接点不良が起きにくいので)。

10.8V でもそこそこ電圧が高いので、もしさらに DC/DC コンバーターをつけてもスイッチング電流はそれほど大きくならずにすむ。

10.8V スライド式バッテリーを汎用的に使う


当然メーカー推奨の方法ではないが、バッテリー端子を直接引き出しで独自に使う。

バッテリーに合致する端子を作って、任意の汎用コネクタに変えることを考える。とりあえずは手元の無線機 (KX3) 用に DC φ 2.5mm センタープラスコネクタとして引き出す。

導体を扱うので 3Dプリンタだけではどうにもならない。接点として、今回はt=1mmの SUS430 の板を使うことにしてみた。SUS430 はステンレスの中でフェライト系というもので、比較的加工性が良いらしい。けど真鍮とかのほうがもっと加工性良さそうだし導体抵抗的にもいいかもしれない。

SUS430 板は CNC ミリングで加工した。あまり複雑な形にせず、最悪手で加工しても作れるような形とした。

端子を保持してスライドしてバッテリーと接続する部分は3Dプリンタで作成した。何度か出力しなおしてうまくマッチするようにした。

パーツは2つに分かれていて、ショート防止のため金属の露出部分を減らしてある。

Thingverse に STL をあげた。https://www.thingiverse.com/thing:2841303

電圧

リチウムイオンバッテリー直結だと思うので、素子素性そのままだと思うが念のため。

リチウムイオンバッテリーは1セルあたり3.6V。10.8V は3本直列ということになる。

公称3.6Vで、満充電4.2V、放電ぎりぎりでは2.75V 付近まで下がる。3本直列なら 8.25V〜12.6V。実用的には下限を9Vぐらいにしたほうが安心。

  • 充電直後 12.43V (セルあたり4.14V)
  • 放電後 (マキタの掃除機でLEDが点滅するまで) 10.3V (セルあたり3.43V)

放電直前の電圧はそのうち追試

どれぐらい電流がとれるか

無線機に直結できるように配線してみたので、KX3 で実際に送信してみたところ、充電直後で 2A 程度は全く問題なくとれるようだった。

過電流保護がどこでかかるのか興味が湧いたので、電子負荷でさらに負荷をかけてみることとした。4.3Aまで出ることがわかった。

  1. トップ
  2. tech
  3. マキタ 10.8V スライド バッテリーを活用する (無線機の電源に)

Original Prusa i3 MK2S Kit (3Dプリンタ) を買ってた | tech - 氾濫原 と書いたすぐ1ヶ月ほどあとに MK3 というメジャーアップグレードバージョンが販売されてしまってガックリきたが、部分的に MK3 からアップグレードを取り入れた MK2.5 Upgrade Kit というのが同時に用意され、直近購入ユーザ向けに割引の案内があったため、申し込んでおいていた。それが先日届いたのでアップグレード作業を行なった。

何が変わるか

MK2S -> MK2.5 で以下がアップグレードされる。

  • フィラメントセンサー
  • エクストルーダーまわりが大幅に変わった
    • フィラメントの引き込みがより滑らなくなった
    • ホットエンドファン径が大きくなり静音のファンに
  • ヒートベッドが2重構造に
    • ベース+鉄のプレートで、磁石でくっつくシートが付くようになった
    • 特に大きな造型物を取り外しが楽に

MK2S でも割と十分なので、そんなにものすごく魅力的というほどではないが、フィラメントセンサーは便利で良さそう。

なお MK3 は MK2S から上記以外にも大幅に変わっていてもっと良さそうなんだけど、あいくにもう一台買うような余裕はない。

手順

04 Original Prusa i3 MK2S to MK2.5 upgrade - Prusa3D に従ってやった。

キット内に PETG のフィラメントが入っていて、オマケかな?と思ったら、Gcode は用意してあるので、必要な 3D プリントパーツをまず今のでプリントしてください、という感じだった。そういえば確かに、既に動くプリンタがあるなら部品供給じゃなくて材料供給のほうが効率良いが、予想外だったのでちょっとびっくりした。

X軸はE軸と結合するパーツが全置き換え。E軸は完全に置き換え。地味に大変。

PINDA プローブやキャリブレーションがやりなおしなのも地味に大変だが、勘所は覚えてたので割とすぐ終わったっぽい。まだあまりプリントしてないのでこれからかな。

ファームが新しくなってウィザード形式で初回テストを行ったけど、ちょっとつまづくところがあった。

  • ファンが回ってるのに Selftest failed で終わる
    • Selftest 開始直後にキー入力してしまうと、プリントファンがまわったあとの「プリントファンがまわってますか?(意訳)」というデフォルトで「いいえ」が選択されている質問を一瞬で飛ばして Selftest failed になる
    • 余計なキー入力をしなければ問題なかった
  • Motor - X, Endstop Z エラー
    • X軸とZ軸のエンドストップが入れ替わっているという旨のエラー
    • Z軸のエンドストップって何かというとPINDAプローブだが、X軸を動かしている最中にPINDA プローブが反応する位置にきてしまうと、配線が正しくてもこのエラーが出てしまう
    • Y軸をちょっと動かしてやれば解決
  • First Layer Calibration
    • PLA でやることになっているが、手元に PLA がなくて焦った
    • 余った (巻かれてない) PLAを発見したので手差しで供給して行った
  • プリントファンのファンノズルが割れた
    • この部品はABSでプリントされたものが付属するが、ネジ止めするところを割ってしまった。
    • プリントレイヤー間で割れたので接着剤でつけた。ここはネジを締めること自体にトルクが必要なので、いまいちどこまでやれば止まっているのかわかりにくい
  1. トップ
  2. tech
  3. Original Prusa MK2.5 Upgrade がきたので作業した

MIDI デバイスを Lightroom のコントローラとして使えるプラグインとして MIDI2LR というのがある。市販のMIDIコントローラを使ってLightroomの現像パラメータなどを可変できるというもの。

しかし意外と市販のMIDIコントローラでちょうどいいのがないという問題がある。インターフェイス上の制限から、最適なコントローラは単純なロータリーエンコーダとスイッチの組合せで、常にインクリメンタルな値を送るものとなる。

ちょうどいいのがないなら専用品を作れば良いので、まずブレッドボードレベルで実装してみる。

コード

ロータリーエンコーダを処理するコードがあるのでちょっと長く見えるが main は短い。mbed の USBMIDI ライブラリのおかげ。

LPC11U35 で動かすことを前提として、ロータリーエンコーダのA相・B相を、それぞれ P0_11, P0_12 に繋ぐコードになっている。時計周りのときB相が先行するコードなので、逆のロータリーエンコーダの場合は逆にする。(ロータリーエンコーダの位相方向って決まってないっぽい?)

ロータリーエンコーダのチャタリング対策も入れてる。ググってみるとあんまりやってるコードを見ないけど必要ないのかな?

#include "mbed.h"
#include "config.h"
#include "USBMIDI.h"

class QEI {
	static const int8_t INVALID = 2;
	static uint8_t decode(const uint8_t prev, const uint8_t curr) {
		/**
		 * 4bit decode table
		 *       bit3      bit2      bit1     bit0
		 * [ prev A ][ prev B ][ curr A ][ curr B]
		 *
		 */
		switch ( (prev << 2) | curr) {
			case 0b0000: return  0;
			case 0b0001: return  1;
			case 0b0010: return -1;
			case 0b0011: return  INVALID;
			case 0b0100: return -1;
			case 0b0101: return  0;
			case 0b0110: return  INVALID;
			case 0b0111: return  1;
			case 0b1000: return  1;
			case 0b1001: return  INVALID;
			case 0b1010: return  0;
			case 0b1011: return -1;
			case 0b1100: return  INVALID;
			case 0b1101: return -1;
			case 0b1110: return  1;
			case 0b1111: return  0;
		}
		return INVALID;
	}

	volatile uint8_t prev;
	Timeout timeout;

	void interruptSample() {
		uint8_t ok = sample();
		if (!ok) error = 1;
	}
	
	void interruptDelay() {
		// avoid chattering
		timeout.attach(callback(this, &QEI::interruptSample), delay);
	}
public:
	volatile int position;
	volatile uint8_t error;
	InterruptIn phaseA;
	InterruptIn phaseB;
	float delay;

	QEI(PinName _a, PinName _b, float _delay = 0.005) :
		prev(0),
		position(0),
		error(0),
		phaseA(_a),
		phaseB(_b),
		delay(_delay)
	{
		phaseA.mode(PullUp);
		phaseB.mode(PullUp);
	}

	void enableInterrupt() {
		phaseA.rise(callback(this, &QEI::interruptDelay));
		phaseA.fall(callback(this, &QEI::interruptDelay));
		phaseB.rise(callback(this, &QEI::interruptDelay));
		phaseB.fall(callback(this, &QEI::interruptDelay));
	}

	/**
	 * sample digital input and return ok
	 */
	uint8_t sample() {
		uint8_t curr = phaseA.read() << 1 | phaseB.read();
		int8_t incr = decode(prev, curr);
		prev = curr;

		if (incr == INVALID) {
			return 0;
		}

		position += incr;

		return 1;
	}
};

void show_message(MIDIMessage msg) {
	switch (msg.type()) {
		case MIDIMessage::NoteOnType:
			printf("NoteOn key:%d, velocity: %d, channel: %d\r\n", msg.key(), msg.velocity(), msg.channel());
			break;
		case MIDIMessage::NoteOffType:
			printf("NoteOff key:%d, velocity: %d, channel: %d\r\n", msg.key(), msg.velocity(), msg.channel());
			break;
		case MIDIMessage::ControlChangeType:
			printf("ControlChange controller: %d, data: %d\r\n", msg.controller(), msg.value());
			break;
		case MIDIMessage::PitchWheelType:
			printf("PitchWheel channel: %d, pitch: %d\r\n", msg.channel(), msg.pitch());
			break;
		default:
			printf("Another message\r\n");
	}
}


USBMIDI midi;
QEI encoder1(P0_11, P0_12);

int main() {
	printf("init\r\n");
	encoder1.enableInterrupt();

	midi.attach(show_message);
	while (1) {
		if (encoder1.position) {
			int8_t val = encoder1.position;
			printf("send CC 1 %d 0\r\n", val);
			midi.write(MIDIMessage::ControlChange(1, val, 0));
			encoder1.position = 0;
		}
	}
}

MIDI2LR の設定

MIDI2LR の設定画面を開いた状態でロータリーエンコーダを動かすと、以下のように表示されるので、ここでは Exposure (露出) に割り当てている。

さらにこのボタンの部分を右クリックして、Adject CC dialog を出し、CC Message Type を Two's complement に設定する。

備考

これですんなり動く。ロータリーエンコーダのA相・B相の仕様を確認しないと回転方向が逆になったりするのだけ注意が必要 (ソフトウェア側でなんとでもなるけど)

この調子でエンコーダーを増やしていけば実装上は良いことになる。しかしロータリーエンコーダ1つあたり2ピンのIOを使うので、実際は GPIO 拡張が必要になる気がする。

  1. トップ
  2. tech
  3. mbed USBMIDI で Lightroom 用の MIDI インターフェイスを作る