02-基础例程2

news2024/12/24 2:47:07

基础例程2

01、直流电机

对于UL2003来说,可以看作是非门

输入为1,输出为0;

输入为0,输出为高组态[接一个上拉电阻即为1]

在这里插入图片描述

线路的连接

在这里插入图片描述

4路是用做步进电机的

对于直流电机,只需要一路。即异端接VCC,一段接OUT1。

在MOTOR_IN1引脚,与15引脚相连(下拉),即初始为0,对应OUT1为高组态。直流电机一端为5V,一端高组态,即不工作。

板子:ESP32——>ESP32 Dev Module

相应的代码如下:

/* 深圳市普中科技有限公司(PRECHIN 普中)
   技术支持:www.prechin.net
 * 实验名称:直流电机实验
 * 
 * 接线说明:电机模块-->ESP32 IO
 *         (IN1)-->(15)
 *         
 *         电机模块输出-->直流电机
 *         (5V)-->任意一脚
 *         (O1)-->任意一脚
 * 实验现象:程序下载成功后,直流电机旋转3S后停止 
 */

//定义电机控制管脚
#define motor_pin   15

//类型重定义
typedef unsigned char u8;
typedef unsigned int u16;

//定义全局变量

void setup() {
  pinMode(motor_pin, OUTPUT);//设置引脚为输出模式
  digitalWrite(motor_pin,1);//输出高电平,电机开启
  delay(3000);//延时3S
  digitalWrite(motor_pin,0);//输出低电平,电机停止
}

void loop() {
  
}

02、步进电机

步进电机型号:28BYJ48

步进电机的工作原理。4向5线。1条连接VCC,另外4条线接OUT1——OUT4,从而控制4个不同的方向。总共形成8个方向

在这里插入图片描述

步进电机的参数信息

在这里插入图片描述

实验目的:通过按键控制步进电机正反转、加速与减速

对于线路连接,与01、直流电机相似

控制逻辑

  • 正转

对于控制逻辑,A->AB->B->BC->C->CD->D->DA

即下面引脚依此为0

OUT1->OUT1 OUT2->OUT2->OUT2 OUT3 ->OUT3->OUT3 OUT4->OUT4->OUT4 OUT1

对于输入而言,即下面引脚依此为1

IN1——>IN1 IN2——>IN2——>IN2 IN3——>IN3——>IN3 IN4——>IN4——>IN4 IN1

  • 反转
u8 temp=step;
  
  if(dir==0)  //如果为逆时针旋转
    temp=7-step;//调换节拍信号
  • 初始态

key1-key4全部为上拉,即初始为

  • 接线说明
 /*
 * 接线说明:电机模块-->ESP32 IO
 *         (IN1-IN4)-->(15,2,0,4)
 *         
 *         电机模块输出-->28BYJ-48步进电机
 *         (5V)-->红线
 *         (O1)-->依次排序
 *         
 *         按键模块-->ESP32 IO
 *         (K1-K4)-->(14,27,26,25)
 */

实验程序

  • 对于main函数而言
/* 深圳市普中科技有限公司(PRECHIN 普中)
   技术支持:www.prechin.net
 * 
 * 实验名称:步进电机实验
 * 
 * 接线说明:电机模块-->ESP32 IO
 *         (IN1-IN4)-->(15,2,0,4)
 *         
 *         电机模块输出-->28BYJ-48步进电机
 *         (5V)-->红线
 *         (O1)-->依次排序
 *         
 *         按键模块-->ESP32 IO
 *         (K1-K4)-->(14,27,26,25)
 * 
 * 实验现象:程序下载成功后,当按下KEY1键可调节电机旋转方向;当按下KEY2键,电机加速;
            当按下KEY3键,电机减速;
 * 
 * 注意事项:
 * 
 */

#include "public.h"
#include "key.h"
#include "step_motor.h"


//定义全局变量
u8 g_key=0;
u8 g_dir=0;//默认逆时针方向
u8 g_speed=STEPMOTOR_MAXSPEED;//默认最大速度旋转
u8 g_step=0;

void setup() {
  key_init();
  step_motor_init();
}

void loop() {
  g_key=key_scan(0);
  if(g_key==KEY1_PRESS)//换向
  {
    g_dir=!g_dir;    
  }
  else if(g_key==KEY2_PRESS)//加速
  {
    if(g_speed>STEPMOTOR_MAXSPEED)//>1,延时减小,相当于加速
      g_speed-=1;     
  }
  else if(g_key==KEY3_PRESS)//减速
  {
    if(g_speed<STEPMOTOR_MINSPEED)//<5,延时增加,相当于减速
      g_speed+=1;     
  }
  step_motor_28BYJ48_send_pulse(g_step++,g_dir);    //每次一次循环,方向移动1次
  if(g_step==8)g_step=0;    
  delay(g_speed);   //速度用延时来表示
}

  • 对于按键扫描函数key.c
#include "key.h"


//端口初始化
void key_init(void)
{
  pinMode(key1_pin, INPUT_PULLUP);//设置引脚为输入上拉模式
  pinMode(key2_pin, INPUT_PULLUP);
  pinMode(key3_pin, INPUT_PULLUP);
  pinMode(key4_pin, INPUT_PULLUP);
}

/*******************************************************************************
* 函 数 名       : key_scan
* 函数功能        : 检测独立按键是否按下,按下则返回对应键值
* 输    入       : mode=0:单次扫描按键
                  mode=1:连续扫描按键
* 输    出       : KEY1_PRESS:K1按下
                  KEY2_PRESS:K2按下
                  KEY3_PRESS:K3按下
                  KEY4_PRESS:K4按下
                  KEY_UNPRESS:未有按键按下
*******************************************************************************/
u8 key_scan(u8 mode)
{
  static u8 key=1;

  if(mode)key=1;//连续扫描按键
  if(key==1&&(digitalRead(key1_pin)==0||digitalRead(key2_pin)==0||digitalRead(key3_pin)==0||digitalRead(key4_pin)==0))//任意按键按下
  {
    delay(10);//消抖
    key=0;
    if(digitalRead(key1_pin)==0)
      return KEY1_PRESS;
    else if(digitalRead(key2_pin)==0)
      return KEY2_PRESS;
    else if(digitalRead(key3_pin)==0)
      return KEY3_PRESS;
    else if(digitalRead(key4_pin)==0)
      return KEY4_PRESS;  
  }
  else if(digitalRead(key1_pin)==1&&digitalRead(key2_pin)==1&&digitalRead(key3_pin)==1&&digitalRead(key4_pin)==1) //无按键按下
  {
    key=1;      
  }
  return KEY_UNPRESS;   
}

  • 对于电机控制
#include "step_motor.h"

//端口初始化
void step_motor_init(void)
{
  pinMode(ina_pin, OUTPUT);//设置引脚为输出模式
  pinMode(inb_pin, OUTPUT);
  pinMode(inc_pin, OUTPUT);
  pinMode(ind_pin, OUTPUT);
}

/*******************************************************************************
* 函 数 名       : step_motor_28BYJ48_send_pulse
* 函数功能       : 输出一个数据给ULN2003从而实现向步进电机发送一个脉冲
* 输    入       : step:指定步进序号,可选值0~7
                  dir:方向选择,1:顺时针,0:逆时针
* 输    出       : 无
*******************************************************************************/
void step_motor_28BYJ48_send_pulse(u8 step,u8 dir)
{
  u8 temp=step;
  
  if(dir==0)  //如果为逆时针旋转
    temp=7-step;//调换节拍信号
  switch(temp)//8个节拍控制:A->AB->B->BC->C->CD->D->DA
  {
    case 0: digitalWrite(ina_pin,1);digitalWrite(inb_pin,0);digitalWrite(inc_pin,0);digitalWrite(ind_pin,0);break;
    case 1: digitalWrite(ina_pin,1);digitalWrite(inb_pin,1);digitalWrite(inc_pin,0);digitalWrite(ind_pin,0);break;
    case 2: digitalWrite(ina_pin,0);digitalWrite(inb_pin,1);digitalWrite(inc_pin,0);digitalWrite(ind_pin,0);break;
    case 3: digitalWrite(ina_pin,0);digitalWrite(inb_pin,1);digitalWrite(inc_pin,1);digitalWrite(ind_pin,0);break;
    case 4: digitalWrite(ina_pin,0);digitalWrite(inb_pin,0);digitalWrite(inc_pin,1);digitalWrite(ind_pin,0);break;
    case 5: digitalWrite(ina_pin,0);digitalWrite(inb_pin,0);digitalWrite(inc_pin,1);digitalWrite(ind_pin,1);break;
    case 6: digitalWrite(ina_pin,0);digitalWrite(inb_pin,0);digitalWrite(inc_pin,0);digitalWrite(ind_pin,1);break;
    case 7: digitalWrite(ina_pin,1);digitalWrite(inb_pin,0);digitalWrite(inc_pin,0);digitalWrite(ind_pin,1);break;
    default: digitalWrite(ina_pin,0);digitalWrite(inb_pin,0);digitalWrite(inc_pin,0);digitalWrite(ind_pin,0);break;//停止相序 
  }     
}


lWrite(ind_pin,1);break;
    case 7: digitalWrite(ina_pin,1);digitalWrite(inb_pin,0);digitalWrite(inc_pin,0);digitalWrite(ind_pin,1);break;
    default: digitalWrite(ina_pin,0);digitalWrite(inb_pin,0);digitalWrite(inc_pin,0);digitalWrite(ind_pin,0);break;//停止相序 
  }     
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/946704.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

unordered-------Hash

✅<1>主页&#xff1a;我的代码爱吃辣&#x1f4c3;<2>知识讲解&#xff1a;数据结构——哈希表☂️<3>开发环境&#xff1a;Visual Studio 2022&#x1f4ac;<4>前言&#xff1a;哈希是一种映射的思想&#xff0c;哈希表即使利用这种思想&#xff0c;…

基于野马算法优化的BP神经网络(预测应用) - 附代码

基于野马算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于野马算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.野马优化BP神经网络2.1 BP神经网络参数设置2.2 野马算法应用 4.测试结果&#xff1a;5.Matlab代码 摘要…

【深入浅出设计模式--状态模式】

深入浅出设计模式--状态模式 一、背景二、问题三、解决方案四、 适用场景总结五、后记 一、背景 状态模式是一种行为设计模式&#xff0c;让你能在一个对象的内部状态变化时改变其行为&#xff0c;使其看上去就像改变了自身所属的类一样。其与有限状态机的概念紧密相关&#x…

RT-Thread在STM32硬件I2C的踩坑记录

RT-Thread在STM32硬件I2C的踩坑记录 0.前言一、软硬件I2C区别二、RT Thread中的I2C驱动三、尝试适配硬件I2C四、i2c-bit-ops操作函数替换五、Attention Please!六、总结 参考文章&#xff1a; 1.将硬件I2C巧妙地将“嫁接”到RTT原生的模拟I2C驱动框架 2.基于STM32F4平台的硬件I…

flutter 上传图片并裁剪

1.首先在pubspec.yaml文件中新增依赖pub.dev image_picker: ^0.8.75 image_cropper: ^4.0.1 2.在Android的AndroidManifest.xml文件里面添加权限 <activityandroid:name"com.yalantis.ucrop.UCropActivity"android:screenOrientation"portrait"andro…

Golang网络编程

互联网协议介绍引入 1. 物理层&#xff08;Physical Layer&#xff09;&#xff1a; - 功能&#xff1a;物理层负责定义物理介质传输数据的方式和规范&#xff0c;它传输的是原始数据比特流。 - 协议&#xff1a;Ethernet、Wi-Fi、USB、光纤等。 - 例子&#xff1a;将…

[javaWeb]Socket网络编程

网络编程&#xff1a;写一个应用程序,让这个程序可以使用网络通信。这里就需要调用传输层提供的 api。 Socket套接字 传输层提供协议&#xff0c;主要是两个: UDP和TCP 提供了两套不同的 api&#xff0c;这api也叫做socket api。 UDP和 TCP 特点对比&#xff1a; UDP: 无连…

数据结构day05(单链表)

今日任务&#xff1a; 思维导图&#xff1a; 实现 代码&#xff1a;&#xff08;多文件&#xff09; head.h #ifndef __HEAD_H__ #define __HEAD_H__#include <stdio.h> #include <string.h> #include <stdlib.h> typedef int datatype;typedef struct Lin…

Nuxt3 与 Vue3 的 Server api 全栈开发之路

Nuxt Server Api 阅读时长&#xff1a;15分钟 本文内容&#xff1a; 国内关于Nuxt3的资料太少了&#xff0c;而Nuxt3又发布了没有多久&#xff0c;导致资料太少。本文浓缩讲解了&#xff0c;对于一个前端开发&#xff0c;上手使用 Nuxt3&#xff0c;并一个人承担前后端开发的所…

Hive3第六章:更换引擎

系列文章目录 Hive3第一章&#xff1a;环境安装 Hive3第二章&#xff1a;简单交互 Hive3第三章&#xff1a;DML数据操作 Hive3第三章&#xff1a;DML数据操作(二) Hive3第四章&#xff1a;分区表和分桶表 Hive3第五章&#xff1a;函数 Hive3第六章&#xff1a;更换引擎 文章目…

网络安全—0基础学习笔记(黑客)

一、前言 1.这是一条坚持的道路,三分钟的热情可以放弃往下看了. 2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发. 3.有时多 google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答. 4.遇到实在搞不懂的,可以先放放,以后再来解决. …

2023年智慧政务一网通办云平台顶层设计与建设方案PPT

导读&#xff1a;原文《2023年智慧政务一网通办云平台顶层设计与建设方案PPT》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 部分内容&#xff1a; 喜欢文章&#…

Spring——RESTful Web服务

文章目录 RESTful Web 服务介绍内容概览下载 Lombok 优化代码利器RESTful Web 服务开发运行项目并测试效果 RESTful Web 服务介绍 本节我们将开发一个简单的 RESTful Web 服务。 RESTful Web 服务与传统的 MVC 开发一个关键区别是返回给客户端的内容的创建方式&#xff1a;传…

Go操作各大消息队列教程(RabbitMQ、Kafka)

Go操作各大消息队列教程 1 RabbitMQ 1.1 概念 ①基本名词 当前市面上mq的产品很多&#xff0c;比如RabbitMQ、Kafka、ActiveMQ、ZeroMQ和阿里巴巴捐献给Apache的RocketMQ。甚至连redis这种NoSQL都支持MQ的功能。 Broker&#xff1a;表示消息队列服务实体Virtual Host&#x…

感觉车载测试的这一波敏捷风快过去了

敏捷&#xff0c;算不得汽车行业的原生产物&#xff0c;几年前&#xff0c;耳边很少听到这个字眼&#xff0c;基本算是在近几年传统汽车行业开始衰落的大背景下&#xff0c;而后伴随着软件从互联网等行业传进来的。 这两年&#xff0c;大家开始把敏捷谈得风生水起&#xff0c;…

用idea查看sqlite数据库idea sqlite

1、安装Database Navigator插件 2、导入数据库并查看 3、删除数据库连接 在此做个笔记

VUE环境下 CSS3+JS 实现发牌 翻牌

创建牌容器&#xff08;关键点&#xff1a;overflow&#xff1a;hidden&#xff09;&#xff1a; <div class"popup-box"></div> .popup-box {position: absolute;width: 100vw;height: 100vh;top: 0px;left: 0;overflow: hidden; } 创建每一张牌《固…

python+TensorFlow实现人脸识别智能小程序的项目(包含TensorFlow版本与Pytorch版本)(一)

pythonTensorFlow实现人脸识别智能小程序的项目&#xff08;包含TensorFlow版本与Pytorch版本&#xff09;&#xff08;一&#xff09; 一&#xff1a;TensorFlow基础知识内容部分&#xff08;简明扼要&#xff0c;快速适应&#xff09;1、下载Cifar10数据集&#xff0c;并进行…

react17:生命周期函数

挂载时更新时 setState触发更新、父组件重新渲染时触发更新forceUpdate触发更新卸载时 react&#xff08;v17.0.2&#xff09;的生命周期图谱如下。 相较于16版本&#xff0c;17版本生命周期函数有如下变化&#xff1a; componentWillMount() componentWillUpdate() compone…

mac电脑屏幕录制Berrycast Mac屏幕录制软件

Berrycast是一款为Mac设计的优秀屏幕录制软件&#xff0c;它让屏幕录制变得简单而高效。以下是Berrycast的一些主要特点&#xff1a; 简单的用户界面&#xff1a;Berrycast拥有直观和简洁的用户界面&#xff0c;使得用户可以轻松上手。高质量的视频输出&#xff1a;Berrycast能…