で、ステッピングモータも基本オープンで(脱調しなければ)何ステップ動かしたから、ここを向いているはずだということができて、しかもグルグル回せる(ラジコンサーボみたいに180度くらいを往復ではなくて)ので、車輪型ロボットの足回りに使ってみたいなと思っていたんですが、DCモータと違い、電気通せば回る(DCモータもそんなんじゃだめだろ?)っていうもんでもないので、使ったことがありませんでした。今回はそんなわけで、とりあえずステッピングモータを単純に回すところまで挑戦です。ここのところI2Cもののセンサが続きましたが、じつはSPIは使ったことがありませんでした。しかし、Arduinoなら、ちょいちょいとつないで、ライブラリを使えばOKです。(いや、素晴らしい。Arduinoあるいはライブラリを用意してくれた人たちに感謝しなくちゃね。)
パラメータとかスピードの設定によっては脱調して回らなくなって、電流ばっかり流れてモータが熱くなったりするので気をつけましょう。(→ 自分)
#include <Arduino.h> #include <SPI.h> // ピン定義。 #define PIN_SPI_MOSI 11 #define PIN_SPI_MISO 12 #define PIN_SPI_SCK 13 #define PIN_SPI_SS 10 #define PIN_L6470_SS PIN_SPI_SS // 関数プロトタイプ。 void L6470_write(unsigned char data); void L6470_init(void); void L6470_run(long speed); // グローバル変数。 long speed = 10000; void setup() { // ピン設定。 pinMode(PIN_SPI_MOSI, OUTPUT); pinMode(PIN_SPI_MISO, INPUT); pinMode(PIN_SPI_SCK, OUTPUT); pinMode(PIN_L6470_SS, OUTPUT); // SSはHigh(~SSをdisable)状態に。 digitalWrite(PIN_L6470_SS, HIGH); // SPI開始。 SPI.begin(); // シリアル通信。 Serial.begin(9600); // L6470の初期化。 L6470_init(); Serial.println("Start..."); // テスト回転。 L6470_run(speed); } void loop() { for (int i = 0; i < 5; i++) { speed += 10000; L6470_run(speed); delay (5000); } for (int i= 0; i < 5; i++) { speed -= 10000; L6470_run(speed); delay (5000); } } void L6470_write(unsigned char data) { // ~SSイネーブル。 digitalWrite(PIN_L6470_SS, LOW); // SPI転送。 SPI.transfer(data); // ~SSディスエーブル。 digitalWrite(PIN_L6470_SS, HIGH); } void L6470_init() { // MAX_SPEED設定。 /// レジスタアドレス。 L6470_write(0x07); // 最大回転スピード値(10bit) L6470_write(0x00); L6470_write(0x20); // KVAL_HOLD設定。 /// レジスタアドレス。 L6470_write(0x09); // モータ停止中の電圧設定(8bit) L6470_write(0xFF); // KVAL_RUN設定。 /// レジスタアドレス。 L6470_write(0x0A); // モータ定速回転中の電圧設定(8bit) L6470_write(0xFF); // KVAL_ACC設定。 /// レジスタアドレス。 L6470_write(0x0B); // モータ加速中の電圧設定(8bit) L6470_write(0xFF); // KVAL_DEC設定。 /// レジスタアドレス。 L6470_write(0x0C); // モータ減速中の電圧設定(8bit) L6470_write(0xFF); // OCD_TH設定。 /// レジスタアドレス。 L6470_write(0x13); // オーバーカレントスレッショルド設定(4bit) L6470_write(0x0F); // STALL_TH設定。 /// レジスタアドレス。 L6470_write(0x14); // ストール電流スレッショルド設定(4bit) L6470_write(0x7F); } 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)((0x00FF00 & spd) >> 8); spd_l = (unsigned char)(0x00FF & spd); // コマンド(レジスタアドレス)送信。 L6470_write(dir); // データ送信。 L6470_write(spd_h); L6470_write(spd_m); L6470_write(spd_l); }
0 件のコメント:
コメントを投稿