RPU-10講座/第六章 ボタンとロータリースイッチでブザーオン
すいません m(_ _)m、本記事はブログ引越時に書式が崩れました。順次修正中です。
RPU-10にはブザーも搭載されていますので、せっかくなのでこれを使ってみたいと思います(というか、実は宇宙大会選抜競技時、SISOにとって非常に重要なアイテムだった)。
■ブザーといいながら、実はスピーカみたい
で、このブザーみたいなもの、どうやらスピーカーみたいです。というのも、RPU-10から鳴らすときに、数値を設定すると音程が変わるので。恐らく、PWM出力端子かなんかに接続されていて、PWM周波数を変えることで音程を変えているんでしょう。
いろいろ試してみたら、「数値が小さいほど音が高く、大きいほど低い」ことがわかりました。実際に聞こえるというか、実用範囲は8~500ぐらいです。
■ロータリースイッチとあわせ技でサンプル
というわけで、さっそくサンプルプログラムを作ってみました。「プー」だけ鳴っても面白くないので、ロータリースイッチを回すと音程が変わるようにしてみました。ロータリースイッチを適当なところにあわせて、RPU-10上面のボタンを押すと、適当な音が鳴ります。
あと、urouroさんから便利なconst領域の宣言方法を教わりましたので、紹介します。L34の以下の行です。
rs0_puts_P( PSTR( “BUZZER TEST PROGRAM” ));
以前は、constとPROGMEMを使って、冒頭で宣言していたりしたんですが、このマクロを使えば使用時に宣言できるようです。これは便利なので、早速使ってみることにします。今まで
const char GPtitleData[] PROGMEM = “BUZZER TEST PROGRAM”;
と宣言してから
rs0_puts_P( GPtitleData );
としていたのが、最初の一行だけで済むようになります。これは便利なので、他にもこの手のマクロが無いか調べてみます。いちおう、MAPファイル(リンク後に、関数とかデータをこう割り付けたよー、というのが書いてあるファイル)を確認してみたんですが、よくわかりませんでした…。マイコンでプログラム、いろいろ書いてたりしますけど、こういうところ結構弱かったりします。
1: //—————————————————————————————-
2: // ブザーを鳴らします。
3: // プッシュボタンが押されたときに、ブザーを鳴らします。ロータリースイッチによって
4: // 音程をかえることができます。がんばれば音楽も鳴らせるかも。
5: //
6: // 環境 RPU-10、GDL V2.00
7: // 説明 ビルドされた本プログラムをRPU-10へ転送後、RPU-10を再起動するとスタートします。
8: // 特にシリアル出力は行っていませんので、RPU-10単体でお楽しみください。とにかく
9: // 音を鳴らすためだけの手抜きなプログラムなので、実際に使われるときは、もう少し
10: // かっこよく実装してください。
11: //
12: // AUTHORED BY SISO JUNK STDUIO
13: //—————————————————————————————-
14: #include <avr/pgmspace.h>
15: #include <avr/io.h>
16: #include <avr/interrupt.h>
17: #include <avr/eeprom.h>
18: #include <stdio.h>
19: #include <avr/boot.h>
20: #include <avr/wdt.h>
21:
22: #include <sv.h>
23: #include <rs.h>
24:
25:
26:
27: int main( void )
28: {
29: RPU_InitConsole( br115200 ); // RPU-10ライブラリの初期化
30: SV_Init( br115200 ); // サーボ制御ライブラリの初期化
31: sei(); // 割り込み処理開始
32:
33: // 起動メッセージの表示
34: rs0_puts_P( PSTR( “BUZZER TEST PROGRAM” ));
35:
36: // 1秒待つ(よく知らないけど必要らしい)
37: RPU_ResetTimerCounter();
38: while( RPU_GetTimerCounter10() < 100 );
39:
40: while( 1 ){
41: if( RPU_IsPushButton() == 1 ){
42: RPU_Buzzer( RPU_GetRotarySwitch() * 30 + 8 );
43: while( RPU_IsPushButton() == 1 );
44: }
45: else{
46: RPU_BuzzerOff();
47: }
48: }
49:
50: return 1;
51: }
■今回使用した関数
- short RPU_GetRotarySwitch( void )
ロータリースイッチの値を読み取ります。処理時間は49usecほど。この関数を呼ぶと、ロータリースイッチの値がそのまま返って来ます(0~F)。それだけです。 - short RPU_Buzzer( short sound )
ブザーを鳴らします。soundは、分周値の方みたいで、数値が大きいほど低い音が鳴ります。実用的には8~500ぐらい。戻り値は調べていません。 - short RPU_BuzzerOff( void );
ブザーを止めます。戻り値は調べていません。
音楽鳴らすのは難しそうですが、出力ポートにつながっているので、時間をかければいろいろできるかもしれません(昔、MZ-2000というコンピュータがあって、1ビット出力で和音とか出してました。懐かしい…)。
※注意:本BLOGにてRPU-10での再プログラミングについての情報を公開していますが、これらはSISOが個人的に再プログラミングを行った時の技術情報を整理して紹介しています。GDLへのRPU-10ライブラリ同梱については、Best Technologyさんのご好意で、趣味人への1つのチャンスとして同梱してくださっていると理解しています。そのため、RPU-10の再プログラミングについては、くれぐれもご自身の責任で、また、Best TechnologyさんやFUTABAさんに問い合わせたりすることの無いようにお願いいたします。
MZ-2000 に反応してしまった!!
私は、MZ-80B を持ってました。懐かしいですな~。RPU-10 かなり、楽しそうです。G-ROBOTSでも購入して、RPU-11をRPU-10化して、遊んでみようかなと計画中です。多くの人は、マイコンのシステムはそのままで、外装を変えますが、へそ曲がりの私は、外装はそのままで、マイコンのシステムに手を加えてみたいと企んでいます。