kohacraft Lab
/
kc_robot
はじめての手作りマイコンロボット実験セットのプログラムです ご自由に改造して使ってください
Revision 0:ebf41685fa06, committed 2016-10-21
- Comitter:
- kohacraft
- Date:
- Fri Oct 21 02:04:30 2016 +0000
- Commit message:
- ver1.0
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
mbed.bld | Show annotated file Show diff for this revision Revisions of this file |
diff -r 000000000000 -r ebf41685fa06 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Oct 21 02:04:30 2016 +0000 @@ -0,0 +1,113 @@ +//はじめての手作りマイコンロボット実験セットのプログラムです +#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; + } + + } + + +}
diff -r 000000000000 -r ebf41685fa06 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Fri Oct 21 02:04:30 2016 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/25aea2a3f4e3 \ No newline at end of file