Windows for IoT + AE-L6470DRV でサーボを動かす

Windows for IoT で SPI 通信 & サーボ モーターを動かしてみました。
サーボのドライバは秋月で売っていた AE-L6470DRV です。

基本的には以下のサイト様のコードを丸ごといただいています。
L6470ステッピングモータドライバキットでマイクロステップ

Arduino のコードから修正箇所は極めて少なく、C++ なのでプロトタイプ宣言しておくくらい。
(忘れて “c3861: 識別子が見つかりませんでした” で 3 分くらい悩みました。)

SPI.h をインクルードして普通に Arduino 感覚でという感じですね。

// 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

vinbox のファイル フォーマットについて

3D モデルの表現方法の一つとしてボクセル (2D で言うビットマップ) というものがあります。

いわゆるドット絵だったり、Minecraft がまさにそれですが、ボクセル形式の一つである vinbox 形式のファイル フォーマットについて今回はメモ程度に残しておきます。(本家にだいたい書いてあります。) このほかにも VoxCad などで用いられる vxc など複数のフォーマットを確認していますが、そちらはまた後日。

 

1. ヘッダ

ヘッダは ASCII で 5 行らしいです。(念のため改行コードの LF を示す n も書いてます。)

– 1 行目
#vinbox 1 (n)
vinbox のバージョン 1 を示します。

– 2 行目
   dim 4 4 4 (n)
xyz それぞれの解像度を示します。xyzは基本的に同一が望ましく、4 4 4 では 64 のボクセルを意味します。

– 3 行目
   transition xxx.xxx yyy.yyy zzz.zzz(n)
標準化する際に xyz 方向に動かした距離だと思います。(私の用途では使わないので無視しました。)

– 4 行目
   scale xxx.xxx yyy.yyy zzz.zzz(n)
xyz 方向の倍率だと思います。(これも使わないので私は無視しました。)

– 5 行目
   data(n)
以降がデータ本体であることを示します。

2. データ本体

本体はバイナリ形式で記録されています。なので、中身を見たい時はバイナリ エディタ (Windows であれば Stirling など) を利用する必要があります。

(参考)
バイナリ データとは…

http://izumi-math.jp/sanae/inf_box/dump/dump.htm

フォーマットの中身

2 バイトずつペアになっています。1 バイト目が 0 or 1 (ボクセルが存在するか否か)、2 バイト目がその値の連続数 (最大で 255 まで) です。

 

たとえば、以下のような場合…

00 2A 01 09 00 0C 01 01

0 が 2A (42) 個、1 が 9 個、0 が C (12) 個、1 が 1 個並んでいる事を意味します。これを省略せずに書くと以下の様になります。

0000000000000000000000000000000000000000001111111110000000000001

更に、書き換えると…

(2 次元)
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0011 1111
1110 0000 0000 0001

 

(3 次元)
– 1 段目
0000
0000
0000
0000

– 2 段目
0000
0000
0000
0000

– 3 段目
0000
0000
0011
1111

– 4 段目
1110
0000
0000
0001

 

という事です。

 

vinbox 形式は圧縮していることになるので、ファイル サイズが非常に小さく済むのが利点ですね。

その他のフォーマットだと、ASCII フォーマットだったり、XML だったりするので解像度が上がるにつれてファイル サイズが無視できなくなると思います。多くのファイルを扱う用途には vinbox が向いているかな。

Intel Edison の初期セットアップ

Windows で Intel Edison を使うまでに必要なセットアップ手順のメモ。

Intel さんの公式ムービーが上がっていたりするらしいので、ご参考に。
https://www.youtube.com/watch?v=lDKM7UKUL5A#t=57

あとドキュメントもありますね。
https://communities.intel.com/docs/DOC-23147

0. 目次

1. Edison の取り付け

2. ドライバのインストール

3. Arduino IDE のセットアップ

4. Linux イメージの更新

1. Edison の取り付け

Edison 本体をボードに取り付けて、ねじ止めします。
この際、GPIO の部分が壊れやすいそうなので丁寧に扱いましょう。(抜き差しは 30 回までだそうな。)
普通のPC で CPU をマザーボードに乗せる時と同じだと思えば、30 回は十分な数字なのかな。

IMG_20140906_141133.jpg

あとは、足をつけて、micro USB 2 本で PC に接続します。

2. ドライバのインストール

デバイス マネージャーを開くと、CDC Serial と RNDIS がドライバを認識できない状態で表示されています。

image

FTDI のドライバー (直リン) と、Windows Driver Setup をダウンロードします。
あと、ついでに Arduino Software とか Edison Yocto complete imageもダウンロードしておきましょう。
http://www.ftdichip.com/Drivers/CDM/CDM%20v2.10.00%20WHQL%20Certified.exe
https://communities.intel.com/docs/DOC-23242

image

ダウンロードした exe を実行して、インストールを完了します。

image

完了したら、デバイス マネージャーから “ドライバー ソフトウェアの更新” を選択。

image

続けて、“ドライバー ソフトウェアの最新版を自動検索します” を選択します。

image

image

image

“Intel Edison Virtual Com Port” と ”USB Serial Port” の COM ポートの番号を覚えておきましょう。

image

3. Arduino IDE のセットアップ

ドライバと同時にダウンロードした Arduino IDE は 7 ZIP 形式なので、WinRAR7ZIP で解凍しましょう。
この際、Galileo と同じく C ドライブ直下などに解凍しないと、フォルダの階層が深すぎてエラーになります。

image

解凍したフォルダから arduino.exe を起動します。

[ツール] – [マイコンボード] から [Intel Edison] が選択されていることを確認します。

image

同じく、[シリアルポート] で適切な COM を選択します。
COM ポートの番号は [デバイス マネージャー] で “Intel Edison Virtual Com Port” となっているものです。

image image

[Ctrl] + [U] もしくは、左上の [⇒] を選択して、Edison に書き込めれば OK です。
”Transfer complete” と表示されていれば成功、長々と warning が表示されていたら COM を確認します。

image

4. Linux イメージの更新

Linux のイメージ更新については以下に詳細あり。
https://communities.intel.com/docs/DOC-23192

先ほどダウンロードした Yocto complete image の中身を丸ごと Edison のドライブにコピーします。

image

続いて、puttyTera Term で接続して、更新を実行します。
デバイス マネージャーで “USB Serial Port” の COM ポートを確認。
ボーレートは 9600 ではなく 115200 にて接続します。

image

image

画面が黒いのみで何も出てこない場合は、Enter を連打しましょう。
root でログインしたら、reboot ota コマンドを実行します。

image

しばらく待って、再度ログインのプロンプトが表示されたらイメージ更新は完了。
先ほど Edison のドライブにコピーしたファイル群が消えていることも確認しておきましょう。
(残っていたらイメージ更新が成功していないかも)

image

image

以上で最低限のセットアップは完了。(のはず)

それでは、快適な Edison Life を!

Windows for IoT でのドライバ インストール方法

Windows for IoT ですが、GUI がないので、当然のごとく “デバイス マネージャー” が存在しません。

そこで、どうにかコマンドラインからドライバをインストールする方法を調べたところ ”devcon.exe” なるものがあるそうな。

 

ヘルプを見ると、こんな感じで使うらしい。

   > devcon.exe install <inf> <HWID>

C:windowssystem32>devcon help install

Devcon Install Command

Installs the specified device manually. Valid only on the local computer.

(To reboot when necesary, Include -r .)

devcon [-r] install <inf> <hwid>

<inf>        Specifies an INF file with installation information for the device.

<hwid>       Specifies a hardware ID for the device.

-r           Reboots the system only when a restart or reboot is required.

 

方法が分かったので、USB の NIC (GBE-USB3.0S) を使おうと、ドライバのインストールを試します。

C:windowssystem32>devcon.exe install c:NETAX88179_178a.inf USB_NIC

Device node created. Install is complete when drivers are installed…

Updating drivers for USB_NIC from c:NETAX88179_178a.inf

devcon.exe failed.

ダメらしい。

Win 7 / 8、32 / 64 bit のいずれのパターンでも失敗。
※ CPU は x86 なので 32bit のはずなのですが。

やっぱり通常の OS 向けドライバは無理ですかね。

教えてエロい人!

 

2014/12/26 追記

公式に記載がありました。やはり Quark の制約等もあって既存の Windows 向けドライバはダメだそう。
今のところは自分でドライバを書かないとダメそうなので、周辺機器周りは厳しいかもですね。

あと、DISM を使う手順が書いてあるのでご参考までに。

http://ms-iot.github.io/content/AdvancedUsage.htm

Windows for IoT で レジストリを書き換える

レジストリを書き換えようと思ったものの、Remote Registory サービスすら存在しないので、リモートから変更するとなると telnet して reg コマンドで地道に設定するしかない様子。

というわけで、試しに WIndows でルーティングをさせるためのレジストリを書き換えてみました。

聞くところによると、このレジストリを設定するだけで Windows がルーター代わりになるそうな。
(ただ、Galileo は NIC が一つしかないので意味がなさそうですが。)

普段通り telnet して、以下の様な感じでレジストリを書き換えます。

reg add HKLMSYSTEMCurrentControlSetServicesTcpipParameters /v IPEnableRouter /t REG_DWORD /d 0x1

※ お約束ですが、レジストリを誤って設定や削除してしまうと OS の動作に影響が出る恐れがありますので自己責任でお願いします。

以上、自分の為のメモ程度の落書きでした。

[参考]
http://www.atmarkit.co.jp/ait/articles/0402/21/news005.html
http://www.atmarkit.co.jp/fwin2k/win2ktips/450ipforw/ipforw.html

信頼されたルート証明書をグループ ポリシーで配布

自宅のサーバー群が増えてきたので、ルート証明書をポリシーで自動配布してみた。

“gpmc.msc” から、[既定のドメイン ポリシー] を編集。

[コンピューターの構成]

+ [Windows の設定]

   + [セキュリティの設定]

     + [公開キーのポリシー]

       + [信頼されたルート証明機関]

で、[インポート] して完了。

クライアントから “gpupdate /force” して、正常に配布されたことを確認して終了。

[参考]

http://technet.microsoft.com/ja-jp/library/cc772491.aspx