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
ifdef __cplusplus
extern "C" {
#endif
#include <project.h>
#ifdef __cplusplus
}
#endif


class CompareConverter{
    public:
        int us2compare(int servonum){

            if(635>servonum){
                return 316;
            }
            if(2350<servonum){
                return 1175;
            }
            return 315+((servonum-635)/2);
            
        }
        int degree2compare(int Servonum){
        
            float servonum = (float)Servonum;
           
            if(0>servonum){
                return 316;
            }
            if(180<servonum){
                return 1175;
            }
            return 315+((servonum)*4.77);
        }
};



int main(void)
{
    CyGlobalIntEnable; /* Enable global interrupts. */
    CompareConverter compconv;
    
    //通電確認用
    power_Write(1);

    for(;;)
    {
        PWM_1_WriteCompare(compconv.degree2compare(90));
       
     
    }
}


ピン配置、PGAの配置等


PWM自体の設定


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

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