2017年12月11日月曜日
PSoC5LP で USB-HIDデバイスでもしてみるか。。。( PSoC Advent Calender2017 )
PSoC Advent Calender 2017 の 記事の2こめです。
PSoC5LPにはUSB がついています。
これ、案外USB UARTくらいしかつかっていないんですが
普通にHIDデバイスとしても作ることができます。
今回はMouseにしてみます。
といっても、マウスなら、ちゃんとサンプルが用意されているんですよね。
スケマティックにUSBFSを配置して、右クリックメニューから出る
Find Code Example ...
を実行します。
すでにUSBFSが選ばれているので、関連するものがでてますね。
今回はとりあえず
USBFS_HID
を選択します。
3-Button mouseって書いてあるので、大丈夫そうですね。
よければ、Create Project を押します。
ん!エラー? はぁ???
このメッセージわかりにくいよね。まったく。
要はこれは
『そのままではインポートされていないので、Webからとってきてね!』
というメッセージ。じゃ、どうするの?ってなるんだけど、
左はしの地球のアイコンをクリックすると、勝手にダウンロードされてくるので
そのままプロジェクトをつくります。
できたプロジェクトはデバイスが PSoC3になっているので
利用するPSoC5の型番に変更します。
PrototypingKitでは、CY8C5888LTI-LP097ですね。
WorkSpace Explorerの Project部で右クリックして
Device Selecter
を出し、ここで選択しなおします。
できたら、ビルドします。
スケマティックをみても、USBFSしか配置されていないので、基本は
これでエラーもでないはずです。
自動でピン配置もUSBピンはセレクトされているはずなので
大丈夫なはず。
添付のPDFの最後のところに
================================
Expected Results
You should see that the device is recognized as a 3-button mouse. The mouse is continuously moving back and forth horizontally.
================================
ってなっているので、マウスになってカーソルを水平移動でうごかすよ。
ってよめますね。
うごきましたか?
で、この設定、どこできまるんだ?ってことなんですが
一番わかりにくいのは HID Report Descriptersなんですよね。
なんじゃそら、と。
Device Class Definition for HID 1.11 (PDF)
を参照してみてください。
page81 (表題ページ番号71)にマウスの定義サンプルが挙げられています。
ね、このとおりの定義を書いてるだけですね。
あとは 3バイト用意して、一定のタイミングで
値をセットしておくりかえせばいいんですね。
このやりかたをしっておくと、JoyStickもキーボードもつくれますね!
ラベル:
Advent Calender,
HID,
PSoC,
USB
2017年12月5日火曜日
Uartのボーレートチェンジを実装してみる( PSoC Advent Calender2017 )
とうとうこんな季節になってしまった。
いまだに炎上案件抱えてひーひーゆうてるのに。
PSoC Advent Calender 2017 の 記事を!って頼まれたのでそれをば。
さて、PSoC のUARTってコンポーネント、ポンっ!ってかんじで
いいので、とっても簡単なんですがね、ほかのマイコンなら
途中でボーレートチェンジ!なんて簡単にできるのに

この部分はAPIとしてはParityは公開されているけれど、
肝心の速度は公開されてないので、なんともならない。
きっかけは MonoWirelessのTWELiteの書き込みがPSoCからしたいよね!的な
ところから始まったんだけど。
PC <--USB--> PSoC <--UART-->TWELite
っていう感じでつかって、モード変更で書き込み対応したいとか。
で、やってみた。
Design Wide Resources (.cydwr)をひらいて Clockタブを見てみる。
やっぱり、UART_1_IntClockを引き込んでいる。
今回は115200bps = 115.2kHzがほしい設定なので
サンプリングを8倍した 921.6kHzを生成してるわけですね。(最下行)
この921.6kHzを生成するのに、64MHzを69分周して近似の
927.536kHzを出してるというのはわかる。
ということなら
このDividerを変更したらよくね?
UART_1のコードの下に、UART_1_IntClock.cというのができてる。
このなかに SetDividerRegister()関数という、もうそのままのネーミングの
関数あるじゃんと。
これをよべばよさげですよね。
===================================
===================================
ぼくの場合だと
#define HS115200 69
#define HS57600 139
#define HS38400 208
#define HS19200 417
#define HS9600 833
ってかんじですかね。
ここらは計算でする方法もあるし、あるていど決め打ちでもいいかも
ですね。
64000(kHz) / (欲しい周波数(kHz) * 8) = divider
ってかんじですね。
いまだに炎上案件抱えてひーひーゆうてるのに。
PSoC Advent Calender 2017 の 記事を!って頼まれたのでそれをば。
さて、PSoC のUARTってコンポーネント、ポンっ!ってかんじで
いいので、とっても簡単なんですがね、ほかのマイコンなら
途中でボーレートチェンジ!なんて簡単にできるのに
この部分はAPIとしてはParityは公開されているけれど、
肝心の速度は公開されてないので、なんともならない。
きっかけは MonoWirelessのTWELiteの書き込みがPSoCからしたいよね!的な
ところから始まったんだけど。
PC <--USB--> PSoC <--UART-->TWELite
っていう感じでつかって、モード変更で書き込み対応したいとか。
で、やってみた。
Design Wide Resources (.cydwr)をひらいて Clockタブを見てみる。
やっぱり、UART_1_IntClockを引き込んでいる。
今回は115200bps = 115.2kHzがほしい設定なので
サンプリングを8倍した 921.6kHzを生成してるわけですね。(最下行)
この921.6kHzを生成するのに、64MHzを69分周して近似の
927.536kHzを出してるというのはわかる。
ということなら
このDividerを変更したらよくね?
UART_1のコードの下に、UART_1_IntClock.cというのができてる。
このなかに SetDividerRegister()関数という、もうそのままのネーミングの
関数あるじゃんと。
これをよべばよさげですよね。
===================================
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
void setBitRate(uint32 rate) | |
{ | |
uint16 div; | |
switch( rate ){ | |
case 57600: div = HS57600; break; | |
case 38400: div = HS38400; break; | |
case 19200: div = HS19200; break; | |
case 9600: div = HS9600; break; | |
case 115200: | |
default: | |
div = HS115200; | |
break; | |
} | |
UART_1_Stop(); | |
UART_1_IntClock_SetDividerRegister(div, 1); // 設定変更+リスタート | |
UART_1_Start(); | |
} | |
===================================
ぼくの場合だと
#define HS115200 69
#define HS57600 139
#define HS38400 208
#define HS19200 417
#define HS9600 833
ってかんじですかね。
ここらは計算でする方法もあるし、あるていど決め打ちでもいいかも
ですね。
64000(kHz) / (欲しい周波数(kHz) * 8) = divider
ってかんじですね。
ラベル:
Advent Calender,
PSoC,
UART,
ボーレートチェンジ
2017年10月11日水曜日
TWELite-RED
久々に更新。
MonoWirelessのTWELiteに高出力版のREDが追加されました。
うちもいろいろと使っているので、
『どのくらい変化するんかな?』
というのが、気になるところ。
うちの場合、双方向でバリバリ通信したい!ってのは少なくて
デバイス側からデータをとにかく送りたい!的な用途なので
距離が伸びてくれるのはありがたいんだけど、
まだ、TWELiteのチップだけ、ってのは発売されてない。
とりあえず、TWELiteDIPでテストしてみた。
MonoStick-RED <---- TWELiteDIP-RED ざっくり50mくらい
MonoStick-RED <---- TWELite(CHIP) + BLUE ざっくり20mくらい
という印象。
REDxREDの組み合わせで、おおお!ってなるくらい飛ぶのは
ある意味予測していたけれど、スティック側だけREDにしても5~6mは
距離が延びるのはちょっと意外。
しかも、RED自体の処理が安定している印象で、
BLUEだと離れるにしたがって受信がギコギコするような感じになるのに
REDだとほぼ安定状態が継続する、というかんじで、安心感がある。
すくなくとも、MonoStick側だけでもREDにする価値はありそう。
で、REDがラインナップに追加されたのにともない、
開発ツール類も TWESDKからMWSDKに変更になっている。
まぁ、TWEってのをMWにしたくらいしか見た目は変わりない。
ただ、問題は、MWSDKで提供されるファーム群のコンパイルは
そのままではTWESDKとなんら変わりなく、RED用にはならないこと。
ぼくのばあいは、ほとんど独自にファームを改変しているので
これは結構困る。。。
で、M社のO氏に教えてもらって、なんとかRED用ファームを
つくることができるようになったので、その備忘録として、
記録しておく。
1.Eclipseは
c:\MWSDK\ECLIPSE.cmd
を実行することで、おこなう!(これ重要)
2.Wks_TWELITEフォルダをワークスペースにする。
3.生成したいプロジェクトをひらく。
4.生成したいプロジェクトの右クリックでプロパティをひらき
(1) C/C++ ビルド => ビルドコマンド[ビルダー設定]を
make TWELITE=RED APP_UART_CONFIG=CONFIG_NORMAL
にする。BLUEの場合は
make TWELITE=BLUE APP_UART_CONFIG=CONFIG_NORMAL
(2) C/C++ ビルド => ビルドコマンド[振る舞い]で
Enable parallel build
のチェックをはずす。
(3) C/C++ ビルド => 環境 で
PATH
をえらんで、削除ボタンをおす。
すると、値の部分が新たに設定される。
ここまでできていればOKなのであとは、プロジェクトにもどって
ビルドすれば、xxx-REDというバイナリ(BLUEの場合はそれなり)が生成される。
ねー。めんどくさい。
モノワイヤレスさん、もうすこし、親切にしてほしいなぁ(笑)
MonoWirelessのTWELiteに高出力版のREDが追加されました。
うちもいろいろと使っているので、
『どのくらい変化するんかな?』
というのが、気になるところ。
うちの場合、双方向でバリバリ通信したい!ってのは少なくて
デバイス側からデータをとにかく送りたい!的な用途なので
距離が伸びてくれるのはありがたいんだけど、
まだ、TWELiteのチップだけ、ってのは発売されてない。
とりあえず、TWELiteDIPでテストしてみた。
MonoStick-RED <---- TWELiteDIP-RED ざっくり50mくらい
MonoStick-RED <---- TWELite(CHIP) + BLUE ざっくり20mくらい
MonoStick-BLUE <---- TWELite(CHIP) + BLUE ざっくり15mくらい
という印象。
REDxREDの組み合わせで、おおお!ってなるくらい飛ぶのは
ある意味予測していたけれど、スティック側だけREDにしても5~6mは
距離が延びるのはちょっと意外。
しかも、RED自体の処理が安定している印象で、
BLUEだと離れるにしたがって受信がギコギコするような感じになるのに
REDだとほぼ安定状態が継続する、というかんじで、安心感がある。
すくなくとも、MonoStick側だけでもREDにする価値はありそう。
で、REDがラインナップに追加されたのにともない、
開発ツール類も TWESDKからMWSDKに変更になっている。
まぁ、TWEってのをMWにしたくらいしか見た目は変わりない。
ただ、問題は、MWSDKで提供されるファーム群のコンパイルは
そのままではTWESDKとなんら変わりなく、RED用にはならないこと。
ぼくのばあいは、ほとんど独自にファームを改変しているので
これは結構困る。。。
で、M社のO氏に教えてもらって、なんとかRED用ファームを
つくることができるようになったので、その備忘録として、
記録しておく。
1.Eclipseは
c:\MWSDK\ECLIPSE.cmd
を実行することで、おこなう!(これ重要)
2.Wks_TWELITEフォルダをワークスペースにする。
3.生成したいプロジェクトをひらく。
4.生成したいプロジェクトの右クリックでプロパティをひらき
(1) C/C++ ビルド => ビルドコマンド[ビルダー設定]を
make TWELITE=RED APP_UART_CONFIG=CONFIG_NORMAL
にする。BLUEの場合は
make TWELITE=BLUE APP_UART_CONFIG=CONFIG_NORMAL
(2) C/C++ ビルド => ビルドコマンド[振る舞い]で
Enable parallel build
のチェックをはずす。
(3) C/C++ ビルド => 環境 で
PATH
をえらんで、削除ボタンをおす。
すると、値の部分が新たに設定される。
ここまでできていればOKなのであとは、プロジェクトにもどって
ビルドすれば、xxx-REDというバイナリ(BLUEの場合はそれなり)が生成される。
ねー。めんどくさい。
モノワイヤレスさん、もうすこし、親切にしてほしいなぁ(笑)
ラベル:
IEEE802.15.4,
MonoWireless,
MWSDK,
TWELite,
モノワイヤレス
登録:
投稿 (Atom)