
Driving a Motor — SIK Circuit 12
Spin a DC motor at variable speeds using a transistor as a switch. Learn about transistors, flyback diodes, PWM motor control, and serial input for speed control.
안내
Parts & Introduction
Parts & Introduction
DC motors draw too much current for an Arduino pin to drive directly. A transistor acts as an electronic switch — a small signal from the Arduino controls a larger current flowing through the motor. The flyback diode protects against voltage spikes when the motor turns off.
Parts Needed
- 1x Arduino Uno + USB cable
- 1x Breadboard
- 1x DC Motor
- 1x NPN Transistor (P2N2222A)
- 1x Diode (1N4148)
- 1x 330Ω Resistor
- 6x Jumper Wires
이 단계의 재료:
SparkFun Inventors Kit - V3.21 키트
Arduino Uno R31 개
Breadboard1 개
DC Motor1 개
NPN Transistor (P2N2222A)1 개
Diode (1N4148)1 개
330 Ohm Resistor1 개
Jumper Wires6 개필요한 도구:
Hardware Hookup
Hardware Hookup
Wiring Instructions
Transistor pinout (flat side facing you, pins down): Collector, Base, Emitter (left to right).
- Place the transistor in the breadboard.
- Connect Base (middle pin) through a 330Ω resistor to Arduino Digital Pin 9.
- Connect Emitter (right pin) to GND.
- Connect Collector (left pin) to the motor's black wire.
- Connect the motor's red wire to 5V.
- Flyback Diode: Connect the banded end (cathode) to 5V, the other end (anode) to the motor's black wire.
이 단계의 재료:
DC Motor1 개
NPN Transistor (P2N2222A)1 개
Diode (1N4148)1 개
330 Ohm Resistor1 개
Breadboard1 개
Jumper Wires6 개Arduino Code
Arduino Code
Open the Arduino IDE and upload the following sketch to your Arduino board.
/*
SparkFun Inventor's Kit
Example sketch 12 — SPINNING A MOTOR
Use a transistor to spin a motor at different speeds.
Hardware connections:
Transistor BASE through 330 ohm resistor to digital pin 9
Transistor EMITTER to GND
Transistor COLLECTOR to motor black wire
Motor red wire to 5V
Flyback diode: band (cathode) to 5V, anode to motor black wire
This code is completely free for any use.
*/
const int motorPin = 9;
void setup()
{
pinMode(motorPin, OUTPUT);
Serial.begin(9600);
}
void loop()
{
serialSpeed();
//motorOnThenOff();
//motorOnThenOffWithSpeed();
//motorAcceleration();
}
void serialSpeed()
{
int speed;
Serial.println("Type a speed (0-255) into the box above,");
Serial.println("then click [send] or press [return]");
Serial.println();
while(true)
{
while (Serial.available() > 0)
{
speed = Serial.parseInt();
speed = constrain(speed, 0, 255);
Serial.print("Setting speed to ");
Serial.println(speed);
analogWrite(motorPin, speed);
}
}
}
void motorOnThenOff()
{
int onTime = 3000;
int offTime = 3000;
digitalWrite(motorPin, HIGH);
delay(onTime);
digitalWrite(motorPin, LOW);
delay(offTime);
}
void motorOnThenOffWithSpeed()
{
int Speed1 = 200;
int Time1 = 3000;
int Speed2 = 50;
int Time2 = 3000;
analogWrite(motorPin, Speed1);
delay(Time1);
analogWrite(motorPin, Speed2);
delay(Time2);
}
void motorAcceleration()
{
int speed;
int delayTime = 20;
for(speed = 0; speed <= 255; speed++)
{
analogWrite(motorPin, speed);
delay(delayTime);
}
for(speed = 255; speed >= 0; speed--)
{
analogWrite(motorPin, speed);
delay(delayTime);
}
}이 단계의 재료:
Arduino Uno R31 개필요한 도구:
Test & Experiment
Test & Experiment
What You Should See
The default serialSpeed() function lets you type speed values (0-255) into the Serial Monitor to control motor speed in real time.
Troubleshooting
- Motor not spinning: If you sourced your own transistor, double-check the pinout — many NPN transistors have reversed pin orders compared to the P2N2222A.
- Motor won't start at low values: Below ~50, the motor doesn't have enough torque to overcome friction. This is normal.
- Connection issues: Try unplugging and re-plugging the USB cable.
Experiments to Try
- Uncomment
motorAcceleration()to see smooth speed ramping. - Add a potentiometer to control speed with a knob instead of serial input.
- Add a button for on/off control.
재료
8- ₩1,530
- 플레이스홀더
- 1 개플레이스홀더
- 플레이스홀더
CC0 퍼블릭 도메인
이 블루프린트는 CC0로 공개되었습니다. 어떤 목적으로든 자유롭게 복사, 수정, 배포 및 사용할 수 있습니다.
제품 구매를 통해 메이커를 지원하세요. 판매자가 설정한 메이커 커미션 을 받거나, 이 블루프린트의 새로운 반복을 만들어 연결로 포함시킬 수 있습니다.