步进电机应用-智能储物盒尝试

    由上一篇实验,我们初步解决了步进电机定位的问题;文章可见:https://www.shumeijiang.com/2021/07/25/步进电机定位问题解决尝试;今天我们将在上一篇文章的基础上,由定位衍生出寻找的策略;意思就是在已知的四个点A、B、C、D,分别灵活定义为我们需要存储的物品,然后定义名称;当我们需要的时候,再输入名称程序便可轻松帮我们找寻到物品所在的位置。
    我们定义A点,即正上角(存放“瓜子”)的位置为输出口。
#先看组装效果:
    从安装效果可见,分别在上一篇实验的基础上,将A、B、C、D点四个点分别替换为四个可储物可转动的半封闭容器;然后里面分别存放了“瓜子”,“小毛刷”,“螺丝刀”,“转换头”;当然里面的物品可自定义,也可以为空。
    接下来我们要实现的效果是,我们输入一个物品,比如“螺丝刀”,由于定义A点位输出口,所以程序应该驱动步进电机转动“螺丝刀”到输出口;等我们拿到东西后,步进电机再驱动恢复到初始化状态。
    “此处的输入可以是文字输入,也可以应用我们前面用到的语音识别,也可以是其他传感器触发”。
#实现思路:
1、程序运行,接收输入(命令行/语音输入/传感器触发等);
2、读取物品位置映射;
3、物品的位置地址计算步长N;
4、获取步长N,驱动步进电机执行;
5、输出口停顿等待物品输出;
6、步进电机反转步长N,恢复初试状态。
#视频效果如下:
#关键代码
代码示例

步进电机驱动实验

#实验目的:通过树莓派、ULN2003驱动板以及步进电机,实现转动指定步数,以及反向转动等效果。
#接线效果如图:
接线示例
#关键代码:
代码示例

#!/usr/bin/env python
#coding:utf-8

'''
from JiuJiang
树莓酱的操作实例
http:://www.shumeijiang.com
'''

import RPi.GPIO as GPIO ##引入GPIO模块
import time    ##引入time库

#定义四个引脚
IN1Pin = 18
IN2Pin = 19
IN3Pin = 20
IN4Pin = 21

#设置为BCM编码 同时四个引脚为输出模式
GPIO.setmode(GPIO.BCM)
GPIO.setup(IN1Pin, GPIO.OUT)
GPIO.setup(IN2Pin, GPIO.OUT)
GPIO.setup(IN3Pin, GPIO.OUT)
GPIO.setup(IN4Pin, GPIO.OUT)

#定义初始化
def setVal(val1, val2, val3, val4):
    GPIO.output(IN1Pin, val1)
    GPIO.output(IN2Pin, val2)
    GPIO.output(IN3Pin, val3)
    GPIO.output(IN4Pin, val4)

#初始化四个引脚
setVal(GPIO.LOW, GPIO.LOW, GPIO.LOW, GPIO.LOW)

#定义一步需要的操作
def oneStep(dely):
    if not dely:
        dely = 0.005
    setVal(GPIO.HIGH, GPIO.LOW, GPIO.LOW, GPIO.LOW)
    time.sleep(dely)
    setVal(GPIO.LOW, GPIO.HIGH, GPIO.LOW, GPIO.LOW)
    time.sleep(dely)
    setVal(GPIO.LOW, GPIO.LOW, GPIO.HIGH, GPIO.LOW)
    time.sleep(dely)
    setVal(GPIO.LOW, GPIO.LOW, GPIO.LOW, GPIO.HIGH)
    time.sleep(dely)

#定义一步(反向)需要的操作
def oneStepBack(dely):
    if not dely:
        dely = 0.005
    setVal(GPIO.LOW, GPIO.LOW, GPIO.LOW, GPIO.HIGH)
    time.sleep(dely)
    setVal(GPIO.LOW, GPIO.LOW, GPIO.HIGH, GPIO.LOW)
    time.sleep(dely)
    setVal(GPIO.LOW, GPIO.HIGH, GPIO.LOW, GPIO.LOW)
    time.sleep(dely)
    setVal(GPIO.HIGH, GPIO.LOW, GPIO.LOW, GPIO.LOW)
    time.sleep(dely)

#定义多步操作
def walk(steps, direction):
    if not steps:
        return ;
    if not direction:
        direction = 'forward'

    for i in range(0, steps):
        if direction == 'backward':
            oneStepBack(0.005)
        else:
            oneStep(0.005)

        time.sleep(0.01)  ##每步间的间隔

#执行步进
try:
    steps = input('前进多少步?')
    walk(steps, 'forward')  ##正向走对应步数
    walk(steps, 'backward') ##反向走对应的步数

except KeyboardInterrupt:
    pass

GPIO.cleanup()
#实验效果:
1、执行代码 Python jiujiang.py;
2、可见提示需要输入要走的步数;
3、输入100步后,可见步进电机持续转动;
4、正向转动结束后,会立即反向再转动100步,到达期初的位置;
5、具体转动规则可自定义。
#视频效果如下: