基于STM32与TB6600的机械臂项目(代码开源)

news2025/1/12 23:41:31

        前言:本文为手把手教学STM32的机械臂项目——Robot Arm,本次项目采用的是STM32作为MCU。该机械臂的基础模型为国外开源项目,诸多前辈经过长时间的验证与改进,其机械臂精度可以满足日常需求。本项目机械臂为三自由度机械臂,42步进电机搭配TB6600驱动器作为动力支撑。整体项目框架具有极高的可拓展性,方便后期实现视觉抓取等高级嵌入式开发应用。 机械臂的控制选用JDY-31蓝牙控制,结合手机上位机APP进行联动。(文末有代码与3D打印件开源!

        实验硬件:STM32F103ZET6;TB6600驱动器;42步进电机;JDY-31蓝牙模块;5V步进电机;ULN2003驱动板;机械臂3D打印件

        硬件实物图:

        效果图:

一、机械臂简介

        机械臂是机械人技术领域中得到最广泛实际应用的自动化机械装置,在工业制造、医学治疗、娱乐服务、军事、半导体制造以及太空探索等领域都能见到它的身影。尽管它们的形态各有不同,但它们都有一个共同的特点,就是能够接受指令,精确地定位到三维(或二维)空间上的某一点进行作业。机械臂是指高精度,多输入多输出、高度非线性、强耦合的复杂系统。因其独特的操作灵活性,已在工业装配、安全防爆等领域得到广泛应用。

        本项目的机械臂目前为被动控制方案,需要使用手机蓝牙APP作为上位机,人为控制抓取目标物。考虑到目前设计的机械臂已拥有较高的机械精度,后续可以附加树莓派等开发板进行视觉抓取开发。

二、42步进电机与TB6600驱动器

2.1 42步进电机

        42步进电机是指安装机座尺寸是42mm×42mm的步进电机,又叫NEMA 17步进电机(这里的NEMA是National Electrical Manufacturers Association的缩写,美国电气制造商协会是美国最大的电气设备制造商协会),如下图所示,相同机座尺寸的步进电机又有不同长度和不同绕组参数的型号,一般相同机座尺寸的情况下,步进电机越长,定子上能够绕下的绕组就越多,电机的输出力矩就越大。

42 57 86步进电机的主要区别是什么(即42 57 86的意义是什么)?

答:42 57 86步进电机的区别主要是步进电机的机座不同,尺寸分别是42×42mm、57×57mm、86×86mm,一般来说步进电机的机座尺寸越大,电机的静力矩就越大,电机运行时的转矩就越大,电机能够承受的负载就越大。

        本项目中所使用的为四线二相42步进电机,步距角是1.8度,在无细分的情况下转一圈走200步,360/1.8=200。切记:42这个数字的含义仅与电机的尺寸有关。而电机步距角细分程度只与电机驱动器的配置有关。

机械臂由3台42步进电机驱动,实现三自由度控制。限位器则可以用来初始化机械臂位置,合理校准机械臂对应的笛卡尔空间坐标下的状态。

2.2 TB6600驱动器

        驱动步进电机往往需要驱动器帮助,常见的步进电机驱动器有:TB6600、A4988、DM542、DMA860HULN2003等。其中,大部分步进电机驱动器用法和接线思路大致相同,驱动电机的原理也基本一样。

        项目中使用的步进电机驱动器为TB6600TB6600是一款专业的两相步进电机驱动器,兼容STM32Arduino其他多种主控器,可实现电机正反转控制,旋转角度控制等功能。步进电机驱动是一种电子设备,通常作为桥梁来连接控制器、电源和步进电机。虽然控制器的处理性能很强大,但是它本身的输出能力(电流)却很弱小。它需要一个中间桥梁去连接电机和主控,并同时为电机提供足够的电源。

        TB6600步进电机驱动器采用H桥双极恒相流驱动,可直接用9~42VDC供电,可选择7档细分控制1、2/A、2/B、4、8、16、32),8档电流控制0.5A、1A、1.5A、2A、2.5A、2.8A、3.0A、3.5A)。最高支持4A电流输出。信号端都有配有高速光电隔离,防止信号干扰,并且支持共阴共阳两种信号输入方式。出于安全考虑,驱动器支持脱机保持功能,能够让用户在通电状态下调试。内置温度保护和过流保护,可适应更严苛的工作环境。 驱动器适合驱动57、42型两相、四相混合式步进电机,能达到低振动、低噪声、高速度的驱动效果。可以适用于机械人控制,3D打印等高精度应用领域中。

       通过拨动TB6600侧边的拨码开关设置步进电机的细分电流, 当拨码开关向下拨动则为ON,上图为作者设置的步进电机为16细分,电流设置为1.0A分析:正常情况下,步进电机的步距角为1.8°,转动一圈需要200脉冲,当设置为16细分则需要16×200=3200脉冲(一个脉冲步距角为0.1125°)。而电流拨码开关的设置只要保证输出电流别超过步进电机电流的运载上限就行。

TB6600信号线的共阴和共阴接法:

(1)共阴接法:分别将PUL-,DIR-,EN-连接到控制系统的地端,脉冲输入信号通过PUL+接入,方向信号通过DIR+接入,使能信号通过EN+接入。若需限流电阻,限流电阻R的接法取值与共阳极接法相同。

(2)共阳接法:分别将PUL+,DIR+,EN+连接到控制系统的电源上,如果此电源是+5V则可直接接入,如果此电源大于+5V,则须外部另加串联限流电阻R,保证给驱动器内部光藕提供8到15mA的驱动电流。脉冲输入信号通过PUL-接入,方向信号通过DIR-接入,使能信号通过EN-接入。

特别注意:作者建议大家采用共阴接法,方便且不容易犯错。

特别注意:

初学者接触步进电机与步进电机驱动器时,很容易接错相位线导致出现缺陷漏项发现。所以,当发现信号线电源线都满足驱动要求,但无法驱动步进电机亦或是步进电机驱动异常时(出现丢步,转动噪音等)。问题往往可能出现在相位线接错了,读者朋友们可以去找步进电机厂商去拿一下步进电机的相位线说明。

三、5V步进电机与ULN2003驱动器

        5V五线四相步进电机是一种常见的小扭矩电机,本项目中采用此电机通过机械结构驱动机械臂爪子进行物体抓取。该型号电机往往使用ULN2003驱动器配合使用,UNL2003器件是高电压大电流达林顿晶体管阵列。

        该直流减速电机直径:28mm 电压:5V 步距角度:5.625×1/64 减速比:1/64;步距角:5.625 / 64 = 0.087度 (也就是说理论上,你给一个脉冲,电机外部轴转动0.087度)也就是说一个脉冲内部转子转5.625度,但是由于减速64倍,所以外部轴只转了0.087度那么外部轴要转一圈的话,需要360/0.087=4096个脉冲。采用4相8拍驱动的话,8个脉冲是一个周期,那么就需要4096/8=512个周期,外部轴刚好转一圈。

电机的驱动一般分为3种方法

一.  1相励磁法:每一瞬间只有一个线圈相通,其它休息。

优点:简单,耗电低,精确性良好。(缺点)力矩小,振动大,每次励磁信号走的角度都是标称角度。1相励磁法:A->B->C->D

二、 2相励磁法:每一瞬间有两个线圈导通。

优点:力矩大,震动小。缺点:每励磁信号走的角度都是标称角度。2相励磁法  AB->BC->CD->DA

三、 1-2相励磁法:1相和2相交替导通。

优点:精度较高,运转平滑,每送一个励磁信号转动1/2标称角度,称为半步驱动。(前两种称为4相4拍,这一种称为4相8拍)1-2相励磁法  A-->AB-->B->BC->C-->CD->D-->DA

        ULN2003驱动板上的IN1、IN2、IN3、IN4四个引脚和单片机的IO口直接使用杜邦线连接,为了方便初次学习ULN2003驱动板的朋友理解,这里仅具体给大家讲解1相励磁法,如下图所示:

        上图4个定子线圈分别为A、B、C、D,我们依次给A、B、C、D通电,则可实现电机的转动,这个就是上面提到的1相励磁法。使用ULN2003驱动板时,我们只需要将IN1、IN2、IN3、IN4四个引脚分别去逐个给予高电平即可(使用定时器)。

四、机械臂控制

4.1 JDY-31蓝牙控制

        JDY-31蓝牙模块基于蓝牙3.0 SPP设计,这样可以支持 Windows、Linux、android数据透传,工作频段 2.4GHZ,调制方式GFSK,最大发射功率8db,最大发射距离30米,支持用户通过AT命令修改设备名、波特率等指令,方便快捷使用灵活。

        其通常使用时接入串口引脚(UART)即可,成功与蓝牙模块建立通信后会发送CONNECTED。简单的说,JDY-31蓝牙模块本质上就是一个蓝牙转串口的设备,使用的时候直接当串口通讯进行使用即可。

        而上位机作者则选用现成开源的蓝牙调试器APP,直接创建一个针对本项目机器人的控制上位机工程。利用该APP极大的缩短了上位机开发的时间与工作量,也可以快速检验出机器人的运动控制是否满足要求(需要蓝牙调试APP的可以私信作者提供)。

JDY-31蓝牙模块的AT指令集:

序号

目的

指令

参数

响应

备注

1

查询版本号

AT+VERSION

NONE

+VERSION=…

2

复位

AT+RESET

NONE

+OK

3

断开连接

AT+DISC

NONE

+OK

蓝牙连接后有效

4

BLE蓝牙MAC地址

AT+LADDR

NONE

+LADDR=…

5

波特率设置/查询

AT+BAUD[参数]

4-9600;5-19200;6-38400;7-57600;8-115200;9-128000

+OK

128000也不丢包

6

SPP蓝牙密码配对/查询

AT+PIN[参数]

4位密码

+OK

默认1234

7

广播名设置/查询

AT+NAME[参数]

18字节以下

OK

8

恢复出厂设置

AT+DEFAULT

NONE

OK

默认JDY-31-SPP

9

串口输出状态使能查询

AT+ENLOG

1:打开 0:关闭

OK

默认为1

特别注意:购买的JDY-31蓝牙模块可能初试化的波特率不一样,读者朋友一定要去询问到厂家的初试波特率或自己使用AT指令去设置一下,否则对后续的蓝牙控制会造成很大影响。

4.2 机械臂运动学建模

        合格的机械臂产品往往都需要根据其设计的机械结构去解算其运动模型,即仅输入需要的笛卡尔空间坐标系下的位置点\left ( x,y,z \right ),即可解算出各台电机需要运转的情况。考虑到博客篇幅有限,这里仅给大家提供该机械臂的几何模型算法,后续基于树莓派与STM32的视觉抓取机械臂给大家详细介绍一下。

五、 CubeMX配置

1、RCC配置外部高速晶振(精度更高)——HSE;

2、SYS配置:Debug设置成Serial Wire否则可能导致芯片自锁);

3、TIM2配置:利用TM2定时器配置us级脉冲

4、UART3配置: JDY-31模块与STM32的蓝牙串口通讯(开启串口中断);

5、GPIO配置:PA5、PA6、PA7为机械臂方向控制引脚;PD9、PD10、PD11、PD12为5V步进电机的四相输入;PF13、PF14、PF15为机械臂电机驱动脉冲输入引脚;

6、时钟树配置:

7、工程配置:

六、代码与解析

6.1 机械臂电机控制代码

        机械臂的驱动器件为3台42步进电机,通过TB6600驱动器进行驱动。单片机MCU主要控制的是TB6600上的DIRPUL端口,其控制过程也很简单——GPIO控制即可(作者选择共阴接法,DIR-与PUL-都需接地,只需要控制DIR+与PUL+即可)。

        其中,DIR+端口的控制为GPIO的高低电平控制,该DIR+端口的高低电平输入决定了步进电机的转动方向PUL+端口则需要输入脉冲信号进行控制,脉冲频率的高低决定了步进电机的转速。当然,这里的PUL+端口的脉冲输入有2种主流方式:(1)us级延迟函数GPIO电平翻转(2)设置定时器翻转GPIO(这里作者使用us级延迟函数翻转实现脉冲)。

Motordrive.h代码:

#ifndef __MOTORDRIVER_H
#define __MOTORDRIVER_H

#include "main.h"

//电机方向控制引脚
//正转
#define MOTOR1Forward HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
#define MOTOR2Forward HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET);
#define MOTOR3Forward HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);
//反转
#define MOTOR1Backward HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET)
#define MOTOR2Backward HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET)
#define MOTOR3Backward HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET) 

//步进电机控制
void Motor1(short dir,int speed);//步进电机1号机
void Motor2(short dir,int speed);//步进电机2号机
void Motor3(short dir,int speed);//步进电机3号机

#endif

Motordrive.c代码:

#include "Motordrive.h"
#include "tim.h"

//1号步进电机,1正转,其他反转
void Motor1(short dir,int speed)
{
	if(dir == 1)
	{
		MOTOR1Forward;		
	}
	else
	{
		MOTOR1Backward;
	}
	
	//电机脉冲控制
	HAL_GPIO_WritePin(GPIOF,GPIO_PIN_13,GPIO_PIN_SET);
	Tims_delay_us(speed);
	HAL_GPIO_WritePin(GPIOF,GPIO_PIN_13,GPIO_PIN_RESET);
	Tims_delay_us(speed);	
}

//2号步进电机,1正转,其他反转
void Motor2(short dir,int speed)
{
	if(dir == 1)
	{
		MOTOR2Forward;		
	}
	else
	{
		MOTOR2Backward;		
	}
	
	//电机脉冲控制
	HAL_GPIO_WritePin(GPIOF,GPIO_PIN_14,GPIO_PIN_SET);
	Tims_delay_us(speed);
	HAL_GPIO_WritePin(GPIOF,GPIO_PIN_14,GPIO_PIN_RESET);
	Tims_delay_us(speed);		
}

//3号步进电机,1正转,其他反转
void Motor3(short dir,int speed)
{
	if(dir == 1)
	{
		MOTOR3Forward;		
	}
	else
	{
		MOTOR3Backward;		
	}
	
	//电机脉冲控制
	HAL_GPIO_WritePin(GPIOF,GPIO_PIN_15,GPIO_PIN_SET);
	Tims_delay_us(speed);
	HAL_GPIO_WritePin(GPIOF,GPIO_PIN_15,GPIO_PIN_RESET);
	Tims_delay_us(speed);		
}

us级延迟函数:

void Tims_delay_us(uint16_t nus)
{
	__HAL_TIM_SET_COUNTER(DLY_TIM_Handle, 0);
	__HAL_TIM_ENABLE(DLY_TIM_Handle);
	while (__HAL_TIM_GET_COUNTER(DLY_TIM_Handle) < nus)
	{
	}
	__HAL_TIM_DISABLE(DLY_TIM_Handle);
}

6.2 机械爪控制代码

        机械爪部分使用5V步进电机与ULN2003驱动板驱动,将ULN2003驱动器上的IN1、IN2、IN3、IN4四个引脚循环拉高电平,即可实现对5V步进电机的控制(IN引脚循环周期的快慢决定电机转动的快慢,循环引脚顺序决定了电机转动方向)。

注意:ULN2003驱动器驱动5V步进电机的时候,电机速度是有一定限制的。技巧:可以通过ULN2003上面4个LED灯的闪烁速度来判别驱动电机转速的快慢。

crawl.h代码:

#ifndef __CRAWL_H
#define __CRAWL_H

#include "main.h"

//引脚定义
#define IN1_HIGH HAL_GPIO_WritePin(GPIOD,GPIO_PIN_9,GPIO_PIN_SET)
#define IN2_HIGH HAL_GPIO_WritePin(GPIOD,GPIO_PIN_10,GPIO_PIN_SET)
#define IN3_HIGH HAL_GPIO_WritePin(GPIOD,GPIO_PIN_11,GPIO_PIN_SET)
#define IN4_HIGH HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,GPIO_PIN_SET)

#define IN1_LOW HAL_GPIO_WritePin(GPIOD,GPIO_PIN_9,GPIO_PIN_RESET)
#define IN2_LOW HAL_GPIO_WritePin(GPIOD,GPIO_PIN_10,GPIO_PIN_RESET)
#define IN3_LOW HAL_GPIO_WritePin(GPIOD,GPIO_PIN_11,GPIO_PIN_RESET)
#define IN4_LOW HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,GPIO_PIN_RESET)

//5v步进电机控制
void stepper(short dir,int speed);

#endif

crawl.c代码:

#include "crawl.h"

//1是正转,其余是反转
void stepper(short dir,int speed)
{
	if(dir == 1)
	{
		IN1_HIGH;
		HAL_Delay(speed);
		IN1_LOW;
		IN2_HIGH;
		HAL_Delay(speed);
		IN2_LOW;
		IN3_HIGH;
		HAL_Delay(speed);
		IN3_LOW;
		IN4_HIGH;
		HAL_Delay(speed);
		IN4_LOW;
	}
	else
	{
		IN1_HIGH;
		HAL_Delay(speed);
		IN1_LOW;
		IN4_HIGH;
		HAL_Delay(speed);
		IN4_LOW;
		IN3_HIGH;
		HAL_Delay(speed);
		IN3_LOW;
		IN2_HIGH;
		HAL_Delay(speed);
		IN2_LOW;
	}
}

6.3 JDY-31蓝牙控制机械臂代码

        项目机械臂采用手机蓝牙APP进行控制,且控制所用的蓝牙APP为开源的蓝牙调试助手,具体界面如图所示。设置6个控制组件为byte类型,按下时分别对应数字1-9,松开时为数字0

bluetooth.h代码:

#ifndef __BULETOOTH_H
#define __BULETOOTH_H

#include "stm32f1xx_hal.h" 

extern UART_HandleTypeDef huart3;

#define USART3_REC_LEN  500

extern uint8_t  USART3_RX_BUF[USART3_REC_LEN];
extern uint16_t USART3_RX_STA;
extern uint8_t USART3_NewData;

void  HAL_UART_RxCpltCallback(UART_HandleTypeDef  *huart);

#endif

bluetooth.c代码:

#include "bluetooth.h"

uint8_t USART3_RX_BUF[USART3_REC_LEN];
uint16_t USART3_RX_STA=0;
uint8_t USART3_NewData;

extern int flag;		//全局变量

void  HAL_UART_RxCpltCallback(UART_HandleTypeDef  *huart)
{
    if(huart ==&huart3)
    {
                              
              USART3_RX_BUF[USART3_RX_STA&0X7FFF]=USART3_NewData; 					
              USART3_RX_STA++;  
			
              if(USART3_RX_STA>(USART3_REC_LEN-1))USART3_RX_STA=0;
			
							if(USART3_RX_BUF[USART3_RX_STA-15] == 0x01)
							{
								flag = 1;
							}
							if(USART3_RX_BUF[USART3_RX_STA-15] == 0x02)
							{
								flag = 2;
							}
							if(USART3_RX_BUF[USART3_RX_STA-15] == 0x03)
							{
								flag = 3;
							}
							if(USART3_RX_BUF[USART3_RX_STA-15] == 0x04)
							{
								flag = 4;
							}
							if(USART3_RX_BUF[USART3_RX_STA-15] == 0x05)
							{
								flag = 5;
							}							
 							if(USART3_RX_BUF[USART3_RX_STA-15] == 0x06)
							{
								flag = 6;
							}
							if(USART3_RX_BUF[USART3_RX_STA-15] == 0x07)
							{
								flag = 7;
							}
							if(USART3_RX_BUF[USART3_RX_STA-15] == 0x08)
							{
								flag = 8;
							}							
 							if(USART3_RX_BUF[USART3_RX_STA-15] == 0x09)
							{
								flag = 9;
							}							
        HAL_UART_Receive_IT(&huart3,(uint8_t *)&USART3_NewData,1);


    }
}

6.4 main函数代码

        主函数利用switch()函数与蓝牙控制代码中定义的全局变量flag进行组合使用,在while()循环函数中实现串口3中断后全局变量flag控制机械臂运动姿态。

main.c:

#include "main.h"
#include "i2c.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
#include "crawl.h"
#include "Motordrive.h"
#include "oled.h"
#include "control.h"
#include "bluetooth.h"

int flag;

int main(void)
{
  //CubeMX配置的初始化代码

  HAL_UART_Receive_IT(&huart3,(uint8_t *)&USART3_RX_BUF,1);  
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    		 switch(flag)    
    		 {
    		 case(1):Motor1(0,2000);;break;
    		 case(2):Motor1(1,2000);;break;
    		 case(3):Motor2(0,2000);;break;
    		 case(4):Motor2(1,2000);;break;
    		 case(5):Motor3(0,2000);;break;
			 case(6):Motor3(1,2000);;break;
    		 case(7):stepper(0,20);;break;		//收缩
    		 case(8):stepper(1,20);;break;		//外扩
			 case(9):stop();break;				 
    		 default:break;
    		 } 	

  }
  /* USER CODE END 3 */
}

七、项目效果

基于STM32与TB6600机械臂项目

八、代码开源

3D打印件与代码地址: 基于STM32与TB6600蓝牙控制机械臂项目-嵌入式文档类资源-CSDN文库

如果积分不够的朋友,点波关注评论区留下邮箱,作者无偿提供源码和后续问题解答。求求啦关注一波吧 !!!

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

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

相关文章

mongodb-9.数据库连接,集合创建

文章目录数据库连接集合创建查询删除查询显示指定字段限制查询条数 limit &#xff0c;skip排序索引创建聚合查询数据库连接 mongodb URL mongodb://[username:password]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]语法说明如下&#xff1a;…

JSP ssh网络点餐系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 JSP ssh网络点餐系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式 开发。开发环境为TOMCAT7.0,Mye…

vue3 antd项目实战——input输入框限制输入内容和长度,Form表单动态校验规则

input输入框设置只能输入中文&#xff0c;输入长度为20&#xff0c;输入不能为空知识调用场景复现解决方案1.下方有提示文字2.限制输入内容只能是中文3.限制输入长度为204.动态校验规则&#xff08;必填项&#xff09;input源代码&#xff08;按需调整即可&#xff09;知识调用…

【区块链 | EVM】深入理解学习EVM - 深入理解EVM操作码,让你写出更好的智能合约

那些非典型的开销导致经典的软件设计模式在合约编程语言中看起来既低效又奇怪。如果想要识别这些模式并理解他们导致效率变高/低的原因&#xff0c;你必须首先对以太坊虚拟机&#xff08;即 EVM&#xff09;有一个基本的了解。 你的一些编程“好习惯”反而会让你写出低效的智能…

Linux当中的Sersync实时同步服务及其实战举例

目录 一、实时同步 1.定义 2.原理 3.实时同步场景 4.实时同步工具 &#xff08;1&#xff09;sersync &#xff08;2&#xff09;Lysncd 二、实时同步实例 1.环境规划 2.配置思路 NFS存储服务如下&#xff1a; &#xff08;1&#xff09;安装NFS &#xff08;2&am…

40. 使用块的网络(VGG)

虽然AlexNet证明深层神经网络卓有成效&#xff0c;但它没有提供一个通用的模板来指导后续的研究人员设计新的网络。 在下面的几个章节中&#xff0c;我们将介绍一些常用于设计深层神经网络的启发式概念。 与芯片设计中工程师从放置晶体管到逻辑元件再到逻辑块的过程类似&#x…

Node.js--》三大常见模块的使用讲解

目录 fs文件系统模块 fs.readFile()方法 fs.writeFile()方法 readFile与writeFile的使用 fs模块路径动态拼接问题 path路径模块 path.join()方法 path.basename() path.extname() path.parse() http模块 req请求对象 res响应对象 解决中文乱码问题 响应不同内容…

Python实现猎人猎物优化算法(HPO)优化支持向量机回归模型(SVR算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 猎人猎物优化搜索算法(Hunter–prey optimizer, HPO)是由Naruei& Keynia于2022年提出的一种最新的优…

计算机系统基础实验 - 同符号浮点数加法运算/无符号定点数乘法运算的机器级表示

实验3 同符号浮点数加法运算/无符号定点数乘法运算的机器级表示 实验序号&#xff1a;3 实验名称&#xff1a;同符号浮点数加法运算/无符号定点数乘法运算的机器级表示 适用专业&#xff1a;软件工程 学 时 数&#xff1a;2学时 一、实验目的 1.掌握定点数乘法溢出的判定方法…

Kafka触发Rebalance的场景分析

文章目录前言触发Rebalance的原因1. 消费者成员发生变化2. 分区数发生变化3. 订阅Topic发生变化Rebalance全流程介绍场景一&#xff1a;新成员入组场景二&#xff1a;成员主动离组场景三&#xff1a;成员崩溃离组场景四&#xff1a;组成员提交位移前言 所谓Rebalance就是让Con…

Python小工具-复制嵌套目录下的多个word文档到指定目录

文章目录Python小工具-复制嵌套目录下的多个word文档到指定目录需求原始数据工具实现思路代码实现1-6 配置项目7 定义file_type_to_reduce_dir函数完成文件复制或移动8 定义list_dir_by_level函数完成遍历调用函数并执行待改进地方完整代码自我反省Python小工具-复制嵌套目录下…

全志 Linux 系统启动优化 启动优化速度方式 优化启动流程 优化uboot 优化kernel等

文章目录1 概述2 启动速度优化简介2.1 启动流程2.2 测量方法2.2.1 printk time2.2.2 initcall_debug2.2.3 bootgraph.2.2.4 bootchart2.2.5 gpio 示波器.2.2.6 grabserial.2.3 优化方法2.3.1 boot0启动优化2.3.1.1 非安全启动.2.3.1.2 安全启动2.3.2 uboot启动优化2.3.2.1 完全…

07、SpringCloud 系列:Alibaba - 介绍

SpringCloud 系列列表&#xff1a; 文章名文章地址01、Eureka - 集群、服务发现https://blog.csdn.net/qq_46023503/article/details/12831902302、Ribbon - 负载均衡https://blog.csdn.net/qq_46023503/article/details/12833228803、OpenFeign - 远程调用https://blog.csdn.…

一套ASP.NET优惠券领取微信小程序源码(前台+后台)

ASP.NET优惠券领取微信小程序源码&#xff08;前台后台&#xff09; 源码免费分享&#xff01;需要源码学习可私信我。 一、源码特点 1、这是一个微信小程序对接淘宝的淘宝客api自助搜索优惠券领取程序&#xff0c;简单易学。 2、后台采用asp.netMvc框架开发、实现了调用阿里妈…

Java I/O(五)NIO应用之Netty

Netty 目录Netty1 Netty概览2 Netty核心组件2.1 Bootstrap和ServerBootStrap&#xff08;启动引导类&#xff09;2.2 Channel&#xff08;网络操作抽象类&#xff09;2.3 EventLoop&#xff08;事件循环&#xff09;2.4 EventLoopGroup&#xff08;事件循环组&#xff09;2.7 C…

【Vue】创建 Vue 实例与对象配置、容器与实例的关系、插值延伸和 Vue 开发工具的初步使用

创建 Vue 实例 引入 Vue 注意在 Head 中 <script type"text/javascript" src"./vue.js"></script>另一个 javascript 中创建 Vue 实例&#xff0c;注意在 Body 尾部 <script type"text/javascript">const x new Vue() <…

12. 目前常用的四种信道复用方式:()、()、()和() ---- 计算机网络

目前常用的四种信道服用方式&#xff1a;&#xff08;频分复用&#xff09;、&#xff08;时分复用&#xff09;、&#xff08;码分复用&#xff09;和&#xff08;波分复用&#xff09; 知识点 复用&#xff08;multiplexing&#xff09;&#xff1a;就是在一个信道上传输多路…

java SE阶段面试题

目录 1、Java 的数据类型有哪些&#xff1f; 2、变量的三要素是什么&#xff1f;变量使用有什么要求&#xff1f; 3、基本数据类型变量和引用数据类型变量有什么区别&#xff1f; 4、Java 的运算符有几种意思&#xff1f; 5、Java 的自增、自减运算符在自增变量前后有什么区…

《计算机网络》——第三章知识点

第三章思维导图 链路层的信道类型 一对一:点对点信道 —对多:广播信道 链路层要解决的问题 封装成帧 透明传输 差错检测密封&#xff0c;透气性差 封装成帧就是在一段数据的前后部分添加首部和尾部&#xff0c;这样就构成了一个帧。接收端在收到物理层上交的比特流后&#xff…

Pandas.to_csv()函数及全部参数使用方法一文详解+实例代码

目录 前言 一、基础语法与功能 二、参数说明和代码演示 1.path_or_buf 选择文件/文件路径写入 2.sep 指定分隔符 3.na_rep 指定缺少数据表示 4.float_format 指定浮点型字符串输出格式 5. columns 指定要写入的列 6.header 是否需要写入列名 7.index 是否写入行名称&am…