Windows 10 IoT Core on Raspberry Pi の情報先

Windows IoT のインストールが済んで、Lチカや “Hello World.” を表示し終わった後の情報先を羅列しておきます。どのように使うかは各人なのでしょうが、私の場合の例を挙げておくと、

  1. Raspberry Pi を XAML + デバイス機器として利用する
  2. Raspberry Pi の USB を活用する(Arduino だと USB の扱いは少々面倒なので)
  3. Raspberry Pi のカメラ機能を活用する

Windows IoT + Raspberry Pi に期待していたところが、主に2と3だったのですが、実際インストールしてみると1が結構使えそうです。2,3 は、Arduino でやろうとするとメモリの制約があったり、パフォーマンスに問題があったりして結構手間になるので、Rasbian(Linux)を使っていくところの延長です。まあ、その場合は、Linux 上で組んでも良い(OpenCV の組み合わせとかもあるし)のですが、そこは C# で組むということで Windows IoT を使います。

もうひとつは、HDMI 出力で XAML が簡単に使えるところです。これは意外だったのですが、Arduino でも Raspberry Pi でも小型液晶に出すパターンは多いのですが、大型液晶ディスプレイに出す例はあまりありません。RasPi の場合は Scratch でプログラミングというパターンもありますが、単純にデバイスの表示を画面に出すという点ではちょっと面倒です。面倒なので、CUI 的にターミナルで済ませてしまったりします。そういうところでは、GUI として XAML が使えるのは非常に便利です。確か、組み込み系 Windows としては GDI+ をサポートしない、と宣言されていたので、おそらく XAML で書いて出力させるのが Windows IoT 的には唯一の手段です。またスタート画面に示されているように、画像も出力ができます。

https://pbs.twimg.com/media/CD3M_BqVAAAKJ4c.jpg

以下は、Windows 10 IoT on RPi を構築するにあたっての情報先です。

情報先

フォーラム

  • Msdn forums – Windows IoT
    Microsoft サイト内のフォーラム。Windows IoT のインストールとか設定とかはこっちの方が適切でしょう。
  • Raspberry Pi • View forum – Windows 10 for IoT
    Raspberry Pi サイト内のフォーラム。Linux 系の RasPi を使ったことがあれば、こっちのほうがいいんでしょうが、Windows 特有の話は、MSDN フォーラムのほうがいいかも。

サンプル&映像

ひとまず、手元の RasPi 戦車が Win IoT でうごくようになったら、Hackster.io – The place where hardware gets created. に載せてみようかな、と計画中。

https://pbs.twimg.com/media/CESWgSZXIAEa_1F.jpg:large

カテゴリー: RaspberryPi, Win IoT | Windows 10 IoT Core on Raspberry Pi の情報先 はコメントを受け付けていません

Windows 10 IoT Core でアプリを起動する方法他

いくつか Windows 10 IoT Core on Rasberry Pi 2 のアプリを作っていてノウハウが溜まりつつあるので、ぼちぼちと OS 絡みをメモしておきます。

Win IoT は Visual Studio 2015 RC からデプロイできるので、お手軽で便利です。OS は Windows 10 TP でも、Windows 8.1 でも構いません。私は 8.1 のほうに Visual Studio 2015 RC を入れて動かしています。XAML のデザイナは動きませんが、Win IoT 自体にはあまり UI が必要がないので、まあそのままで。また XAML 自体は 8.1 のと互換がある(っぽい)ので、8.1 版のテンプレートを使って XAML をデザインして、IoT 版(Universal Windows版)にコピペしてもよいでしょう。

IoTCoreDefailtApp を立ち上げ直す

Win IoT on RPi2 を立ち上げると、最初はこの画面になるハズなのですが、なんとなく

IMG_0102

こんな風な、Windows ロゴ(だと思う)の画面で止まってしまうことがあります。暫く待っても前に進まないのでおかしいなーと思っていたのですが、上のウィンドウがフォアグランド(前面)になっていないだけっぽいです。

IMG_0103

Windows IoT Core Watcher からブラウザを選んで、起動しているプロセスをみています。左のメニューから「Apps」をクリックすると、今起動しているアプリが見れます。この中で、「IoTCoreDefailtApp」が、立ち上げ時に起動されるアプリになるので、「×」を押してプロセスを落とした後に、Installed apps でプロセスを選択して Start ボタンで再起動させます。

トップ画面では、有線 USB マウスが使えるようです。が、私の手元にある ELECOM の有線マウスは位置とびが激しくて使いものになりませんでした。

 

image

この画面でアプリをアップロードできるようですが、まあ、Visual Studio 2015 RC から直接アップロード(起動するだけ)したほうが手早いので、先行き使うということでしょう。

ちなみに、ここに出てくる謎な文字列は、ストアアプリではおなじみのアプリ ID で、パッケージマニフェストで変更が可能です。まだ、UI がテキストベース(Windows 8.1 でやっているから?)なのですが、ここの Identity タグの Name 属性を分かりやすくすれば ok ですね。これはストアにアップするときの ID になるので、自前でユニークになるように作ります(最初は自動で作ってくれる)。

image

パフォーマンスを見る

Win IoT ではバックグラウンドでプロセスを動かすこともできる(試してないが)ので、何かが暴走してしまって遅くなる?こともあるでしょう。ということで、プロセスをモニタの機能があります。「Processes」をクリックすれば、プロセスの一覧が見れて、対象のプロセスを落とすこともできます。ただし、単独のプロセスを立ち上げる機能はないので、変なことになったらリセットすればよいです。

image

デバイスマネージャを見る

Device Manager で見ることができます。PC のデバイスマネージャですね。ファイル保存して、メモ帳で見て、デバイスIDをコピーしたり、サービス GUID をチェックしたり、という使い方でしょう。

image

Miracat HID が入っているので、有線 USB マウスとか、有線 XBOX コントローラとかが動くのだと思う。Bluetooth ドングルとか、無線マウスとか動かないですかね?

ネットワークアドレスを見る

Networking をクリックすると、RasPi に割り当てられている IP アドレスが見れます。有線 LAN のほうしか有効でなくて、WiFI の USB ドングルを差しても無反応です。

image

見ると分かりますが、WiFi adapters や Profiles で接続先の SSID を選択できるようになっているので、無線LANの用意はされているようなのですが…現状は動かないんですかね?

次はモータードライブ L293D を動かす

ちょっと古めの L293D で、2個のモーターが動いたので後で公開しておきます。今は、L293N を調達するか、秋月電子で SN754410NE か TB6674PG を買うとよいでしょう。2個ワンセットで動かせと便利です。

https://pbs.twimg.com/media/CESWgSZXIAEa_1F.jpg:large

高機能なハット(シールド)を買ってもいいのですが、チップ1個だけでいけるので慣れるとこっちのほうが量産ができます。1個だけ作るならば、Adafruit DC & Stepper Motor HAT for Raspberry Pi – Mini Kit ID: 2348 – $22.50 : Adafruit Industries, Unique & fun DIY electronics and kitsAdafruit Motor/Stepper/Servo Shield for Arduino v2 Kit [v2.3] ID: 1438 – $19.95 : Adafruit Industries, Unique & fun DIY electronics and kits な感じで買えばいいのですが、多少高いのと、Windows.Devices.Gpio のピンが固定になっているので、動かない可能性があるので注意が必要です。

ちなみ上のモーターは、美工社の小学生学習キットのモーターです :) 低速ギア付きで2個 480円也。

カテゴリー: RaspberryPi, Win IoT | Windows 10 IoT Core でアプリを起動する方法他 はコメントを受け付けていません

Win IoT on RasPi と F# PCL の組み合わせでLチカ

どうせなので、Win 10 IoT を F# でやろうと思って、手始めに F# PCL と組み合わせてみます。C# の Windows Universal と、 F# の Portable Class Liberary との組み合わせです。

F# PCL を追加する

image

ポータブルクラスライブラリから、IoT のライブラリの参照はできないので、C# -> F# の呼び出ししかできませんが、適当なコールバック(乃至はイベント)を追加してやれば、C#/F# 間の行き来が可能です。MVVM の ViewModel を F# 側で作っておいて、C#/XAML に表示させるという方法でもよいでしょう。

image

F# のラインタイムは F# 4.0 ( FSharp.Core, 3.47.4.0)で動作確認しています。おそらく、その前のバージョンでも動くハズ。このあたりは、Xamarin.iOS/Android と同じになるので、PCL の範囲内で作っておけば動きます。

C# のコード

Lチカをさせているところで、F# を使ってカウントアップ。あまり意味はないけど、一応 F# のライブラリを呼び出しているということで。タクトスイッチの ValueChanged イベントはおまけです。Win IoT では、スイッチを押したときの ON/OFF をイベントで取得することができます。注意しないといけないのは、イベント自体は UI スレッドとは違うので、表示するときにはディスパッチを使います。このあたりはスレッドや非同期処理をしている方や、割り込み制御をしたことがある方にはおなじみなところです。

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
        this.Loaded += (s, e) => main();
    }
    const int LED1_PIN = 13;
    const int LED2_PIN = 26;
    const int SW_PIN = 16;

    /// <summary>
    /// メインループ
    /// </summary>
    void main()
    {
        var gpio = GpioController.GetDefault();
        var LED1 = gpio.OpenPin(LED1_PIN);
        var LED2 = gpio.OpenPin(LED2_PIN);
        var SW = gpio.OpenPin(SW_PIN);

        LED1.SetDriveMode(GpioPinDriveMode.Output);
        LED2.SetDriveMode(GpioPinDriveMode.Output);
        SW.SetDriveMode(GpioPinDriveMode.Input);
        LED1.Write(GpioPinValue.Low);
        LED2.Write(GpioPinValue.Low);

        /// F# の PCL クラスを作成
        var fs = new PclFSharp.Sample();
        textName.Text = fs.Hello("masuda");

        int count = 0;
        new Task(async () => {

            while (true)
            {
                /// F# 内でカウントアップ
                count = fs.Add(count, 1);
                await textCount.Dispatcher.RunAsync(
                    Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                    { textCount.Text = string.Format("count: {0}", count); });

                LED1.Write(GpioPinValue.High);
                await Task.Delay(500);
                LED1.Write(GpioPinValue.Low);
                await Task.Delay(500);
                LED2.Write(GpioPinValue.High);
                await Task.Delay(500);
                LED2.Write(GpioPinValue.Low);
                await Task.Delay(500);
            }
        }).Start();

        // タクトスイッチの変更イベント
        SW.ValueChanged += async (s, e) =>
        {
            var text = SW.Read() == GpioPinValue.Low ? "OFF" : "ON";
            await Dispatcher.RunAsync(
                Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                { textSw.Text = text; });
        };
    }
}

F# のコード

F# のコードがあまりチープなので実用性はないのですが、ひとまず動作確認まで。本当は、ここで LED の制御とかをやりたいのですが、IoT が参照できないので、制御自体は C# 側でやります。F# 側では、純粋にロジックを組めばよいかと。

 
type Sample() = 
    member this.X = "This is F# PCL"
    member this.Add(x,y) = x + y
    member this.Hello(name) = "Hello, " + name

 

動作させる

面倒なので、HDMI 出力させています。本来ならば、RasPi 付属の液晶ディスプレイとか使いたいところですよね。そのあたりはいずれ I2C 制御を試してから。

https://pbs.twimg.com/media/CEP_E6LUIAAwYUN.jpg

こんな風に LED 2個とタクトスイッチを扱います。USB 接続しているのは ELECOM の有線マウスなのだけど、うまく動かなかった。有線 USB のマウスだと動く場合もあるそうなので、まあ相性ということでしょう。折角買ったんですが、暫くお蔵入りです。

https://pbs.twimg.com/media/CEP_E3SUMAEQXQ1.jpg

というわけで、F# との組み合わせができることが確認できました。ということは、PCL 全般は大丈夫そうですね。また、ロジックのコードさえあれば、Windows デスクトップでテストをしてから、Win IoT のほうに持っていくということも可能です。

お次は RasPi 用のモーター制御用のハットを作って、実際に RasPi 戦車を作ってみようかなと。手元にあるハットはピンが異なってダメなので、自前で作ります。RasPi のモーター制御用のハットって意外と高いので。

カテゴリー: RaspberryPi, Win IoT | Win IoT on RasPi と F# PCL の組み合わせでLチカ はコメントを受け付けていません

Windows 10 IoT on RasPi で Lチカとモーター制御

無事、RasPi2 上で Hello world が出せたので、今度は Lチカをやってみます。Lチカ等のサンプルは、win-iot の github にあって、https://github.com/ms-iot/samples/tree/develop/Blinky/CS なところに C# のサンプルコードがあります。RasPi2 で Windows 10 IoT を使う利点としては、画面上に何か出すの非常に簡単(ストアアプリと同じように XAML を書けばよい)が挙げられます。いまのところ、HDMI 経由のサンプルしかないのですが、そのうちキャラクタ液晶に出力するサンプルも出るかもしれません。

Raspberry Pi 2 のピン

Windows IoT – RPi2 Pin Mappings にマッピングが表示されています。以下にそのまま引用します。

https://ms-iot.github.io/content/images/PinMappings/RP2_Pinout.png

ここの GPIO x のところにピンを差して Lチカをします。Arduino と違ってオスピンになっているので、ジャンパーピンのオス・メスを使わないといけないところなのですが、面倒なので HDD で使われているフラットケーブルを使います。こんな風に、フラットケーブルを差しておくと、普通のオス・オスのピンが使えるようになります(左右が逆になるので注意が必要ですが)。Raspberry Pi 電子工作レシピ に載っていた方法です。

https://pbs.twimg.com/media/CD7n7TXUIAAmzOP.jpg:large

ここでは、GPIO 13 と GPIO 26 に繋げて交互に Lチカをさせています。

Lチカのソースコード

さっくりとワンソースで書くとこんな感じになります。

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
        this.Loaded += MainPage_Loaded;
    }

    private void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        /// プログラム開始
        main();
    }

    const int LED1_PIN = 13;
    const int LED2_PIN = 26;

    /// <summary>
    /// メインループ
    /// </summary>
    void main()
    {
        var gpio = GpioController.GetDefault();
        var LED1 = gpio.OpenPin(LED1_PIN);
        var LED2 = gpio.OpenPin(LED2_PIN);

        LED1.SetDriveMode(GpioPinDriveMode.Output);
        LED2.SetDriveMode(GpioPinDriveMode.Output);
        LED1.Write(GpioPinValue.Low);
        LED2.Write(GpioPinValue.Low);

        new Task( async () => {
            while( true )
            {
                LED1.Write(GpioPinValue.High);
                await Task.Delay(500);
                LED1.Write(GpioPinValue.Low);
                await Task.Delay(500);
                LED2.Write(GpioPinValue.High);
                await Task.Delay(500);
                LED2.Write(GpioPinValue.Low);
                await Task.Delay(500);
            }
        }).Start();
    }
}
  1. using Windows.Devices.Gpio; で名前空間を指定する。
  2. gpio.OpenPin で指定ピンをオープンする
  3. SetDriveMode で、出力(GpioPinDriveMode.Output)に設定する。
  4. 初期値は、消えている状態(GpioPinValue.Low)にしておく。
  5. Task クラスを使って、スレッドでぐるぐる廻します。間隔は Task.Delay が使えます。

C# を使うと、Task も使えるしラムダ式も使えるし簡単ですね。普通のストアアプリのように書くことができます(実は、.NET micro でも同じように書けます)。Visual Studio を使うとデバッグで一時停止させることもできるので、途中で値を確認することが可能です。

わざわざ、this.Loaded の時に Lチカを開始しているのは、今後画面アクセスをするときの開始タイミングをずらすためです。MainPage のコンストラクタで開始をしてしまうと、画面表示をしようとしてもまだ画面が作成させていない場合があるからですね。このあたりは、WPFやストアアプリと同じノウハウが使えます。

TA7267BP を使ってモーター制御をする

Lチカだけだとつまらないので、もう少しだけやっておきます。本当は、Raspberry Pi のモーター制御用のハット(Arduino のシールド)を使いたかったのですが、どうやら Windows 10 IoT の場合は、SPI 用のピンを GPIO のピンに差し換えできるような仕組みはないらしく、手元のハットが使えませんでした。仕方がないので、手元にあるモータードライバーで動作確認だけやっておきます。

image

配線はこんな感じで、モータードライバーを GPIO 5 と 6 を使って制御します。GPIO 5 が ON の時にはモーターが前進、GPIO 6 が ON のときはモーターが後進するようにプログラムを作ります。TA7267BP 自体は、ロジックの電源とモーターを流すための電源とを別々に取れるのですが、ここでは面倒なので、両方とも RasPi から取るようにしています。本来はコンデンサを挟まないといけないところですが、実験なのでこのままで。

モーター制御するコード

先に動かした LED のコードにモーター制御のコードを追加していきます。

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
        this.Loaded += MainPage_Loaded;
    }

    private void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        /// プログラム開始
        main();
    }

    const int IN1_PIN = 5;
    const int IN2_PIN = 6;
    const int LED1_PIN = 13;
    const int LED2_PIN = 26;

    /// <summary>
    /// メインループ
    /// </summary>
    void main()
    {
        var gpio = GpioController.GetDefault();
        var LED1 = gpio.OpenPin(LED1_PIN);
        var LED2 = gpio.OpenPin(LED2_PIN);
        var IN1 = gpio.OpenPin(IN1_PIN);
        var IN2 = gpio.OpenPin(IN2_PIN);

        LED1.SetDriveMode(GpioPinDriveMode.Output);
        LED2.SetDriveMode(GpioPinDriveMode.Output);
        LED1.Write(GpioPinValue.Low);
        LED2.Write(GpioPinValue.Low);
        IN1.SetDriveMode(GpioPinDriveMode.Output);
        IN2.SetDriveMode(GpioPinDriveMode.Output);
        IN1.Write(GpioPinValue.Low);
        IN2.Write(GpioPinValue.Low);

        new Task( async () => {

            while( true )
            {
                LED1.Write(GpioPinValue.High);
                IN1.Write(GpioPinValue.High);
                await Task.Delay(500);
                LED1.Write(GpioPinValue.Low);
                IN1.Write(GpioPinValue.Low);
                await Task.Delay(500);
                LED2.Write(GpioPinValue.High);
                IN2.Write(GpioPinValue.High);
                await Task.Delay(500);
                LED2.Write(GpioPinValue.Low);
                IN2.Write(GpioPinValue.Low);
                await Task.Delay(500);
            }
        }).Start();
    }
}

やっていることはLチカと変わりませんね。モーターを制御する IN1/2 が両方ONにならないように注意すれば、モーターの正反転が簡単にできます。ここでは一つだけのモーターを使いましたが、2つ制御できれば車輪を使ったロボットが動かせるわけです。

https://pbs.twimg.com/media/CD7oBC3VAAMqBud.jpg:large

 

無線化をする

このままだと常に有線LANがつながった状態になるので、無線化をします。xbox のコントローラーを使うか、Bluetooth でスマートフォンから制御するか、は後から調べることになるのですが、ms-iot のサンプルを見る限り、既に xbox コントローラで動かしたサンプルがあるので、それを流用すると楽かもしれません。ということで、こっちのほうは後日。

カテゴリー: RaspberryPi, Windows 10 | 1件のコメント

Raspberry Pi 2 に Windows 10 IoT Core を乗せて Hello world するまで

詳細は、公式 Windows IoT – Get Started と、翻訳 Raspberry Pi 2へのWindows 10 IoT Core Insider Preview版のインストール方法 ≫ DesignSpark を見てもらうとして、RasPi に Windows IoT を乗せるときに躓きそうな点を補足しておきます。

micro SD カードに Windows IoT Core を焼く

Widows 10 が乗るのは、Raspberry Pi 2 のみで、それ以前のものはダメな訳ですが、Get Started からダウンロードできる、Windows_IoT_Core_RPI2_BUILD.zip の中にある Flash.ffu ファイルを焼くことができるのは Windows 10 TP だけです。Raspberry Pi に Linux を入れるときに Win32DiskImager などを使っていると思うのですが(Linux のコマンドを使って書き込むこともできます)、Windows IoT の場合は、Windows 10 にある dism コマンドというものを使います。

diskpart
list disk

を使って、ここに出てくるドライブの番号(micro SDカードのドライブ番号)を使って、dism.exe /Apply-Image /ImageFile:flash.ffu /ApplyDrive:\\.\PhysicalDriveN /SkipPlatformCheck のように書き込みます(PhysicalDriveN の部分は、ドライブ番号に従って、PhysicalDrive3 のように書き換えます)この時、Windows 8.1 にある dism コマンドには /ApplyDrive スイッチがなくて書き込めないのです。この /ApplyDrive スイッチは、Windows 10 TP にしかありません。公式サイトには、最新の Windows TP より高いものと書いてありますが、ちょっと前のバージョンでも大丈夫でした。

朗報です、VMWare Player に Windows 10 TP を入れて micro SD カードをドライブとして認識させてから、同じように dism コマンドを使って書き込むことができます。これで、実機の Windows 10 がなくても RasPi に Windows 10 IoT が入れられます。

ちなみに、一度書き込んだ micro SD カードを Win32DiskImager でバックアップを取って、再び書き込むと正常に動作しました。なので、雛形の SD カードを作っておいて、コピーを取って増産することは可能です。

Windows 10 IoT Core を起動する

PC から micro SD カードを焼いたら、Rapberry Pi 2 に差し込んで起動します。Boot Windows 10 IoT Core Insider Preview にある通り、

  • micro SD カード
  • LAN ケーブル
  • HDMI ケーブル
  • 電源用の USB ケーブル

を差して起動します。スターンドアローンなのだから、と思って LAN ケーブルを差し込まずに立ち上げると、起動に失敗します。リモートデバッグ用のサービスが常に立ち上げって来るためか、IP が必ず必要になります。ただし、2度目以降の場合には、LAN ケーブルがなくてもうまく立ち上げります。

USB コネクタにマウスを差しても無反応です。Raspberry Pi のサイトでは xbox のコントローラを差しているシーンがあるので、後からの設定で可能かもしれません。

初回の起動は時間がかかって 2,3 分かかります。何度か真っ黒な画面になりますが、右上にカラー指標の表示が出ていれば大丈夫です。

https://pbs.twimg.com/media/CD3M_BqVAAAKJ4c.jpg

Windows IoT Core Watcher で接続する

このままでは何もできないので、RasPi に接続します。接続する方法は2種類あって、

  • Windows IoT Core Watcher
  • PowerShell

があります。Windows IoT Core Watcher は、Windows 8.1 のブラウザ(Windows 10 の H” を使っても ok です)を使ってアプリをデプロイしたり、プロセスを見たりできます。PowerShell のほうは、普通にリモートログインする方法なので、通常の Windows サーバーと同じように扱えます(中身は違うでしょうが、コマンド自体は大体同じはずです)。

Windows_IoT_Core_RPI2_BUILD.zip を解凍したときの、WindowsDeveloperProgramForIoT.msi を実行すると、Windows IoT Core Watcher がインストールできます。RasPi にインストールした状態では、ホスト名が minwinpc になっているので、ping 等で確認すればよいでしょう。公式サイトにたくさんの minwinpc が並んでいるのはネットワーク上にたくさんの RasPi があるからです。

image

注)Windows 10 IP + Visual Studio 2015 RC の環境や、素の Windows 8.1 の環境に入れても、この画面がでないことがあります。この場合は http://minwinpc/ を直接開けば大丈夫です。つまりは、80 ポートがマネージャ用に常に利用されているということです。

あるいは、

Raspberry Pi ? View topic – WindowsIoTCoreWatcher
https://www.raspberrypi.org/forums/viewtopic.php?f=105&t=109192

を参考にして、

sn -Vr WindowsIoTCoreWatcher.exe
corflags WindowsIoTCoreWatcher.exe /32BIT+ /FORCE

を実行してください。64bit版の Windows の場合に上記の現象が発生するとのこと(おそらく、MS開発者の環境が 32bit なのでは?という推測がw)

繋げたい RasPi を選択して、右クリックから Web Browser Here を選択すると、B Web Management というのが開かれます。アプリのデプロイ用の画面やパフォーマンス、プロセスを見ることができます。

image image

左上にシャットダウンや再起動のボタンがあるので、これを利用すればよいでしょう。画面自体はマウスが効かないので、触れないので。まあ、所詮マイコンレベルなので、USB 給電のケーブルをぶちッと抜いても大丈夫です。たまにファイルが壊れるようですが、だいたいが復旧してくれます。

PowerShell でログインする

Windows IoT – Use PowerShell to connect to a Windows IoT Core device. のようにすると、PowerShell を使って RasPi に接続できます。この例では Windows 10 TP からになっていますが、Windows 8.1 からでも大丈夫です。

image

初期のホスト名は minwinpc なので

Set-Item WSMan:\localhost\Client\TrustedHosts -Value minwinpc
net start WinRM
Enter-PsSession -ComputerName minwinpc -Credential minwinpc\Administrator

とすると、管理者権限でログインができます。パスワードの初期値は、p@ssw0rd です。

Hello World を作る

IoT 絡みの最初としては Lチカなので、https://github.com/ms-iot/samples の Blinky を動かしても良いのですが、あえて Hello world. を動かしてみます。基本的なところは Windows IoT – HelloWorld にある通りですね。

Windows 8.1 に Visual Studio 2015 RC を入れます。Windows ストアアプリを作らないのであえば、Windows 8.1 でも大丈夫です。シミュレータ上で動かすので、Windows Phone 10 のアプリは作れるようですね。

.Net micro のようにテンプレートが分かれていないので、Windows Universal アプリで作ります。

image

ペタペタと Hello World のボタンとラベルを貼って、ボタンをクリックしたときのイベントを書きます。実際には RasPi からボタンをクリックできないのですが(多分、USB が反応していないだけだと思う)、まあ一通り作ります。

RasPi への動作は「リモートコンピュータ」で、RasPi のホスト名「minwinpc」を指定すれば ok です。このとき、Windows 認証のチェックを外しておきます。もうひとつ、ソリューションプラットフォームを「ARM」にします。RasPi では CPU が ARM なので、初期値の x86 では動きません。

うまくビルドとデプロイが成功すると、HDMI 接続されているディスプレイに Hello world が表示されます。

https://pbs.twimg.com/media/CD44CvOUUAAtGZA.jpg

Lチカの準備をする

Windows IoT – Blinky Sample を見ながらプログラムを組んでいきます。新規にプロジェクトを作るときは参照設定で、Windows IoT Extension SDK を入れておきます。

image

netduino を使って .net micro を扱ったことのある方は、だいたい似たような感じになっていることが分かるでしょう。Windows.Devices.Gpio 名前空間で GPIO の LOW/HIGH を設定すれば、そのまま完成です。タイマーイベントとか、タクトスイッチのイベントにはラムダ式を使えるので、そのあたりでは C# が便利です。

ひとまず、Netduino で作った TA7291P モータードライブを Netduino でリモート制御する | Moonmile Solutions Blog を、RasPi に直していこうかなと思っています。出来上がったら、ぼちぼちと追記していきますので。

追記

カテゴリー: RaspberryPi, Windows 10 | 3件のコメント

グリッパーアームロボットを Arduino で制御する準備

先日買った、ロボットアームは、以下のように5つのモータを7つの配線で制御している。電子部品は使わずに、電源を2つ持たせることでモーターを正逆転させるという古風かつ便利な仕組みです。image

左半分がモーターと電源を含む本体で、右半分がコントローラー。7本のコネクタを使ってコントローラーと接続さえている訳で、このコントローラ部分を Arduino に置き換える目標を立てます。が、ここの部分って、モーター電源と信号線を兼ねてしまっているので、どうせ H ブリッジ方式に切り替えるのだから、モーターから2線を受け取ってしまって、普通にブラシモーターを正逆転させる方式でもよいかな、と。

まあ、それでも思考実験的に考えると、配線はそのままにしてスイッチ部分をリレーに切り替えるのがベタなな手段だと思います。あるいは、コンデンサを使って増幅してやればいいと思うのですが、ですが、なんかあれこれと面倒臭そうなので、素直にモータードライバを使おうかなと。リレーでカチカチやってみたいのですが、これは購入した時点でいずれ。

カテゴリー: 開発 | グリッパーアームロボットを Arduino で制御する準備 はコメントを受け付けていません

ロボットアームを買ったので、改造計画を立てる

勢い余って組み立て式のロボットアームを買いました。ロボットアームって、ブーム自体は2,3年ぐらい前にあって、各社で発売されていたのですが結構高価だったのとブームが家庭用二足ロボットに移ってしまったのか、今日び非常に手に入りにくい状態でした…まあ、結構な値段だったので手が実験にせよ手が出なかったわけですが。

で、ebay なんかを眺めていると、↓なロボットアームが売っていてですね、もうちょっと調べていくと amazon にもありました。Amazon.co.jp | グリッパーアームロボット 40320C | おもちゃ 通販 今回買ったのは amazon ではないのですが、何故か色々な値段であちこちで売っています。在庫処分っぽい感じ。

https://pbs.twimg.com/media/CDZkJfZVIAAGG2d.jpg:large

発売元が、株式会社イスペット でメイドイン台湾です。amazon の評にもありますが、コントローラが非常に固くて子供に手には…つーか、大人の指にまめができそうなぐらいなんですけど、これはコントローラの接点で使っている金具の強度の問題ですね。曲げをもう少し緩くすればいい感じになるかと。モーターは5個入っていて、台座+アームの開け閉め+腕x3 という構成です。惜しいのは手首部分の回転が入っていないので、アームが回転しません。あと、モーター自体は普通のブラシモーターでサーボモーターではありません。つまり、電子回路制御ではないんですよね。廻しすぎるとギアが外れてカチカチなるようになっている(構造上そうなっている)ので、それはそれで良いのです。電池は、単1電池を4個という構成になっていますが、実はモーターを3Vで動かします。そう、モーターの駆動部分には電子部品を使っていないので、電源2個使ってモーターの正逆をする回路になっています。すごい。というわけで、全く電子部品を使っていないので、5,000円程度という格安な値段になっています。サーボモータを使っていないのも安い要因かと。

外枠はプラモデルの要領で作って、約2時間ほどかかります。部品はそれほど多くないのだけど、はめ込み式ではなくてビスで止めるので、ちょっと手間がかかります。ですが、後から外すこともできるわけで、改造はできそうですね。

現状の回路は、こんな感じになっています。電源を2つ反転させておいて、スイッチで切り替える古式ゆかしき方式。電子部品を使わないので、半田付けもないし難しい基盤も必要ありません。

image

ただし、これだと Arduino とかのマイコンからは制御しづらいので、適当にモータードライバを差し込んで、回路から制御できるようにしましょう。

ちなみに、今日1日試してみた感じでは、積木を詰める位の精度があります。単1電池4個分の重さもあって結構台座が安定しているので、アームをきりきりと動かすして何かを挟んで持たせることができます。こうなったら、車輪を付けて自走させてもいいんじゃないかってほどの安定性があります。

そんな訳でこれを参考にして、

  • LEGOと安価なサーボモータで別のアームを作る。
  • 手元の meArm の制御を Arduino に移す。
  • このロボットアームの Arduino 化&無線化

をやっていこうかなと。

ちなみに、このロボットアームの電子回路版を海外のサイトで見つけました。1万円位だったので、まあ、電子制御の部分は勉強がてら自分で作るのが良いかなと思って。

カテゴリー: Arduino | ロボットアームを買ったので、改造計画を立てる はコメントを受け付けていません

.NETラボ 4月号で発表した Bluetooth の話

[slideshare id=47146691&doc=arduinotankmeetsbluetooth-150418122039-conversion-gate01]

ざっと1時間で流していった発表資料です。本来ならば Bluetooth Low Energy のほうの実装を実演すると良かったのですが、デモのほうは Bluetooth 2.0 を使ってシリアル通信をやっています。コードは、部分的ではありますが、

  • Android アプリで BluetoothAdapter を使ってシリアル通信
  • Windows ストアアプリで RFCOMM クラスを使ってシリアル通信
  • WPF アプリで WinRT の RFCOMM クラスを使ってシリアル通信

の 3パターンが書いてあります。実は Windows Phone 10 TP を使っての通信もできています。

動かす Arduino Tank のほうは、HC-05 の Bluetooth 2.0 モジュールを使って通信させています。BT 通信を使うメリットとしては、「WiFi のようにアクセスポイントが必要ない」の一言に尽きます。家で使うとか、庭でアクセスするとかであれば無線LANを使えばいいのですが、あれこれと Raspberry Pi を使って meArm を動かして気づいたのですが、結構 WiFi だと実演が面倒なんですよね。BT の場合もアクセスポイントの混線の問題もありますが( BT の場合、実質 30 台ぐらい同時接続すると無理だと思う)、WiFi のほうが繋がりが悪くてよく切れます。あと、公園に持っていて手軽に動かせるのも BT の利点です。技適の問題もありますが、スライドにもあるように 2.4GHz 帯はラジコン電波の領域なので、Class2 までの弱い電波ならば大丈夫です。むしろ、WiFi の 5GHz のほうが問題だったりする訳なので、そのあたりは良識に任せてなんなんとしましょう。

スライドの後ろのほうには、Bluetooth の購入先が書いてあります。日本の販売店があまりないのは、値段が高いからっていうのと、手軽に eBay.com で揃えたほうが安く上がるためです。まあ、中国から送ってくるので、2,3週間は覚悟しないといけないので、そのあたり、手早く手に入れたい場合は日本の販売店で、故障も含めて大量に仕入れたい場合は中国で、という使い分けをします。ちなみに、ebay が常に安いわけではなく、中国の工場や互換品を買うと安く手に入りますが、アメリカや日本の製品だとあまり変わらないか高くつきます。このあたり、送料なんかも調べて買うとよいです。

image

ちなみに、Arduino Uno の互換ボードは 7$ ぐらいで買えるので、これも壊しても惜しくない値段で手に入れられます。Arduino Mini だと 3$ ぐらいだから、ユニバーサル基板に半田付けして大量に使うこともできますね。

Bluetooth LE のほうは、ヴィストン社で BLEduino や、あれから Koshian を手に入れたので、それのテストが終わったら、また発表したいと思います。

カテゴリー: Arduino, Bluetooth | .NETラボ 4月号で発表した Bluetooth の話 はコメントを受け付けていません

Arduino で TB6612FNG を使ってモーター2個を制御する

海外のモータードライバと言えば L293D が乗っていることが多いのですが、ぼちぼちと SN754410NE に切り替えるのか?と話題があって。こっちのほうは秋月電子で150円で買えます。

それとは別に、TB6612FNG を買ってみたのでお試しとして。手元にあるのはスイッチサイエンスのものではなくて互換品で 3$ 程度で買っています。

ブレッドボードで配線

それぞれのモーターに対して IN/OUTが2本ずつとPWM線があるので、結構本数が多いのが難点ですね。まあ、Arduino Tank を動かだけの2個のモーターならばいいけど、多脚ロボットにしてそれぞれの足にモーターが付いている、ということになると、ちょっと考えないといけないかも。I2C 経由にすればよいのですが。いずれ ロジコマ作ってみる【ぼーだー1】 ‐ ニコニコ動画:GINZA を参考にして作ってみたいところ。

image

回路図

無線化もあわせると、こんな感じ。

image

ブレッドボードに配線すると、こんな感じで動きます。

埋め込み画像への固定リンク

 

実験用のコード

まだ Bluetooth のコードは入れていないので後で。

#include <Wire.h>

const int motorA1 = 8;  // IN1
const int motorA2 = 9;  // IN2
const int motorAp = 10;  //
const int motorB1 = 7;  // IN1
const int motorB2 = 6;  // IN2
const int motorBp = 5;  //
const int STBY = 11;
void setup() {
  // put your setup code here, to run once:
  pinMode( motorA1, OUTPUT );
  pinMode( motorA2, OUTPUT );
  pinMode( motorAp, OUTPUT );
  pinMode( motorB1, OUTPUT );
  pinMode( motorB2, OUTPUT );
  pinMode( motorBp, OUTPUT );
  pinMode( STBY, OUTPUT );
  
  digitalWrite( motorA1, LOW );
  digitalWrite( motorA2, LOW );
  digitalWrite( motorAp, LOW );
  digitalWrite( motorB1, LOW );
  digitalWrite( motorB2, LOW );
  digitalWrite( motorBp, LOW );
  digitalWrite( STBY, HIGH );
  
  Serial.begin(9600);
  Serial.println( "Motor Standby" );
  delay( 1000 );
}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println("motorA forward");
  digitalWrite( motorAp, HIGH );
  digitalWrite( motorA1, HIGH );
  digitalWrite( motorA2, LOW );
  delay( 3000 );
  Serial.println("motorA stop");
  digitalWrite( motorAp, LOW );
  delay( 1000 );
  Serial.println("motorA back");
  digitalWrite( motorAp, HIGH );
  digitalWrite( motorA1, LOW );
  digitalWrite( motorA2, HIGH );
  delay( 3000 );
  Serial.println("motorA stop");
  digitalWrite( motorAp, LOW );
  delay( 1000 );

  Serial.println("motorB forward");
  digitalWrite( motorBp, HIGH );
  digitalWrite( motorB1, HIGH );
  digitalWrite( motorB2, LOW );
  delay( 3000 );
  Serial.println("motorB stop");
  digitalWrite( motorBp, LOW );
  delay( 1000 );
  Serial.println("motorB back");
  digitalWrite( motorBp, HIGH );
  digitalWrite( motorB1, LOW );
  digitalWrite( motorB2, HIGH );
  delay( 3000 );
  Serial.println("motorB stop");
  digitalWrite( motorBp, LOW );
  delay( 1000 );
}
カテゴリー: Arduino | Arduino で TB6612FNG を使ってモーター2個を制御する はコメントを受け付けていません

Adafruit Trinket を使ってモーター1個を動かす(TA7267BP編)

以前、8pino を使って DRV8830 を動かしてみましたが、I2C の信号線とモーターへの給電線が一緒になっているので、8pino 自体に無理がかかって I2C が暴走してダメでした。という訳で、電子回路への給電(5V あるいは 3.4V)とモーター自体への給電を分けて回路を組まないと駄目ですね、ってことで TA7267BP を使ってみます。秋月電子で 2個300円で買えます。先に試してみた TA7291P よりも少しだけ小さくていいかな、と思ったのですが、DRV8832DGQR というさらに小さいのがあるので、小型の場合はそっちを使ったほうがよさそう。表面実装用なので、半田付けが大変そうですが。一応、これも買ってみたので後で試してみます。

ブレッドボード

組み合わせとしては、手元の Trinket とつなげています。8pino と同じ ATtiny85 なので、同じ作りになります。これも小型化だけ目指すのだったら、チップだけ買えばいいわけで、【Arduino】ATtinyをArduinoで開発する – The jonki を参考にして、Arduino を使って焼き込むことができます。これも後で試す予定。

image

給電は別にしたいといいつつ、6番ピンの Vs と 7番ピンの Vcc に Trinket と同じ電池から給電してます。別電源にしたい場合は、6番ピン(左から6番目)へ 0~18V の間で電圧を掛ければok。

回路図

image

別給電にする場合

image

image

 

 

この状態で、モーター1個を制御できます。ピンは3本余っているので、HC-05 につなげて Bluetooth で無線化することも可能ですね。たぶん、Vs に対しては、PWM 制御ができると思うんですが、前後に動かすだけだったら、特に速度制御の必要はないかなと。

埋め込み画像への固定リンク

これを小さ目に組んで、プラレールの電源車…は高いので、ダイソーの100円の電車に乗せていきます。電池4個は大きいので、3Vのボタン電池を2個つなげるか、手元にあるミニヘリのバッテリーを使ってみる予定。

ちなみに動かしているのは美工社の工作セット 車軸付モーターギヤボックス2セット で480円です。遅めのギアまでくっついているので、工作には便利ですね。タミヤのギアボックスの一番遅い組み合わせ位の遅さで動きます。ラジコンとしては遅いけど、こういう風な実験で動かすときには、回転が遅いほうが途中で止められるので便利です。思ったより、でかかったけど。

カテゴリー: Arduino | Adafruit Trinket を使ってモーター1個を動かす(TA7267BP編) はコメントを受け付けていません