Skip to content

haue_2021级计算机科学与技术_大一专业认知实习

1.环境搭建


1.1 电路模拟环境 + 3D建模环境

  • 使用老师提供的网站:Autodesk
  • 在该网站注册账号即可免费使用,可以最低限度满足本次项目要求

使用说明

  • 电路模拟

    1. 点击创建新电路 img
    2. 选择相应组件组合即可
  • 3D建模

    1. 点击创建新设计 img
    2. 选择合适的3D组件组合即可

1.2 蓝牙小车控制代码环境

Tips

  • 在Autodesk模拟电路时,可以将代码导入,测试代码的正确性 img
  • 基于Arduino电路板,使用不同语言的函数的参考文献 img
  • 对于该项目,我们只需掌握 Digital I/O 相关的函数即可

2. Arduino串口通信


2.1 Arduino串口


Arduino 采用 USART 通信模式,可以有 硬串口软串口 两种实现方式。

通常将Arduino UNO上自带的串口0(RX)1(TX)称为硬件串口,可与外围串口设备通信。而使用SoftwareSerial类库模拟成的串口,称为软件模拟串口(简称软串口)。如果要连接更多的串口设备,可以使用软串口。


2.2 系统函数

  1. 初始化程序

    setup() 函数中的代码只会被运行一次,通常用来做初始化工作。

  2. 循环主程序

    loop() 函数中的代码会被无限次地重复运行,程序的主体部分会写在这里。


2.3 串口函数


2.3.1 Serial.begin()

描述: 开启串口,通常置于 setup() 函数中。

原型:

  • Serial.begin(speed)
  • Serial.begin(speed, config)

参数:

  • speed:波特率,一般取值 9600、115200 等。
  • config:设置数据位、校验位和停止位。默认 SERIAL_8N1 表示 8 个数据位,无校验位,1 个停止位。

返回值: 无。


2.3.2 Serial.print()

描述: 串口输出数据,写入字符数据到串口。

原型:

  • Serial.print(val)
  • Serial.print(val, format)

参数:

  • val:打印的值,任意数据类型。
  • format:输出的数据格式。BIN(二进制)、OCT(八进制)、DEC(十进制)、HEX(十六进制)。对于浮点数,此参数指定要使用的小数位数。

示例:

cpp
Serial.print(78, BIN) // 得到 "1001110"
Serial.print(78, OCT) // 得到 "116"
Serial.print(78, DEC) // 得到 "78"
Serial.print(78, HEX) // 得到 "4E"
Serial.print(1.23456, 0) // 得到 "1"
Serial.print(1.23456, 2) // 得到 "1.23"
Serial.print(1.23456, 4) // 得到 "1.2346"
Serial.print('N') // 得到 "N"
Serial.print("Hello world.") // 得到 "Hello world."

返回值: 返回写入的字节数。
Serial.println() 可以实现换行输出。


2.3.3 Serial.available()

描述: 判断串口缓冲区的状态,返回从串口缓冲区读取的字节数。

原型: Serial.available()

参数: 无。

返回值: 可读取的字节数。


2.3.4 Serial.read()

描述: 读取串口数据,一次读一个字符,读完后删除已读数据。

原型: Serial.read()

参数: 无。

返回值: 返回串口缓存中第一个可读字节,当没有可读数据时返回 -1,整数类型。


2.4 Digital I/O


2.4.1 digitalRead()

描述: 从指定的数字引脚读取值,无论是 HIGH 还是 LOW

原型: digitalRead(pin)

参数: pin:读取的 Arduino 引脚号

返回值: HIGHLOW

示例:
将引脚 13 设置为输出,并读取引脚 7 的输入状态。

cpp
int ledPin = 13;  // LED 连接到数字引脚 13
int inPin = 7;    // 按钮连接到数字引脚 7
int val = 0;      // 用于存储读取值的变量

void setup() {
  pinMode(ledPin, OUTPUT);  // 将数字引脚 13 设为输出
  pinMode(inPin, INPUT);    // 将数字引脚 7 设为输入
}

void loop() {
  val = digitalRead(inPin);   // 读取输入引脚
  digitalWrite(ledPin, val);  // 将 LED 设为按钮的状态值
}

2.4.2 digitalWrite()

描述:
向数字引脚写入 HIGHLOW 值。

  • 如果引脚已通过 pinMode() 配置为 OUTPUT,则其电压将被设置为相应值:HIGH 对应 5V(或 3.3V 板子上的 3.3V),LOW 对应 0V(接地)。
  • 如果引脚配置为 INPUTdigitalWrite() 将启用(HIGH)或禁用(LOW)该引脚上的内部上拉电阻。建议使用 pinMode() 将引脚设为 INPUT_PULLUP 来启用内部上拉电阻,详见数字引脚教程
  • 若未明确设置 pinMode(),直接连接 LED 至引脚并调用 digitalWrite(HIGH) 时,LED 可能较暗。此时 digitalWrite() 会默认启用内部上拉电阻,其作用类似于一个较大的限流电阻。

原型: digitalWrite(pin, value)

参数:

  • pin:Arduino 引脚号。
  • valueHIGHLOW

返回值:

示例:

cpp
// 以下代码将数字引脚 13 设为输出,并以每秒一次的频率交替切换高低电平。

void setup() {
  pinMode(13, OUTPUT);    // 将数字引脚 13 设为输出
}

void loop() {
  digitalWrite(13, HIGH); // 设置高电平
  delay(1000);            // 等待 1 秒
  digitalWrite(13, LOW);  // 设置低电平
  delay(1000);            // 等待 1 秒
}

2.4.3 pinMode()

描述:

将指定的引脚配置为输入或输出。有关引脚功能的详细信息,参考数字引脚页面。

Arduino 1.0.1 开始,可以使用 mode 启用内部上拉电阻 INPUT_PULLUP。此外,INPUT 模式明确禁用内部上拉。

原型: pinMode(pin, mode)

参数:

  • pin:要设置模式的 Arduino 引脚号。
  • modeINPUTOUTPUTINPUT_PULLUP。参考数字引脚页面。

返回值:

示例:

cpp
// 该代码将数字引脚 13 设置为 OUTPUT,并在 HIGH 和 LOW 之间切换

void setup() {
  pinMode(13, OUTPUT);    // 将数字引脚 13 设为输出
}

void loop() {
  digitalWrite(13, HIGH); // 设置高电平
  delay(1000);            // 等待 1 秒
  digitalWrite(13, LOW);  // 设置低电平
  delay(1000);            // 等待 1 秒
}

3. 制作流程


3.1 电路模拟过程


3.1.1 模拟硬件

  • 首先,需要在模拟环境中添加一块 Arduino 电路板
  • 其次,需要四个直流电机,用于实现行进及转向控制功能

3.1.2 模拟代码

  • 可以先在 IDE 环境中编译,之后导入虚拟环境中模拟

img

(1)前进、后退及停止功能

实现该功能,需要控制引脚输出的信号,使得两个引脚在直流电机的接口产生电位差,且要保证四个电机的电位差相等,使得小车可以沿着统一方向行驶,当不存在电位差时,电机停止运作,实现停止功能。

前进代码的实现:

cpp
void car_go() {
  digitalWrite(p1, HIGH);
  digitalWrite(p2, LOW);
  digitalWrite(p3, HIGH);
  digitalWrite(p4, LOW);
}

执行后的结果
img

可以看到四个电机均向正方向转动

后退代码的实现

cpp
void car_back() {
  digitalWrite(p1, LOW);
  digitalWrite(p2, HIGH);
  digitalWrite(p3, LOW);
  digitalWrite(p4, HIGH);
}

执行后的结果
img

可以看到四个电机均向反方向转动

停止代码的实现

cpp
void car_stop() {
  digitalWrite(p1, LOW);
  digitalWrite(p2, LOW);
  digitalWrite(p3, LOW);
  digitalWrite(p4, LOW);
}

执行后的结果
img

可以看到四个电机均停止转动

(2)转向功能

实现小车转向功能,可以控制两侧电机运作方向相反,同侧电机运作方向同步,通过改变引脚的输出信号,可以实现该功能。

小车左转向代码的实现

cpp
void car_left() {
  digitalWrite(p1, LOW);
  digitalWrite(p2, HIGH);
  digitalWrite(p3, HIGH);
  digitalWrite(p4, LOW);
}

执行后的结果
img

可以看到上方同侧电机正向转动,下方同侧电机反向转动

小车右转向代码的实现

cpp
void car_right() {
  digitalWrite(p1, HIGH);
  digitalWrite(p2, LOW);
  digitalWrite(p3, LOW);
  digitalWrite(p4, HIGH);
}

执行后的结果
img

可以看到上方同侧电机反向转动,下方同侧电机正向转动

(3)HC-06蓝牙模块连接功能


对Arduino连接HC-06蓝牙模块后,在启动时需要对串口进行连接。

连接示意图
img

代码调试

cpp
#include <SoftwareSerial.h>

SoftwareSerial BT(8, 9); //新建对象,接收脚为8,发送脚为9

char val1; //存储接收的变量

void setup() {
    Serial.begin(9600); //与电脑的串口连接
    Serial.println("BT is ready!");
    BT.begin(9600); //设置蓝牙模块波特率
}

void loop() {
    //如果串口接收到数据,就输出到蓝牙串口
    if (Serial.available()) {
        val1 = Serial.read();
        BT.print(val1);
    }

    //如果接收到蓝牙模块的数据,输出到屏幕
    if (BT.available()) {
        val1 = BT.read();
        Serial.print(val1);
    }
}

(4)蓝牙模块数据处理功能

当通过蓝牙向小车板载的HC-06蓝牙模块发出信号时,小车需要对接收到的蓝牙信号进行处理,以实现对小车的控制。

小车蓝牙信息处理代码的实现

cpp
if(Serial.available()>0){ //当接收信号的返回值大于0时说明接收到了信号
    char val=Serial.read(); //读入接收的信号值
    if(val=='f'){ //当信号为’f’时,执行前进的代码
        car_go();
    }
    else if(val=='b'){  //当信号为’b’时,执行后退的代码
        car_back();
    }
    else if(val=='l'){  //当信号为’l’时,执行左转的代码
        car_left();
    }
    else if(val=='r'){  //当信号为’r’时,执行右转的代码
        car_right();
    }
    else{ //当信号非法时,执行停止的代码
        car_stop();
    }
}

3.2 3D建模过程


3.2.1 模型选择

  • 根据个人风格的不同,选择内置库中自己喜欢的模型组合即可,以下是我的建模成品图

主视图:
img

左视图:
img

俯视图:
img


3.3 焊接过程


4. 成果导出


4.1 导出电路图

img

img


4.2 导出3D建模

img