2021年7月26日月曜日

ステッピングモータをPCから制御する

 


 

ステッピングモータを制御するためステッピングモータコントローラL6470を使っています。なかなか高機能なコントローラで、以下の特徴を持ちます。

  • 1相をフルステップ、1/4、1/8、1/16、1/32、1/64、1/128ステップ(マイクロステップ)に細分可能
  • マイコンのSPIインタフェイスで2相バイポーラステッピングモータの正・逆転、加・減速、ブレーキ、速度制御、位置制御が可能

パソコン上でプログラムを組み、そのプログラムからUSBを通してステッピングモータを回してみたかったので、贅沢にもArduinoをUSBシリアル<ーー>SPIコンバータとして使ってみました。 Arduino内のプログラムはこんな感じです。

#include <SPI.h>

#define SPI_MOSI  11
#define SPI_MISO  12
#define SPI_SCK   13
#define SPI_SS    10

#define LED_PIN1  3
#define LED_PIN2  2

#define CLOCKOUT  9

void setup() {  
  Serial.begin(9600);
  pinMode( SPI_MOSI, OUTPUT );
  pinMode( SPI_MISO, INPUT );
  pinMode( SPI_SCK, OUTPUT );
  pinMode( SPI_SS, OUTPUT );
  digitalWrite( SPI_SS, HIGH );
  SPI.begin();
  SPI.setDataMode( SPI_MODE3 );
  SPI.setBitOrder( MSBFIRST );
  pinMode( CLOCKOUT, OUTPUT );
  TCCR1A = bit( COM1A0);
  TCCR1B = bit( WGM12 ) | bit( CS11 ) | bit( CS10 );
  OCR1A = 0xFFFF;  //7 = 1MHz, 15 = 0.5MHz
  pinMode( LED_PIN1, OUTPUT );
  pinMode( LED_PIN2, OUTPUT );
  onLed();
  delay(100);
  offLed();
  delay(500);
  onLed();
  delay(100);
  offLed();
}

void loop() {
  unsigned char c;
  unsigned char rc;
  if( Serial.available() ){
    onLed();
    c = Serial.read();
    digitalWrite( PIN_SPI_SS, LOW );
    rc = SPI.transfer( c );
    digitalWrite( PIN_SPI_SS, HIGH );
    Serial.write( rc );
    offLed();
  }
}
 
void onLed(){
  digitalWrite( LED_PIN1, HIGH );
  digitalWrite( LED_PIN2, LOW );  
}

void offLed(){
  digitalWrite( LED_PIN1, LOW );
  digitalWrite( LED_PIN2, HIGH );  
}

 

SPI制御は基本的にこれだけでできるので、便利ですね。

  SPI.begin();
  SPI.setDataMode( SPI_MODE3 );
  SPI.setBitOrder( MSBFIRST );
  SPI.transfer( c );



0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。

WSJT-X 2.7.0-rc3 公開

 WSJT-X 2.7.0-rc3 リリースノート 2024年1月1日 WSJT-X 2.7.0-rc3では、いくつかの新しい機能、たくさんの強化改善、バグの修正を行いました。 「Hamlib更新」機能追加。Windows版では、WSJT-Xから直接Hamlibを更新することがで...