Renesas Community
Renesas Community
  • User
    Join or sign in
  • Site
  • Search Community
  • User
  • Renesas Engineering Community
  • FAQ
  • HELP
  • More
  • Cancel
がじぇっとるねさすコミュニティ
がじぇっとるねさすコミュニティ
GR-ROSE GR-ROSEとDynamixelシリーズのXL430で通信ができない問題について
  • Forums
  • Files
  • がじぇっとるねさす ゆーざー会 - Wiki
  • Tags
  • More
  • Cancel
  • New

 

 GR-SAKURA

 GR-KURUMI

 GR-COTTON

 GR-CITRUS

 GR-PEACH

 GR-KAEDE

 GR-ADZUKI

 GR-LYCHEE

 GR-ROSE

 GR-MANGO(*)

 SNShield

 Web Compiler

 IDE for GR

 TOPPERS関連

 女子美コラボ

 その他

 ※プロデューサミーティング中

 作り方使い方資料

 イベント関連

 作品記事

 体験記事

 その他

 

 ライブラリ

 ツール

 その他・過去ファイル

  • State Not Answered
  • Replies 8 replies
  • Subscribers 440 subscribers
  • Views 2346 views
  • Users 0 members are here
  • Dynamixel
  • GR-ROSE
Options
  • Share
  • More
  • Cancel
Related Tags
  • 3D
  • analog
  • B3M
  • DDS-XRCE
  • endif
  • esp8266
  • FIT
  • GR-ROSE
  • ICS
  • include
  • MG996R
  • MIC3
  • microSD
  • MPL3115A2
  • OLED
  • pin
  • PMOD
  • ROS
  • ROS2
  • rosserial
  • RS-485
  • RX65N
  • SDHI
  • serial
  • SmartConfigurator
Related

GR-ROSEとDynamixelシリーズのXL430で通信ができない問題について

uaf
uaf over 3 years ago

初めて投稿いたします。

GR-ROSEを用いてDynamixelシリーズのXL430を制御したいのですがうまく通信ができません。

WriteとReadのどちらの場合でもステータスパケットを見るとエラーが発生しており、74(0b1001010)が返ってきています。

この問題について何かご経験のある方、有識者の方がいらっしゃいましたらご意見いただきたいです。

 

状況ですが、GR-ROSEのSerial1のGND、Vm、TX/RXとXL430の各端子を直接接続しております。

また、ACアダプタを用いて12Vが供給されている状態です。

ボーレートは1Mbpsで設定しております。

開発環境はIDE for GRです。 

 

私の中では、GR-ROSEとDynamixelシリーズのサーボモータを直結してSerial1をHALFDUPLEXに設定すればシリアルサーボと通信できる、との認識でいるのですが間違っているのでしょうか?

結局、現在はDUPLEXに設定し、近藤科学さんのICS変換基板を介して通信を行っております。(こちらだと正常に通信できています)

GR-ROSEにふれてまだ数日しか経っていないため、仕様を理解できていないのですが、本来は何かしらの回路を製作するべきなのでしょうか?

 

私が使用しているプログラムと通信失敗時(GR-ROSEとXL430を直結して通信を試みたとき)の信号を添付いたします。

プログラムは西村さんの投稿(https://japan.renesasrulz.com/gr_user_forum_japanese/f/gr-rose/5377/robotis-dymamixel)やベステクさんのプログラムを参考に作成いたしました。

ICS変換基板を介して通信する場合も通信路の切り替え処理が追加で入りますが同様のパケットを生成し、同じように送信しています。

信号はインストラクションパケット(0-3.3V)とステータスパケット(0-5V)になります。

信号をみると3.3Vに対して5Vが返ってきているため、サーボモータの方で何かしら異常が起きているとは思うのですが...。

補足ですが、GR-ROSE側で5Vに切り替えると5.5Vほどの電圧で返ってきます。

 

4722.test01.txt
// ���C�u�����̓ǂݍ���
#include <Arduino.h>

// ID�̒�`
#define motor_ID                      3

// Dynamixel�̃��[�^�̃A�h���X�iProtocol 2.0�j
#define ID_ADDRESS                    7
#define PWM_LIMIT_ADDRESS             36
#define MAX_POSITION_LIMIT_ADDRESS    48
#define MIN_POSITION_LIMIT_ADDRESS    52
#define TORQUE_ENABLE_ADDRESS         64
#define LED_ADDRESS                   65
#define GOAL_VELOCITY_ADDRESS         104
#define PROFILE_ACCELERATION_ADDRESS  108
#define PROFILE_VELOCITY_ADDRESS      112
#define GOAL_POSITION_ADDRESS         116
#define PRESENT_POSITION_ADDRESS      132

// �O���[�o���ϐ��̐ݒ�
uint32_t Motor_present_position;    // ���[�^�̌��݂̈ʒu�i�p�x�j���i�[�p�ϐ�


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);               // PC�Ƃ̃V���A���ʐM�̑��x��9600bps�ݒ�

  Serial1.begin(1000000);           // Dynamixel�Ƃ̃V���A���ʐM��1000000bps���x��ݒ�
  Serial1.direction(HALFDUPLEX);
  Serial1.setTimeout(50);

  // Torque Enable��1�ɐݒ�m�F
  Write_1ByteData(motor_ID, TORQUE_ENABLE_ADDRESS, 1);  // Torque_Enable = 1�ɐݒ�

  // Profile�֌W�̐ݒ�
  Write_4ByteData(motor_ID, PROFILE_VELOCITY_ADDRESS, 100);

  delay (100);
}

void loop() {
  // �ړ�1
  Write_4ByteData(motor_ID, GOAL_POSITION_ADDRESS, 1024);    // Set Goal Position
  delay(2000);
  
  // ���݂̃��[�^�̊p�x��擾�i32bit�j
  Read_4ByteData(motor_ID, PRESENT_POSITION_ADDRESS, &Motor_present_position);
  
  // ���[�^�̊p�x��\��
  Serial.print("Motor(now) : ");
  Serial.print(Motor_present_position);
  Serial.print("\n");
  delay(1000);
  
  // �ړ�2
  Write_4ByteData(motor_ID, GOAL_POSITION_ADDRESS, 3072);    // Set Goal Position
  delay(2000);
  
  // ���݂̃��[�^�̊p�x��擾�i32bit�j
  Read_4ByteData(motor_ID, PRESENT_POSITION_ADDRESS, &Motor_present_position);
  
  // ���[�^�̊p�x��\��
  Serial.print("Motor(now) : ");
  Serial.print(Motor_present_position);
  Serial.print("\n");
  delay(1000);
}


//////////////////// Function ////////////////////
// CRC-16-IBM��v�Z����֐�1
uint16_t CRC_calc_1(uint8_t *data, int datasize)
{
  uint16_t crc16;
  int i,j;
  
  crc16 = 0x0000;                       // �����l=0
  for(i=0;i<datasize;i++){
    crc16 ^= ( ((uint16_t)data[i]) << 8);
    for(j=0;j<8;j++){
      if(crc16 & 0x8000){
        crc16 = (crc16 << 1) ^ 0x8005;  // ����������
      }else{
        crc16 <<= 1;
      }
    }
  }
  return crc16;
}

// CRC-16-IBM��v�Z����֐�2
unsigned short CRC_calc_2(unsigned short crc_accum, unsigned char *data_blk_ptr, unsigned short data_blk_size)
{
    unsigned short i, j;
    unsigned short crc_table[256] = {
        0x0000, 0x8005, 0x800F, 0x000A, 0x801B, 0x001E, 0x0014, 0x8011,
        0x8033, 0x0036, 0x003C, 0x8039, 0x0028, 0x802D, 0x8027, 0x0022,
        0x8063, 0x0066, 0x006C, 0x8069, 0x0078, 0x807D, 0x8077, 0x0072,
        0x0050, 0x8055, 0x805F, 0x005A, 0x804B, 0x004E, 0x0044, 0x8041,
        0x80C3, 0x00C6, 0x00CC, 0x80C9, 0x00D8, 0x80DD, 0x80D7, 0x00D2,
        0x00F0, 0x80F5, 0x80FF, 0x00FA, 0x80EB, 0x00EE, 0x00E4, 0x80E1,
        0x00A0, 0x80A5, 0x80AF, 0x00AA, 0x80BB, 0x00BE, 0x00B4, 0x80B1,
        0x8093, 0x0096, 0x009C, 0x8099, 0x0088, 0x808D, 0x8087, 0x0082,
        0x8183, 0x0186, 0x018C, 0x8189, 0x0198, 0x819D, 0x8197, 0x0192,
        0x01B0, 0x81B5, 0x81BF, 0x01BA, 0x81AB, 0x01AE, 0x01A4, 0x81A1,
        0x01E0, 0x81E5, 0x81EF, 0x01EA, 0x81FB, 0x01FE, 0x01F4, 0x81F1,
        0x81D3, 0x01D6, 0x01DC, 0x81D9, 0x01C8, 0x81CD, 0x81C7, 0x01C2,
        0x0140, 0x8145, 0x814F, 0x014A, 0x815B, 0x015E, 0x0154, 0x8151,
        0x8173, 0x0176, 0x017C, 0x8179, 0x0168, 0x816D, 0x8167, 0x0162,
        0x8123, 0x0126, 0x012C, 0x8129, 0x0138, 0x813D, 0x8137, 0x0132,
        0x0110, 0x8115, 0x811F, 0x011A, 0x810B, 0x010E, 0x0104, 0x8101,
        0x8303, 0x0306, 0x030C, 0x8309, 0x0318, 0x831D, 0x8317, 0x0312,
        0x0330, 0x8335, 0x833F, 0x033A, 0x832B, 0x032E, 0x0324, 0x8321,
        0x0360, 0x8365, 0x836F, 0x036A, 0x837B, 0x037E, 0x0374, 0x8371,
        0x8353, 0x0356, 0x035C, 0x8359, 0x0348, 0x834D, 0x8347, 0x0342,
        0x03C0, 0x83C5, 0x83CF, 0x03CA, 0x83DB, 0x03DE, 0x03D4, 0x83D1,
        0x83F3, 0x03F6, 0x03FC, 0x83F9, 0x03E8, 0x83ED, 0x83E7, 0x03E2,
        0x83A3, 0x03A6, 0x03AC, 0x83A9, 0x03B8, 0x83BD, 0x83B7, 0x03B2,
        0x0390, 0x8395, 0x839F, 0x039A, 0x838B, 0x038E, 0x0384, 0x8381,
        0x0280, 0x8285, 0x828F, 0x028A, 0x829B, 0x029E, 0x0294, 0x8291,
        0x82B3, 0x02B6, 0x02BC, 0x82B9, 0x02A8, 0x82AD, 0x82A7, 0x02A2,
        0x82E3, 0x02E6, 0x02EC, 0x82E9, 0x02F8, 0x82FD, 0x82F7, 0x02F2,
        0x02D0, 0x82D5, 0x82DF, 0x02DA, 0x82CB, 0x02CE, 0x02C4, 0x82C1,
        0x8243, 0x0246, 0x024C, 0x8249, 0x0258, 0x825D, 0x8257, 0x0252,
        0x0270, 0x8275, 0x827F, 0x027A, 0x826B, 0x026E, 0x0264, 0x8261,
        0x0220, 0x8225, 0x822F, 0x022A, 0x823B, 0x023E, 0x0234, 0x8231,
        0x8213, 0x0216, 0x021C, 0x8219, 0x0208, 0x820D, 0x8207, 0x0202
    };

    for(j = 0; j < data_blk_size; j++)
    {
        i = ((unsigned short)(crc_accum >> 8) ^ data_blk_ptr[j]) & 0xFF;
        crc_accum = (crc_accum << 8) ^ crc_table[i];
    }
    return crc_accum;
}

// �w�肵���A�h���X��1byte�̏���������ފ֐�
bool Write_1ByteData(uint8_t id, uint16_t address, uint8_t data){
  // ����M�p�o�b�t�@�̐ݒ�
  uint8_t rx_buf[11];
  uint8_t tx_buf[] = {
    0xff, 0xff, 0xfd,                   // Header   �i�擪4�o�C�g��0xFF,0xFF,0xFD,0x00�̌Œ�l�j
    0x00,                               // Reserved �i�擪4�o�C�g��0xFF,0xFF,0xFD,0x00�̌Œ�l�j
    id,                                 // ID       �i�ʐM���ID�j
    6, 0,                               // size     �iinst�ȍ~�̃f�[�^���j
    0x03,                               // inst     �i1:PING, 2:READ, 3:WRITE,...�j
    (uint8_t)(address & 0xff),          // address_L
    (uint8_t)((address >> 8) & 0xff),   // address_H
    data,
    0,                                  // CRC_L
    0                                   // CRC_H
  };

  // CRC�v�Z
  uint16_t crc = CRC_calc_2(0, tx_buf, 11);     // CRC-16-IBM�̌v�Z
  tx_buf[11] = (uint8_t)crc & 0xff;             // CRC_L
  tx_buf[12] = (uint8_t)((crc >> 8) & 0xff);    // CRC_H
  
  // ������
  while (Serial1.available ())
  Serial1.read();                              // clear buffer
  
  // �f�[�^�̑��M
  Serial1.write (tx_buf, 13);                  // send inst packet
  Serial1.flush();

  // �f�[�^�̎�M
  if (Serial1.readBytes(rx_buf, 11) == 11){    // read stat packet
    if(rx_buf[4] != id){                        // ID�̈�v��`�F�b�N
     Serial.println("ID not matched!");
     return false;
    }
    if(rx_buf[8] != 0){ // �G���[��`�F�b�N
     Serial.print("Status Error = "); Serial.println(rx_buf[8],HEX);
     return false;
    }
    return true;
    }else{
    Serial.println("Bad response!");
    return false;
  }
}

// �w�肵���A�h���X��4byte�̏���������ފ֐�
bool Write_4ByteData(uint8_t id, uint16_t address, uint32_t data){
  // ����M�p�o�b�t�@�̐ݒ�
  uint8_t rx_buf[11];
  uint8_t tx_buf[] = {
    0xff, 0xff, 0xfd,                   // Header   �i�擪4�o�C�g��0xFF,0xFF,0xFD,0x00�̌Œ�l�j
    0x00,                               // Reserved �i�擪4�o�C�g��0xFF,0xFF,0xFD,0x00�̌Œ�l�j
    id,                                 // ID       �i�ʐM���ID�j
    0x09, 0x00,                         // size     �iinst�ȍ~�̃f�[�^���j
    0x03,                               // inst     �i1:PING, 2:READ, 3:WRITE,...�j
    (uint8_t)address & 0xff,            // address_L
    (uint8_t)((address >> 8) & 0xff),   // address_H
    (uint8_t)(data & 0xff),
    (uint8_t)((data >> 8) & 0xff),
    (uint8_t)((data >> 16) & 0xff),
    (uint8_t)((data >> 24) & 0xff),
    0,                                  // CRC_L
    0                                   // CRC_H
  };

  // CRC�v�Z
  uint16_t crc = CRC_calc_2(0, tx_buf, 14);     // CRC-16-IBM�̌v�Z
  tx_buf[14] = (uint8_t)(crc & 0xff);           // CRC_L
  tx_buf[15] = (uint8_t)((crc >> 8) & 0xff);    // CRC_H
  
  // ������
  while (Serial1.available ())
  Serial1.read();                               // clear buffer
  
  // �f�[�^�̑��M
  Serial1.write (tx_buf, 16);                  // send inst packet
  Serial1.flush();

  // �f�[�^�̎�M
  if (Serial1.readBytes(rx_buf, 11) == 11){     // read stat packet
    if(rx_buf[4] != id){                        // ID�̈�v��`�F�b�N
     Serial.println("ID not matched!");
     return false;
    }
    if(rx_buf[8] != 0){                         // �G���[��`�F�b�N
     Serial.print("Status Error = "); Serial.println(rx_buf[8],HEX);
     return false;
    }
    return true;
    }else{
    Serial.println("Bad response!");
    return false;
  }
}

// �w�肵���A�h���X����1byte�̏���擾���Ďw�肵��uint8_t�^�ϐ��Ɋi�[����֐�
bool Read_1ByteData(uint8_t id, uint16_t address, uint8_t *data){
  // ����M�p�o�b�t�@�̐ݒ�
  uint8_t rx_buf[11];
  uint8_t tx_buf[] = {
    0xff, 0xff, 0xfd,                   // Header   �i�擪4�o�C�g��0xFF,0xFF,0xFD,0x00�̌Œ�l�j
    0x00,                               // Reserved �i�擪4�o�C�g��0xFF,0xFF,0xFD,0x00�̌Œ�l�j
    id,                                 // ID       �i�ʐM���ID�j
    7, 0,                               // size     �iinst�ȍ~�̃f�[�^���j
    2,                                  // inst     �i1:PING, 2:READ, 3:WRITE,...�j
    (uint8_t)address & 0xff,            // address_L
    (uint8_t)((address >> 8) & 0xff),   // address_H
    1,                                  // byte_size_L
    0,                                  // byte_size_H 
    0,                                  // CRC_L
    0                                   // CRC_H
  };

  // CRC�v�Z
  uint16_t crc = CRC_calc_2(0, tx_buf, 12);     // CRC-16-IBM�̌v�Z
  tx_buf[12] = (uint8_t)(crc & 0xff);           // CRC_L
  tx_buf[13] = (uint8_t)((crc >> 8) & 0xff);    // CRC_H
  
  // ������
  while (Serial1.available ())
  Serial1.read();                               // clear buffer
  
  // �f�[�^�̑��M
  Serial1.write (tx_buf, 14);                  // send inst packet
  Serial1.flush();

  // �f�[�^�̎�M
  if (Serial1.readBytes(rx_buf, 12) == 12){     // read stat packet
    if(rx_buf[4] != id){                         // ID�̈�v��`�F�b�N
     Serial.println("ID not matched!");
     return false;
    }
    if(rx_buf[8] != 0){ // �G���[��`�F�b�N
     Serial.print("Status Error = "); Serial.println(rx_buf[8]);
     return false;
    }
    
    *data = rx_buf[9] & 0xff;
    
    return true;
    }else{
    Serial.println("Bad response!");
    return false;
  }
}

// �w�肵���A�h���X����4byte�̏���擾���Ďw�肵��uint32_t�^�ϐ��Ɋi�[����֐�
bool Read_4ByteData(uint8_t id, uint16_t address, uint32_t *data){
  // �ϐ���`
  uint32_t A,B,C,D;
  
  // ����M�p�o�b�t�@�̐ݒ�
  uint8_t rx_buf[15];
  uint8_t tx_buf[] = {
    0xff, 0xff, 0xfd,                   // Header   �i�擪4�o�C�g��0xFF,0xFF,0xFD,0x00�̌Œ�l�j
    0x00,                               // Reserved �i�擪4�o�C�g��0xFF,0xFF,0xFD,0x00�̌Œ�l�j
    id,                                 // ID       �i�ʐM���ID�j
    7, 0,                               // size     �iinst�ȍ~�̃f�[�^���j
    2,                                  // inst     �i1:PING, 2:READ, 3:WRITE,...�j
    (uint8_t)address & 0xff,            // address_L
    (uint8_t)((address >> 8) & 0xff),   // address_H
    4,                                  // byte_size_L
    0,                                  // byte_size_H 
    0,                                  // CRC_L
    0                                   // CRC_H
  };

  // CRC�v�Z
  uint16_t crc = CRC_calc_2(0, tx_buf, 12);      // CRC-16-IBM�̌v�Z
  tx_buf[12] = (uint8_t)(crc & 0xff);            // CRC_L
  tx_buf[13] = (uint8_t)((crc >> 8) & 0xff);     // CRC_H
  
  // ������
  while (Serial1.available ())
  Serial1.read();                               // clear buffer
  
  // �f�[�^�̑��M
  Serial1.write (tx_buf, 14);                  // send inst packet
  Serial1.flush();

  // �f�[�^�̎�M
  if (Serial1.readBytes(rx_buf, 15) == 15){     // read stat packet
    if(rx_buf[4] != id){                         // ID�̈�v��`�F�b�N
     Serial.println("ID not matched!");
     return false;
    }
    if(rx_buf[8] != 0){                          // �G���[��`�F�b�N
     Serial.print("Status Error = "); Serial.println(rx_buf[8]);
     return false;
    }
    
    A = ((uint32_t)rx_buf[12] << 24) & 0xff000000;
    B = ((uint32_t)rx_buf[11] << 16) & 0x00ff0000;
    C = ((uint32_t)rx_buf[10] << 8) & 0x0000ff00;
    D = (uint32_t)rx_buf[9] & 0x000000ff;
    *data = A+B+C+D;
    
    return true;
    }else{
    Serial.println("Bad response!");
    return false;
  }
}

  • Reply
  • Cancel
  • Cancel
Parents
  • uaf
    0 uaf over 3 years ago
    プログラムのコメントに日本語があるので表示が化けてますね...。
    すみません...。
    ダウンロードしてご確認いただければと思います...。
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • Okamiya Yuuki
    0 Okamiya Yuuki over 3 years ago in reply to uaf

    がじぇるね岡宮です。

    以前、XL310で同じようなエラーが出た記憶はあるのですが、すみませんちょっと忘れてしまいました。

    確か最終的に、Serial.flush()でコマンド送信完了を待つ部分を、Serial1.readBytes(temp, sizeof(buf))のように自分で送ったコマンドが折り返しで返ってくるのを受信するようにしたらうまくいった記憶があるのですが、手元にサーボがないので試せてません。


    #include "Arduino.h"
    #include "stdint.h"

    unsigned short update_crc(unsigned short crc_accum, unsigned char *data_blk_ptr, unsigned short data_blk_size)
    {
    unsigned short i, j;
    unsigned short crc_table[256] = {
    0x0000, 0x8005, 0x800F, 0x000A, 0x801B, 0x001E, 0x0014, 0x8011,
    0x8033, 0x0036, 0x003C, 0x8039, 0x0028, 0x802D, 0x8027, 0x0022,
    0x8063, 0x0066, 0x006C, 0x8069, 0x0078, 0x807D, 0x8077, 0x0072,
    0x0050, 0x8055, 0x805F, 0x005A, 0x804B, 0x004E, 0x0044, 0x8041,
    0x80C3, 0x00C6, 0x00CC, 0x80C9, 0x00D8, 0x80DD, 0x80D7, 0x00D2,
    0x00F0, 0x80F5, 0x80FF, 0x00FA, 0x80EB, 0x00EE, 0x00E4, 0x80E1,
    0x00A0, 0x80A5, 0x80AF, 0x00AA, 0x80BB, 0x00BE, 0x00B4, 0x80B1,
    0x8093, 0x0096, 0x009C, 0x8099, 0x0088, 0x808D, 0x8087, 0x0082,
    0x8183, 0x0186, 0x018C, 0x8189, 0x0198, 0x819D, 0x8197, 0x0192,
    0x01B0, 0x81B5, 0x81BF, 0x01BA, 0x81AB, 0x01AE, 0x01A4, 0x81A1,
    0x01E0, 0x81E5, 0x81EF, 0x01EA, 0x81FB, 0x01FE, 0x01F4, 0x81F1,
    0x81D3, 0x01D6, 0x01DC, 0x81D9, 0x01C8, 0x81CD, 0x81C7, 0x01C2,
    0x0140, 0x8145, 0x814F, 0x014A, 0x815B, 0x015E, 0x0154, 0x8151,
    0x8173, 0x0176, 0x017C, 0x8179, 0x0168, 0x816D, 0x8167, 0x0162,
    0x8123, 0x0126, 0x012C, 0x8129, 0x0138, 0x813D, 0x8137, 0x0132,
    0x0110, 0x8115, 0x811F, 0x011A, 0x810B, 0x010E, 0x0104, 0x8101,
    0x8303, 0x0306, 0x030C, 0x8309, 0x0318, 0x831D, 0x8317, 0x0312,
    0x0330, 0x8335, 0x833F, 0x033A, 0x832B, 0x032E, 0x0324, 0x8321,
    0x0360, 0x8365, 0x836F, 0x036A, 0x837B, 0x037E, 0x0374, 0x8371,
    0x8353, 0x0356, 0x035C, 0x8359, 0x0348, 0x834D, 0x8347, 0x0342,
    0x03C0, 0x83C5, 0x83CF, 0x03CA, 0x83DB, 0x03DE, 0x03D4, 0x83D1,
    0x83F3, 0x03F6, 0x03FC, 0x83F9, 0x03E8, 0x83ED, 0x83E7, 0x03E2,
    0x83A3, 0x03A6, 0x03AC, 0x83A9, 0x03B8, 0x83BD, 0x83B7, 0x03B2,
    0x0390, 0x8395, 0x839F, 0x039A, 0x838B, 0x038E, 0x0384, 0x8381,
    0x0280, 0x8285, 0x828F, 0x028A, 0x829B, 0x029E, 0x0294, 0x8291,
    0x82B3, 0x02B6, 0x02BC, 0x82B9, 0x02A8, 0x82AD, 0x82A7, 0x02A2,
    0x82E3, 0x02E6, 0x02EC, 0x82E9, 0x02F8, 0x82FD, 0x82F7, 0x02F2,
    0x02D0, 0x82D5, 0x82DF, 0x02DA, 0x82CB, 0x02CE, 0x02C4, 0x82C1,
    0x8243, 0x0246, 0x024C, 0x8249, 0x0258, 0x825D, 0x8257, 0x0252,
    0x0270, 0x8275, 0x827F, 0x027A, 0x826B, 0x026E, 0x0264, 0x8261,
    0x0220, 0x8225, 0x822F, 0x022A, 0x823B, 0x023E, 0x0234, 0x8231,
    0x8213, 0x0216, 0x021C, 0x8219, 0x0208, 0x820D, 0x8207, 0x0202
    };

    for(j = 0; j < data_blk_size; j++)
    {
    i = ((unsigned short)(crc_accum >> 8) ^ data_blk_ptr[j]) & 0xFF;
    crc_accum = (crc_accum << 8) ^ crc_table[i];
    }

    return crc_accum;
    }

    void setup() {
    Serial1.begin (1000000); // to XL310
    Serial1.direction(HALFDUPLEX);
    Serial.begin(115200); // for USB monitoring
    }

    void loop() {
    uint8_t buf[] = {
    0xFF, 0xFF, 0xFD, 0x00,
    0x02, // ID
    0x03, 0x00, // Length
    0x01, // Instruction
    0x0, 0x0, // CRC
    };
    uint8_t temp[10];
    uint8_t ret[14];

    uint16_t crc = update_crc(0, buf, sizeof(buf) - 2);
    buf[sizeof(buf) - 1] = (crc>>8) & 0x00FF; //CRC_H
    buf[sizeof(buf) - 2] = (crc & 0x00FF); //CRC_L

    while (Serial1.available ()) Serial1.read (); // clear buffer
    Serial1.write(buf, sizeof(buf)); // write command
    while(Serial1.available() != sizeof(buf));
    Serial1.readBytes(temp, sizeof(buf)); // read command sent by myself
    for(int i = 0; i < sizeof(buf); i++){
    Serial.print(temp[i], HEX);
    Serial.print(" ");
    }
    Serial.println();

    Serial1.readBytes(ret, sizeof(ret)); // read response
    for(int i = 0; i < sizeof(ret); i++){
    Serial.print(ret[i], HEX);
    Serial.print(" ");
    }
    Serial.println();
    delay(1000);
    }

    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • uaf
    0 uaf over 3 years ago in reply to Okamiya Yuuki
    岡宮さん

    返信いただきありがとうございます。
    GR-ROSEから送信したデータも返ってきてしまうのですね...。
    西村さんが公開していたプログラムで、read時にインストラクションパケット+ステータスパケット分だけデータを取得している意味がよくわからなかったのですが合点がいきました。

    同様の処理を加えてうまく動作しないか検証してみます。
    なにか進展があればまたこちらでご報告させていただきます。
    ありがとうございました。
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
  • uaf
    0 uaf over 3 years ago in reply to Okamiya Yuuki
    岡宮さん

    おかげさまで正常に書き込み/読み込みができるようになりました。
    本当にありがとうございました。
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
Reply
  • uaf
    0 uaf over 3 years ago in reply to Okamiya Yuuki
    岡宮さん

    おかげさまで正常に書き込み/読み込みができるようになりました。
    本当にありがとうございました。
    • Cancel
    • Up 0 Down
    • Reply
    • Verify Answer
    • Cancel
Children
No Data
サイト使用条件
プライバシーポリシー
お問い合わせ
© 2010-2023 Renesas Electronics Corporation. All rights reserved.