Upload
tetsuya-noguchi
View
277
Download
0
Embed Size (px)
Citation preview
PSoC ことはじめ (BLE版)
Ver.2016.10.28 @tetnoguchi(twitter) / techa.nog(facebook)
PSoCとは。。。Cypress社のSoC
マイコンコア + CPLDなイメージ。
シリーズは4系列あり。
PSoC1: M8C 異色すぎる!!
PSoC3: 8051
PSoC4: ARM CortexM0
PSoC5: ARM CortexM3
CypressのHPから拝借PSoC1 高機能PAL/GALみたいなもん
UDB(Universal Digital Blocks) CPLDみたいなもん(12入力 4出力のPLD)PSoC5には最大24個。 PSoC4は最大4個しかない。
PSoC3 と 5は CPUの違い 8051(8bit) vs CortexM3と 12bit SAR-ADCの有無 がちがうのみPSoc4はCPUは同じでも拡張性が大幅に削減されている
4はアナログ系も大幅に簡略化
PSoC4にもシリーズがあるんだよね….
ほんまに普通のマイコン
OpAMPつけてアナログ強化
OpAMP+UDB Universal Digital Block(UDB)
12入力4出力の PLD * 2とデータパス(簡易ALU)を内蔵した特殊ブロック。簡易版CPLD
要はCPUを介さずに
いろんな処理を行えるようにできる便利ユニットなのだ!
同じPSoC4でも 4100系と4200系では大違い!UDBこそがPSoCらしさそのものなので、必ず4200系を選ぶべし!
PSoC4-4100系 PSoC4-4200系
今回は PSoC4BLE搭載の CY8CKIT-042-BLE-Aで進める。。。PSoC初心者ならPSoC5LP PrototypingKit CY8CKIT-059 http://akizukidenshi.com/catalog/g/gM-09432/がおすすめ。 1500円でデバッガ付きで格安だから。USBもちゃんとついてるし。慣れたら、PSoC4にいくもヨシ。 こちらは600円だし。http://akizukidenshi.com/catalog/g/gM-08446/
標準デバッガはMiniProg3 (CY8CKIT-002)だが、サイプレス直販で$89。RSやマルツでは12000円ほどする。(http://japan.cypress.com/documentation/development-kitsboards/cy8ckit-002-psoc-miniprog3-program-and-debug-kit)必ず MiniProg3であること。(秋月にはMiniProg1はあるけど、PSoC1用なので注意!)CY5682などの同梱キットをかえば7000円程度で入手可。https://store.macnica.co.jp/products/cypress_cy5682
でも、当面はCY8KIT-059のデバッガで十分。
今回つかう CY8CKIT-042-BLEだと高い分だけあってデバッガ機能もあって使いやすいとはおもう。
PSoC4BLE PioneerKitベースボードR-LED P2_6G-LED P3_6B-LED P3_7SW P2_7UART-TX P1_5UART-RX P1_4CapSense P2_1/P2_2/P2_3/P2_4/P2_5F-RAM (0x50) SDA P5_0F-RAM(0x50) SCL P5_1
UARTがKitProgのUARTに接続されているのでKitProgのUSBで即シリアル接続が確認できる。F-RAMはFM24V10(1Mbit=128KB)が接続されている。
PSoC4BLE
R-LED P2_6G-LED P3_6B-LED P3_7
SW P2_7
KitProg(PSoC5LP)
ソフト、つくってみる。。。
PSoC Creater 3.3をベースに使ってみる。
File - New – Project を選んで CY8C5888LTI-LP097を選択して進める
ここまでくれば、あとは挙動を作るのみ。右端にあるコンポーネントを適当にマウスで、配置していく。コンポーネントをダブルクリックすると、設定画面もでてくるので、適宜設定すべし!
スケマティック(回路図)ができたら、設定ファイル( xxx.cydwr )を開き、ピン配置を決める。右にあるピンをドラッグアンド ドロップで配置したいピンに割り付ける。
できたら、いったんビルドする!(ここ重要!!)
関連ソースコードが一気に生成されるので、あとはこれらを使うソースコードを追記していけば
めでたく完成することになる!!
-Work 00-
LEDを点灯しよう!
Schematicの部分にコンポーネントを配置する。SWとLEDなので、LED Digital Output PinSW Digital Input Pin に割り振る。SWはプルアップされていないので、IO定義で内蔵プルアップを有効にしてやる。 Pin_2をダブルクリックして Drive modeをResistive Pull upにする
SWでLEDを制御したいので、配線ツールで、Pin_2 と Pin_1をつなぐ。
スケマティック(回路図)ができたので設定ファイル( xxx.cydwr )を開き、ピン配置を決める。LEDはP2[6] = 赤SWはP2[7]なので、右にあるピンをドラッグアンド ドロップで配置したいピンに割り付ける。
できたら、いったんビルドする!(Build-Builde xxx)
必要なソースコードも準備されたので、Debug – Program で 書き込んでみる。書き終わると自動的に実行されるのでSW を 押して LEDが 変化するのを確かめよう!!
-Work 01-
LEDを調光制御してみる!
調光制御するだけだと面白くないので、SWに連動して各LEDが切り替わるようにしてみる。ついでに、徐々に調光値が変化するように\(^o^)/
青字は気にせず、こんな風に配置してね。
Clockは今回10kHzに。
PWMの設定はこんな感じ。10kHzが投入されているのでPeriod=99で 10ms周期。Compare=50だとDuty50%。わかりやすいね。
Interrupt部でOn Terminal Count Eventにチェックすべし!これで1周期おわりごとに割り込み発生できる。
Timerのほうもこんな感じ。10kHzが投入されているのでPeriod=10 で 1ms周期なのが分かる。Interrupt On TC にチェック!
基本設定が完了したので、いったんビルド!!ソースが自動生成されたので、動作を作成するぞ。
PWMとタイマーの初期化と割り込みベクタの指定
一定間隔で徐々に輝度を上げて上限に達したら徐々に下げていく。下限ならまた上げていく
SWが押し下げられたら、出力LEDを切りかえる
実際の割り込みの処理はこんなかんじ。
PWMの更新周期で次回のDutyを設定する
単純に時間計測用の減算タイマーがあるのみ。
Debug – Program で 書き込んでみる。書き終わると自動的に実行されるのでSW を 押して LEDが 変化するのを確かめよう!!
-Work 02-
LEDを調光制御してみる!その2
PSoCにはきれいに調光するためだけに設計されたPrISMというコンポーネントがある。色は色相環に従って徐々にR->G->Bと遷移するようにしてみる。
SWに連動して各LEDが切り替わるのは同じ。青字は気にせず、こんな風に配置してね。
Wikipediaから抜粋
基本はあまりかわらない。一定時間ごとに色相情報からRGBを生成するだけ。Hは色相だけどSとVはフル値固定。
色相(H)を0~359までぐるぐるまわす
SWが押し下げられたら、出力LEDを切りかえる
割り込み部はタイマーだけ
PrISMに値を与える部分。IはHSVのSと等価のはず。まぁ、今回は関係ないけどね。
HSVRGB変換部。ネットにあったJavaのサンプルほぼそのまま。。。
-Work 03-
LEDを調光制御してみる!その3
BLEを使えるようにしてみる。まずは、BLEのコンポーネントを追加する。
できたら、いったんBuildする!
カスタムプロファイル でGATT Server設定する。
GAP は Peripheral でOK.
Profileタブで 新たに サービス追加。Server部で右クリックして、Custom Serviceを選択すればOK
追加された Custom Serviceを RGB LED Serviceにリネーム(わかりやすくするため)同じく その下の CharacterristicもRGB LED Characterristicにリネームしとく。
標準サンプルを使いたいのでUUIDは16bit 値で CBBB にする。
標準サンプルを使いたいのでUUIDは16bit 値で CBB1 にする。Fields = uint8 array = 4 Read / Write にチェック
Custom Descripterは削除しちゃって、代わりにUser Descriptionを追加!
RGB LED Controlとか、適当に名前をつけとく
BLE 03 とか、適当に名前をつけとくここの名前で、自分の接続先デバイスかどうかを判別するので適当に。。。(できるだけ短くしてね)
Advertisement Packetの項目で
Local NameService UUID
をチェックしとく。
Securityの項目で
No SecurityNo Input No OutputNo Bonding
を設定
これでコンポーネントの設定は終了。
OK で 終了できる
一旦、ビルドするといろいろファイルが付加される。
ただ、肝心のやりとりする部分がないので、Cypressのサンプルから、ファイルをもってくる。(BLE_Handler.c)
割り込み応答用の関数void StackEventHandler( uint32 eventCode, void *eventParam )
で、状態を判定できるので、全部入りがうれしい。
このファイルを、プロジェクトに追加する。(今回は、それなりに用意。) ソースは別途みてね。
void StackEventHandler( uint32 eventCode, void *eventParam )
のなかで、CYBLE_EVT_GATT_DISCONNECT_IND接続断の場合の処理を追加。
CYBLE_EVT_GATTS_WRITE_REQ: 書き込み指示があったら更新する。
あとは main.cの初期化部にCyBle_Start( StackEventHandler );
を実装すれば、割り込み処理される!
CyBle_Start( StackEventHandler ); // BLE関連のイベントハンドラを別ファイルに定義for(;;){
CyBle_ProcessEvents(); // BLE ハンドル処理
スマホのCySmartで接続したら、LEDの調光画面がつかえるよ~~
スマホにCySmartアプリを導入して起動すると。。。
UUIDを合わせてあるので、標準アプリのRGB調光部がそのままつかえる
~あとがき~BLE部はかなり端折ってしまってるorzでも、標準のサンプルからもってくればそれほど難しくない。というか、ほかのBLEデバイスにはないくらい、隠蔽してくれている。
BLEデバイス側をつくるには、最小限、これでいいって思えるくらい。Service – Characteristicの部分は、これの延長で、適当にすればなんとかなりそう。
ただ、BLEの部分は割り込みで処理されるので、mainなどの通常処理との間では排他処理など、少し考えないとダメ。
そこらあたりは、おいおい、やりましょー。
お疲れ様でした!
~あとがき~