FluidNC (и Candle) на Wemos D1 R32 + CNC SHIELD V3 + TMC2209 + SD Card + OLED Display на 4 оси

Понадобилась для квартирного станкостроения возможность управлять шаговыми движками. По советам из гугла купил дешёвые компоненты, собрал, не заработало…

Опуская все промежуточные проблемы от которых знатно подгорело просто запишу сюда что сделал в итоге, чтоб работало как должно.

Глава 1: Питание

CNC SHIELD сделан под Arduino, у которой 5V логика. Wemos же сделан на основе ESP32 и тут логика 3.3V, потому решил запитать CNC SHIELD от 3.3V. Для этого надо:

  1. Удалить ножку 5V на шилде, чтоб на шилд с платы Wemos не поступали 5V в принципе. Я просто откусил кусачками ножку в PLS гребёнке.
  2. В верхнем правом углу на шилде есть 2 пина, стоящие рядом: 3.3V и 5V – их надо соединить между собой перемычкой. Так с шины 3.3V будет подано питание на шину 5V что и нужно.

Глава 2: Распиновка

Если понадобится использовать SD карту (да, понадобится), то не получится сохранить соответствие функций пинов на шилде с их шелгографией. SD карта ну ни как не захотела заводиться на других пинах, кроме IO5, IO18, IO19, IO23 на ванильной прошивке FluidNC и потому необходимо некоторые функции переместить на другие пины.

А ещё на самой плате Wemos не правильные подписи некоторых пинов, как и на изображениях самой платы в интернете. Это жесть. Я всё прозвонил, исправил обозначения на картинке из интернета и подписал функции всех задействованных в проекте пинов:

Глава 3: ESP32 не загружается

На картинках выше я пометил что нужно сделать, а тут напишу зачем это надо делать.

ESP32 не будет загружаться со вставленной платой CNC SHIELD. Виновником оказался IO12 пин. На CNC SHIELD плате это EN пин. Он идёт к драйверам моторов на плате на соответствующие EN ножки. IO12 не обычный пин, это т.н. bootstrap pin и его функция при старте ESP32 это выбор напряжения питания внешней микросхемы FLASH памяти с которой грузится микроконтроллер. По умолчанию при старте ESP32 этот пин подтянут к GND и будет выбрано питание 3.3V, однако на плате CNC SHIELD этот пин подтянут резистором к VDD (+питания) из за чего при старте контроллера выбирается не правильное (1.8V) питание FLASH.

Я удалил этот резистор (указано на картинке выше), тем более он всё равно бесполезен, т.к. на каждом драйвере этот пин всё равно подтянут к питанию 4.7К резисторами. И после его удаления ESP32 стартует успешно, но это только если в shield не вставлены драйверы моторов.

Устанавливаем драйверы моторов в соответсвующие разъёмы и.. снова ESP32 не загружается. Но тут всё легко, т.к. проблема всё та же – IO12 пин. На каждом драйвере установлен свой резистор для подтяжки к питанию пина EN, потому после установки драйверов EN (IO12) снова подтянут к питанию и снова та же проблема с загрузкой. Я решил эту проблему простым костылём, сделав “джампер” с резистором на 2К между EN и GND пинами на CNC SHIELD (указано на картинке 2).

Глава 4: Конфигурация

После установки последней прошивки FluidNC я залил в неё файл конфига через WEB интерфейс и применил его. Моторы крутятся, OLED дисплей работает:

name: "ESP32"
board: "Wemos_CNCShield"
meta: "4axis"

stepping:
  engine: RMT
  idle_ms: 250
  dir_delay_us: 1
  pulse_us: 2
  disable_delay_us: 0

axes:
  shared_stepper_disable_pin: NO_PIN

  x:
    steps_per_mm: 200
    max_rate_mm_per_min: 400
    acceleration_mm_per_sec2: 2
    max_travel_mm: 100
    homing:
      cycle: 2
      mpos_mm: -3.000
      feed_mm_per_min: 400
      positive_direction: false
    
    motor0:
      limit_all_pin: gpio.36:low
      hard_limits: false
      pulloff_mm: 3.000
      stepstick:
        direction_pin: gpio.16
        step_pin: gpio.26

  y:
    steps_per_mm: 200
    max_rate_mm_per_min: 400
    acceleration_mm_per_sec2: 2
    max_travel_mm: 100
    homing:
      cycle: 2
      mpos_mm: -3
      feed_mm_per_min: 400
      positive_direction: false
    
    motor0:
      limit_all_pin: gpio.34:low
      hard_limits: false
      pulloff_mm: 3
      stepstick:
        direction_pin: gpio.27
        step_pin: gpio.25

  z:
    steps_per_mm: 200
    max_rate_mm_per_min: 400
    acceleration_mm_per_sec2: 2
    max_travel_mm: 10
    homing:
      cycle: 1
      mpos_mm: 3
      feed_mm_per_min: 400
      positive_direction: true
    
    motor0:
      limit_all_pin: gpio.35:low
      hard_limits: false
      pulloff_mm: 3
      stepstick:
        direction_pin: gpio.14
        step_pin: gpio.17

  a:
    steps_per_mm: 200
    max_rate_mm_per_min: 400
    acceleration_mm_per_sec2: 2
    max_travel_mm: 360
    
    motor0:
      limit_all_pin: gpio.39:low
      hard_limits: false
      pulloff_mm: 3
      stepstick:
        direction_pin: gpio.32
        step_pin: gpio.33

spi:
  miso_pin: gpio.19
  mosi_pin: gpio.23
  sck_pin: gpio.18

sdcard:
  cs_pin: gpio.5
  card_detect_pin: NO_PIN

coolant:
  flood_pin: gpio.15

probe:
  pin: gpio.13:low:pu

user_outputs:
  digital0_pin: gpio.12

PWM:
  pwm_hz: 5000
  output_pin: gpio.2
  enable_pin: gpio.4
  disable_with_s0: false
  s0_with_disable: true
  speed_map: 0=0% 10000=100%
  
i2c0:
   sda_pin: gpio.21
   scl_pin: gpio.22

oled:
   i2c_num: 0
   i2c_address: 60
   width: 128
   height: 64
   radio_delay_ms: 1000

Глава 5: Candle

Мне лично удобно некоторые задачи выполнять через Candle и потому решил разобраться с тем, как его подключить к FluidNC. На данный момент подключаюсь к нему через виртуальный COM порт, работающий поверх IP сети. Использую программу Tibbo. Настройка там тривиальная – достаточно создать в Tibbo VSP Manager новый COM порт и указать IP адрес FluidNC платы и порт 23, после чего можно использовать этот порт в Candle.