【雕爷学编程】Arduino动手做(182)---DRV8833双路电机驱动模块2
37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
实验一百八十二:DRV8833 电机驱动板模块 小体积高性能 2路直流电机驱动板 自平衡小车 代替TB6612FNG

DRV8833电机驱动模块电原理图







Arduino DRV8833电机控制器库
https://codeload.github.com/TheArduinist/DRV8833/zip/master
https://cfhcable.dl.sourceforge. … ler_library-0.2.zip




【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
实验一百八十二:DRV8833 电机驱动板模块 小体积高性能 2路直流电机驱动板 自平衡小车 代替TB6612FNG
Arduino实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
实验一百八十二:DRV8833 电机驱动板模块 小体积高性能 2路直流电机驱动板 自平衡小车 代替TB6612FNG
*/#define mode_pin 10
#define IN1_PIN 9
#define IN4_PIN 6
#define IN3_PIN 5
#define IN4_PIN 3void setup() {pinMode(IN1_PIN, OUTPUT);pinMode(IN4_PIN, OUTPUT);pinMode(IN3_PIN, OUTPUT);pinMode(IN4_PIN, OUTPUT);pinMode(mode_pin, INPUT);digitalWrite(IN1_PIN, LOW);digitalWrite(IN4_PIN, LOW);digitalWrite(IN3_PIN, LOW);digitalWrite(IN4_PIN, LOW);
}void loop() {int sensorValue = analogRead(A0);int sensorValue1 = analogRead(A1);if (digitalRead(mode_pin) == LOW){digitalWrite(IN3_PIN, LOW);analogWrite(IN4_PIN, sensorValue);digitalWrite(IN1_PIN, LOW);analogWrite(IN4_PIN, sensorValue1);}if (digitalRead(mode_pin) == HIGH){digitalWrite(IN4_PIN, LOW);analogWrite(IN3_PIN, sensorValue);digitalWrite(IN4_PIN, LOW);analogWrite(IN1_PIN, sensorValue1);}
}
【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
实验一百八十二:DRV8833 电机驱动板模块 小体积高性能 2路直流电机驱动板 自平衡小车 代替TB6612FNG
Arduino实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
实验一百八十二:DRV8833 电机驱动板模块 小体积高性能 2路直流电机驱动板 自平衡小车 代替TB6612FNG
*/// Define the control inputs
#define MOT_A1_PIN 10
#define MOT_A2_PIN 9
#define MOT_B1_PIN 6
#define MOT_B2_PIN 5void setup(void){// Set all the motor control inputs to OUTPUTpinMode(MOT_A1_PIN, OUTPUT);pinMode(MOT_A2_PIN, OUTPUT);pinMode(MOT_B1_PIN, OUTPUT);pinMode(MOT_B2_PIN, OUTPUT);// Turn off motors - Initial statedigitalWrite(MOT_A1_PIN, LOW);digitalWrite(MOT_A2_PIN, LOW);digitalWrite(MOT_B1_PIN, LOW);digitalWrite(MOT_B2_PIN, LOW);// Initialize the serial UART at 9600 baudSerial.begin(9600);
}void loop(void){// Generate a fixed motion sequence to demonstrate the motor modes.// Ramp speed up.for (int i = 0; i < 11; i++) {spin_and_wait(25*i, 25*i, 500);}// Full speed forward.spin_and_wait(255,255,2000);// Ramp speed into full reverse.for (int i = 0; i < 21 ; i++) {spin_and_wait(255 - 25*i, 255 - 25*i, 500);}// Full speed reverse.spin_and_wait(-255,-255,2000);// Stop.spin_and_wait(0,0,2000);// Full speed, forward, turn, reverse, and turn for a two-wheeled base.spin_and_wait(255, 255, 2000);spin_and_wait(0, 0, 1000);spin_and_wait(-255, 255, 2000);spin_and_wait(0, 0, 1000);spin_and_wait(-255, -255, 2000);spin_and_wait(0, 0, 1000);spin_and_wait(255, -255, 2000);spin_and_wait(0, 0, 1000);
}/// Set the current on a motor channel using PWM and directional logic.
///
/// \param pwm PWM duty cycle ranging from -255 full reverse to 255 full forward
/// \param IN1_PIN pin number xIN1 for the given channel
/// \param IN2_PIN pin number xIN2 for the given channel
void set_motor_pwm(int pwm, int IN1_PIN, int IN2_PIN)
{if (pwm < 0) { // reverse speedsanalogWrite(IN1_PIN, -pwm);digitalWrite(IN2_PIN, LOW);} else { // stop or forwarddigitalWrite(IN1_PIN, LOW);analogWrite(IN2_PIN, pwm);}
}/// Set the current on both motors.
///
/// \param pwm_A motor A PWM, -255 to 255
/// \param pwm_B motor B PWM, -255 to 255
void set_motor_currents(int pwm_A, int pwm_B)
{set_motor_pwm(pwm_A, MOT_A1_PIN, MOT_A2_PIN);set_motor_pwm(pwm_B, MOT_B1_PIN, MOT_B2_PIN);// Print a status message to the console.Serial.print("Set motor A PWM = ");Serial.print(pwm_A);Serial.print(" motor B PWM = ");Serial.println(pwm_B);
}/// Simple primitive for the motion sequence to set a speed and wait for an interval.
///
/// \param pwm_A motor A PWM, -255 to 255
/// \param pwm_B motor B PWM, -255 to 255
/// \param duration delay in milliseconds
void spin_and_wait(int pwm_A, int pwm_B, int duration)
{set_motor_currents(pwm_A, pwm_B);delay(duration);
}
代码说明:
Arduino代码相当简单。它不需要任何库即可工作。草图首先声明连接到 DRV8833 控制引脚的 Arduino 引脚。
// Define the control inputs
#define MOT_A1_PIN 10
#define MOT_A2_PIN 9
#define MOT_B1_PIN 6
#define MOT_B2_PIN 5
代码的设置部分初始化硬件。它将所有电机控制引脚配置为数字输出,并将其设置为低电平,以最初禁用两个电机。然后,它以 9600 的波特率初始化串行通信。
void setup(void){// Set all the motor control inputs to OUTPUTpinMode(MOT_A1_PIN, OUTPUT);pinMode(MOT_A2_PIN, OUTPUT);pinMode(MOT_B1_PIN, OUTPUT);pinMode(MOT_B2_PIN, OUTPUT);// Turn off motors - Initial statedigitalWrite(MOT_A1_PIN, LOW);digitalWrite(MOT_A2_PIN, LOW);digitalWrite(MOT_B1_PIN, LOW);digitalWrite(MOT_B2_PIN, LOW);// Initialize the serial UART at 9600 baudSerial.begin(9600);
}
代码的循环部分生成一个固定的运动序列来演示电机模式。
它首先逐渐增加电机的速度,然后进入全速,再次减速并反转方向到全速,最后停止。
// Ramp speed up.
for (int i = 0; i < 11; i++) {spin_and_wait(25*i, 25*i, 500);
}
// Full speed forward.
spin_and_wait(255,255,2000);// Ramp speed into full reverse.
for (int i = 0; i < 21 ; i++) {spin_and_wait(255 - 25*i, 255 - 25*i, 500);
}// Full speed reverse.
spin_and_wait(-255,-255,2000);// Stop.
spin_and_wait(0,0,2000);
停止后,它演示了两轮机器人底座的转弯操作,其中一个轮子向前移动,另一个轮子向后移动,导致机器人转动。在演示了所有这些动作之后,循环重复。
// Full speed, forward, turn, reverse, and turn for a two-wheeled base.
spin_and_wait(255, 255, 2000);
spin_and_wait(0, 0, 1000);
spin_and_wait(-255, 255, 2000);
spin_and_wait(0, 0, 1000);
spin_and_wait(-255, -255, 2000);
spin_and_wait(0, 0, 1000);
spin_and_wait(255, -255, 2000);
spin_and_wait(0, 0, 1000);
此草图中使用了三个用户定义的函数:
set_motor_pwm()set_motor_currents()spin_and_wait()
该功能使用 PWM 和方向逻辑设置电机通道上的电流。如果该值为负,则电机沿一个方向旋转。如果值为 0 或正,则电机停止或向另一个方向旋转。
set_motor_pwm()pwmpwm
void set_motor_pwm(int pwm, int IN1_PIN, int IN2_PIN)
{if (pwm < 0) { // reverse speedsanalogWrite(IN1_PIN, -pwm);digitalWrite(IN2_PIN, LOW);} else { // stop or forwarddigitalWrite(IN1_PIN, LOW);analogWrite(IN2_PIN, pwm);}
}
该函数使用前面的函数来设置两个电机上的电流。它将每个电机的当前PWM值打印到串行监视器。
set_motor_currents()
void set_motor_currents(int pwm_A, int pwm_B)
{set_motor_pwm(pwm_A, MOT_A1_PIN, MOT_A2_PIN);set_motor_pwm(pwm_B, MOT_B1_PIN, MOT_B2_PIN);// Print a status message to the console.Serial.print("Set motor A PWM = ");Serial.print(pwm_A);Serial.print(" motor B PWM = ");Serial.println(pwm_B);
}
该函数设置速度并等待指定的时间量,然后再移动到下一个命令。它使用该函数为两个电机设置PWM值,然后等待指定的毫秒。
spin_and_wait()set_motor_currents()duration
void spin_and_wait(int pwm_A, int pwm_B, int duration)
{set_motor_currents(pwm_A, pwm_B);delay(duration);
}

相关文章:
【雕爷学编程】Arduino动手做(182)---DRV8833双路电机驱动模块2
37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…...
一个完整的http请求响应过程
一、 HTTP请求和响应步骤 以上完整表示了HTTP请求和响应的7个步骤,下面从TCP/IP协议模型的角度来理解HTTP请求和响应如何传递的。 二、TCP/IP协议 TCP/IP协议模型(Transmission Control Protocol/Internet Protocol),包含了一系…...
Unity通过代码切换材质
效果展示 代码 using System.Collections; using System.Collections.Generic; using UnityEngine;public class MaterialSwitcher : MonoBehaviour {public Material newMaterial; // 新材质private Material oldMaterial; // 旧材质private Renderer renderer; // 渲染器组件…...
Java根据坐标经纬度计算两点距离(5种方法)、校验经纬度是否在圆/多边形区域内的算法推荐
目录 前言 一、根据坐标经纬度计算两点距离(5种方法) 1.方法一 2.方法二 3.方法三 4.方法四 5.方法五 5.1 POM引入第三方依赖 5.2 代码 6.测试结果对比 二、校验经纬度是否在制定区域内 1.判断一个坐标是否在圆形区域内 2.判断一个坐标是否…...
PIC单片机如何设计延时
PIC单片机如何设计延时 PIC单片机的延时基本有两种,一种是自己设计的delay()函数,另一种就是利用其自带的Time定时器。当然一般Time定时器的精度要高于自己设计delay()函数,Time定时器是单片机内部的硬件寄存器模块,而delay()函数是利用自加自减来实现延时,代码进行顺序执…...
FFmpeg常见命令行(二):FFmpeg转封装
前言 在Android音视频开发中,网上知识点过于零碎,自学起来难度非常大,不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》。本文是Android音视频任务列表的其中一个, 对应的要学习的内容是:如何使…...
全面升级:华为鸿蒙HarmonyOS4正式发布,玩趣个性化,小艺AI升级
8月4日新闻,今天下午,华为正式发布了最新版本的鸿蒙操作系统——HarmonyOS 4! 在华为发布会上,鸿蒙HarmonyOS迎来了一系列令人激动的功能升级。其中包括个性化空间、多种生产力工具以及增强的手机AI助手"小艺"。这次更…...
【python】使用Selenium和Chrome WebDriver来获取 【腾讯云 Cloud Studio 实战训练营】中的文章信息
文章目录 前言导入依赖库设置ChromeDriver的路径创建Chrome WebDriver对象打开网页找到结果元素创建一个空列表用于存储数据遍历结果元素并提取数据提取标题、作者、发布时间等信息判断是否为目标文章提取目标文章的描述、阅读数量、点赞数量、评论数量等信息将提取的数据存储为…...
使用Feign 的远程调用,把mysql数据导入es
要把数据库数据导入到elasticsearch中,包括下面几步: 1)将商品微服务中的分页查询商品接口定义为一个FeignClient,放到feign-api模块中 2)搜索服务编写一个测试业务,实现下面功能: 调用item-ser…...
Java课题笔记~ MyBatis接口开发(代理开发)
使用XML文件进行开发,在调用SqlSession进行操作时,需要指定MyBatis映射文件中的方法,这种调用方式过于烦琐。为解决此问题,MyBatis提供了接口开发的方式。 接口开发的目的: 解决原生方式中的硬编码 简化后期执行SQL …...
从数学到深度学习的学习资料及教程合集
诸神缄默不语-个人CSDN博文目录 目前仅收集免费内容,最多需要买本纸质书。 付费的如果有免费版本我也会收录。 链接如失效请联系我。 这个笔记主要是为我自己准备的,算是一个可公开的to do list(其实做不完的我也知道)ÿ…...
nn.CrossEntropyLoss()报错
RuntimeError: “nll_loss_forward_reduce_cuda_kernel_2d_index” not implemented for ‘Float’ Traceback (most recent call last): File "<string>", line 1, in <module> File "/home/zz/anaconda3/envs/torch1.11/lib/python3.7/site-pack…...
【BASH】回顾与知识点梳理(一)
【BASH】回顾与知识点梳理 一 前言一. 认识与学习 BASH1.1 硬件、核心与 Shell1.2 为何要学文字接口的 shell?1.3 系统的合法 shell 与 /etc/shells 功能1.4 Bash shell 的功能1.5 查询指令是否为 Bash shell 的内建命令: type1.6 指令的下达与快速编辑按…...
AWS Amplify 部署node版本18报错修复
Amplify env:Amazon Linux:2 Build Error : Specified Node 18 but GLIBC_2.27 or GLIBC_2.28 not found on build 一、原因 报错原因是因为默认情况下,AWS Amplify 使用 Amazon Linux:2 作为其构建镜像,并自带 GLIBC 2.26。不过,…...
K8S添加yum源并安装kubectl/kubeadm/kubelet组件
1.安装kubectl/kubeadm/kubelet ##添加yum 源 cat > /etc/yum.repos.d/kubernetes.repo << EOF [kubernetes] nameKubernetes baseurlhttps://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled1 gpgcheck0 repo_gpgcheck0 gpgkeyhttps://mirr…...
kafka生产者指定ip
kafka生产者指定ip 最近工作中遇到一个问题,记录一下,需求中要求往kafka上推送信息。本来是个很简单的需求,但是踩了一个坑。 我通过spring boot集成了kafka写了一个生产者,客户那边给我三个节点的ip,然后我也没多想…...
python 封装sql 增删改查连接MySQL
select * from Teacher limit 10 连接字符串配置MysqlConfig.py class MysqlConfig:HOST 192.168.56.210PORT 3306USER rootPASSWORD 1qaz0987654321DBStudentDBCHARSET utf8封装增删改查MysqlConnection.py Author: tkhywang 2810248865qq.com Date: 2023-06-19 15:44:48 Las…...
Flink正常消费一段时间后,大量反压,看着像卡住了,但又没有报错。
文章目录 前言一、原因分析二、解决方案 前言 前面我也有提到,发现flink运行一段时间后,不再继续消费的问题。这个问题困扰了我非常久,一开始也很迷茫。又因为比较忙,所以一直没有时间能够去寻找答案,只是通过每天重启…...
软件测试需求分析的常用方法
软件测试需求分析时,应要求产品人员对需求进行讲解,并使用相对应的方法进行科学分析,否则无法保障软件测试的完整性和科学性,从而造成在项目中后期Bug频出、风险增大等问题。 而常用的测试需求分析的方法: 1、功能分解…...
数据结构10 -查找_树表查找
创建二叉搜索树 二叉搜索树 二叉搜索树是有数值的了,二叉搜索树是一个有序树。 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
