
はじめての手作りマイコンロボット実験セットのプログラムです ご自由に改造して使ってください
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Sun Jul 24 2022 20:32:24 by
