37DATA

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开发板的标签。

该开发板引脚定义如图所示,后面会用上

Image

II 准备开发环境

  1. 下载IDE

    地址:https://www.arduino.cc/en/software

    由于是外网地址,可能会比较慢,也可以在网上搜索Arduino的IDE进行下载安装

  2. IDE中下载开发板对应库

    步骤一:首先到IDE配置中设置开发板的配置信息,在“附加开发板管理网址”栏中,点开并输入如下两个地址:

    http://download.dfrobot.top/FireBeetle/package_DFRobot_index.json

    http://download.dfrobot.top/FireBeetle/package_esp32_index.json

Image

Image

步骤二:下载开发板对应驱动和基础库

ImageImage

安装完成后,可以在工具->开发板一栏中找到开发板对应选项并选中

Image

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);}

我们也可以从自带的代码实例中找到类似的案例进行运行测试,下载的三方库提供的示例也都会在这里列出来,可以参考。

Image

无论是用自带案例还是上面的代码,我们准备好后,将开发板通过USB接线插上电脑,然后检查看驱动和端口是否正常

Image

可以看到端口已经显示出来,那么我们选中它,然后直接编译上传即可。界面左上方有两个按钮,编译检查可以在本地发现代码问题,编译上传则是编译后直接上传写入开发板了,理论上肯定是先检查后再上传更合适,这里偷个懒。

Image

如果顺利的话,应该可以看到灯光闪烁了,我这里用的不是自带示例而是提供的代码,所以可以看到图片左上角绿灯常量3秒熄灭1秒。

Image

至此,恭喜你已经成为了一名点灯工程师。

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)。与开发板同理,型号只要是开发板支持的都可以按需选择,使用时加载对应库和函数即可,无需一定使用相同型号。

Image

我们在该屏幕的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)

Image

接下来我们先准备代码,代码目的是在屏幕上显示两行文字,一行显示启动后至今的毫秒数,另一行打印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-4 screen.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 // 复位

Image

接下来我们准备连接开发板和屏幕,下面展示了两种连接方式:GDI接口连接、SPI接口连接。

GDI是图形设备接口(Graphics Device Interface),可以用GDI接线直接。GDI接线囊括的引脚已经包含了所有该屏幕模块需要连接的引脚。

Image

SPI是串行外设接口(Serial Peripheral Interface),从上面的引脚介绍可知,我们除了连接SPI接口,还需要额外连接几个引脚,如图所示:

Image

Image

编译上传后,可以看到屏幕上成功显示我们想要的文字

Image

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,不多赘述。进入公共实例后,我们创建自己的产品和设备。

Image

创建产品时,品类有多种选择,不同品类的属性会有不同,我这里暂时选择了语音助手品类,可以看到有三个属性,这里的Volume属性我们后面用来做测试。

Image

创建设备后,会为设备分配名称、secret等参数,后面需要用上。这里创建之初,可以看到设备总数是1,激活和在线设备为0。

Image

Image

创建完成后,我们先准备代码,进行设备连接。我们这次会用到自带的WiFi库、AliyunIoTSDK三方库

Image

代码中的各项配置可以改成自己的

// 加载刚才下载的库#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-4 screen.setTextSize(2); // 设置文本颜色 screen.setTextColor(COLOR_RGB565_WHITE); // 设置文本自动换行模式,true文本自动换行,false不自动换行 screen.setTextWrap(true);
// 连接wifi WiFi.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属性回调,当远程修改此属性,会触发 powerCallback AliyunIoTSDK::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);}

我们前面已经接好线了,所以这里直接编译运行即可

Image

可以看到设备已经激活

Image

接下来我们准备配置阿里云的IoT应用后台

进入[IoT应用开发后台],新建Web应用,可以使用现成的模板,也可以从零创建。这里为了演示就重新创建一个

Image

然后我们在页面上拖拉拽出来一个组件,对其进行行为设置,点击配置设备时会弹窗让我们去关联产品和设备

Image

我们去关联上前面设置好的产品和设备

Image

然后我们去设置一下设备绑定的配置项

Image

保存后即可使用了

Image

Image

阿里云的这一套IoT平台免去了我们很多自行开发的枯燥和繁琐工作,至于这个后台能使用到什么程度,就看自由发挥了。

三、结束语

做这一切的开端其实是因为一条资讯:拓麻歌子推出阿尼亚联动机。

Image

当时第一反应就是很想入手啊(谁能拒绝一只可爱的阿尼亚呢),可是12月才在日本发售……思考了一阵后,点阵图+简单按键互动……要不自己DIY一下试试?

就这样,我开始了挖坑埋自己的操作。

Image

最后,如果你看到了这里,那么你大概率也是对DIY设备感兴趣的开发者,希望这篇文章能给到你一些助力或启发,帮助你做出一些有意思的创意。

另外,路过的话麻烦顺便把我从坑里拎出来,谢谢。