Arduino不完全入坑指南
声明
一、前言
Arduino能做什么?
Arduino是什么?
Arduino和树莓派有什么区别呢?
本文内容是什么?
二、正文
I 选择一个开发板
II 准备开发环境
III 第一个程序,点灯
IV 第二个程序,屏幕显示
V 做一个控制后台
三、结束语
声明
作为出现在数据部wiki的内容,本文可能算是"不务正业"。
本文旨在记录和分享Arduino开发板快速入门经验,也希望借此机会看是否有同样感兴趣的小伙伴,能一同做些有意思的东西出来。
一、前言
Arduino能做什么?
如果你对近些年一直讨论的物联网话题感兴趣,或是少时对拓麻歌子、掌上游戏机等设备念念不忘,想要发挥自己的创造力、多年的开发经验自行DIY,加上网络连接、设备联动、应用交互等等功能的话,那么Arduino就是个门槛尚可、成本较低的选择(相较树莓派和单片机)。
Arduino是什么?
Arduino是单片机二次开发的产物。以做项目来说,普通单片机只是散件,硬件的设计和软件设计都得你自己来。而Arduino是半成品,只需把相应的模块组合在一起,再写一写程序就能行了。拿做电脑来比喻的话,你拿单片机做项目就像用电子元件先做出来显示器、主板、内存条、显卡、硬盘等,再把它们组装成一台电脑。用Arduino做项目就像直接把别人做好的主板、硬盘、显卡组装成电脑。
以上引自网络上的简介。总之,Arduino能够让你连通、操作硬件,又很大程度上避免了硬件开发工作,只需关心软件部分。
Arduino和树莓派有什么区别呢?
Arduino:上手门槛略高一点。开发语言主要为C++,也能通过其他开发环境使用MicroPython、Python,现在很多青少年编程教育、图形化编程软件也都支持了。Arduino开发板体积很小,但依据具体型号会有所差异,成本一般在几十元人民币左右。
树莓派:是一个小型电脑,学习门槛很低,等同于在电脑上开发,也有很多外设直插使用的接口,但相对的价格也会高一些。树莓派体积也很小,但比Arduino略大,近些年的新品价格约在30多美元左右。
PS:题外话时间,树莓派既然能搭载操作系统,自然可以刷很多其他系统上去,你可以把树莓派直接刷成家用游戏机、多媒体中心、智能家居网关等,也很有意思。一些示例,仅供参考:
智能家居网关:https://webthings.io/gateway/
家庭多媒体中心:https://www.moodeaudio.org/
家用游戏机:https://retropie.org.uk/
本文内容是什么?
本文会从一些简单操作开始把基础操作如库加载、示例代码加载、引脚阅读和接线等操作介绍一遍,以便举一反三。内容包括:
搭建开发环境
点亮板载LED灯
连接和操作屏幕
阿里云IoT平台接入
二、正文
I 选择一个开发板
关于开发板的选择,其实有很多种,我这边选择的是搭载ESP32芯片的开发板——FireBeetle 2 ESP32-E IoT(开发板wiki https://wiki.dfrobot.com.cn/_SKU_DFR0654_FireBeetle_Board_ESP32_E)。
如果你选择了其他型号的开发板也完全没有关系,只要按照型号加载对应的驱动和库、映射对应引脚就行,原理上都是一样的。
ESP32是什么,和Arduino有什么关系?
Arduino指的是一个生态,包括了开发板、IDE、社区、驱动库、应用案例等等,目前已经支持了很多的主控芯片
例如mega328p,mega2560,部分stm32系列,esp8266,esp32等等,任何搭载了这些控制芯片的开发板都可以被贴上Arduino开发板的标签。
该开发板引脚定义如图所示,后面会用上
II 准备开发环境
下载IDE
地址:https://www.arduino.cc/en/software
由于是外网地址,可能会比较慢,也可以在网上搜索Arduino的IDE进行下载安装
IDE中下载开发板对应库
步骤一:首先到IDE配置中设置开发板的配置信息,在“附加开发板管理网址”栏中,点开并输入如下两个地址:
http://download.dfrobot.top/FireBeetle/package_DFRobot_index.json
http://download.dfrobot.top/FireBeetle/package_esp32_index.json
步骤二:下载开发板对应驱动和基础库
安装完成后,可以在工具->开发板一栏中找到开发板对应选项并选中
III 第一个程序,点灯
这一段旨在介绍代码结构以及代码运行流程。
这份wiki里介绍了Arduino下一些基础的程序接口和函数:https://wiki.arduino.cn/
我们可以先了解到,Arduino的程序主要分为两部分,setup和loop,对于引脚的操作,也分为pinMode、digitalWrite和digitalRead三种。
// 示例代码// 在板子启动或者复位重启后, setup部分的程序只会运行一次void setup(){// 内置定义了LED灯的引脚,这里将其定义为引脚输出pinMode(LED_BUILTIN, OUTPUT);}// setup部分程序运行完后,loop部分的程序会不断重复运行void loop(){// 高电平点亮LED灯digitalWrite(LED_BUILTIN, HIGH);// 维持3秒delay(3000);// 低电平关灯digitalWrite(LED_BUILTIN, LOW);// 维持1秒delay(1000);}
我们也可以从自带的代码实例中找到类似的案例进行运行测试,下载的三方库提供的示例也都会在这里列出来,可以参考。
无论是用自带案例还是上面的代码,我们准备好后,将开发板通过USB接线插上电脑,然后检查看驱动和端口是否正常
可以看到端口已经显示出来,那么我们选中它,然后直接编译上传即可。界面左上方有两个按钮,编译检查可以在本地发现代码问题,编译上传则是编译后直接上传写入开发板了,理论上肯定是先检查后再上传更合适,这里偷个懒。
如果顺利的话,应该可以看到灯光闪烁了,我这里用的不是自带示例而是提供的代码,所以可以看到图片左上角绿灯常量3秒熄灭1秒。
至此,恭喜你已经成为了一名点灯工程师。
IV 第二个程序,屏幕显示
这一段旨在介绍三方库加载、引脚识别和连接。
这个环节,我们需要使用到屏幕模块,会进行接线、引脚定义、加载和使用三方库等操作。
首先关于屏幕的选择,需要参考开发板型号,以示例这款 FireBeetle 2 ESP32-E IoT 为例,wiki上有介绍一些模块(GDI接线TFT屏幕 https://wiki.dfrobot.com.cn/_SKU_DFR0654_FireBeetle_Board_ESP32_E#target_12),这里选择了240x320 TFT LCD屏幕 (https://wiki.dfrobot.com.cn/_SKU_DFR0664_2.0_240x320_LCD)。与开发板同理,型号只要是开发板支持的都可以按需选择,使用时加载对应库和函数即可,无需一定使用相同型号。
我们在该屏幕的wiki中可以看到需要使用的库文件,我们先去下载:DFRobot_GDL库V1.0.1(https://github.com/DFRobot/DFRobot_GDL/releases/tag/V1.0.1),得到的ZIP包通过IDE工具加载进去,加载完成后可以看到库中多出了DFRobot_GDL的库。该库的使用手册参见:DFRobot_GDL中文WIKI(https://github.com/DFRobot/DFRobot_GDL/wiki/%E4%B8%AD%E6%96%87-WIKI)
接下来我们先准备代码,代码目的是在屏幕上显示两行文字,一行显示启动后至今的毫秒数,另一行打印hello world。
// 加载刚才下载的库#include <DFRobot_GDL.h>// 依据引脚定义设置宏#define TFT_CS 14 // 片选#define TFT_DC 25 // 数据#define TFT_RST 26 // 复位// 依据屏幕类型,使用库内预定义好的类DFRobot_ST7789_240x320_HW_SPI screen(/*dc=*/TFT_DC,/*cs=*/TFT_CS,/*rst=*/TFT_RST);// 启动时加载的函数void setup() {// 设置波特率 取值可以参考串口监视器下的列表Serial.begin(115200);// 初始化屏幕screen.begin();// 设置字体字号为4 字号范围1-4screen.setTextSize(2);// 设置文本颜色screen.setTextColor(COLOR_RGB565_WHITE);// 设置文本自动换行模式,true文本自动换行,false不自动换行screen.setTextWrap(true);}// 这个是程序加载完成后执行的部分,只要机器开着机就会无限循环void loop() {// 重置屏幕颜色screen.fillScreen(COLOR_RGB565_BLACK);// 设置光标位置screen.setCursor(/*x=*/10,/*y=*/120);// 显示运行毫秒数screen.print((String)millis());// 设置光标位置screen.setCursor(/*x=*/10,/*y=*/220);// 显示文字screen.print("Hellow World!");// 休息1秒delay(1000);}
代码中除了加载库、使用库函数的问题外,有一个最重要的引脚定义问题需要注意,可以参考开发板关于GDI接口的说明。
我们使用屏幕的时候,主要使用红圈中的这些引脚,这些引脚其实是基于SPI接口的扩充。
其中BLK引脚按需关注即可,VCC、GND、MISO、MOSI、SCLK都是SPI接口用到的,需要我们另外自行定义的引脚是CS片选信号引脚、RES复位引脚和DC数据/指令三个引脚。
可以看到wiki中定义该三个引脚对饮编号为:CS-14/D6、DC-25/D2、RES-26/D3,这里标识该引脚有两种使用方式,一为IO引脚(即前面的纯数字,在某些开发板上会显示IO14、IO25、IO26),二为开发板默认定义的功能引脚编号(D2、D3、D6表示数字信号口2、3和6),从上面开发板的引脚图可知其实都是一一对应的同一个引脚。我们这里使用IO引脚编号,因此代码中的宏定义为
#define TFT_CS 14 // 片选
#define TFT_DC 25 // 数据
#define TFT_RST 26 // 复位
接下来我们准备连接开发板和屏幕,下面展示了两种连接方式:GDI接口连接、SPI接口连接。
GDI是图形设备接口(Graphics Device Interface),可以用GDI接线直接。GDI接线囊括的引脚已经包含了所有该屏幕模块需要连接的引脚。
SPI是串行外设接口(Serial Peripheral Interface),从上面的引脚介绍可知,我们除了连接SPI接口,还需要额外连接几个引脚,如图所示:
编译上传后,可以看到屏幕上成功显示我们想要的文字
V 做一个控制后台
这一段旨在分享一些现有的工具和网络应用思路。
这个环节我们将用到阿里云免费开放的IoT物联网平台,用它进行设备的连接管理、属性变更和控制。
首先,我们去阿里云上申请免费的公共实例来使用[阿里云物联网平台](https://www.aliyun.com/product/iot/iot_instc_public_cn?spm=a2c56.193971.J_3996423280.8.666025c8QcfT5k&acm=lb-zebra-603469-8447329.1003.4.8003107&scm=1003.4.lb-zebra-603469-8447329.OTHER_15899166206424_8003107),这一步骤简单点点就OK,不多赘述。进入公共实例后,我们创建自己的产品和设备。
创建产品时,品类有多种选择,不同品类的属性会有不同,我这里暂时选择了语音助手品类,可以看到有三个属性,这里的Volume属性我们后面用来做测试。
创建设备后,会为设备分配名称、secret等参数,后面需要用上。这里创建之初,可以看到设备总数是1,激活和在线设备为0。
创建完成后,我们先准备代码,进行设备连接。我们这次会用到自带的WiFi库、AliyunIoTSDK三方库
代码中的各项配置可以改成自己的
// 加载刚才下载的库#include <DFRobot_GDL.h>// 依据引脚定义设置宏#define TFT_CS 14 // 片选#define TFT_DC 25 // 数据#define TFT_RST 26 // 复位// 依据屏幕类型,使用库内预定义好的类DFRobot_ST7789_240x320_HW_SPI screen(/*dc=*/TFT_DC,/*cs=*/TFT_CS,/*rst=*/TFT_RST);// wifi#include <WiFi.h>static WiFiClient espClient;const char* ssid = "你的wifi名称";const char* password = "你的wifi密码";// 引入阿里云 IoT SDK#include <AliyunIoTSDK.h>// 设置产品和设备的信息,从阿里云设备信息里查看#define PRODUCT_KEY "你的设备KEY"#define DEVICE_NAME "你的设备名称"#define DEVICE_SECRET "你的设备SECRET"#define REGION_ID "cn-shanghai" // 申请的公共实例所在地域// 启动时加载的函数void setup() {// 设置波特率 取值可以参考串口监视器下的列表Serial.begin(115200);// 初始化屏幕screen.begin();// 重置屏幕颜色screen.fillScreen(COLOR_RGB565_BLACK);// 设置字体字号为4 字号范围1-4screen.setTextSize(2);// 设置文本颜色screen.setTextColor(COLOR_RGB565_WHITE);// 设置文本自动换行模式,true文本自动换行,false不自动换行screen.setTextWrap(true);// 连接wifiWiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {say("Wifi Connecting...");}say("Wifi Connected!");// 初始化 iot,需传入 wifi 的 client,和设备产品信息AliyunIoTSDK::begin(espClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET, REGION_ID);// 绑定一个设备的Volume属性回调,当远程修改此属性,会触发 powerCallbackAliyunIoTSDK::bindData("Volume", action);say("Iot Platform Connected!");}// 这个是程序加载完成后执行的部分,只要机器开着机就会无限循环void loop() {// 监听阿里云IoT平台消息AliyunIoTSDK::loop();}// 在屏幕上输出文字void say(String s) {// 重置屏幕颜色screen.fillScreen(COLOR_RGB565_BLACK);// 设置光标位置screen.setCursor(/*x=*/10,/*y=*/220);// 显示文字screen.print(s);// 显示1秒delay(1000);}// 回调函数void action(JsonVariant p) {// 接收Volume属性改变后的值int actionId = p["Volume"];say("received action " + (String)actionId);}
我们前面已经接好线了,所以这里直接编译运行即可
可以看到设备已经激活
接下来我们准备配置阿里云的IoT应用后台
进入[IoT应用开发后台],新建Web应用,可以使用现成的模板,也可以从零创建。这里为了演示就重新创建一个
然后我们在页面上拖拉拽出来一个组件,对其进行行为设置,点击配置设备时会弹窗让我们去关联产品和设备
我们去关联上前面设置好的产品和设备
然后我们去设置一下设备绑定的配置项
保存后即可使用了
阿里云的这一套IoT平台免去了我们很多自行开发的枯燥和繁琐工作,至于这个后台能使用到什么程度,就看自由发挥了。
三、结束语
做这一切的开端其实是因为一条资讯:拓麻歌子推出阿尼亚联动机。
当时第一反应就是很想入手啊(谁能拒绝一只可爱的阿尼亚呢),可是12月才在日本发售……思考了一阵后,点阵图+简单按键互动……要不自己DIY一下试试?
就这样,我开始了挖坑埋自己的操作。
最后,如果你看到了这里,那么你大概率也是对DIY设备感兴趣的开发者,希望这篇文章能给到你一些助力或启发,帮助你做出一些有意思的创意。
另外,路过的话麻烦顺便把我从坑里拎出来,谢谢。