제조공정
| × | 1 | ||||
| × | 1 |
참고:하단의 댓글에서 업데이트를 확인하세요.
Windows 10 UWP 앱은 원격 배선을 기반으로 구축할 수 있습니다. 앱이 Firmata를 실행하는 Arduino 장치와 상호 작용할 수 있도록 라이브러리. Windows 원격 Arduino "Blinky" 예제와 유사하지만 기능이 추가된 앱이 개발되었습니다. GPIO(출력 AND 입력)와 일부 아날로그 IO를 수행합니다. 이 앱은 이 시리즈의 이전 블로그에 있는 Windows 8.1 버전과 기능적으로 동일합니다. 이 블로그는 이전 블로그와 동일한 자료(즉, 많은 부분을 반복함)를 통해 작동하지만 Windows 8.1 유니버설 앱 컨텍스트가 아닌 UWP(유니버설 Windows 플랫폼) 컨텍스트에서 작동합니다. 앱의 대상은 Win 10 데스크톱, Win 10 전화 및 Raspberry PI2(Win 10 IoT 실행)입니다. 후자의 대상은 "진행 중인 작업"입니다. 이 블로그는 이전 블로그를 참조하지 않고도 읽을 수 있습니다.
이 프로젝트는 내 블로그(http://embedded101.com/Blogs/David-Jones/entryid/636/Windows-10-IoT-Windows-Remote-Arduino-and-Universal-Windows-Platform-Apps
Windows 원격 Arduino "Blinky" 예 ms-iot.github.io에 있습니다.
Windows 8.1에서 UA(유니버설 앱)의 정점에 도달 Windows Intel 데스크톱, ARM RT Surface 및 Windows Phone(ARM)을 대상으로 하는 앱을 모두 동일한 솔루션에서 구현할 수 있습니다. 이벤트 핸들러, 일반 계산 및 데이터와 같은 공통 코드를 공유할 수 있습니다. XAML 코드는 대상에 고유해야 했습니다. 각 대상에 대해 별도의 하위 프로젝트를 컴파일했습니다. 컴파일하는 동안 공통 코드가 포함되었습니다.
Windows 10의 "One Windows" 패러다임 전환으로 모든 대상에 대해 XAML 코드를 포함하여 모든 대상에 대해 동일한 코드를 사용할 수 있습니다. 동일한 프로젝트를 다른 대상에 대해 다시 컴파일하기만 하면 됩니다. UA 이름이 Windows 8 앱에 적용되면서 진정한 범용 앱에 대한 새로운 이름이 필요했습니다. 따라서 유니버설 Windows 플랫폼 앱이라는 이름은 Windows 10용으로 만들어졌습니다.
모든 Windows 10 플랫폼은 UWP 앱을 지원합니다. 그러나 각 플랫폼에 특정한 확장이 있습니다. 예를 들어 Windows 10 IoT 확장은 GPIO, I2C, SPIO 등을 지원합니다. 모바일 확장은 전화 기능을 지원합니다. 기타 UWP는 모든 기기에서 보장된 핵심 API 계층을 제공합니다.
Windows 10 확장 SDK. 데스크톱, 모바일 및 IoT 확장이 확인됩니다.
블로그의 경우 이전 블로그에서와 같이 UA 대신 UWP 템플릿을 사용합니다. 확장 SDK가 필요하지 않습니다.
Win 8.1 활동을 이미 완료했다면 이 섹션을 건너뛸 수 있습니다.
USB 또는 블루투스는 Arduino 장치와 Windows 장치 간의 Firmata 통신에 사용할 수 있습니다. Windows 10의 경우 둘 다 사용할 수 있지만 Windows 8.1의 경우 Bluetooth만 사용할 수 있습니다. 이 버전의 앱에서는 Bluetooth가 사용됩니다. 저는 Sparkfun Bluetooth Mate Gold를 사용한 반면 Sparkfun Bluetooth Mate Silver는 위에서 언급한 'Blinky' 예시와 함께 사용했습니다. 주요 차이점은 Gold의 범위는 최대 100m인 반면 Silver의 범위는 10m입니다. 기본 핸드셰이킹 설정도 다릅니다. 둘 다 Bluetooth 장치의 작동 모드를 구성하고 Arduino 직렬 포트와 상호 작용하는 데 모두 사용할 수 있는 TTL 수준 UART 인터페이스를 가지고 있습니다.
Bluetooth 장치를 구성해야 하는 경우 Sparkfun 또는 Freetronics USB-Serial 또는 Free 장치를 사용하여 데스크탑 직렬 터미널을 통해 장치를 구성할 수 있습니다. PIO6(실제로는 PIO4) 핀을 높음으로 연결하고 세 번 토글하여 장치를 기본 설정으로 공장 초기화할 수도 있습니다.
Bluetooth Mate는 Sparkfun FTDI Basic과 동일한 핀아웃을 가지고 있어 서로 바꿔서 사용할 수 있습니다. Bluetooth Mate를 FTDI 기본 보드에 직접 연결할 수 없습니다(TX와 RX를 바꿔야 함). 해당 구성은 데스크탑에 연결된 FTDI 장치 USB와 함께 데스크탑 직렬 터미널과 함께 사용하여 Bluetooth 장치를 구성하거나 데스크탑에서 직렬 통신을 위해 Bluetooth 장치를 사용할 수 있습니다.
기본 TTL UART 직렬 설정은 다음과 같습니다.
<울>기기는 최대 8개의 기기 페어링을 저장할 수 있습니다.
Bluetooth 장치에 대한 설명서는 다음 위치에 있습니다.
http://www.sparkfun.com/datasheets/Wireless/Bluetooth/rn-bluetooth-um.pdf
Firmata 구성은 변경해야 하는 57600의 전송 속도 또는 이에 대해 구성된 Bluetooth 장치에 대한 것입니다. 이 연습에서는 더 쉬운 접근 방식인 Firmata 구성을 수정합니다. 하드웨어 제어 흐름은 Bluetooth 장치를 구성하여 처리할 수도 있지만 이 연습에서는 RTS를 CTS에 연결하여 처리합니다.
Bluetooth 장치를 브레드보드에 장착하고 거기에서 Arduino 장치에 연결할 수 있지만, 저는 Prototyping Shield에 소켓을 장착하기로 선택했습니다.
6핀 Arduino Shield 헤더는 소켓이 바깥쪽을 향하도록 하여 TTL UART 핀에서 Bluetooth 장치에 납땜되었습니다. 핀은 아래쪽으로 900도로 구부러져 있어 장치를 다른 실드 헤더에 수직으로 연결할 수 있습니다. 그런 다음 구성이 필요한 경우 BT 소켓을 사용하여 유사하게 장착된 FTDI 기본 모듈에 직접 연결할 수 있습니다. 나중에 공장 초기화를 위해 와이어가 Bluetooth 모듈의 PIO6(PIO4)에 납땜되었습니다.
그림 3 UART 핀에 실드 헤더와 실드 헤더가 있는 Bluetooth 모듈
8개의 쉴드 헤더는 하단의 프로토타입 쉴드 중앙에 장착되었습니다. 또한 실드 외부에 헤더를 추가하여 Uno에 직접 연결할 수 있습니다.
그림 4 블루투스 모듈을 장착하기 위한 Arduino Prototype Shield
그런 다음 Bluetooth 모듈은 GPIO 핀을 향하고 핀 0 및 1(Rx/Tx)을 향하여 삽입되어 노란색 위치를 깨끗하게 유지합니다. 그 중 하나는 공장 초기화 와이어의 임시 위치로 사용할 수 있습니다.
그림 6 Arduino 장치에 장착된 Bluetooth 모듈
Win 8.1 활동을 이미 완료했다면 이 섹션을 건너뛸 수 있습니다.
참고: Arduino Uno의 UART 핀 0과 1은 Arduino IDE에서 USB를 통해 프로그래밍할 때 사용할 수 없습니다. 이 동일한 핀은 Firmata 통신을 위해 인터페이스될 때 Bluetooth 모듈의 TTL UART 인터페이스에 연결되는 것입니다. 따라서 이 섹션에서 Arduino 장치를 프로그래밍할 때 Bluetooth 장치를 연결하지 않아야 합니다.
2.1 이전에 Arduino(Uno) 장치용으로 개발했다고 가정하고 새 표준 Firmata 실드를 만듭니다.
2.2 한 가지 변경 사항이 있습니다. 바로 Baud rate입니다. IDE에서 57600을 검색하고 115200으로 교체합니다. 스케치를 저장하고 Firmata_115200이라고 이름을 지정했습니다. Uno를 프로그래밍하면 이 부분이 완료됩니다.
이 섹션은 이미 Win 8.1 활동을 수행한 섹션과 약간 다릅니다.
소프트웨어 스택은 3개의 레이어로 구성됩니다.
Remote-Wiring API는 Arduino 하드웨어 상호 작용을 위해 개념적으로 높은 수준에서 속성(구성), 메서드 및 이벤트를 구현합니다. 예를 들어, GPIO(예:Get 및 Set Pin, On Pin 변경 등). Firmata 프로토콜을 사용하여 Firmata 계층과 통신합니다. Firmata는 직렬 계층에서 Bluetooth 및 USB-직렬 전송 계층으로 구현되는 직렬 프로토콜을 통해 스택 아래로 통신합니다. USB 옵션은 Windows 8.1에서 사용할 수 없습니다.
호출된 이 소프트웨어 스택은 두 가지 소스에서 사용할 수 있습니다.
<올>둘 다 Windows 8.1 및 Windows 10 버전을 포함합니다. 두 버전의 Windows 10 버전이 모두 빌드되지만 두 번째 버전의 Windows 8.1은 빌드되지 않는 것으로 나타났습니다. Visual Studio 2015 RC 버전을 사용했습니다.
<울>3.1 첫 번째 버전을 다운로드합니다. 이렇게 하려면 저장소를 복제해야 합니다(zip을 다운로드하지 않음).
<울>git clone --recursive https://github.com/ms-iot/windows-remote-arduino-samples.git<코드>
얻는 디렉토리 구조는 다음과 같습니다.
windows-remote-arduino-samples
o 원격 배선
Microsoft.Maker.win8_1
Microsoft.Maker.win10
소스
o win8_1
o win10
후자의 두 폴더(win8_1 및 win10)는 지금은 무시할 예제 앱("깜박임" 예제 포함)입니다. 두 메이커 버전 모두 동일한 소스 폴더를 사용하므로 Windows 10의 경우 다음이 필요합니다.
windows-remote-arduino-samples
o 원격 배선
Microsoft.Maker.win10
소스
적당한 폴더로 경로 이름이 너무 길면 ARM 빌드에서 오류가 발생할 수 있다는 것을 발견했기 때문에 드라이브의 루트(예:c:\wras10)에 하나를 제안합니다. 참조를 위해 .md 파일을 복사할 수도 있습니다. VS에서 열 수 있습니다.
3.2 Microsoft.Maker.win10에서 솔루션 파일 열기
3.3 대상을 Win32 빌드 솔루션으로 설정합니다.
세 가지 빌드가 완료되었습니다. 소프트웨어 스택의 세 계층 각각에 대해 하나씩..
3.4 ARM 구성에 대해서도 동일한 작업을 수행합니다. x64 시스템이 있는 경우 해당 빌드도 시도해 볼 수 있습니다.
이전 Win 8.1 활동을 수행한 사람들을 위해 이 섹션에 "단락"이 있습니다.
이 초기 버전의 앱에서 소프트웨어 버튼은 하드웨어 LED를 켜고 다른 버튼은 끕니다. LED는 GPIO 핀 5에 연결됩니다.
"Blinky" 문서에는 이러한 라이브러리를 가져오고 사용하는 여러 가지 방법이 있다고 나와 있습니다. 궁극적으로 Nuget이 방법이 될 것이지만 아직 사용할 수 없습니다. 개발 시스템에서 이러한 빌드된 버전을 일반적인 방식으로 참조할 수 있습니다. 가장 쉬운 방법은 필요한 유니버설 앱을 솔루션에 추가하고 참조하는 것입니다. 우리는 그 방법을 사용할 것입니다.
4.1 솔루션에 새 C# Windows Blank Universal 앱을 추가합니다. (참고로 이번에는 Windows 8.1이 아님):
적절한 이름을 지정하십시오. 나는 mine wauwp:Windows 원격 Arduino 유니버설 앱 UWP라고 불렀습니다.
이번에는 하나의 프로젝트만 생성되었습니다(UWP). XAML 및 CSharp 코드는 앱의 데스크톱 및 모바일 버전에서 동일합니다. 차이점은 컴파일 방식에 있습니다.
패키지 매니페스트에 직렬 및 블루투스 기능이 필요합니다.
4.2 코드 보기를 사용하여 GUI가 아닌 텍스트 편집기에서 package.appmanifest를 엽니다. 인터넷 클라이언트 기능은 하단에 포함되어 있습니다. 이 섹션을 다음으로 수정:
package.appmanifest
에서
<기능>
<기능 이름="internetClient" />
<기기 ID="any">
<코드> <함수 유형="이름:직렬 포트"/> <코드> 기기>
<코드>패키지>
<코드>
또한 데스크탑에서 Bluetooth-Serial 대신 USB-Serial을 사용한다면 해당 기능을 추가할 것입니다.
각 관련 소프트웨어 계층에 대한 참조가 필요합니다.
4.3 데스크톱 UA에 대한 참조 Firmata, RemoteWiring 및 Serial 추가(다시 한 번 한 프로젝트에 대해 이 작업을 수행해야 함):
힌트:이전 Windows 8.1을 이미 수행한 사용자는 이제 다음을 단락시킬 수 있습니다. :
<울>여기에서 계속하는 분들을 위해 ...
4.4 두 UA의 Grid XAML을 다음과 같이 수정합니다.
MainPage.xaml:UI
<코드>
댓글 앱 프로젝트가 하나뿐이므로 이번에는 MainPage.cs가 하나만 있습니다. 하나의 Windows입니다.
이전에는 데스크톱용과 휴대폰용이 있었는데 공유 하위 프로젝트에 하나의 버전을 배치하여 공통으로 만들었습니다.
모든 cs 코드는 MainPage.cs
를 참조합니다.4.7 MainPage 클래스에서 클래스 맨 위에 다음 선언을 추가합니다.
MainPage.cs 선언
//Usb는 Win8.1에서 지원되지 않습니다. USB 연결 단계를 보려면 대신 win10 솔루션을 참조하세요.
블루투스 직렬 블루투스;
원격 장치 arduino;
<코드> // 사용된 핀입니다. 참고:실제 핀 번호.
개인 const int LED_PIN =5;
<코드>
4.8 MainPage 생성자에서 InitializeComponent() 다음에 추가:
MainPage()에서 생성자
블루투스 =새로운 BluetoothSerial("FireFly-748B");
arduino =새로운 RemoteDevice(블루투스);
bluetooth.ConnectionEstablished +=OnConnectionEstablished;
<코드>
FireFly-748B를 SPP로 교체하십시오.
4.9 클래스에 다음 mthod를 추가하여 OnConnectionEstablished를 구현합니다.
OnConnectionEstablished() 추가
비공개 OnConnectionEstablished()
<코드>{ //UI 스레드의 버튼을 활성화합니다!
var action =Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, new Windows.UI.Core.DispatchedHandler(() => {
this.OnButton.IsEnabled =true;
<코드> 이것입니다. OffButton.IsEnabled =true; <코드> <코드> arduino.pinMode(LED_PIN, PinMode.OUTPUT); <코드> })); <코드>}
4.10 마지막으로 버튼에 대한 이벤트 핸들러를 클래스에 추가합니다.
버튼 이벤트 핸들러 추가
비공개 OnButton_Click(객체 발신자, RoutedEventArgs e)
<코드>{ //핀 5에 연결된 LED를 켭니다.
<코드> arduino.digitalWrite(5, PinState.HIGH); <코드>} <코드> 비공개 무효 OffButton_Click(객체 발신자, RoutedEventArgs e)
<코드>{ //핀 5에 연결된 LED를 끕니다.
<코드> arduino.digitalWrite(5, PinState.LOW); <코드>}
4.11 x86, x64 및 ARM 구성에서 UWP 앱 빌드 테스트
이 섹션에서는 하드웨어 LED를 Arduino 장치에 연결하고 데스크톱 및 Windows 10 Phone*에서 앱을 실행합니다.
데스크톱에서 테스트
5.1 데스크톱 앱을 시작 프로젝트로 설정
5.2 대상을 x86 및 로컬 머신으로 설정합니다. 데스크톱 UWP 앱 재구축
5.3 Arduino 핀 5를 하드웨어 LED에 연결합니다. GND, VCC 및 적절한 저항을 직렬로 제공하십시오.
이전 블로그에서 언급했듯이 Windows 10 IoT 라즈베리 파이 2 GPIO 저는 LED, 스위치 등과 같은 테스트 IO를 구현하기 위해 개발 보드를 사용합니다. 유사한 보드가 없는 경우 "깜빡이는" 하드웨어 구성 하지만 버튼 핸들러에서 핀 설정의 극성을 반대로 해야 합니다.
5.4 Arduino 장치의 전원을 켜고 Bluetooth 모듈을 데스크탑과 페어링합니다(Passkey=1234). .. 이 작업을 수행하는 방법을 알고 있다고 가정하겠습니다.
5.5. 앱을 실행하세요.
5.6 앱이 블루투스 기기에 연결해도 괜찮은지 물어볼 것입니다.. OK
5.7 앱의 기능을 테스트합니다. 버튼 핸들러에 중단점을 설정하고 디버그할 수 있는지 확인하십시오.
5.8 64비트 데스크톱이 있는 경우 x64에 대해 4.1에서 4.6을 반복합니다.
5.9 데스크탑에서 블루투스 끄기
이제 전화기가 개발용으로 구성되어 있다고 가정하고 Windows 10 Phone을 테스트합니다.
5.10 휴대전화를 켜고 설정/블루투스로 이동하여 전원을 켭니다. Bluetooth 모듈과 페어링합니다(Passkey =1234).
5.11 Windows 유니버설 앱을 시작 프로젝트로 계속 사용 ..
5.12 타겟을 ARM, 디바이스로 설정하고 재구축합니다.
5.11 USB Serial을 통해 전화기를 데스크탑에 연결하고 앱을 배포합니다.
이제 Raspberry PI 2를 테스트합니다.
현재 진행 중인 작업입니다. 이 섹션 끝에 있는 참고 사항을 참조하십시오.
5.13 원격 디버거가 이미 설치되어 있고 Win 10 IoT용으로 구성된 RPI2에 활성화되어 있습니다.
5.14 RPI2의 IP 주소 결정(예:Windows IoT Core Watcher 사용)
5.15 프로젝트 속성-디버그에서 대상을 원격 머신, 인증 없음으로 설정하고 IP 주소를 입력합니다.
5.16 UWP 앱 재구축
5.17 RPI2에서 앱을 배포하고 테스트합니다.
아직 블루투스를 통해 연결할 RPI2 버전이 없습니다.
<울>
다음은 UI를 멋지게 꾸미고 Bluetooth 연결 및 연결 해제 버튼을 추가합니다.
6.1 UI GRID XAML 코드를 (PS:이전 버튼 그리드 행에 대한 참고 사항 변경으로 수정합니다. ):
두 개의 버튼 추가 및
<코드>
<코드>
UI에는 더 큰 버튼이 있고 더 다채로워져 더 나은 사용성을 제공합니다. 4세 손녀와 함께 테스트해본 결과 도착했습니다!
프로그레스 링 앱이 연결되는 동안 표시되고 순환합니다.
6.2 OnConnectionEstablished() 하단에 삽입 :
OnConnectionEstablished()
//BT가 연결되었으므로 진행 링을 끕니다.
this.progress1.IsActive =거짓;
this.progress1.Visibility =Visibility.Collapsed;
<코드>
6.3 연결 및 연결 끊기 버튼에 대해 다음 처리기를 추가합니다.
새 버튼의 이벤트 핸들러 추가
private void ConnectButton_Click(객체 발신자, RoutedEventArgs e)
<코드>{ //이 매개변수는 Bluetooth-Arduino Firmata의 경우 중요하지 않습니다. 단, SerialConfig.SERIAL_8N1
bluetooth.begin(115200, SerialConfig.SERIAL_8N1);
this.ConnectButton.IsEnabled =false;
<코드> //BT를 연결하여 진행률 표시 링
this.progress1.IsActive =true;
this.progress1.Visibility =Visibility.Visible;
<코드>} <코드> 비공개 무효 DisconnectButton_Click(객체 발신자, RoutedEventArgs e)
<코드>{ bluetooth.end();
this.OnButton.IsEnabled =false;
this.OffButton.IsEnabled =false;
this.ConnectButton.IsEnabled =true;
this.DisconnectButton.IsEnabled =false;
<코드>}
6.4 이제 연결 버튼 핸들러에 있는 것처럼 MainPageConstructor에서 다음 줄을 주석 처리하거나 제거합니다.
bluetooth.begin(115200, SerialConfig.SERIAL_8N1);
6.5 OnButton 핸들러에 다음 상태 관리 추가
OnButton_Click()
에서
this.OffButton.IsEnabled =true;
this.OnButton.IsEnabled =거짓;
6.6 그리고 OffButton 핸들러에 대한 다음 사항:
OffButton_Click
에서
this.OffButton.IsEnabled =거짓;
this.OnButton.IsEnabled =true;
6.7 섹션 5에서와 같이 세(4) 대상 모두에서 앱 배포 및 테스트
Windows 8.1 유니버설 앱에 대한 이 확장에서 Arduino 핀 5의 푸시버튼 GPIO 입력이 촉진되고 그 상태가 UI에 표시됩니다. 입력은 초기에 주기적으로 값을 읽음으로써 감지됩니다.
그러면 DigitalPinChanged 이벤트에 대한 핸들러를 구현하여 기능이 향상됩니다.
7.1 다음과 같이 두 UA에 대한 UI XAML 코드의 Grid 컨트롤을 수정합니다.
UI에 텍스트 상자 추가
<코드>
<코드>
<코드>
7.2 MainPage 클래스에서 입력 핀을 지정합니다.
- 클래스 상단의 선언에서 입력 핀 추가:
MainPage 선언에서
개인 const int PB_PIN =6;
- OnConnectionEstablished 핸들러에서 input::
으로 설정합니다.OnConnectionEstablished
arduino.pinMode(PB_PIN, PinMode.INPUT);
7.3, 다음과 같이 입력을 폴링하는 타이머를 추가합니다.
- 클래스 상단의 선언에서:
MainPage 선언에서
// 폴 모드에서 타이머 틱은 입력을 샘플링합니다.
개인 DispatcherTimer pbPolltimer;
- 생성자에서 타이머 설정:
MainPage()에서
this.pbPolltimer =새로운 DispatcherTimer();
this.pbPolltimer.Interval =TimeSpan.FromMilliseconds(250);
this.pbPolltimer.Tick +=PBTimer_Tick;
this.pbPolltimer.Stop();
- 타이머 틱 이벤트 핸들러 추가
폴 타이머 틱 핸들러 추가
PinState pbPinValue =PinState.LOW;
<코드> private void PBTimer_Tick(객체 발신자, 객체 e)
<코드>{ PinState pbPinValueTemp =arduino.digitalRead(6);
Pushbutton_Pressed(pbPinValueTemp);
<코드>}
- PushButton_Pressed() 구현:
PushButton_Pressed() 추가
비공개 푸시버튼_프레스드(PinState pbPinValueTemp)
<코드>{ if (pbPinValue !=pbPinValueTemp)
<코드> { //변경되면 값 쓰기
<코드> TxtPin6.Text ="푸시버튼:" + pbPinValueTemp.ToString(); <코드> pbPinValue =pbPinValueTemp; <코드> } <코드>}
7.4 푸시버튼 스위치가 필요합니다. 고맙게도 내 개발 보드에서 이러한 기능을 제공하므로 그냥 사용합니다. 그런 짐승이 없다면 반대의 회로를 구현하십시오.
Windows 8.1 유니버설 앱에 대한 이 확장에서 Arduino 핀 5의 푸시버튼 GPIO 입력이 촉진되고 해당 상태가 UI에 표시됩니다. 입력은 초기에 주기적으로 값을 읽음으로써 감지됩니다. Win 10 IoT Raspberry PI 2(RPI2)로 보고되었습니다. 디지털 입력이 등록되는 빈도에 몇 가지 버그가 있으며, 이는 Win 10 IoT용 RTM에서 수정될 예정입니다.
그런 다음 DigitalPinChanged 이벤트에 대한 처리기를 구현하여 기능이 향상됩니다.
하드웨어에서 이러한 상황에 대한 디바운싱은 다음과 같이 개선할 수 있습니다.
- 스위치에 작은 커패시터를 설치하여 RC 지연으로 하드웨어 디바운싱을 추가합니다.
- 또한 이 회로에 슈미트 트리거를 추가합니다.
RPI2에는 소프트웨어 구성을 통해 디바운싱을 추가하는 옵션이 있습니다.
RPI2에는 소프트웨어 구성을 통해 디바운싱을 추가하는 옵션이 있습니다.7.5 이전과 같이 대상에서 앱을 빌드, 배포 및 테스트합니다.
스위치 상태를 표시하기 위해 UI에 소프트웨어 시뮬레이션 LED를 추가해 보겠습니다.
7.6 두 유니버설 앱 모두에서 그리드 XAMLcode의 UI에 다음을 추가합니다.
- 다른 행 정의 추가(하단):
- 해당 행에 다음 타원 컨트롤을 추가합니다.
UI에 타원 추가
7.7 상단의 MainPage 클래스 선언에 두 가지 색상 브러시 정의를 추가합니다.
선언에 색상 추가
// 하드웨어 푸시버튼을 눌렀을 때/누르지 않았을 때의 타원 색상
개인 SolidColorBrush redBrush =new SolidColorBrush(Windows.UI.Colors.Red); 코드>
개인 SolidColorBrush grayBrush =new SolidColorBrush(Windows.UI.Colors.LightGray);
7.8 다음과 같이 이러한 색상으로 LED 조작을 구현합니다.
- 클래스 생성자에서 초기 색상을 설정합니다.
생성자에서
//타원의 경우 꺼진 색상으로 시작
this.PBStatusLED.Fill =회색 브러시;
- PushButtonPressed()에서 버튼의 상태에 따라 색상을 설정합니다.
Pushbutton_Pressed()
에 추가
스위치(pbPinValue)
<코드>{ 케이스 PinState.HIGH:
this.PBStatusLED.Fill =redBrush;
break;
PinState.LOW 케이스:
this.PBStatusLED.Fill =grayBrush;
break;
<코드>}
7.9 대상에서 앱을 빌드, 배포 및 테스트합니다. ..Wala!
이제 디지털 이벤트를 사용하여 이 코드를 개선합니다.
7.10 타이머와 관련된 모든 코드를 주석 처리하지만 PushButtonPressed() 함수는 그대로 둡니다. 따라서 타이머 틱 이벤트 핸들러와 별도의 이유입니다.
7.11 액션 내 OnConnectionEstablished() 이벤트 핸들러에 이벤트 대리자 사양 추가
OnConnectionEstablished에 추가
arduino.AnalogPinUpdatedEvent +=Arduino_AnalogPinUpdated;
We could try to implement the event handler as follows:
Invalid DigitalPinUpdated
private async void Arduino_DigitalPinUpdated(byte pin, PinState pinValue)
{
if (pin ==PB_PIN)
{
Pushbutton_Pressed(pinValue);
}
}
But this fail as the event runs in a thread separate to the main UI thread. This is the same issue as in .NET Windows Forms if (InvokeRequired) scenario.
7.12 Implement the event handler as follows
Add DigitalPinUpdated
private async void Arduino_DigitalPinUpdated(byte pin, PinState pinValue)
{
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
if (pin ==PB_PIN)
{
Pushbutton_Pressed(pinValue);
}
});
}
7.13 Build, deploy and test the apps on the targets. Wala
This extension to the app functionality adds a progress bar to the UA UI to display the level of a potentiometer in the hardware.
The analog input is via A0, pin 14.
Again my development board provides a potentiometer for this purpose but if you don’t have such you need to implement this circuit:The analog input pins are pins 14 (A0) to pin 19 (A5).
arduino.pinMode(ANALOG_PIN, PinMode.ANALOG);
The comment above is quite pertinent. The event handler signature provides the analog pin index (0 to 5) not the pin number.
Analog values range from 0 to 1024. (10 bit)
// Note:Need actual pin number, not analog index:
arduino.pinMode(ANALOG_PIN, PinMode.ANALOG);
8.0 Re-enable the Poll timer and disable the Pushbutton event in the MainPage class
8.1 In the grid control in the UI XAML code add another row to the grid as previous and add a ProgressBar:
Add a ProgressBar to the UI
8.2 Add the Analog pin code as follows.
- Declare the pin at the top of MainPage class:
Add the Analog Pin
private const int ANALOG_PIN =14;
- Set its mode to analog in OnConnectionEstablished() as above
- Add the following to the timer tick event:
Add to Timer Tick Handler
//Note:Analog Read Pin number is the analog index
int PinValue =arduino.analogRead(ANALOG_PIN-14);
this.analogBar.Value =PinValue;
8.3 Build, deploy and test the app on the targets. Vary the potentiometer position and observe the ProgressBar changes.
Now for the event driven version
8.4 Again comment out the Poll Timer code.
8.5 Add the analog event handler delegate specification to OnConnectionEstablished():
Set Analog Pin Mode
// Note:Need actual pin number, not analog ibndex:
arduino.pinMode(ANALOG_PIN, PinMode.ANALOG);
8.6 Add the Arduino_DigitalPinUpdated event handler method:
Add AnalogPinUpdated
private async void Arduino_AnalogPinUpdated(byte pin, ushort PinValue)
{
//Note:Pin number is the analog index
if (pin ==ANALOG_PIN -14)
{
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
this.analogBar.Value =PinValue;
});
}
}
Note that the UI update has again to be done asynchronously.
8.7 Build, deploy and test the app on the targets.
It is left to reader to implement analog output as PWM, to drive a LED (dimmed via a slider).
<울>I might provide a solution to this at a later stage.
[1] I actually used a retired earlier version of the Bluetooth module, but functionality seems to be the same.
섹션> <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">No preview (download only).섹션>
제조공정
구성품 및 소모품 Arduino UNO 자동화하려는 각 방에 대해 별도의 Arduino UNO를 가져오세요. × 1 라즈베리 파이 2 모델 B × 1 점퍼 와이어(일반) × 1 브레드보드(일반) × 1 LDR(Light Dependent Resistor) LDR은 조명 강도에 따라 다른 전압 판독값을 제공합니다. × 1 PIR 모션 센서(일반) 수동적 IR은 사람의 존재를 감지합니다. × 1 릴레이(일반) 어떤 종류
이 Arduino 및 Matlab 자습서에서는 Matlab GUI(그래픽 사용자 인터페이스)를 사용하여 Arduino 보드를 제어하는 방법을 배웁니다. LED를 켜고 끄기 위한 두 개의 버튼과 광전지(광 종속 저항)의 아날로그 입력을 플롯하기 위한 축이 있는 Matlab GUI를 만들 것입니다. 이것은 따라하기 쉬운 단계별 비디오 자습서입니다. 또한 동영상 아래에서 이 튜토리얼에 필요한 구성요소와 동영상의 예제 소스 코드를 찾을 수 있습니다. 이 튜토리얼에 필요한 구성요소 구성요소는 아래 사이트에서 얻을 수 있습니다.