这里还是推荐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 的用户目录)
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
具体教程详见这篇文章
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)]
官网:
https://www.arduino.cc/en/software
建议安装到系统盘以外的盘,我是安装到 D 盘(D:\anconda)
。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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)]
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 。
可以在 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)
}
现在,我们将让一排 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)))
}
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})
在 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()读取输出值。
好了,下期再见!!!