Elevator Control with Microbit

📟 Micro:bit Project: Elevator Control 4 flow with DC Motor Stepper



សមាសភាគដែលត្រូវការ

  1. Micro:bit 1 បន្ទះ

  2. Stepper Motor 28BYJ-48 (ម៉ូទ័របោះជំហាន) 1 គ្រឿង

  3. Driver Board ULN2003 1 បន្ទះ (សម្រាប់បញ្ជាម៉ូទ័រ)

  4. Push Buttons 4 គ្រាប់ (សម្រាប់ជាន់ទី 1,2,3,4)

  5. Resistor 10kΩ 4 គ្រាប់

  6. Breadboard 1 បន្ទះ

  7. ខ្សែភ្លើងតភ្ជាប់ (Jumper wires)



ការតភ្ជាប់សៀគ្វី

1. ការតភ្ជាប់ប៊ូតុង (Buttons)

  • ប៊ូតុងជាន់ទី 1

    • ស្លាបម្ខាងភ្ជាប់ទៅ Pin 0 របស់ Micro:bit

    • ស្លាបម្ខាងទៀតភ្ជាប់ទៅ GND

  • ប៊ូតុងជាន់ទី 2

    • ភ្ជាប់ទៅ Pin 1 និង GND

  • ប៊ូតុងជាន់ទី 3

    • ភ្ជាប់ទៅ Pin 2 និង GND

  • ប៊ូតុងជាន់ទី 4

    • ភ្ជាប់ទៅ Pin 16 និង GND

  • Resistor 10kΩ តភ្ជាប់ពី Pin នីមួយៗទៅកាន់ 3V (Pull-up resistor)

2. ការតភ្ជាប់ Stepper Motor

តភ្ជាប់ Driver Board ULN2003 ទៅ Micro:bit៖

Driver BoardMicro:bit
IN1Pin 8
IN2Pin 12
IN3Pin 13
IN4Pin 14
VCC5V (ថាមពលខាងក្រៅ)
GNDGND

សំខាន់៖ Stepper Motor ត្រូវការថាមពល 5V ដាច់ដោយឡែក (កុំភ្ជាប់ពី Micro:bit ផ្ទាល់)



💻 JavaScript Code


// Elevator Control System with DC Stepper Motor
// Buttons: Pin0 (Floor 1), Pin1 (Floor 2), Pin2 (Floor 3), Pin16 (Floor 4)

// Motor control pins (adjust based on your stepper motor driver)
let motorPinA: DigitalPin = DigitalPin.P8;
let motorPinB: DigitalPin = DigitalPin.P12;
let motorPinC: DigitalPin = DigitalPin.P13;
let motorPinD: DigitalPin = DigitalPin.P14;

// Current floor tracking
let currentFloor: number = 1;
let targetFloor: number = 1;

// Motor step sequence for full-step operation
let stepSequence: number[][] = [
    [1, 0, 0, 0], // Step 1
    [0, 1, 0, 0], // Step 2
    [0, 0, 1, 0], // Step 3
    [0, 0, 0, 1]  // Step 4
];

// Steps per floor (adjust based on your motor and elevator mechanism)
let stepsPerFloor: number = 200;

// Motor speed control
let stepDelay: number = 3; // milliseconds between steps

// Flag to prevent multiple motor operations
let isMoving: boolean = false;

// Initialize pins
function initializePins(): void {
    // Motor pins as digital outputs
    pins.digitalWritePin(motorPinA, 0);
    pins.digitalWritePin(motorPinB, 0);
    pins.digitalWritePin(motorPinC, 0);
    pins.digitalWritePin(motorPinD, 0);
    
    // Button pins with pull-up resistors
    pins.setPull(DigitalPin.P0, PinPullMode.PullUp);
    pins.setPull(DigitalPin.P1, PinPullMode.PullUp);
    pins.setPull(DigitalPin.P2, PinPullMode.PullUp);
    pins.setPull(DigitalPin.P16, PinPullMode.PullUp);
}

// Display floor number on Micro:bit LED matrix
function showFloor(floor: number): void {
    basic.clearScreen();
    
    switch(floor) {
        case 1:
            basic.showNumber(1);
            break;
        case 2:
            basic.showNumber(2);
            break;
        case 3:
            basic.showNumber(3);
            break;
        case 4:
            basic.showNumber(4);
            break;
        default:
            basic.showString("ERR");
    }
}

// Move motor one step in specified direction
function motorStep(stepIndex: number): void {
    let sequence: number[] = stepSequence[stepIndex];
    pins.digitalWritePin(motorPinA, sequence[0]);
    pins.digitalWritePin(motorPinB, sequence[1]);
    pins.digitalWritePin(motorPinC, sequence[2]);
    pins.digitalWritePin(motorPinD, sequence[3]);
    basic.pause(stepDelay);
}

// Move motor to achieve floor movement
function moveMotor(direction: number, steps: number): void {
    // direction: 1 for up, -1 for down
    isMoving = true;
    
    // Display moving animation
    let animationPattern: number = 0;
    
    for (let step: number = 0; step < steps; step++) {
        // Animate while moving
        animationPattern = (animationPattern + 1) % 4;
        showMovingAnimation(animationPattern);
        
        // Perform motor steps
        if (direction === 1) { // Moving up
            for (let stepIndex: number = 0; stepIndex < 4; stepIndex++) {
                motorStep(stepIndex);
            }
        } else { // Moving down
            for (let stepIndex: number = 3; stepIndex >= 0; stepIndex--) {
                motorStep(stepIndex);
            }
        }
    }
    
    // Stop motor
    pins.digitalWritePin(motorPinA, 0);
    pins.digitalWritePin(motorPinB, 0);
    pins.digitalWritePin(motorPinC, 0);
    pins.digitalWritePin(motorPinD, 0);
    
    isMoving = false;
}

// Show moving animation on LED matrix
function showMovingAnimation(pattern: number): void {
    basic.clearScreen();
    
    switch(pattern) {
        case 0:
            led.plot(2, 2);
            break;
        case 1:
            led.plot(1, 2);
            led.plot(2, 2);
            led.plot(3, 2);
            break;
        case 2:
            led.plot(0, 2);
            led.plot(1, 2);
            led.plot(2, 2);
            led.plot(3, 2);
            led.plot(4, 2);
            break;
        case 3:
            led.plot(2, 1);
            led.plot(2, 2);
            led.plot(2, 3);
            break;
    }
    basic.pause(100);
}

// Move elevator to target floor
function moveToFloor(target: number): void {
    if (isMoving) {
        basic.showString("BUSY");
        basic.pause(1000);
        showFloor(currentFloor);
        return;
    }
    
    if (target === currentFloor) {
        // Already at requested floor
        return;
    }
    
    let direction: number = (target > currentFloor) ? 1 : -1;
    let floorsToMove: number = Math.abs(target - currentFloor);
    let stepsToMove: number = floorsToMove * stepsPerFloor;
    
    // Show destination floor
    showFloor(target);
    basic.pause(500);
    
    // Move the elevator
    moveMotor(direction, stepsToMove);
    
    // Update current floor
    currentFloor = target;
    
    // Show arrival
    showFloor(currentFloor);
    playArrivalSound();
}

// Play arrival sound (through speaker/buzzer if connected)
function playArrivalSound(): void {
    music.playTone(Note.C, 200);
    music.playTone(Note.E, 200);
    music.playTone(Note.G, 200);
}

// Button press handlers
function onButtonPress(floor: number): () => void {
    return function(): void {
        if (!isMoving) {
            targetFloor = floor;
            moveToFloor(targetFloor);
        } else {
            // Queue the request (simple implementation)
            basic.showString("Q" + floor);
            basic.pause(1000);
            showFloor(currentFloor);
            
            // Wait for current movement to finish, then move again
            control.waitMicros(100);
            if (!isMoving && targetFloor !== floor) {
                targetFloor = floor;
                moveToFloor(targetFloor);
            }
        }
    };
}

// Initialize the system
function init(): void {
    initializePins();
    showFloor(currentFloor);
    
    // Setup button event handlers
    pins.onPulsed(DigitalPin.P0, PulseValue.Low, onButtonPress(1));
    pins.onPulsed(DigitalPin.P1, PulseValue.Low, onButtonPress(2));
    pins.onPulsed(DigitalPin.P2, PulseValue.Low, onButtonPress(3));
    pins.onPulsed(DigitalPin.P16, PulseValue.Low, onButtonPress(4));
    
    // Optional: Display ready message
    basic.showString("ELEV");
    basic.pause(1000);
    showFloor(currentFloor);
}

// Start the system
init();

// Keep the program running
basic.forever(function(): void {
    // Check for any system health issues
    if (currentFloor < 1 || currentFloor > 4) {
        basic.showString("ERR");
        currentFloor = 1;
        showFloor(currentFloor);
    }
});
  




របៀបដំណើរការ

ជំហានទី 1: ដំឡើងកូដ

  1. បើកកម្មវិធី Microsoft MakeCode (https://makecode.microbit.org)

  2. ប្តូរទៅជា JavaScript Mode

  3. ចម្លងកូដ TypeScript ខាងលើទាំងស្រុង

  4. បិទភ្ជាប់ (Paste) ចូលទៅក្នុងកម្មវិធី

  5. ដាក់ឈ្មោះ project ថា "Elevator Control"

  6. Download កូដទៅ Micro:bit

ជំហានទី 2: សាកល្បងប្រព័ន្ធ

  1. ភ្ជាប់ថាមពល ទៅ Micro:bit និង Stepper Motor

  2. Micro:bit នឹងបង្ហាញ:

    • ពាក្យ "ELEV" (រួចរាល់)

    • លេខ "1" (ជាន់បច្ចុប្បន្ន)

  3. ចុចប៊ូតុង:

    • ចុចប៊ូតុងភ្ជាប់ Pin0 → Micro:bit បង្ហាញលេខ 1 → ម៉ូទ័របង្វិលទៅជាន់ទី 1

    • ចុចប៊ូតុងភ្ជាប់ Pin1 → បង្ហាញលេខ 2 → ម៉ូទ័របង្វិលទៅជាន់ទី 2

    • ចុចប៊ូតុងភ្ជាប់ Pin2 → បង្ហាញលេខ 3 → ម៉ូទ័របង្វិលទៅជាន់ទី 3

    • ចុចប៊ូតុងភ្ជាប់ Pin16 → បង្ហាញលេខ 4 → ម៉ូទ័របង្វិលទៅជាន់ទី 4



ការកែតម្រូវ

1. កែតម្រូវចំនួនជំហាន (Steps Per Floor)

ក្នុងកូដ ស្វែងរកបន្ទាត់៖

javascript
let stepsPerFloor: number = 200;

ប្តូរលេខ 200 តាមការពិត៖

  • បង្កើនលេខ បើជណ្តើរយន្តផ្លាស់ទីទៅឆ្ងាយពេក

  • បន្ថយលេខ បើផ្លាស់ទីមិនដល់ជាន់

2. កែតម្រូវល្បឿនម៉ូទ័រ

ស្វែងរកបន្ទាត់៖

javascript
let stepDelay: number = 3;
  • បង្កើនលេខ (ឧ. 5, 10) → ម៉ូទ័របង្វិលយឺត តែខ្លាំងជាង

  • បន្ថយលេខ (ឧ. 1, 2) → ម៉ូទ័របង្វិលលឿន តែអាចចាញ់កម្លាំង

លក្ខណៈពិសេស

បង្ហាញលេខជាន់ នៅលើអេក្រង់ LED
សំឡេងដល់ជាន់ (Arduino-style melody)
ចលនាភ្លឺ ពេលកំពុងផ្លាស់ទី
ប្រព័ន្ធចាំវេន (Queue) បើមានចុចច្រើនដង
ការពារកំហុស (បើជាន់ខុស នឹងបង្ហាញ ERR)

ការដោះស្រាយបញ្ហា

បញ្ហា៖ ម៉ូទ័រមិនបង្វិល

  • ពិនិត្យមើលការភ្ជាប់ថាមពល 5V ដាច់ដោយឡែក

  • ពិនិត្យខ្សែ IN1-IN4 ភ្ជាប់ត្រូវគ្នានឹងកូដ

  • ពិនិត្យ GND ភ្ជាប់រួមគ្នា

បញ្ហា៖ ប៊ូតុងមិនដំណើរការ

  • ពិនិត្យ Resistor 10kΩ ភ្ជាប់ទៅ 3V

  • ពិនិត្យខ្សែភ្ជាប់ GND

បញ្ហា៖ ម៉ូទ័របង្វិលមិនត្រឹមត្រូវ

  • កែតម្រូវតម្លៃ stepsPerFloor

  • ប្តូរលំដាប់ជំហានក្នុង stepSequence

គន្លឹះបន្ថែម

  • អាចបន្ថែម LCD Display សម្រាប់បង្ហាញជាន់ឲ្យធំជាង

  • អាចបន្ថែម LED បំភ្លឺ នៅជាន់នីមួយៗ

  • អាចប្រើ ថ្ម 9V ជាមួយ Voltage Regulator សម្រាប់ផ្គត់ផ្គង់ម៉ូទ័រ

Post a Comment

Previous Post Next Post