资讯详情

tinygo的windows环境搭建及简单例程

windows 环境搭建

安装 g

这里还是推荐的g这个 go 类似于多版本管理工具的多版本管理工具 NodeJS 的 nvm,Python 的 virtualenv。

官网下载:

https://github.com/voidint/g/releases 

将已下载的 g1.3.0.windows-amd64.zip 解压到安装目录,如 D:\g\g.exe

配置环境变量

:如果之前安装配置过, go,请先删除之前 path 中配置的 golang 变量

//g用于下载go安装包,安装go的目录 G_HOME=C:\Users\当前登录windows的用户目录\.g  //g使用中配置go版本的目录 GOROOT=%G_HOME%\go  // 配置G_MIRROR G_MIRROR=https://golang.google.cn/dl/  ///配置g可执行文件g.exe、go可执行文件go.exe路径,这可以在全局和所有路径下实施g 或者 go 命令 PATH = %GOROOT%\bin; 

以下是我环境变量中的配置(jyj34 是我目前的登录 windows 用户目录)

环境变量path

GOPATH这种环境变量的概念于 python 虚拟环境。

常用命令:

//1. 查询可安装的go stable版本 g ls-remote stable  //2. 安装指定的go版本 g install 1.17.9  //3. 本地已安装的查询go版本 g ls  //4. 切换到已安装的go版本 g use 1.17.9  //5. 查看go是否可用 go version  //5.  查询可安装的go 所有版本 g ls-remote  //6. 本地安装指定的卸载已安装go 版本 g uninstall 1.15.7  //7. 查看g可用命令 g help 

这里 tinygo 不支持 go1.18,所以下载 1.17.9 就可以 g install 1.17.9

安装 goland

详见本文具体教程

https://mp.weixin.qq.com/s/9Njj1U17nQscPqFLWZgDpQ 

当 goland 安装好了,就在GOPATH创建三个下图文件夹,其中src是我们项目的工作场所。

[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-KWYBuJFz-1651308638727)(https://files.mdnice.com/user/14846/cf6c8eac-ba05-4652-bd50-9106ee880551.png)]

安装 arduino 配置环境变量

下载 arduino ide

官网:

https://www.arduino.cc/en/software 

建议将盘子安装在系统盘外,我安装在系统盘外 D 盘(D:\anconda)

配置环境 path

[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-TTLuFb2w-1651308638728)(https://files.mdnice.com/user/14846/94fa9b24-63f4-4ede-98cc-5c2f1a4cfb36.png)]

将以上两个添加到环境变量中,说明整体 window 环境已经建成。

例程

运行命令:

// port后面是串口名,需要在设备管理器中查看。COM5 tinygo flash -target arduino main.go -port COM5  

运行信息

[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-oVS5g2rN-1651308638728)(https://files.mdnice.com/user/14846/5b92166c-c590-4b7b-8842-8e337350a8e7.png)]

内部 LED 灯控制

package main  import (     "machine"     "time" )  func main() {     led := machine.LED     led.Configure(machine.PinConfig{Mode: machine.PinOutput})     for {         led.High()         time.Sleep(time.Millisecond * 500)         led.Low()         time.Sleep(time.Millisecond * 500)     } } 

闪烁

在这里,我们使用连接引脚 13 的外部 LED。

请注意,引脚 13 没有内置电阻。 LED 之间要加一个 220 欧姆的电阻作为保护,否则 LED 高电压可能会损坏。

package mainimport (     "machine"     "time" )  func main() {      led := machine.D13     led.Configure(machine.PinConfig{Mode: machine.PinOutput})     ledSwitch := true      for {         led.Set(ledSwitch)         ledSwitch = !ledSwitch         delay(500)     }  }  func delay(t uint32) {     time.Sleep(time.Duration(1000000 * t)) }  

machine.LED 预定义在 machine 等于模块 machine.D13 。

使用 Goroutine 闪烁!

可以在 Arduino Uno 上运行 Goroutines(并发/并行线程)-也很容易。但在上传脚本时需要使用调度程序:

命令:

tinygo flash -scheduler coroutines -target arduino main.go -port COMX 

以下代码将在不同的间隔点亮脚 2 和 3 上的两个 LED:(由于硬件限制,间隔会非常不准确。

package main  import (     "machine"     "time" )  func main() {     go led1() // goroutine     led2() }  func led1() {     led := machine.D2     led.Configure(machine.PinConfig{Mode: machine.PinOutput})     for {         led.High()         delay(500)         led.Low()         delay(500)     } }  func led2() {     led := machine.D3     led.Configure(machine.PinConfig{Mode: machine.PinOutput})     for {         led.High()         delay(400)         led.Low()         delay(400)     } }  func delay(t int64) {     time.Sleep(time.Duration(1000000 * t)) } 

这两个函数甚至可以用作 Goroutines。为此,在 main() (其实是一个 Goroutine 本身)的末尾需要一点延迟:

func main() {     go led1()     go led2()     delay(100) } 

LED 阵列(简单版)

现在,我们将让一排 9 个 LED 一个接一个地闪烁,朝向相同后返回。使用引脚 2-10。

package main

import (
    "machine"
    "time"
)

func main() {

    leds := []machine.Pin{
        machine.D2,
        machine.D3,
        machine.D4,
        machine.D5,
        machine.D6,
        machine.D7,
        machine.D8,
    }

    for i := 0; i < len(leds); i++ {
        leds[i].Configure(machine.PinConfig{Mode: machine.PinOutput}})
    }

    for {

        for i := 0; i < len(leds); i++ {
            leds[i].High()
            delay(75)
            leds[i].Low()
        }

        for i := len(leds) - 1; i >= 0; i-- {
            leds[i].High()
            delay(75)
            leds[i].Low()
        }

    }
}

func delay(t uint16) {
    time.Sleep(time.Duration(1000000 * uint32(t)))
}

LED 阵列(进阶版)

package main

import (
 "machine"
 "time"
)

func main() {

    delay := func(t uint16) {
        time.Sleep(time.Duration(1000000 * uint32(t)))
    }

    leds := []machine.Pin{
        machine.D2,
        machine.D3,
        machine.D4,
        machine.D5,
        machine.D6,
        machine.D7,
        machine.D8,
    }

    for _, led := range leds {
        led.Configure(machine.PinConfig{Mode: machine.PinOutput})
    }

    index, delta := 0, 1

    for {

        for i, led := range leds {
            led.Set(i == index)
        }

        index += delta

        if index == 0 || index == len(leds)-1 {
            delta *= -1
        }

        delay(75)
    }
}

:LED 结构的 Set()方法接受一个布尔参数(真/假)。在 Go 中,不能将 int 转换为 bool;必须使用逻辑运算符。

按键:数字输入

引脚也可用于读取数字信号(高/低电压)。在这里,我们将使用引脚 8 上的按钮(或开关)来打开/关闭引脚 13 上的 LED。

为了在高/低状态之间切换,按钮需要一个 10K 欧姆的上拉电阻。

package main

import (
    "machine"
    "time"
)

func main() {

    button := machine.D2
    button.Configure(machine.PinConfig{Mode: machine.PinInput})

    led := machine.D9
    led.Configure(machine.PinConfig{Mode: machine.PinOutput})

    for {
        led.Set(!button.Get())
        time.Sleep(time.Millisecond * 100)
    }
}

: Get()方法返回一个布尔值(真/假)。还可以使用内部上拉电阻,它允许您仅使用 2 根线(signal/ground)来连接按钮:

button := machine.D2
button.Configure(machine.PinConfig{Mode: machine.PinInputPullup})

PWM

在 Uno(和 Nano)上,只有引脚 3、5、6、9、10 和 11(旁边带有~标记)可用于输出 PWM。

这个例子使引脚 9 上的 LED “呼吸” - 逐渐亮起和消失,电路与闪烁代码相同。

package main

import (
    "machine"
    "time"
)

func main() {

    machine.InitPWM()
    led := machine.PWM{machine.D9}
    led.Configure()

    duty, delta := 0, 1024

    for {

        led.Set(uint16(duty))
        duty += delta

        if duty < 0 || duty > 65535 {
            delta *= -1
            duty += delta
        }

        time.Sleep(time.Millisecond * 25)
     }
}

PWM 的Set()方法接受一个 uint16 参数 (0-65535),即 PWM占空比。

传感器:模拟输入

Arduino Uno 上的一些引脚具有 ADC(模数转换器),允许它们将电压读取为数字。

在这里,我们使用 LDR(光敏电阻)根据光照水平将模拟读数输出到引脚 A0,并打开/关闭引脚 13 上的 LED。为了读取电压的变化,我们需要一个 10K的分压器电路欧姆电阻。

mackage main

import (
    "machine"
    "time"
)

func main() {

    machine.InitADC()
    ldr := machine.ADC{machine.ADC0}
    ldr.Configure()

    led := machine.Pin(machine.D9)
    led.Configure(machine.PinConfig{Mode: machine.PinOutput})

    for {

        print(ldr.Get())

        if ldr.Get() > 40000 {
            led.Set(true)
        } else {
            led.Set(false)
        }
  
        time.Sleep(time.Millisecond * 100)
    }
}

这里我将阈值设置为 40000。实际阈值可能会根据您的照明条件而有所不同。您可以使用终端软件(如Tera Term或 Arduino IDE 的串行监视器)从print()读取输出值。

END

好了,下期再见!!!

标签: 如何不启用windows传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台