Gobot ( https://gobot.io/ ) 是一个使用 Go 编程语言 ( https://golang.org/ ) 的框架,用于机器人、物理计算和物联网。
它提供了一种简单而强大的方法来创建同时包含多个不同硬件设备的解决方案。
想直接在微控制器上运行 Go 吗?查看我们的姐妹项目 TinyGo ( https://tinygo.org/ )
通过运行以下命令获取 Gobot 源代码:
git clone https://github.com/hybridgroup/gobot.git git checkout release
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon">
<path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
然后看一下示例目录。您需要找到一个与您的平台相匹配的示例来进行第一次测试(例如“raspi_blink.go”)。然后构建二进制文件(交叉编译),将其传输到您的目标并运行它。
env GOOS=linux GOARCH=arm GOARM=5 go build -o ./output/my_raspi_bink examples/raspi_blink.go
使用上面的示例代码在本地计算机上构建代码将为 ARMv5 创建二进制文件。这可能不是您的特定目标平台所需要的。另请阅读平台子文件夹中的平台特定文档。
创建一个新文件夹和一个新的 Go 模块项目。
mkdir ~/my_gobot_example cd ~/my_gobot_example go mod init my.gobot.example.com
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon">
<path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
除了 go.mod 文件之外,复制示例文件,导入需求并构建。
cp /<path to gobot folder>/examples/raspi_blink.go ~/my_gobot_example/ go mod tidy env GOOS=linux GOARCH=arm GOARM=5 go build -o ./output/my_raspi_bink raspi_blink.go
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon">
<path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
现在您已准备好修改示例并测试您的更改。首先删除文件开头的构建指令。
package mainimport ( "time"
"gobot.io/x/gobot/v2" "gobot.io/x/gobot/v2/drivers/gpio" "gobot.io/x/gobot/v2/platforms/firmata" )
func main() { firmataAdaptor := firmata.NewAdaptor("/dev/ttyACM0") led := gpio.NewLedDriver(firmataAdaptor, "13")
work := func() { gobot.Every(1*time.Second, func() { led.Toggle() }) }
robot := gobot.NewRobot("bot", []gobot.Connection{firmataAdaptor}, []gobot.Device{led}, work, )
robot.Start() }
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon">
<path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
package mainimport ( "fmt" "time"
"gobot.io/x/gobot/v2" "gobot.io/x/gobot/v2/platforms/sphero" )
func main() { adaptor := sphero.NewAdaptor("/dev/rfcomm0") driver := sphero.NewSpheroDriver(adaptor)
work := func() { gobot.Every(3*time.Second, func() { driver.Roll(30, uint16(gobot.Rand(360))) }) }
robot := gobot.NewRobot("sphero", []gobot.Connection{adaptor}, []gobot.Device{driver}, work, )
robot.Start() }
您可以使用上面示例中所示的整个 Gobot 框架(“经典”Gobot),也可以从各种 Gobot 软件包中进行选择,仅使用纯惯用的 Golang 代码(“金属”Gobot)来控制硬件。例如:
package mainimport ( "gobot.io/x/gobot/v2/drivers/gpio" "gobot.io/x/gobot/v2/platforms/intel-iot/edison" "time" )
func main() { e := edison.NewAdaptor() e.Connect()
led := gpio.NewLedDriver(e, "13") led.Start()
for { led.Toggle() time.Sleep(1000 * time.Millisecond) } }
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon">
<path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
您还可以使用该框架(又名“Master Gobot”)的全部功能来控制机器人群或其他功能,例如内置 API 服务器。例如:
package mainimport ( "fmt" "time"
"gobot.io/x/gobot/v2" "gobot.io/x/gobot/v2/api" "gobot.io/x/gobot/v2/platforms/sphero" )
func NewSwarmBot(port string) *gobot.Robot { spheroAdaptor := sphero.NewAdaptor(port) spheroDriver := sphero.NewSpheroDriver(spheroAdaptor) spheroDriver.SetName("Sphero" + port)
work := func() { spheroDriver.Stop()
<span class="pl-s1">spheroDriver</span>.<span class="pl-en">On</span>(<span class="pl-s1">sphero</span>.<span class="pl-c1">Collision</span>, <span class="pl-k">func</span>(<span class="pl-s1">data</span> <span class="pl-k">interface</span>{}) { <span class="pl-s1">fmt</span>.<span class="pl-en">Println</span>(<span class="pl-s">"Collision Detected!"</span>) }) <span class="pl-s1">gobot</span>.<span class="pl-en">Every</span>(<span class="pl-c1">1</span><span class="pl-c1">*</span><span class="pl-s1">time</span>.<span class="pl-c1">Second</span>, <span class="pl-k">func</span>() { <span class="pl-s1">spheroDriver</span>.<span class="pl-en">Roll</span>(<span class="pl-c1">100</span>, <span class="pl-en">uint16</span>(<span class="pl-s1">gobot</span>.<span class="pl-en">Rand</span>(<span class="pl-c1">360</span>))) }) <span class="pl-s1">gobot</span>.<span class="pl-en">Every</span>(<span class="pl-c1">3</span><span class="pl-c1">*</span><span class="pl-s1">time</span>.<span class="pl-c1">Second</span>, <span class="pl-k">func</span>() { <span class="pl-s1">spheroDriver</span>.<span class="pl-en">SetRGB</span>(<span class="pl-en">uint8</span>(<span class="pl-s1">gobot</span>.<span class="pl-en">Rand</span>(<span class="pl-c1">255</span>)), <span class="pl-en">uint8</span>(<span class="pl-s1">gobot</span>.<span class="pl-en">Rand</span>(<span class="pl-c1">255</span>)), <span class="pl-en">uint8</span>(<span class="pl-s1">gobot</span>.<span class="pl-en">Rand</span>(<span class="pl-c1">255</span>)), ) })}
robot := gobot.NewRobot("sphero", []gobot.Connection{spheroAdaptor}, []gobot.Device{spheroDriver}, work, )
return robot }
func main() { master := gobot.NewMaster() api.NewAPI(master).Start()
spheros := []string{ "/dev/rfcomm0", "/dev/rfcomm1", "/dev/rfcomm2", "/dev/rfcomm3", }
for _, port := range spheros { master.AddRobot(NewSwarmBot(port)) }
master.Start() }
<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon">
<path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
Gobot有一个可扩展的系统用于连接硬件设备。目前支持以下机器人和物理计算平台:
- Arduino <=>封装
- 音频 <=>包
- Beaglebone 黑色<=>封装
- Beaglebone PocketBeagle <=>包
- 蓝牙 LE <=>封装
- 芯片<=>封装
- CHIP Pro <=>封装
- Digispark <=>包
- DJI Tello <=>套餐
- DragonBoard <=>包
- ESP8266 <=>封装
- GoPiGo 3 <=>套餐
- 英特尔居里<=>封装
- 英特尔爱迪生<=>封装
- 英特尔焦耳<=>封装
- Jetson Nano <=>包
- 操纵杆<=>封装
- 键盘<=>封装
- Leap Motion <=>包
- MavLink <=>包
- MegaPi <=>封装
- Microbit <=>封装
- MQTT <=>包
- NanoPi NEO <=>封装
- NATS <=>包
- Neurosky <=>套餐
- OpenCV <=>包
- 粒子<=>包
- Parrot ARDrone 2.0 <=>套餐
- 星际鹦鹉<=>套装
- Parrot 迷你无人机<=>套装
- 卵石<=>套餐
- Radxa Rock Pi 4 <=>套件
- 树莓派<=>封装
- Sphero <=>包
- Sphero BB-8 <=>包装
- Sphero Ollie <=>套餐
- Sphero SPRK+ <=>封装
- Tinker Board <=>包
- UP2 <=>封装
对许多使用通用输入/输出 (GPIO) 的设备的支持具有使用该gobot/drivers/gpio包提供的一组共享驱动程序:
- GPIO <=>驱动程序
- AIP1640 LED点阵/7段控制器
- 按钮
- 蜂鸣器
- 直接插针
- 易驱动
- Grove Button(通过使用 Button 的驱动程序)
- Grove Buzzer(通过使用蜂鸣器驱动程序)
- Grove LED(通过使用 LED 驱动器)
- Grove 磁性开关(通过使用按钮驱动程序)
- Grove Relay(通过使用 Relay 驱动程序)
- Grove 触摸传感器(通过使用按钮驱动程序)
- HC-SR04 超声波测距模块
- HD44780液晶控制器
- 引领
- Makey 按钮(通过使用按钮驱动程序)
- MAX7219 LED点阵
- 发动机
- 接近红外 (PIR) 运动传感器
- 中继
- RGB LED
- 伺服
- 步进电机
- TM1638 LED控制器
对许多使用模拟输入/输出 (AIO) 的设备的支持具有使用该gobot/drivers/aio包提供的一组共享驱动程序:
- 一体机<=>驱动程序
- 模拟执行器
- 模拟传感器
- 格罗夫光传感器
- Grove 压电振动传感器
- 格罗夫旋转表盘
- Grove 声音传感器
- 格罗夫温度传感器
- 温度传感器(支持正向和反向模式下的线性和NTC热敏电阻)
- 热区温度传感器
对使用内部集成电路 (I2C) 的设备的支持具有使用该gobot/drivers/i2c包提供的一组共享驱动程序:
- I2C <=>驱动程序
- Adafruit 1109 2x16 RGB-LCD,带 5 个按键
- Adafruit 2327 16 通道 PWM/伺服 HAT 帽子
- Adafruit 2348 直流和步进电机帽
- ADS1015 模数转换器
- ADS1115 模数转换器
- ADXL345 数字加速度计
- BH1750 数字亮度/勒克斯/光传感器
- 闪烁 LED
- BME280 气压/温度/高度/湿度传感器
- BMP180 气压/温度/高度传感器
- BMP280 气压/温度/高度传感器
- BMP388 气压/温度/高度传感器
- DRV2605L 触觉控制器
- 用于从寄存器地址读取和写入值的通用驱动程序
- Grove 数字加速度计
- GrovePi 扩展板
- 格罗夫 RGB 液晶显示屏
- HMC6352 指南针
- HMC5883L 3轴数字罗盘
- INA3221 电压监视器
- JHD1313M1 LCD 显示屏,带 RGB 背光
- L3GD20H 三轴陀螺仪
- 激光雷达-Lite
- MCP23017 端口扩展器
- MMA7660 3 轴加速度计
- MPL115A2 气压/温度
- MPU6050 加速度计/陀螺仪
- PCA9501 带中断的 8 位 I/O 端口、2 kbit EEPROM
- PCA953x LED 调光器,适用于 PCA9530(2 位)、PCA9533(4 位)、PCA9531(8 位)、PCA9532(16 位)
- PCA9685 16通道12位PWM/伺服驱动器
- PCF8583 时钟和日历或事件计数器,240 x 8 位 RAM
- PCF8591 8 位 4xA/D 和 1xD/A 转换器
- SHT2x 温度/湿度
- SHT3x-D 温度/湿度
- SSD1306 OLED显示控制器
- TSL2561 数字亮度/勒克斯/光传感器
- Wii 双节棍控制器
- YL-40亮度/温度传感器、电位器、模拟输入、模拟输出驱动器
对使用串行外设接口 (SPI) 的设备的支持具有使用该包提供的一组共享驱动程序gobot/drivers/spi:
- SPI <=>驱动程序
- APA102 可编程 LED
- MCP3002 模拟/数字转换器
- MCP3004 模数转换器
- MCP3008 模数转换器
- MCP3202 模拟/数字转换器
- MCP3204 模数转换器
- MCP3208 模数转换器
- MCP3304 模数转换器
- MFRC522 RFID 读卡器
- SSD1306 OLED显示控制器
更多平台和驱动程序即将推出...
Gobot 包含一个 RESTful API,用于查询组内运行的任何机器人的状态,包括连接和设备状态,并执行设备命令。
要激活 API,请导入gobot.io/x/gobot/v2/api包并实例化,API如下所示:
master := gobot.NewMaster() api.NewAPI(master).Start()
您还可以指定 api 主机和端口,并开启身份验证:
master := gobot.NewMaster() server := api.NewAPI(master) server.Port = "4000" server.AddHandler(api.BasicAuth("gort", "klatuu")) server.Start()
您可以通过导航到 Gobot 来访问robeauxhttp://localhost:3000/index.html React.js 界面。
Gobot 使用 Gort http://gort.io命令行界面 (CLI),因此您可以直接从命令行访问重要功能。我们称之为“RobotOps”,又名“机器人开发运营”。您可以扫描、连接、更新设备固件等等!
我们总是在我们的网站https://gobot.io/上添加文档,请在我们继续开发 Gobot 时查看该网站
谢谢你!
- 问题: https: //github.com/hybridgroup/gobot/issues
- 推特:@gobotio
- 松弛: https: //gophers.slack.com/messages/C0N5HDB08
- 邮件列表:https://groups.google.com/forum/#!forum /gobotio
有关我们的贡献指南,请访问https://github.com/hybridgroup/gobot/blob/master/CONTRIBUTING.md 。
Gobot 随贡献者行为准则一起发布。参与该项目即表示您同意遵守其条款。 你可以在这里读到它。
版权所有 (c) 2013-2020 混合集团。根据 Apache 2.0 许可证获得许可。
贡献者契约是根据知识共享署名 4.0 国际公共许可证发布的,该许可证要求包含署名。