PRS-DE07MS通信基礎実験・まとめ その1

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

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

ぼちぼちっとPRS-DE07MSを、ATmega128(BTC068)で通信する実験をやっていましたが、実験完了したのでまとめてアップします。 読み込みコマンド実行と角度指示の書き込みコマンドまでは確認しています。その他の書き込みコマンドや、通信速度を変えた実験はこれからです。





■PRS-DE07MS仕様について
PRS-DE07MSは、アイ・ビーさんが販売しているシリアル通信サーボです。PRS-DE07MSのスペックは、マニュアルをダウンロードして読めばわかりますが、だいたいこんな感じです。



◆コアレスモータ◆デイジーチェーン対応● トルク:7.1kg・cm●スピード:0.11s/60°
●寸法:26×15×33mm●重量30g●最大動作角:180°●動作電圧:4V~9V(7.4V測定)
● 制御方式:シリアル通信(TTLレベル4線)● 200mm/SLケーブル(B20)付属
※PWM方式には対応無し。


2009Q2P003


SISOもPRS-3401(PRS-DE07のケーブル色違い?)を使っていますが、小型ながら力もあって強度もあり、スリムな機体を作ることできる、1kg前後の機体にはいい感じのサーボです。


マイコンとの接続ですが、4線による接続です。サーボにコネクタは2つついてますが、それぞれ、上下が逆になるようになっています。



茶: GND
赤: VIN
橙: RX (マイコンのTXに接続)
黄: TX (マイコンのRXに接続。プルアップ必要)


  


受信線、送信線が別々になっている全二重というのは、ホビーロボット用サーボとしては初めてかもしれませんね。知っている限りでは、送信/受信が 共用になっており(4線式でも)、いわゆる半二重と呼ばれるタイプです。ただ、正直なところどっちがいいのか、今の所よくわからないです。TTLレベルということで、マイコンと直接接続することが可能となります。


■通信仕様
PRS-DE07MSとの通信は、マルチプロセッサ通信で、9ビットデータで行います。サーボIDを送信するときにマルチプロセッサビットをONとし、データ部分を送信するときはOFFにします。ATmega128やH8TINYなどのマイコンは、この機能を持っていますのでそれほど難しいことはありません。


ちなみに、サーボの初期状態ですが、以下のようなっています。




    • 通信速度の初期設定 384000bps

    • IDの初期設定 1(01h)

好みでは、IDの初期値は最大値とかの方がいいなぁ。1って、マシーンに組み込んだとき、普通に使いたい数値だったりするので、初期状態のサーボを機体に直接つないでコンフィグってのがやりにくいんですよね。


■ATmega128での開発
マイコンはここのところお気に入り№1のATmega128を使うことにしました。フラッシュROMの書き込み回数が1万回ですし、計算もなかなか速くて使いやすいので気に入っています。そういえばなんかBest TechnologyのBTC068、ブートローダの仕様が変更されたようですね。ちょっとがっくし。買う時期によって仕様が違うってのはこまるなぁ。


通信について
GDLに付属しているライブラリは、送受信ともに割り込み処理を使っています。メインプログラムから見ると、送信データをバッファにセットしておいて、あとは割り込み処理の方で順次送信していくというやり方です。受信のほうはそのままでもいいと思いますが、送信はマスタープロセッサビットを操作する必要があるので、そのままではうまくいかなさそうです。


また、自作で通信プログラムを組み込むには、まずはGDL付属の通信プログラムを外さないと、割込み処理がGDL付属ライブラリの方に取られてしまうため、何かと不都合が生じますので、RS1(USART1)だけ取り除いたライブラリと新しいコンパイル設定を作成することに挑戦してみようと思います。


心配なことと言えば、PRS-DE07MSの初期値である、384kbpsが出せないことです。BTC068は16MHzのクロックが載っていますが、384000bpsを出そうと思うと…うーん、いい数値がありませんね。1Mbpsならバッチリなのですが、クロック16MHzの場合、倍速許可を使うと割と誓いところがでてきて、UBRR=5, U2X=1で333333bpsか、UBRR=4, U2X=1で400000bps。誤差は+4.16%と-4.16%になります。


GDLで開発環境構築
PRS-DE07MSとの通信ライブラリですが、あれこれ考えてみてちょっといじってみた結果、GDLのライブラリを直接いじってしまうのがいいかな、という結論に達しましたので、GDLのコンパイルオプション/設定リストを追加することで、既存コンパイル環境と分ける形で開発環境を構築することにしました。


設定リストの追加
設定リストの追加方法について、まとめてみました。使用しているGDLはV2.0.0.0で、「C:\Program Files\BestTech\GCC Developer Lite」にインストールされているものとします。また、設定リストの追加は、ATmega128用とATmega+拡張メモリ用、両方作ってみることにします。新しい設定リストの名前ですが、RS1処理を外すのが目的ですので、「No RS1」ということで「NRS1」という名前を使うことにします。以下の手順において、「NRS1」と書いてある部分は好みで変更していただいても構いません。



  1. 「C:\Program Files\BestTech\GCC Developer Lite\TARGET」内の「\ATmega128」フォルダを中身も一緒にコピーして「ATmega128_NRS1」というフォルダにリネームしたフォルダを作ります。

  2. 「C:\Program Files\BestTech\GCC Developer Lite\TARGET\ATmega128_NRS1」内の「atmega128.x」というファイルを、「atmega128_NRS1.x」にリネームします。

  3. また、同じフォルダ内の「atmega128extram.x」というファイルも「atmega128extram_NRS1.x」という名前にリネームします。

  4. 「C:\Program Files\BestTech\GCC Developer Lite\TARGET」内の「ATmega128.DEF」というファイルをコピーして「ATmega128_NRS1.DEF」にというファイルを作ります。

  5. また、同じフォルダ内の「ATmega128EXRAM.DEF」というファイルをコピーして「ATmega128EXRAM_NRS1.DEF」というファイルを作ります。

  6. 「ATmega128_NRS1.DEF」の以下の行を編集します。

    • 「[TARGET]」セクション内の「NAME」データ行を以下のように編集します。
      NAME=”AVR(ATmega128 NRS1)”

    • 「[LD]」セクション内の「ScriptFile」データ行を以下のように編集します。
      ScriptFile=”ATmega128_NRS1\atmega128_NRS1.x”

  7. 「ATmega128EXRAM_NRS1.DEF」の以下の行を編集します。

    • 「[TARGET]」セクション内の「NAME」データ行を以下のように編集します。
      NAME=”AVR(ATmega128 ExtRAM NRS1)”

    • 「[AS]」セクション内の「StartUpRoutine」データ行を以下のように編集します。
      StartUpRoutine=”ATmega128_NRS1\initmcu.c”

    • 「[LD]」セクション内の「ScriptFile」データ行を以下のように編集します。
      ScriptFile=”ATmega128_NRS1\atmega128extram_NRS1.x”

これで、GDLの[ツール]→[コンパイルオプション]→[Compile Option]ダイアログの[設定リスト]にて、「AVR(ATmega128 NRS1)」と「AVR(ATmega128 ExtRAM NRS1)」を選択できるようになります。 
 


まだ通信ライブラリからRS1処理を外していませんが、試しに、新しい設定リストでベストテクノロジーで配布されているサンプルプログラム(smpl1.cを使用)をビルドして動作を確認してみたところ、うまく行きましたので大丈夫そうです。 
 


GDLの通信ライブラリ再構築
USART1用の通信ライブラリを開発するにあたって、まずはGDLに同梱されている通信ライブラリからUSART1用のプログラムを外さないといけません。これは、割込み処理を受けるための関数が既にライブラリの方で書かれているために、後で自作プログラムを入れる時に邪魔になってしまうからです。そこで、USART1の処理を除いたライブラリを構築することができるか確認してみました。


「makelib.bat」というバッチファイルが用意されていますので、これを使うことで再コンパイルすることができそうです。とりあえず確認で、「libm128.a」を削除してから「makelib.bat」を実行してみました。このバッチファイル、実行後にPAUSEするようになっているので、いきなりダブルクリックで起動してみたところ、問題なく生成できました。


次に、USART1の処理をはずしてみます。ソースをみると、USART0とUSART1用にそれぞれソースファイルが分かれていますので割と簡単そうです。以降の作業は、前回作成した新しい設定フォルダに対して行います(デフォルトでインストールした場合、”C:\Program Files\BestTech\GCC Developer Lite\TARGET\ATmega128_NRS1″になります。)


まずは、再構築用のバッチファイルmakelib.batから、USART1に関するビルド情報を削除してしまいます。



  • コンパイル行からの削除
    avr-gcc -g -O3 -Wall -DF_CPU=16000000 -Wstrict-prototypes -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -mmcu=atmega128 -c rs1.c rs0_printf.c rs0_printf_P.c rs0.c rs1_printf.c rs1_printf_P.c
    上記の行からrs1に関する部分を削除して、以下のようにします(なんでこういう順番で書いてあるのかは、ちょっと不思議ですけど)。
    avr-gcc -g -O3 -Wall -DF_CPU=16000000 -Wstrict-prototypes -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -mmcu=atmega128 -c rs0_printf.c rs0_printf_P.c rs0.c

  • ライブラリ構築行からの削除
    avr-ar -rc libm128.a rs0.o rs0_printf.o rs0_printf_P.o rs1.o rs1_printf.o rs1_printf_P.o
    上記の行からrs1に関する部分を削除して、以下のようにします。
    avr-ar -rc libm128.a rs0.o rs0_printf.o rs0_printf_P.o

  • オブジェクトファイル片付けの削除
    以下の削除コマンド行を削除します。
    DEL rs1.o
    DEL rs1_printf.o
    DEL rs1_printf_P.o

次に、削除してもしなくてもどちらでも良さそうなのですが、rs.hの内のrs1に関する関数宣言をすべて削除してしまいます(rs1_init関数宣言からrs1_getchar関数宣言までを削除)。


これで念のために「libm128.a」を一旦削除し、もう一度再構築し、さらにsmpl1.cをビルドして動作確認してみました。smpl1.cはUSART1を使用していないので、テストにちょうど良いと思います。結果はさらっとOKでした。


これで開発環境準備の方は無事、準備完了…っぽいです。

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

関連前後記事

Your Message

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

*

PAGE TOP ↑