← zpět

ESP32 + optická závora + stepper: počítadlo kusů a dávkovač

2026-04-11

Ilustrační zapojení ESP32, optické závory, OLED a driveru krokového motoru
Počítadlo kusů nebo dávkovač: optická závora hlídá průchod, OLED ukazuje stav a ESP32 může přes driver posunout motor o definovaný krok.

Tohle je užitečný základ pro počítání kusů na lince, dílenský dávkovač nebo kontrolní přípravek. Optická závora detekuje průchod materiálu, OLED ukazuje počitadlo a stav zařízení a ESP32 podle potřeby vygeneruje impulsy pro driver krokového motoru.

Doporučené zapojení

  • OLED SSD1306: SDA → GPIO21, SCL → GPIO22
  • Optická závora / endstop: výstup → GPIO34, napájení podle typu senzoru
  • Driver A4988 / DRV8825: STEP → GPIO25, DIR → GPIO26, GND společná s ESP32
  • Krokový motor: samostatné napájení driveru, ne tahat motor z 3V3 větve
Klíčová poznámka: výstup ze senzoru musí být napěťově kompatibilní s ESP32. Když má závora 5V výstup bez otevřeného kolektoru, dej převod úrovní nebo dělič. GPIO34 je jen vstup, což je pro čtení senzoru v tomhle případě výhoda.

Logika počítání

Nejčistší je počítat až kompletní cyklus přerušení paprsku → návrat do klidu. Tím omezíš falešné dvojité pulzy, které vznikají při chvění dílu nebo rušení. Teprve po potvrzeném průchodu zvýšíš čítač a podle režimu provedeš další akci — třeba posun o definovaný počet kroků.

Proč OLED a ne jen sériová linka

Na stole stačí Serial Monitor, ale v zařízení nebo na přípravku je malý OLED výrazně praktičtější. Na první pohled vidíš:

  • počet kusů,
  • stav vstupu ze senzoru,
  • počet kroků na cyklus,
  • chybový stav nebo menu nastavení.

Ukázka kostry programu

constexpr int PIN_SENSOR = 34;
constexpr int PIN_STEP   = 25;
constexpr int PIN_DIR    = 26;

volatile bool beamBroken = false;
uint32_t pieces = 0;

void pulseSteps(uint16_t steps) {
  for (uint16_t i = 0; i < steps; ++i) {
    digitalWrite(PIN_STEP, HIGH);
    delayMicroseconds(500);
    digitalWrite(PIN_STEP, LOW);
    delayMicroseconds(500);
  }
}

void loop() {
  static bool lastState = false;
  bool state = digitalRead(PIN_SENSOR) == LOW;

  if (state) beamBroken = true;
  if (!state && lastState && beamBroken) {
    ++pieces;
    beamBroken = false;
    pulseSteps(200);
  }
  lastState = state;
}

Praktická rizika

  • Rušení od motoru — driver a motorová větev umí rozhodit senzor i displej.
  • Blokující generování kroků — ve větším projektu je lepší přejít na časovač nebo neblokující stavový automat.
  • Nespolehlivá závora — levné čidlo může mít šum. Ověř osciloskopem nebo aspoň logickým analyzátorem.
  • Napájení — společná zem ano, ale motor napájej samostatně a rozumně filtruj.

Kde se to hodí

Počítání kusů, jednoduchý posuv, odměřování malých dávek, navádění dílu v přípravku nebo malé poloautomatické pracoviště. Není to náhrada za PLC, ale pro prototyp a dílenský nástroj je to rychlé a dobře škálovatelné řešení.