搭建环境
esp32的环境最后选择了platformio,一是因为他安装方便,最近也修复了网速问题,所以很适合入门,第二个是他真的很方便,不需要配置环境,出的问题也比较少。
环境搭建以及初识esp32
我们所用的开发板跟视频中是一样的,所以视频中的资料都可以用
单片机基础知识
各位带学生在大三时会学到一门叫信号与系统的课,里面都是高数,一定要在大一把高数笔记留好,到时候会用到。信号与系统的世界观认为所有事物都是一个信号系统,那么依照这个观点,单片机也可以认为时一个信号系统。
GPIO端口
信号输入和输出单片机的基本途径,GPIO的G代表general,说明gpio用途广泛,是其他功能实现的基础。
/*点一盏神灯*/
#include <Arduino.h>
void setup()
{
/*
gpio有输入、输出两种模式
gpio引脚配置函数(引脚编号,输入输出模式);
*/
pinMode(LED_BUILTIN, OUTPUT);
}
void loop()
{
/*led灯的功率很小,单片机可以通过引脚直接驱动,
板载的蓝色led灯已经在板子上接到了gpio2端口,
也就是`LED_BUILTIN`*/
digitalWrite(LED_BUILTIN, HIGH);
}
gpio的配置并不止输入输出那么简单,输入有多种方式,例如模拟输入,数字输入时我们最常用的一种方式,不需要额外配置,模拟输入(adc),输出的模式也很多stm32gpio输入输出详解,我们目前需要掌握的只有数字输入输出,最多是模拟输入输出,其他的是在配置外设时需要工程师了解,我们一版使用现成的配置,把精力留存下来设计控制算法。
PWM
pwm也是一个应用相当广的概念,在调节电机转速时,我们需要控制电压,在电子实验中我们一般通过滑动变阻器来实现,但是单片机的结构不允许出现滑动变阻器这样的东西,所以需要控制一个周期内电压的高电平时间,控制有效电压达到调速目的。
当然,pwm只是gpio输出的一种信号,只不过可以通过功率放大的方法使得其具有驱动别的设备的能力。
- 呼吸灯实验
led灯的功率很小,单片机可以通过引脚直接驱动,板载的蓝色led灯已经在板子上接到了gpio2端口,也就是LED_BUILTIN
观看PWM,结合前面所用的神灯代码,实现一个呼吸灯的效果。
搭建车模
- 驱动直流电机
驱动电机需要一个电压,当电机连上的电源电压越高时,转速越快,对于直流电机来说,当电压极性相反,转向也相反,单片机的输出电流较小,无法直接驱动电机,一般需要一个电路把单片机的信号放大,这里的信号就是指的PWM波,PWM通过控制电压高电平的时间控制有效电压,控制转速。
L298N直流电机驱动模块
直流电机我们用的是一款小电流的电机,方便搭建车模。 - 认识第一个传感器
红外传感器
使用wifi进行调参
- esp32
wifi介绍,wifi有AP和STA两种模式,wifi是外设,在这个外设上要运行一个通讯协议,叫做TCP协议,这个协议有两个重要参数,即IP地址和端口号,这次的任务是: - 以esp32作为STA连接到路由器,pc连接到路由器,实现两者通讯,让PC通过WiFi控制esp32开发板上的灯灯的亮度。
代码说明与任务讲解
#include <WiFi.h>
const char *(ssid[]) = {"hudada","esp32test"}; //你的网络名称
const char *(password[]) = {"2001720831gh","5g198J7*"}; //你的网络密码
uint8_t which_wifi=0;
const IPAddress serverIP(192,168,73,75); //欲访问的地址
uint16_t serverPort = 80; //服务器端口号
WiFiClient client; //声明一个客户端对象,用于与服务器进行连接
void setup()
{
Serial.begin(115200);
Serial.println();
WiFi.mode(WIFI_STA);
WiFi.setSleep(false); //关闭STA模式下wifi休眠,提高响应速度
WiFi.begin(ssid[which_wifi], password[which_wifi]);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("Connected");
Serial.print("IP Address:");
Serial.println(WiFi.localIP());
}
void loop()
{
Serial.println("尝试访问服务器");
if (client.connect(serverIP, serverPort)) //尝试访问目标地址
{
Serial.println("访问成功");
client.print("Hello world!"); //向服务器发送数据
while (client.connected() || client.available()) //如果已连接或有收到的未读取的数据
{
if (client.available()) //如果有数据可读取
{
String line = client.readStringUntil('\n'); //读取数据到换行符
Serial.print("读取到数据:");
Serial.println(line);
client.write(line.c_str()); //将收到的数据回发
}
}
Serial.println("关闭当前连接");
client.stop(); //关闭客户端
}
else
{
Serial.println("访问失败");
client.stop(); //关闭客户端
}
delay(5000);
}
- pc端py
python与tcp
from socket import *
# 创建socket
tcp_server_socket = socket(AF_INET, SOCK_STREAM)
# 本地信息
address = ('192.168.2.247', 80)
# 绑定
tcp_server_socket.bind(address)
# 使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动的,这样就可以接收别人的链接了
# listen里的数字表征同一时刻能连接客户端的程度.
tcp_server_socket.listen(1)
# 如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务
# client_socket用来为这个客户端服务
# tcp_server_socket就可以省下来专门等待其他新客户端的链接
# clientAddr 是元组(ip,端口)
client_socket, clientAddr = tcp_server_socket.accept()
# 接收对方发送过来的数据,和udp不同返回的只有数据
recv_data = client_socket.recv(1024) # 接收1024个字节
print('接收到的数据为:', recv_data.decode('gbk'))
# 发送一些数据到客户端
client_socket.send("thank you !".encode('gbk')) #
# 关闭为这个客户端服务的套接字,只要关闭了,就意味着为不能再为这个客户端服务了,如果还需要服务,只能再次重新连接
client_socket.close()