サンプルプログラム(Arduino UNO)

(2014.8.6 作成)

 このサイトでダウンロードできるプログラムのサンプルコードです。基本的な環境構築共通ライブラリはそれぞれのページも参照してください。

 基本的な使用法はピン設定などを決めてクラスを作成した後、SetRelativeAngle(台形駆動)、SetSpeed(速度変更)をセットし、後はただひたすらRun関数を呼び出し続けるだけです。ただSTM32の例と異なり10[us]単位で呼び出すタイマーは作れないので、loop()関数内で処理を行っています。注意点としてはloop内でwait関数を使用したり、思い処理を行うとrun関数が呼ばれず、動作が予想外のものになります。

台形駆動

 最高速度20[rad/s]で3周往復します。

#include <DKS_GPIO_Arduino.h>
#include <DKS_Timer_Arduino.h>
#include <DKS_EasyDriver.h>


DKS::Timer *tim;
DKS::Stepper::IStepperMotor **motors;
DKS::Stepper::StepperControl *sc;
float angle = M_PI*2*3;
DKS::DigitalOut pinDir(2);
DKS::DigitalOut pinStp(3);
DKS::DigitalOut pinMS1(4);
DKS::DigitalOut pinMS2(5);

void setup()
{

  tim=new DKS::Timer(1e-6);
  tim->start();

  motors=new DKS::Stepper::IStepperMotor*[1];
  motors[0]=new DKS::Stepper::EasyDriver(tim, &pinDir, &pinStp, 1.8f*M_PI/180.0f, &pinMS1, &pinMS2);

  sc = new DKS::Stepper::StepperControl(motors, 1);
  sc->SetRelativeAngle(0, angle, maxVelocity, acceleration, acceleration, false);

  Serial.print("Setup done\r\n"); 
  delay(1);
}  

void loop()
{
  sc->Run();

  if (!sc->IsMoving(0))  //動作が止まれば反対方向に動かす
  {
    angle *= -1.0f;
    sc->SetRelativeAngle(0, angle, maxVelocity, acceleration, acceleration, false);
  }
}

速度変更

 停止 → 5[rad/s] → 15[rad/s] → と動作します。

#include <DKS_GPIO_Arduino.h>
#include <DKS_Timer_Arduino.h>
#include <DKS_EasyDriver.h>

const float speedList[] = {
  0,5,15,0};
uint8_t stage=0;
const uint8_t n=sizeof(speedList)/sizeof(float);

const float acceleration = 10.0f;

DKS::Timer *tim;
DKS::Stepper::IStepperMotor **motors;
DKS::Stepper::StepperControl *sc;
DKS::DigitalOut pinDir(2);
DKS::DigitalOut pinStp(3);
DKS::DigitalOut pinMS1(4);
DKS::DigitalOut pinMS2(5);

void setup()
{
  tim=new DKS::Timer(1e-6);
  tim->start();

  motors=new DKS::Stepper::IStepperMotor*[1];
  motors[0]=new DKS::Stepper::EasyDriver(tim, &pinDir, &pinStp, 1.8f*M_PI/180.0f, &pinMS1, &pinMS2);

  sc = new DKS::Stepper::StepperControl(motors, 1);
  sc->SetSpeed(0, speedList[0], acceleration);
}  

void loop()
{
  if ( stage != (uint8_t)(tim->readCounter()/5000000))
  {
    stage++;
    if (stage>=n) while (true);
    sc->SetSpeed(0, speedList[stage], acceleration);
  }
  sc->Run();
}