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

windows 环境搭建

安装 g

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

官网下载:
https://github.com/voidint/g/releases

tinygo的windows环境搭建及简单例程_第1张图片

将已下载的 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 的用户目录)
tinygo的windows环境搭建及简单例程_第2张图片

环境变量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

tinygo的windows环境搭建及简单例程_第3张图片

建议安装到系统盘以外的盘,我是安装到 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 可能会被较高的电压损坏。

tinygo的windows环境搭建及简单例程_第4张图片

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。

tinygo的windows环境搭建及简单例程_第5张图片

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 欧姆的上拉电阻。

tinygo的windows环境搭建及简单例程_第6张图片

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的分压器电路欧姆电阻。

tinygo的windows环境搭建及简单例程_第7张图片

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,开发语言,golang,嵌入式)