Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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
1.7.2