RPU-10講座/第五章 電源電圧と加速度センサーの読み取り
すいません m(_ _)m、本記事はブログ引越時に書式が崩れました。順次修正中です。
第一回のときに、RPU-10に加速度センサや電源電圧センサ(というか、電源電圧をA/D変換できるというか)がついているという話を書きましたが、今回、せっかくなのでこれを読み取るプログラムを作ってみようと思います。やはり、自作プログラムとはいえ、リポバッテリを使う以上は電源電圧管理は必須だと思います。また、それらのデータを表示するために、書式付RS232C出力を使ってみようと思います。
■センサ値の読み取り
既にGDLのライブラリには関数が用意されていますので、それを素直に使用させていただくことにします。
short RPU_GetBattery( void );
short RPU_GetGSensor( unsigned short *gx, unsigned short *gy, unsigned short *gz );
これらの関数を呼ぶだけで、電源電圧と加速度センサ値を読み取ることができます。RPU_GetBattery()は、電圧を10倍した値になるように、関数の中で調整されているようですので、
読み取った値をそのまま使っても、それらしい値になります。しかし、RPU_GetGSensor()の方は、
ある値を中心として上下に振れるような値になります。
■書式付RS232C出力
実は「printf」が使えたりするので、そっちを使ってもいいのですが、Flash ROM領域に書式データを用意し、それを使って表示させたいので、別の関数を使います。実は、GDL、ATmega128用のターゲットをインストールすると、おまけでサンプルライブラリが一緒にインストールされるのですが、この中に、rs0_printf_P()という便利な関数があります。
これは、簡易ではありますが、整数に関してはだいたいの機能が実装されたprintf処理で、Flash ROM領域にある書式データを使ってデータを表示する機能を持っています。
この機能はソースコードで提供されているので、あまり美しいやり方ではありませんが、直接、メインのプログラムにインクルードしてコンパイルすることにします。また、今回使用しませんが、RAM用もありますので使ってみたい方はいろいろ試してみてください。
インクルードは、以下のようにします。
#include <../ATmega128/rs0_printf_P.c>
もともと、コンパイルオプションとしてインクルードディレクトリが設定されていますので、そこから相対パスで指定しています。ソースの中を見ていただければわかりますが、この中には、rs0_printf_P()という関数が定義されており、普通のprintf()のように使用することができます。実際の使い方については、サンプルプログラムを見てください。機能限定がありますので、使用時は注意してください(小数点は使えないものと思っていください)。
■サンプルプログラム
今回のサンプルプログラムは、起動するとひたすらデータを送り続けます。新しいところはL49~L53のRPU_GetBattery()、RPU_GetGSensor()、それに書式つきRS232C出力のrs0_printf_P()です。あまり細かな説明はしなくても、見ていただければわかるかと思います。
1: //—————————————————————————————-
2: // 電源電圧と加速度センサの値をシリアル端末に連続出力します。
3: // 値をただひたすら表示します。このプログラムを実行しておいて、RPU-10を傾けたりすると
4: // 加速度センサの値が変化します。
5: //
6: // 環境 RPU-10、GDL V2.00
7: // 説明 ビルドされた本プログラムをRPU-10へ転送後、パソコン側で「SIMPLE TERM」(GDLに
8: // 同梱)などを使って通信速度115200bpsで通信ポートを開いてください。その後RPU-10
9: // を再起動するとプログラムがスタートし、「SIMPLE TERM」にひたすらずらずらと値が
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: #include <../ATmega128/rs0_printf_P.c> // URART0用フォーマット(ROM用)
26:
27:
28: const char GPtitleData[] PROGMEM = “VOLTAGE AND G-SENSOR MONITOR”;
29: const char GPformData[] PROGMEM = “DC%d[V(*10)] G-SENSOR X=%d Y=%d Z=%d\n”;
30:
31:
32: int main( void )
33: {
34: short sV; // 電源電圧用変数
35: unsigned short usGx, usGy, usGz; // 加速度センサ用変数
36:
37: RPU_InitConsole( br115200 ); // RPU-10ライブラリの初期化
38: SV_Init( br115200 ); // サーボ制御ライブラリの初期化
39: sei(); // 割り込み処理開始
40:
41: // 1秒待つ(よく知らないけど必要らしい)
42: RPU_ResetTimerCounter();
43: while( RPU_GetTimerCounter10() < 100 );
44:
45: // 起動メッセージの表示
46: rs0_puts_P( GPtitleData );
47: while( 1 ){
48: // 電源電圧と加速度センサ値の取り込み
49: sV = RPU_GetBattery();
50: RPU_GetGSensor( &usGx, &usGy, &usGz );
51: // 値の表示
52: rs0_printf_P( GPformData, sV, usGx, usGy, usGz );
53: }
54:
55: return 1;
56: }
■今回使用した関数
- short RPU_GetBattery( void );
電源電圧を返します。10倍された値が入るようです。「7.4V」ならば「74」って感じ。実行時間はだいたい79usecってところです。 - short RPU_GetGSensor( unsigned short *gx, unsigned short *gy, unsigned short *gz );
加速度センサの値を返します。わりとX、Y、Z軸、どれも似たような値を返す、使いやすい加速度センサが載っている気がします。実行時間はだいたい112usecぐらいです。
※注意:本BLOGにてRPU-10での再プログラミングについての情報を公開していますが、これらはSISOが個人的に再プログラミングを行った時の技術情報を整理して紹介しています。GDLへのRPU-10ライブラリ同梱については、Best Technologyさんのご好意で、趣味人への1つのチャンスとして同梱してくださっていると理解しています。そのため、RPU-10の再プログラミングについては、くれぐれもご自身の責任で、また、Best TechnologyさんやFUTABAさんに問い合わせたりすることの無いようにお願いいたします。
Your Message