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

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 //はじめての手作りマイコンロボット実験セットのプログラムです
00002 #include "mbed.h"
00003 
00004 PwmOut ude1(dp1);   //右の腕のサーボモータ制御に使います
00005 PwmOut ude2(dp2);   //左の腕のサーボモータ制御に使います
00006 
00007 DigitalOut asi1(dp18);  //右のモーターを動かすのに使います
00008 DigitalOut asi2(dp24);  //左のモーターを動かすのに使います
00009 
00010 DigitalOut sp(dp4); //モーター動作中の時にONになります
00011 
00012 
00013 DigitalIn mae(dp10);    //両方のモータを回すためのスイッチをつなぎます
00014 DigitalIn hidari(dp11); //左のモータを回すためのスイッチをつなぎます
00015 DigitalIn migi(dp9);    //右のモータを回すためのスイッチをつなぎます
00016 
00017 DigitalOut me1(dp13);   //まばたきする目のLEDをつなぎます
00018 DigitalOut me2(dp14);   //まばたきする目のLEDをつなぎます
00019 
00020 
00021 //タイマー割り込みでうでをふる
00022 //sin関数を使い振り子のようになめらかに行ったり来たりするようサーボモーターを動かします
00023 Ticker udehuriTimer;
00024 float kakudo=0.0;
00025 void udehuri() {
00026     kakudo += 360/100;  //タイマー割り込みが実行されるごとにsin関数の角度を360/100度ずつ増やします
00027                         //100の部分を50などに減らすと腕の振りが速くなり、200などに増やすと振りが遅くなります
00028     if( kakudo > 360 ) //最大角度を超えたら0度に戻す
00029         kakudo = 0.0;
00030     float ude;
00031     ude = ( sin( kakudo *2*3.14/360 ) + 1.0 )/1.5 + 1.0; //1から2くらいになる
00032         //sin( kakudo *2*3.14/360 )+1.0 は0→2→0→2と0~2の範囲でなめらなに行ったり来たりする式です
00033         //その値を1.5で割るので0~1.3の範囲で変化し、最後に1.0を足すので1.0~2.3の範囲の値になります。 
00034         //サーボモーターに設定できる値は0.5~2.5の範囲内です。この時サーボの角度は約180度動きます
00035         //上記のプログラムでは約半分の100度程度腕を振ります
00036         //ude = ( sin( kakudo *2*3.14/360 ) + 1.0 )/1.0 + 0.5;
00037         //とすると0.5~2.5の範囲になり、腕が最大の振り幅の180度になります
00038     ude = ude / 20.0; //サーボのPWMの幅の比率に変換します
00039     
00040     ude1 = ude;
00041     ude2 = ude;
00042 }
00043 
00044 //タイマー割り込みでまばたきさせる
00045 Ticker blink;
00046 void mabataki(){
00047         me1 = 0;    //目のLEDをOFFします
00048         me2 = 0;
00049         wait(0.05); //0.05秒待って
00050         me1 = 1;    //目のLEDをONします
00051         me2 = 1;
00052 }
00053 
00054 int main() {
00055      
00056     
00057     asi1 = 0;
00058     asi2 = 0;
00059     ude1.period_ms(20); //サーボモーターの制御信号の周期が20msなのでその設定をします
00060     ude2.period_ms(20);    
00061     ude1 = 1.5/20.0;    //腕を真ん中の角度にします
00062     ude2 = 1.5/20.0;
00063     
00064     me1 = 1;
00065     me2 = 1;
00066     blink.attach(&mabataki, 4.0);   //4秒ごとにまばたきのプログラムが実行されるようタイマー割り込みをセットします
00067     while(1)
00068     {
00069         //前ボタンでで両方の足が回る
00070         if( mae == 1 )
00071         {
00072             sp = 1;
00073             udehuriTimer.attach(&udehuri, 0.02);//0.02秒ごとに腕振りのプログラムが実行されるようタイマー割り込みをセットします
00074             asi1 = 1;   //右のモーターを回転させます
00075             asi2 = 1;   //左のモーターを回転させます
00076             wait(0.1);  //0.1秒モータを回転させたまま待ちます
00077             udehuriTimer.detach();  //腕振りのタイマー割り込みを終了させます
00078             asi1 = 0;   //右のモーターを停止させます
00079             asi2 = 0;   //左のモーターを停止させます
00080         }
00081         
00082         //右ボタンで右のモーターが回る
00083         if( migi == 1 )
00084         {
00085             sp = 1;
00086             udehuriTimer.attach(&udehuri, 0.02);
00087             asi1 = 1;   //右のモーターを回転させます
00088             wait(0.1);
00089             udehuriTimer.detach();
00090             asi1 = 0;   //右のモーターを停止させます
00091         }
00092           
00093         //左ボタンで左のモーターが回る
00094         if( hidari == 1 )
00095         {
00096             sp = 1;
00097             udehuriTimer.attach(&udehuri, 0.02);
00098             asi2 = 1;   //左のモーターを回転させます
00099             wait(0.1);
00100             udehuriTimer.detach();
00101             asi2 = 0;   //左のモーターを停止させます
00102         }
00103         
00104         //全てのボタンを押してなければ音楽を止める
00105         if( mae == 0 && migi == 0 && hidari == 0)
00106         {
00107             sp = 0;
00108         }            
00109             
00110     }
00111      
00112 
00113 }