树莓派 Pico W 是一款低成本的基于 RP2040 微控制器的开发板。它内置了 2.4 GHZ WIFI 功能,为该板提供了无线连接的特性。该板使用了 Infineon CYW43439 WIFI+ BLE 芯片,增加了一个板载单频 2.4 GHZ 无线接口 (802.11n)。因此,它使用户能够基于各种 AIoT 解决方案构建无线控制和远程监控设备。微控制器可以使用 Micropython 和 C/C++ 进行编程。
在这个项目中,我们将通过互联网使用网页控制连接到 Pico W 的 LED。Pico W 板和智能手机都需要连接到稳定的互联网,以便顺畅工作而不出现延迟。这个 LED 可以通过智能手机或任何计算机从世界任何地方进行控制。此外,我们还将了解 Raspberry Pi 板及其功能、规格和使用 Arduino IDE 的编程。我们之前构建了许多 基于网页服务器的物联网项目,您可以从任何地方控制电器。
大多数情况下,我们看到 Micropython 被用来通过像 Thonny 这样的 Micropython IDE 编程 Raspberry Pi Pico W。但是,对于大多数人来说,使用 Arduino IDE 在 Python 中编程并没有在 C/C++ 中编程那么舒适。因此,我们将学习如何在 Arduino IDE 中配置和编程 Pico W。
树莓派 Pico W
树莓派 Pico W 板提供了必要的外部电路,如闪存、晶体、电源、去耦和 USB 连接器,以支持 RP2040 芯片。RP2040 微控制器在板的左右边缘提供大多数引脚作为用户 I/O 引脚。然而,其中四个 I/O 引脚专门保留用于内部功能,如控制 LED、管理板载 SMPS 电源和感测系统电压。Pico W 还配备了一个基于 Infineon CYW43439 的板载 2.4GHz 无线接口,通过 SPI 连接到 RP2040。该板配备了来自 ABRACON 的授权板载天线。
树莓派 Pico W 本身能够使用内部升降压转换器从广泛的输入电压(1.8v 到 5.5v)中生成所需的 3.3 伏特电源。
关键特性:
- 板子总共有 40 针 (21mm×51mm) 1mm 厚的 PCB,带有 0.1" 通孔引脚
- 有 26 个 I/O 引脚,电压等级为 3.3v。
- 23 个 GPIO 仅为数字型,另外三个具备 ADC 功能
- 1.8-3.3V I/O 电压
- 3 个 Arm SWD (串行线调试) 引脚端口
- 双核 Cortex M0 处理器,频率高达 133MHz
- 片上 PLL 允许可变核心频率
- 264kB 高性能 SRAM
- 12 位 500kbps 模数转换器 (ADC)
- 有多种 I/O 数字外设选项
- 2 × UART, 2 × I2C, 2 × SPI, 16 × PWM 通道
- 1 × 定时器,带 4 个警报,1 × 实时钟
- 2 × 可编程输入输出 (PIO) 块,总共 8 个状态机
- 灵活的用户可编程高速 I/O
树莓派 Pico W 引脚图
电路板的侧面总共有 40 个引脚。引脚的主要功能如下所述。
- GP0-GP28: 这些是通用输入输出引脚,可以与I/O设备接口以传输和接收数据。这些引脚可以用于输入和输出功能。
- GP26-GP28: 这三个引脚也可以用于连接模拟传感器或设备。
- GP0: 内置LED连接在此引脚上。
- GND: 此引脚用于为I/O设备提供接地连接。提供了多个接地引脚以便于连接。
- RUN: 此引脚启用或禁用RP2040微控制器,这意味着启动或停止Pico W。短接此引脚使其为低电平,从而重置RP2040。
- AGND: 此引脚用于接地模拟设备。此接地连接用于ADC_VREF引脚。
- ADC_VREF: ADC电压参考是一个输入引脚,用于设置模拟输入的参考电压。
- 3V3(OUT): 此引脚为RP2040和I/O引脚提供3.3V电压,由板载SMPS生成。因此,它可以为外部I/O设备提供3.3V,但最大输出电流取决于RP2040负载和VSYS引脚的输入电压,建议不要超过约300mA的电流限制。
- 3V3_EN: 这是一个板载SMPS使能引脚。通过100kΩ电阻拉高。短接此引脚使其为低电平,从而禁用3.3V电源并导致RP2040失去电源。
- VSYS: 用于为系统提供输入电压的引脚,允许的范围是1.8V到5.5V,并用于通过板载电源转换器生成3.3V以为RP2040和GPIO供电。
- VBUS: 此引脚完全连接到micro-USB的电源引脚1,通常为5V(如果USB供电)。
树莓派 Pico W 所需组件
- 树莓派 Pico W
- LED 灯泡 (5v)
- 面包板
树莓派 Pico W 接口电路图
现在让我们开始将 LED 与 Pico W 板连接。LED 的正极连接到 GP2,另一个连接到板的地面。板的电源由 USB 连接器提供。
实际电路如下图所示。
使用 Arduino IDE 编程 Raspberry Pi Pico W
让我们看看如何使用 Arduino IDE 来编程 Raspberry Pi Pico W 板。为此,我们需要安装 Raspberry Pi RP2040 板包,该包支持 Raspberry Pi Pico W。如果已经安装,请跳过安装过程。
- 打开 Arduino IDE,进入 文件 > 首选项。现在将给定的链接粘贴到附加板管理器 URL 中,并通过按下确定保存。
https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
- 打开 Arduino IDE,导航到板管理器,搜索“Pico”。你会找到带有板名称的包,安装它。
- 现在,选择板子为 Raspberry Pi Pico W,其余的保持不变。
- 最后复制并编译下面提供的示例代码。
- 要上传代码,您必须将 Pico W 板连接到显示在任何 COM 端口上的计算机。为此,在按住 Pico W 上的 BOOTSEL 按钮的同时,立即使用 micro-USB 数据线将板连接到计算机。如果您的计算机上出现 RPI-RP2 驱动器通知,请释放 BOOTSEL 按钮。
- 文件管理器,这意味着驱动器启动模式。因此设备已准备好接收代码/固件。
- 将编译好的代码上传到 Pico W 板,选择正确的端口。
- 成功上传代码后,打开串口监视器并将波特率设置为 115200.
Arduino 代码解释
该程序在成功连接到互联网后,从远程服务器读取数据。根据接收到的数据,将生成输出响应。
首先,我们需要知道如何将 Pico W 连接到 WiFi 网络,使用网络数据,并构建 Web 界面。为此,我们必须将 Pico W 作为客户端连接到 WiFi 网络。我们必须包含所有必要的库,以便成功连接到网络。因此,库仅包括 Wifi.h。此外,我们还定义了进一步编程所需的变量和对象。
#include <WiFi.h> const char* ssid = "Semicon Media 2.4"; // 替换为您的网络凭据 const char* password = "cdfiP29to665"; int Led=2; String header; // 变量用于存储HTTP请求 String picoLEDState = "off"; // 变量用于存储板载LED状态 unsigned long currentTime = millis(); // 当前时间 unsigned long previousTime = 0; // 上一个时间 const long timeoutTime = 2000; WiFiServer server(80); // 将Web服务器端口号设置为80
Arduino IDE 中包含的 WiFi 库提供了连接和通过 WiFi 网络通信所需的所有功能。我们需要传递我们的登录凭据,包括 SSID 和密码,以加入加密网络。
接下来,我们定义所需的字符常量,以存储我们想要连接的网络的SSID和密码。您需要传递您的网络参数。
字符串变量被定义用来存储来自浏览器的HTTP请求和板载LED的状态。这是必要的,因为通过使用字符串变量,我们可以在网页上显示LED状态。
定义变量以保存时间是至关重要的,因为它允许我们在网页上设置超时。如果没有它,我们将面临永远不断开连接的风险,最终耗尽连接。
然后,我们创建一个名为“server”的WiFiServer对象。并将HTTP端口号80作为参数传递。
void setup() { Serial.begin(115200); // 启动串口监视器 pinMode(Led, OUTPUT); // 将LED初始化为输出 digitalWrite(Led, LOW); // 关闭LED WiFi.begin(ssid, password); // 使用SSID和密码连接到Wi-Fi网络 while (WiFi.status() != WL_CONNECTED) // 在串口监视器上显示进度 { delay(500); Serial.print("."); } Serial.println(""); // 打印本地IP地址并启动Web服务器 Serial.print("WiFi connected at IP Address "); Serial.println(WiFi.localIP()); server.begin(); // 启动服务器 }
在设置中,我们启动串行监视器。然后我们将板载LED引脚设置为输出并设为LOW,以使用命令 pinmode() 使LED保持关闭。
我们接着使用 WiFi.begin 来启动网络连接,在这个命令中传递 SSID 和密码。
然后我们将监控 WL _CONNECTED 常量的连接状态。如果 while 条件为真,则表示我们未连接,循环将持续运行。在等待期间,我们通过每半秒的延迟在串口监视器上打印句点作为进度指示器。最后,成功连接后,IP 地址将在串口监视器上打印。此外,我们通过使用命令 server.begin() 启动我们创建的 WiFiServer 对象。
在循环中,我们等待传入的客户端连接,并在建立连接时开始计时。如果客户端发送信息以控制LED,我们将HTTP请求拆解以提取URL字符串中的值。根据该值,我们打开或关闭LED,并相应地调整屏幕上的按钮样式。如果需要,可以在HTML样式表设置中修改按钮的形状或颜色。
最后,你将找到完整的代码。
树莓派 Pico W 的工作流程
我们将执行的任务是通过基于网页的界面控制LED。
将显示一个简单的网页,包含一个切换按钮,并指示板载 LED 的当前状态。
按照上面讨论的步骤上传代码并试一下。打开串口监视器,设置正确的波特率,等待直到显示IP地址。
复制IP地址,并在任何连接到同一WiFi网络的设备上打开Google Chrome。 在搜索栏中输入地址,然后点击搜索以访问使用网络开关控制LED的网页。
显示LED的开启状态,而下面的图像则显示LED的关闭状态,同时我们通过网页进行控制。
现在您可以通过反复点击开关来控制LED的开/关。每次切换开关时,LED状态和开关颜色将会改变。
希望你喜欢这篇文章,并从中学到一些有用的东西。如果你有任何问题,可以在下面的评论区留言。
#include <WiFi.h>
const char* ssid = "Semicon Media 2.4"; // 用你的网络凭据替换
const char* password = "cdfiP29to665";
int Led=2;
字符串头; // 用于存储HTTP请求的变量
String picoLEDState = "off"; // 存储板载LED状态的变量
unsigned long currentTime = millis(); // 当前时间
unsigned long previousTime = 0; // 之前的时间
const long timeoutTime = 2000;
WiFiServer server(80); // 设置网页服务器端口号为 80
void setup()
{ Serial.begin(115200); // 启动串口监视器
pinMode(Led, OUTPUT); // 将LED初始化为输出
digitalWrite(Led, LOW); // 关闭 LED
WiFi.begin(ssid, password); // 连接到具有SSID和密码的Wi-Fi网络
while (WiFi.status() != WL_CONNECTED) // 在串口监视器上显示进度
{ 延迟(500);
Serial.print(".");
}
Serial.println(""); // 打印本地IP地址并启动Web服务器
Serial.print("WiFi 已连接,IP 地址为 ");
Serial.println(WiFi.localIP());
server.begin(); // 启动服务器
}
无效循环()
{ WiFiClient client = server.available(); // 监听传入的客户端
如果 (client)
{ // 如果一个新客户端连接,
currentTime = millis();
previousTime = currentTime;
Serial.println("新客户端。"); // 在串口输出一条消息
String currentLine = ""; // 创建一个字符串来保存来自客户端的输入数据
当 (client.connected() && currentTime - previousTime <= timeoutTime)
{ // 当客户端连接时循环
currentTime = millis();
如果 (client.available())
{ // 如果有字节从客户端读取,