Arduino Yún入门指导

原地址:https://www.arduino.cc/en/Guide/ArduinoYun

Arduino Yún与其它系列板卡不同。它的编程方式非常类似于Arduino Leonardo和同类处理器(Atmel ATmega32U4),此外还有一个附加处理器(Atheros AR9331)运行Linux系统和OpenWrt无线栈(the OpenWrt wireless stack)。通过USB对32U4编程的方式与Arduino Leonardo完全相同。一旦您已为Yún配置连接至WiFi网络,您还可以通过WiFi网络对32U4编程。

您需要一条Micro-B USB(公头)线缆才能将Arduino Yún连接至您的电脑。此USB线缆用于为板卡供电和传输数据。当对Yún编程时,您必须从Arduino IDE的Tool > Board菜单中选择Arduino Yún选项。**只有Arduino IDE 1.5.4和之后的版本才支持Yún。

与Arduino Leonardo的不同之处

Arduino Yún 入门指导 - 图1

除了32U4芯片,Yún还有另外一颗处理器芯片Atheros AR9331,它运行针对嵌入式系统而设计的Linux分发版本,其名称为OpenWrt-Yun,基于OpenWrt系统。此系统包含了Python 2.7的完全安装版本。

Yún较Leonardo还有很多不同的物理特性和接口。Yún板载SD卡插槽,以太网接口和一个USB-A Host接口。Yún上没有独立的电源接口,它可以从micro-USB接口中取电。

Yún上没有5V稳压器。如果您对Yún的供电超过了5V可能会对它造成损害。如果您没有用micro-USB接口对Yún供电,您可以将电源引入板卡上的VIN和5V引脚。如果使用了VIN引脚,您不能提供超过5V的电源,如果超过会损害板卡。建议尽可能用USB连接线对Yún进行供电。

SD卡、以外网和USB-A接口并没有与32U4处理器有物理连接,它们被连接至了AR9331上。

除了您不能使用Serial1类,Yún的32U4函数的使用方式与Leonardo相同。这个类被保留用于与AR9331处理器的通讯操作。

Yún还有一个板载WiFi模块,可以让Yún连接至无线路由器或者作为一个无线接入点。

32u4、WiFi和AR9331处理器都有各自的复位键。 Arduino Yún 入门指导 - 图2

Yún上有几个状态灯用于指示电源、WLAN连接、WAN连接和USB连接。此外还有13引脚连接到了其中一个状态灯上。 Arduino Yún 入门指导 - 图3

OpenWrt-Yun

Yún运行着一个Linux系统的分发版本叫做OpenWrt-Yun,它基于OpenWrt。虽然可以通过命令行来配置系统,但是还有一个web页面可以允许您对不同的可用选项进行配置。LuCi界面提供了大多数您需要维护WiFi界面的配置选项。(The interface (called LuCi) gives you access to most any setting you would need for maintaining the WiFi interface.)

访问web界面会在下文提到。

如果向OpenWrt-Yun中安装软件,您需要使用Linux包管理器opkg。对于管理器和一些常用命令的信息,请参阅Yún的包管理器页面

与OpenWrt-Yun系统交互,您可以使用命令行,或者通过Arduino的Bridge库访问,或者通过SSH。如果您不熟悉命令行操作,您可能想学习一些命令行的基础知识和一些频繁使用的程序。

由于OpenWrt社区和Arduino社区不断的提出改进和建议,您手中安装在Yún上的OpenWrt-Yun系统可能已经过期了。请参阅升级教程并确保系统版本处于最新状态。

Python

Python 2.7已经预装在OpenWrt-Yun系统中,您可以借助它写应用程序或者脚本。对于Python 2.7的更多信息,请参阅此文档

如果您第一次接触Python,这里有一些极好的线上资源。《Learn Python the Hard Way》 涵盖了所有您需要知道的如何起步和运行您自己脚本的知识。

Yún上外部储存

不鼓励使用Yún内建的非易失性存储空间,应为它可以写入的空间很有限[it has a limited number of writes]

您可以使用像microSD储存卡或者U盘[thumb drive]之类的外部存储设备来保存数据、您的脚本、网页等等。为了让Yún可以在这些设备上通过32U4访问和存储信息,需要有一个名为arduino的文件夹放置在分卷根目录下。

网络服务

OpenWrt-Yun使用REST用于客户端和服务端的通讯。REST是”Representational State Transfer”的缩写。它是一个通过URL就可以将Arduino上的各种硬件部分暴露出来的软件架构。

默认情况下,REST API的访问受到密码保护。可以改为不需要密码就能访问服务。要改变这一配置,进入Yún的配置面板。在页面底部,您会看到一个改变访问方式的开关。

Arduino Yún 入门指导 - 图4

这里有一篇文章对REST协议的概念进行了完美的介绍。

Yún可以辨认出两个REST的后缀[two REST end points]

  • /arduino
  • /data
  • /mailbox

“/arduino”目录并不包含任何预配置信息。任何加在它后面向URL添加的内容都会跳过网络服务器而交给32U4中的sketch处理。参考Bridge库中的示例来了解访问板卡上的引脚是如何完成的。

“/data”用于访问内部存储空间的键值。可以被调用的键值如下:

  • /put/KEY/VALUE : 向存储空间记录一个数值
  • /get/KEY : 以JSON格式获得请求键的键值
  • /get : 以JSON格式获取存储的整个键值列表[the entire storage list]
  • /delete : 删除内部存储空间[deletes the internal storage]

“mailbox”用于向MailBox中的序列中添加消息。这个消息序列被存储在Linux系统中并可以被Arduino微处理器读取。可以调用的REST是:

  • “/mailbox/message”

复位处理器(AR9331、WiFi和32U4)

要重启AR9331,也就是重启OpenWrt-Yun系统,按下板卡上靠近模拟输入引脚和指示灯的”Yún RST”按钮。

要重启32U4和当前运行的Arduino sketch,按下靠近以太网接口的按钮两次

用于复位WiFi的复位键位于USB接口旁边。它被标识为”WLAN RST”。当您按下这个按钮的时候,WLAN指示灯将会闪烁。

如果您切换到一个不同的网络并且不能再通过web界面访问Yún,您可以按下并保持复位键(WLAN RST)超过5秒并少于30秒来重置Yún的网络配置,AR9331处理器将会重新启动。WiFi配置信息将会被重置,Yún会以它自己的WiFi网络(Arduino Yún-XXXXXXXXXXXX)启动。任何其他的修改或配置会被保留。

要将OpenWrt-Yun系统重置到默认状态,按住并保持WiFi复位按钮(WLAN RST)至少30秒。板卡会回滚至原始设置:就像刚开箱时那样或者是您之前重新烧写的最新版本的OpenWrt系统镜像。此外,此操作会移除所有文件和网络配置。

重置密码

Web面板的密码可以被重置和改变。用USB连接Arduino Yún至您的计算机并且上传YunSerialTerminal sketch(可以从Arduino IDE的Bridge库示例程序中找到)。当Yún完全启动后,打开串口监视器,在右下角的下拉菜单中选择New Line项并按下回车键。此时会有这样一些信息出现在串口监视器中:

Arduino Yún 入门指导 - 图5

现在您需要执行 passwd 命令来改变密码。将 passwd 敲进串口监视器的输入框并按下回车键。您将会被询问输入新密码,以及再次输入用于确认。如果您愿意的花您可以忽略弱口令错误提示。如果两次输入的密码匹配,系统密码将会被改变,这样您就可以用新密码访问web面板了。

串口在复位后重新列举[Serial re-enumeration on reset]

因为Yún没有专用的芯片用户控制串口通讯,这表示串口是虚拟化的——它是一个在您操作系统和板卡上的软件例程[a software routine]。就像您的计算机会在您插入任何Arduino后创建了一个串口驱动的实例一样,32u4会在它运行bootloader时差U那个建一个串口实例。这个板卡就是一个USB的Connected Device Class (CDC)驱动实例。

这表示您每次复位32U4处理器后,USB串口连接都会被中断并重新建立连接。板卡会从串口列表中消失,这个列表会重新列举。任何与Yún正在打开的串口连接都会丢失连接。这个现象和Arduino Uno正相反,您可以复位Uno的主处理器(ATmega328P)而不关闭USB连接(因为这个连接由ATmega8U2或者ATmega16U2处理器保持着)。这个不同蕴含在了驱动安装、代码上传和通讯的过程中。

当您打开串口时不会复位

当您在计算机上打开串口时Yún不会对您的sketch进行复位。这表示您不会看到已经由板卡发送到计算机的串口数据,例如包括在setup()函数中的大部分数据。

这个现象同样出现在控制台中,会在下面详述[This also applies to the Console, described below]

这表示如果您在setup()函数中使用任何Serial或者Console类中的print()、println()、或者write()语句,它们都不会在您打开串口监视器或者控制台连接后显示出来。如果想要解决这个问题,您可以判断端口是否打开,像这样:

  1. // stops the program until Serial Monitor is opened
  2. while (!Serial) ;

或者这样:

  1. // stops the program until Console is opened
  2. while (!Console) ;

为Yún安装驱动

OSX

  • 在您第一次将Yún连接到Mac上时,”Keyboard Setup Assistant”将会启动。

没有什么需要为Yún配置的,您可以通过点击窗口左上边的红色按钮来关闭这个会话窗口。

Arduino Yún 入门指导 - 图6

Windows

现在在Windows中已经将IDE和驱动程序整合到了安装包中。

  • 下载Arduino IDE 1.5.4或者更新版本的安装包,双击安装包图标。

Arduino Yún 入门指导 - 图7

  • 在您阅读许可后如果您表示同意则点击”I agree”按钮

Arduino Yún 入门指导 - 图8

  • 默认情况下选择了所有组件。它们包括IDE、驱动程序和快捷方式。

Arduino Yún 入门指导 - 图9

  • 选择您希望将IDE安装的路径

Arduino Yún 入门指导 - 图10

  • 安装器将会显示进度条并将文件释放到合适的位置

Arduino Yún 入门指导 - 图11

  • 如果您选择安装驱动程序,一个弹出窗口将会再次确定您的选择

Arduino Yún 入门指导 - 图12

  • 当安装器完成所有任务后,您可以点击”Close”按钮来完成操作。

特别注意:Yún使用Bonjour服务来实现网络发现功能。这个服务默认不包含在Windows系统中。如果您之前并没有安装Bonjour服务,您可以从这里下载它。
此外,您需要确保反病毒软件没有把通信用的5353端口屏蔽。

Linux

在Ubuntu 10.0.4和以后的版本中不需要安装驱动,但是请确保5353端口没有被防火钱屏蔽。

配置板载WiFi

Yún可以作为一个接入点,但是它还可以连接到一个现存的网络。下面的介绍带您了解如何将Yún连接至无线网络。Yún可以连接到无加密网络,同样支持WEP、WPA和WPA2加密格式。

当您的Yún首次上电后,它将会创建一个叫做ArduinoYun-XXXXXXXXXXXX的WiFi网络。请将您的计算机连接上这个网络。

一旦您的计算机被分配到一个IP地址,打开web浏览器,在地址栏输入http://arduino.local 或者192.168.240.1。稍等片刻一个web页面就会出现并询问密码。输入arduino并点击Log In按钮。

Arduino Yún 入门指导 - 图13

您将会看到一个网页,里面包含了一些当前网络的诊断信息。按下Configuration以继续。

Arduino Yún 入门指导 - 图14

您会在新出现的页面中配置您的Yún,赋予它一个独一无二的名字并指示您想要连接到的网络。

Yún NAME输入框,赋予Yún一个独一无二的名字。您将会在以后一直使用这个名字。

为Arduino选择一个8位或以上字符个数的密码。如果您留空,系统将会继续保留arduino这个默认密码。

如果您愿意的话可以设置时区和国家。建议您设置这些选项,以为这可以对连接本地WiFi网络有所帮助。设置本地时区的同时也会选择国家的调节域[Setting the local timezone also selects the country’s regulatory domain]

输入您想要连接到的WiFi网络名称。

选择加密类别并输入密码。

Arduino Yún 入门指导 - 图15

当您按下Configure & Restart按钮,Arduino将会重启并加入指定的网络。Arduino自身的网络不久将会关闭。

Arduino Yún 入门指导 - 图16

您现在就可以加入您指定Yún要连接的网络了。

通过WiFi为32U4编程

当Yún和您的计算机处于同一网络的时候,您可以无线连接上它来编程。

在完成Yún的配置后,连接计算机至您在Yún的配置界面中所选的网络。打开Arduino IDE。

Tools > Port菜单下,您可以看到有一个条目列出了您的Yún的名字和IP地址。在Board菜单下,选择Arduino Yún。

打开Blink示例程序(File > Examples > 01Basics > Blink)并将sketch上传至板卡中。您将会被提示输入管理员密码。这个密码是您进入Yún的配置界面中所用的密码。

一旦程序上传完毕,32U4处理器将会重启。您应该会看到连接到13引脚的指示灯在闪烁。

使用板载以太网接口

当您使用一根以太网线缆将Yún连接到有线网络的时候,它将会城市通过DHCP自动连接网络。板卡信息将会和WiFi连接一样被列在Arduino IDE中的ports菜单下。

如果您想要Yún直接连接到您的电脑,请配置计算机接口的静态IP地址,或者搭建一个DHCP服务器。

附注:以太网接口是eth1,而不是eth0

通过Bridge与OpenWrt-Yún通讯

Bridge库可以让Arduino和OpenWrt-Yún进行通讯。几个不同的实用类[utility classes]促成了两个处理器间不同种类的通讯,如下面所述,Bridge库参考文档中则进行了更深层次的介绍。

Arduino Yún 入门指导 - 图17

WiFi和以太网接口、USB接口和SD卡都连接到了AR9331上。Bridge库可以让您使用这些设备,同样可以用于运行脚本和与web服务通讯。

Console

Console基于Bridge,它可以让您像是用串口监视器那样从Yún向计算机发送数据,但这个是以无线的方式。它会在Yún和您的计算机之间通过SSH建立一个加密连接。

将下面的程序上传至您的Yún:

  1. #include <Console.h>
  2. const int ledPin = 13; // the pin that the LED is attached to
  3. int incomingByte; // a variable to read incoming serial data into
  4. void setup() {
  5. // initialize serial communication:
  6. Bridge.begin();
  7. Console.begin();
  8. while (!Console){
  9. ; // wait for Console port to connect.
  10. }
  11. Console.println("You're connected to the Console!!!!");
  12. // initialize the LED pin as an output:
  13. pinMode(ledPin, OUTPUT);
  14. }
  15. void loop() {
  16. // see if there's incoming serial data:
  17. if (Console.available() > 0) {
  18. // read the oldest byte in the serial buffer:
  19. incomingByte = Console.read();
  20. // if it's a capital H (ASCII 72), turn on the LED:
  21. if (incomingByte == 'H') {
  22. digitalWrite(ledPin, HIGH);
  23. }
  24. // if it's an L (ASCII 76) turn off the LED:
  25. if (incomingByte == 'L') {
  26. digitalWrite(ledPin, LOW);
  27. }
  28. }
  29. delay(100);
  30. }

要想看到Console输出的信息,在Port菜单中选择您的Yún的名字和IP地址。Yún仅会在您的计算机与Yún处在同一局域网的时候才会被显示。如果你的板卡处在不同网络,您不会在Ports菜单中看到Yún。打开端口监视器[Port Monitor](译者注:其实就是串口监视器Serial Monitor,需要在Port中选用网络连接方式时才能触发使用),您将会被提示输入Yún的密码。

您还可以打开一个终端窗口并执行以下命令来查看Console输出的信息: ssh root@yourYunsName.local 'telnet localhost 6571'

*附注:如果您使用Windows操作系统,您不许俺炸U那个一个终端模拟器。PuTTY是个合理的选择,但是您需要分开输入以上的两条命令。

输入’H’来打开13引脚的LED灯,输入’L’来关闭。

Process

Process命令可以让您通过Arduino在OpenWrt-Yún上运行Linux进程。

再下面的实例中,OpenWrt-Yún将会使用curl连接至一个服务器并下载一些ASCII文本,并通过串口打印出来。

  1. #include <Process.h>
  2. void setup() {
  3. // Initialize Bridge
  4. Bridge.begin();
  5. // Initialize Serial
  6. Serial.begin(9600);
  7. // Wait until a Serial Monitor is connected.
  8. while (!Serial);
  9. // run various example processes
  10. runCurl();
  11. }
  12. void loop() {
  13. // Do nothing here.
  14. }
  15. void runCurl() {
  16. // Launch "curl" command and get Arduino ascii art logo from the network
  17. // curl is command line program for transferring data using different internet protocols
  18. Process p; // Create a process and call it "p"
  19. p.begin("curl"); // Process that launch the "curl" command
  20. p.addParameter("http://arduino.cc/asciilogo.txt"); // Add the URL parameter to "curl"
  21. p.run(); // Run the process and wait for its termination
  22. // Print arduino logo over the Serial
  23. // A process output can be read with the stream methods
  24. while (p.available()>0) {
  25. char c = p.read();
  26. Serial.print(c);
  27. }
  28. // Ensure the last bit of data is sent.
  29. Serial.flush();
  30. }

使用Bridge在两个处理器之间传递信息

Bridge允许您使用键值对来在两个处理器之间传递信息。

这个例子说明了如果使用Bridge库以REST调用的方式来访问板卡上的数字引脚和模拟引脚。它示范了如何使用通过浏览器调用的REST形式来创建您自己的API。[It demonstrates how you can create your own API when using REST style calls through the browser]

当运行这个示例的时候,确保您的计算机和Yún处于相同网络。

当您将程序上传至板卡后,您可以请求引脚的电平值,可以对引脚配置电平值,还可以配置引脚是输入还是输出模式。

当REST密码关闭的时候,您可以使用浏览器输入下列URL地址:

如果您愿意的话,您还可以在命令行中使用curl命令来代替浏览器。

您需要在程序中加入Bridge、YunServer、和 YunClient库。

  1. #include <Bridge.h>
  2. #include <YunServer.h>
  3. #include <YunClient.h>

实例化一个server对象使得Yún可以监听连接的客户端。

YunServer server;

setup()函数中,为了调式开启了串口连接,并在Bridge开始的时候打开13引脚的LED灯。Bridge.begin()会阻塞并占用2秒左右来完成操作。一旦Bridge启动,LED灯会关闭。

  1. void setup() {
  2. Serial.begin(9600);
  3. pinMode(13,OUTPUT);
  4. digitalWrite(13, LOW);
  5. Bridge.begin();
  6. digitalWrite(13, HIGH);

setup()函数的第二部分,用于通知YunServer的实例监听仅从本地主机[localhost]传入的连接。OpenWrt-Yun将会把连接传递给32U4处理器进行解析和控制引脚。此过程所用的端口号是5555。使用server.begin()开启服务。

  1. server.listenOnLocalhost();
  2. server.begin();
  3. }

loop()中,您需要创建一个YunClient实例来管理连接。如果有客户端连接,执行自定义函数中(如下)的请求并在完成后关闭连接。

loop()最后设定一个延时将会有助于防止处理器做太多的工作。

  1. void loop() {
  2. YunClient client = server.accept();
  3. if (client) {
  4. process(client);
  5. client.stop();
  6. }
  7. delay(50);
  8. }

创建一个以YunClient作为参数的process函数。创建一个字符串用于保存收到的信息,并从中读取指令。

根据功能名称(digital、analog和mode) 解析REST命令,并把信息传递给相应的功能函数。

  1. void process(YunClient client) {
  2. String command = client.readStringUntil('/');
  3. if (command == "digital") {
  4. digitalCommand(client);
  5. }
  6. if (command == "analog") {
  7. analogCommand(client);
  8. }
  9. if (command == "mode") {
  10. modeCommand(client);
  11. }
  12. }

创建一个函数来处理digital命令,以YunClient为参数。创建两个局部变量用于保存命令中的引脚号和电平值。

  1. void digitalCommand(YunClient client) {
  2. int pin, value;

client.parseInt()解析客户端请求的引脚号。

如果引脚号后的字符是’/‘,这表示URL地址后面将要跟随一个数值1或者0。这个值将会对引脚赋值,将其电平值置高或者拉低。如果末尾没有’/‘,则读取指定引脚的电平值。

  1. pin = client.parseInt();
  2. if (client.read() == '/') {
  3. value = client.parseInt();
  4. digitalWrite(pin, value);
  5. }
  6. else {
  7. value = digitalRead(pin);
  8. }

将电平值输出给客户端并更新当前引脚的键值。

将发送给客户端的数据用F()包裹,这个数据将会从flash中读取并输出。这一举动可以节省SRAM中的空间,对于处理像URL这样的长字符串很有用。

key对应着引脚号和引脚类型。例如D2会以数字引脚2的形式保存。value是引脚在被设置或者被读取时的任意值。

  1. client.print(F("Pin D"));
  2. client.print(pin);
  3. client.print(F(" set to "));
  4. client.println(value);
  5. String key = "D";
  6. key += pin;
  7. Bridge.put(key, String(value));
  8. }

创建另外一个函数控制模拟量引脚,除了把key中的’A’替换为’D’,其它的操作方式与上面类似:

  1. void analogCommand(YunClient client) {
  2. int pin, value;
  3. pin = client.parseInt();
  4. if (client.read() == '/') {
  5. value = client.parseInt();
  6. analogWrite(pin, value);
  7. // Send feedback to client
  8. client.print(F("Pin D"));
  9. client.print(pin);
  10. client.print(F(" set to analog "));
  11. client.println(value);
  12. String key = "D";
  13. key += pin;
  14. Bridge.put(key, String(value));
  15. }
  16. else {
  17. value = analogRead(pin);
  18. client.print(F("Pin A"));
  19. client.print(pin);
  20. client.print(F(" reads analog "));
  21. client.println(value);
  22. String key = "A";
  23. key += pin;
  24. Bridge.put(key, String(value));
  25. }
  26. }

在创建一个函数用于控制引脚模式的改变。以YunClient为参数,并创建一个局部变量用于保存引脚号。读取引脚号的方法和上面两个函数相同。

  1. void modeCommand(YunClient client) {
  2. int pin;
  3. pin = client.parseInt();

检测并确保URL有效:

  1. if (client.read() != '/') {
  2. client.println(F("error"));
  3. return;
  4. }

如果是一个有效的URL,将URL保存为一个字符串。如果模式是input或者output则对引脚进行配置并报告给客户端。如果字符串不匹配这些值则返回错误。

  1. String mode = client.readStringUntil('\r');
  2. if (mode == "input") {
  3. pinMode(pin, INPUT);
  4. // Send feedback to client
  5. client.print(F("Pin D"));
  6. client.print(pin);
  7. client.print(F(" configured as INPUT!"));
  8. return;
  9. }
  10. if (mode == "output") {
  11. pinMode(pin, OUTPUT);
  12. // Send feedback to client
  13. client.print(F("Pin D"));
  14. client.print(pin);
  15. client.print(F(" configured as OUTPUT!"));
  16. return;
  17. }
  18. client.print(F("error: invalid mode "));
  19. client.print(mode);
  20. }

您可以在Bridge示例页面中了解详细内容。

用Temboo连接因特网服务

Arduino Yún 入门指导 - 图18

Yún拥有很多针对于网络设计的内置功能,但是其中的最激动人心的功能是与其它网络平台交互。Arduino已与Temboo合作,让连接您喜爱的服务尽可能的容易。Temboo提供了从单点规范化访问100种以上个API的方法[Temboo provides normalized access to 100+ APIs from a single point of contact],可以让您混合及匹配来自多个平台的数据(例如Twitter、Facebook、Foursquare甚至FedEx或者PayPal)。

File > Examples > Bridge > Temboo菜单下提供了一些示例程序,这些程序可以很好的帮助您起步学习Yún的云平台操作[these are a great place to get started working with your Yún in the cloud]。您可以在Temboo起步页面中了解更多关于Temboo与Arduino整合的信息。

Spacebrew

Spacebrew是一个“两个交互性物品进行连接的简单途径[a simple way to connect interactive things to one another]”。它依赖于C/S架构并使用WebSockets在二者之间通讯。它用Python在Yún上运行一个定制的网络服务器,可以进行简单的通讯。

在Arduino IDE中包含了一些在Yún上使用Spacebrew的示例程序。Spacebrew的更多信息,请参阅项目文档页面

在Linux上安装附加的软件

Yún中附带了一些软件,它们被预装在OpenWrt-Yun中,包括”curl”和”python”。您也许想在Yún上安装其它软件。在Linux系统中,附加软件的安装可以通过使用一个叫做“软件包管理系统”的工具完成。更多信息,请参阅软件包管理教程

下一步

现在您已经掌握了基础部分,您可以在Bridge库和示例程序中继续钻研。您还可以查看Yún硬件页面获得额外的技术信息。


知识共享许可协议
Arduino Yun Reference CNChen 创作,采用 知识共享 署名-相同方式共享 4.0 国际 许可协议进行许可。
基于arduino.cc上的作品创作。