はじめての手作りマイコンロボット実験セットのプログラムです ご自由に改造して使ってください

Dependencies:   mbed

main.cpp

Committer:
kohacraft
Date:
2016-10-21
Revision:
0:ebf41685fa06

File content as of revision 0:ebf41685fa06:

//はじめての手作りマイコンロボット実験セットのプログラムです
#include "mbed.h"

PwmOut ude1(dp1);   //右の腕のサーボモータ制御に使います
PwmOut ude2(dp2);   //左の腕のサーボモータ制御に使います

DigitalOut asi1(dp18);  //右のモーターを動かすのに使います
DigitalOut asi2(dp24);  //左のモーターを動かすのに使います

DigitalOut sp(dp4); //モーター動作中の時にONになります


DigitalIn mae(dp10);    //両方のモータを回すためのスイッチをつなぎます
DigitalIn hidari(dp11); //左のモータを回すためのスイッチをつなぎます
DigitalIn migi(dp9);    //右のモータを回すためのスイッチをつなぎます

DigitalOut me1(dp13);   //まばたきする目のLEDをつなぎます
DigitalOut me2(dp14);   //まばたきする目のLEDをつなぎます


//タイマー割り込みでうでをふる
//sin関数を使い振り子のようになめらかに行ったり来たりするようサーボモーターを動かします
Ticker udehuriTimer;
float kakudo=0.0;
void udehuri() {
    kakudo += 360/100;  //タイマー割り込みが実行されるごとにsin関数の角度を360/100度ずつ増やします
                        //100の部分を50などに減らすと腕の振りが速くなり、200などに増やすと振りが遅くなります
    if( kakudo > 360 ) //最大角度を超えたら0度に戻す
        kakudo = 0.0;
    float ude;
    ude = ( sin( kakudo *2*3.14/360 ) + 1.0 )/1.5 + 1.0; //1から2くらいになる
        //sin( kakudo *2*3.14/360 )+1.0 は0→2→0→2と0~2の範囲でなめらなに行ったり来たりする式です
        //その値を1.5で割るので0~1.3の範囲で変化し、最後に1.0を足すので1.0~2.3の範囲の値になります。 
        //サーボモーターに設定できる値は0.5~2.5の範囲内です。この時サーボの角度は約180度動きます
        //上記のプログラムでは約半分の100度程度腕を振ります
        //ude = ( sin( kakudo *2*3.14/360 ) + 1.0 )/1.0 + 0.5;
        //とすると0.5~2.5の範囲になり、腕が最大の振り幅の180度になります
    ude = ude / 20.0; //サーボのPWMの幅の比率に変換します
    
    ude1 = ude;
    ude2 = ude;
}

//タイマー割り込みでまばたきさせる
Ticker blink;
void mabataki(){
        me1 = 0;    //目のLEDをOFFします
        me2 = 0;
        wait(0.05); //0.05秒待って
        me1 = 1;    //目のLEDをONします
        me2 = 1;
}

int main() {
     
    
    asi1 = 0;
    asi2 = 0;
    ude1.period_ms(20); //サーボモーターの制御信号の周期が20msなのでその設定をします
    ude2.period_ms(20);    
    ude1 = 1.5/20.0;    //腕を真ん中の角度にします
    ude2 = 1.5/20.0;
    
    me1 = 1;
    me2 = 1;
    blink.attach(&mabataki, 4.0);   //4秒ごとにまばたきのプログラムが実行されるようタイマー割り込みをセットします
    while(1)
    {
        //前ボタンでで両方の足が回る
        if( mae == 1 )
        {
            sp = 1;
            udehuriTimer.attach(&udehuri, 0.02);//0.02秒ごとに腕振りのプログラムが実行されるようタイマー割り込みをセットします
            asi1 = 1;   //右のモーターを回転させます
            asi2 = 1;   //左のモーターを回転させます
            wait(0.1);  //0.1秒モータを回転させたまま待ちます
            udehuriTimer.detach();  //腕振りのタイマー割り込みを終了させます
            asi1 = 0;   //右のモーターを停止させます
            asi2 = 0;   //左のモーターを停止させます
        }
        
        //右ボタンで右のモーターが回る
        if( migi == 1 )
        {
            sp = 1;
            udehuriTimer.attach(&udehuri, 0.02);
            asi1 = 1;   //右のモーターを回転させます
            wait(0.1);
            udehuriTimer.detach();
            asi1 = 0;   //右のモーターを停止させます
        }
          
        //左ボタンで左のモーターが回る
        if( hidari == 1 )
        {
            sp = 1;
            udehuriTimer.attach(&udehuri, 0.02);
            asi2 = 1;   //左のモーターを回転させます
            wait(0.1);
            udehuriTimer.detach();
            asi2 = 0;   //左のモーターを停止させます
        }
        
        //全てのボタンを押してなければ音楽を止める
        if( mae == 0 && migi == 0 && hidari == 0)
        {
            sp = 0;
        }            
            
    }
     

}