Gen6 に Smart Controller を実装する
- カテゴリ: 3Dプリンタ
- 投稿日時: 2017/11/25(土) 23:49:42
AVRマイコンの換装成功に気を良くして、Gen6 縛りでの更なる改善に勤しむことに。
SD Ramps の実装で PC の依存率は減りました。となれば次に目指すは完全な PC レス化。LCD ディスプレイとロータリーエンコーダで操作パネルを装備したいです。
この手のものはメッチャ沢山あり何が使えるのかよくわからなかったので、よく調べもしないで適当にこれを買ってみました。
RepRapDiscount Smart Controller。本来は Ramps 1.4 に取りつけることを想定したものです。LCD は 20×4 のキャラクターディスプレイ。裏側にはフルサイズの SD カードスロットもついています。783円。 程なく届きました。発注から到着まで19日間、発送元は北京のようです。あ、上のバナーは別のショップです。すみません。
さて、もちろんポン付けで使えるとは思っていないので、まずは Marlin でピンの割付をしてコンパイルだけしてみようと考えました。SD Ramps の時のようにメモリが足りないなんてことがないかを、事前に確認するのです。っていうか、発注する前にやっとけって。
Gen6 側の I/O は、たぶん足りるだろうと勝手に思ってました。Gen6 には RS-485 があるんです。ホントに初期の頃の 3D プリンタ用コントロールボードには大抵ついていたようです。もちろん使ってません。なので基板を改造してコントローラチップを外してしまえば、最低でも 4 ピンは確保できるだろうと。
RepRapDiscount Smart Controller の回路図を当たって I/O を確認。SD カード関係は今あるものを使うのでそれ以外の部分です。元々が Ramps 1.4 用なので、Ramps 1.4 の増設コネクタに接続するための小基板とかあって、なにをどこへ繋ぐのかよくわかりません。紙に書き起こしたり表を作ったりして四苦八苦して導き出した答えは…
必要なデジタル I/O は、LCD に6、操作スイッチ ( ロータリーエンコーダ ) に3、ストップスイッチとブザーで2、計11にもなります。想像よりだいぶ多い。RS-485 を潰すだけじゃとてもじゃないけど足りません。トホホ。
ほぼあきらめムードが漂い始めたところで、いや待てよ、Melzi で LCD コントローラを装備しているマシンはたくさんあるぞと。うちの Gen 6 は AVR マイコンを載せ替えたのでほぼ Melzi 相当。 I/O の数は同じなんだからなにか方法があるはず。
で、見つけました。I2C ( I-squared-C ) Expander というものを使えば、LCD に必要な I/O は2本で済むのですね。
こちらの記事が参考になりました。
I2C display and rotary encoder on Melzi - DIYcrap
1602/2004 LCDと専用I2Cインターフェイス基板 - 趣味の電子工作
なるほど、LCD 用に特化した I2C インターフェイス基板というものがあるのか。
これを使う前提で Marlin を設定することにします。
空いているピンを探すために Gen6 の回路図と Marlin の pins_GEN6.h を見比べていて、妙なことに気づきました。
Marlin の pins_GEN6.h にかかれているのがこれ。
見ての通り、回路図に書かれている I/O のピン配と Marlin の記述が違うのです。正しいのはどちら? 動いているのだから多分 Marlin が正解のはず。現物を当たってみることにしました。 ATMega1284 の足と原点センサコネクタの導通を当たってみました。回路図のとおりです。他も見てみましたがもちろん合ってる。そりゃそうです。ではなぜに?
かなり悩みましたが Web で答えを見つけました。
GHOSTの回路図とピン配置 - マイクロファン ラボ
Mega644版Arduino(Sanguino)・・・アナログ編 - ともの技術メモ
Gen6 は ATMega644 を使っているため、Arduino 互換の Sanguino というものに分類されます。ATMega644 の入出力ポートは PA0-PA7、PB0-PB7、PC0-PC7、PD0-PD7 で32本あります。
Arduino の入出力ピンとして PA0 を 0 ~ PD-7 を 32 と割り付けるのだろうと思い込んでいましたが、正解は PB ポートから始まって PD、PC、PA の順番。更に PA ポートだけは逆順とな。そりゃわからんわ。
互換性とかいろいろな理由があったのだろうとは思いますが、なんでこうなったんでしょうね。DIP 版の足の配置の都合かな。
これらを踏まえてピン番号を決定。
Gen6 Schematic | Marlin | ||||
---|---|---|---|---|---|
Name | PIN | Port | Name | ||
40 | PB0 | 0 | HEATER_BED_PIN | ||
41 | PB1 | 1 | FAN_PIN | ||
EXTR DIR | 42 | PB2 | 2 | E0_DIR_PIN | |
EXTR EN | 43 | PB3 | 3 | E0_ENABLE_PIN | |
EXTR STEP | 44 | PB4 | 4 | E0_STEP_PIN | |
MOSI | 1 | PB5 | 5 | (for SD) | |
MISO | 2 | PB6 | 6 | (for SD) | |
SCK | 3 | PB7 | 7 | (for SD) | |
RXD | 9 | PD0 | 8 | (unusable) | |
TXD | 10 | PD1 | 9 | (unusable) | |
RS485R | 11 | PD2 | 10 | BTN_EN1 | |
RS485D | 12 | PD3 | 11 | BTN_EN2 | |
RS485DE | 13 | PD4 | 12 | BTN_ENC | |
RS485RE | 14 | PD5 | 13 | KILL_PIN | |
HEAT | 15 | PD6 | 14 | HEATER_0_PIN | |
X STEP | 16 | PD7 | 15 | X_STEP_PIN | |
SCL | 19 | PC0 | 16 | (for LCD) | |
SDA | 20 | PC1 | 17 | (for LCD) | |
X DIR | 21 | PC2 | 18 | X_DIR_PIN | |
X EN | 22 | PC3 | 19 | X_ENABLE_PIN | |
OPTO X | 23 | PC4 | 20 | X_STOP_PIN | |
24 | PC5 | 21 | SDSS | ||
Y DIR | 25 | PC6 | 22 | Y_DIR_PIN | |
Y STEP | 26 | PC7 | 23 | Y_STEP_PIN | |
Y_EN | 30 | PA7 | 24 | Y_ENABLE_PIN | |
OPTO Y | 31 | PA6 | 25 | Y_STOP_PIN | |
THERM | 32 | PA5 | ADC5 | 5 | TEMP_0_PIN |
Z STEP | 33 | PA4 | 27 | Z_STEP_PIN | |
Z DIR | 34 | PA3 | 28 | Z_DIR_PIN | |
Z_EN | 35 | PA2 | 29 | Z_ENABLE_PIN | |
OPTO Z | 36 | PA1 | 30 | Z_STOP_PIN | |
37 | PA0 | ADC0 | 0 | TEMP_BED_PIN |
初期の頃にに増設してあった冷却 FAN とヒーテッドベッド関連の I/O も割り付けなおして整理しました。
ちょっとハマったのが、アナログ入力はアナログのピン番号を使うってとこ。デジタル入出力の番号を使っちゃダメなんですな。
Marlin の pins_GEN6.h を改造。ピン配を変更します。
Marlin は未だに 1.1.0-RC7 を使ってますが、Version 1.1.6 の pins_GEN6.h を参考に記述を変更しました。
/**
* Gen6 pin assignments
*/
#if !defined(__AVR_ATmega644P__) && !defined(__AVR_ATmega1284P__)
#error "Oops! Make sure you have 'Sanguino' selected from the 'Tools -> Boards' menu."
#endif
#ifndef BOARD_NAME
#define BOARD_NAME "Gen6"
#endif
//
// Limit Switches
//
#define X_STOP_PIN 20
#define Y_STOP_PIN 25
#define Z_STOP_PIN 30
//
// Steppers
//
#define X_STEP_PIN 15
#define X_DIR_PIN 18
#define X_ENABLE_PIN 19
#define Y_STEP_PIN 23
#define Y_DIR_PIN 22
#define Y_ENABLE_PIN 24
#define Z_STEP_PIN 27
#define Z_DIR_PIN 28
#define Z_ENABLE_PIN 29
#define E0_STEP_PIN 4 //Edited @ EJE Electronics 20100715
#define E0_DIR_PIN 2 //Edited @ EJE Electronics 20100715
#define E0_ENABLE_PIN 3 //Added @ EJE Electronics 20100715
//
// Temperature Sensor
//
#define TEMP_0_PIN 5 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!
#define TEMP_BED_PIN 0 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!
//
// Heaters
//
#define HEATER_0_PIN 14 //changed @ rkoeppl 20110410
#define HEATER_BED_PIN 0 //(16) changed @ kyu 20171111
//
// Misc. Functions
//
#define FAN_PIN 1 //(17) changed @ kyu 20171111
#define FAN_SOFT_PWM
#define SDSS 21 //(-1) //(17) before
//
// Elefu RA Board Control Panel
//
#if ENABLED(ULTRA_LCD)
#if ENABLED(NEWPANEL) && ENABLED(RA_CONTROL_PANEL)
#define BTN_EN1 10
#define BTN_EN2 11
#define BTN_ENC 12
#define KILL_PIN 13
#define BEEPER_PIN -1
#endif
#endif
これだけでは LCD コントローラは有効になりません。有効にするためには Configration.h にある LCD コントローラの中からどれかを選ばないといけません。
どれがいいのかよくわからないので、ひとまず前述の DIYcrap さんの記事を参考に、Elefu RA Board Control Panel を試してみます。
有効にする方法は簡単。Configration.h にある
// Elefu RA Board Control Panel
// http://www.elefu.com/index.php?route=product/product&product_id=53
//
//#define RA_CONTROL_PANEL
の #define 行のコメントを外すだけ。
Elefu RA Board Control Panel は I2C 接続の コントローラらしいです。残念ながらリンク先は生きてません。I2C インターフェイス基板に載っている変換用の石は PCA8574 なのでしょうか。だったらいいな。
なおコメント欄にあるように、LiquidCrystal_I2C というライブラリを Arduino IDE に組み込む必要があります。
LiquidCrystal_I2C
https://github.com/kiyoshigawa/LiquidCrystal_I2C
Arduino のインストールフォルダにファイル一式をコピーして Arduino IDE を再起動すればよいです。自分の場合は C:\Program Files (x86)\Arduino\libraries でした。
さあ、ひとまず Gen6 を接続せずにコンパイルだけやってみますよ。結果は
最大130,048バイトのフラッシュメモリのうち、
スケッチが104,442バイト(80%)を使っています。
通りました。よかった。
配線を引き出します。ロータリーエンコーダ関係は、RS-485 のラインドライバ IC である SN75176AD を外して、基板のパッドから配線を取ることにしました。ついでに ヒーテッドベッドのアナログ入力に行っていた 5V もここから確保。
面実装の IC を外すのも随分慣れましたよ。もちろん無理に外さずとも配線は取れますが、外してしまった方が楽です。
プルアップ / ブルダウン用の R10、R11 もついでに取り外してしまいました。必要ならコントローラ側でやろう。
I2Cインターフェイスを空けるために FAN とヒーテッドベッド用の出力は移設。こちらはMCU の足から直接取りました。
さらにI2Cコネクタの脇にピンヘッダを接着して配線を引き回しておきます。ロータリーエンコーダはここに繋ぎます。
基板改造完了。ぱっと見はあまり変わってません。使った線材が緑色だからでしょう。
基板をマシンに戻し、RA_CONTROL_PANEL を無効にして再コンパイルし書き込み。今まで通り動作することを確認しました。
RepRapDiscount Smart Controller をバラして LCD とロータリーエンコーダを取り外します。一度も通電すること無く分解ってどうなんでしょうwww
いまさらだけどこれを買う必要はなかったですね。バラバラで部品で買ったほうが安かった。ロータリーエンコーダなんて5ケで2ドルとかだし、LCD も IC2 インターフェイス付で4ドルくらい。まあそんなこともあります。
さあ追加部品の発注です。IC2 インターフェイス FC113 というものです。いや型番はよくわかりません。
一個70円。到着までに要した日数は2周間。あてもありませんが2つ買いました。安かったので。 コントローラをつくります。ユニバーサル基板の端切れを加工して LCD に共締めし、ロータリーエンコーダとプッシュスイッチをのせます。
LCD に IC2 インターフェイスを取り付け。ヘッダピンは付属してました。
各部配線。4芯のフラットケーブルを2本使いました。操作スイッチ側に GND が必要なので配線を分岐します。元々の RepRapDiscount Smart Controller は10芯を2本使いますのでだいぶ省スペース。
本体に取り付け。RA_CONTROL_PANEL を有効にして再コンパイル。電源投入。
おお、よく見る画面が表示されました。
でもよく見ると表示がおかしいです。現在の温度、現在の座標が表示されてません。
ロータリーエンコーダでメニューの操作はできるし、各軸の動作やヒーター関連も正常に操作できます。表示だけの問題のよう。
I2C インターフェイス基板をよくよく見てみると、載っている石は PCA8574 ではなく PCF8574T でした。これが原因かな?
Marlin の Conditionals_LCD.h を調べると、PCF8574 の記述があるコントローラは LCD_I2C_SAINSMART_YWROBOT ですね。
Configration.h の
// Sainsmart YW Robot (LCM1602) LCD Display
//
#define LCD_I2C_SAINSMART_YWROBOT
の #define 行のコメントを外します。
あと、 Conditionals_LCD.h に書いてある通り、ライブラリも入れ替えます。
LiquidCrystal_I2C library
https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home
もちろん pins_GEN6.h の記述も変更。変更箇所は割愛。
出ました。もろもろバッチリ表示されてます。使い勝手は上々です。PC をつけっぱなし繋ぎっぱなしにせずとも一通りのことができます。こりゃ流行るわけだわ。
いつか気が向いたらケーシングとか考えますかね。まあ当分はこのままでいいや。
いやー、長かった。でもうまくいってよかったです。
コメント
この記事へのコメントはありません