推しマイコンPSoCの紹介

※間違いがあればコメント等でご指摘ください。
# はじめに
PSoCは良いマイコンと思っていますが、あまり知られていないので紹介します。

自分はPSoC好きだったのですが、PSoCを販売していたCypressがInfinionに買収され、秋月電子など日本のパーツ屋から段々在庫が少なくなり、そろそろ積みボードかと思っていたのですが、検索してみると、なんとRSコンポーネンツ等で売っているではないですか。それもディスコンではなく！　ということで紹介しておきます。
今回は簡単に使えるPSoC開発ボードのCY8CKIT-59を紹介します。と言っても10年ぐらい前の開発キットでQiitaにも記事書いていたので思い出しながら、また現状を調査しながら書きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/de475053-ed71-0e7e-a0e6-367fcff91ef3.png)

# PSoCとは
有名なのは初代iPodで、PSoCのCap Sense（静電容量スイッチ）がタッチセンサーとして利用されたことでしょうか。
オペアンプが使えると、増幅器や比較器が実現できますよね。それをリアルタイムで変化させるためには、外付けの抵抗の値を変えます。でも多分、IC内部で抵抗を変えるのって難しいですよね。多分、抵抗って電圧/電流なので電圧もしくは電流を変化させれば良いですよね。そこで電流を変化させるためにスイッチドキャパシタを搭載したのがPSoC(現在のPSoC1：廃盤？)です。ちなみに、今回紹介するPSoC5LPはデジタルフィルターになっています。

# 普通のマイコンと何が違うの
一般的にPSoCは、デジタルユニットとアナログユニットを搭載したマイコンと言われていますが、個人的見解は、PSoCはセンサーを創るマイコンです。(創る---自由な発想でないものを作り出します。）
センサーを創るためには、入力、演算、出力（PCやマイコンとのインターフェイス）が必要です。特にデジタルユニット、アナログユニットはCPUの能力に依存せず、できるのが魅力です。

# 現在のPSoC
https://www.infineon.com/cms/en/product/microcontroller/32-bit-psoc-arm-cortex-microcontroller/

昔あったPSoC１や３は廃止みたいで、現在は以下の１０シリーズみたいです。PSoC３なども、まだ売っているみたいですが、実質PSoC4,5,6みたいですね。

- 32ビット PSoC 4 (Cortex-M0)
- 32ビット PSoC 4 Automotive (Cortex-M0/M0+)
- 32ビット PSoC 4 HV (Cortex-M0+)
- 32ビット PSoC 5 LP (Cortex-M3)
- 32ビット PSoC 6 (Cortex-M4/M0+)
- 32ビット PSoC車載用Multitouch (Cortex-M0)
- 32ビット PSoC Fingerprint (Cortex-M0+)
- 32ビット PSoC Analog Coprocessor (Cortex-M0+ MCU)
- 32ビット PSoC Edge (Cortex Multicore)
- 32ビット PSoC Control (Cortex-M33 MCU)

生き残っている開発ボードは以下の製品みたいです。（DigiKey調べ）
|型番|品名|価格|シリーズ|備考|
|:-:|:-:|:-:|:-:|:-:|
|CY8CKIT-030A|CY8C3866AXI-040 EVAL BRD|15,825|PSoC3|レガシー製品|
|CY8CKIT-040|PSoC 4000パイオニアキット|10,493|PSoC4|CY8C40xx|
|CY8CPROTO-040T|PSoC 4000T CAPSENSE|3,313|PSoC4|   |
|CY8CKIT-040T|PSOC 4000T CAPSENSE EVAL BRD|5,448|PSoC4|PSoC 4000T|
|CY8CKIT-149|PSoC 4100S Plus試作キット|6,509|PSoC4|   |
|CY8CKIT-147|PSoC 4100PS試作キット|3,315|PSoC4|   |
|CY8CKIT-041S-MAX|PSOC 4100S MAX PIONEER KIT|15,878|PSoC4|PSoC 4100S|
|CY8CKIT-043|PSOC 4200M EVAL BRD|3,315|PSoC4|PSoC4200M|
|CY8CKIT-146|PSoC 4200DS試作キット|3,315|PSoC4|   |
|CY8CKIT-045S|PSoC 4500S Pioneer Kit|10,493|PSoC4|PSoC 4500S|
|CY8CKIT-145-40XX|PSoC 4 Sシリーズ試作キット|6,509|PSoC4|   |
|CY8CKIT-042|PIONEER CY8C4245AXI EVAL BRD|6,509|PSoC4|CY8C4245AXI|
|CY8CKIT-044|PSoC 4 Mシリーズ パイオニアキット|4,119|PSoC4|PSoC 4200M|
|CY8CKIT-046|PSoC 4 Lシリーズ パイオニアキット|2,719|PSoC4|PSoC 4200L|
|CY8CKIT-050B|CY8C5868AXI-LP035 EVAL BRD|15,825|PSoC5LP|CY8C5868AXI-LP035|
|CY8CKIT-059|CY8C58LP EVAL BRD|3,315|PSoC5LP|CY8C58LP|
|CY8CPROTO-062S3-4343W|PSoC 62S3 Wi-Fi BT試作キット|10,493|PSoC6|   |
|CY8CKIT-062S2-AI|PSOC 6 AI EVAL BOARD|6,220|PSoC6||

# CY8CKIT-059について
本体とライターがつながった状態で売られています。切り離して使うことも可能です。
✳︎ライターもPSoCなので不要の場合は他の用途に利用可能です。
https://www.infineon.com/cms/jp/product/evaluation-boards/cy8ckit-059/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/61e3bb1e-bd97-a7f5-8e92-003282b8d131.png)

チップは CY8C5888LTI-LP097が載っています。

# 開発ツールのダウンロード
PSoC5は、PSoC Creator（Windowsのみ）を使用して開発をします。
PSoC4とPSoC6は、ModusToolboxを使用して開発するようになったみたいです。
なおPSoC1はPSoC Desinerという開発ツールを利用していました。今回紹介するCY8CKIT-059は、PSoC５シリーズなのでPSoC Creatorを利用して開発を進めます。
ダウンロード：https://www.infineon.com/cms/jp/design-support/tools/sdk/psoc-software/psoc-creator/
※Infinionにユーザ登録が必要なようです。

# PSoC Creatorについて
ダウンロードしたファイルをダブルクリックでインストールできます。
インストールタイプはとりあえずTypicalでよいでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/846cbc10-4014-48cc-b998-4fdb0afc34b0.png)
起動すると以下のような画面です。registorのダイアログが表示されますが、登録できなのでlaterをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/da77abb4-8a6b-7d68-695e-550ae67fe66a.png)
メニューの[File]→[Code example]にサンプルがあります。

# PSoc Programmerについて
Programmerのバージョンが古いと書き込めないので最新に更新します。
1. CY8CKIT-059をPCに接続します(基板のUSB端子の方です）。
1. スタートメニューからCypress -> PSoC Programmerを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/6a8c24ad-0dab-bc47-1f0f-4406883c4915.png)
1. プログラマーを選択します。エラーが出た場合はFirmwareの更新が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/37b3ac36-d8ed-0edd-2ebd-5467b76fa488.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/f1b358fb-0ff5-ccd2-0616-601417c9a4b8.png)
エラーが出た場合は、Utilityタブに変更しUpdateします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/67f2b71f-a1a5-e2d9-2661-0a01ff6ecce8.png)
1. PSoC Creatorから書き込みできるので、Programmerは閉じます。

# CY8CKIT-059でLチカ
PSoC(CY8CKIT-059)でのLチカは３通りの方法があります。まだ他にもあるかもしれません。
- CPUを使う方法
- デジタルユニットのクロックを使う方法
- デジタルユニットのPWMを使う方法
## CY8CKIT-059開発キットのハードウェア
### User Button
P2_2ピンに接続されています。押すとGNDですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/3b2ad407-ee71-76ff-b4db-1a3534f432ad.png)
### User LED
P2_1ピンに接続されています。他に2つのLEDが載っていますが、あまりプログラムと関係ないので省略
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/d15f1f5a-bf68-1d8a-5870-7443e486ded0.png)
### コンデンサ
マニュアルに従って進めるためにモノですが、結構じゃま。ピンを気を付けましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/b65b17a2-f484-08fc-edc4-02dcca618531.png)
## プログラムを書くまでの準備(プロジェクトの作成）
[File]->[New]->[Project]で新規プロジェクトを作ります。
Target deviceで[PsoC 5LP] [CY8C58LP]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/a13deb54-6d1c-ceab-a4e2-ed87ede02864.png)
Select project Templateは、最初から作るので[Empty schematic]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/0d24333d-2720-2969-af29-5b86312fe9e5.png)
Generate Projectは問題なければ[Next]で良いでしょう。
こんな画面になると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/90bdfed1-d8b2-6281-f407-b170ca7163c5.png)

デバイスの詳細選択
最初のProjectを作成するときはシリーズしか選べられなかったので詳細デバイスを指定します。
[Project]-->[Device Selector...]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/25705ece-7751-daae-2386-11e8b5164e89.png)

"CY8C5888LTI-LP097"を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/6e085913-a9df-88fa-a4d0-c894d65945ec.png)


## CPUを使ったLチカ
### 定義
まずピンを定義する必要があります。LEDはP2_1です。
右の[Ports and Pins]の中の[Digital Output Pin]を選択し真ん中にドラッグ＆ドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/fc6d3a74-6b28-4314-9451-9eef1fc9ac68.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/07130555-9573-00aa-ffd4-9df0830db2df.png)
ドラッグした部品をダブルクリックします。Nameをわかりやすいように[LED]にしましょう。CPUで制御するので[HW Connection]のチェックは外します。他はそのままで良いでしょう。[OK]を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/f9c3cd23-3079-856c-9083-acd18214975a.png)
左のPinsをダブルクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/4c55a635-2894-d5db-5646-720b0e1306ba.png)
PORTにP2[1]を選択します。これでPin名と物理ピンが関連付け出来ました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/96440ca7-7cd2-d1a1-c8ca-d30323d87f6f.png)
### Design Build
[Build]->[Build Design01]でデザインのビルドをします。これをすることで、プログラムのためのヘッダーファイル等が出来ます。
main.cを追記します。Arduinoに似てますよね。出来たら[Build]->[Genarate Application]でBuildします。
```
#include "project.h"

int main(void)
{
    CyGlobalIntEnable; /* Enable global interrupts. */

    /* Place your initialization/startup code here (e.g. MyInst_Start()) */

    for(;;)
    {
        /* Place your application code here. */
        
        LED_Write(1);
        CyDelay(2000);
        LED_Write(0);
        CyDelay(1000);        
    }
}
```
### 書込み
[Debug]-->[Program]を選択すると書き込んで実行します。
もしデバイスが違うと言われたら「Project]-->[Device Selector]でデバイスを変更します。

# クロックを使ったLチカ
すこしPSoCらしい使い方に変更しましょう。

TopDesign.cyshをダブルクリックして回路図を表示します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/8be2cc0b-d52f-fc7b-741e-37a74898ebb8.png)
回路図のLEDをダブルクリックして、HW Connectionにチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/0cab78b0-de5f-70a3-05db-3b5810b2546f.png)
[SYSTEM]の中の[Clock]をドラッグ＆ドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/5290fd29-c321-f1e5-6e6a-6a979b4f7f8b.png)
ドラッグしたClockをダブルクリックして、Sourceを[ILO]、Specityを[１Hz]にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/7db26eb8-4de2-9c22-3815-f97e9975c197.png)
回路図左の![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/c445dfcd-a9d4-7807-ca48-bfffa9631a37.png)でClockとLEDを接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/73f6cc8c-0be9-a0e7-2c7d-b29e96e1bd01.png)
さっきと同様に[Build]-->[Build Design01]でプログラムの準備をします。
main.cを以下の様に書きます。今回は内部のハードを動かすだけなので”Clock_1_Start();”の1行です。（つまりCPUは殆ど使用しません）
```
#include "project.h"

int main(void)
{
    CyGlobalIntEnable; /* Enable global interrupts. */

    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
       Clock_1_Start();
    for(;;)
    {
        /* Place your application code here. */ 
    }
}
```
# デジタルユニットのPWMを使ったLチカ
ClockだとONとOFFの時間が一緒になってしまいますね。PWMを用いて自由に変化できるようにしてみましょう。
## Projectの作成
プログラムを書くまでの準備(プロジェクトの作成）に沿って新規のProjectを作成し、LEDを置きます。LEDの"HW Connection"はチェックを入れてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/0cab78b0-de5f-70a3-05db-3b5810b2546f.png)
PinsでLEDをP2[1]に接続してください。
ここまではさっきと一緒です。

## ハードウエア
### PWM
TopDesign画面で、[Digital]->[Function]->[PWM]を回路画面にドラッグ＆ドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/2d6df2db-adda-58bc-18da-f2ce27f27d49.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/6836247c-716b-0504-f1d9-7b1b9ea66bad.png)

ドラッグしたPWMをダブルクリックし、設定画面を表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/d6cf5e8d-6773-4d5b-326f-f442f0fa3c21.png)
Implementationは"Fixed Function"を選択します。Fixed Functionは専用演算モジュールで、UDBはuniversal digital blocksです。universal digital blocksは自由に使えるので、専用演算モジュールがある時はそちらを利用した方が良いです。
Periodを100にします。100Hzの信号で動かすと1Hzで光ります。
CMP Value１は　25ぐらいで良いでしょう。50でDuty50%
規格表でいう所のココのモジュールを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/05ffd1a0-f44b-0caa-86b3-214714ef46e9.png)
端子が少し変わりました。PWMにはkillとClockが必要そうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/bfaca0c6-b234-f0b2-cccc-af9422e044e9.png)
kill端子はロジックの0を入れると良さそうなのでそれを回路図に入れます。
[Digital]->[Logic]->[Logic Low'0']をドラッグ＆ドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/aaf4061d-f85c-32fe-cd95-974cff34b9d6.png)

[System]->[Clock]をドラッグ＆ドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/06f4d193-44b8-cd5d-7fbb-44fa59b4b7f9.png)
回路図のClockをダブルクリックし、設定画面を表示します。今回はSourceは、お任せ（Auto）で周波数のみ100Hzにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/65c8a4bf-ec34-29d3-8e59-c0593668e0af.png)

配線します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/a640164f-c6ae-4a4b-2d53-dec00f68b77f.png)

Buildします。メニューから選んでも良いですが、ボタンでも良いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/f1371489-7ffe-5aca-a123-6868787af615.png)

## ソフトウエア
main.cを開きます。今回もハード依存なのでモジュールをスタートさせるだけです。for行の前の2行を追加します。
```
#include "project.h"

int main(void)
{
    CyGlobalIntEnable; /* Enable global interrupts. */

    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
    Clock_1_Start();
    PWM_1_Start();
    for(;;)
    {
        /* Place your application code here. */
    }
}
```

## 実行
Programボタンを押すとコンパイルして書き込んで、実行がはじまります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/606f1874-8072-30a9-e135-984705f3e4f8.png)

# おわりに
もしかしたら日本の小売りとInfineonとの契約が難しくて去って行ったのかな。
アナログも載っているマイコンPSoCに興味を持っていただけたら幸いです。