Skip to content

yeyebee/arduino-esp32-encoder

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

1 Commit
ย 
ย 
ย 
ย 

Repository files navigation

ESP32 Gray Code Absolute Encoder

์ดˆ๊ณ ์† 6๋น„ํŠธ Gray Code ์ ˆ๋Œ€ ์œ„์น˜ ์—”์ฝ”๋” ์‹œ์Šคํ…œ

ESP32์™€ I2C LCD๋ฅผ ํ™œ์šฉํ•œ ์‹ค์‹œ๊ฐ„ ์œ„์น˜/์ง๊ฒฝ ์ธก์ • ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ํ•˜๋“œ์›จ์–ด ์ธํ„ฐ๋ŸฝํŠธ ๊ธฐ๋ฐ˜ Gray Code ๋””์ฝ”๋”ฉ์œผ๋กœ ๊ณ ์† ํšŒ์ „์—์„œ๋„ ์ •ํ™•ํ•œ ์œ„์น˜ ์ถ”์ ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Version Platform

๐Ÿ“‹ ๋ชฉ์ฐจ

โœจ ์ฃผ์š” ํŠน์ง•

๐Ÿš€ ์ดˆ๊ณ ์† ์ฒ˜๋ฆฌ

  • ํ•˜๋“œ์›จ์–ด ์ธํ„ฐ๋ŸฝํŠธ ๊ธฐ๋ฐ˜: 6๊ฐœ ํ•€ ๋™์‹œ ๋ชจ๋‹ˆํ„ฐ๋ง
  • ์ง์ ‘ ๋ ˆ์ง€์Šคํ„ฐ ์ฝ๊ธฐ: GPIO_IN_REG ํ™œ์šฉ์œผ๋กœ ๋งˆ์ดํฌ๋กœ์ดˆ ๋‹จ์œ„ ๋ฐ˜์‘
  • ๋ง ๋ฒ„ํผ ๊ตฌ์กฐ: 1024 ์ƒ˜ํ”Œ ๋ฒ„ํผ๋กœ ๋ฐ์ดํ„ฐ ์†์‹ค ๋ฐฉ์ง€
  • ๊ณ ์† ํšŒ์ „์—์„œ๋„ ์ •ํ™•ํ•œ ์ถ”์ 

๐Ÿ“Š ์ •๋ฐ€ ์ธก์ •

  • ์ ˆ๋Œ€ ์œ„์น˜ ์ธ์ฝ”๋”: ์ „์› ๊บผ์ ธ๋„ ์œ„์น˜ ๊ธฐ์–ต
  • 0.05mm ๋ถ„ํ•ด๋Šฅ: 64๋‹จ๊ณ„ Gray Code
  • ์‹ค์‹œ๊ฐ„ ์ง๊ฒฝ ๊ณ„์‚ฐ: ์›์ฃผ์œจ ๊ธฐ๋ฐ˜ ์ž๋™ ๋ณ€ํ™˜
  • ์ตœ์†Œ ์œ„์น˜ 3cm: ์Œ์ˆ˜ ๋ฐฉ์ง€ ํด๋žจํ•‘

๐Ÿ’พ ์ž๋™ ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜

  • Flash ๋ฉ”๋ชจ๋ฆฌ ์ €์žฅ: ESP32 Preferences ํ™œ์šฉ
  • ์ž๋™ ๋งคํ•‘ ๋ชจ๋“œ: ์ฒ˜์Œ 1ํšŒ์ „์œผ๋กœ ์ž๋™ ํ•™์Šต
  • ์ฆ‰์‹œ ์‚ฌ์šฉ: ์žฌ๋ถ€ํŒ… ํ›„ ๋งคํ•‘ ์ž๋™ ๋กœ๋“œ
  • ์ˆ˜๋™ ๋ฆฌ์…‹ ๊ฐ€๋Šฅ: ์‹œ๋ฆฌ์–ผ ๋ช…๋ น์œผ๋กœ ์ดˆ๊ธฐํ™”

๐Ÿ–ฅ๏ธ LCD ์‹ค์‹œ๊ฐ„ ํ‘œ์‹œ

  • 16x2 I2C LCD (0x27 ์ฃผ์†Œ)
  • ์œ„์น˜(cm) ๋ฐ ์ง๊ฒฝ(cm) ๋™์‹œ ํ‘œ์‹œ
  • 100ms ์ฃผ๊ธฐ ๊ฐฑ์‹ 
  • ๋งคํ•‘ ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ

๐Ÿ”Œ ํ•˜๋“œ์›จ์–ด ๊ตฌ์„ฑ

ํ•„์š” ๋ถ€ํ’ˆ

๊ตฌ์„ฑํ’ˆ ๋ชจ๋ธ/์‚ฌ์–‘ ์ˆ˜๋Ÿ‰
๋ฉ”์ธ ์ปจํŠธ๋กค๋Ÿฌ ESP32 DevKit 1
LCD ๋””์Šคํ”Œ๋ ˆ์ด 16x2 I2C LCD (0x27) 1
Gray Code ์—”์ฝ”๋” 6๋น„ํŠธ ์ ˆ๋Œ€ ์—”์ฝ”๋” 1
ํ’€์—… ์ €ํ•ญ 10kฮฉ (์˜ต์…˜, ๋‚ด๋ถ€ ํ’€์—… ์‚ฌ์šฉ ๊ฐ€๋Šฅ) 6

์‹œ์Šคํ…œ ์š”๊ตฌ์‚ฌํ•ญ

  • ์ „์›: 5V / 500mA ์ด์ƒ
  • Gray Code ๋””์Šคํฌ: 6๋น„ํŠธ (64๋‹จ๊ณ„)
  • ์„ผ์„œ: ๊ด‘์„ผ์„œ ๋˜๋Š” ํ™€์„ผ์„œ 6๊ฐœ

๐Ÿ“Š ํ•€ ์—ฐ๊ฒฐ๋„

ESP32 ํ•€์•„์›ƒ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚             ESP32                   โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ GPIO13  โ”€โ”€โ”€โ”€โ†’ Encoder Bit 0         โ”‚
โ”‚ GPIO14  โ”€โ”€โ”€โ”€โ†’ Encoder Bit 1         โ”‚
โ”‚ GPIO16  โ”€โ”€โ”€โ”€โ†’ Encoder Bit 2         โ”‚
โ”‚ GPIO17  โ”€โ”€โ”€โ”€โ†’ Encoder Bit 3         โ”‚
โ”‚ GPIO18  โ”€โ”€โ”€โ”€โ†’ Encoder Bit 4         โ”‚
โ”‚ GPIO19  โ”€โ”€โ”€โ”€โ†’ Encoder Bit 5         โ”‚
โ”‚                                     โ”‚
โ”‚ GPIO21  โ”€โ”€โ”€โ”€โ†’ LCD SDA (I2C)         โ”‚
โ”‚ GPIO22  โ”€โ”€โ”€โ”€โ†’ LCD SCL (I2C)         โ”‚
โ”‚                                     โ”‚
โ”‚ 5V      โ”€โ”€โ”€โ”€โ†’ Power Supply          โ”‚
โ”‚ GND     โ”€โ”€โ”€โ”€โ†’ Common Ground         โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

์ƒ์„ธ ์—ฐ๊ฒฐํ‘œ

Gray Code ์—”์ฝ”๋” ์—ฐ๊ฒฐ

์—”์ฝ”๋” ์ถœ๋ ฅ ESP32 ํ•€ ๋น„ํŠธ ์„ค๋ช…
Bit 0 (LSB) GPIO13 0 ์ตœํ•˜์œ„ ๋น„ํŠธ
Bit 1 GPIO14 1
Bit 2 GPIO16 2
Bit 3 GPIO17 3
Bit 4 GPIO18 4
Bit 5 (MSB) GPIO19 5 ์ตœ์ƒ์œ„ ๋น„ํŠธ
VCC 5V - ์ „์›
GND GND - ๊ทธ๋ผ์šด๋“œ

I2C LCD ์—ฐ๊ฒฐ

LCD ํ•€ ESP32 ํ•€ ์„ค๋ช…
VCC 5V ์ „์›
GND GND ๊ทธ๋ผ์šด๋“œ
SDA GPIO21 I2C ๋ฐ์ดํ„ฐ
SCL GPIO22 I2C ํด๋Ÿญ

ํšŒ๋กœ๋„

        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
        โ”‚    ESP32     โ”‚
        โ”‚              โ”‚
 Enc B0 โ”‚ GPIO13 โ—„โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€ Gray Code Bit 0
 Enc B1 โ”‚ GPIO14 โ—„โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€ Gray Code Bit 1
 Enc B2 โ”‚ GPIO16 โ—„โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€ Gray Code Bit 2
 Enc B3 โ”‚ GPIO17 โ—„โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€ Gray Code Bit 3
 Enc B4 โ”‚ GPIO18 โ—„โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€ Gray Code Bit 4
 Enc B5 โ”‚ GPIO19 โ—„โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€ Gray Code Bit 5
        โ”‚              โ”‚
 I2C-DA โ”‚ GPIO21 โ”€โ”€โ”€โ”€โ”€โ–บโ”ผโ”€โ”€โ”€โ”€ LCD SDA
 I2C-CL โ”‚ GPIO22 โ”€โ”€โ”€โ”€โ”€โ–บโ”ผโ”€โ”€โ”€โ”€ LCD SCL
        โ”‚              โ”‚
        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿ—๏ธ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜

๋ฐ์ดํ„ฐ ํ๋ฆ„

Gray Code ์—”์ฝ”๋” (6๋น„ํŠธ)
    โ†“
6๊ฐœ GPIO ํ•€ (ํ•˜๋“œ์›จ์–ด ์ธํ„ฐ๋ŸฝํŠธ)
    โ†“
ISR: encoderISR() [IRAM]
  โ€ข GPIO_IN_REG ์ง์ ‘ ์ฝ๊ธฐ
  โ€ข 6๋น„ํŠธ ์ฝ”๋“œ ์ƒ์„ฑ
  โ€ข ๋ง ๋ฒ„ํผ์— ์ €์žฅ
    โ†“
[Ring Buffer] (1024 ์ƒ˜ํ”Œ)
    โ†“
Main Loop: processCode()
  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  โ–ผ             โ–ผ             โ–ผ
Started?    Mapping?    Position Update
  NO: Wait   NO: Learn    YES: Calculate
  START      Codes        Position/Diameter
    โ†“             โ†“             โ†“
LCD Display Update (100ms)

์ƒํƒœ ๋จธ์‹ 

[์ดˆ๊ธฐํ™”]
    โ†“
[๋Œ€๊ธฐ] โ† START ์ฝ”๋“œ(000000 or 111111) ๊ฐ์ง€ ๋Œ€๊ธฐ
    โ†“
[๋งคํ•‘ ๋ชจ๋“œ] โ† 1ํšŒ์ „ํ•˜๋ฉฐ 64๊ฐœ ์ฝ”๋“œ ํ•™์Šต
    โ†“         (Flash ์ž๋™ ์ €์žฅ)
[์ธก์ • ๋ชจ๋“œ] โ† ์œ„์น˜/์ง๊ฒฝ ์‹ค์‹œ๊ฐ„ ์ถ”์ 
    โ†‘
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ์žฌ๋ถ€ํŒ… ์‹œ Flash์—์„œ ์ž๋™ ๋กœ๋“œ

ํ•ต์‹ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

1. Gray Code ๋””์ฝ”๋”ฉ

// ISR์—์„œ ๋ ˆ์ง€์Šคํ„ฐ ์ง์ ‘ ์ฝ๊ธฐ (์ดˆ๊ณ ์†)
void IRAM_ATTR encoderISR() {
  uint32_t gpio_in = REG_READ(GPIO_IN_REG);    // GPIO 0-31
  uint32_t gpio_in1 = REG_READ(GPIO_IN1_REG);  // GPIO 32-39
  
  uint8_t code = 0;
  for(int i=0; i<6; i++) {
    int pin = ENCODER_PINS[i];
    uint8_t val = (pin<32) ? 
      ((gpio_in >> pin) & 1) : 
      ((gpio_in1 >> (pin-32)) & 1);
    code |= (val << i);
  }
  
  // ๋ง ๋ฒ„ํผ์— ์ €์žฅ
  bufferPush(code);
}

2. ์ž๋™ ๋งคํ•‘ ํ•™์Šต

// ์ฒ˜์Œ 1ํšŒ์ „์œผ๋กœ 64๊ฐœ ์ฝ”๋“œ ์ž๋™ ๋งคํ•‘
if(!mappingComplete) {
  if(codeToIndex[code] == 255) {
    codeToIndex[code] = nextIndex++;
    
    if(nextIndex == 64) {
      mappingComplete = true;
      saveToFlash();  // Flash์— ์ €์žฅ
    }
  }
}

3. ์œ„์น˜ ๊ณ„์‚ฐ (์—๋Ÿฌ ๋ณด์ • ํฌํ•จ)

int8_t rawStep = signedDelta(currentIndex, prevIndex);
int8_t normStep = rawStep;

// ํ•ด๋ฐ ๊ฑฐ๋ฆฌ๋กœ ์—๋Ÿฌ ๊ฐ์ง€
uint8_t hd = hammingDistance(currentCode, prevCode);

// Wrap-around ๋ณด์ •
if(abs(rawStep)==7 && hd==1) 
  normStep = (rawStep>0) ? +1 : -1;  // 63โ†’0 ๋˜๋Š” 0โ†’63
else if(abs(rawStep)==6 && hd<=2) 
  normStep = (rawStep>0) ? +2 : -2;

// ์œ„์น˜ ์—…๋ฐ์ดํŠธ (0.05mm/step)
accumSteps += normStep;
position_mm += (normStep > 0) ? +0.05 : -0.05;

// ์ตœ์†Œ ์œ„์น˜ ํด๋žจํ”„ (3cm)
if(position_mm < 3.0f) {
  position_mm = 3.0f;
  accumSteps = 0;
}

4. ์ง๊ฒฝ ์ž๋™ ๊ณ„์‚ฐ

diameter_mm = position_mm / ฯ€
// ์˜ˆ: ์œ„์น˜ 31.4mm โ†’ ์ง๊ฒฝ 10mm

๐Ÿš€ ์„ค์น˜ ๋ฐฉ๋ฒ•

1. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ •

Arduino IDE ์„ค์ •

# ESP32 ๋ณด๋“œ ์„ค์น˜
1. Arduino IDE ์—ด๊ธฐ
2. ํŒŒ์ผ โ†’ ํ™˜๊ฒฝ์„ค์ •
3. ์ถ”๊ฐ€ ๋ณด๋“œ ๋งค๋‹ˆ์ € URL:
   https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
4. ๋„๊ตฌ โ†’ ๋ณด๋“œ โ†’ ๋ณด๋“œ ๋งค๋‹ˆ์ €
5. "ESP32" ๊ฒ€์ƒ‰ ํ›„ ์„ค์น˜
6. ๋ณด๋“œ: "ESP32 Dev Module" ์„ ํƒ

ํ•„์š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜

# ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งค๋‹ˆ์ €์—์„œ ์„ค์น˜:
1. LiquidCrystal_I2C (by Frank de Brabander) - v1.1.2 ์ด์ƒ
2. Wire (Arduino ๊ธฐ๋ณธ ๋‚ด์žฅ)
3. Preferences (ESP32 ๊ธฐ๋ณธ ๋‚ด์žฅ)

2. ํ•˜๋“œ์›จ์–ด ์กฐ๋ฆฝ

์—”์ฝ”๋” ๋””์Šคํฌ ์ค€๋น„

6๋น„ํŠธ Gray Code ํŒจํ„ด์ด ์ธ์‡„๋œ ๋””์Šคํฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

  • ๋‚ด๊ฒฝ: ํšŒ์ „์ถ• ์ง๊ฒฝ์— ๋งž๊ฒŒ
  • ์™ธ๊ฒฝ: ์„ผ์„œ ๋ฐฐ์น˜ ๋ฐ˜๊ฒฝ
  • ํŠธ๋ž™: 6๊ฐœ (64๋‹จ๊ณ„)

Gray Code ํŒจํ„ด ์ƒ์„ฑ ๋„๊ตฌ:

  • ์˜จ๋ผ์ธ: Gray Code Generator
  • ๋˜๋Š” Python/์—‘์…€๋กœ ์ž์ฒด ์ƒ์„ฑ

์„ผ์„œ ๋ฐฐ์น˜

    [์„ผ์„œ ๋ฐฐ์น˜ ์˜ˆ์‹œ - ์›ํ˜•]
        
        Bit5 (์™ธ๊ณฝ)
       /    \
    Bit4    Bit3
     |   O   |    โ† ํšŒ์ „์ถ• ์ค‘์‹ฌ
    Bit2    Bit1
       \    /
        Bit0 (๋‚ด๊ณฝ)

์„ผ์„œ๋Š” ๋””์Šคํฌ ๋ฐ˜๊ฒฝ์— ๋”ฐ๋ผ ๋ฐฐ์น˜ํ•˜๋˜, ๋ชจ๋“  ๋น„ํŠธ๊ฐ€ ๋™์‹œ์— ์ฝํž ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3. ์ฝ”๋“œ ์—…๋กœ๋“œ

# 1. ์ฝ”๋“œ ๋‹ค์šด๋กœ๋“œ
git clone [repository-url]
cd esp32-gray-code-encoder

# 2. Arduino IDE์—์„œ ์—ด๊ธฐ
esp32_v5.cpp ํŒŒ์ผ ์—ด๊ธฐ

# 3. LCD I2C ์ฃผ์†Œ ํ™•์ธ (ํ•„์š”์‹œ)
# I2C ์Šค์บ๋„ˆ๋กœ LCD ์ฃผ์†Œ ํ™•์ธ
# ์ฝ”๋“œ์—์„œ ์ฃผ์†Œ ์ˆ˜์ •: LiquidCrystal_I2C lcd(0x27, 16, 2);

# 4. ๋ณด๋“œ ์„ค์ •
Tools โ†’ Board โ†’ ESP32 Dev Module
Tools โ†’ Upload Speed โ†’ 921600
Tools โ†’ Flash Frequency โ†’ 80MHz

# 5. ์—…๋กœ๋“œ
์—…๋กœ๋“œ ๋ฒ„ํŠผ ํด๋ฆญ

๐Ÿ’ก ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

์ดˆ๊ธฐ ์„ค์ • (์ฒซ ์‚ฌ์šฉ)

1. ์ „์› ์ผœ๊ธฐ

LCD ํ‘œ์‹œ: "UltraFast ENC"
         โ†“ (1์ดˆ ํ›„)
         "Waiting START..."

2. ์ž๋™ ๋งคํ•‘ ์‹œ์ž‘

  • ์—”์ฝ”๋”๋ฅผ ์ฒœ์ฒœํžˆ ํšŒ์ „ํ•˜์—ฌ START ์œ„์น˜ ์ฐพ๊ธฐ
  • START ์ฝ”๋“œ (000000 ๋˜๋Š” 111111) ๊ฐ์ง€๋˜๋ฉด ์ž๋™ ์‹œ์ž‘
LCD ํ‘œ์‹œ: "Mapping..."
         "0/64" (์ง„ํ–‰๋ฅ )

3. 1ํšŒ์ „ ์™„๋ฃŒ

  • ๊ณ„์† ์ฒœ์ฒœํžˆ ํšŒ์ „ํ•˜์—ฌ ์ „์ฒด 1๋ฐ”ํ€ด ์™„์„ฑ
  • 64๊ฐœ ์ฝ”๋“œ ๋ชจ๋‘ ํ•™์Šต๋˜๋ฉด ์ž๋™ ์™„๋ฃŒ
LCD ํ‘œ์‹œ: "Mapping Done"
         โ†“ (์ž๋™ ์ €์žฅ)
         "Pos:3.00cm"
         "Dia:0.95cm"

4. ์ธก์ • ์‹œ์ž‘

  • ์ด์ œ ์ž์œ ๋กญ๊ฒŒ ์—”์ฝ”๋” ํšŒ์ „
  • ์‹ค์‹œ๊ฐ„ ์œ„์น˜/์ง๊ฒฝ ํ‘œ์‹œ

์ผ๋ฐ˜ ์‚ฌ์šฉ (๋งคํ•‘ ์™„๋ฃŒ ํ›„)

LCD ํ™”๋ฉด ์ฝ๊ธฐ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚Pos:12.34cm     โ”‚  โ† ํ˜„์žฌ ์œ„์น˜ (์›์ฃผ ๊ธฐ์ค€)
โ”‚Dia:3.93cm      โ”‚  โ† ๊ณ„์‚ฐ๋œ ์ง๊ฒฝ
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
  • Pos: ์›์ฃผ ์œ„์น˜ (mm ๋‹จ์œ„, 3cm ์ตœ์†Œ๊ฐ’)
  • Dia: ์ž๋™ ๊ณ„์‚ฐ๋œ ์ง๊ฒฝ (Pos รท ฯ€)

์‹œ๋ฆฌ์–ผ ๋ช…๋ น์–ด

์‹œ๋ฆฌ์–ผ ๋ชจ๋‹ˆํ„ฐ (115200 baud)์—์„œ ๋‹ค์Œ ๋ช…๋ น ์ž…๋ ฅ:

๋ช…๋ น ์„ค๋ช… ์‚ฌ์šฉ ์˜ˆ์‹œ
R or r ์ „์ฒด ๋ฆฌ์…‹ (๋งคํ•‘ ์‚ญ์ œ, ๋Œ€๊ธฐ ๋ชจ๋“œ๋กœ) ์—”์ฝ”๋” ๊ต์ฒด ์‹œ
E or e Flash ๋ฉ”๋ชจ๋ฆฌ ์™„์ „ ์‚ญ์ œ ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ
Z or z ์˜์  ๋ฆฌ์…‹ (์œ„์น˜๋ฅผ 3cm๋กœ) ์ธก์ • ๊ธฐ์ค€์  ์žฌ์„ค์ •

์‚ฌ์šฉ ์˜ˆ์‹œ:

์‹œ๋ฆฌ์–ผ ๋ชจ๋‹ˆํ„ฐ์—์„œ 'R' ์ž…๋ ฅ โ†’ ์—”ํ„ฐ
โ†’ LCD: "Waiting START..."
โ†’ ๋งคํ•‘๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘

๊ณ ๊ธ‰ ์‚ฌ์šฉ

์ •๋ฐ€ ์ธก์ • ํŒ

  1. ๋งคํ•‘ ์‹œ: ์ฒœ์ฒœํžˆ ์ผ์ •ํ•œ ์†๋„๋กœ ํšŒ์ „ (๋…ธ์ด์ฆˆ ์ตœ์†Œํ™”)
  2. ์ธก์ • ์‹œ: ๋น ๋ฅธ ํšŒ์ „๋„ ๊ฐ€๋Šฅ (๋ง ๋ฒ„ํผ๊ฐ€ ์ฒ˜๋ฆฌ)
  3. ๋ฐฉํ–ฅ ์ „ํ™˜: ์ˆœ๋ฐฉํ–ฅ/์—ญ๋ฐฉํ–ฅ ์ž์œ ๋กญ๊ฒŒ ๊ฐ€๋Šฅ

์ง๊ฒฝ ์ธก์ • ํ™œ์šฉ

์‹ค์ œ ์‚ฌ์šฉ ์˜ˆ์‹œ:
- ํŒŒ์ดํ”„ ์™ธ๊ฒฝ ์ธก์ •
- ๋กค๋Ÿฌ ์ง€๋ฆ„ ์ธก์ •
- ์›ํ˜• ๋ถ€ํ’ˆ ๊ฒ€์‚ฌ

๊ณ„์‚ฐ์‹:

์œ„์น˜(mm) = ๋ˆ„์  ์Šคํ… ร— 0.05mm
์ง๊ฒฝ(mm) = ์œ„์น˜(mm) รท ฯ€

๐Ÿ”ง ๊ธฐ์ˆ  ์„ธ๋ถ€์‚ฌํ•ญ

Gray Code๋ž€?

์ •์˜: ์ธ์ ‘ํ•œ ๋‘ ๊ฐ’์ด 1๋น„ํŠธ๋งŒ ์ฐจ์ด๋‚˜๋Š” ์ด์ง„ ์ฝ”๋“œ

์žฅ์ :

  • ๋…ธ์ด์ฆˆ์— ๊ฐ•ํ•จ (๋‹ค์ค‘ ๋น„ํŠธ ๋™์‹œ ๋ณ€ํ™” ์—†์Œ)
  • ์ ˆ๋Œ€ ์œ„์น˜ ์ธ์ฝ”๋”์— ์ด์ƒ์ 
  • ์ „์› ๊บผ์ ธ๋„ ์œ„์น˜ ์œ ์ง€

6๋น„ํŠธ Gray Code ์˜ˆ์‹œ:

Decimal  Binary   Gray Code
0        000000   000000
1        000001   000001
2        000010   000011
3        000011   000010
4        000100   000110
...
63       111111   101000

์„ฑ๋Šฅ ์‚ฌ์–‘

ํ•ญ๋ชฉ ์‚ฌ์–‘
๋ถ„ํ•ด๋Šฅ 64๋‹จ๊ณ„ (6๋น„ํŠธ)
๋‹จ๊ณ„๋‹น ๊ฑฐ๋ฆฌ 0.05mm (์„ค์ • ๊ฐ€๋Šฅ)
์ตœ๋Œ€ ํšŒ์ „ ์†๋„ ~1000 RPM (๋ง ๋ฒ„ํผ ํฌ๊ธฐ์— ๋”ฐ๋ผ)
ISR ์‘๋‹ต ์‹œ๊ฐ„ ~2ฮผs
LCD ๊ฐฑ์‹  ์ฃผ๊ธฐ 100ms
์œ„์น˜ ๋ฒ”์œ„ 3cm ~ ๋ฌด์ œํ•œ
Flash ์“ฐ๊ธฐ ํšŸ์ˆ˜ ~100,000ํšŒ (ESP32 Preferences)

์—๋Ÿฌ ์ฒ˜๋ฆฌ

1. Wrap-around ๋ณด์ •

// 63 โ†’ 0 ๋˜๋Š” 0 โ†’ 63 ์ „ํ™˜ ๊ฐ์ง€
if(abs(rawStep) == 7 && hammingDistance == 1) {
  normStep = (rawStep > 0) ? +1 : -1;
}

2. ๋…ธ์ด์ฆˆ ํ•„ํ„ฐ๋ง

  • ํ•ด๋ฐ ๊ฑฐ๋ฆฌ ๊ฒ€์‚ฌ: ๋น„ํŠธ ๋ณ€ํ™” ์ˆ˜๊ฐ€ 2 ์ด์ƒ์ด๋ฉด ์˜์‹ฌ
  • ๋ง ๋ฒ„ํผ: ์ˆœ๊ฐ„์  ๋…ธ์ด์ฆˆ ๋ฒ„์ŠคํŠธ ํก์ˆ˜

3. ์ตœ์†Œ ์œ„์น˜ ํด๋žจํ•‘

if(position_mm < 3.0f) {
  position_mm = 3.0f;
  accumSteps = 0;
}

๐Ÿ› ๋ฌธ์ œ ํ•ด๊ฒฐ

์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ (FAQ)

Q1. LCD์— ์•„๋ฌด๊ฒƒ๋„ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

์›์ธ:

  • I2C ์ฃผ์†Œ ๋ถˆ์ผ์น˜
  • ์—ฐ๊ฒฐ ๋ถˆ๋Ÿ‰

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

  1. I2C ์Šค์บ๋„ˆ๋กœ ์ฃผ์†Œ ํ™•์ธ:
    // I2C Scanner ์˜ˆ์ œ ์‹คํ–‰
    // Tools โ†’ Examples โ†’ Wire โ†’ i2c_scanner
  2. LCD ์ฃผ์†Œ ์ˆ˜์ •:
    LiquidCrystal_I2C lcd(0x27, 16, 2);  // 0x27์„ ์ฐพ์€ ์ฃผ์†Œ๋กœ ๋ณ€๊ฒฝ
  3. SDA/SCL ์—ฐ๊ฒฐ ํ™•์ธ:
    GPIO21 โ†’ SDA
    GPIO22 โ†’ SCL
    

Q2. ๋งคํ•‘์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (64๊ฐœ ๋ฏธ๋งŒ์—์„œ ๋ฉˆ์ถค)

์›์ธ:

  • ์„ผ์„œ๊ฐ€ ํŠน์ • ์ฝ”๋“œ๋ฅผ ์ฝ์ง€ ๋ชปํ•จ
  • ๋””์Šคํฌ ํŒจํ„ด ์˜ค๋ฅ˜

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

  1. ์‹œ๋ฆฌ์–ผ ๋ชจ๋‹ˆํ„ฐ ํ™•์ธ:
    [NEW] code=12 -> idx=12
    [NEW] code=13 -> idx=13
    ...
    
  2. ๋ˆ„๋ฝ๋œ ์ฝ”๋“œ ์ฐพ๊ธฐ
  3. ์„ผ์„œ ์œ„์น˜/๊ฐ๋„ ์กฐ์ •
  4. ํ•„์š”์‹œ ๋งคํ•‘ ๋ฆฌ์…‹: R ๋ช…๋ น

Q3. ์œ„์น˜๊ฐ€ ํŠ€๊ฑฐ๋‚˜ ๋ถ€์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค

์›์ธ:

  • ์„ผ์„œ ๋…ธ์ด์ฆˆ
  • ๋„ˆ๋ฌด ๋น ๋ฅธ ํšŒ์ „
  • ์„ผ์„œ ์ •๋ ฌ ๋ถˆ๋Ÿ‰

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

  1. ํ’€์—… ์ €ํ•ญ ์ถ”๊ฐ€ (10kฮฉ)
  2. ์„ผ์„œ์™€ ๋””์Šคํฌ ๊ฐ„๊ฒฉ ์ตœ์ ํ™” (1~3mm)
  3. ๋””๋ฒ„๊ทธ ์ถœ๋ ฅ ํ™œ์„ฑํ™”:
    Serial.printf("code=%d idx=%d step=%d\n", code, idx, normStep);

Q4. ์žฌ๋ถ€ํŒ… ํ›„ ๋งคํ•‘์ด ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค

์›์ธ:

  • Flash ์ €์žฅ ์‹คํŒจ
  • Preferences ๊ณต๊ฐ„ ๋ถ€์กฑ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

  1. ์‹œ๋ฆฌ์–ผ์—์„œ ํ™•์ธ:
    [FLASH] Mapping saved  โ† ์ด ๋ฉ”์‹œ์ง€ ํ™•์ธ
    
  2. Flash ์ดˆ๊ธฐํ™”:
    ์‹œ๋ฆฌ์–ผ์—์„œ 'E' ์ž…๋ ฅ
    
  3. ๋งคํ•‘ ๋‹ค์‹œ ์ˆ˜ํ–‰

Q5. ์œ„์น˜๊ฐ€ 3cm ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ‘๋‹ˆ๋‹ค

์ •์ƒ ๋™์ž‘: v5์—์„œ๋Š” 3cm๊ฐ€ ์ตœ์†Œ๊ฐ’์ž…๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ ๋ฐฉ๋ฒ•:

// ์ตœ์†Œ ์œ„์น˜ ๋ณ€๊ฒฝ
const float MIN_POS_CM = 0.0f;  // 3.0f โ†’ 0.0f

// clampToMinOffset() ํ•จ์ˆ˜์—์„œ ํ™•์ธ

ํ•˜๋“œ์›จ์–ด ์ด์Šˆ

์„ผ์„œ ๊ฐ๋„ ๋ฌธ์ œ

  • ์ฆ์ƒ: ์ผ๋ถ€ ๋น„ํŠธ๊ฐ€ ํ•ญ์ƒ 0 ๋˜๋Š” 1
  • ํ•ด๊ฒฐ:
    • ๊ด‘์„ผ์„œ: ๊ฑฐ๋ฆฌ ์กฐ์ • (1~2mm)
    • ํ™€์„ผ์„œ: ์ž์„ ๊ฐ•๋„ ํ™•์ธ

์ „์› ๋…ธ์ด์ฆˆ

  • ์ฆ์ƒ: ๋žœ๋คํ•œ ์ฝ”๋“œ ๋ณ€ํ™”
  • ํ•ด๊ฒฐ:
    • 100ฮผF ์ปคํŒจ์‹œํ„ฐ ์ถ”๊ฐ€ (5V-GND)
    • ์„ผ์„œ ์ „์› ๋ณ„๋„ ๋ถ„๋ฆฌ

I2C ํ†ต์‹  ์˜ค๋ฅ˜

  • ์ฆ์ƒ: LCD๊ฐ€ ๊ฐ„ํ—์ ์œผ๋กœ ๋ฉˆ์ถค
  • ํ•ด๊ฒฐ:
    • SDA/SCL ํ’€์—… ์ €ํ•ญ ํ™•์ธ (4.7kฮฉ)
    • I2C ์†๋„ ๋‚ฎ์ถ”๊ธฐ:
      Wire.setClock(100000);  // 400kHz โ†’ 100kHz

๐Ÿ“ ์‹œ๋ฆฌ์–ผ ๋””๋ฒ„๊ทธ ์ถœ๋ ฅ

์ •์ƒ ์ž‘๋™ ์‹œ

UltraFast ENC
[RESET] Waiting for START(000000/111111)
[START] code=0 -> index=0
[NEW] code=1 -> idx=1
[NEW] code=3 -> idx=2
...
[NEW] code=2 -> idx=63
[FLASH] Mapping saved
Position: 15.30cm, Diameter: 4.87cm

์žฌ๋ถ€ํŒ… ์‹œ (๋งคํ•‘ ๋กœ๋“œ)

UltraFast ENC
[FLASH] Mapping loaded (64/64)
Position: 3.00cm, Diameter: 0.95cm

๋ช…๋ น ์‹คํ–‰

> R
[RESET] Waiting for START(000000/111111)

> E
[FLASH] Cleared

> Z
Position reset to 3.00cm

๐Ÿ”ฌ ํ™•์žฅ ์•„์ด๋””์–ด

๊ฐ€๋Šฅํ•œ ๊ฐœ์„ ์‚ฌํ•ญ

  1. ๋” ๋†’์€ ๋ถ„ํ•ด๋Šฅ

    • 8๋น„ํŠธ ์—”์ฝ”๋” ์‚ฌ์šฉ (256๋‹จ๊ณ„)
    • ๋ฉ€ํ‹ฐํ„ด ์—”์ฝ”๋” ์ถ”๊ฐ€ (ํšŒ์ „ ์ˆ˜ ์นด์šดํŠธ)
  2. ๋ฌด์„  ๋ฐ์ดํ„ฐ ์ „์†ก

    • ESP32 WiFi/Bluetooth ํ™œ์šฉ
    • ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ๋กœ๊น…
  3. ๋‹ค์ถ• ์‹œ์Šคํ…œ

    • ์—ฌ๋Ÿฌ ์—”์ฝ”๋” ๋™์‹œ ๋ชจ๋‹ˆํ„ฐ๋ง
    • X-Y-Z ์ขŒํ‘œ๊ณ„
  4. ์ž๋™ ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜

    • ์•Œ๋ ค์ง„ ์ง๊ฒฝ์œผ๋กœ ์Šค์ผ€์ผ ๋ณด์ •
    • ์˜จ๋„ ๋ณด์ƒ

๐Ÿค ๊ธฐ์—ฌ ๋ฐ ์ง€์›

๋ฒ„๊ทธ ๋ฆฌํฌํŠธ, ๊ธฐ๋Šฅ ์ œ์•ˆ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!

ํ”„๋กœ์ ํŠธ ๊ด€๋ จ ๋ฌธ์˜์‚ฌํ•ญ์ด ์žˆ์œผ์‹œ๋ฉด Issue๋ฅผ ๋“ฑ๋กํ•ด์ฃผ์„ธ์š”.


Made for Precision Measurement

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages