2015年1月11日日曜日

お手軽赤道儀自作 1.モーターの動作確認

1.材料

赤道儀自作のためにはステッピングモーターが必要ということはわかりましたが、ステッピングモーターは電池をつなげればすぐ回る といったものではないらしいのです。

色々調べたところ

[マイコン]→[ドライバー]→[モーター]
とつなげなければいけならしいのです。

【マイコン】
しかしマイコンって古いなー今はパソコンって言うんだよ なんてつっこみしながら調べていたらマイクロコンピュータでもマイコンピューターでもなくマイクロコントローラーの事らしいです。
スイッチのようなトリガーに反応してドライバーに命令を送る装置 のようです。

どうやら最近はUSBにつなげてプログラムを送る(コピーみたいな感じ)だけで、命令通りに端子の電圧をオンオフしたり、信号を送ったり、逆にセンサーの値を読み取ったりということをしてくれる装置があるらしいです。
すごい!
早速買いました。


こんなやつです。穴の空いた黒い部品のところに端子があって、そこの電圧を上げたり下げたりすることで信号をやりとりするらしいです。つまり、この端子を別の何かと接続するわけですね。

接続にはこんなヒモを使います。半田付けとかいらないので、簡単!オーディオの接続みたいな感じです。

【ドライバ】
マイコンからの命令を受け取って、モータを動かす信号(パルス)を発生させる装置のようです。仕組みとかさっぱりわかりませんが、売ってるので、それをそのまま利用することにします。ストロベリーリナックスと秋月電子から似たようなものが出ているのですが、ちょっとだけ大きいけどちょっとだけ安い秋月電子の方にしました。


【モーター】
とにかく、ギアなしでカメラを回すのですから、結構トルクが必要かなと思い、できるだけトルク値の大きいものと思いました。ウォームギアの孔径が5mm(←ここがみそ)なのでモータの軸が5mmだと都合が良いです。
そんなわけで、なんだかわからないですが、買いました。


【その他】
電池ボックス(単3x4) x2個
みの虫クリップ付きリード線 10本
ハンダ
半田ごて

2.動作テスト

【接続】
接続方法は他の人のブログなどを参照させていただきました。
リンク貼って良いかわからないのでつけてませんが、おそらく検索するとすぐに出てきます。
ズバリ結論だけいうと下図です。
少し迷ったのはモーターのケーブル(4本もある!)の接続順です。
この方向で、上から赤、 青、緑、黒で接続すればOK。

電池はまさかの12V!感電しそうで恐ろしい。
ドライバの拡大図です。ジャンパーピンの設定がいるのですが、それは説明書に書いてあります。1−2、3−4をつなげて使いました。マイコンの電源をこのドライバから供給する設定です。電圧足りないんだけど動きました。

さて、肝心のマイコンとの接続ですが、左側に見えている黒っぽい部分にあるピンを使います。全部で10ピンありますが使うのは中央の6個3〜8だけです。
みの虫クリップで挟んで以下のようにつなげました。

ドライバ3番(GND)→Arduino GND端子
ドライバ4番(EXT-VDD)→Arduino 3.3V端子
ドライバ5番(SDO)→Arduino 12番端子
ドライバ6番(CK)→Arduino13番端子
ドライバ7番(SDI)→Arduino11番端子
ドライバ8番(#CS)→Arduino10番端子

写真の端子の部分からはみ出てるアイアンクローみたいなものはハンダです。うっかりこの端子に接続するためのケーブルを買わなかったのでみの虫クリップを挟むための部分を作りました。
を買っておけばよかったです(使えるのか?)。

どうやらマイコンとドライバ間は「SPI通信」という方式を使うらしいのですが、さっぱりです。
Arduino(マイコン)にはプログラムをする際にズルできるように、あらかじめ誰かが作ってくれたプログラム(ライブラリ)が付いています。
通信する端子の番号だけ決めればあとは気にしないでプログラム(スケッチと呼ぶらしい)を書けばOK らしいです。

【Arduino】
Arduinoの使用方法に関しては割愛しますが実に簡単です。
Arduino IDEなるソフト(無料)をダウンロードして、そのソフト上でプログラム(スケッチと呼ぶらしい。。。)を書いて、コンパイル→送信のボタンを押すとすぐにそのプログラムが実行されますarduino上でです。

【スケッチ】
使用したスケッチです。誰かのをパクったものです。

#include <SPI.h> //ライブラリ読み込み

//ピン番号設定
#define PIN_SDO 11
#define PIN_SDI 12
#define PIN_SCK 13
#define PIN_PORTC 10

//モーター回転速度設定
long speed = 100000;

void setup()  //初期設定
{
//ピンの入出力を決定
pinMode(PIN_SDO, OUTPUT);
pinMode(PIN_SDI, INPUT);
pinMode(PIN_SCK, OUTPUT);
pinMode(PIN_PORTC, OUTPUT);


delay(2000); //よくわからないけどちょっと待ってみる

digitalWrite(PIN_PORTC,HIGH); //ドライバを命令を受け付けない状態にする

//SPI通信の初期設定
SPI.begin();
SPI.setDataMode(SPI_MODE3);
SPI.setBitOrder(MSBFIRST);

}


void L6470_run(long speed){ //ドライバに命令を送るサブルーチン
  unsigned short dir;
  unsigned long spd;
  unsigned char spd_h;
  unsigned char spd_m;
  unsigned char spd_l;

//マイナス値を入力したら回転方向を 反転する
  if (speed<0){
    dir=0x50;
    spd=-1*speed;
  }
  else{
    dir=0x51;
    spd=speed;
  }
  
//回転速度の設定をするための命令を作る
  spd_h=(unsigned char)((0x0F0000 & spd)>>16);
  spd_m=(unsigned char)((0x000FF00 & spd)>>8);
  spd_l=(unsigned char)(0x000FF & spd);
  
//ドライバに命令を送る
  L6470_write(dir);
  L6470_write(spd_h);
  L6470_write(spd_m);
  L6470_write(spd_l);
 }

  
 void L6470_write(unsigned char command){// ドライバに命令を送るサブルーチン
digitalWrite(PIN_PORTC,LOW);  //ドライバが命令を受け取れる状態にする
SPI.transfer(command);  命令を送る
digitalWrite(PIN_PORTC,HIGH); //ドライバが命令を受け取れない状態にする
  }
  
void loop(){   //本文
L6470_run(speed);
delay(3000);

}


3.結果
これで回りました。speedの値を変えることで速度も変わりました。
低速の時にどのくらいの精度が出ているのかわからないので不安ですが、、、、
俄然やる気出てきました。

以上

0 件のコメント:

コメントを投稿