玩转树莓派

树莓派通过C语言和python控制步进电机

2021-01-18  本文已影响0人  刘小白DOER

    今天笔者完成树莓派通过C语言和python操作步进电机,步进电机可是机器人的基础。步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机。每输入一个脉冲信号,转子就转动一个角度或前进一步。笔者砌砖垒瓦,最后搞个树莓派小车来玩玩。

  实践证明C语言比python控制稍微平顺一些。

1、接线图

    实际接线中,笔者将+  -供电接在9伏的电池上,步进电机驱动供电支持5-12V。

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原理图

驱动模块说明:ULN2003是高耐压、大电流复合晶体管阵列,由七个硅NPN 复合晶体管组成,每一对达林顿都串联一个2.7K 的基极电阻,在5V 的工作电压下它能与TTL 和CMOS电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。在这次实验中,使用的是先后对四个引脚依次输入一个脉冲来实现。

6、实际效果图

上一篇 下一篇

猜你喜欢

热点阅读