RPU-10講座/第十五章 サーボ角度の取得

公開日:  最終更新日:2014/06/05

すいません m(_ _)m、本記事はブログ引越時に書式が崩れました。順次修正中です。

「キャプチャ」とか呼ばれていますが、本章ではサーボの現在角度を読み取ります。RS301を使うと、サーボ角度だけじゃなくて、いろいろな情報を取得することができますので、自作で支援ソフトなんかを作るときには妄想が膨らんじゃいますが、まずはとても重宝する、「現在角度の読み取り」をやってみようと思います。今回紹介するやり方を応用すれば、いろいろな情報をサーボから取得することができるので、みなさんで拡張してみてください。モーションエディタに、サーボの温度とか流れている電流量とか表示されたらおもしろいと思いませんか?


■どのようにして角度を読み取るか?
以前にも説明しましたが、RS301に何かを指示したり情報を取得するためには、RS301のメモリを読み書きする必要があります。サーボの現在位置も、同様にRS301から読み出すことによって知ることができます。


どのようなデータがどこに配置されているかを知るためには、「RS301CR/RS321CD取り扱い説明書」を読む必要があります。この説明書の「3.可変(RAM)領域のメモリーマップ」を読むと、アドレス№42と43を読み込めば「現在位置」を取り出せることがわかります。


「現在位置」は、10倍された数値を2バイトで表現します。RS301の場合、小さい桁の方が先になりますので、例えば「0x001E」…いきなり16進数ですいません。10進数で30になります…というデータがあった場合、アドレス№42は「0x1E」、アドレス№43は「0x00」という値になります。


あえて「RS301の場合」と書いたのは、マイコンによってデータの順番が異なることからです。ガリバー旅行記の卵なわけですね…ネットで調べてみてください。ATmega128の場合、そのまんまですので、あまり意識することは無いかもしれません。


よって、具体的にはSV_TxPacket()で必要なアドレス№のデータをRS301に要求し、RS301からのデータをSV_RxPacket()で受信するだけで「現在位置」を知ることができます。また、これを応用すれば、他のデータを読み出すことも可能です。


RPU-10講座/第十章 RPU-10からサーボIDの書き換え」でもチラッと書きましたが、あの章でサーボが接続されていることを確認していた部分が、ほぼそのままこのプログラムの真髄となります。


当たり前といえば当たり前なのですが、サーボからの返事を待つ必要があるため、複数のサーボにコマンドを一度に送信するロングパケットは使えません。


■サンプルプログラム
それではさっそく、サーボから現在位置を取り出してみます。本来、フレームなどで組み上げた状態の場合は、ブレーキモードを使うのがよさげですが、サーボ単体だとサーボホーンを回すのが大変なので、フリーの状態で行います。サーボはID31から33まで、3つとも接続して構いませんが、読み取っているのはID31のみです。


プログラムを起動してサーボホーンをぐりぐりまわすと、値が変化するのがわかると思います。


   1: //—————————————————————————————-
2: // サーボから現在位置を取得します。
3: //
4: // 環境 RPU-10、GDL V2.00
5: // 説明 ビルドされた本プログラムをRPU-10へ転送後、パソコン側で「SIMPLE TERM」(GDLに
6: // 同梱)などを使って通信速度115200bpsで通信ポートを開いてください。その後RPU-10
7: // を再起動するとプログラムがスタートし、画面にサーボ31の現在位置を表示します。
8: //
9: // AUTHORED BY SISO JUNK STDUIO
10: //—————————————————————————————-
11: #include <avr/pgmspace.h>
12: #include <avr/io.h>
13: #include <avr/interrupt.h>
14: #include <avr/eeprom.h>
15: #include <stdio.h>
16: #include <avr/boot.h>
17: #include <avr/wdt.h>
18:
19: #include <sv.h>
20: #include <rs.h>
21:
22: #include <../ATmega128/rs0_printf_P.c> // URART0用フォーマット(ROM用)
23:
24:
25:
26: // データ変換用共用体
27: typedef union {
28: unsigned char aucData[2];
29: short sData;
30: } UNIWORD;
31:
32: //
33: // メインルーチン
34: //
35: int main( void )
36: {
37: unsigned char aucTBuff[256]; // RS485通信用バッファ
38: unsigned char aucRBuff[256]; // RS485通信用バッファ
39: unsigned char aucTxBuff[2]; // RS485送信用データ構築バッファ
40: short sLen; // 受信データ長
41: UNIWORD uniWord; // データ変換用共用体
42:
43: RPU_InitConsole( br115200 ); // RPU-10ライブラリの初期化
44: SV_Init( br115200 ); // サーボ制御ライブラリの初期化
45: sei(); // 割り込み処理開始
46:
47: // 1秒待つ(よく知らないけど必要らしい)
48: RPU_ResetTimerCounter();
49: while( RPU_GetTimerCounter10() < 100 );
50:
51: // 起動メッセージの表示
52: rs0_puts_P( PSTR( “SERVO ANGLE CAPTURE\n” ));
53:
54: // メインループ
55: while( 1 ){
56: // 読み出し要求アドレスの指定
57: // 送信データ長が0なので、aucTxBuffは無くてもいいような気がしますが、
58: // ライブラリの中身がわからないので一応指定しています。
59: SV_TxPacket( aucTBuff, 31, 0x0F, 0x2A, 2, 0, aucTxBuff, 0 );
60:
61: // サーボからのパケット受信
62: // サーボからパケットを受信します。受信したデータは、ヘッダ部分も
63: // 含まれますので、必要なデータ(現在位置情報)は途中から入っています。
64: // またデータはリトルエンディアンなので、unionします。
65: if( SV_RxPacket( aucRBuff, &sLen, _SV_READ_RESPONSE_TIME ) == 10 ){
66: uniWord.aucData[0] = aucRBuff[7];
67: uniWord.aucData[1] = aucRBuff[8];
68: rs0_printf_P( PSTR( “Angle = %d\n” ), uniWord.sData );
69: }
70: else{
71: rs0_puts_P( PSTR( “FAILED COMMUNICATION.\n” ));
72: }
73:
74: // ちょい待ち
75: // あんまりたくさん画面にデータを表示しても見るのが大変なので、
76: // 0.1秒に1回表示するようにします。
77: RPU_ResetTimerCounter();
78: while( RPU_GetTimerCounter10() < 10 );
79: }
80:
81: return 1;
82: }




※注意:本BLOGにてRPU-10での再プログラミングについての情報を公開していますが、これらはSISOが個人的に再プログラミングを行った時の技術情報を整理して紹介しています。GDLへのRPU-10ライブラリ同梱については、 Best Technologyさんのご好意で、趣味人への1つのチャンスとして同梱してくださっていると理解しています。そのため、RPU-10の再プログラミングについては、くれぐれもご自身の責任で、また、Best TechnologyさんやFUTABAさんに問い合わせたりすることの無いようにお願いいたします。

  • このエントリーをはてなブックマークに追加
  • Pocket

関連前後記事

Comment

  1. […] RPU-10講座/第十五章 サーボ角度の取得 […]

Your Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

PAGE TOP ↑