fc2ブログ

OpenCvSharp3をNuGetを用いて使う

 今日は、Windows10パソコンでOpenCvSharp3の最新版(v3.0.0.20151220)を使います。
 OpenCVは日々改良されてインストールしたバージョンがすぐに古くなったり、インストール(Cmakeを用いる方法など)が面倒ですね。加えてC#でコードを組みたいためにOpenCvSharpをインストールするのも、OpenCVとのバージョンの整合性を考えたりと、面倒です。
 簡単にOpenCvSharpでコードを組めないものかとネット検索していた所、いまさらですが、NuGetを用いてパッケージとして導入することができることを知りました。本当に楽にコードを走らせることができました。手順は以下の通りです。
1. Visual Studio 2015 C#で「Windows Formアプリケーション」のプロジェクトを作成します。ここではOpenCvSharpTestとします。この時(初期状態)のソリューションエクスプローラの参照の項目は下図のようになります。151230_ocvs1.png
2. 参照を選択し、右クリックし、「NuGetパッケージの管理」を選択します。151230_ocvs2.png
3. NuGetパッケージマネージャーが立ち上がりますので、
  ① 参照を選択し、検索ワードに「opencv」を入力すると、候補が表示されます。
  ② 「OpenCvSharp3-AnyCPU v3.0.0.20151220」を選択します。
  ③ インストールボタンを押します。151230_ocvs3.png
4. 変更の確認画面が出ますので、「OK」を押します。151230_ocvs4.png
5. 実行すると、ソリューションエクスプローラの参照の項目に、OpenCvSharp関連のファイルが4個追加されました。これで準備ができましたので、続いてコードを書きます。
151230_ocvs5.png
6.  実際のファイルはプログラムフォルダ内の「packages」にありました。
151230_ocvs6.png
 OpenCVもOpenCvSharpもインストール(セットアップ)しなくても、NuGetを用いて簡便にコードに導入できました。この方法を用いると、毎回コードを組むたびにファイル容量が増大して行きますが、アプリを配布する上では、一つのプログラムフォルダにすべてが揃っているので便利だと思いました。
スポンサーサイト



Visual Studio 2015 Update1をインストールする

 Windows10とRaspberry Pi用のWindows10 IoT Coreのバージョン1511へのUpdateの関係で、Visual Studio 2015のUpdateも必要になりました。MicrosoftのサイトからWeb経由のインストラーをダウンロードし、インストールを試みましたが、うまく行きませんでした。
151230_VS2015install1.png
 数項目、インストールに失敗しましたとの表示・・。気持ち悪かったので、修復も試みましたが、これもうまく行かず・・。そうこうするうちに、最終的には、Visual Studioが立ち上がらない致命的な状態に・・・(よくあるパターンです)。
 観念して、アンインストールして、きれいな状態にて、再インストールすることにしました。機能選択で、「ユニバーサルWindowsアプリ開発ツール」にチェックを入れて、スタートし、しばらく待ちます。151230_VS2015install2.png
 今回は、エラーも出ずに、セットアップできました。一からシステムを入れ直すのは大変ですが、不安定になるよりはましですね。無事にUpdate 1になっていました。
151230_VS2015update1.png
 今回のVisual Studio 2015をUpdateするきっかけとなった、システムを更新する前に作成したRaspberry Piのアプリの動作確認も行いました。デバッグ設定の認証モードを「ユニバーサル」に設定する所が、今までと違う点でした。
151230_VS2015update2.png
 リモート実行も問題なく行うことができ、時間はかかってしまいましたが、全システムバージョンアップが完了しました。

Windows10 Update 1511、10586に更新できない(3)

 使用しているWindows10マシンをバージョン1511、OSビルド10586にUpdateした関係で、Raspberry PiのWindows10 IoT Coreも10586にUpdateしました。また、Visual StudioのUpdateも必要とのことで、実行しましたが、Visual Studio 2015 Update1へのアップデート、修復インストールがうまく行かず、Visual Studioが起動しなくなる最悪の状態になってしまいました。結局、Visual Studioをアンインストール後にクリーンインストールし直しました。
 Raspberry Pi用のSDカードのセットアップはMicrosoftのIoTのサイトから以下の① ISOファイルと② Core Dashboardのセットアップファイルの2種類をダウンロードしました。①はWindows10 IoT Coreのシステム本体でISOファイルを実行することでインストール完了です。②はSDカードへのインストラーの機能のあるアプリのようです。151230_RP_setup_1.png
①と②をインストール後、②を実行すると、起動画面が立ち上がりましたので、「新しいデバイスのセットアップ」を選択します。
151230_RP_setup_2.png
セットアップ画面が立ち上がりました。デバイスの種類、システム名、SDカードのドライブを確認し、ソフトウェア条項にチェックを入れて、「ダウンロードとインストール」を押すと、SDカードのFlashingが始まったのですが、途中でエラーを吐いてインストールできませんでした。SDカードの相性があるのでしょうか?そもそも、この手順でSDカードにシステムをセットアップできないのでしょうか?
151230_RP_setup_3.png
 やむを得ず、Windows Image Core Helperを起動させて、SDカードへの書き込みを実施しました。151230_RP_setup_4.png
 今度は、エラーを吐くこともなく、無事に書き込まれました。
151230_RP_setup_5.png
 SDカードをRaspberry Piに挿して、起動させて無事に動作することも確認できました。以前、初回の電源投入時には、ディスプレイに表示が出なかったので、リブートを必ず1回はしていましたが、その不具合も解消していました。快適に使えそうです。

Windows10 Update 1511、10586に更新できない(2)

 後日、パソコンのWindows Updateを確認すると、Updateを失敗したので、再起動してやり直す旨が表示されていました。早速、実行すると、今度はすんなりとUpdateできました。結局、何が問題だったのか、なぜすぐに異常を復旧できなかったのかの疑問は残ったままです。
 今日(12/27)、Raspberry PiのWindows10 IoT Coreも10586にUpdateを試みました。表示画面も更新されてUpdateはうまくいったと思っていたのですが、以前作成して正常に動作していたユニバーサルアプリがエラーを吐くはめに・・・。リモート実行ができない状態です。配置エラーが発生しています。151227_1_更新前

151227_2_更新後 
 継続して調査していますが、Visual Studio 2015もUpdateが必要とのことで、行いましたが、症状は回復せず・・。再度、SDカードにシステムを焼き直している状態です。今回のWindows10のUpdate、いろいろな所で難儀です。

RGB-LEDを制御する(3)

 今回は、Windows10 IoT上でRGB-LEDを制御するUWPアプリを作成します。以前のblogでRaspberry PiのGPIOについてお話しましたが、その前に UWPアプリ作成し、動作確認を行おうとして失敗していました。Visual Studioからリモートでプログラムを実行しようとすると、ハンドルされていないとのエラーがピン11(GPIO17)のみ発生し、理由が分からなかったため、GPIOのピン調査を始めました。HandleError.pngネットで情報を調べていくと、すでにOS側でこのピン11(GPIO17)は予約されており、使用できない旨が記載されていました。調べてみないとわからない情報です。結局、GPIOの出力端子を以下の図のように変更し、プログラムを作成しました。WinIoT_LED_curcuit.pngプログラムはMicrosoft上にあるBlinkyというLEDの点滅プログラムをcolor LEDに拡張し、マイナー修正して作成しました。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;

using Windows.Devices.Gpio;

// 空白ページのアイテム テンプレートについては、http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409 を参照してください

namespace BlinkyColor
{
///
/// それ自体で使用できる空白ページまたはフレーム内に移動できる空白ページ。
///

public sealed partial class MainPage : Page
{
private int colorcounter = 0;
private const int LED_PIN_B = 12; //Blue
private const int LED_PIN_G = 13; //Green
private const int LED_PIN_R = 16; //Red
private GpioPin pin_B;
private GpioPin pin_G;
private GpioPin pin_R;
private GpioPinValue pinValue;
private DispatcherTimer timer;
private SolidColorBrush blueBrush = new SolidColorBrush(Windows.UI.Colors.Blue);
private SolidColorBrush greenBrush = new SolidColorBrush(Windows.UI.Colors.Green);
private SolidColorBrush redBrush = new SolidColorBrush(Windows.UI.Colors.Red);
private SolidColorBrush grayBrush = new SolidColorBrush(Windows.UI.Colors.LightGray);

public MainPage()
{
InitializeComponent();

timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromMilliseconds(500);
timer.Tick += Timer_Tick;
InitGPIO();
if (pin_B != null && pin_G != null && pin_R != null)
{
timer.Start();
}
}

private void InitGPIO()
{
var gpio = GpioController.GetDefault();

// Show an error if there is no GPIO controller
if (gpio == null)
{
pin_B = null;
pin_G = null;
pin_R = null;
GpioStatus.Text = "There is no GPIO controller on this device.";
return;
}

pin_B = gpio.OpenPin(LED_PIN_B);
pin_G = gpio.OpenPin(LED_PIN_G);
pin_R = gpio.OpenPin(LED_PIN_R);

pinValue = GpioPinValue.Low;
pin_B.Write(pinValue);
pin_B.SetDriveMode(GpioPinDriveMode.Output);
pin_G.Write(pinValue);
pin_G.SetDriveMode(GpioPinDriveMode.Output);
pin_R.Write(pinValue);
pin_R.SetDriveMode(GpioPinDriveMode.Output);

GpioStatus.Text = "GPIO pin initialized correctly.";

}


private void Timer_Tick(object sender, object e)
{
switch (colorcounter)
{
case 0:
pin_B.Write(GpioPinValue.High);
pin_G.Write(GpioPinValue.Low);
pin_R.Write(GpioPinValue.Low);
LED.Fill = blueBrush;
break;
case 1:
pin_B.Write(GpioPinValue.Low);
pin_G.Write(GpioPinValue.High);
pin_R.Write(GpioPinValue.Low);
LED.Fill = greenBrush;
break;
case 2:
pin_B.Write(GpioPinValue.Low);
pin_G.Write(GpioPinValue.Low);
pin_R.Write(GpioPinValue.High);
LED.Fill = redBrush;
colorcounter = -1;
break;
default:
pin_B.Write(GpioPinValue.Low);
pin_G.Write(GpioPinValue.Low);
pin_R.Write(GpioPinValue.Low);
LED.Fill = grayBrush;
colorcounter = -1;
break;
}
colorcounter++;
}
}
}
 最後に、実際に動かした動画です。実際の各色LEDの点滅と画面表示がリンクしています。[広告] VPS

Windows10 Update 1511、10586に更新できない(1)

 久々にデスクトップのWindows10パソコンを触っていて気付いたのですが、Windows10の2015年11月版(1511)がUpdateに失敗していました。Updateをした覚えがなかったのですが、家族の誰かがパソコンを触っているうちに勝手にUpdateして、そのまま電源が消されたのでしょうか?再度、Updateを試みていますが、更新プログラムインストール 32%で固まった状態です。マイ○ソソフトのサーバが猛烈なアクセスでビジーなのでしょうか?何度やってもダメです。1時間待っても動きません・・・。Update不具合
 BootCampで動かしているMacBookAirに入れているWindows10も同じ状態。それもなぜか同じ32%で固まっています。パソコンの問題ではなさそうです。
 ネットで調べていると、このUpdateに関して、似たような問題がたくさんあるようです。インストールすら正常にできないソフトには、何か他の問題も内在している可能性もありますね。更新できないのはシャクですが、しばらくはUpdateせずに、情報を集めようと思います。

Raspberry PiのGPIO調査

 先日、RaspbianでRGB-LEDを制御するお話をしましたが、回路は同じで、今回はWindows10 IoTで動かそうと思いました。Windows10 IoTのSDカードに入れ替えて、Raspberry Piの電源を入れると、青色LEDが点灯していることに気づきました。あれっ、GPIO(General Purpose Input/Output)の制御もしていないのに、どうして青色LEDが点灯しているのか、その日は理解できず、気持ち悪かったので、調べてみることにしました。

 回路は、LEDを5V電源でON/OFFする仕様にしているので、GPIOピンを10kΩの抵抗を介してNPN型トランジスタのベースに接続しています。青、緑、赤色の順番に、ピン11(GPIO17)、ピン12(GPIO18)、ピン13(GPIO27)に接続しています。青色LEDが点灯していることは、ピン11がHighレベルになっているのではないかと思い、テスタを当てると、2.3Vの電圧がかかっていました。

 並行して、その他のピンではどうなっているかを調べる上で、配線を青、緑、赤色の順番に、ピン29(GPIO5)、ピン31(GPIO6)、ピン33(GPIO13)に接続してみました。そうすると、RGB-LEDが青色ではなく、RGB混ざった白っぽい色になりました。テスタで当たると同様な中途半端な電圧でした。気持ち悪さを拭えないまま、ピン29(GPIO5)について、コマンドを打ち込んでGPIOを制御し、ピン電圧を確認した所、以下の結果が得られました。
echo 5 > /sys/class/gpio/export  → 2.3V (ポート宣言)
echo out > /sys/class/gpio/gpio5/direction  → 0V (出力設定)
echo 1 > /sys/class/gpio/gpio5/value  → 3.5V (出力1 : High)
echo 0 > /sys/class/gpio/gpio5/value  → 0V (出力0 : Low)
出力設定した段階でOVに落ちることが分かりました。Raspberry Piに電源を入れただけで、すでに、ピンに電圧がかかっている(pull-upされている)ことを、この時初めて知りました。その後、ネットで調べていると、確かに、pull-upされているピンとpull-downされているピンがあることが分かりました。

 ネット上に資料はありましたが、最終的には自分でピンを1本1本確認しなくてはならないなと思いました。百聞は一見にしかずですね。Raspberry Piの電源を入れた後のピン電圧をまとめた結果が下図です。
RasPiGPIO.png興味深いことに、この問題の発端になったピン11(GPIO17)の電圧レベルが、RaspbianとWindows10 IoTとで異なっていました。OSが変わることにより、ピンの電圧レベルが変わることもあるのですね。大変勉強になりました。

RGB-LEDを制御する(2)

 前回の動画は、MacBook AirからRaspberry PiにPHP経由で接続し、WebからLEDをコントロールしたものです。コントロール画面は以下の通りです。RemoteLED.pngBlue、Green、Redボタンを押すと各色に点滅、Colorボタンを押したら、動画に示した3色が入れ替わり点滅する仕様にしました。Cプログラムは1つにまとめることができましたが、今回は単色点滅プログラム(ledflash.c)と3色点滅プログラム(ledcolor.c)の2つに分けました。単色点滅プログラムは以下の通りです。コマンドの引数に0、1、2を設定すると、それぞれBlue、Green、Redが点滅するプログラムです。

//ledflash.c

#include <wiringPi.h>

#define LED_PORT_B 17 //Blue(0)
#define LED_PORT_G 18 //Green(1)
#define LED_PORT_R 27 //Red(2)

int main(int argc, char *argv[]){

int i;
int setno=-1;
int ledport=-1;

//initialize
if(wiringPiSetupGpio() == 1) return 1;

//select color
setno = atoi(argv[1]);
switch(setno){
case 0:
ledport = LED_PORT_B;
break;
case 1:
ledport = LED_PORT_G;
break;
case 2:
ledport = LED_PORT_R;
break;
default:
break;
}

if(setno > -1 && setno < 3){
pinMode(ledport, OUTPUT);

for(i=0 ; i<5 ; i++){
//LED ON
digitalWrite(ledport,1);
delay(500);

//LED OFF
digitalWrite(ledport,0);
delay(500);
}
}
return 0;
}
また、3色点滅プログラムはBlue、Green、Redの順に5回点滅するものです。

//ledcolor.c

#include <wiringPi.h>
#define LED_PORT_B 17 //Blue(0)
#define LED_PORT_G 18 //Green(1)
#define LED_PORT_R 27 //Red(2)

int main(int argc, char *argv[]){
int i, j;
int ledport=-1;

//initialize
if(wiringPiSetupGpio() == 1) return 1;

for(i=0 ; i<5 ; i++){
for(j=0 ; j<3 ;j++){
switch(j){
case 0:
ledport = LED_PORT_B;
break;
case 1:
ledport = LED_PORT_G;
break;
case 2:
ledport = LED_PORT_R;
break;
default:
break;
}

//LED ON
digitalWrite(ledport,1);
delay(300);

//LED OFF
digitalWrite(ledport,0);
delay(300);
}
}
return 0;
}
最後に、PHPのプログラムはSSH2接続して、それぞれのコマンドを実行させます。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html"; charset=UTF-8">
<title>Remote Led</title>
</head>
<body>
<h1>Remote LED</h1>
<form action = "RmLED.php" method="post">
<input type="submit" style="font-size: 2.4em; background-color: blue; color: white;" name="btn" value="Blue">
<input type="submit" style="font-size: 2.4em; background-color: green; color: white;" name="btn" value="Green">
<input type="submit" style="font-size: 2.4em; background-color: red; color:white;" name="btn" value="Red">
<input type="submit" style="font-size: 2.4em; background-color: yellow; color:red;" name="btn" value="Color">
<br>
<?php

//ボタン番号取得
$Num = $_POST['btn'];

//サーバ接続
$connection = ssh2_connect("192.168.11.18",22);

if($connection !== false){
$auth = ssh2_auth_password($connection,"pi","raspberry");
if($auth!== false){
if($Num == "Blue"){
      $command = "sudo /var/www/html/ledflash 0";
}
else if($Num == "Green"){
$command = "sudo /var/www/html/ledflash 1";
}
else if($Num == "Red"){
$command = "sudo /var/www/html/ledflash 2";
}
else if($Num == "Color"){
$command = "sudo /var/www/html/ledcolor";
}

$stream = ssh2_exec($connection,$command);

}
else{
echo "Auth Failed!\n";
}
}
else
{
echo "Connection Failed!\n";
}
?>
</body>
</html>

RGB-LEDを制御する(1)

 Raspberry PiのI/OでLEDをON/OFFさせるデモはネット上でよく見かけます(「Lチカ」というらしい・・)。電子工作の初歩の初歩ですが、私も基本から進んで行きたいと思います。今回の完成形は以下の動画のスタイルです。PHPにSSH2接続し、MacBook AirやiPadからLEDを制御できました。
[広告] VPS


 まず、先日、京都寺町のマルツで購入したRGB-LEDは以下のAnode Commonのタイプです。ColorLED_pic.png順電流IVは20mA、それぞれの色の順電圧VFは、R 2.0V、G 3.2V、B 3.1Vです。Raspberry PiのI/Oは3.3V電圧信号なので、LEDを明るく点灯させるために、Raspberry Piに実装されている5V電源を利用した方が良さそうです。加えて、RGBの個別のON/OFFを行う必要があるため、NPN型トランジスタを利用しました。手持ちの部品から選択して作成した回路が以下の通りです。ColorLED_circuit.png実際にI/Oを手動でON/OFFさせて、問題なく各色点灯/消灯することを確認できました。次回はwiringPiを用いてコーディングした内容についてお話します。

wiringPiをインストールする

 Raspberry PiのI/Oを触って遊ぶには、wiringPiを用いるのが大変便利です。インストール方法は、wiringPiのサイトや林和孝著『Raspberry Piで遊ぼう! 改訂第3版』に記載があります。 手順は、以下の通りです。
 ① I2Cのライブラリを事前にインストールする。”sudo apt-get install libi2c-dev"
 ② Gitをインストールする。"sudo apt-get install git-core"
 ③ wiringPiのソースファイルをダウンロードする。"git clone git://git.drogon.net/wiringPi"
   ファイルは、/home/pi/フォルダにダウンロードされます。 
 ④ フォルダを変更して "cd wiringPi"、プログラムをコンパイルします。”./build”
正しくインストールが完了したことは、"gpio -v"コマンドで確認できます。wiringPi1.pngバージョン情報とともに、マシン情報が表示されます。Maker欄を見てびっくり、あのSonyが作っていたのですね。

 I/Oの確認については、”gpio mode”コマンドと"gpio write"コマンドで確認できます。ここで注意することは、ピン番号を指定する際に、Raspberry Piの実際の端子番号、wiringPiが独自で持っている番号を混同しないことでしょう。例えば、Raspberry Piの11番端子は「GPIO17」という番号が振られていますPi-GPIO-header.png【出典:http://elinux.org/images/5/5c/Pi-GPIO-header.png
その端子はwiringPiでは0番になっています。プログラムを書く上では、同じ端子でも番号が異なるので注意が必要です。Cプログラムでは、GPIO17の番号17を使用します。gpio1.png【出典:http://wiringpi.com/wp-content/uploads/2013/03/gpio1.png
前置きはそれまでにして、実際のI/O確認方法は以下の通りです。出力を例に説明します。
 1. wiringPiのI/O番号(0)の場合
  gpio mode 0 out '0番を出力に設定
  gpio write 0 1  '0番に1を出力する(ON)
  gpio write 0 0  '0番に0を出力する(OFF)
 2. Raspberry PiのGPIO番号(17)の場合 (-gオプションをつけます)   
  gpio -g mode 17 out '0番を出力に設定
  gpio -g write 17 1  '0番に1を出力する(ON)
  gpio -g write 17 0  '0番に0を出力する(OFF)
以上、実際に、LEDのON/OFFの確認もできました。

ご訪問者数

(Since 24 July, 2016)

タグクラウド


プロフィール

Dr.BobT

Author: Dr.BobT
興味のおもむくままに生涯考え続けるエンジニアでありたい。

月別アーカイブ

メールフォーム

名前:
メール:
件名:
本文: