您的位置:时时app平台注册网站 > 编程知识 > 树莓派 Windows10 IoT Core 开发教程

树莓派 Windows10 IoT Core 开发教程

2019-09-15 01:01

我们会用到 GPIO4 针脚 和 GPIO27针脚,因为这两个在 Pi 2 GPIO 数据头中靠的很近。

入门指引

现在让我们把LED连接到安装了Windows10 IoT Core 的硬件设备,并创建一个应用程序来让它们闪烁。

之前将go语言的运行环境给搭建起来了,但是没有开始真正的试试Go 语言操作树莓派硬件的效果。

本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权,最新文章请访问

代码详解

下面就是这个程序的代码,基本工作原理是当定时器的时间达到后,调用事件Tick改变LED的状态。

一、树莓派3B硬件介绍

树莓派3B采用了博通的BCM2837方案,而树莓派2采用的是博通的BCM2836方案,这两个方案 树莓派2采用32bit的 ARMv7指令集的 ARM Cortex-A7 内核,树莓派3B采用了 64bit的 ARMV8指令集的 AR Cortex-A53内核,看起来BCM2837似乎略胜一筹,毕竟升级到了64位处理器。一下是树莓派3B的样图:

图片 1

树莓派3B.png

网上查阅了一圈资料,发现BCM2837的资料都没放出来,在官网上找到了一则说明:

This is the Broadcom chip used in the Raspberry Pi 3, and in later models of the Raspberry Pi 2. The underlying architecture of the BCM2837 is identical to the BCM2836. The only significant difference is the replacement of the ARMv7 quad core cluster with a quad-core ARM Cortex A53 (ARMv8) cluster.

The ARM cores run at 1.2GHz, making the device about 50% faster than the Raspberry Pi 2. The VideocoreIV runs at 400Mhz.

Also see the Raspberry Pi 2's chip BCM2836 and the Raspberry Pi 1's chip BCM2835

看样子官网说外设没差别,就核心换了一下,那大致可以认为外设包括I2C、GPIO、SPI、timer这些基本的东西都没有怎么变化才对。不过为了保险起见,还是查阅了相关文档。以下是树莓派3B GPIO引脚图。

图片 2

树莓派3B 接口.png

对比一下树莓派2的相关引脚图:

图片 3

树莓派2 接口.png

仔细查阅了下,这上面常用的GPIO,SPI,I2C,UART都提供了。这还算好,发现常用的PWM不见了,这可有点麻烦了,后面再继续研究PWM。

SwiftyGPIO 这个 API 能让你在 ARM 板子上用 Swift 使用 GPIO 。随着 Swift 语言的日新月异、与时俱进,Swift 俨然已进军制造业,很有可能成为单板计算机开发项目的不二选择。

在Visual Studio中加载工程

首先在这里找到例程,这里有C 和C#的版本可供选择。本教程仅介绍使用C#的版本。将工程文件夹拷贝到磁盘中,然后用Visual Studio打开。
然后检查你的Windows IoT设备,确保打开了远程调试功能(Remote Debugging),可以参考这里的Hello World程序。
请注意如果Windows 10找不到可用的GPIO接口,应用程序将不会工作。比如你将windows10安装在了VM虚拟机中。

二、点亮LED灯

我们尝试下所有开发板的第一个例程,点亮LED灯。这里找寻了一会暂时觉得可以使用下 nathan-osman 大神的 go-rpigpio 库。

go get github.com/nathan-osman/go-rpigpio

安装好了敲入以下代码:

package main

import (
    "github.com/nathan-osman/go-rpigpio"
    "time"
    "fmt"
)

func main(){
    p,err := rpi.OpenPin(2,rpi.OUT)
    if err != nil {
        panic(err)
    }
    defer p.Close()

    //set high
    p.Write(rpi.HIGH)
    fmt.Println("start gpio test")

    go func() {
        for{
            time.Sleep(time.Millisecond * 100)
            p.Write(rpi.HIGH)
            fmt.Println("on")
            time.Sleep(time.Millisecond * 100)
            p.Write(rpi.LOW)
            fmt.Println("off")
        }
    }()

    time.Sleep(time.Hour * 2)
}

保存并编译:

go build gpio_test.go
sudo ./gpio_test.go

这时候我们在 GPIO2 和 GND 之间串上一个 LED 灯 和一个 1K的电阻,发现 LED灯已经开始以飞快的频率闪烁了。

  • 一个 Raspberry Pi 2
  • 一对 LED 灯
  • 连接用的电线
  • 把 Swift 安装到你的 Pi 2 上

改变GPIO引脚的状态

使用GpioPinValue.Low参数打开LED:
this.pin.Write(GpioPinValue.Low);
使用GpioPinValue.High参数关闭LED:
this.pin.Write(GpioPinValue.High);

因为我们将LED的正极连接到了3.3V电源,所以这里通过将GPIO引脚置低电平来打开LED。

本文来自:树莓派实验室
链接地址:

图片 4闪烁 闪烁

将LED连接到 Windows 10 设备

准备好下面的东西:
一个LED灯
一个阻值220欧姆电阻
若干杜邦线和面包板

图片 5

将LED的负极连接到Raspberry Pi2的GPIO 5引脚(Board编号29),正极串联嗲足后连接到3.3v电源。(请务必注意极性,在直插型封装的LED中,较长的引脚是正极+,较短的引脚是负极-)

图片 6

图片 7

正确连接 LED 灯后,这两个灯会来回闪烁!

定时器代码

这里是设置定时器的C#代码

public MainPage()
{
    // ...

    this.timer = new DispatcherTimer();
    this.timer.Interval = TimeSpan.FromMilliseconds(500);
    this.timer.Tick  = Timer_Tick;
    this.timer.Start();

    // ...
}

private void Timer_Tick(object sender, object e)
{
    FlipLED();
}

去年,我参与过使用 Xcode 开发 Arduino 项目,写过一些关于 LED 灯闪烁的代码。这次我们在 Raspberry Pi 2 上用 Swift 语言再实现一次。

初始化GPIO引脚

为了能够驱动GPIO,首先需要对它进行初始化,这里是初始化程序的C#代码

using Windows.Devices.Gpio;

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

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

    pin = gpio.OpenPin(LED_PIN);

    // Show an error if the pin wasn't initialized properly
    if (pin == null)
    {
        GpioStatus.Text = "There were problems initializing the GPIO pin.";
        return;
    }

    pin.Write(GpioPinValue.High);
    pin.SetDriveMode(GpioPinDriveMode.Output);

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

简单的解释就是:
~首先,使用GpioController.GetDefault()获取GPIO控制权限
~如果设备不具有可用的GPIO资源,则返回null
~接下来通过调用GpioController.OpenPin()函数来打开GPIO引脚
~当我们获取了GPIO的控制权限并打开了GPIO引脚后,使用GpioPin.Write()函数来将LED关闭(参数设置High)
~这里还使用了GpioPin.SetDriveMode()函数将GPIO引脚的工作模式设置为输出模式。

和全球的开源项目开发者一起工作非常有趣并且可以从中获得很多经验。随着计算机设备和宽带成本逐渐降低,给全世界的人带来了新技术,来自不同文化、不同背景的开发者们走到一起努力合作,共同创造了不起的成就。

部署应用程序

对于Raspberry Pi2来说,应该在architecture的下拉菜单中选择ARM。

以上的步骤都做好了以后。可以按下F5,程序会自动运行,然后就可以看到闪烁的LED和下面的模拟界面。

图片 8

可以通过改变滑块的位置来调整LED闪烁的有效时间

SwiftyGPIO README 详细解释了如何使用模块。正如 Umberto 所说,Swift Package Manager 目前还不能在 ARM 上使用(我曾经尝试进行编译,不过有时候发生抢占),所以我们还是下载 SwiftyGPIO.swift 文件,通过 wget 和 swiftc 来进行编译,将所有的东西连起来。

直到 SwiftPM for ARM 被修复之前,为了能够完成编译成功运行这段代码,我们需要这样做:

import Glibc // 1let gpiodefs = SwiftyGPIO.getGPIOsForBoard(.RaspberryPiPlus2Zero) // 2enum GPIOState:Int {case Off = 0case On } // 3struct LedColor { static let Off = (GPIOState.Off, GPIOState.Off) static let Green = (GPIOState.On, GPIOState.Off) static let Orange = (GPIOState.On, GPIOState.On) static let Red = (GPIOState.Off, GPIOState.On)} // 4let gpios = [gpiodefs[.P4]!, gpiodefs[.P27]!]for gpio in gpios { gpio.direction = .OUT gpio.value = GPIOState.Off.rawValue} // 5func setLedColor(color:(GPIOState,GPIOState), gpios:[GPIO]) { gpios[0].value = color.0.rawValue gpios[1].value = color.1.rawValue} // 6guard Process.arguments.count == 2 else { print("Usage: ./main off|green|orange|red") exit} let color = Process.arguments[1] // 7switch color { case "off": setLedColor(LedColor.Off, gpios:gpios) case "green": setLedColor(LedColor.Green, gpios:gpios) case "orange": setLedColor(LedColor.Orange, gpios:gpios) case "red": setLedColor(LedColor.Red, gpios:gpios) default: print("Invalid color")}
# wget https://raw.githubusercontent.com/uraimo/SwiftyGPIO/master/Sources/SwiftyGPIO.swift# swiftc main.swift SwiftyGPIO.swift# ./main
  1. SwiftGPIO 为比较流行的板子提供了封装好的 GPIO。在我们的例子中,我们用的是 Raspberry Pi 2。
  2. 纯粹就是描述 GPIO 状态的语法,比如 On 或者 Off。如果我们删掉这部分,估计整个代码看起来会整洁一些。
  3. LedColor 是个结构体,定义 off, Green, Ogrange 和 Red。
  4. 三色 LED 灯有两个正极接口,我们将其中一个接口连接到 GPIO4 上,另外一个连接到 GPIO27 上,应用启动后会先将接口方向设置为 .OUT 和 OFF。然后,因为我们用枚举创建的 GPIOState ,所以我们应该用 .rawValue 。
  5. setLedColor 方法通过一个元组(GPIOState,GPIOState)和 一个数组 [GPIO] 把 一对儿 GPIO 接口设置为肯定状态。
  6. 我们的应用只有一个参数,所以 guard 方法中只有两个,一个是应用名字,另外一个是颜色。
  7. 使用 switch 语句来转换颜色,通过调用 setLedColor 来设置颜色。

自从苹果去年开源 Swift 编程语言以来,热心人们已经创建了 Ubuntu 安装包,移植到 ARM 设备上如 Raspberry Pi 2,创建了网页开发框架,而现在Umberto Raimondi 发布了 SwiftyGPIO,一个 Swift 库,能够和 ARM 设备(如 Raspberry Pi 和 BeagleBone Black)上的 GPIO 接口进行交互。

import Glibc let gpios = SwiftyGPIO.getGPIOsForBoard(.RaspberryPiPlus2Zero) // GPIO4 and GPIO27let leds = [gpios[.P4]!, gpios[.P27]!] // Initialize our GPIOsfor led in leds { led.direction = .OUT led.value = 0} // Blinkwhile true { for led in leds { led.value = 1 sleep led.value = 0 }}

我有一个闲置的 Linrose Tricolor LED 灯,我打算物尽其用。在这段示例代码中,我们已经写了一条命令行程序,允许你设置 LED 灯的颜色。我在代码中用 //1, //2 标注出来了。

如果你打算尝试一下,我们需要:

下面是 mian.swift 文件,能够让两个 LED 灯来回闪烁。

本文由时时app平台注册网站发布于编程知识,转载请注明出处:树莓派 Windows10 IoT Core 开发教程

关键词: