2016年3月29日 星期二

Windows IoT Core - Light Sensor sample


這篇介紹在 Windows IoT Core 下, Raspberry Pi 3 如何接收光敏電阻的訊號!

而光敏電阻的訊號是類比訊號,
由於 Raspberry Pi 3 沒有接收類比訊號的 pin 腳,
所以必須先將類比訊號轉成數位訊號,
那該如何做?

 ADC0832 模組,它可以將類比訊號轉為數位訊號,
而在 Windows IoT Core 類別庫,也有相對應的函式庫支援,
所以使用這個模組是十分方便的,

流程簡單來說,就是 Raspberry Pi 連接 ADC0832,ADC0832 連接 Light Sensor

Raspberry Pi ←→ ADC0832 ←→ Light Sensor

先來看看 ADC0832,共 8 個腳位






腳位說明:
Pin Number Description
1 CS - Chip Select (Active Low)
2 CH0 - Analog Input Channel 0
3 CH1 - Analog Input Channel 1
4 GND - Ground
5 DI - Data Input
6 DO - Data Output
7 CLK - Clock
8 Vcc - Positive Supply


ADC0832 connect Light Sensor:
  • Signal ( OUT ) → CH0
  • VCC → VCC
  • GND → GND


ADC0832 connect Raspberry Pi 3:
  • CS → GPIO 18
  • GND → GND
  • DO → GPIO 24
  • DI → GPIO 24 (or just connect DO and DI together)
  • CLK → GPIO 23
  • VCC → 3.3V

電路圖:

Windows IoT Core Library:
  1. 建立 AdcProviderManager 物件
  2. 建立 ADC0832 物件,並指定 ChipSelectPin, ClockPin, DataPin 腳位,
    再加入 AdcProviderManager
  3. 透過 adcManager.GetControllersAsync 取得  adcControllers 物件
  4. 建立 AnalogSensor 物件,同時設定更新頻率
  5. 透過 AnalogSensor ReadingChanged 事件,即可取得訊號( Value, Ratio ),
    由於 ADC0832 是將類比訊號轉為 8bit 數位訊號,所以:
    1. Value  為 0 ~ 255
    2. Ratio 為比例

// Create ADC manager
var adcManager = new AdcProviderManager();

// Add ADC chips
adcManager.Providers.Add(
 new ADC0832()
 {
  ChipSelectPin = gpioController.OpenPin(18),
  ClockPin = gpioController.OpenPin(23),
  DataPin = gpioController.OpenPin(24),
 }
);

// Get the well-known controller collection back
var adcControllers = await adcManager.GetControllersAsync();

// Create light sensor
var lightSensor1 = new AnalogSensor()
{
 AdcChannel = adcControllers[0].OpenChannel(0),
 ReportInterval = 250,
};

// Subscribe to events
lightSensor1.ReadingChanged += LightSensor1_ReadingChanged;

AnalogSensor ReadingChanged event:
private async void LightSensor1_ReadingChanged(IAnalogSensor sender,
 AnalogSensorReadingChangedEventArgs args)
{
 // Invert
 var ratio = 1 - args.Reading.Ratio;
 var value = args.Reading.Value;
 // Update UI
 await Dispatcher.RunIdleAsync((s) =>
 {
  // do something

 });
}

AnalogSensorReading 定義:
public sealed class AnalogSensorReading : IAnalogSensorReadingClass
{
 public AnalogSensorReading(int val, double ratio);

 public double Ratio { get; }
 public double Value { get; }
}


DEMO:


Upgrading NPM in Visual Studio 2015


之前寫過一篇文章 msbuild copy files - Illegal characters in path error
處理 npm 包裝的 package 資料夾結構太深,導致 msbuild 無法複製檔案的問題,
在 npm 3.* 版後,已處理此問題,

可是即使我安裝了新版的 nodejs ,
VS2015 還是使用舊的 npm 版本,
到底該如何處理呢? 接著看下去

在 VS2015 升級 NPM 步驟:
  1. 下載新版的 nodejs stable 版
  2. 在 VS2015, Tools / Options / Projects and Solutions / External Web Tools,
    加入 nodejs 安裝路徑並置頂,如: C:\Program Files\nodejs

  3. 重啟 VS2015,就完工囉!

2016年3月26日 星期六

Windows IoT Core & Raspberry Pi 3 - Blinky sample


學習要一步一步來,先來學習如何閃爍 LED 燈吧!
從微軟官網的範例來學習吧!  參考


需要的器材有:
  1. LED 燈泡 * 1
  2. 10 Ω 電阻 * 1
  3. 電線 * 2
  4. 麵包板 * 1

電路圖:

Windows IoT Core 控制 GPIO pin 腳位高低電底

  1. 透過 GpioController.GetDefault() 取得 GPIO Controller
  2. 取得 pin 物件,使用 GpioController.OpenPin()
  3. 設定腳位的高低電壓,透過 GpioPin.Write()
  4. 設定 pin 腳為輸出電壓腳位,使用 GpioPin.SetDriveMode()

發佈 AP 至 Raspberry Pi 3
  1. architecture:ARM
  2. 發佈對象選擇:Remote Machine
  3. 設定 Remote connection,設定 Raspberry Pi IP
  4. 亦可在 project property winows,進行設定

即可在 Raspberry Pi 看到 UWP 畫面囉!

DEMO:

2016年3月21日 星期一

Error - unable to convert runtime connection string to its design-time equivalent mysql

最近將 web site project  升級至  web application project,
開發環境從 VS2012 升級至 VS2015,

發現在更新 entity framework 的 edmx 檔的物件時發生錯誤:

執行「update model from database」



錯誤訊息: 

unable to convert runtime connection string to its design-time equivalent..


solution:
更新 the visual studio plugin 即可
請至此下載:http://dev.mysql.com/downloads/windows/visualstudio/



安裝完畢後,重啟 VS2015 即可正常更新 entity object




2016年3月20日 星期日

Raspberry Pi 7" Touchscreen Display - 開箱

為了方便開發及測試,決定入手 Raspberry Pi 官方出的觸控螢幕,
所以在露天拍賣訂了一個,等了幾天終於到貨囉!

外盒包裝:

內部零件:

物件清單:

  1. 7吋觸控螢幕 x1 
  2. 顯示驅動板x1 
  3. 支座與螺釘各 x4 
  4. 跳線 x4 
  5. 螢幕排線 x1
產品規格:
  1. 顯示尺寸:7寸
  2. 解析度:800x480
  3. 螢幕體積大小:194mm x 110mm x 20mm
  4. 螢幕可視區域:155mm x 86mm
  5. 觸控螢幕:FT5406 10指觸控電容式
  6. 重量:277g. 功耗:2.23W
安裝步驟: ( 參考 )
  1. check list
  2. connect the display ribbon cable to the back of the adapter board
  3. Lie the adapter board onto the back of the display then connect the touch screen ribbon cable into J4
  4. Attach the 4 x Standoffs & screw them though the adapter board into the back of the display
  5. Attach the DSI ribbon cable to the Adapter Board
  6. Use the 4 x screws to secure the Raspberry Pi board to the Standoffs then connect the DSI ribbon cable to the Raspberry Pi
  7. Connect the jumper wires form the Raspberry Pi to the  adapter board
  8. Power the display and Raspberry Pi Board
這樣就完工囉!

完工背面圖如下:( 下面的壓克力板是賣家提供的,不過太短導致電源線不易插入,
所以中間再接一個 L 架讓它延長一些,方便放置電源線 )


完工正面圖: ( 在 Windows IoT Core 觸控功能仍是正常運作 )


當然 Raspbian OS 也沒問題!


2016年3月17日 星期四

Fix found conflicts between different versions of the same dependent assembly warning


在 Build 專案時,
發生 found conflicts  between different versions of the same dependent assembly warning,
可是又不知道到底哪裡發生衝突,該如何是好呢?


請出 google 大神後,發現一個好用的工具 AsmSpy點此下載
用法很簡單:
AsmSpy D:\...\your project\bin

產出畫面如下:


由上圖可得知  ICSharpCode.SharpZipLib 發生衝突
NPOI.DDF 用的是 v 0.85.5.452 ,
其他專案用的是 v 0.86.0.518,

此工具可以很方便的判斷衝突的發生點,再進行處理囉!


2016年3月16日 星期三

msbuild copy files - Illegal characters in path error

遇到一個 msbuild 的問題讓我十分困擾,
目前處理的專案,用到 aps.net MVC5 + Angular 2 ,以 npm 進行安裝
希望透過 msbuild 將專案 build 過後,也順道把 node_module 資料夾 copy 至 build 資料夾,
但是卻遇到 Illegal characters in path 的錯誤訊息:



所用的也是很正常的 msbuild task

<CreateItem Include="$(SourceDir)\**\*.*" Exclude="$(SourceDir)\.bin\**\*.*;">
    <Output TaskParameter="Include" ItemName="NodeModulesFileItems" />
</CreateItem>
<Copy SourceFiles="@(FileItems)" DestinationFiles=
    "@(FileItems->'$(OutputDir)\%(RecursiveDir)%(Filename)%(Extension)')" />

先來查看 package.json ,看看 node_module 放了哪些 package,如下:
{
  "name": "angular2-quickstart",
  "version": "1.0.0",
  "private": true,
  "dependencies": {
    "angular2": "2.0.0-beta.0",
    "systemjs": "0.19.6",
    "es6-promise": "^3.0.2",
    "es6-shim": "^0.33.3",
    "reflect-metadata": "0.1.2",
    "rxjs": "5.0.0-beta.0",
    "zone.js": "0.5.10"
  },
  "devDependencies": {
    "gulp-typescript": "^2.10.0",
    "gulp": "^3.9.0"
  }
}

所以原因出在 node_modules 這個資料夾到底出了什麼事!? 來實驗看看吧!

假設專案路徑是: C:\project\webapp
如果 copy 的路徑是:C:\project\webapp\Content    成功
如果 copy 的路徑是:C:\project\webapp\Image   成功
如果 copy 的路徑是:C:\project\webapp\node_modules  失敗
如果 copy 的路徑是:C:\project\webapp\node_modules\angular2  成功
如果 copy 的路徑是:C:\project\webapp\node_modules\systemjs  成功
如果 copy 的路徑是:C:\project\webapp\node_modules\es6-promise  成功
如果 copy 的路徑是:C:\project\webapp\node_modules\es6-shim  成功
如果 copy 的路徑是:C:\project\webapp\node_modules\reflect-metadata  成功
如果 copy 的路徑是:C:\project\webapp\node_modules\rxjs  成功
如果 copy 的路徑是:C:\project\webapp\node_modules\zone.js  成功
如果 copy 的路徑是:C:\project\webapp\node_modules\gulp-typescript  失敗
如果 copy 的路徑是:C:\project\webapp\node_modules\gulp  失敗

最後終於發現是 gulp, gulp-typescript 兩個資料夾在做怪,
由於這兩個資料夾裡面的檔案結構又深又長,導致 copy task 在複製檔案時,
因路徑太長而拋出 Illegal characters in path  訊息,
那該如何處理呢?

在發佈時,先將這兩個資料夾刪掉,以暫時解決這個問題,
使用 removedir task 刪除資料夾,
但是仍然會發生 Illegal characters in path 錯誤,我想問題應該是跟上面一樣
<removedir directories="$(dir)"></removedir>
所以只好依靠 windows command - rmdir 來處理
<Exec Command="RMDIR /S /Q $(WebNodeModulesSourceDir)\gulp"/>
<Exec Command="RMDIR /S /Q $(WebNodeModulesSourceDir)\gulp-typescript"/>

<CreateItem Include="$(SourceDir)\**\*.*" Exclude="$(SourceDir)\.bin\**\*.*;">
    <Output TaskParameter="Include" ItemName="NodeModulesFileItems" />
</CreateItem>
<Copy SourceFiles="@(FileItems)" DestinationFiles=
    "@(FileItems->'$(OutputDir)\%(RecursiveDir)%(Filename)%(Extension)')" />

打完收工!

2016/04/21 更新: 安裝新版的 NPM,即可解決此問題,參考

2016年3月15日 星期二

Windows IoT Core & Raspberry Pi 3 - install

最近 Raspberry Pi 終於出到第 3 版了,內建 wifi, BLE,有興趣就買囉!
再搭配 Windows IoT Core 平台來試試!

安裝步驟如下:

  • 安裝 Windows 10 IoT Core Dashboard
  • 安裝  Windows 10 IoT Core 至 MicroSD 
    • 安裝步驟參考:Manually set up your device
      1. 下載Windows 10 IoT Core Insider Preview iso 檔後,直接在 win10 掛載後,安裝裡面的 【Windows 10 IoT Core for Raspberry Pi ......msi】 即可。
      2. 執行 IoT Dashboard 設定新裝置
        1. Device Type:Custom
        2. image file:【"C:\Program Files (x86)\Microsoft IoT\FFU\RaspberryPi2\flash.ffu"】。
      3. click 【Download and install】。
      4. 安裝結束後, MicroSD  插到 Raspberry Pi 3,接上電源線即可。
    • 這邊有非常重要的一點,MicroSD 會挑片,必須用官方認證過的
      • 否則畫面會卡住進不了系統,畫面會卡在 "please wait while we get things ready",然後等到天荒地老也不會有下一步
      • 可用的 MicroSD  參考:Hardware Compatibility List
        • Samsung 32GB EVO Class 10 Micro SDHC
        • SanDisk Ultra Micro SDHC 16GB

  • 啟動畫面1


  • 啟動畫面2


  • 啟始設定畫面


  • 開始畫面




  • 將 Raspberry Pi 3 接上網路線後,回到 windows 10 後,在 IoT Dashboard 切到 My Device 頁籤,看到 Raspberry Pi 即代表成功囉!