前言
编者自己の话
什么是电子DIY?其实我也没法有个很好的定义,但是可以通过讲故事的方法来讲讲。
有没有看过你买的电脑的接口?一台新的,漂亮的,现代的电脑的接口。比如我的surface pro8除了充电和耳机就只有两个雷电4接口了。或者说叫做usb4接口。USB-Universal Serial Bus通用串行总线协议,从u盘到打印机,相当通用,相当好用,但是你能不能使用这个接口来物理意义地控制一些设备呢?
答案是否定的,在接口的进化中早已失去了那种直接与物理设备进行控制的功能,这是合理且美好的,但是不可避免地,会少很多好玩的事情。
在上古时代(也就是十来年前我还在上幼儿园之前)那个时候的电脑是有很多很丑陋的接口的
那个小小的梯形可不是vga接口哦,这些都是COM口(串口),怎么说捏,这个东西的协议可多了TTL、RS-232、RS-485一堆,一般用来连打印机,各种奇奇怪怪的工控设备之类的玩意,现在已经基本见不到了。因为“通用串行总线协议”统一了这一大堆东西。
但是总是存在一些爱好者觉得生活中的东西应该被电脑控制:比如用手机开个灯,亮个电视之类的。诚然诸如米家之类的设备可以做到这些是吧,但是如果我的需求是“有人进入房间后把厕所门打开然后播放东雪莲的典中典,接着给千里之外的家里服务器屏幕显示现在昌平区的空气质量,把空气质量指数乘上114514对1919810取模后的数字的第三位有效数字作为歌单的第一首歌放给实验室的人听”这样的需求很明显米家就不太能办得到。
当然这个例子可能比较极端了
,但是如果你想要自己做一些有趣的,实用性不一定很强的小玩意,那么恭喜,请接着读下去吧。
在做这些东西的时候,我常常在想是什么在驱动着我做出一个又一个或丑陋或奇怪的DIY小制作。不知道朱军有没有做过乐高,乐高积木能在我小的时候给予我一个可能的坐在那里安静地玩耍半天地机会(挺难得的),无论是拼的过程还是最后的成品,都有一种超级强的成就感。这种感受在后面漫长的寒窗苦读中苦读你会来北矿?短暂地在组装我的电脑地时候出现过,后面倒是阴差阳错地买了一个树莓派,从此踏上了不归路。但是说真的,从有一个需求,有一个想法,然后分析要怎么实现,哪些会,哪些不会,怎么学,然后一步一步实现,遇到错误,解决错误,最后完成地那一刻地成就感是无可比拟地,这种成就感会在每一次你看到自己曾经做的东西,或者和别人说起地时候而产生,从而真的痴迷于电子DIY的制作制作里面,真的很开心。
Arduino/树莓派 特别感谢
为了能够方便,廉价,批量地做很多东西,单片机会被设计成很便宜,功耗不会很大,需要外部给它烧录程序的芯片,通常是上电自启动的。
当然因为电脑已经不具备和各种物理设备直接相连的能力的,我们需要一些方法来控制这些东西,通常的,是单片机(树莓派另说),而很长一段时间里,各种单片机的使用都是很痛苦很难受很想死的,而arduino的出现让单片机的开发变得无比简单,为什么说无比简单,我们看一个例子,分别在stc32和arduino上面输出pwm信号所需的代码量
所以arduino最开始就是为了让单片机的开发更加的简单,虽然现在来说有很多很好的arduino的替代品,但是arduino的丰富社区让这个性能羸弱的芯片还是非常地受欢迎。
树莓派则更是重量级,应该是某有为青年看到带学生只会写个word,很可悲决定整一个很棒的,能过有还行的性能和价格的,能够控制外部设备的电脑出来(虽然后面价格直接起飞变成奢侈品了)
树莓派不同于单片机,其本身就是一台能正常运行的电脑,可以直接在上面调用相应的库来控制相关的东西(RPi.GPIO)唯一缺点就是贵死了。在树莓派上面,上述例子可以用python写成这个样子:
都是非常容易理解,编写的东西,看不懂也不要紧,我已经买不起树莓派了,所以接下来的例子里面几乎不会有树莓派的233333。
Just do it
我以前第一次来实验室就去问学长怎么才能学会做这些东西啊,其实这个问题很没有意义,因为当然可以回答“模电数电python c cpp 数据结构”等等,但其实根本并不需要刻意地去看什么书学什么网课之类的,只需要有一个想做的东西,在做这个东西的时候自然地就能学会一些东西,刻意地去学点啥很快就忘了,还没啥成就感。
大概这个手册会包含什么?
在阅读之前你应该
- 知道cpp的基本语句
- 知道什么是欧姆定律(
例子将尽可能地使用esp32和arduino为主控,最后基本实现做一个天气小电视(
每一章会分为两个部分来进行,在第一个部分中,你不需要知道为什么会这样,跟着做就实现功能,制作某一些具体的东西。而在第二个部分后日谈中(什么gal)会细说在程序抑或是硬件中的知识与一些扩展,这样也许读起来会比较有趣吧(
- 第一部分 Arduino IDE 的安装和配置
- 第二部分 点灯!Arduino库函数的基本使用
- 第三部分 自动逗猫机器!pwm与舵机的使用
- 第四部分 到底几度了?热敏电阻与串口的使用
- *第五部分 mircopython电子琴!(如果想用python的话
- 第六部分 温度计和iic屏幕!封装好的通讯协议!
- 第七部分 天气小电视!使用现成的api!
第一部分 esp32的Arduino IDE的安装和配置捏
Arduino IDE 是一个非常非常非常好用的用来进行各种单片机开发的IDE,可以在这里下载到https://downloads.arduino.cc/arduino-ide
下好之后一路安装就好了,然后需要做第二件事,就是给esp32顺便配置好
esp32是一个很便宜但是很好用的单片机,自带wifi蓝牙,神中神!而且相当多arduino的库函数esp32也可以直接调用,kksk
那么打开Arduino IDE 然后在左上角 文件 >> 首选项 >> 附加开发板管理网址 然后输入这个链接https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json
;顺便可以改一下语言改成世界上使用人数最多的中國語,然后重启ide,进入工具 >> 开发板管理器,搜esp32安装,这样就可以在开发板管理器里面找到esp32相关的芯片了。
第二部分 点灯!Arduino 库函数的基本使用方法。
先上手!
那么在安装好IDE之后,就可以用arduino 来做一些最基本的事情了,比如:点灯。前置科技是你需要知道发光二极管是可以亮的。
这里需要一个“发光二极管”和470欧电阻(如果没有直接接上去也不是不行),请注意放光二极管的长脚是正极捏,大概如果你有面包板就可以这样接(建议买几个面包板捏
然后你就可以在arduino ide 里面这样写:
// setup函数将在arduino上电地时候开始运行第一次
void setup() {
// 把LED_BUILTIN的模式改为输出模式
pinMode(3, OUTPUT);
}
// 在循环(loop)函数中的代码将会一次一次地永远循环运行下去
void loop() {
digitalWrite(3, HIGH); // 把3针脚改为高电平
delay(1000); // 等待一秒
digitalWrite(3, LOW); // 把3号针脚改为低电平
delay(1000); // 等待一秒
}
之后在Arduino IDE 上面选择连接的端口和Arduino型号(这里应该是ARduino UNO),然后选择编译上传就可以看到面包板上面的灯开始慢慢地闪烁了。
后日谈
Arduino怎么这么贵(
emmmmm通常不会有人去买官方的Arduino UNO,人称:意大利版,一个好像一百多来着(,但是华强北版本只要十多块钱性能还没啥区别,令人感叹。
setup函数和loop函数
与在标准的C/CPP中不一样,Arduino并不要求有一个main函数作为入口,而是使用 setup函数和loop函数进行所需方法的初始化和运行。
在上电之后会首先运行setup函数内的内容,通常地我们会把各种接口的初始化和串口初始化之类的东西都放在这里面。
而loop函数一般是需要反复运行的内容,比如改变引脚的高低电平,或者是读取传感器的数据,刷新屏幕的内容之类的东西。
当然其实arduino是有main函数的,在库函数里面(不需要读啦这部分
#include <Arduino.h>
// Declared weak in Arduino.h to allow user redefinitions.
int atexit(void (* /*func*/ )()) { return 0; }
// Weak empty variant initialization function.
// May be redefined by variant files.
void initVariant() __attribute__((weak));
void initVariant() { }
void setupUSB() __attribute__((weak));
void setupUSB() { }
int main(void)
{
init();
initVariant();
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
面包板,LED和电阻
可能你会疑惑面包板是啥,如果你手头有一块的话,请看看它的背面吧:
每一行都是连在一起的,这样在开发一些项目的时候临时起到给元器件接线的方法是及其好用的,两边的竖线可以用来作为所有元器件的电源的地线,这样就不用飞一堆先来连接电源了。(后面你会知道iic协议用这两个线也很舒服)
LED灯或者说发光二极管是需要区分正负的,对于绝大多数的元器件,当其需要被区分正负的时候,长的那个引脚通常代表正极,接反了可以产生很多奇妙的事情(比如一场小型的,有毒的烟花秀)
电阻在此例中起到分压之作用,其实不分压问题也不大,只要你别点亮好几个小时其实也不会烧,但是如果在做一些需要长期使用的项目时,记得给你的LED串一个470Ω电阻。
第三部分 自动逗猫机器!pwm与舵机的使用
先上手!
首先需要一个舵机,例中相当便宜的SG90就足够了,然后舵机上面的三根线按照黑红黄分别连接地,电源和PWM信号,如图,注意在Arduino中只有带有~符号的引脚才可以输出pwm信号,这里就选用三号咯
后日谈
什么是PWM
PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。
通常地,描述一个PWM信号会遇到三个参数:占空比,脉宽,频率
首先是占空比,即在一个周期内高电平时间占总时间的比,如果你给pwm干到发光二极管上,具体效果就是占空比越高,灯就会越亮,频率即其每秒周期数(什么屁话
脉宽也很好理解,即单次周期中高电平的时间,比如50HZ,5%占空比,其脉宽就应该是1ms.
控制舵机
通常地,舵机有很多种类型,主要是转动角度和扭力大小的不同,当然本例中的SG90舵机属于是图一乐级别。
大多数的舵机是使用脉宽进行控制,其中脉冲宽度从0.5ms-2.5ms,相对应舵盘的位置为0—180度,呈线性变化。
浅浅地举一个例子,比如你在使用Arduino uno,这个玩意的analogWrite()函数可以实现在3, 9, 10, 11输出490HZ的pwm信号,那么其一个周期就应该是1/490 s=2.04ms,因为我是懒狗,就算它是2ms吧,那么就会发现无法提供2ms以上的脉宽,即舵机死区会非常的大,有很多角度传不过去(悲,所以使用arduino 的舵机库来避免这个问题:
#include <Servo.h>
Servo myservo; // 创建舵机对象
int val = 114; // 舵机角度值
void setup() {
myservo.attach(9); // 实例化舵机对象,传递针脚参数
}
void loop() {
myservo.write(val); // 对舵机传递所需角度值
delay(15); // 等待舵机转动到指定位置(
}
如果想要自己搓舵机控制,就需要一些pwm控制,这里以树莓派pico为例:
import time
from machine import Pin, PWM
# 设定GPIO25为PWM输出方式
pwm = PWM(Pin(25))
# 设定PWM的频率为50Hz
pwm.freq(50)
# 设定PWM的占空比,取值范围0~65535, 而32768大约是一半,也就是50%
pwm.duty_u16(32768)
time.sleep(0.5)
#等待舵机转动
pwm.duty_u16(0)
#把pwm针脚置低
既然是50hz的频率,一个周期有长达20ms,那么就应该给的0.5ms-2.5ms的脉宽即对应2.5%-12.5%的占空比,但是如果给了pwm信号之后不把pwm信号关掉,舵机会一直抖动来尝试转动到那个精确的值(虽然做不到),所以当舵机转动到指定位置之后就要直接把pwm信号关掉。
ps:有些舵机所需脉宽可能不是0.5-2.5,可以试一试转到头所需的脉宽来自己写舵机控制(悲
人体感应模块(什么垃圾 HC-SR501
工作原理
人体都有恒定的体温,一般在37度,所以会发出特定波长10UM左右的红外线,被动式红外探头就是靠探测人体发射的10UM左右的红外线而进行工作的。人体发射的10UM左右的红外线通过菲泥尔滤光片增强后聚集到红外感应源上。
红外感应源通常采用热释电元件,这种元件在接收到人体红外辐射温度发生变化时就会失去电荷平衡,向外释放电荷,后续电路经检测处理后就能产生报警信号。
热释电效应:
当一些晶体受热时,在晶体两端将会产生数量相等而符号相反的电荷。这种由于热变化而产生的电极化现象称为热释电效应。
菲涅耳透镜:
根据菲涅耳原理制成,菲涅耳透镜分为折射式和反射式两种形式,其作用一是聚焦作用,将热释的红外信号折射(反射)在PIR上;二是将检测区内分为若干个明区和暗区,使进入检测区的移动物体能以温度变化的形式在PIR上产生变化热释红外信号,这样PIR就能产生变化电信号。使热释电人体红外传感器(PIR)灵敏度大大增加。
模块参数:
- 工作电压:DC5V至20V
- 静态功耗:65微安
- 电平输出:高3.3V,低0V
- 延时时间:可调(0.3秒~18秒)
- 封锁时间:0.2秒
- 触发方式:L不可重复,H可重复,默认值为H(跳帽选择)
- 感应范围:小于120度锥角,7米以内
- 工作温度:-15~+70度
模块特性:
1、这种探头是以探测人体辐射为目标的。所以热释电元件对波长为10UM左右的红外辐射必须非常敏感。
2、为了仅仅对人体的红外辐射敏感,在它的辐射照面通常覆盖有特殊的菲泥尔滤光片,使环境的干扰受到明显的控制作用。
3、被动红外探头,其传感器包含两个互相串联或并联的热释电元。而且制成的两个电极化方向正好相反,环境背景辐射对两个热释元件几乎具有相同的作用,使其产生释电效应相互抵消,于是探测器无信号输出。
4、一旦人侵入探测区域内,人体红外辐射通过部分镜面聚焦,并被热释电元接收,但是两片热释电元接收到的热量不同,热释电也不同,不能抵消,经信号处理而报警。
5、菲泥尔滤光片根据性能要求不同,具有不同的焦距(感应距离),从而产生不同的监控视场,视场越多,控制越严密。
触发方式:
L不可重复,H可重复。可跳线选择,默认为H。
A. 不可重复触发方式:即感应输出高电平后,延时时间一结束,输出将自动从高电平变为低电平。
B. 重复触发方式: 即感应输出高电平后,在延时时间段内,如果有人体在其感应范围内活动,其输出将一直保持高电平,直到人离开后才延时将高电平变为低电平(感应模块检测到人体的每一次活动后会自动顺延一个延时时间段,并且以最后一次活动的时间为延时时间的起始点)。
可调封锁时间及检测距离调节:
1、 调节检测距离
2、 封锁时间:感应模块在每一次感应输出后(高电平变为低电平),可以紧跟着设置一个封锁时间,在此时间段内感应器不接收任何感应信号。此功能可以实现(感应输出时间和封锁时间)两者的间隔工作,可应用于间隔探测产品;同时此功能可有效抑制负载切换过程中产生的各种干扰。(默认封锁时间2.5S)
注:
1、调节距离电位器顺时针旋转,感应距离增大(约 7 米),反之,感应距离减小(约 3 米)。
2、调节延时电位器顺时针旋转,感应延时加长(约300S),反之,感应延时减短(约 0.5S)。
光敏控制:
模块预留有位置,可设置光敏控制,白天或光线强时不感应。光敏控制为可选功能,出厂时未安装光敏电阻。(好像没啥用
模块优缺点:
优点:
本身不发任何类型的辐射,器件功耗很小,隐蔽性好。价格低廉。
缺点:
容易受各种热源、光源干扰
被动红外穿透力差,人体的红外辐射容易被遮挡,不易被探头接收。
易受射频辐射的干扰。
环境温度和人体温度接近时,探测和灵敏度明显下降,有时造成短时失灵。
模块抗干扰:
1、 防小动物干扰
2、 防电磁干扰
3、 防强灯光干扰
安装:
红外线热释电人体传感器只能安装在室内,其误报率与安装的位置和方式有极大的关系,正确的安装应满足下列条件:
1. 红外线热释电传感器应离地面2.0-2.2米。
2. 红外线热释电传感器远离空调, 冰箱,火炉等空气温度变化敏感的地方。
3. 红外线热释电传感器探测范围内不得隔屏、家具、大型盆景或其他隔离物。
4. 红外线热释电传感器不要直对窗口,否则窗外的热气流扰动和人员走动会引起误报,有条件的最好把窗帘拉上。红外线热释电传感器也不要安装在有强气流活动的地方。
红外线热释电传感器对人体的敏感程度还和人的运动方向关系很大。热释电红外传感器对于径向移动反应最不敏感, 而对于横切方向 (即与半径垂直的方向)移动则最为敏感. 在现场选择合适的安装位置是避免红外探头误报、求得最佳检测灵敏度极为重要的一环。
第四部分 到底几度了?热敏电阻与串口的使用
先上手
需要:NTC MF58热敏电阻,arduino一块(esp32/esp8266也行
ADC
ADC (analog digital convers)模数转换器,用于把
后日谈
串口使用
读取电压
热敏电阻
这里选用NTC MF58热敏电阻,会看到一大堆神奇的参数:R25,B值
R25代表此电阻在温度为25摄氏度的时候的电阻值
B值通常会给出其适用范围,在其适用范围只能满足以下公式:
那么在知道R25与B值就能在B值得适用范围之内使用以下公式计算其阻值
当然也可以直接把温度——阻值对应表存起来直接用(精度美丽
10K
MF52系列热敏电阻±1°C,0°C至125°C
10KOhm @ 25°C | 在25°C下10000欧姆| 基于FENWALL CURVE 16 | B值曲线3950K温度与电阻表
温度(℃) | 欧姆 | 温度(℃) | 阻值(Ω) | 温度(℃) | 阻值(Ω) | 温度(℃) | 阻值(Ω) | 温度(℃) | 阻值(Ω) |
-40 | 336600 | -1 | 34380 | 38 | 5776 | 77 | 1385 | 116 | 433.4 |
-39 | 315000 | 0 | 32660 | 39 | 5546 | 78 | 1341 | 117 | 421.8 |
-38 | 295000 | 1 | 31040 | 40 | 5326 | 79 | 1298 | 118 | 410.6 |
-37 | 276400 | 2 | 29500 | 41 | 5118 | 80 | 1256 | 119 | 399.8 |
-36 | 259000 | 3 | 28060 | 42 | 4918 | 81 | 1216 | 120 | 389.4 |
-35 | 242800 | 4 | 26680 | 43 | 4726 | 82 | 1178 | 121 | 379.2 |
-34 | 227800 | 5 | 25400 | 44 | 4544 | 83 | 1141 | 122 | 369.4 |
-33 | 213800 | 6 | 24180 | 45 | 4368 | 84 | 1105 | 123 | 359.8 |
-32 | 200600 | 7 | 23020 | 46 | 4202 | 85 | 1071 | 124 | 350.6 |
-31 | 188400 | 8 | 21920 | 47 | 4042 | 86 | 1038 | 125 | 341.6 |
-30 | 177000 | 9 | 20880 | 48 | 3888 | 87 | 1006 | 126 | 332.8 |
-29 | 166400 | 10 | 19900 | 49 | 3742 | 88 | 975 | 127 | 324.4 |
-28 | 156500 | 11 | 18970 | 50 | 3602 | 89 | 945.2 | 128 | 316.2 |
-27 | 147200 | 12 | 18090 | 51 | 3468 | 90 | 916.4 | 129 | 308.2 |
-26 | 138500 | 13 | 17260 | 52 | 3340 | 91 | 888.8 | 130 | 300.6 |
-25 | 130400 | 14 | 16460 | 53 | 3216 | 92 | 862 | 131 | 293 |
-24 | 122900 | 15 | 15710 | 54 | 3098 | 93 | 836.4 | 132 | 285.8 |
-23 | 115800 | 16 | 15000 | 55 | 2986 | 94 | 811.4 | 133 | 278.8 |
-22 | 109100 | 17 | 14320 | 56 | 2878 | 95 | 787.4 | 134 | 272 |
-21 | 102900 | 18 | 13680 | 57 | 2774 | 96 | 764.2 | 135 | 265.2 |
-20 | 97120 | 19 | 13070 | 58 | 2674 | 97 | 741.8 | 136 | 258.8 |
-19 | 91660 | 20 | 12490 | 59 | 2580 | 98 | 720.2 | 137 | 252.6 |
-18 | 86540 | 21 | 11940 | 60 | 2488 | 99 | 699.4 | 138 | 246.4 |
-17 | 81720 | 22 | 11420 | 61 | 2400 | 100 | 679.2 | 139 | 240.6 |
-16 | 77220 | 23 | 10920 | 62 | 2316 | 101 | 659.6 | 140 | 234.8 |
-15 | 72980 | 24 | 10450 | 63 | 2234 | 102 | 640.8 | 141 | 229.2 |
-14 | 69000 | 25 | 10000 | 64 | 2158 | 103 | 622.6 | 142 | 223.8 |
-13 | 65260 | 26 | 9574 | 65 | 2082 | 104 | 605 | 143 | 218.4 |
-12 | 61760 | 27 | 9166 | 66 | 2012 | 105 | 588 | 144 | 213.4 |
-11 | 58460 | 28 | 8778 | 67 | 1942 | 106 | 571.4 | 145 | 208.4 |
-10 | 55340 | 29 | 8408 | 68 | 1876 | 107 | 555.6 | 146 | 203.6 |
-9 | 52420 | 30 | 8058 | 69 | 1813 | 108 | 540.2 | 147 | 198.8 |
-8 | 49660 | 31 | 7722 | 70 | 1751 | 109 | 525.2 | 148 | 194.2 |
-7 | 47080 | 32 | 7404 | 71 | 1693 | 110 | 510.8 | 149 | 189.7 |
-6 | 44640 | 33 | 7098 | 72 | 1637 | 111 | 496.8 | 150 | 185.4 |
-5 | 42340 | 34 | 6808 | 73 | 1582 | 112 | 483.2 | ||
-4 | 40160 | 35 | 6532 | 74 | 1530 | 113 | 470.2 | ||
-3 | 38120 | 36 | 6268 | 75 | 1480 | 114 | 457.4 | ||
-2 | 36200 | 37 | 6016 | 76 | 1432 | 115 | 445.2 |
参考文献/教程/代码/例子:
Servo Motor Basics with Arduino | Arduino Documentation | Arduino Documentation
我用树莓派Pico学Python (4) – PWM_zhufu86的博客-CSDN博客
python写错了捏 {{se}}
雪豹闭嘴