2017年3月20日月曜日

PSoC CreatorでPWMサーボを制御(2017東海北陸ミニロボ)



2017/03/19から2日間に渡って
ロボコンの東海北陸地域の高専の交流会がありました。

今回の交流会は第二回ということでまだまだ歴史の浅い交流会
でしたが、私は今回が初参加ということで
正直あんまり期待していませんでしたが、
思いの外皆さんのプレゼンが面白くて、
そして私も良い刺激を受けることができました。
この場を借りて幹事の方々、イベント関係者様に感謝申し上げますm(_ _)m

さて、二日目の展示で釣れるかわからないですが、
富山射水のテーブルでPSoC5LPで書いた
PWMサーボのソースを公開しておりました。

みなさんのお話を聞いてると、存在は知っているが
ほとんど使ってないという方が結構おられて
正直知ってる人が割りといて驚きました(笑)

きっと皆さんがPSoCに手を出してない大きな理由として
情報が少ないというのがあると思います。
私も最初はそれに手こずりましたが、
基礎的な部分の壁を超えると、応用の方は
結構ググれば情報が出てきました。

なのでそこはなんとか気合でがんばって乗り切りましょう
(;´∀`)

PSoCは昔の開発環境としてPSoCDesignerと言うものがありましたが、
2010年頃にCypressはPSoC Creatorという全くあたらしい
開発環境を発表すると同時に後発のPSoCもPSoCCreatorに対応したものとなりました。

まあ、それはいいのですが、PWMのサーボの情報が
昔のPSoCDesignerの方のものしか無い!!
という状況に陥り、悩んだという事態に陥りました。
ですが、なんとかPSoCCreatorにてPWMサーボを扱えたので
備忘録として残しておこうと思います。

とりあえずC++にしてますが、
もしCのほうがいいという方がおられたら、
コメントいただけるとなんとかCのもあげます。
なお、修正点や改善点等ございましたら、
ぜひコメントいただけるとすごくうれしいです。

環境はPSoCCreator4.0
PSoC5LP prototyping kit
  1. ifdef __cplusplus
  2. extern "C" {
  3. #endif
  4. #include <project.h>
  5. #ifdef __cplusplus
  6. }
  7. #endif
  8.  
  9.  
  10. class CompareConverter{
  11. public:
  12. int us2compare(int servonum){
  13.  
  14. if(635>servonum){
  15. return 316;
  16. }
  17. if(2350<servonum){
  18. return 1175;
  19. }
  20. return 315+((servonum-635)/2);
  21. }
  22. int degree2compare(int Servonum){
  23. float servonum = (float)Servonum;
  24. if(0>servonum){
  25. return 316;
  26. }
  27. if(180<servonum){
  28. return 1175;
  29. }
  30. return 315+((servonum)*4.77);
  31. }
  32. };
  33.  
  34.  
  35.  
  36. int main(void)
  37. {
  38. CyGlobalIntEnable; /* Enable global interrupts. */
  39. CompareConverter compconv;
  40. //通電確認用
  41. power_Write(1);
  42.  
  43. for(;;)
  44. {
  45. PWM_1_WriteCompare(compconv.degree2compare(90));
  46. }
  47. }
  48.  

ピン配置、PGAの配置等


PWM自体の設定


電源はPSoCのVCCとGNDで
PWMの信号は1_6ピンに刺すと
サーボモータが90度を指すところに回転する...はず(笑)
只今帰宅途中のバスで書いてるので実際試してないです(おい

ちなみに2_1のピンに設定してあるpowerってのは
ただのPSoC通電確認用です。