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
好了,下期再见!!!