最終更新: 2017/11/25(Sat)23:49

自作と修理を愛するブログ。トイラジ、電子工作、ボルティー、NucleusCMS 、いろいろゴソゴソやってます
3Dプリンター / 3Dスキャナーも -kyu-

Home

Gen6 に Smart Controller を実装する

AVRマイコンの換装成功に気を良くして、Gen6 縛りでの更なる改善に勤しむことに。
SD Ramps の実装で PC の依存率は減りました。となれば次に目指すは完全な PC レス化。LCD ディスプレイとロータリーエンコーダで操作パネルを装備したいです。

この手のものはメッチャ沢山あり何が使えるのかよくわからなかったので、よく調べもしないで適当にこれを買ってみました。


RepRapDiscount Smart Controller。本来は Ramps 1.4 に取りつけることを想定したものです。LCD は 20×4 のキャラクターディスプレイ。裏側にはフルサイズの SD カードスロットもついています。783円。

★RepRapDiscount Smart Controller
程なく届きました。発注から到着まで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 を見比べていて、妙なことに気づきました。

★Gen6 回路図抜粋
Gen6 の ATMega644P のI/O 部分を抜粋したのがこれ。

★Marlin pins_GEN6.h
Marlin の pins_GEN6.h にかかれているのがこれ。

見ての通り、回路図に書かれている I/O のピン配と Marlin の記述が違うのです。正しいのはどちら? 動いているのだから多分 Marlin が正解のはず。現物を当たってみることにしました。

★Gen6 配線確認
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 SchematicMarlin
NamePINPortName
40PB00HEATER_BED_PIN
41PB11FAN_PIN
EXTR DIR42PB22E0_DIR_PIN
EXTR EN43PB33E0_ENABLE_PIN
EXTR STEP44PB44E0_STEP_PIN
MOSI1PB55(for SD)
MISO2PB66(for SD)
SCK3PB77(for SD)
RXD9PD08(unusable)
TXD10PD19(unusable)
RS485R11PD210BTN_EN1
RS485D12PD311BTN_EN2
RS485DE13PD412BTN_ENC
RS485RE14PD513KILL_PIN
HEAT15PD614HEATER_0_PIN
X STEP16PD715X_STEP_PIN
SCL19PC016(for LCD)
SDA20PC117(for LCD)
X DIR21PC218X_DIR_PIN
X EN22PC319X_ENABLE_PIN
OPTO X23PC420X_STOP_PIN
24PC521SDSS
Y DIR25PC622Y_DIR_PIN
Y STEP26PC723Y_STEP_PIN
Y_EN30PA724Y_ENABLE_PIN
OPTO Y31PA625Y_STOP_PIN
THERM32PA5ADC55TEMP_0_PIN
Z STEP33PA427Z_STEP_PIN
Z DIR34PA328Z_DIR_PIN
Z_EN35PA229Z_ENABLE_PIN
OPTO Z36PA130Z_STOP_PIN
37PA0ADC00TEMP_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%)を使っています。

通りました。よかった。

★IC取り外し
配線を引き出します。
ロータリーエンコーダ関係は、RS-485 のラインドライバ IC である SN75176AD を外して、基板のパッドから配線を取ることにしました。ついでに ヒーテッドベッドのアナログ入力に行っていた 5V もここから確保。
面実装の IC を外すのも随分慣れましたよ。もちろん無理に外さずとも配線は取れますが、外してしまった方が楽です。
プルアップ / ブルダウン用の R10、R11 もついでに取り外してしまいました。必要ならコントローラ側でやろう。

★配線取り出し
I2Cインターフェイスを空けるために FAN とヒーテッドベッド用の出力は移設。こちらはMCU の足から直接取りました。
さらにI2Cコネクタの脇にピンヘッダを接着して配線を引き回しておきます。ロータリーエンコーダはここに繋ぎます。

★基板改造完了
基板改造完了。ぱっと見はあまり変わってません。使った線材が緑色だからでしょう。
基板をマシンに戻し、RA_CONTROL_PANEL を無効にして再コンパイルし書き込み。今まで通り動作することを確認しました。

★LCD コントローラ分解
RepRapDiscount Smart Controller をバラして LCD とロータリーエンコーダを取り外します。一度も通電すること無く分解ってどうなんでしょうwww
いまさらだけどこれを買う必要はなかったですね。バラバラで部品で買ったほうが安かった。ロータリーエンコーダなんて5ケで2ドルとかだし、LCD も IC2 インターフェイス付で4ドルくらい。まあそんなこともあります。

さあ追加部品の発注です。IC2 インターフェイス FC113 というものです。いや型番はよくわかりません。


一個70円。到着までに要した日数は2周間。あてもありませんが2つ買いました。安かったので。

★基板加工
コントローラをつくります。ユニバーサル基板の端切れを加工して LCD に共締めし、ロータリーエンコーダとプッシュスイッチをのせます。

★IC2 インターフェイス
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 をつけっぱなし繋ぎっぱなしにせずとも一通りのことができます。こりゃ流行るわけだわ。
いつか気が向いたらケーシングとか考えますかね。まあ当分はこのままでいいや。
いやー、長かった。でもうまくいってよかったです。

コメント

この記事へのコメントはありません

コメントを投稿

( *は必須項目です )

%3c%69%6e%70%75%74%20%74%79%70%65%3d%22%68%69%64%64%65%6e%22%20%6e%61%6d%65%3d%22%6e%70%5f%70%72%6f%74%65%63%74%62%79%6d%64%35%22%20%76%61%6c%75%65%3d%22%39%30%62%38%62%35%35%66%31%34%65%64%32%34%65%37%33%34%38%38%63%61%36%30%39%63%30%33%61%36%39%38%22%3e %3c%69%6e%70%75%74%20%74%79%70%65%3d%22%68%69%64%64%65%6e%22%20%6e%61%6d%65%3d%22%6e%70%5f%70%72%6f%74%65%63%74%62%79%6d%64%35%5f%68%61%73%68%22%20%76%61%6c%75%65%3d%22%32%33%33%33%32%34%65%39%33%64%39%37%66%61%33%64%37%34%66%65%38%31%32%63%37%39%35%37%39%66%65%36%22%3e

サイト内検索

↑ページ先頭へ

1149247 [Mode]
Copyright © kyu-weblog All Rights Reserved. Powered by Nucleus CMS v3.71 管理