PSoCを始めましょう(Lチカまで)


<blockquote class="twitter-video" data-lang="ja"><p lang="ja" dir="ltr">PSoCでLチカ <a href="https://t.co/b4EVT2t6OF">pic.twitter.com/b4EVT2t6OF</a></p>&mdash; kao (@kao_CtR) <a href="https://twitter.com/kao_CtR/status/807623290315423744">2016年12月10日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


# 注意：著者の技術レベルについて

もともとソフトウェア畑で趣味・仕事をメインにやってきていて、ハードウェアについてはここ一年ばかりArduinoをはじめとしたマイコンを中心に触っているといったレベルです。PSoCについても、先日ワークショップで触って感銘を受けて記事にしました。

記事にあたり、実際に試してみましたがすでにPSoCを使いこなしていたりしている人やFPGA・ハードウェア設計者からはおかしいことも書いているかもしれませんが、そこはご指摘いただければ幸いです。

# マイコンでLチカしてみよう

そもそもマイコンはわかってもLチカはわかる人は少ないですね。私もLチカって何ってところから入った者の一人でございます。

Lチカとは”LEDをチカチカ光らせる"という、プログラマ業界なら Hello World.的なマイコン版の手始めの体験プログラムです。

さて、マイコンといえば最近では王道でArduino、ちょっとハイレベルなものになるとmbed、raspberry pi(あっ、これはマイコンではないですね)なんてものがありますが、今回は趣向を変えてPSoC(Programmable System on Chip)を使ってLチカしてみます。

# PSoCってなんですか？
PSoC（ピーソック、Programmable System-on-Chip）とはサイプレス・セミコンダクター（Cypress Semiconductor Corporation.）が製造しているICチップの製品群である。広義にはマイクロコントローラに分類される。(wikipediaより)

「ProgrammableなSoCなんですよ。」っていってもなんのことだかですが、Programmableというところにこのチップの面白さがあります。通常SoCのカスタマイズされたハードウェアロジックは後で修正できないのですが、PSoCではこのカスタマイズするハードウェアロジックをプログラムによって動的に構成できる特徴を持っています。

またちょっと専門語が出てしまいますが、FPGA(Field Programmable Gate Array)というチップとVerilogといった言語で回路が動的に構成できる要素をSoCに乗せたものです。

実際には、FPGAよりもロジック部品の単位が大きく、回路を簡単に構成できますが、一方でより細かい回路構成には柔軟度が足りなくないともいえるかもしれませんが、エントリには十分な魅力を持っています。
(FPGA界隈に一切知識のない上の言い切りなので、誤りがあればご指摘をｗ)

さて、製品ですが大きく4つのラインナップで構成されています。

| ラインナップ   | CPU    | メモ    |
|:---|:----|:----|
|PSoC1|M8C|最初のPSoCでPSoC1だけが大きく他のPSoCとアーキテクチャが異なり、開発ツール等の異なる点注意が必要  |
|PSoC3|Intel 8051| CPUが8bitのIntel 8051で低消費電力が特徴|
|PSoC4|ARM Cortex-M0| CPUが32bit ARM Cortex-M0で、プログラマブルなロジック要素を抑えた製品|
|PSoC5LP|ARM Cortex-M3| CPUが32bit ARM Cortex-M3で、現在最もハイパフォーマンスな製品

# さて、やってみますか。

Cypress社から提供されている開発キットは比較的安価なものが提供されています。秋月電子でPSoC4のプロトタイピングキット( http://akizukidenshi.com/catalog/g/gM-08446/ )で600円から手に入ります。ここでは、PSoC5LPのプロトタイピングキット( http://akizukidenshi.com/catalog/g/gM-09432/ )を前提(こちらも秋月電子で1500円です)に話を進めていきます。

本編では、windows 10での実行例になります。ちなみにmacやlinuxの環境は提供されていないので、仮想環境で行うことになります。

## まずは、開発ツールのインストールから

PSoCLP Prototyping Kit(CY8CKIT-059)の製品紹介のページ(http://japan.cypress.com/documentation/development-kitsboards/cy8ckit-059-psoc-5lp-prototyping-kit-onboard-programmer-and )を開いて下の方にある
![psoc-download.png](https://qiita-image-store.s3.amazonaws.com/0/51514/7a2a0b85-977c-8629-73c8-ea4e3b1c1b41.png)

CY8CKIT-059 Kit Setup (Kit Design Files, Creator, Programmer, Documentation, Examples)からダウンロードします。

ダウンロード画面に行くとダウンロードツールをインストールするか確認されるのでインストールしてください。(しなくてもダウンロードは可能ですが、圧倒的にツール経由でダウンロードするほうが早いです)

ダウンロードした実行ファイル(CY8CKIT059Setup_RevSA.exe)を実行するとインストーラが起動するので、指示に従ってインストールを進めます。本インストーラは統合インストーラなので一括で必要なものがインストールできます。

![psoc-install-01.png](https://qiita-image-store.s3.amazonaws.com/0/51514/bba98908-0c67-e4dc-884d-794a40e1e5ed.png)
ここでは、インストール先の指定を行います。デフォルトでは、c:\Program Files配下にインストールされます。確認ができたらNextボタンを選択します。

![psoc-install-02.png](https://qiita-image-store.s3.amazonaws.com/0/51514/a6b5d099-6dad-a623-429b-dae115d6ed34.png)
インストールする機能を選択します。Installation Typeのプルダウンで選択します。

![psoc-install-03.png](https://qiita-image-store.s3.amazonaws.com/0/51514/fa19b8d5-5505-6cd3-90a3-684517f4ba8a.png)
Typical でも問題ないですが、本インストールではCompleteを選択します。
確認したら、Nextボタンを選択します。

![psoc-install-04.png](https://qiita-image-store.s3.amazonaws.com/0/51514/9e2bb849-2557-e9c6-8f16-4b9e59bd5793.png)
インストール前にエンドユーザライセンスアグリーメントを承認します。
ライセンスは二つ、一つ目はCypress、二つ目はARM Keil Software Development Toolsです。
I accept ...を選択し、Nextボタンを選択します。

![psoc-install-05.png](https://qiita-image-store.s3.amazonaws.com/0/51514/b1cc240d-2973-07ac-3fba-158c032d482d.png)
ここも同じく、I accept ...を選択し、Nextボタンを選択します。

![psoc-install-06.png](https://qiita-image-store.s3.amazonaws.com/0/51514/55795ef0-7e10-950f-d501-421f6f589a24.png)
するとインストールが始まるのでしばらく待ちます。

![psoc-install-07.png](https://qiita-image-store.s3.amazonaws.com/0/51514/121cf6ca-6846-3728-1846-fa466cc771cb.png)

インストールが完了すると本画面が表示されます。
ここまでで、インストールはいったん終了です。


最低限はここで開発がすすめられますが、新しいもの好きなので開発環境は最新版のPSoC Creator 4.0を使用します。ということで、[スタートメニュー]-[Cypress]-[Cypress Update Manager]を開いてPSoC Creater 4.0をダウンロードします。
![psoc-install-11.png](https://qiita-image-store.s3.amazonaws.com/0/51514/5a25042b-f10f-0af8-113e-b7c1d9ada480.png)
ダウンロードを選択するとブラウザを開いてダウンロードが始まります。

ダウンロードが完了したら、ダウンロードしたPSocCreatorSetup.exeを実行します。
あとは、先ほど行ったことと同様の手順でインストールを進めればインストールできます。

注意点として、PSoC Creater 3.3と4.0は共存可能なので、4.0をインストールしても3.3はアンインストールされません。不要であれば別途 Cypress Update Managerで3.3をアンインストールする必要があります。

ちなみに、Cypressの開発ツールはwindowsのプログラムと機能の一覧には表示されないため、すべてCypress Update Manager経由で更新・アンインストールを行う必要がある点は気にしておいたほうがいいでしょう。




## さて Lチカです。

ここでは2つのパターンでLチカをを実装します。

一つ目は、プログラムでLチカを実現します。これは通常のマイコン、Arduinoやmbedとほぼ同じ感じです。
二つ目はいよいよPSoCらしさを生かしてLチカを行います。

二つ目は、プログラムコードとして記述するのはたった一行、Lチカの処理を回路側で実装していますのでその違いを感じてもらえればと思います。

## 基本的なLチカ
まずは、ここでは開発環境のPSoC Creatorの使い方を簡単になれながら、Lチカを実装します。

> [スタートメニュー]-[Cypress]-[PSoC Creator 4.0]

で起動します。

![PSoCCreator-01.png](https://qiita-image-store.s3.amazonaws.com/0/51514/3425a865-ff7d-e6d0-1c93-2c2677fa0c3f.png)
まず、プロジェクトを作成します。
メニューから[File]-[New]-[Project]でプロジェクト作成ダイアログを開きます。

![PSoCCreator-02.png](https://qiita-image-store.s3.amazonaws.com/0/51514/3c6260e7-a2e5-686d-9777-4cdbdfcce9d2.png)
Target kit の選択コンボで CY8CKIT-059を選択します。
確認して Nextを選択します。

![PSoCCreator-03.png](https://qiita-image-store.s3.amazonaws.com/0/51514/6d7e0997-e2ff-4813-1284-e81aa12ea3d1.png)
ここでは、Empty schematicを選択します。
確認して Nextを選択します。

![PSoCCreator-04.png](https://qiita-image-store.s3.amazonaws.com/0/51514/aca9377d-da5c-7a9f-4d01-12dd6fa00975.png)
プロジェクトの作成場所を決めます。

> [Location]\[Workspace name]\[Project name]

というパスにプロジェクトが作成されます。
確認して、Finishを選択します。

![PSoCCreator-05.png](https://qiita-image-store.s3.amazonaws.com/0/51514/0dd349a0-cf30-de9d-fd0a-2d36bf3c6034.png)
プロジェクトを作成すると上記の画面が開きます。

左のパネルがWorkspace Exprorerでソースファイル等のリソースをツリービューで表示します。
中央上がTopDesign.cyschを開いた画面で回路図をデザインする画面になります。
右のパネルがコンポーネントカタログでタブでCypressとOff-Chipと別れています。Cypressは今回選択したPSoCチップで構成可能なパーツが含まれています。Off-Chipは周辺回路用の部品パーツが含まれています。

回路図を中央上のデザイナで作成します。基本的な作業は
1. 右のパネルのコンポーネントカタログからdrag and dropでデザイナ上に部品を配置
2. デザイナ上に配置した部品をダブルクリックしてプロパティダイアログから部品の設定を行う
3. 部品間をデザイナの左の結線ツールを使用して接続

![PSoCCreator-06.png](https://qiita-image-store.s3.amazonaws.com/0/51514/d129c23d-e9d0-bd39-21e4-f91ed51c4626.png)
まずは、LEDをつなげる出力PINを回路上に定義します。
これは、[Ports and Pins]-[Digital Output Pin]を選択し、デザイナウィンドウ上にdrag and dropします。

![PSoCCreator-07.png](https://qiita-image-store.s3.amazonaws.com/0/51514/bdfbb0c4-44e9-1d11-184d-700c0715db2c.png)
デザイナ上のPin_1をダブルクリックし、Configureダイアログを表示させます。
このダイアログでは以下の部分を変更します。
1. Nameを "LED"に変更
2. Digital outputが選択されていることを確認
3. Digital output - HW connectionのチェックを外す
4. External terminal のチェックを入れる

HW connectionは、チップ内の回路接続用の端子のことであり、今回は内部回路は作成しないため無効とします。また、External terminalはLEDとの結線をデザイナ上に表記するために有効にしました。ちなみに、チップ外の回路については、記述の有無は実際には関係ないので、記載しなくても影響はないので、以下のLEDおよびGroundの結線作業はスキップしても問題ありません。

ここでは、見栄えの問題と一例として手順には含めておきます。

また、今回は変更しませんでしたが、Drive modeを変更することで、端子のPull up / Pull Downにすることも可能です。

![PSoCCreator-08.png](https://qiita-image-store.s3.amazonaws.com/0/51514/4f734e1f-f1d3-c1a6-de9d-0095e0de9074.png)
今度は右のパネルのタブをOff-Chipに変更し、Diodes-LEDとPower-Goundをデザイナ上にDrag and Dropします。
部品間の端子間をデザイナ上の左の上から二番目のコネクタを選択して接続します。

以上でデザイナ上の作業を終えたら、Design Wide Resources の Pinを選択し、Pinアサインを行います。
PSoCでは、ほとんどのPinは事前に役割は決まっておらず、ユーザが定義することができるようになっています。

![PSoCCreator-09.png](https://qiita-image-store.s3.amazonaws.com/0/51514/dcf74032-c54f-20c4-ae34-e58a32ad482b.png)
左のパネルのWorkspace Explorerで Design Wide Resources - Pinsを選択し、中央上にピンアサインデザイナを表示させます。

今回は、Prototyping Kitにすでに実装済みのLEDを表示させるため、すでに接続済みのPinに対応するPortであるP2[1]を指定することにします。

右のパネルに今まで定義していたPin名であるLEDが表示されているので、PortのコンボボックスからP2[1]を選択します。

そうすることで中央上のピンアサインデザイナのP2[1]が青色に塗りつぶされて対応するPin名であるLEDが表示されます。

ここまでで、回路設定は終わりになります。

次は、プログラミングになります。


![PSoCCreator-10.png](https://qiita-image-store.s3.amazonaws.com/0/51514/34f277e9-a6ed-08d2-5dbd-7bd2d97e7677.png)

手順としては、以下の手順になります。
1. 回路図で使用したコンポーネントのソースを生成します。
　上のアイコンメニューから① Generate Applicationを選択し、ソースを生成します。本処理を行うことで、今回定義したDigital output pinに対する関数が生成されます。生成される関数はpin名である"LED”がプレフィックスになった関数でLED_Write() / LED_Read()といった、LED_XXX()という関数群が生成されます。
    
2. プログラムコードを記述します。
　左のパネルから Source File - main.c を選択し、ソースコードエディタを表示させます。
　すでにテンプレートのコードが生成されているので、必要な部分だけコードを組めばよいようになっています。今回は主処理である、forループ中にLEDの明滅処理を記述すればよいです。Arduino等でLチカをやっていれば想像がつくと思いますが、pinの出力を一定間隔で反転するコードを書くことになります。
　
```c++:main.c
　        LED_Write( ~LED_Read() );
　        CyDelay(500);
```
　一行目はLEDピンへの出力を設定しています。現在のLEDピンのステートを反転させて設定します。
　二行目は500msecのウェイトを行っています。この感覚でLEDが点滅します。
 
3. プログラムをビルドしてチップへロードします。
　上のアイコンメニューから②Programを選択し、ソースをビルドしチップへプログラムをロードします。うまくいけば、0.5秒間隔でLEDが点滅します。

## PSoCならではのLチカ
先ほどのLチカは、ArduinoやmbedでLチカをすでにやられている方からするとあまり違和感がなかったと思います。ここでは、PSoCっぽく、内部のPWMモジュールを使用してLチカを実現します。今回はPWMのクロックを128Hzと極端に遅くし、PWMのカウンタを256として一秒間隔でのLEDの点滅を実現します。






![PSoCCreator-21.png](https://qiita-image-store.s3.amazonaws.com/0/51514/a56b297c-dfbb-f751-8c35-ea673a56e219.png)
先ほどと同じ手順でプロジェクトを作成します。今度はBlink02というプロジェクト名としてください。

![PSoCCreator-22.png](https://qiita-image-store.s3.amazonaws.com/0/51514/b2acc6c0-36bc-dae8-0373-ccc4fe54e61a.png)
回路デザイナ上に以下のモジュールを配置します。図中にはclockのモジュールがコンポーネントカタログに表示されていませんが、配置するようにお願いします。

1. PWM : [Digital] - [Function] - [PWM]
2. Logic Low '0' : [Digital] - [Logic] - [Logic Low '0' ]
3. Digital Output Pin : [Ports and Pins] - [Digital Output pin]
4. Clock : [System] - [Clock]

接続は 
 - PWM:reset - Logic Low '0'
 - PWM:pwm1 - Digital Output Pin
 - PWM:clock - Clock
と接続してください。

それぞれのモジュールのプロパティ設定を行います。

![PSoCCreator-23.png](https://qiita-image-store.s3.amazonaws.com/0/51514/ea428771-d622-960e-0161-2884d5dc69d5.png)
PWMのモジュール設定の変更箇所です。
 - NameをPWMに変更します。
 - PWM ModeをOne Outputに変更します。
 今回はPWMを一つしか使用しないので。
 
![PSoCCreator-24.png](https://qiita-image-store.s3.amazonaws.com/0/51514/ab286623-d89c-64a6-1450-6ce843c9fbf1.png)
Clockの変更箇所です。
 - NameをClockに変更します。
 - Frequencyを128 Hzにします。コンボボックスで周波数の単位をHzにするようにしてください。

![PSoCCreator-25.png](https://qiita-image-store.s3.amazonaws.com/0/51514/2683b3c7-218e-4b67-3bff-54cf4df6e5a2.png)
Digital Output Pinの設定です。
 - NameをLEDにします。
 - Digital outputにチェック
 - Digital output - HW connectionにチェック
 - External terminalをチェック
今回はPWMとpinを内部回路で接続するので、HW connectionにチェックが必要になります。

![PSoCCreator-26.png](https://qiita-image-store.s3.amazonaws.com/0/51514/75a94a96-9cd4-af3c-c902-255561f0e72d.png)すべての設定を行った後の回路デザイナの画面になります。
PWMの出力が、初期状態ではpwm1, pwm2となっていたのが、PWM ModeをOne Outputに変更したためpwm飲みになっています。


![PSoCCreator-27.png](https://qiita-image-store.s3.amazonaws.com/0/51514/f9ac3298-796b-c6c4-a35e-8a2a4aa390e9.png)
Design Wide Resources - Pinsを開いて、ピンアサインを行います。こちらは前回と同様にLED pinをP2[1]に割り当てます。

回路設計については、以上で終わりになります。
上のアイコンメニューからGenerate Applicationを選択し、ソースを生成してmain.cにプログラムを書けばほぼ終わりです。

![PSoCCreator-28.png](https://qiita-image-store.s3.amazonaws.com/0/51514/0fbdd613-7f7d-38c3-4f6f-39687bac9c9d.png)

今回は、PWMでLEDの信号処理を行ってしまうので、プログラムでやることはPWMの初期化のみになります。
9行目に
```cpp:main.c
　        PWM_Start();
```

のみ追加すればOKです。

あとは、上のアイコンメニューからProgramを選択し、ソースをビルドしチップへプログラムをロードします。うまくいけば、1秒間隔でLEDが点滅します。先ほどのプログラムより長い感覚で点滅していれば正しく動作しています。

# 最後に

Lチカを二つの実装で行ってみましたが、前者がプログラムで信号処理を行っているのに比べ、後者のほうは初期処理のみであとはハードウェア処理に委ねている感じがわかると思います。

PSoCでは、BLEモジュールを内包したチップを出しているのですが、非常に使いやすくお勧めです。また、機会があればこちらについても書いてみたいと思います。

# References

PSoC Creatorクイックスタートガイド http://www.cypress.com/file/44821/download
PSoC 5LP Prototyping KIT Guide  http://www.cypress.com/file/157971/download