0
0

More than 3 years have passed since last update.

YAMAHA アカデミックパック Processingでシリアル通信する(Java)

Last updated at Posted at 2021-02-12

ポート名の調べ方

serial_list

import processing.serial.*;

println(Serial.list()); 

1:調べたポート名を"hogehoge"に入力
2:グローバル変数の「linear」「angular」に好きな値を入力
3:「a」を押すとRequestCommand
4:「b」を押すとWriteReadCommand=動き出す
5:「c」を押すと停止する

YAMAHA_AcademicPack

import processing.serial.*;

Serial Port;

//電動車椅子の速度・角速度
float linear = 0.2; //速度[km/h](-5.6~5.6)
float angular; //角速度[km/h]

//配列の宣言
byte[] data1;  //RequestCommand
byte[] data2; //WriteReadCommand

//その他
int CheckSum1; //RequestCommand
int CheckSum2; //WriteReadCommand

boolean mode;
boolean status1 = false; //RequestCommand
boolean status2 = false; //WriteReadCommand


//電動車椅子の情報
float Perimeter = 1.18; //タイヤ周長[m]
float Gear_Ratio = 12.64; //ギア比[-]
float Distance = 0.24; //電動車椅子の中心から車輪までの距離[m]
float Turning_Radius =0.0; //電動車椅子の旋回半径[m]

//右のタイヤの回転数・速度
float rpm_right; //電動車椅子の右のタイヤの回転数[rpm]
float velocity_right; //電動車椅子の右のタイヤの速度[km/h]
float Velocity_right; //電動車椅子の右のタイヤの速度[m/s]

//左のタイヤの回転数・速度
float rpm_left; //電動車椅子の左のタイヤの回転数[rpm]
float velocity_left; //電動車椅子の左のタイヤの速度[km/h]
float Velocity_left; //電動車椅子の左のタイヤの速度[m/s]

//角速度
float Angular = angular/3.6; //角速度[m/s]


//速度(受信)
int RightSpeed;
int LeftSpeed;

void setup() {
  size(1000, 1000);

  //通信パラメータ
  //Serial(parent, portName, baudRate, parity, dataBits, stopBits)
  Port = new Serial(this, "/dev/tty.usbserial-AI0639FT", 38400, 'E', 8, 1) ;

  //配列の作成
  data1 = new byte[15];
  data2 = new byte[23];


  //配列の割当
  //RequestCommand
  //BaseFrame
  data1[0] = 0x01;  //ヘッダ
  data1[1] = 0x08;  //ソースアドレス
  data1[2] = 0x03;  //ディスティネーションアドレス 
  data1[3] = 0x01;  //通信番号
  data1[4] = 0x68; //コマンド
  data1[5] = 0x08;  //データ長
  //Data
  data1[6] = 0x01;  //モード(アカデミックモード=01h)
  data1[7] = 0x00;  //
  data1[8] = 0x00;  //
  data1[9] = 0x00;  //
  data1[10] = 0x00; //タイムアウト(無効=00h)
  data1[11] = 0x00; //
  data1[12] = 0x00; // 
  data1[13] = 0x00; //
  //CheckSum
  for (int i = 1; i <14; i++)
  {
    CheckSum1 += (int)data1[i];
  }
  data1[14] = (byte)CheckSum1; //CheckSum(これまでの数値の和の下位1バイト)
}


void draw() {
  background(0, 0, 0);

  if (status2 == true) {


    if (keyPressed) 
  {
    if (key == 'c')
    {
      linear = 0;
      angular = 0;
    }
  }


    if (angular == 0) { //角速度がゼロの場合 
      Turning_Radius =0.0; //旋回半径をゼロに指定する
      //速度から回転数への変換(右のタイヤ)
      rpm_right = (1000*linear*Gear_Ratio)/(60*Perimeter); 
      //速度から回転数への変換(左のタイヤ)
      rpm_left =  (1000*linear*Gear_Ratio)/(60*Perimeter);
    } else
    { //角速度がゼロ以外の場合
      Turning_Radius = linear/angular; //旋回半径を求める
      //速度から回転数への変換(右のタイヤ)
      velocity_right =(Turning_Radius + Distance)*(Angular);
      Velocity_right = velocity_right*3.6; //(m/s)から(km/h)への変換
      rpm_right = (1000*Velocity_right*Gear_Ratio)/(60*Perimeter);
      //速度から回転数への変換(左のタイヤ)
      velocity_left =(Turning_Radius - Distance)*(Angular); 
      Velocity_left = velocity_left*3.6; //(m/s)から(km/h)への変換
      rpm_left = (1000*Velocity_left*Gear_Ratio)/(60*Perimeter);
    }



    //WriteReadCommand
    //BaseFrame
    data2[0] = 0x01;  //ヘッダ
    data2[1] = 0x08;  //ソースアドレス
    data2[2] = 0x03;  //ディスティネーションアドレス 
    data2[3] = 0x01;  //通信番号
    data2[4] = 0x69; //コマンド
    data2[5] = 0x10;  //データ長
    //Data
    data2[6] = 0x02;  //ユニット有効指示(モータ回転指示値=02h)
    data2[7] = 0x00;  //
    data2[8] = 0x00;  //JS
    data2[9] = 0x00;  //JS
    data2[10] = 0x00; //JS
    data2[11] = 0x00; //JS
    data2[12] = (byte)((int)rpm_right & 0x00FF); //右モーター回転指示(下位バイト) (-1000rpm~1000rpm)
    data2[13] = (byte)(((int)rpm_right & 0xFF00)>>8); //右モーター回転指示(上位バイト) (-1000rpm~1000rpm)
    data2[14] = (byte)((int)rpm_left & 0x00FF); //左モーター回転指示(下位バイト) (-1000rpm~1000rpm)
    data2[15] = (byte)(((int)rpm_left & 0xFF00)>>8); //左モーター回転指示(上位バイト) (-1000rpm~1000rpm)
    data2[16] = 0x00; //
    data2[17] = 0x00; //
    data2[18] = 0x00; //
    data2[19] = 0x00; // 
    data2[20] = 0x00; //
    data2[21] = 0x00; //

    //CheckSum
    CheckSum2=0;
    for (int i = 1; i <22; i++)
    {
      CheckSum2 += (int)data2[i];
    }
    data2[22] = (byte)(CheckSum2 & 0x00FF); //CheckSum(これまでの数値の和の下位1バイト)
    Port.write(data2); //WriteReadCommand 送信
  }
}




void keyPressed() {
  if (key=='a') { //RequestCommand起動
    Port.write(data1); //RequestCommnad 送信
    println(data1);
    status1=true;
  }
  if (key=='b') { //WriteReadCommand起動
    status2 = true; 
    status1 = false;
  }

}




void serialEvent(Serial Port) {

  //RequestCommand 受信
  if (status1 == true) {
    byte[] inBuffer = new byte[15]; //配列の宣言、作成
    while (Port.available() > 0) { //データが送られている間は
      inBuffer =Port.readBytes(); //ここに割当る
      println(inBuffer); //送られたデータを見たい
    }
  }

  //WriteReadCommand 受信
  if (status2 == true) {
    byte[] inBuffer2 = new byte[23]; //配列の宣言、作成 //15個来るはず
    while (Port.available() ==23) { //データが送られている間は
      inBuffer2 =Port.readBytes(); //ここに割当る
      Port.readBytes(inBuffer2);
      println(inBuffer2); //送られたデータを見たい

      //TimeStamp
      int lowerTime = Byte.toUnsignedInt(inBuffer2[6]);//byteからintへ
      int upperTime =Byte.toUnsignedInt(inBuffer2[7]);//byteからintへ
      int timeStamp = (upperTime <<8)+lowerTime; //下位バイトと上位バイトをガッチャンこ(0~65535)(10ms単位)
      textSize(24);
      fill(255, 255, 255);
      text("TimeStamp="+timeStamp+"ms", 100, 100);

      //Right
      int lowerRight = Byte.toUnsignedInt(inBuffer2[8]); //byteからintへ
      int upperRight = Byte.toUnsignedInt(inBuffer2[9]);//byteからintへ   
      int rpmRight = (upperRight <<8)+lowerRight; //下位バイトと上位バイトをガッチャンこ(-1000rpm~1000rpm)
      textSize(24);
      fill(255, 255, 255);
      text("rpm_Right="+rpmRight+"rpm", 100, 200);
      float RightSpeed = rpmRight * 60/1000*Perimeter/Gear_Ratio;
      textSize(24);
      fill(255, 255, 255);
      text("speed_Right="+RightSpeed+"km/h", 100, 300);

      //Left
      int lowerLeft = Byte.toUnsignedInt(inBuffer2[10]); //byteからintへ
      int upperLeft = Byte.toUnsignedInt(inBuffer2[11]);//byteからintへ   
      int rpmLeft = (upperLeft <<8)+lowerLeft; //下位バイトと上位バイトをガッチャンこ(-1000rpm~1000rpm)
      textSize(24);
      fill(255, 255, 255);
      text("rpm_Left="+rpmLeft+"rpm", 100, 400);
      float LeftSpeed = rpmLeft * 60/1000*Perimeter/Gear_Ratio;
      textSize(24);
      fill(255, 255, 255);
      text("speed_Left="+LeftSpeed+"km/h", 100, 500);

      //Battery
      int lowerBattery= inBuffer2[12]; //byteからintへ
      int upperBattery = inBuffer2[13];//byteからintへ   
      int BatteryCurrent = (upperBattery <<8)+lowerBattery; //下位バイトと上位バイトをガッチャンこ(0%~100%)
      println("BatteryCurrent="+"0."+BatteryCurrent+"A");
      int Battery = Byte.toUnsignedInt(inBuffer2[14]);
      textSize(24);
      fill(255, 255, 255);
      text("Battery="+Battery+"%", 100, 600);
    }
  }
}

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0