Windows for IoT で SPI 通信 & サーボ モーターを動かしてみました。
サーボのドライバは秋月で売っていた AE-L6470DRV です。
基本的には以下のサイト様のコードを丸ごといただいています。
L6470ステッピングモータドライバキットでマイクロステップ
Arduino のコードから修正箇所は極めて少なく、C++ なのでプロトタイプ宣言しておくくらい。
(忘れて “c3861: 識別子が見つかりませんでした” で 3 分くらい悩みました。)
SPI.h をインクルードして普通に Arduino 感覚でという感じですね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | // Main.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "arduino.h" #include "SPI.h" #define PIN_SPI_SS 10 #define PIN_SPI_MOSI 11 #define PIN_SPI_MISO 12 #define PIN_SPI_SCK 13 void L6470_send(unsigned char add_or_val); void L6470_setup(); int _tmain( int argc, _TCHAR* argv[]) { return RunArduinoSketch(); } void setup() { // TODO: Add your code here pinMode(PIN_SPI_MISO, OUTPUT); pinMode(PIN_SPI_MOSI, INPUT); pinMode(PIN_SPI_SCK, OUTPUT); pinMode(PIN_SPI_SS, OUTPUT); SPI.begin(); SPI.setDataMode(SPI_MODE3); SPI.setBitOrder(MSBFIRST); //前のコマンドの引数を消去 L6470_send(0x00); //nop L6470_send(0x00); L6470_send(0x00); L6470_send(0x00); //デバイスリセットコマンド L6470_send(0xc0); //ResetRevice L6470_setup(); //L6470を設定 delay(1000); //連続運転 L6470_send(0x51); //Run(DIR,SPD),0x51:正転,0x50:逆転 L6470_send(0x00); //SPD値(20bit) L6470_send(0x40); L6470_send(0x00); delay(10000); L6470_send(0xB0); //SoftStop delay(1000); L6470_send(0x50); //Run(DIR,SPD),0x51:正転,0x50:逆転 L6470_send(0x00); //値(20bit) L6470_send(0x40); L6470_send(0x00); delay(4000); L6470_send(0xB0); //SoftStop delay(5000); L6470_send(0x50); //Run(DIR,SPD),0x51:正転,0x50:逆転 L6470_send(0x01); //値(20bit) L6470_send(0x00); L6470_send(0x00); delay(1000); L6470_send(0xB0); //SoftStop delay(5000); L6470_send(0x50); //Run(DIR,SPD),0x51:正転,0x50:逆転 L6470_send(0x01); //値(20bit) L6470_send(0x00); L6470_send(0x00); delay(1000); L6470_send(0xB8); //HradStop delay(5000); L6470_send(0x70); //GoHome delay(8000); } // the loop routine runs over and over again forever: void loop() { } void L6470_send(unsigned char add_or_val){ digitalWrite(PIN_SPI_SS, LOW); SPI.transfer(add_or_val); // アドレスもしくはデータ送信。 digitalWrite(PIN_SPI_SS, HIGH); } void L6470_setup(){ //最大回転スピード L6470_send(0x07); //レジスタアドレス L6470_send(0x00); //値(10bit),デフォルト0x41 L6470_send(0x30); //モータ停止中の電圧設定 L6470_send(0x09); //レジスタアドレス L6470_send(0x20); //値(8bit),デフォルト0x29 //モータ定速回転時の電圧設定 L6470_send(0x0a); //レジスタアドレス L6470_send(0x40); //値(8bit),デフォルト0x29 //加速中の電圧設定 L6470_send(0x0b); //レジスタアドレス L6470_send(0x40); //値(8bit),デフォルト0x29 //減速中の電圧設定 L6470_send(0x0c); //レジスタアドレス L6470_send(0x40); //値(8bit),デフォルト0x29 //フ ル ス テ ッ プ,ハ ー フ ス テ ッ プ,1/4, 1/8,…,1/128 ステップの設定 L6470_send(0x16); //レジスタアドレス L6470_send(0x00); //値(8bit)< } |
その他、Windows for IoT 用のプロジェクト作成手順とか、デバッグするホスト名の設定については Windows for IoT on Intel Galileoで L チカ を確認してください。
VS のプロジェクト ファイルも念のためおいておきます。Servo4IoT.zip