📟 Micro:bit Project: Elevator Control 4 flow with DC Motor Stepper
សមាសភាគដែលត្រូវការ
Micro:bit 1 បន្ទះ
Stepper Motor 28BYJ-48 (ម៉ូទ័របោះជំហាន) 1 គ្រឿង
Driver Board ULN2003 1 បន្ទះ (សម្រាប់បញ្ជាម៉ូទ័រ)
Push Buttons 4 គ្រាប់ (សម្រាប់ជាន់ទី 1,2,3,4)
Resistor 10kΩ 4 គ្រាប់
Breadboard 1 បន្ទះ
ខ្សែភ្លើងតភ្ជាប់ (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)
ប៊ូតុងជាន់ទី 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 Board | Micro:bit |
|---|---|
| IN1 | Pin 8 |
| IN2 | Pin 12 |
| IN3 | Pin 13 |
| IN4 | Pin 14 |
| VCC | 5V (ថាមពលខាងក្រៅ) |
| GND | GND |
សំខាន់៖ 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: ដំឡើងកូដ
បើកកម្មវិធី Microsoft MakeCode (https://makecode.microbit.org)
ប្តូរទៅជា JavaScript Mode
ចម្លងកូដ TypeScript ខាងលើទាំងស្រុង
បិទភ្ជាប់ (Paste) ចូលទៅក្នុងកម្មវិធី
ដាក់ឈ្មោះ project ថា "Elevator Control"
Download កូដទៅ Micro:bit
ជំហានទី 2: សាកល្បងប្រព័ន្ធ
ភ្ជាប់ថាមពល ទៅ Micro:bit និង Stepper Motor
Micro:bit នឹងបង្ហាញ:
ពាក្យ "ELEV" (រួចរាល់)
លេខ "1" (ជាន់បច្ចុប្បន្ន)
ចុចប៊ូតុង:
ចុចប៊ូតុងភ្ជាប់ Pin0 → Micro:bit បង្ហាញលេខ 1 → ម៉ូទ័របង្វិលទៅជាន់ទី 1
ចុចប៊ូតុងភ្ជាប់ Pin1 → បង្ហាញលេខ 2 → ម៉ូទ័របង្វិលទៅជាន់ទី 2
ចុចប៊ូតុងភ្ជាប់ Pin2 → បង្ហាញលេខ 3 → ម៉ូទ័របង្វិលទៅជាន់ទី 3
ចុចប៊ូតុងភ្ជាប់ Pin16 → បង្ហាញលេខ 4 → ម៉ូទ័របង្វិលទៅជាន់ទី 4
ការកែតម្រូវ
1. កែតម្រូវចំនួនជំហាន (Steps Per Floor)
ក្នុងកូដ ស្វែងរកបន្ទាត់៖
let stepsPerFloor: number = 200;
ប្តូរលេខ 200 តាមការពិត៖
បង្កើនលេខ បើជណ្តើរយន្តផ្លាស់ទីទៅឆ្ងាយពេក
បន្ថយលេខ បើផ្លាស់ទីមិនដល់ជាន់
2. កែតម្រូវល្បឿនម៉ូទ័រ
ស្វែងរកបន្ទាត់៖
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