当前位置: 首页 > article >正文

arduino扩展:Arduino Mega 控制 32 个舵机(参考表情机器人)

参考:表情机器人中使用22个舵机的案例

引言

在电子制作与自动化控制领域,Arduino 凭借其易用性和强大的扩展性备受青睐。Arduino Mega 作为其中功能较为强大的一款开发板,具备丰富的引脚资源,能够实现复杂的控制任务。舵机作为常见的执行机构,可精确控制角度,广泛应用于机器人、模型制作等场景。本文将深入探讨如何使用 Arduino Mega 控制 32 个舵机,详细分析硬件连接、代码实现,并对项目进行拓展思考。

硬件连接

材料准备

  • Arduino Mega 开发板:它拥有 54 个数字输入输出引脚,其中 15 个可提供 PWM 输出,这为同时控制多个舵机提供了硬件基础。
  • 32 个舵机:舵机通常有三根线,分别是电源线(VCC,一般为红色)、地线(GND,一般为黑色或棕色)和信号线(PWM,一般为橙色或黄色)。
  • 杜邦线:用于连接 Arduino Mega 和舵机,保证信号和电源的传输。
  • 电源模块:由于 32 个舵机同时工作时功耗较大,Arduino Mega 的板载电源可能无法满足需求,因此需要一个外部电源模块为舵机供电。

连接方式

  • 电源连接:将所有舵机的电源线(VCC)连接到外部电源的正极,所有舵机的地线(GND)连接到外部电源的负极和 Arduino Mega 的 GND 引脚,确保共地。这样可以避免电源干扰,保证系统的稳定性。
  • 信号连接:从 Arduino Mega 的 22 号引脚开始,依次将 32 个舵机的信号线(PWM)连接到 22 - 53 号引脚。在代码中,会将这些引脚与对应的舵机对象进行关联,从而实现对每个舵机的精确控制。
    在这里插入图片描述

硬件连接注意事项

  • 电源供应:确保外部电源能够提供足够的电流,以满足 32 个舵机同时工作的需求。否则,可能会出现舵机转动无力、抖动等问题。
  • 引脚使用:避免将其他设备连接到 22 - 53 号引脚,以免与舵机控制产生冲突。
  • 线路布局:合理规划杜邦线的布局,避免线路交叉和缠绕,减少信号干扰。

代码实现

代码整体功能概述

这段代码实现了使用 Arduino Mega 控制 32 个舵机,并让它们按照预设的四个不同序列进行运动,展示出多样化的动作效果。

代码详细分析

库的引入和变量定义
#include <Servo.h>
#define NUM_SERVOS 32
Servo myServo[NUM_SERVOS];
  • #include <Servo.h>:引入 Servo 库,该库提供了控制舵机的基本函数和方法。
  • #define NUM_SERVOS 32:定义常量 NUM_SERVOS 为 32,表示要控制的舵机数量。
  • Servo myServo[NUM_SERVOS];:创建一个包含 32 个 Servo 对象的数组 myServo,用于管理每个舵机。
setup() 函数
void setup() 
{for( int i=0; i<NUM_SERVOS; i++){myServo[i].attach( i + 22);     }
}
  • setup() 函数中,通过 for 循环将每个 Servo 对象与 Arduino Mega 开发板上从 22 到 53 的引脚依次连接起来。attach() 函数用于将舵机对象与特定的引脚关联,以便后续向该引脚发送 PWM 信号来控制舵机的角度。
loop() 函数

loop() 函数会不断循环执行,其中包含了四个不同的舵机运动序列。

序列一:随机角度运动
for( int a=0; a<15; a++)
{for( int i=0; i<NUM_SERVOS; i++){myServo[i].write( random( 0, 181));delay( 2);}delay( 150);
}
  • 该序列会循环 15 次。每次循环中,使用 random(0, 181) 函数为每个舵机生成一个 0 到 180 之间的随机角度,并通过 write() 函数将该角度发送给对应的舵机。delay(2) 用于在设置每个舵机角度后稍微延迟一下,让舵机有时间响应。delay(150) 用于在完成一次所有舵机角度设置后,暂停 150 毫秒,方便观察效果。
序列二:同步角度运动
for( int i=0; i<NUM_SERVOS; i++)
{myServo[i].write( 0);            
}
delay( 1000);                      
for( int a=0; a<3; a++)
{for( int r=0; r<=180; r++)       {for( int i=0; i<NUM_SERVOS; i++){myServo[i].write( r);}delay( 6);}for( int r=180; r>=0; r--){for( int i=0; i<NUM_SERVOS; i++)  {myServo[i].write( r);}delay( 6);}
}
  • 首先,将所有舵机的角度设置为 0 度,即初始位置(舵机臂向左旋转),并延迟 1000 毫秒,让观察者适应这个状态。
  • 然后,循环 3 次,每次先将所有舵机从 0 度逐步旋转到 180 度(向右旋转),再从 180 度逐步旋转回 0 度(向左旋转)。delay(6) 用于控制舵机旋转的速度,让舵机有足够的时间转动到指定角度。
序列三:旋转波运动
for( int a=0; a<6; a++)
{for( int i=0; i<NUM_SERVOS; i++){for( int j=0; j<NUM_SERVOS; j++){int d = j - i;if( d < 0)d = -d;if( d > (NUM_SERVOS / 2))d = NUM_SERVOS - d;int angle = 90 - (10 * d);if( angle < 0)angle = 0;myServo[j].write( angle);}delay(40);}
}
  • 该序列会循环 6 次。对于每个舵机 i,会计算其他舵机 j 与它的距离 d,并根据距离计算出对应的角度 angle。距离越近,角度越接近 90 度;距离越远,角度越小。通过不断改变 i 的值,形成一个旋转的波状运动效果。delay(40) 用于控制波的传播速度。
序列四:“罗盘”运动
int pointer = NUM_SERVOS * 3 / 4;
showPointer( pointer);
delay( 1000);                       
for( int i=0; i<5; i++)
{showPointer( --pointer);delay( 150);
}
delay( 200);
// 后续还有多个类似的循环,省略部分代码
  • 首先,将指针 pointer 初始化为 NUM_SERVOS * 3 / 4,并调用 showPointer() 函数显示初始状态,延迟 1000 毫秒让观察者适应。
  • 然后,通过多次调用 showPointer() 函数,让指针按照一定的规律左右移动,模拟罗盘指针的转动效果。每次移动后延迟 150 毫秒,控制转动速度。
showPointer() 函数
void showPointer( int s)
{int pointerA = s % NUM_SERVOS;        int pointerB = (s + 1) % NUM_SERVOS;  int tailA = (s + 16) % NUM_SERVOS;int tailB = (s + 17) % NUM_SERVOS;myServo[pointerA].write(180-56);myServo[pointerB].write(56);myServo[tailA].write(95);myServo[tailB].write(85);int n = (NUM_SERVOS / 2) - 2;int start = pointerB + 1;for( int i=0; i<n; i++){int j = (start + i) % NUM_SERVOS;myServo[j].write( 2);}start = tailB + 1;for( int i=0; i<n; i++){int j = (start + i) % NUM_SERVOS;myServo[j].write( 178);}
}
  • 该函数用于创建“罗盘”效果。通过计算指针、尾部以及左右两侧舵机的索引,将它们设置为不同的角度,形成一个类似指针的形状。左右两侧的舵机分别设置为 2 度和 178 度,突出指针的效果。
GenerateDiagram() 函数
void GenerateDiagram()
{Serial.begin(115200);// 后续是生成 JSON 格式文本的代码,省略部分代码
}
  • 这个函数用于生成 Wokwi 模拟器所需的 diagram.json 文件。通过串口输出 JSON 格式的文本,包含了 Arduino Mega 和 32 个舵机的位置、连接等信息。

全部代码

// ServoOverdone.ino
//
// Example for multiple Servo objects in a array.
//
// Version 1, 28 July 2021, by Koepel.
// Version 2, 15 August 2021, by Koepel.
//   changed timing, a little slower
//   diagram.json has servos in reverse order (I think it is visually better)
//   Added fourth sequence: "compass"
//
// Public Domain
//#include <Servo.h>#define NUM_SERVOS 32
Servo myServo[NUM_SERVOS];void setup() 
{// Attach pins from the Arduino Mega board to the Servo objects.// Starting from pin 22, there happen to be exactly 32 pins on the double row pins.for( int i=0; i<NUM_SERVOS; i++){myServo[i].attach( i + 22);      // pin 22 up to 53 is 32 pins}
}void loop() 
{// Sequence one.// All servo motor are set to a random angle.for( int a=0; a<15; a++){for( int i=0; i<NUM_SERVOS; i++){myServo[i].write( random( 0, 181));delay( 2);}delay( 150);}// Sequence two.// All servo motors move with the same angle.for( int i=0; i<NUM_SERVOS; i++){myServo[i].write( 0);            // set to begin position (horn is rotated left)}delay( 1000);                      // wait to let the viewer get used to itfor( int a=0; a<3; a++){for( int r=0; r<=180; r++)       // move horns to the right{for( int i=0; i<NUM_SERVOS; i++){myServo[i].write( r);}delay( 6);}for( int r=180; r>=0; r--){for( int i=0; i<NUM_SERVOS; i++)  // move horns to the left{myServo[i].write( r);}delay( 6);}}// Sequence three.// A rotating wave.for( int a=0; a<6; a++){for( int i=0; i<NUM_SERVOS; i++){for( int j=0; j<NUM_SERVOS; j++){// Calculate distance to active servoint d = j - i;if( d < 0)d = -d;if( d > (NUM_SERVOS / 2))d = NUM_SERVOS - d;int angle = 90 - (10 * d);if( angle < 0)angle = 0;myServo[j].write( angle);}delay(40);}}// Sequence four.// A "compass"// Start by pointing upwardsint pointer = NUM_SERVOS * 3 / 4;showPointer( pointer);delay( 1000);                       // let the viewer get used to new patternfor( int i=0; i<5; i++){showPointer( --pointer);delay( 150);}delay( 200);for( int i=0; i<9; i++){showPointer( ++pointer);delay( 150);}delay( 200);for( int i=0; i<5; i++){showPointer( --pointer);delay( 150);}delay( 200);for( int i=0; i<4; i++){showPointer( ++pointer);delay( 150);}delay( 160);for( int i=0; i<2; i++){showPointer( --pointer);delay( 150);}delay( 80);for( int i=0; i<1; i++){showPointer( ++pointer);delay( 150);}delay( 2000);
}// This function makes a "pointer" with the servos.
// It is used to create the "compass".
// The parameter 's' is the servo motor that has the pointer.
// It is allowed that 's' is below zero or larger than the numbers of servo motors.
void showPointer( int s)
{int pointerA = s % NUM_SERVOS;        // Using the '%' (remainder) for valid numberint pointerB = (s + 1) % NUM_SERVOS;  // pointer is made with the next servo motorint tailA = (s + 16) % NUM_SERVOS;int tailB = (s + 17) % NUM_SERVOS;// make pointer with servo motor s and s+1.myServo[pointerA].write(180-56);myServo[pointerB].write(56);// make tail with servo motor s+16 and s+17.myServo[tailA].write(95);myServo[tailB].write(85);// Set servos right of pointerint n = (NUM_SERVOS / 2) - 2;int start = pointerB + 1;for( int i=0; i<n; i++){int j = (start + i) % NUM_SERVOS;myServo[j].write( 2);}// Set servos left of pointerstart = tailB + 1;for( int i=0; i<n; i++){int j = (start + i) % NUM_SERVOS;myServo[j].write( 178);}
}// The function GenerateDiagram() can be used to generate
// the diagram.json file for Wokwi.
// To use it, call it from the setup() function, and the
// serial output can be copied into the diagram.json file.
void GenerateDiagram()
{Serial.begin(115200);Serial.print( "{\n");Serial.print( "  \"version\": 1,\n");Serial.print( "  \"author\": \"Generated\",\n");Serial.print( "  \"editor\": \"wokwi\",\n");Serial.print( "  \"parts\": [\n");Serial.print( "    {\n");Serial.print( "      \"type\": \"wokwi-arduino-mega\",\n");Serial.print( "      \"id\": \"mega\",\n");Serial.print( "      \"top\": 270,\n");Serial.print( "      \"left\": 185,\n");Serial.print( "      \"attrs\": {}\n");Serial.print( "    },\n");// Put the servo motor in reverse order in the diagram.json// I think that is visually better.// The horn now overlaps the next servo when the horn moves to the right.for( int i=NUM_SERVOS-1; i>=0; i--){float rotate = float( i) * (360.0 / float( NUM_SERVOS));float rad = rotate / 360.0 * 2.0 * M_PI;float top = (300.0 * sin( rad)) + 300.0;float left = (300.0 * cos( rad)) + 300.0;Serial.print( "    {\n");Serial.print( "      \"type\": \"wokwi-servo\",\n");Serial.print( "      \"id\": \"servo");Serial.print( i);Serial.print( "\",\n");Serial.print( "      \"top\": ");Serial.print( top);Serial.print( ",\n");Serial.print( "      \"left\": ");Serial.print( left);Serial.print( ",\n");Serial.print( "      \"rotate\": ");Serial.print( rotate);Serial.print( ",\n");Serial.print( "      \"attrs\": { \"hornColor\": \"Red\" }\n");Serial.print( "    }");if( i != 0)Serial.print( ",");Serial.print( "\n");} Serial.print( "  ],\n");Serial.print( "  \"connections\": [\n");for( int i=0; i<NUM_SERVOS; i++){int j = i + 1;if( j == NUM_SERVOS)j = 0;Serial.print( "    [ \"servo");Serial.print( i);Serial.print( ":V+\", \"servo");Serial.print( j);Serial.print( ":V+\", \"Red\", [] ],\n");Serial.print( "    [ \"servo");Serial.print( i);Serial.print( ":GND\", \"servo");Serial.print( j);Serial.print( ":GND\", \"Black\", [] ],\n");Serial.print( "    [ \"mega:");Serial.print( i + 22);Serial.print( "\", \"servo");Serial.print( i);Serial.print( ":PWM\", \"Green\", [ ] ],\n");}Serial.print( "    [ \"mega:GND.2\", \"servo9:GND\", \"Black\", [ ] ],\n");Serial.print( "    [ \"mega:5V\", \"servo9:V+\", \"Red\", [ ] ]\n");Serial.print( "  ]\n");Serial.print( "}\n");
}

拓展与思考

功能拓展

  • 传感器结合:可以添加各类传感器,如超声波传感器、红外传感器等,根据传感器的数据动态调整舵机的运动。例如,当超声波传感器检测到前方有障碍物时,舵机可以控制机器人改变方向。
  • 远程控制:通过无线通信模块(如蓝牙、Wi-Fi)实现对舵机的远程控制。用户可以使用手机应用或电脑程序发送指令,让舵机执行特定的动作。
  • 增加舵机数量:虽然 Arduino Mega 有 54 个数字引脚,但受限于电源和处理能力,同时控制更多舵机可能会遇到挑战。可以考虑使用舵机驱动板(如 PCA9685)来扩展舵机控制数量。

代码优化

  • 减少延迟:代码中使用了大量的 delay() 函数,这会阻塞程序的执行,影响系统的实时性。可以使用定时器或状态机的方式来替代 delay() 函数,提高代码的效率。
  • 模块化设计:将不同的舵机运动序列封装成独立的函数,提高代码的可读性和可维护性。同时,方便添加新的运动序列。

总结

通过本文的介绍,我们详细了解了如何使用 Arduino Mega 控制 32 个舵机。从硬件连接的注意事项到代码实现的各个细节,都进行了深入分析。同时,对项目的拓展和代码优化也提出了一些思路。这个项目不仅展示了 Arduino Mega 的强大功能,也为我们在电子制作和自动化控制领域的进一步探索提供了基础。在实际应用中,我们可以根据具体需求对硬件和代码进行调整和扩展,创造出更加复杂和有趣的项目。

相关文章:

arduino扩展:Arduino Mega 控制 32 个舵机(参考表情机器人)

参考&#xff1a;表情机器人中使用22个舵机的案例 引言 在电子制作与自动化控制领域&#xff0c;Arduino 凭借其易用性和强大的扩展性备受青睐。Arduino Mega 作为其中功能较为强大的一款开发板&#xff0c;具备丰富的引脚资源&#xff0c;能够实现复杂的控制任务。舵机作为常…...

DeepSeek提问技巧总结

DeepSeek提问技巧总结 1.聚焦核心&#xff0c;细化问题&#xff1a; 提问时应精准明确&#xff0c;避免过于宽泛或模糊。例如不要问“如何学习机器学习&#xff1f;”而应问“零基础如何机器学习”。对于复杂问题&#xff0c;可将其拆解为多个小问题&#xff0c;逐一提问。比…...

基于51单片机的门禁刷卡器proteus仿真

地址&#xff1a;https://pan.baidu.com/s/1j0KAmH5pVGWZWRpT6p5hBg 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectron…...

mapbox进阶,添加绘图扩展插件,裁剪线

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️MapboxDraw 绘图控件二、🍀添加绘图扩…...

19.4.6 读写数据库中的二进制数据

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 需要北风数据库的请留言自己的信箱。 北风数据库中&#xff0c;类别表的图片字段在【数据表视图】中显示为Bitmap Image&#xff1…...

PlantUml常用语法

PlantUml常用语法&#xff0c;将从类图、流程图和序列图这三种最常用的图表类型开始。 类图 基础语法 在 PlantUML 中创建类图时&#xff0c;你可以定义类&#xff08;Class&#xff09;、接口&#xff08;Interface&#xff09;以及它们之间的关系&#xff0c;如继承&#…...

MapReduce到底是个啥?

在聊 MapReduce 之前不妨先看个例子&#xff1a;假设某短视频平台日活用户大约在7000万左右&#xff0c;若平均每一个用户产生3条行为日志&#xff1a;点赞、转发、收藏&#xff1b;这样就是两亿条行为日志&#xff0c;再假设每条日志大小为100个字节&#xff0c;那么一天就会产…...

Winform自定义控件与案例 - 构建炫酷的自定义环形进度条控件

文章目录 1、控件效果2、案例实现1、代码实现2、代码解释3、使用示例 4、总结 1、控件效果 2、案例实现 1、代码实现 代码如下&#xff08;示例&#xff09;&#xff1a; using System; using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; …...

【SpringBoot苍穹外卖】debugDay03.5

1、AOP面向切面编程 1. Target(ElementType.METHOD) 作用&#xff1a;指定自定义注解可以应用的目标范围。 参数&#xff1a;ElementType 是一个枚举类&#xff0c;定义了注解可以应用的目标类型。 ElementType.METHOD 表示该注解只能用于方法上。 其他常见的 ElementType 值…...

分享在职同时准备系统分析师和教资考试的时间安排

&#xff08;在职、时间有限、同时备考系统分析师考试和小学信息技术教资面试&#xff09;&#xff0c;以下是详细的备考计划&#xff0c;确保计划的可行性和通过性。 一、总体安排 时间分配&#xff1a; 每周周末&#xff08;2天&#xff09;用于系统分析师考试备考。工作日晚…...

flink实时集成利器 - apache seatunnel - 核心架构详解

SeaTunnel&#xff08;原名 Waterdrop&#xff09;是一个分布式、高性能、易扩展的数据集成平台&#xff0c;专注于大数据领域的数据同步、数据迁移和数据转换。它支持多种数据源和数据目标&#xff0c;并可以与 Apache Flink、Spark 等计算引擎集成。以下是 SeaTunnel 的核心架…...

视频理解新篇章:Mamba模型的探索与应用

人工智能咨询培训老师叶梓 转载标明出处 想要掌握如何将大模型的力量发挥到极致吗&#xff1f;叶老师带您深入了解 Llama Factory —— 一款革命性的大模型微调工具&#xff08;限时免费&#xff09;。 1小时实战课程&#xff0c;您将学习到如何轻松上手并有效利用 Llama Facto…...

分形几何表明数学一直存在有首、末的无穷序列

分形几何表明数学一直存在有首、末的无穷序列。一有穷长直线段S可变为锯齿状图形G而由无穷多无穷短直线段连接而成。G和S一样有左、右两个端点。...

DeepSeek 的 API 服务引入 WPS Office

以下是将 DeepSeek 的 API 服务引入 WPS Office 的通用集成教程。以调用 DeepSeek 的 AI 功能&#xff08;如文本生成、数据分析&#xff09;为例&#xff0c;假设你需要通过 WPS 的宏或插件调用外部 API&#xff1a; 准备工作 注册 DeepSeek 账号并获取 API Key 访问 DeepSe…...

Python接口自动化测试—接口数据依赖

一般在做自动化测试时&#xff0c;经常会对一整套业务流程进行一组接口上的测试&#xff0c;这时候接口之间经常会有数据依赖&#xff0c;那又该如何继续呢&#xff1f; 那么有如下思路&#xff1a; 抽取之前接口的返回值存储到全局变量字典中。初始化接口请求时&#xff0c;…...

C++ 实践扩展(Qt Creator 联动 Visual Studio 2022)

​ 这里我们将在 VS 上实现 QT 编程&#xff0c;实现如下&#xff1a; 一、Vs 2022 配置&#xff08;若已安装&#xff0c;可直接跳过&#xff09; 点击链接&#xff1a;​​​​​Visual Studio 2022 我们先去 Vs 官网下载&#xff0c;如下&#xff1a; 等待程序安装完成之…...

分布式系统知识点总结

一、一致性协议 &#xffe5;1. CAP理论 CAP理论是分布式系统设计中的一套指导原则&#xff0c;它指出在网络分区的情况下&#xff0c;一个分布式系统最多只能同时满足以下三点中的两点&#xff1a; 一致性&#xff08;Consistency&#xff09;&#xff1a;所有节点在同一时…...

Java中性能瓶颈的定位与调优方法

Java中性能瓶颈的定位与调优方法 Java作为一种高效、跨平台的编程语言&#xff0c;广泛应用于企业级应用、服务器端开发、分布式系统等领域。然而&#xff0c;在面对大量并发、高负载的生产环境时&#xff0c;Java应用的性能瓶颈问题往往会暴露出来。如何定位并优化这些性能瓶…...

openbmc sdbusplus接口使用(持续更新...)

1.说明 本节介绍如何使用sdbusplus&#xff0c;用来对应不同的场景。 可以参考之前的文章: https://blog.csdn.net/wit_yuan/article/details/145192471 建议阅读本篇文章一定要仔细阅读sd-bus specification 2.说明 2.1 简单server服务注册 本节参考: https://gitee.com…...

2.12寒假作业

web&#xff1a;[HDCTF 2023]Welcome To HDCTF 2023 可以直接玩出来 但是这边还是看一下怎么解吧&#xff0c;看一下js代码&#xff0c;在js.game里面找到一个类似brainfuck加密的字符串 解密可以得到答案&#xff0c;但是后面我又去了解了一下let函数let命令、let命令 let命…...

GitHub项目推荐--适合练手的13个C++开源项目

1 C 那些事 这是一个适合初学者从入门到进阶的仓库&#xff0c;解决了面试者与学习者想要深入 C及如何入坑 C的问题。 除此之外&#xff0c;本仓库拓展了更加深入的源码分析&#xff0c;多线程并发等的知识&#xff0c;是一个比较全面的 C 学习从入门到进阶提升的仓库。 项目…...

【识别摄像头野外动物场景行为】

识别野外动物摄像头下的行为及动作&#xff0c;主要依赖于摄像头的拍摄质量、动物的行为特征以及可能的智能图像识别技术。以下是对这一过程的详细分析&#xff1a; 一、摄像头的作用与拍摄质量 监控与记录&#xff1a;野外动物摄像头&#xff0c;如红外相机&#xff0c;被广泛…...

Linux inode 详解

简介 索引节点&#xff08;Index Node&#xff09;是 Linux/类unix 系统文件系统上的一种数据结构&#xff0c;用于存储有关文件或目录的元数据。它包含文件的所有信息&#xff0c;除了文件名和数据。inode 在文件系统如何存储和检索数据方面起着至关重要的作用。 当在 Linux…...

程序员升级进阶之路

熟悉业务、项目代码、工作流程&#xff0c;积极吸取技术资料接需求&#xff0c;画流程图&#xff0c;&#xff08;伪代码&#xff09;&#xff0c;详细设计明确职业发展方向【很重要】求精&#xff1a;写代码前的技术方案设计 写代码并不难&#xff0c;关键是要明确为什么要写…...

linux下c++连接mysql

1、下载mysql客户端使用的库文件 sudo apt install libmysqlclient-dev 头文件一般在 /usr/include/mysql/ 下 库文件一般在 /usr/lib/x86_64-linux-gnu/ 下 2、mysql c api开发者指南 >>>>官方连接 3、API使用实例 #include<mysql/mysql.h> #include&…...

C语言基础入门:1.3编译流程与调试基础

编译流程与调试基础 ——从源代码到可执行文件的魔法解密 一、编译四重奏&#xff1a;代码的变身之旅 C程序的编译过程如同汽车组装流水线&#xff0c;分为四个精密阶段&#xff1a; 预处理&#xff08;Preprocessing&#xff09; gcc -E hello.c -o hello.i # 生成预处理文件…...

AcWing 792. 高精度减法

题目来源&#xff1a; AcWing - 算法基础课 题目内容&#xff1a; 给定两个正整数&#xff08;不含前导 0&#xff09;&#xff0c;计算它们的差&#xff0c;计算结果可能为负数。 输入格式 共两行&#xff0c;每行包含一个整数。 输出格式 共一行&#xff0c;包含所求的…...

Python爬虫实战:获取51job职位信息,并做数据分析

注意:以下内容仅供技术研究,请遵守目标网站的robots.txt规定,控制请求频率避免对目标服务器造成过大压力! 1. 环境准备 python import requests from bs4 import BeautifulSoup import pandas as pd import re import matplotlib.pyplot as plt 2. 爬虫核心代码(带反爬…...

【2025 Nature】AI 生成材料算法 MatterGen 文章要点

文章目录 1. MatterGen 框架2. 评价基础模型生成能力的指标3. MatterGen 基础生成能力表现4. MatterGen 定向生成能力表现i. 指定晶体化学式ii. 指定标量性质1. 每个性质微调一次。2. 两个性质联合微调 5. 实验合成6. 模型细节 这篇文档简单介绍 MatterGen 论文亮点。 标题&…...

时间序列分析(三)——白噪声检验

此前篇章&#xff1a; 时间序列分析&#xff08;一&#xff09;——基础概念篇 时间序列分析&#xff08;二&#xff09;——平稳性检验 一、相关知识点 白噪声的定义&#xff1a;白噪声序列是一种在统计学和信号处理中常见的随机过程&#xff0c;由一系列相互独立、具有相同…...