“物联网开发实战”学习笔记-(一)硬件开发环境的搭建

“物联网开发实战”学习笔记-(一)硬件开发环境的搭建

这里的分享是通过自己的整理总结出的一个课程的学习笔记,我想用简洁易懂的步骤来分享一个物联网建立的过程。

这里课程上有四个 4 个产品场景
1.可以手机控制的智能电灯
2.可以基于光线自动调节的智能电灯
3.可以语音控制的智能音箱
4.可以基于环境温湿度和土壤湿度自动浇水的浇花器

不过,在打造这些产品场景之前,我们还需要先搭建好硬件开发环境。以智能电灯为例,去说下这个硬件开发的准备。

通信技术:Wi-Fi

为了能让手机控制电灯,我们首先要让电灯接入网络。

选择WI-FI的原因:

1.从通信速率来看,智能电灯传输的数据,包括控制命令和几种状态的数值,数据量都非常小,这几种通信技术都可以满足要求。
2.从功耗来看,智能电灯是直接连接电线的,不需要电池供电,所以低功耗的 BLE 和 ZigBee 技术不是必须的选择,功耗相对较高的 Wi-Fi 也可以考虑。
3.从普及度和易用性的角度分析,如果使用 BLE,设备与手机的交互确实会非常方便。但是 BLE 和 ZigBee 的设备都有一个缺点,就是需要搭配专有的网关才能连接互联网,这在部署和使用的时候都比较麻烦。所以,我们选择 Wi-Fi 作为智能电灯的通信方式。

开发板:NodeMCU

选择开源硬件的开发板的原因。

1.硬件、软件的各种技术实现是公开的,方便分析问题,也方便后期转化为量产的产品;
2.有社区氛围,使用的人比较多,大家可以针对具体的问题进行交流。
这里我们选择NodeMCU 。基于 ESP8266 芯片的版本,Flash 空间有 4MB,自带 Wi-Fi 功能,而且价格便宜,在国内外都非常流行。我在某多上买的10块钱。

在这里插入图片描述

开发语言:Python

相比于C语言, Python 语言显得更为简单,必要的时候还可以调用很多库。
因为嵌入式硬件的计算资源都非常有限,我们使用的是专门为嵌入式系统打造的 MicroPython 它完整实现了 Python3.4 的语言特性,部分支持 Python3.5 的特性。在标准库方面MicroPython 实现了 Python 语言的一个子集,另外还增加了与底层硬件交互的库模块。

搭建 MicroPython 开发环境

接下来就来把 MicroPython 部署到 NodeMCU 开发板上,准备好开发环境。

第一步:准备固件文件

首先,我们需要为 NodeMCU 准备好 MicroPython 固件文件。MicroPython 官方已经为 ESP8266 芯片准备了现成的固件
MicroPython 的固件分为 2M、1M 和 512K 三个不同的版本,针对不同大小的 Flash 存储空间。我们下载最新的 2M 稳定版本(带 stable 的)就行,因为 NodeMCU 开发板的 Flash 空间是足够的。

第二步:安装烧录工具

然后,我们使用一根 USB 数据线,将 NodeMCU 开发板和电脑连接起来。
接着,我们在电脑终端运行下面的命令,安装用来烧录的工具 esptool :

pip install esptool

esptool 安装完成后,你可以运行 esptool.py read_mac 命令,确认 NodeMCU 板子是否连接成功。连接成功后的屏幕显示是这样的:
在这里插入图片描述

如果连接不成功,或者没有正确识别设备,屏幕上则会出现下面的结果:
在这里插入图片描述

不行的原因

1.检查一下使用的 USB 线能否传输数据。现在很多电子产品会随带 USB 充电线,但是为了节约成本,有些 USB 线内部实际上并没有集成两根数据信号线。如果使用了这种线,就只能充电,而电脑是识别不出设备的。
另外,注意我们使用的数据线,一头是 USB-A 接口,另一头是 Micro-USB 接口。USB 的接口规格繁多,我在这里放了一张图,方便你区分。
在这里插入图片描述
2.驱动文件有没有安装好。
如果你跟我一样,用的是 macOS 系统,可以在电脑的终端上输入 ls /dev/cu* 命令,查看是否有类似 /dev/cu.wchusbserialxxxxx 名字的设备文件。
如果你使用 Windows 系统,那么需要查看一下“设备管理器”,看看“端口(COM 和 LPT)”下面,有没有 COM* 结尾的设备。我在一开始完单片机和Arduino的时候都是遇到了驱动的问题,一般都要安装驱动CH340就解决了。
如果没有,可以参考这篇文章,下载相应的驱动文件安装。
当你在终端看到类似下面的结果,或者在 Windows 的设备管理器中看到 COM* 设备时,就说明开发板已经成功识别。
在这里插入图片描述

如果仍然无法正确识别,可以到一些论坛去交流,比如安信可的官方论坛。

第三步:烧录固件

接下来我们烧录固件。在这之前,我们需要先输入下面命令,擦除 Flash 芯片:

#注意设备名称替换为你电脑上的名称
esptool.py --port /dev/cu.wchusbserial14230 erase_flash

在这里插入图片描述

擦除成功后,我们进入存储前面下载固件的目录中,运行下面的命令,将固件文件烧录到开发板的 Flash 中:

#注意设备名称替换为你电脑上的名称,固件文件名称做类似修改
esptool.py --port /dev/cu.wchusbserial14230 --baud 460800 write_flash --flash_size=detect 0 esp8266-20200911-v1.13.bin

在这里插入图片描述

烧录成功后,MicroPython 已经在你的开发板上运行起来了。

第四步:确认运行状态

但是开发板跟电脑不一样,是没有显示屏的,我们要怎么确认它的运行状态呢?
有一种非常简便的方法,你可以用电脑或者手机搜索一下周围的 Wi-Fi 热点,如果看到类似 “MicroPython-xxxxxx” 名称的热点(xxxxxx 是开发板 MAC 地址后半部分),说明你的 NodeMCU 工作正常。比如开发板 MAC 地址是“40:f5:20:07:3b:52”,如果看到了“MicroPython-073b52”这个热点,就说明开发板在正常运行。
当然,对于 Python 来说,更方便的交互方式还是 REPL (交互式解释器),这个 MicroPython 也提供了。我们可以通过 REPL 来检验开发板的运行。
我们还是使用烧录时用到的 USB 线连接开发板和电脑。在 MacOS 电脑上,重新连接开发板的时候,串口设备名称可能会改变,所以为保险起见,再次运行命令:

ls /dev/cu*

获得串口设备名称之后,我们可以使用终端模拟器软件,比如 SecureCRT,通过串口协议连接上开发板,进行交互。
需要注意的是,波特率(Baud rate)设置为 115200,这与前面烧录时选择的值不同。
在这里插入图片描述
如果你使用 Windows 操作系统,那么 PuTTY 更加流行。当然,建立连接的参数设置都是类似的。
成功连接后,SecureCRT 的窗口会输出类似下面的结果:
在这里插入图片描述
看到熟悉的符号 “>>>”,我们就知道,可以真正进行交互了。

第五步:体验交互

先用“Hello World”来个经典的打招呼吧。
接着,我们体验一下 MicroPython 控制 LED 灯。因为开发板 NodeMCU 12F 的 GPIO2 管脚接有一个 LED 灯,你可以输入下面的代码,控制它的点亮和熄灭。

>>> print("Hello World from MicroPython!")
Hello World from MicroPython!
>>> import machine
>>> pin = machine.Pin(2, machine.Pin.OUT)
>>> pin.off()
>>> pin.on()

需要注意的是,不同的板子上,这个管脚的高低电平的设计可能不同,所以 pin.on() 可能是熄灭 LED 灯;pin.off() 反而是点亮 LED 灯。
部署代码到开发板
那么,能不能运行一个 Python 代码文件呢?比如,基于在 REPL 中尝试的点亮 LED 操作。
我们写一个代码段:

import machine
import time
#指明 GPIO2 管脚
pin = machine.Pin(2, machine.Pin.OUT)
#循环执行
while True:
    time.sleep(2)   # 等待 2 秒
    pin.on()        # 控制 LED 状态
    time.sleep(2)   # 等待 2 秒
    pin.off()       # 切换 LED

这段代码实现的功能是,控制 LED 灯以 2 秒的间隔,不断点亮、熄灭。
为了在电路板上运行这个 Python 代码,我们需要做两件事情:
将代码段保存到一个文件中,这个文件的名字必须是 main.py。
将代码文件 main.py 放到开发板的文件系统中,而且是根目录。
这样,当开发板启动或者重启的时候,就会自动执行 main.py 文件中的代码。
第一点我们可以很容易做到。但是,怎么把代码文件上传到开发板上呢?
MicroPython 的官方提供了一个工具pyboard.py,它也是基于串口连接与开发板通信的。你可以使用它操作开发板上的文件系统,比如常用的拷贝文件、创建文件夹、删除等功能,甚至可以将电脑上的代码文件加载到内存中,直接运行。这非常便于你在开发过程中,进行代码的调试。
下载 pyboard.py 的源文件到电脑后,你可以运行下面的命令,将 main.py 文件部署到你的开发板:

#设置环境变量,指明串口设备
export PYBOARD_DEVICE=/dev/cu.wchusbserial14220
#拷贝当前目录下的 main.py 到开发板
./pyboard.py cp main.py :

不过,pyboard.py 在 MacOS 系统上运行有问题。比如,在电脑终端,尝试运行下面的命令,就会收到 “could not enter raw repl” 这个错误信息。

./pyboard.py -f ls /

这可能是 MacOS 上的串口芯片 CH340 的驱动的问题,它会在建立串口连接时,重置 NodeMCU ,导致 enter_raw_repl 函数无法正常执行。
这个时候有几个解决方案
使用 AdaFruit MicroPython tool —— ampy。安装过程可以打开链接了解,我就不展开了。一般情况下,你可以用下面的命令完成安装:

pip install adafruit-ampy
# ---或者---
pip3 install adafruit-ampy

ampy 是通过增加延时的方法,来规避 MacOS 系统上的问题的。所以在使用的时候,我们需要先设置一个环境变量 —— AMPY_DELAY。延时的推荐值是 0.5,不过,具体实践时,你需要根据自己的开发板的试验情况,灵活调整这个数值。

export AMPY_DELAY=0.5

我们可以在终端中输入上面的指令,也可以将它加入到 .bashrc 或 .zshrc 等配置文件中,避免每次都要重复输入。
使用 ampy 的过程中,常用的环境变量还有下面两个,可以根据具体情况设置:

#设备名称请根据你的情况修改
export AMPY_PORT=/dev/cu.wchusbserial14220
#串口通信的波特率   
export AMPY_BAUD=115200

然后,输入下面的命令,就把代码部署到开发板上了。

ampy put main.py

学习笔记总结自‘物联网开发实战’–郭朝斌
–笔记只用于学习交流,请不要用于商业用途。

  • 11
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
### 回答1: 张正友标定法是一种相机标定方法,可以用于确定相机内部参数和外部参数。该方法基于相机成像原理,通过拍摄不同角度的标定板图像,利用图像中的特征点计算相机的内部参数和外部参数。该方法具有精度高、适用范围广等优点,被广泛应用于机器视觉、三维重建等领域。 该方法的具体步骤包括:选择标定板、拍摄标定板图像、提取图像特征点、计算相机内部参数和外部参数。其中,选择标定板需要考虑标定板的大小、形状、特征点数量等因素;拍摄标定板图像需要保证标定板在不同角度下都能被完整拍摄到;提取图像特征点需要使用特征点检测算法,如SIFT、SURF等;计算相机内部参数和外部参数需要使用张正友标定法的数学模型,通过最小化重投影误差来求解。 在实际应用中,张正友标定法需要注意以下几点:标定板需要保持平整,避免出现弯曲、扭曲等情况;标定板需要在不同角度下拍摄多张图像,以提高标定精度;标定板需要在光线充足、均匀的环境下进行拍摄,避免光线不足或过强导致标定精度下降。 总之,张正友标定法是一种重要的相机标定方法,掌握该方法对于机器视觉、三维重建等领域的研究具有重要意义。 ### 回答2: 张正友标定法是用于相机投影模型标定的一种方法,其原理是在一组已知物点与其图像坐标的情况下,通过求解相机内参矩阵和外参矩阵,从而得出相机的几何参数,可用于后续的相机运动估计和三维重建。 首先,需要准备一组已知的物点和其对应的图像坐标。物点最好组成一个三维坐标系,如在测量机中通过三维测量得到。接下来,通过张正友标定法求解相机的内参矩阵。内参矩阵包括了相机的焦距、像素尺寸、主点位置等参数,这些参数决定了像素坐标与实际物理坐标之间的转换关系。通过一些数学推导,可以得到内参矩阵的表达式,并且可以通过已知的物点和相应的图像坐标求解出内参矩阵。 接下来,需要求解相机的外参矩阵,即相机坐标系相对于物点坐标系的位姿关系。通过张正友标定法,可以得到物点在相机坐标系下的坐标,从而求解出相机的外参矩阵。外参矩阵包括了相机的旋转矩阵和平移向量,这些参数描述了相机在物点坐标系下的位姿。 最后,通过内参矩阵和外参矩阵,可以将相机坐标系下的物点坐标转换成像素坐标,从而可用于后续的三维重建和相机运动估计。需要注意的是,在实际应用中,因为测量误差和噪声的存在,标定误差会影响到后续的应用效果,所以需要对标定结果进行一定的误差分析和修正。 总而言之,张正友标定法是一种基于已知物点和其图像坐标的相机标定方法,通过求解相机的内参矩阵和外参矩阵,可得到相机的几何参数,进而实现三维重建和相机运动估计等应用,具有广泛的应用价值。 ### 回答3: 张正友标定法是一种常用的摄像机标定方法,它的主要思想是通过成像偏移量和焦距的测量来确定相机的内参矩阵和外参矩阵,从而实现对摄像机的校准。张正友标定法的流程主要分为以下几个步骤。 第一步,数据采集。采集一组已知尺寸的平面图案,例如棋盘格,同时记录下相机对图案的姿态(位置和姿态),姿态可以通过用相机拍摄不同姿态下的图案来得到。 第二步,提取图案角点。使用角点检测算法,例如Harris角点检测、SIFT角点检测等,从图像中提取出每个格子的四个角点。 第三步,计算图像坐标。对于每个角点,根据相机的内参矩阵和外参矩阵,可以计算出其在图像中的坐标。 第四步,标定相机内部参数。利用上一步得到的图像坐标和对应的实际坐标,使用最小二乘法等求解相机的内参矩阵。 第五步,标定相机外部参数。同样利用上一步得到的图像坐标和对应的实际坐标,使用求解PnP问题的算法可以得到相机的外参矩阵。 通过以上步骤,就可以获得相机的内参矩阵和外参矩阵,从而实现对摄像机的标定。在实际应用中,可以将标定结果用于建立相机-世界坐标系之间的转换关系,进而实现摄像机与物体的三维空间定位和跟踪等应用。 总之,张正友标定法是一种基于对摄像机成像原理的理解和应用的标定方法,是计算机视觉和机器视觉领域中常用的技术之一,也是深度学习等领域的前置步骤。掌握该方法的原理和实现技巧,对于进一步深入了解计算机视觉和机器视觉技术体系,以及开展实际应用有着重要的意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翼达口香糖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值