树莓派通过C语言和python控制步进电机
今天笔者完成树莓派通过C语言和python操作步进电机,步进电机可是机器人的基础。步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机。每输入一个脉冲信号,转子就转动一个角度或前进一步。笔者砌砖垒瓦,最后搞个树莓派小车来玩玩。
实践证明C语言比python控制稍微平顺一些。
1、接线图
实际接线中,笔者将+ -供电接在9伏的电池上,步进电机驱动供电支持5-12V。
![](https://img.haomeiwen.com/i24447700/e02ac8e8be0bb834.png)
2、C语言 step.c
整个程序是4步循环,实现步进电机循环。
#include <wiringPi.h>
#include <sys/time.h>
#include <stdio.h>
#include <unistd.h>
#define CLOCKWISE 1
#define COUNTER_CLOCKWISE 2
#define IN1 22
#define IN2 23
#define IN3 24
#define IN4 25
void delayMS(int x);
void inA();
void inB();
void inC();
void inD();
int main(int argc,char* argv[]){
if(-1==wiringPiSetup()){
printf("SetupwiringPi failed");
return1;
}
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);
#四个函数,步进电机循环转动
delayMS(50);
for(;;){
inA();
inB();
inC();
inD();
}
return0;
}
void delayMS(int x){
usleep(x*1000);
}
#1000
void inA(int* A){
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
digitalWrite(IN3,LOW);
digitalWrite(IN4,LOW);
delayMS(4);
}
#0100
void inB(int* B){
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
digitalWrite(IN3,LOW);
digitalWrite(IN4,LOW);
delayMS(4);
}
#0010
void inC(int* C){
digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW);
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
delayMS(4);
}
#0001
void inD(int* D){
digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW);
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);
delayMS(4);
}
编译程序 gcc step.c -o step -lwiringPi
运行程序 ./step
3、python语言 step0.py
整个控制程序是由四步组成,功能和C语言类似。
import RPi.GPIO as GPIO
import time
delay = 10
pin_6 = 6
pin_13 = 13
pin_19 = 19
pin_26 = 26
GPIO.setmode(GPIO.BCM)
def init():
GPIO.setwarnings(False)
GPIO.setup(pin_6, GPIO.OUT)
GPIO.setup(pin_13, GPIO.OUT)
GPIO.setup(pin_19, GPIO.OUT)
GPIO.setup(pin_26, GPIO.OUT)
def forward(delay):
setStep(1, 0, 0, 0)
time.sleep(delay)
setStep(0, 1, 0, 0)
time.sleep(delay)
setStep(0, 0, 1, 0)
time.sleep(delay)
setStep(0, 0, 0, 1)
time.sleep(delay)
def setStep(w1, w2, w3, w4):
GPIO.output(pin_6, w1)
GPIO.output(pin_13, w2)
GPIO.output(pin_19, w3)
GPIO.output(pin_26, w4)
def main():
init()
while True:
forward(int(delay) / 1000.0)
main()
4、python语言 step1.py
整个控制程序是由八步组成,将StepDir设置为-2或2,则步幅数会减少到4。4步步幅速度更快,但扭矩更低。8步步幅速度更慢,但扭矩更高。运行程序 python step.py 5,后面可以跟速率参数,不加则默认是10。
需要注意的是,python程序是BCM编码的阵脚值,区别于C语言。
#!/usr/bin/python
# Import required libraries
import sys
import time
import RPi.GPIO as GPIO
# Use BCM GPIO references
# instead of physical pin numbers
GPIO.setmode(GPIO.BCM)
# Define GPIO signals to use
# Physical pins 31 33 35 37
# GPIO22,GPIO23,GPIO24,GPIO25
StepPins = [6,13,19,26]
# Set all pins as output
for pin in StepPins:
print "Setup pins"
GPIO.setup(pin,GPIO.OUT)
GPIO.output(pin, False)
# Define advanced sequence
# as shown in manufacturers datasheet
Seq = [[1,0,0,1],
[1,0,0,0],
[1,1,0,0],
[0,1,0,0],
[0,1,1,0],
[0,0,1,0],
[0,0,1,1],
[0,0,0,1]]
StepCount = len(Seq)
StepDir = 1 # Set to 1 or 2 for clockwise
# Set to -1 or -2 for anti-clockwise
# Read wait time from command line
if len(sys.argv)>1:
WaitTime = int(sys.argv[1])/float(1000)
else:
WaitTime = 10/float(1000)
# Initialise variables
StepCounter = 0
# Start main loop
while True:
print StepCounter,
print Seq[StepCounter]
for pin in range(0, 4):
xpin = StepPins[pin]
if Seq[StepCounter][pin]!=0:
print " Enable GPIO %i" %(xpin)
GPIO.output(xpin, True)
else:
GPIO.output(xpin, False)
StepCounter += StepDir
# If we reach the end of the sequence
# start again
if (StepCounter>=StepCount):
StepCounter = 0
if (StepCounter<0):
StepCounter = StepCount+StepDir
# Wait before moving on
time.sleep(WaitTime)
5、步进电机驱动模块uln2003原理图
![](https://img.haomeiwen.com/i24447700/e51b546ed07746d9.png)
驱动模块说明:ULN2003是高耐压、大电流复合晶体管阵列,由七个硅NPN 复合晶体管组成,每一对达林顿都串联一个2.7K 的基极电阻,在5V 的工作电压下它能与TTL 和CMOS电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。在这次实验中,使用的是先后对四个引脚依次输入一个脉冲来实现。
6、实际效果图
![](https://img.haomeiwen.com/i24447700/699a5e49a7cf0ccd.png)