« 「週刊 ロボゼロ」 第5号(1)背中にバックカバーを取り付ける | トップページ | 最近買ったもの »

Arduinoでロボゼロのサーボを動かしてみよう!(7)

「Arduinoでロボゼロのサーボを動かしてみよう!」の第7回は、前回の続きで、実際にリクエストを送信して、リータンを受け取ってみたいと思いますhappy01paper

oneNewSoftSerialライブラリーのインストール
これまでデジタルピンの1番を使ってサーボにデータを送信していましたが、パソコンとArduinoの通信(1)、および、Arduinoとサーボの通信(2)の両方を使えるようにする為に、

Arduinoデジタルピンの0,1番以外を使ってソフトウエア的にシリアル通信を行える様にする為のライブラリ=SoftwareSerialというのがありますが、このライブラリを使った場合の通信速度が9600bps程度です。
Arduinoscreensnapz004

そこでNewSoftSerialというライブラリーを使います。ここ(Arduiniana)からダウンロードできます。このライブラリーを使うと57600bps程度まで通信速度を使えます。
Safariscreensnapz004

インストール

  • 起動してたら、Arduinoのアプリケーションを終了
  • PreferencesのSketchbook locationに設定されたディレクトリーの中に「libraries」というフォルダを作る
    Arduinoscreensnapz005
  • NewSoftSerial???.zipを解凍
  • 解凍してできたNewSoftSerialのフォルダをlibrariesのフォルダに入れる
    Finderscreensnapz001
  • Arduinoのアプリケーションを起動
  • Sketch>Import Libraryの中にNewSoftSerialがあればインストール完了!
    Arduinoscreensnapz006

twoサーボの通信速度を38400bps(57600bps)以下に設定する
NewSoftModemが対応している通信速度にサーボの通信速度を変更します。

これに関しては「Arduinoでロボゼロのサーボを動かしてみよう!(4)」ですでに説明してありますので、そちらを参考に行って下さいhappy01paper

threeArduinoとRS306MDの配線
配線は前回の「Arduinoでロボゼロのサーボを動かしてみよう!(6)」に書いた配線にまりますhappy01paper
2

fourスケッチ
今回は、モデル番号、電圧、メモリーの30から41番の値を取得するサンプルを作ってみましたhappy01scissors

  • サーボとの通信はデジタルピン4(受信)、5(送信)としました
    NewSoftSerial ServoSerial(4, 5);
  • サーボとArduinoの通信速度は38400bpsで、Arduinoとパソコンの通信速度は115200bpsです。
      ServoSerial.begin(38400); //Arduino<-->Servoを38,400bpsに設定
     
    Serial.begin(115200); //PC<-->Arduinoを115,200bpsに設定
  • モデル番号、電圧、メモリーの30から41番のリクエストパケット
    • リクエストについては前回説明しましたので、そちらを参考にして下さい。
    • なお、RS30xPacketUtilを使って頂くと簡単にパケットが作れます。
  • パソコンからデータを受け取り、サーボへ送信
    スケッチでは、パソコンからA or B or Cのデータを受け取っると、サーボに対応したリクエストパケットを送信するようになっています。
     //リクエスト(送信)
      tx=
    Serial.available();//データ数
      if(tx>0) {
        switch(
    Serial.read()) {
          
    case 65://大文字A
       
     .....................
     
  • サーボからデータを受け取り、パソコンへ送信
    スケッチでは、サーボからデータを受け取ると、そのデータの数ぶん、ひとつづつパソコンへデータを送信するようになっています。
     //リターン(受信)
      rx=ServoSerial.
    available();//データ数
     
    if(rx>0) {
       
    digitalWrite(13,LOW);//LED消す
       
    for(int i=0;i<rx;i++) {
          
    Serial.print(ServoSerial.read(),HEX);
      .....................
          

以下がスケッチですpaper
//------------------------------

#include <NewSoftSerial.h>

NewSoftSerial ServoSerial(4, 5);// サーボとの通信に、4,5ピンを使用

byte modelnum[]={0xFA, 0xAF, 0x01, 0x0F, 0x00, 0x02, 0x00, 0x0C};
byte currVOLT[]={0xFA, 0xAF, 0x01, 0x0F, 0x34, 0x02, 0x00, 0x38};
byte mem30to41[]={0xFA, 0xAF, 0x01, 0x0B, 0x00, 0x00, 0x01, 0x0B};

void setup() {
  pinMode(
13,OUTPUT);//LED
  ServoSerial.
begin(38400); //Arduino<-->Servoを38,400bpsに設定
 
Serial.begin(115200); //PC<-->Arduinoを115,200bpsに設定
 
delay(1000);
}

void loop() {
 
int rx,tx;
 
//リターン(受信)
  rx=ServoSerial.
available();//データ数
 
if(rx>0) {
   
digitalWrite(13,LOW);//LED消す
   
for(int i=0;i<rx;i++) {
      
Serial.print(ServoSerial.read(),HEX);
      
Serial.print(",");
    }
   
Serial.print("\n");//改行
    ServoSerial.
flush();//受信データクリア
  }
 
 
//リクエスト(送信)
  tx=
Serial.available();//データ数
  if(tx>0) {
    switch(
Serial.read()) {
      
case 65://大文字A
       
digitalWrite(13,HIGH);//LED点灯
        send_msg(modelnum,
8);//モデル番号
       
break;
      
case 66://大文字B
       
digitalWrite(13,HIGH);//LED点灯
        send_msg(currVOLT,
8);//現在の電圧
       
break;
      
case 67://大文字C
       
digitalWrite(13,HIGH);//LED点灯
        send_msg(mem30to41,
8);//メモリーの30から41
       
break;
      
default:
       
for(int i=0;i<4;i++) {
         
digitalWrite(13,HIGH);
         
delay(200);
         
digitalWrite(13,LOW);
         
delay(200);
        }
       
break;
    }
   
Serial.flush();//受信データクリア
  }
}

// リクエストの送信
void send_msg(
byte msg[], int n) {
 
for(int i=0; i<n; i++){
    ServoSerial.
print(msg[i], BYTE);
  }   
}

//------------------------------

以上です。

five実践

  • スケッチをArduinoへ転送
  • 「Serial Monitor」ボタンをクリック
    Arduinoscreensnapz001
  • 通信速度が115200baudであることを確認
    Arduinoscreensnapz008
  • 「A」と入力し、「Send」ボタンをクリック。「B」も「C」も試してみて下さい。
    Arduinoscreensnapz009
  • 結果
    Arduinoscreensnapz010_2

結果の説明

  • モデル番号(1行目):40,30がデータです。リトルエンディアンなので、並び順を変えて、3040=RS304MDを意味します。RS306MDはRS304MDと同じ物なわけで、モデル番号は3040となっています。
  • 電圧(2行目):56,02がデータです。0256(16進数)=598(10進数)で、単位をボルトで表すなら100で割って、5.98Vとなります。
  • 30から41(3行目):0,0,0,0,0,64,0,0,0,0,0,0がデータです。ほとんどの値がゼロですが、指示位置(2バイト)、指示時間(2)、予備(1)、最大トルク(1)、トルクON/OFF(1)、予備(5)を意味してます。最大トルクが64(16進数)=100(10進数)で、最大トルク100%に設定されています。また、その次の値が0ということは、トルクがOFFということです。

sixプレゼントnotenotenote
前回の第6回で、書きましたが、今回のこのことを行う為に必要なICをプレゼント企画を行っています。こちらのブログ記事の下の方に応募方法などが書いてありますので、ご応募お待ちしておりますので、よろしくお願い致しますwinkpaper

----------------

----------------
にほんブログ村 科学ブログ ロボットへ
にほんブログ村

|

« 「週刊 ロボゼロ」 第5号(1)背中にバックカバーを取り付ける | トップページ | 最近買ったもの »

Arduino / Processing」カテゴリの記事

週刊 ロボゼロ」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/221673/51217102

この記事へのトラックバック一覧です: Arduinoでロボゼロのサーボを動かしてみよう!(7) :

« 「週刊 ロボゼロ」 第5号(1)背中にバックカバーを取り付ける | トップページ | 最近買ったもの »