라즈베리파이 3에 Windows 10 iot core 는 설치해 봤습니다. (http://kjcoder.tistory.com/193)

이제 라즈비안을 설치해 봅시다. 다행히 sd 카드가 남아있었네요

라즈베리파이3가 편한게 그냥 sd 카드만 바꿔주면 운영체제가 바뀝니다. (머 하드도 바꾸면되지만..;)

 

아래 경로로 들어가 라즈비안 이미지 파일을 다운 받습니다.

https://www.raspberrypi.org/downloads/

 

용량이 좀 큽니다. 토랜트나 zip 파일중 zip 파일로 다운받았습니다

토랜트가 더 느린것 같네요.;; 암튼 용량이 크기때문에 좀 기다려야합니다.

압축을 풉니다.

이미지 파일이므로 sd 카드로 이미지를 구워야합니다.

굽는 프로그램은 아래 파일을 다운받습니다.

Win32DiskImager.zip

출처 : https://sourceforge.net/projects/win32diskimager/

 

압축을 풉니다. (참고로 출처 경로의 파일은 설치버전입니다.)

Win32DiskImager.exe 을 실행합니다.

이미지 경로와 설치될 드라이브를 설정하고 Write 합니다.

Yes!

이미지가 SD 카드에 구워집니다. 요것도 시간이 좀 걸립니다.

완료가되면 Suecss 팝업이 뜹니다. 닫고 SD 카드를 빼서 라즈베리 파이3 에 넣으면 끝..

라즈베리에 SD 카드를 넣으니 라즈비안 으로 부팅이 잘되네요^^

 

추가..

혹 라즈비안이 구동이 안될경우 (저도 한번에 되지는 않더군요;;)

SD 카드를 아래 프로그램으로 포멧한후 다시 구워보길 바랍니다.

SD 카트를 포멧해 주는 프로그램입니다.

SDFormatterv4.zip

(이 파일은 설치파일입니다.)

아래 그림은 설치와 포멧하는 화면을 캡쳐한 이미지입니다.

포맷..

확인

확인

 

 

 

 

 

 

집에 남는 USB 웹캠이 하나있어서 이걸 라즈베리파이에 연결이 가능할것 같아서

구글링을해보았다

역시 고맙게도 먼저 시도해본사람이 있었다.

https://www.hackster.io/sascha/browser-webcam-live-stream-with-windows-iot-core-raspberry-3-1dc38b

이런 지식 기부는 정말 감사하다.^^

그냥 위 링크에서 소스 다운받아 그대로 따라하기만 하면된다.

HttpWebcamLiveStream-master.zip

 

포트 부분만 변경하면 되고

당연히 공유기에서 해당 포트를 열어줘야한다.

소스상에서 80 포트를 여는걸로 나오는데 그부분을 자신에게 맞도록 수정해야한다.

설정해 놓고 한동안 테스트를 해봤다..

그런데 발열이 장난이 아니다

그래서 그런지 하루를 못가고 작동이 멈춰버린다.;;

찾아보니 영상처리 시에는 좀 발열이 심하다고하는데...

내 라즈베리파이3 만 이상한건지도 모르겠다;;

 

추가로...

아래는 sample 코드에서 제공해 주는 걸로 유니버셜앱에서 동작하게끔되어있다.

https://github.com/ms-iot/samples

위 경로에서 소스를 다운받으면 WebcamApp 폴더가 있는데 캡쳐 및 영상재생등 기능이 많다.

이또한 발열이 장난이 아니다...

중간에 자꾸 꺼진다..;

 

 

출처 : https://developer.microsoft.com/en-us/windows/iot/samples/webcamapp

Initialize a webcam, take pictures, and record video and audio.

This is a headed sample. To better understand what headed mode is and how to configure your device to be headed, follow the instructions here.

Load the project in Visual Studio

You can find the source code for this sample by downloading a zip of all of our samples here. Make a copy of the folder on your disk and open the project from Visual Studio.

This is a Universal Windows application

Connecting your webcam

You’ll need:

Connect the web cam to one of USB ports on the IoT Device

Deploy your app

If you’re building for Minnowboard Max, select x86 as the architecture. If you’re building for Raspberry Pi 2 or 3 or DragonBoard , select ARM.

DragonBoard only: Before deploying this app, disable the on-board mic and audio drivers. This is required on every reboot when running this app

 
DragonBoard - Commands to disable audio and mic drivers:

devcon remove AUDD\QCOM2451
devcon remove ADCM\QCOM242E 

Select Remote Machine to point to IoT device and hit F5 to deploy to your device. Go back to the basic ‘Hello World’ sample. if you need guidance

Test your app

The sample app when deployed displays 2 buttons Initialize Audio and Video and Initialize Audio Only. Below is a description of the actions available when the buttons are clicked.

Initialize Audio and Video:

  • Preview will appear in the left most canvas
  • Take Photo when clicked would store the photo in the default location and show the last captured photo in the canvas in the middle
  • Start Video Record when clicked would begin recording. When done, press Stop Video Record to save the video. Video is automatically played back in the right most canvas

Initialize Audio Only:

  • Start Audio Record when clicked will begin recording. When done press Stop Audio Record to save the video. Audio is automtically played back.

NOTE: In order to hear the audio, an audio device (ex: earphones) must be connected to the analog audio output on Raspberry Pi2. On MinnowBoard Max, audio output is available via HDMI

Congratulations! You created your first web cam app.

Let’s look at the code

The code for this sample uses the Windows.Media.Capture namespace.

MediaCapture class will be used to enumerate, connect to, and perform actions using the web camera connected to the device.

For accessing the web cam, the microphone, and the default storage folders, you must add the following capabilities to the Package.appxmanifest file in your project:

NOTE: You can also add capabilities directly by opening the Package.appxmanifest file in an XML editor (Right Click on the file -> Open with -> XML (Text) Editor) and adding the capabilities below:

  
 <Capabilities>      
   <uap:Capability Name="videosLibrary" />  
   <uap:Capability Name="picturesLibrary" />  
   <DeviceCapability Name="microphone" />  
   <DeviceCapability Name="webcam" />  
 </Capabilities>  

Initialize MediaCapture object

MediaCapture object can be initialized to capture video or audio only. In the sample,

  • initVideo_Click initializes the device for both audio and video when Initialize Audio and Video is clicked.
  • initAudioOnly_Click initializes the device for audio only when Initialize Audio Only is clicked.
  
private async void initVideo_Click(object sender, RoutedEventArgs e)  
{ 
   // ...  
 
   //Video and Audio is initialized by default  
   mediaCapture = new MediaCapture();  
   await mediaCapture.InitializeAsync();  
 
   // ...  
}  
 
private async void initAudioOnly_Click(object sender, RoutedEventArgs e)  
{  
   // ...  
     
   mediaCapture = new MediaCapture();  
   var settings = new Windows.Media.Capture.MediaCaptureInitializationSettings();  
   settings.StreamingCaptureMode = Windows.Media.Capture.StreamingCaptureMode.Audio;  
   settings.MediaCategory = Windows.Media.Capture.MediaCategory.Other;  
   settings.AudioProcessing = Windows.Media.AudioProcessing.Default;  
   await mediaCapture.InitializeAsync(settings);  
     
   // ...  
}  

Audio and Video Mode: Start Preview, Take a photo

This section describes some XAML components we create to display the preview and photo output from the web cam. First we create a CaptureElement for preview and a and Image for the captured photo.

  
<Canvas Name="PreviewCanvas" Grid.Row="1" Grid.Column="0" Width="320" Height="320" Background="Gray"  Margin="0,0,0,0" Visibility="Visible">  
    <CaptureElement x:Name="previewElement" Width="320" Height="320" HorizontalAlignment="Left" Visibility="Visible"/>  
</Canvas>  
  
<Canvas Name="PhotoCanvas" Grid.Row="1" Grid.Column="1" Width="320" Height="320" Background="Gray"  Margin="40,0,0,0" Visibility="Visible">  
    <Image x:Name="captureImage" Width="320" Height="320" Visibility="Visible"/>  
</Canvas>  

When the camera is initialized successfully, we start the preview in initVideo_Click.

When the Take Photo button is clicked, we capture the image, store it in the default storage, and display it in the XAML canvas element in takePhoto_Click

  
private async void initVideo_Click(object sender, RoutedEventArgs e)  
{  
    // ...  
  
    // Start Preview                  
    previewElement.Source = mediaCapture;  
    await mediaCapture.StartPreviewAsync();  
      
    // ...  
}  
  
private async void takePhoto_Click(object sender, TextChangedEventArgs e)  
{  
    // ...  
  
    photoFile = await KnownFolders.PicturesLibrary.CreateFileAsync(  
                    PHOTO_FILE_NAME, CreationCollisionOption.GenerateUniqueName);  
    ImageEncodingProperties imageProperties = ImageEncodingProperties.CreateJpeg();  
      
    await mediaCapture.CapturePhotoToStorageFileAsync(imageProperties, photoFile);  
      
    IRandomAccessStream photoStream = await photoFile.OpenReadAsync();  
    BitmapImage bitmap = new BitmapImage();  
    bitmap.SetSource(photoStream);  
    captureImage.Source = bitmap;  
  
    // ...  
}  

Audio and Video Mode: Record a video and playback

This section describes how we record a video and play it back. First we create a MediaElement in XAML to playback the video

  
<Canvas Name="VideoCanvas" Grid.Row="1" Grid.Column="2" Width="320" Height="320" Background="Gray" Margin="40,0,0,0" Visibility="Visible">  
    <MediaElement x:Name="playbackElement" Width="320" Height="320" Visibility="Visible"/>  
</Canvas>  

When the Start Video Record button is clicked, we change the content on the button to Stop Video Record.

When this button is clicked recordVideo_Click is called and we read the content of the button to determine whether we want to start or stop the video recording.

The code below shows how we accomplish this. Once the recording is stopped, we store the video in the default storage location and play it back in the XAML canvas element.

NOTE: In order to hear the audio, an audio device (ex: earphones) must be connected to the analog audio output on Raspberry Pi2. On MinnowBoard Max, audio output is available via HDMI

  
private async void recordVideo_Click(object sender, RoutedEventArgs e)  
{  
    // ...  
  
    if (recordVideo.Content.ToString() == "Start Video Record")  
    {          
        String fileName;  
        fileName = VIDEO_FILE_NAME;  
  
        recordStorageFile = await Windows.Storage.KnownFolders.VideosLibrary.CreateFileAsync(fileName,   
                                                            Windows.Storage.CreationCollisionOption.GenerateUniqueName);       
  
        MediaEncodingProfile recordProfile = null;  
        recordProfile = MediaEncodingProfile.CreateMp4(Windows.Media.MediaProperties.VideoEncodingQuality.Auto);  
  
        await mediaCapture.StartRecordToStorageFileAsync(recordProfile, recordStorageFile);  
        recordVideo.IsEnabled = true;  
        recordVideo.Content = "Stop Video Record";         
    }  
    else  
    {  
        status.Text = "Stopping video recording...";  
        await mediaCapture.StopRecordAsync();  
          
        var stream = await recordStorageFile.OpenReadAsync();  
        playbackElement.AutoPlay = true;  
        playbackElement.SetSource(stream, recordStorageFile.FileType);  
        playbackElement.Play();  
        recordVideo.Content = "Start Video Record";  
    }  
	  
    // ...  
}  

Audio Only Mode: Record audio and playback

This section describes how we record an audio and play it back. First we create a MediaElement in XAML to playback the audio

  
<Canvas Grid.Row="1" Grid.Column="3" x:Name='playbackCanvas3' Width='0' Height ='0' Margin="0,0,0,0">  
    <MediaElement  x:Name='playbackElement3' Width="0"  Height="0"/>  
</Canvas>  

When the Start Audio Record button is clicked, we change the content on the button to Stop Audio Record.

When this button is clicked recordAudio_Click is called and we read the content of the button to determine whether we want to start or stop the audio recording.

The code below shows how we accomplish this. Once the recording is stopped, we store the audio in the default storage location and play it back in the XAML canvas element.

NOTE: In order to hear the audio, an audio device (ex: earphones) must be connected to the analog audio output on Raspberry Pi2. On MinnowBoard Max, audio output is available via HDMI

  
private async void recordAudio_Click(object sender, RoutedEventArgs e)  
{  
    // ...  
  
    if (recordAudio.Content.ToString() == "Start Audio Record")  
    {     
        recordStorageFile = await Windows.Storage.KnownFolders.VideosLibrary.CreateFileAsync(AUDIO_FILE_NAME,   
                                                    Windows.Storage.CreationCollisionOption.GenerateUniqueName);       
  
        MediaEncodingProfile recordProfile = null;  
        recordProfile = MediaEncodingProfile.CreateMp4(Windows.Media.MediaProperties.VideoEncodingQuality.Auto);  
  
        await mediaCapture.StartRecordToStorageFileAsync(recordProfile, recordStorageFile);  
        recordAudio.IsEnabled = true;  
        recordAudio.Content = "Stop Audio Record";     
    }  
    else  
    {  
        status.Text = "Stopping audio recording...";  
  
        await mediaCapture.StopRecordAsync();  
  
        recordAudio.IsEnabled = true;  
        recordAudio.Content = "Start Audio Record";  
  
        var stream = await audioFile.OpenAsync(Windows.Storage.FileAccessMode.Read);  
        status.Text = "Playback recorded audio: " + audioFile.Path;  
        playbackElement3.AutoPlay = true;  
        playbackElement3.SetSource(stream, audioFile.FileType);  
        playbackElement3.Play();  
    }  
	  
    // ...  
}  

MediaCapture callbacks

There are two callbacks illustrated in the sample: MediaCapture.Failed and MediaCapture.RecordLimitationExceeded.

We assign these in the initVideo_Click and initAudio_Click functions

  
private async void initVideo_Click(object sender, RoutedEventArgs e)  
{  
    // ...  
  
    // Set callbacks for failure and recording limit exceeded      
    mediaCapture.Failed += new MediaCaptureFailedEventHandler(mediaCapture_Failed);  
    mediaCapture.RecordLimitationExceeded += new Windows.Media.Capture.RecordLimitationExceededEventHandler(mediaCapture_RecordLimitExceeded);  
	  
    // ...	  
}  
  
private async void initAudio_Click(object sender, RoutedEventArgs e)  
{  
    // ...  
  
    // Set callbacks for failure and recording limit exceeded      
    mediaCapture.Failed += new MediaCaptureFailedEventHandler(mediaCapture_Failed);  
    mediaCapture.RecordLimitationExceeded += new Windows.Media.Capture.RecordLimitationExceededEventHandler(mediaCapture_RecordLimitExceeded);  
	  
    // ...	  
}  
  
private void mediaCapture_Failed(MediaCapture currentCaptureObject, MediaCaptureFailedEventArgs currentFailure)  
{  
    // Display error message  
}  
  
public async void mediaCapture_RecordLimitExceeded(Windows.Media.Capture.MediaCapture currentCaptureObject)  
{  
    // ...  
      
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () =>  
    {            
        await mediaCapture.StopRecordAsync();  
        isRecording = false;  
        recordAudio.Content = "Start Audio Record";  
        recordVideo.Content = "Start Video Record";  
      
        // Display error message and storage path for recorded files          
    });  
      
    // ...  
}  

To summarize:

  • First, we create a MediaCapture object to initialize the web cam with either both audio and video settings or only audio settings

  • Based on user input, we initialize camera preview, take a photo, record a video or record an audio

  • Media files are stored appropriately and can be played back.

  • MediaCapture callback delegates are used as needed

 

라즈베리파이3 생각보다 발열이 심합니다.

머 간단한 프로그램 돌릴떄야 느끼지 못했는데 

웹캠을 연결하여 브라우저로 스트리밍 하도록 하고 배포를 진행하고 실행하니

CPU 사용률이 45~50 % 정도 되더니.. 갑자기 라즈베리파이 작동이 멈춰버리더군요;;

다시 켜고 시도를 반복해봤지만 여전해서 케이스를 여니 방열판이 너무 뜨거워서 손을 댈수가 없을 정도입니다.

어떻게 할까 고민하다가 팬을 장착해 보기로 하고

고장난 NAS 에서 2핀 짜리 팬을 뺴내어 케이스 뚜껑 부분을 좀 잘라서 팬을 장착했습니다.

다시 프로그램을 구동 해보았습니다.


잘 되는것 같다가..  또 작동이 멈추고 맙니다. ㅜㅠ

케이스 뚜껑 부분을 더 자르고 장착했습니다.

다시 배포해 봅니다.

오 이제 됩니다. 케이스를 너무 잘라서 보기 흉하지만 어쩔수 없습니다. ㅜㅠ

소음도 다행이 적네요^^

 

발열 부분에 대해서 뉴스및 블로그 링크남기고 갑니다.

http://www.zdnet.co.kr/news/news_view.asp?artice_id=20160306155920

http://windy.luru.net/1849

http://forums.rasplay.org/topic/55/%EC%A0%95%EB%B3%B4-%EB%9D%BC%EC%A6%88%EB%B2%A0%EB%A6%AC%ED%8C%8C%EC%9D%B4-3-%EB%AA%A8%EB%8D%B8-%EB%B0%9C%EC%97%B4-%EA%B3%A0%EC%98%A8%ED%98%84%EC%83%81-%EC%97%90-%EB%94%B0%EB%A5%B8-%EC%85%A7%EB%8B%A4%EC%9A%B4-%ED%98%84%EC%83%81

https://github.com/ms-iot/samples

라즈베리파이에 연결해서 몇몇 프로젝트는 바로 실행이 가능하지만

그외 프로젝트들은 프로젝트에 맞는 장치들이 있어야 구동이 가능합니다.

라즈레비파이3 로 무얼 할까 하다가

웹서버를 한번 구축해 볼까 하고 시도해 보았습니다.

이전 포스팅에서 링크가 되어있지만 (http://kjcoder.tistory.com/197)

여러가지 방법이 있으며 제가 시도해서 성공한 내용을 공유해 봅니다.

프로젝트를 생성합니다.

Background 로 돌아가게 할것이기 때문에 아래 처럼 Background Application (IoT) 를 선택합니다. (Visual Studio 2015)

버전은 자신의 라즈베리파이에 맞는 버전에 맞게 설정합니다. (굳이 버전이 안맞아도 최소버전 상위 라면 동작하는 것 같습니다.)

참고로 전 라즈베리파이 버전이 10.0.15063.297 입니다.

이제 위처럼 소스가 만들어 지고 저희가 코딩할 곳은 아래 그림에서 StartupTask.cs 파일입니다.

우선 코딩은 아래와 같습니다. (이해는 나중에....)

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Text;
using Windows.ApplicationModel.Background;
using Windows.Networking.Sockets;
using Windows.Storage.Streams;

// The Background Application template is documented at http://go.microsoft.com/fwlink/?LinkID=533884&clcid=0x409

namespace IoT.BackGroundWebServer
{
    public sealed class StartupTask : IBackgroundTask
    {
        public void Run(IBackgroundTaskInstance taskInstance)
        {
            //
            // TODO: Insert code to perform background work
            //
            // If you start any asynchronous methods here, prevent the task
            // from closing prematurely by using BackgroundTaskDeferral as
            // described in http://aka.ms/backgroundtaskdeferral
            //

            taskInstance.GetDeferral();

            WebServer server = new WebServer();

            while (server.Start() == true)
            { }
        }
    }

    #region WebServer
    internal class WebServer
    {
        private const uint BufferSize = 8192;

        public bool Start()
        {

            try
            {
                StreamSocketListener listener = new StreamSocketListener();
                listener.BindServiceNameAsync("8081").AsTask();
                listener.ConnectionReceived += async (sender, args) =>
                {
                    StringBuilder request = new StringBuilder();
                    using (Windows.Storage.Streams.IInputStream input = args.Socket.InputStream)
                    {
                        byte[] data = new byte[BufferSize];
                        Windows.Storage.Streams.IBuffer buffer = data.AsBuffer();
                        uint dataRead = BufferSize;
                        while (dataRead == BufferSize)
                        {
                            await input.ReadAsync(buffer, BufferSize, InputStreamOptions.Partial);
                            request.Append(Encoding.UTF8.GetString(data, 0, data.Length));
                            dataRead = buffer.Length;
                        }

                        //In the future, maybe we parse the HTTP request and serve different HTML pages for now we just always push index.html
                    }

                    using (IOutputStream output = args.Socket.OutputStream)
                    {
                        using (System.IO.Stream response = output.AsStreamForWrite())
                        {
                            string page = "";
                            var folder = Windows.ApplicationModel.Package.Current.InstalledLocation;

                            // acquire file
                            var file = await folder.GetFileAsync("index.html");
                            var readFile = await Windows.Storage.FileIO.ReadLinesAsync(file);
                            foreach (var line in readFile)
                            {
                                page += line;
                            }

                            byte[] bodyArray = Encoding.UTF8.GetBytes(page);
                            var bodyStream = new MemoryStream(bodyArray);

                            //iCount++;

                            var header = "HTTP/1.1 200 OK\r\n" +
                                        $"Content-Length: {bodyStream.Length}\r\n" +
                                            "Connection: close\r\n\r\n";

                            byte[] headerArray = Encoding.UTF8.GetBytes(header);
                            await response.WriteAsync(headerArray, 0, headerArray.Length);
                            await bodyStream.CopyToAsync(response);
                            await response.FlushAsync();
                        }
                    }
                };

                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }
    }
    #endregion
}

코딩을 보시면 알겠지만 StreamSocketListener 를 이용하여 웹서버를 만들고 기본 화면으로 index.html 파일을 사용하고 있는걸 알 수 있습니다.

또한 포트를 전 8081포트를 사용하는걸로 설정되어있습니다.

index.html 파일을 만듭니다.

내용은 "webserver test" 라고 간단하게 넣었습니다.

프로젝트 속성에서 자신의 라즈베리파이로 디버깅이 가능하도록 설정합니다.

디버깅 설정 방법은 이전 포스팅을 참고 바랍니다 (http://kjcoder.tistory.com/194)

여기서 중요한게 있습니다.

이상태로 그냥 실행하게 되면 라즈베리파이 화면에서는 표시되지 않지만 에러가 발생됩니다.

+  ex {"Access is denied.\r\n\r\nAt least one of either InternetClientServer or PrivateNetworkClientServer capabilities is required to listen for or receive traffic"} System.Exception {System.UnauthorizedAccessException}

접근이 거부된것을 볼수 있습니다.

이 에러를 해결하기 위해서는 아래처럼 진행해야합니다.

프로젝트 속성창에서 라이브러리 탭의 패키지 매니페스트로 접근합니다.

거기서 기능 탭을 선택하면 아래와 같은 화면이 나오게 됩니다.

여기서 기능을 체크해야하는데 아래 두 곳을 추가로 체크해 줍니다.

서버를 만드는 것이기 때문에 서버 기능을 체크해주어야하는 것입니다.

이제 준비는 되었고 디버깅합니다.

Background 로 돌아가게 했으므로 라즈베리파이 화면에는 아무런 변화가 없습니다.

device portal 에서 아래처럼 현재 동작 되고 있는걸 확인 할수 있습니다.

이제 익스플로러 창에서 확인해 봅니다. 제 라즈베리파이3는 ip 192.168.0.23 입니다. 예제에서 포트는 8081 로 했습니다.

위에서 보듯이 제대로 index.html 이 나타나는걸 확인 할수 있습니다.

iptime 을 쓰고 있는데 공유기 설정하고 해보니 외부에서도 이상없이 접근이 되는걸 확인했습니다.

이제 기능을 추가하여 집안의 기기들을 조작하는걸로 가면 좋을것 같네요.^^

 

아래는 실습한 예제 파일입니다.

IoT.BackGroundWebServer.zip

IoT.BackGroundWebServer.z01

 

https://github.com/StefH/NETStandard.HttpListener

https://www.linkedin.com/pulse/creating-35-web-server-using-raspberry-pi-windows-10-rob-walters

https://sandervandevelde.wordpress.com/2016/04/08/building-a-windows-10-iot-core-background-webserver/

https://github.com/sensaura-public/iotweb/tree/f2b58aff19a81cc605d261bc4f07e54f7cbc4b98

http://stackoverflow.com/questions/11725170/streamsocketlistener-access-denied

링크참고

https://social.msdn.microsoft.com/Forums/en-US/1326e40a-35b1-4986-a1dd-8f08b30376aa/failed-to-enable-windows-iot-remote-server?forum=WindowsIoT

원격접속이 되지 않을떄 위처럼 해주면 원격접속이 가능하다.

 

1. 프로젝트를 새로 하나 만듭니다. (Visual Studio 2017 기준)

비어있는 유니 버셜앱을 선택합니다.

위에서 버전은 최신버전으로 선택하되 최소버전은 조금 낮추는게 좋습니다.

IoT 관련 참조를 추가합니다.

(Winbdows IoT Exetnstions for the UWP)

버전은 위해서 지정된 대상버전 으로 참조를 추가합니다. (15063)

 

2. 프로젝트 속성 설정을 변경합니다.

대상버전을 확인합니다. 앞서 프로젝트 만들떄 지정한 버전이 보이는데 여기서 변경이 가능합니다.

플랫폼 대상을 ARM 으로 변경한다.

시작옵션에서 내 라즈베리 파이 장치를 선택합니다.

대상장치를 원격컴퓨터 선택 후 찾기를 누르면 원격연결 팝업에서 연결된 라즈베리파이가 보이게됩니다.

아래 처럼 선택한 라즈베리 파이 이름이 나와야한다. 수동으로 설정시 ip 를 넣어도 됩니다.

 

3. 배포

배포하기전 MainPage.Xml 파일에 버튼하나만 놓았습니다.

반드시 배포하기 전 아래처럼 ARM 으로 바꾸고 배포해야합니다.

배포가 진행하게 되면 아래 처럼 출력창에 배포 완료 문구가 보이게됩니다.

 

4. 확인

배포가 제대로 되었다면 DashBoard 의 Apps 의 Apps Manager 에서

아래처럼 배포한 프로그램이 보이게 됩니다.

Start 를 선택하여 동작 하도록 합니다.

원격 접속해서 보면 아래처럼 아까 추가했던 버튼이 보이게 됩니다.

이처럼 화면을 구성하고 이를 간단하게 라즈베리 파이에 배포가 가능합니다.

또한 특별한 설정없이 Debug 도 가능합니다.  (배포하지말고 Debug 모드로 실행하면 됩니다.)

1. Windows 10 IoT Core Dashboard 설치

https://developer.microsoft.com/ko-kr/windows/iot/Downloads.htm

위 경로로 들어가 Get Windows 10 IoT Core Dashboard 를 클릭합니다.

클릭온스로 설치가 진행됩니다.

 

2. SD 카드에 운영체제 설치

Dashboard 를 실행하여

새 단말기 설정 클릭합니다.

장치 유형을 선택(Raspberry PI 3)하고 sd 카드 꽂힌 곳을 드라이브로 설정하고 관리자 암호를 설정합니다.

계정은 Administrator 로 만들어 집니다.

 sd 카드에 Windows 10 IoT Core 가 설치가 완료되었습니다.

 

3. 라즈베리 파이 부팅

설치가 완료되면 SD 카드를 빼서 라즈베리파이3 에 삽입 후 전원 어댑터를 끼우거나 끼웠다 빼서 부팅시킵니다.

부팅이 완료되면 위처럼 내장치에 표시가 됩니다. (렌선을 직접연결한 경우)

장치를 더블클릭하면 아래와 같은 창이 나오게 됩니다.

브라우저에서 Windows Device Portal 열기를 클릭하고 아까 지정한 암호를 넣습니다. (ID : Administrator)

연결이 완료되면 아래 처럼 DashBoard  가 보여지게 됩니다.

아래처럼 시간유형과 화면 크기를 설정합니다. 시간유형은 Seoul 로 설정하고 화면은 원하는데로 설정합니다. 전 1024*786 로 설정했습니다.

 

4. 라즈베리파이 원격 접속

DashBoard 의 좌측 메뉴중 Remote 를 클릭 Enable Windows IoT Remote Server 를 체크헙니다.

원격으로 서버 접속을 가능하게 합니다.

이상하게 이 항목이 자꾸 언체크 되는 경우가 많습니다.

되도록이면 직접 라즈베리 파이에 모니터를 연결하는걸 추천드립니다.

Windows Store 에서 Windows IoT Remote Client 를 설치합니다.

실행하면 장치목록에서 내 라즈베리 파이를 선택한 후 Connect  합니다.

접속이 정상적으로 되었으면 아래처럼 원격 접속 화면이 나타나게 됩니다.

초반에는 설정하는 화면이 나타나게 됩니다. (안나타나고 설치가 완료되는 경우도 있습니다.)

위 화면이 라즈베리파이에 Windows IoT 를 설치되면 보여지는 화면입니다.

추가로 언어등을 변경합니다.

항목에서 보면 알겠지만 블루투스나 wifi 등을 설정할 수 있습니다.

블루투스나 와이파이는 안쓰면 비활성화 시키는게 좋습니다.

 

* 추가

비쥬얼 스튜디오에서 작업을 할경우 아래 항목(Windows Iot Core Project Templates)을 추가로 설치해줍니다.

(도구-확장 및 업데이트)

  1. Favicon of https://nanite.tistory.com 코코넛냠냠 2017.05.17 04:42 신고

    라즈베리 파이에 윈도우즈를 깔아서 쓸 수도 있군요 의외로 괜찮네요

+ Recent posts

티스토리 툴바