続・Ender5Pro+SKR3+OctoPrint+Klipperの設定【ディスプレイ編】

# 記事一覧
[その他の3Dプリンタ記事はこちら。](https://qiita.com/tanutanup/items/be6a6166d814a5882c7f)

# 前回
[Amazonで入手した適当なLCDではうまく表示ができませんでした。](https://qiita.com/tanutanup/items/10eeb5d4b38bc625ea3b)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269597/c780a42f-2490-7982-ea4e-b4e22f492e35.png)
これではうまく操作ができないので、(安直に)他のメーカーのディスプレイを購入しました。
(一応海外サイトを検索して、設定方法やソースの修正方法を調べたのですが効果ありませんでした。)

# ハードウェア
購入したのは[FYSETC MINI 12864](https://ja.aliexpress.com/item/32851658211.html)です。klipperでは搭載しているLCD制御チップの種類が違うとちゃんと制御出来ないようなので、比較的有名な製品を選んだほうが無難でしょう。このメーカーはドキュメントもしっかりしています。

## 改造
SKR3のピン配置を確認すると、EXP1-9はGND、EXP1-10は+5V、EXP2-9はGND、EXP2-10はNCです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269597/28c4339f-cd9d-4736-2168-fd658c755b26.png)
一方、LCDの方は、EXP1-1が5V、EXP1-2がGND、EXP2-2がGNDです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269597/d62ceaca-2fa0-870b-81de-aa32d4fc5920.png)
これらのことから、何らかの方法でケーブルを180度回転させる必要があります。

[VORONの設定例](https://docs.vorondesign.com/build/electrical/mini12864_klipper_guide.html)では、この対策としてコネクタのハウジング(プラスチック部分)だけを引き抜いて回転させて指す方法が紹介されています。他にも逆転するようなケーブルを作ったり、コネクタをハンダで外す方法がありますが、コネクタの私は逆差し防止の出っ張りが当たる部分を削りました。

# ソフトウェア
[VORONの設定例](https://docs.vorondesign.com/build/electrical/mini12864_klipper_guide.html)の記載を参考にしつつ、サンプルの丸パクリしました。よく分かりませんがspi_busの記載があると通りません。VORONの設定例にある通り、ノブの回転方向とディスプレイの移動方向が感覚的に合わないので逆転させています。
また、ディスプレイに内蔵されているブザーを動作させるため、PWMの設定を追加しています。


```printer.cfg
########################################
# EXP1 / EXP2 (display) pins
########################################

[board_pins]
aliases:
    # EXP1 header
    EXP1_1=PC5, EXP1_3=PB1, EXP1_5=PE9,  EXP1_7=PE11, EXP1_9=<GND>,
    EXP1_2=PB0, EXP1_4=PE8, EXP1_6=PE10, EXP1_8=PE12, EXP1_10=<5V>,
    # EXP2 header
    EXP2_1=PA6, EXP2_3=PE7, EXP2_5=PB2, EXP2_7=PC4,   EXP2_9=<GND>,
    EXP2_2=PA5, EXP2_4=PA4, EXP2_6=PA7, EXP2_8=<RST>, EXP2_10=<NC>

### 中略 ###

######################################################################
# Fysetc Mini 12864Panel v2.1 (with neopixel backlight leds)
######################################################################

[display]
lcd_type: uc1701
cs_pin: EXP1_3
a0_pin: EXP1_4
rst_pin: EXP1_5
contrast: 63
encoder_pins: ^EXP2_5, ^EXP2_3
click_pin: ^!EXP1_2
# Some micro-controller boards may require an spi bus to be specified:
# spi_bus: spi
# Alternatively, some micro-controller boards may work with software spi:
spi_software_miso_pin: EXP2_1
spi_software_mosi_pin: EXP2_6
spi_software_sclk_pin: EXP2_2

[output_pin beeper]
pin: EXP1_1

value: 0
shutdown_value: 0
pwm: True
cycle_time: 0.0005 ; Default beeper tone in kHz. 1 / 0.0005 = 2000Hz (2kHz)


[neopixel fysetc_mini12864]
pin: EXP1_6
chain_count: 3
color_order: RGB
initial_RED: 0.4
initial_GREEN: 0.4
initial_BLUE: 0.4
```

今回追加したBEEPを動作させるマクロを追記しています。

```macro.cfg
[gcode_macro BEEP]
gcode:
    # Parameters
    {% set i = params.I|default(1)|int %}           ; Iterations (number of times to beep).
    {% set dur = params.DUR|default(100)|int %}     ; Duration/wait of each beep in ms. Default 100ms.
    {% set freq = params.FREQ|default(2000)|int %}  ; Frequency in Hz. Default 2kHz.

    {% for iteration in range(i|int) %}
        SET_PIN PIN=beeper VALUE=0.8 CYCLE_TIME={ 1.0/freq if freq > 0 else 1 }
        G4 P{dur}
        SET_PIN PIN=beeper VALUE=0
        G4 P{dur}
    {% endfor %}
```
# 結果
思い通りに動作しました。これでフィラメント交換やノズル高さの調整でいちいちPCからアクセスする必要がなくなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269597/7eb84a43-7bf0-970e-f709-6c396e9ee29e.png)