でばいすの山小屋

デバイスとかクラウドを実験中。IoTのふもとあたりをうろうろ。

ModusToolbox 1.0 をインストールしてみる ( Windows / macOS )

PSoC Advent Calendar 2018の15日目の記事です。

PSoC の新しい開発環境 ModusToolbox 1.0 がリリースされたので、インストールしてみます。
ModusToolbox は、Windows / macOS / Linux に対応しています。
今回は、Windows 10 / macOS Mojave にインストールします。

対応OS

対応OS は、以下のようになっています。

Windows の場合、32ビット版には対応してないとのことなので注意が必要です。

対応デバイス/対応キット

PSoC 6 系(CYBLE-416045-02を含む)に対応しています。

対応キットは、下記の通りです。

  • CY8CKIT-062-BLE
  • CY8CKIT-062-WIFI-BT
  • CY8CPROTO-062-4343W

ダウンロード

ModusToolbox のページに行き
http://www.cypress.com/products/modustoolbox-software-environment

右側の「Download ModusToolbox」をクリックし、ダウンロードします。
※ダウンロードするには、Cypress のウェブサイトにてアカウントを作成し、ログインする必要があります。

インストール手順(Windows編)

インストールは、簡単です。ウィザード通りすすめていきます。



インストール完了です。



ModusToolbox を起動して、プロジェクトを保存するフォルダを設定します。


初回起動時には、LICENSE AGREEMENT が表示されるので、「Accept」を押します。

インストール手順(Mac OS編)

インストールは、簡単です。ウィザード通りすすめていきます。



インストール完了です。



ModusToolbox を起動して、プロジェクトを保存するフォルダを設定します。


初回起動時には、LICENSE AGREEMENT が表示されるので、「Accept」を押します。

PSoC Creator 4.2 をインストールしてみる

PSoC Advent Calendar 2018の1日目の記事です。

PSoC Creator 4.2 を Windows10 にインストールします。
ただ、最新のデバイスPSoC 6 の一部など)には対応していないため、さらにいくつかの更新が必要になりますので、そのあたりをまとめてみました。


ダウンロード

PSoC Creator のページに行き
http://japan.cypress.com/products/psoc-creator-integrated-design-environment-ide
f:id:blgkns:20181201215104p:plain:w320
右側の「PSoC Creator のダウンロード」をクリックし、ダウンロードします。
※ダウンロードするには、Cypress のウェブサイトにてアカウントを作成し、ログインする必要があります。


インストール

インストーラ ( PSoCCreatorSetup_4.2_es100_b641.exe ) (2018/12/01時点) を実行する。

.NET Framework 3.5」がインストールされていない場合
下記のような表示が出てインストールが中止されます。
f:id:blgkns:20161201163748p:plain

.NET Framework 3.5」をインストールします。
「コントロールパネル」の「Windowsの機能の有効化または無効化」で、
.NET Framework 3.5(.NET 2.0 および 3.0を含む)」にチェックをつけて、「OK」
f:id:blgkns:20161201163749p:plain

.NET Framework 3.5」のインストールが終わったら、再度、PSoC Creatorインストーラを実行します。


Visual Studio 2013 の Visual C++ 再頒布可能パッケージ」がインストールされていない場合
下記のような表示が出てインストールが中止されます。
f:id:blgkns:20181201215105p:plain
リンク先よりダウンロードしてインストールします。
インストールが終わったら、再度、PSoC Creatorインストーラを実行します。


画面に従いインストールしていきます。
f:id:blgkns:20181201215106p:plain

f:id:blgkns:20181201215107p:plain

f:id:blgkns:20181201215108p:plain

f:id:blgkns:20181201215109p:plain

f:id:blgkns:20181201215110p:plain

f:id:blgkns:20181201215111p:plain
使用者名とメールアドレスを入力

f:id:blgkns:20181201215112p:plain
Cypressのウェブサイトでログインした時のメールアドレスおよびパスワードを入力

インストール完了!

開発キット

持っている開発キット(ハードウェア)にあったパッケージをインストールすることで、PSoC Creator をより便利に使うことができます。

たとえば、「PSoC 6 WiFi-BT Pioneer Kit」の場合、
http://japan.cypress.com/documentation/development-kitsboards/psoc-6-wifi-bt-pioneer-kit
このページの「関連ファイル」の
「Download CY8CKIT-062-WiFi-BT Kit Only Package (Kit Design Files, Documentation, Examples)」をダウンロードし、インストールします。

新規プロジェクト作成時に、対象のキットが表示されるようになります。
f:id:blgkns:20181201215113p:plain

また、C:\Program Files (x86)\Cypress\ 以下の該当フォルダに回路図やBOMなどもインストールされます。

Keil ライセンス取得ダイアログについて

しばらく使っていると、Keil のライセンス取得を求められるようになります。
以下の手順で、ダイアログ表示を止めることができます。
(※PSoC 3 で開発する方は、ライセンスを取得してください。本記事では扱いません。)
メニューの「Tool」「Options」で、
f:id:blgkns:20161201163759p:plain
「Don't show Keil registration....」に、チェックをつけます。

新しいデバイスに対応させる

PSoC Creator を起動します。
f:id:blgkns:20181201215114p:plain
「Tools」「Find new devices」を選択します。
新しいデバイス対応のアップデートがある場合は、下記のようなダイアログが表示されます。
f:id:blgkns:20181201215115p:plain
必要に応じて、インストールします。

PSoC Programmer / PDL(Peripheral Driver Library) の更新

PSoC Creator を起動します。
f:id:blgkns:20181201215116p:plain
「Help」「Update Manager」を選択します。
f:id:blgkns:20181201215117p:plain
PSoC Programmer 3.27.1」の「Update」を押してインストールします。
また、「Peripheral Driver Library 3.0.3」を「Download」を押して、インストールします。 インストールし、再度、Update Managerを起動すると、「Peripheral Driver Library 3.0.4」が表示されますので、こちらも同様に対応します。

今後も更新があれば、Update Manager に表示されますので、たまにチェックされることをおすすめします。

PSoC 6 Pioneer Kit で、Lチカしてみる (2)

PSoC Advent Calendar 2017の19日目の記事です。

PSoC 6 Pioneer Kit で、Lチカしてみます。
その2回目になります。

前回は、こちら
yamagoya.hatenablog.jp

今回は、コードを書かずに、Lチカします。
PSoC 6 Pioneer Kit を使うには、PSoC Creator 4.2 以降のものが必要になります。

PSoC Creator 4.2 について
2017/12/19 現在、正式リリースはされていません。ベータバージョンとして提供されています。
下記の PSoC 6 のページからリンクが張られており、ダウンロードには、ユーザ登録が必要です。

Cypress PSoC 6
http://www.cypress.com/products/32-bit-arm-cortex-m4-psoc-6


プロジェクトを作成

PSoC Creator 4.2 を起動します

f:id:blgkns:20171217165542p:plain:w640
「Create Project」を押す

f:id:blgkns:20171217165543p:plain:w640
「Target kit」「CY8CKIT-062-BLE (PSoC 63)」を選択して、「Next >」を押す

f:id:blgkns:20171217165544p:plain:w640
「Empty schematic」を選択して、「Next >」を押す

f:id:blgkns:20171217165545p:plain:w640
「Next >」を押す

f:id:blgkns:20171218144020p:plain:w640
ワークスペース名など、任意に設定して、「Finish」を押す

クロックの設定

f:id:blgkns:20171218144021p:plain:w640
「Clocks」を選択して、「Edit Clock」を押す

f:id:blgkns:20171218144033p:plain:w640
「High Frequency Clocks」タブを開く
「HFClk0」の設定を、「Path 1 (8 MHz)」「8」とする
「PeriClk」の「Divider」を「100」にする
「OK」を押す

コンポーネントの配置

f:id:blgkns:20171218144023p:plain:w640
「TopDesign.cysch」を開く

f:id:blgkns:20171218144024p:plain:w640
右上のComponent Catalogの検索窓に、「clock」と入力
「Clock」を、TopDesign.cysch にドラッグ&ドロップする

f:id:blgkns:20171218144029p:plain:w640
新しく作られた「Clock_1」コンポーネントをダブルクリックして開く。
Frequency を「2 Hz」に設定する

f:id:blgkns:20171218144025p:plain:w640
右上のComponent Catalogの検索窓に、「flip」と入力
「Toggle Flip Flop」を、TopDesign.cysch にドラッグ&ドロップする

f:id:blgkns:20171218144026p:plain:w640
右上のComponent Catalogの検索窓に、「high」と入力
「Logic High '1'」を、TopDesign.cysch にドラッグ&ドロップする

f:id:blgkns:20171218144027p:plain:w640
右上のComponent Catalogの検索窓に、「pin」と入力
「Digital Output Pin」を、TopDesign.cysch にドラッグ&ドロップする

f:id:blgkns:20171218144028p:plain:w640
新しく作られた「Pin_1」コンポーネントをダブルクリックして開く。
Nameを「LED」にする。

f:id:blgkns:20171218144030p:plain
コンポーネントを移動させ、このようにつなげる。

f:id:blgkns:20171218144031p:plain:w640
Pins をダブルクリックする。
「LED」の Port のドロップダウンリストから、P1[5]を、選択する。

実行

f:id:blgkns:20171218144032p:plain
Program ボタンを押すと、コードが書き込まれ、実行されます。

f:id:blgkns:20171218171541p:plain
LED が点滅します。

PSoC 6 Pioneer Kit で、Lチカしてみる (1)

PSoC Advent Calendar 2017の18日目の記事です。

PSoC 6 Pioneer Kit で、Lチカしてみます。
2回にわけて記事にしてみました。
今回は、コードを少し書いて、Lチカします。
PSoC 6 Pioneer Kit を使うには、PSoC Creator 4.2 以降のものが必要になります。

PSoC Creator 4.2 について
2017/12/18 現在、正式リリースはされていません。ベータバージョンとして提供されています。
下記の PSoC 6 のページからリンクが張られており、ダウンロードには、ユーザ登録が必要です。

Cypress PSoC 6
http://www.cypress.com/products/32-bit-arm-cortex-m4-psoc-6


プロジェクトを作成

PSoC Creator 4.2 を起動します

f:id:blgkns:20171217165542p:plain:w640
「Create Project」を押す

f:id:blgkns:20171217165543p:plain:w640
「Target kit」「CY8CKIT-062-BLE (PSoC 63)」を選択して、「Next >」を押す

f:id:blgkns:20171217165544p:plain:w640
「Empty schematic」を選択して、「Next >」を押す

f:id:blgkns:20171217165545p:plain:w640
「Next >」を押す

f:id:blgkns:20171217165546p:plain:w640
ワークスペース名など、任意に設定して、「Finish」を押す

Digital Output Pin を配置する

f:id:blgkns:20171217165547p:plain:w640
右上のComponent Catalogの検索窓に、「pin」と入力
「Digital Output Pin」を、TopDesign.cysch にドラッグ&ドロップする

f:id:blgkns:20171217165548p:plain:w640
Digital Output Pinは、「Pin_1」という名で、生成される。
※写真は、Zoom In で拡大してます。
これをダブルクリックする。

f:id:blgkns:20171217172306p:plain:w640
Nameを「LED8」に変更。
「HW connection」のチェックをはずして、OKを押す。
※Nameには、任意の名前をつけられます。その場合、以下のすべての「LED8」を読み替えてください。

f:id:blgkns:20171217165550p:plain:w640
Pins をダブルクリックする。
「LED8」の Port のドロップダウンリストから、P1[5]を、選択する。

コードを書く

左の Workspace Explorer の main_cm0p.c を、ダブルクリックする。
forのなかに、2行加えます。
※コメントは削除しています。

#include "project.h"

int main(void)
{
    __enable_irq();
    Cy_SysEnableCM4(CY_CORTEX_M4_APPL_ADDR); 

    for(;;)
    {
        Cy_GPIO_Inv(LED8_PORT, LED8_NUM);
        CyDelay(500);
    }
}

コードの説明(ざっくり)
LED の GPIO の出力を反転させる。
500msec(0.5秒)待つ。
これを繰り返す。

f:id:blgkns:20171217165551p:plain:w640
Program ボタンを押すと、コードが書き込まれ、実行されます。

f:id:blgkns:20171217165552p:plain:w640
LED が点滅します。

おまけ

この Kit には、ほかにも LED が、のっていますので、光らせる LED を変えてみてください。
※Pins の LED の Port の接続先を変えることで光らせる LED を変えられます。
LED の Port は、このようになっています。

Port
LED5 RGB (R) P0[3]
LED5 RGB (G) P1[1]
LED5 RGB (B) P11[1]
LED8 オレンジ P1[5]
LED9 P13[7]


参考:
PSoC 6 Pioneer Kit の回路図は、下記にインストールされます。
C:\Program Files (x86)\Cypress\CY8CKIT-062-BLE PSoC 6 BLE Pioneer Kit\1.0\Hardware\CY8CKIT-062-BLE\CY8CKIT-062-BLE Schematic.pdf

PSoC 6 Pioneer Kit / E-ink ディスプレイの表示データを作ってみる

PSoC Advent Calendar 2017の7日目の記事です。

PSoC 6 Pioneer Kit の E-ink ディスプレイで遊んでみます。
今回は、PSoC 側のコードは書きません。
PSoC 6 Pioneer Kit を使うには、PSoC Creator 4.2 が必要になります。

PSoC Creator 4.2 について
2017/12/07 現在、正式リリースはされていません。ベータバージョンとして提供されています。
下記の PSoC 6 のページからリンクが張られており、ダウンロードには、ユーザ登録が必要です。

Cypress PSoC 6
http://www.cypress.com/products/32-bit-arm-cortex-m4-psoc-6


プロジェクトを作成

PSoC Creator 4.2 を起動します

f:id:blgkns:20171207030242p:plain:w480
「Create Project」を押す

f:id:blgkns:20171207030243p:plain:w480
「Target kit」「CY8CKIT-062-BLE (PSoC 63)」を選択して、「Next >」を押す

f:id:blgkns:20171207030244p:plain:w480
「Code example」を選択して、「Next >」を押す

f:id:blgkns:20171207030245p:plain:w480
「CE218133_EINK_CapSense」を選択して、「Next >」を押す

f:id:blgkns:20171207030246p:plain:w480
「Next >」を押す

f:id:blgkns:20171207030247p:plain:w480
ワークスペース名など、任意に設定して、「Finish」を押す


サンプルプロジェクトの実行

f:id:blgkns:20171207030248p:plain:w480
screen.c の 140行目に BreakPoint をしかけて、デバッグ実行(デバッグ実行ボタンを押すか、F5を押す)する

f:id:blgkns:20171207030249p:plain:w480
デバッグターゲット選択画面が表示される場合は、
PSoC 63 CY8C6347BZI-BLD53(CM0p)」を選択して、「OK / Connect」を押す

ビルドされ、書き込みが完了し、実行される。
実行されると、main_cm0p.c の main 関数の頭で、止まるので、F5 を押して進めると.... f:id:blgkns:20171208011113p:plain:w480
E-ink ディスプレイにイメージが描画される。

Shift+F5 で、デバッグ実行を止める。

ここで、デバッグ実行を止めずに、そのまますすめると、このサンプルプロジェクトを試すことができます。
Pioneer Kit の右下のタッチセンサー部分をスライドしたり、タッチすることで、画面が書き換わります。


画像データを書き換えてみる

次に、このサンプルプロジェクトの起動画面を書き換えてみます。

f:id:blgkns:20171207030251p:plain:w480
screen_contents.c : 509行目から、起動画面のイメージがあります。
ここの最初の1バイトを、0xFF から 0x00 に書き換えて、デバッグ実行します。
さらに、F5を押して、進めると....

f:id:blgkns:20171207030252p:plain:w480
E-ink ディスプレイの左上に、小さな線(縦1ピクセル/横8ピクセル)が描かれていることがわかります。
画像イメージは、1ビットが1ピクセルに対応しています。つまり、1バイトで、8ピクセル
この E-ink ディスプレイは、縦横264x176なので、全画面の画像データは、264×176÷8 = 5808バイトとなります。
そんなデータをひたすら書いていくのはつらいので、BMP から画像データへのコンバータを作ってみました。


画像データコンバータ

やることは単純です。
BMP ファイルを読み込み、1ピクセルずつ色を見て、1バイトに詰めて、16進数表示でテキストにしています。
処理を簡単にするために、BMP の赤のみをみています。
下記のコードは、WPF/C# の一部です。
Linuxな方!PNG対応したい方!Advent Calendar 書くネタないなぁという方!コンバータ作って、ぜひ投稿してください)

MainWindow.xaml

<Window (snip)
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Content="File Select" HorizontalAlignment="Left" Margin="10" VerticalAlignment="Top" Width="80" Height="20" FontSize="12" Click="Button_Click"/>
        <TextBox Name="tbResult" Margin="10,40,10,10" />
    </Grid>
</Window>


MainWindow.xaml.cs

using Microsoft.Win32;
using System;
using System.Windows;
using System.Drawing;

namespace (Your Namespace)
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            string result = "";
            ofd.DefaultExt = ".bmp";
            ofd.Filter = "BMP|*.bmp";
            if (ofd.ShowDialog() == true)
            {
                Bitmap bitmap = new Bitmap(ofd.FileName);
                for (int y = 0; y < bitmap.Height; y++)
                {
                    result += "  ";
                    for (int x = 0; x < bitmap.Width; x+=8)
                    {
                        int a = 0;
                        for (int i = 0; i < 8; i++)
                        {
                            a = a << 1;
                            Color c = bitmap.GetPixel(x+i, y);
                            if (c.R > 127)
                                a |= 1;
                        }
                        result += string.Format("0x{0:X02}, ", a);
                    }
                    result += string.Format("// {0}", y + 1) + Environment.NewLine;
                }
                tbResult.Text = result;
            }
        }
    }
}

読ませるBMPファイルは、縦横264x176の物を準備してください。
サイズが間違っていると、画像がずれたり、動作がおかしくなります。


f:id:blgkns:20171207030253p:plain:w480
実行後、出力された16進数のデータを、screen_contents.c の 511~686行目と部分に上書きします。
※画像ではわかりにくいですが、176行分上書きしてください。


これを、デバッグ実行すると....

f:id:blgkns:20171207030254p:plain:w480
うまく表示されました!

IoTおもちゃを作ってみた

PSoC Advent Calendar 2016の13日目です。

以前、作った「IoTおもちゃ」について書いてみます。

IoTおもちゃ「ハロウィンのお城」

f:id:blgkns:20161213031434p:plain:w320
6cm角のサイコロ型の箱におさまる大きさのペーパークラフトです。 これを、PC やスマホから、照明を操作できるようにしました。

f:id:blgkns:20161213031435p:plain:w240

操作画面です。ブラウザから操作できます。

ペーパークラフト

株式会社さんけい の ペーパークラフトキット「みにちゅあーとmini」を改造して使用しています。 窓ガラス部分を、光りが通るように、プラバンに変え、中に LED を入れ、配線を床下に出しています。
f:id:blgkns:20161213031436p:plain:w320
床下には、PSoC 4 BLE Module (ピンソケットをはずしたもの)と ボタン電池が入っています。

システムの全体構成

通信経路は、下記のようになっています。
f:id:blgkns:20161213031441p:plain PSoC 4 BLE と Android が、BLE 通信。
Android と PC/スマホクラウドを介して、通信できるようになっています。
はじめて見る人は、「なんでー?」って言ってくれる人が少なくないのですが、わかってしまえば簡単です(^^)

Android端末

f:id:blgkns:20161213031438p:plain:w240
BLE通信 と インターネット通信を仲介するために、それぞれに接続できるようになっています。
もちろん、BLE通信だけで、直接、ペーパークラフトを操作できます。

Cloud / Webアプリ

Microsoft Azure 上に、Web Apps をたてています。
WebアプリとAndroid端末は、SignalR を使って通信しています。
Cloud 側は、ほぼ設定だけで、コードといえる物は、ありません。
Webアプリもボタンを押したら、Cloud に、コマンドを投げるだけというレベル。

BLE 通信

BLE の通信もシンプルです。
f:id:blgkns:20161213031439p:plain:w320
Custom Profileにして、Service / Characteristic を1つ作っています。
Characteristic は、uint8 が 1byte です。 Android から、コマンド 1byte 書き込むことで、動作するようにしています。
2つの LED をどのように光らせるかということを設定するだけなので、8bit で十分です。(単純に手抜き)

ひとこと

いろんな技術を使っていますが、どれも入門編レベルです。
IoTブームとか言われますが、まだまだ、インターネットとやりとり出来たらおもしろくなる物は、たくさんあると思います。
なにか作ってみてはいかがでしょうか?

おまけ

今回使用した「みにちゅあーとmini」は、他にもたくさん発売されており、いくつか改造して遊んでみようと思っています。
そこで、勉強がてら、専用基板つくっちゃいました(笑)
f:id:blgkns:20161213031440p:plain:w320
PSoC 4 BLE で基板を作ってしまうと、技適を通す必要が出てくるため、EZ-BLE PSoC を使っています。
しかし、こんな基板を設計して、気軽に発注できるなんていい時代ですよね。

PSoC 4 BLE で、はじめての BLE

PSoC Advent Calendar 2016の4日目の記事です。

Cypress Bluetooth Low Energy Pioneer Kit を入手して、PSoC Creator をインストールすれば、スマホですぐに BLE通信 を試すことができます。

導入後のファーストステップとして、コードも書かず、電子部品も使わずに、BLE の実験してみます。

1. スマホに「CySmart」アプリをダウンロード

BLE に対応した iPhone / Android スマホに、「CySmart」アプリをダウンロードします。
CySmart (iPhone) : App Store からダウンロード
CySmart (Android) : Google Play からダウンロード
(この記事の CySmart のスクリーンショットは、iPhone のものです。)

2. 新規プロジェクトの作成

2-1. PSoC Creator 起動

PSoC Creator を起動します。
f:id:blgkns:20161211234556p:plain:w480
「Create Project」ボタンを押す。

2-2. デバイスの選択(CY8CKIT-042-BLE の場合)

f:id:blgkns:20161211234557p:plain:w320
「Target device」にチェックを入れ、
PSoC 4」「PSoC 4200 BLE」を選択。

2-2. デバイスの選択(CY8CKIT-042-BLE-A の場合)

f:id:blgkns:20161211234558p:plain:w320
「Target device」にチェックを入れ、
PSoC 4」「Launch Device Selector...」を選択。

f:id:blgkns:20161211234559p:plain:w320
「Series」で、「PSoC 4200 BLE」を選択し、「CY8C4248LQI-BL583」を選択して、「OK」を押す。

2-3. テンプレートの選択

f:id:blgkns:20161211234600p:plain:w320
「Code example」を選択し、「Next >」を押す。

2-4. Example Project の選択

f:id:blgkns:20161211234601p:plain:w320
「BLE_FindMe」を選択し、「Next >」を押す。

2-5. 作成するプロジェクトの設定

f:id:blgkns:20161211234610p:plain:w320
ワークスペース名/保存先/プロジェクト名を設定し、「Finish」を押す。

3. 接続/ビルド/実行

f:id:blgkns:20161211234603p:plain:w320
Baseboard を PC と接続します。

f:id:blgkns:20161211234604p:plain:w480
「Program」ボタンを押すと、自動的にビルドが実行され、書き込みが行われます。
書き込みが完了すると、自動的に、実行されます。

f:id:blgkns:20161211234605p:plain:w320
このプロジェクトが正常に動作すると、右上のLEDが緑色に点灯します。
緑色に点灯している間は、BLE接続できる状態で、一定時間で、接続出来ない状態(赤色点灯)になります。
Baseboard の Resetボタンを押すことで、再度、接続出来る状態になります。

4. スマホで、BLE 通信する

スマホ側で、CySmartを起動します。
うまく動作していれば、「Find Me Target」がみつかります。

f:id:blgkns:20161211234606p:plain:w240

※見つからない場合は、Baseboard の Reset ボタンを押してみてください。

4-1. 接続する

「Find Me Target」をタッチすると、接続され、通信が確立します。

4-2. Find Me

f:id:blgkns:20161211234607p:plain:w240

メニューを左右にスライドさせて、「Find Me」を正面にもってきてタッチします。

f:id:blgkns:20161211234608p:plain:w240

「Select」を押す。

f:id:blgkns:20161211234609p:plain:w240

「No Alert」「Mid Alert」「Hige Alert」のいずれかを選択すると、Baseboard の LED の光り方が変わります。
スマホと、PSoC 4 BLE が通信できていることが確認できたでしょうか?

5. ひとこと

今回の Find Me 以外にも、たくさんの Example Project がありますので、お好みの物を試してみてください。