机器人制作开源项目 | 滑板助力器项目

原创 机器谱 2023-08-23 22:20
我们可以用一块废滑板做些什么

如今,越来越多的人选择电动滑板作为代步工具或娱乐方式,市场上也涌现出越来越多的电动滑板产品。

应用项目-【A004】滑板助力器项目-0.1版-图1-一体化关节,电动滑板、DIY,机器人制作,机器人技术应用

应用项目-【A004】滑板助力器项目-0.1版-图2-一体化关节,电动滑板、DIY,机器人制作,机器人技术应用

图片来源:https://www.backfireboards.com/products/backfire-zealot-x-belt-drive-electric-skateboard

应用项目-【A004】滑板助力器项目-0.1版-图3-一体化关节,电动滑板、DIY,机器人制作,机器人技术应用

图片来源:https://boostedusa.com/collections/evolve-skateboards

那么,这是不是就意味着传统的"原始"滑板会被冷落呢?

应用项目-【A004】滑板助力器项目-0.1版-图4-一体化关节,电动滑板、DIY,机器人制作,机器人技术应用


我们团队里有几个滑板爱好者,他们认为可以发明一种滑板助力器,让原始滑板焕发新生命,摆脱对人体能量的依赖。安装滑板助力器之后,我们的原始滑板就可以得到电动助力,延长滑行距离,提高速度,并且不再依赖个人体力续航。同时也要保留传统滑板的操作方式,尽量不改变滑板玩家的操作习惯(比如上下板的动作),这样既能享受电动滑板的便利和效率,又能保留一些“原始情结”。

应用项目-【A004】滑板助力器项目-0.1版-图5-一体化关节,电动滑板、DIY,机器人制作,机器人技术应用

既然要做电动的助力器,那么选择一个合适的电机是少不了的。经过对比,我们选择了robodyno一体化可编程电机Pro-P12型。该电机采用驱控一体设计,全钢齿轮组1:12.45行星减速器,14位绝对位置磁编码器,IIC总线接口,额定功率35W,最高转速310rpm,堵转扭矩2.79N·m。借助一块小小的通信模块与电脑连接后,即可使用python语言直接编程,非常适合开发。

应用项目-【A004】滑板助力器项目-0.1版-图6-一体化关节,电动滑板、DIY,机器人制作,机器人技术应用

曾经用于开发机械臂、机器狗、智能车等开发项目。

应用项目-【A004】滑板助力器项目-0.1版-图7-一体化关节,电动滑板、DIY,机器人制作,机器人技术应用

电机选定后,接下来的关键就是轮子,我们从网上挑选了一款搅拌机用的摩擦轮,改造后便可作为助力器的轮子。

应用项目-【A004】滑板助力器项目-0.1版-图8-一体化关节,电动滑板、DIY,机器人制作,机器人技术应用

接下来准备好全套零部件及装配工具。

应用项目-【A004】滑板助力器项目-0.1版-图9-一体化关节,电动滑板、DIY,机器人制作,机器人技术应用

去掉摩擦轮原先的轮毂并安装上Robodyno Pro-P12电机配套的轮毂零件,以及3D打印的轮毂外圈,轮子部分就完成了。

应用项目-【A004】滑板助力器项目-0.1版-图10-一体化关节,电动滑板、DIY,机器人制作,机器人技术应用

然后给电机装上轮架侧板,再和轮子装配在一起。

应用项目-【A004】滑板助力器项目-0.1版-图11-一体化关节,电动滑板、DIY,机器人制作,机器人技术应用

应用项目-【A004】滑板助力器项目-0.1版-图11-一体化关节,电动滑板、DIY,机器人制作,机器人技术应用

将轴承、轮架顶板、轮架外板装上(在上图中,轮架顶板和轮架外板已经装成了L型,即图中右侧第一个零件),助力轮便装配完成了。

应用项目-【A004】滑板助力器项目-0.1版-图12-一体化关节,电动滑板、DIY,机器人制作,机器人技术应用

最后,在滑板板尾和合适位置上打孔,并将助力轮安装在滑板上面。

应用项目-【A004】滑板助力器项目-0.1版-图13-一体化关节,电动滑板、DIY,机器人制作,机器人技术应用

装配完成。

应用项目-【A004】滑板助力器项目-0.1版-图14-一体化关节,电动滑板、DIY,机器人制作,机器人技术应用

下面是我们选择的控制器,采用ESP32-Pico-D4芯片,安装了一块OLED屏幕用于显示操作界面以及一个旋钮按键用于操作。这个控制器里已经集成一个电机通信模块,因此不需要额外安装电机通信模块了。

应用项目-【A004】滑板助力器项目-0.1版-图15-一体化关节,电动滑板、DIY,机器人制作,机器人技术应用

我们编写了一套固件,让它可以用于控制滑板。

应用项目-【A004】滑板助力器项目-0.1版-图16-一体化关节,电动滑板、DIY,机器人制作,机器人技术应用

通过拨动旋钮,可以控制助力轮的输出力矩,数字越大,力矩越大,旋转速度也就越快使用者可以根据自身体重和期望的起步速度来选择合适的数值。

应用项目-【A004】滑板助力器项目-0.1版-图17-一体化关节,电动滑板、DIY,机器人制作,机器人技术应用

点击下方的正方形按钮,就可以控制助力轮启停。

应用项目-【A004】滑板助力器项目-0.1版-图18-一体化关节,电动滑板、DIY,机器人制作,机器人技术应用

然后接上11.1V动力电池,并电池和控制器用轧带固定在滑板上。

应用项目-【A004】滑板助力器项目-0.1版-图19-一体化关节,电动滑板、DIY,机器人制作,机器人技术应用

我们最期待的功能是要让滑板像普通滑板一样,蹬一脚就能走,用脚摩擦地面就能停。换句话说,就是开机后,电机在未受力的情况下静止,受到一定的推力后开始转动,受到一定的阻力后停止转动。Robodyno Pro电机使用python即可编程,非常方便。

应用项目-【A004】滑板助力器项目-0.1版-图20-一体化关节,电动滑板、DIY,机器人制作,机器人技术应用

程序源代码如下:

main.py

Python
import lvgl as lv
from ili9XXX import ili9488, LANDSCAPE
SCR_WIDTH = 480
SCR_HEIGHT = 320
disp = ili9488(mosi=4, miso=18, clk=5, cs=14, dc=13, rst=12, \
               power=-1, backlight=15, backlight_on=1, factor=32, \
               width=SCR_WIDTH, height=SCR_HEIGHT, rot=LANDSCAPE)
from ft6x36 import ft6x36
touch_rst = Pin(2, Pin.OUT)
touch_rst.on()
touch = ft6x36(sda=27, scl=26, width=SCR_HEIGHT, height=SCR_WIDTH, inv_x=True, swap_xy=True)

style = lv.style_t()
style.init()
style.set_radius(0)
style.set_bg_color(lv.color_hex(0x2E3234))
style.set_text_color(lv.color_hex(0xC2C1C1))
style.set_border_width(0)

screen = lv.scr_act()
screen.add_style(style, 0)

from motor_controller import MotorController
           
controller = MotorController(screen)

import time
while True:
    controller.update()
    time.sleep(0.01)
boot.py


Python
# This file is executed on every boot (including wake-boot from deepsleep)
#import esp
#esp.osdebug(None)
#import webrepl
#webrepl.start()
from machine import Pin
import time
power = Pin(32, Pin.OUT)
_roller_btn = Pin(36, Pin.IN)
_enc_a = Pin(37, Pin.IN)
_enc_b = Pin(38, Pin.IN)
_a0 = 1
_b0 = 1
_ab0 = 1
enc_pos = 0
def on_enc_change(pin):
    global _a0, _b0, _ab0, enc_pos
    a = _enc_a.value()
    b = _enc_b.value()
    if not a == _a0:
        _a0 = a
        if not b == _b0:
            _b0 = b
            enc_pos += 1 if a == b else -1
            if not (a == b) == _ab0:
                enc_pos += 1 if a == b else -1
            _ab0 = (a == b)
           
_enc_a.irq(handler = on_enc_change)
time.sleep(2)
power.on()
encoder.py


Python
from machine import Pin
class Encoder:
    def __init__(self):
        self.btn_pin = Pin(36, Pin.IN)
        self.enc_a = Pin(37, Pin.IN)
        self.enc_b = Pin(38, Pin.IN)
        self.a0 = 1
        self.b0 = 1
        self.ab0 = 1
        self.pos = 0
        self.enc_a.irq(handler = self.on_change)
   
    def on_change(self, pin):
        a = self.enc_a.value()
        b = self.enc_b.value()
        if not a == self.a0:
            self.a0 = a
            if not b == self.b0:
                self.b0 = b
                self.pos += 1 if a == b else -1
                if not (a == b) == self.ab0:
                    self.pos += 1 if a == b else -1
                self.ab0 = (a == b) 
motor_controller.py


Python
from encoder import Encoder
import lvgl as lv
from machine import Pin
import time
from robodyno import *

class MotorController:
    def __init__(self, container):
        self.running_flag = False
        self.encoder = Encoder()
        self.container = container
        self.power = Pin(32, Pin.OUT)
        self.can = CanBus()
        self.motor = Motor(self.can, 0x10, ROBODYNO_PRO_12)
        self.motor.torque_mode()
        self.max_torque = 3
        self.draw_power_btn()
        self.draw_bar()
        self.draw_btn()
   
    def draw_bar(self):
        self.label = lv.label(self.container)
        self.label.set_text(str(self.encoder.pos))
        self.label.set_style_text_font(lv.font_montserrat_24, 0)
        self.label.align(lv.ALIGN.TOP_MID, 0, 50)

        self.bar = lv.bar(self.container)
        self.bar.set_size(200, 20)
        self.bar.align(lv.ALIGN.TOP_MID, 0, 90)
        self.bar.set_value(self.encoder.pos, lv.ANIM.OFF)
   
    def draw_btn(self):
        self.btn = lv.btn(self.container)
        self.btn.align(lv.ALIGN.TOP_MID, 0, 150)
        self.btn.set_size(100,100)
        self.btn.set_style_bg_color(lv.color_hex(0x4EB181), 0)
        self.btn_label = lv.label(self.btn)
        self.btn_label.set_style_text_font(lv.font_montserrat_24, 0)
        self.btn_label.set_text(lv.SYMBOL.PLAY)
        self.btn_label.center()
        self.btn.add_event_cb(self.on_btn_click, lv.EVENT.CLICKED, None)
   
    def on_btn_click(self, e):
        btn = e.get_target()
        label = btn.get_child(0)
        if self.running_flag:
            self.motor.set_torque(0)
            self.motor.disable()
            self.running_flag = False
            btn.set_style_bg_color(lv.color_hex(0x4EB181), 0)
            label.set_text(lv.SYMBOL.PLAY)
        else:
            self.motor.set_torque(0)
            self.motor.enable()
            self.running_flag = True
            btn.set_style_bg_color(lv.color_hex(0xF44336), 0)
            label.set_text(lv.SYMBOL.STOP)
   
    def draw_power_btn(self):
        self.power_btn = lv.btn(self.container)
        self.power_btn.align(lv.ALIGN.TOP_RIGHT, -40, 40)
        self.power_btn.set_size(40,40)
        self.power_btn.set_style_bg_color(lv.color_hex(0xF44336), 0)
        self.power_btn_label = lv.label(self.power_btn)
        self.power_btn_label.set_style_text_font(lv.font_montserrat_24, 0)
        self.power_btn_label.set_text(lv.SYMBOL.POWER)
        self.power_btn_label.center()
        self.power_btn.add_event_cb(self.on_power_off, lv.EVENT.CLICKED, None)
   
    def on_power_off(self, e):
        self.power.off()
   
    def update(self):
        if self.encoder.pos > 100:
            self.encoder.pos = 100
        if self.encoder.pos < 0: self.encoder.pos = 0 self.bar.set_value(self.encoder.pos, lv.ANIM.OFF) self.label.set_text(str(self.encoder.pos)) if self.running_flag: b = 0.002 + self.encoder.pos / 100 * 0.3 vel = self.motor.get_vel() if vel is not None: vel = -vel torque = 0 if vel > 3:
                    torque = max(-0.107 - b * vel, -self.max_torque)
                elif vel < -3: torque = min(0.1 - b * vel, self.max_torque) self.motor.set_torque(torque)

以上4个程序文件拷贝到控制器的内存中,即可被固件调用。

接下来测试一下起步


应用项目-【A004】滑板助力器项目-0.1版-图21-一体化关节,电动滑板、DIY,机器人制作,机器人技术应用


然后再试一下转弯,表现效果还不错。

应用项目-【A004】滑板助力器项目-0.1版-图22-一体化关节,电动滑板、DIY,机器人制作,机器人技术应用

最后试一下刹车

应用项目-【A004】滑板助力器项目-0.1版-图23-一体化关节,电动滑板、DIY,机器人制作,机器人技术应用

这些稳如狗的表现自然是通过一次又一次的调试和数不清的翻车换来的。

应用项目-【A004】滑板助力器项目-0.1版-图25-一体化关节,电动滑板、滑板改造,DIY,机器人制作,机器人技术应用.gif应用项目-【A004】滑板助力器项目-0.1版-图26-一体化关节,电动滑板、滑板改造,DIY,机器人制作,机器人技术应用.gif

应用项目-【A004】滑板助力器项目-0.1版-图27-一体化关节,电动滑板、滑板改造,DIY,机器人制作,机器人技术应用.gif应用项目-【A004】滑板助力器项目-0.1版-图28-一体化关节,电动滑板、滑板改造,DIY,机器人制作,机器人技术应用.gif

现在,我们的报废滑板又获得赛博新生啦~(可以踩着它出去浪了)

应用项目-【A004】滑板助力器项目-0.1版-图25-一体化关节,电动滑板、DIY,机器人制作,机器人技术应用

本项目已经开源,资料可在下方链接处下载。如果您对本项目有任何建议,欢迎留言

附:Robodyno Pro一体化可编程电机购买链接

附:主要零件清单



附:开源资料



更多资料详见 A004】滑板助力器项目

机器谱 机器人开源项目方案分享~
评论
  • 这篇内容主要讨论三个基本问题,硅电容是什么,为什么要使用硅电容,如何正确使用硅电容?1.  硅电容是什么首先我们需要了解电容是什么?物理学上电容的概念指的是给定电位差下自由电荷的储藏量,记为C,单位是F,指的是容纳电荷的能力,C=εS/d=ε0εrS/4πkd(真空)=Q/U。百度百科上电容器的概念指的是两个相互靠近的导体,中间夹一层不导电的绝缘介质。通过观察电容本身的定义公式中可以看到,在各个变量中比较能够改变的就是εr,S和d,也就是介质的介电常数,金属板有效相对面积以及距离。当前
    知白 2025-01-06 12:04 173浏览
  • 彼得·德鲁克被誉为“现代管理学之父”,他的管理思想影响了无数企业和管理者。然而,关于他的书籍分类,一种流行的说法令人感到困惑:德鲁克一生写了39本书,其中15本是关于管理的,而其中“专门写工商企业或为企业管理者写的”只有两本——《为成果而管理》和《创新与企业家精神》。这样的表述广为流传,但深入探讨后却发现并不完全准确。让我们一起重新审视这一说法,解析其中的矛盾与根源,进而重新认识德鲁克的管理思想及其著作的真正价值。从《创新与企业家精神》看德鲁克的视角《创新与企业家精神》通常被认为是一本专为企业管
    优思学院 2025-01-06 12:03 119浏览
  • By Toradex 秦海1). 简介嵌入式平台设备基于Yocto Linux 在开发后期量产前期,为了安全以及提高启动速度等考虑,希望将 ARM 处理器平台的 Debug Console 输出关闭,本文就基于 NXP i.MX8MP ARM 处理器平台来演示相关流程。 本文所示例的平台来自于 Toradex Verdin i.MX8MP 嵌入式平台。  2. 准备a). Verdin i.MX8MP ARM核心版配合Dahlia载板并
    hai.qin_651820742 2025-01-07 14:52 48浏览
  • 根据环洋市场咨询(Global Info Research)项目团队最新调研,预计2030年全球无人机锂电池产值达到2457百万美元,2024-2030年期间年复合增长率CAGR为9.6%。 无人机锂电池是无人机动力系统中存储并释放能量的部分。无人机使用的动力电池,大多数是锂聚合物电池,相较其他电池,锂聚合物电池具有较高的能量密度,较长寿命,同时也具有良好的放电特性和安全性。 全球无人机锂电池核心厂商有宁德新能源科技、欣旺达、鹏辉能源、深圳格瑞普和EaglePicher等,前五大厂商占有全球
    GIRtina 2025-01-07 11:02 71浏览
  • 本文介绍Linux系统更换开机logo方法教程,通用RK3566、RK3568、RK3588、RK3576等开发板,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。制作图片开机logo图片制作注意事项(1)图片必须为bmp格式;(2)图片大小不能大于4MB;(3)BMP位深最大是32,建议设置为8;(4)图片名称为logo.bmp和logo_kernel.bmp;开机
    Industio_触觉智能 2025-01-06 10:43 87浏览
  • 在智能家居领域中,Wi-Fi、蓝牙、Zigbee、Thread与Z-Wave等无线通信协议是构建短距物联局域网的关键手段,它们常在实际应用中交叉运用,以满足智能家居生态系统多样化的功能需求。然而,这些协议之间并未遵循统一的互通标准,缺乏直接的互操作性,在进行组网时需要引入额外的网关作为“翻译桥梁”,极大地增加了系统的复杂性。 同时,Apple HomeKit、SamSung SmartThings、Amazon Alexa、Google Home等主流智能家居平台为了提升市占率与消费者
    华普微HOPERF 2025-01-06 17:23 145浏览
  • 每日可见的315MHz和433MHz遥控模块,你能分清楚吗?众所周知,一套遥控设备主要由发射部分和接收部分组成,发射器可以将控制者的控制按键经过编码,调制到射频信号上面,然后经天线发射出无线信号。而接收器是将天线接收到的无线信号进行解码,从而得到与控制按键相对应的信号,然后再去控制相应的设备工作。当前,常见的遥控设备主要分为红外遥控与无线电遥控两大类,其主要区别为所采用的载波频率及其应用场景不一致。红外遥控设备所采用的射频信号频率一般为38kHz,通常应用在电视、投影仪等设备中;而无线电遥控设备
    华普微HOPERF 2025-01-06 15:29 129浏览
  • PLC组态方式主要有三种,每种都有其独特的特点和适用场景。下面来简单说说: 1. 硬件组态   定义:硬件组态指的是选择适合的PLC型号、I/O模块、通信模块等硬件组件,并按照实际需求进行连接和配置。    灵活性:这种方式允许用户根据项目需求自由搭配硬件组件,具有较高的灵活性。    成本:可能需要额外的硬件购买成本,适用于对系统性能和扩展性有较高要求的场合。 2. 软件组态   定义:软件组态主要是通过PLC
    丙丁先生 2025-01-06 09:23 85浏览
  • 村田是目前全球量产硅电容的领先企业,其在2016年收购了法国IPDiA头部硅电容器公司,并于2023年6月宣布投资约100亿日元将硅电容产能提升两倍。以下内容主要来自村田官网信息整理,村田高密度硅电容器采用半导体MOS工艺开发,并使用3D结构来大幅增加电极表面,因此在给定的占位面积内增加了静电容量。村田的硅技术以嵌入非结晶基板的单片结构为基础(单层MIM和多层MIM—MIM是指金属 / 绝缘体/ 金属) 村田硅电容采用先进3D拓扑结构在100um内,使开发的有效静电容量面积相当于80个
    知白 2025-01-07 15:02 75浏览
  • 根据Global Info Research项目团队最新调研,预计2030年全球封闭式电机产值达到1425百万美元,2024-2030年期间年复合增长率CAGR为3.4%。 封闭式电机是一种电动机,其外壳设计为密闭结构,通常用于要求较高的防护等级的应用场合。封闭式电机可以有效防止外部灰尘、水分和其他污染物进入内部,从而保护电机的内部组件,延长其使用寿命。 环洋市场咨询机构出版的调研分析报告【全球封闭式电机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球封闭式电机总体规
    GIRtina 2025-01-06 11:10 104浏览
  • 大模型的赋能是指利用大型机器学习模型(如深度学习模型)来增强或改进各种应用和服务。这种技术在许多领域都显示出了巨大的潜力,包括但不限于以下几个方面: 1. 企业服务:大模型可以用于构建智能客服系统、知识库问答系统等,提升企业的服务质量和运营效率。 2. 教育服务:在教育领域,大模型被应用于个性化学习、智能辅导、作业批改等,帮助教师减轻工作负担,提高教学质量。 3. 工业智能化:大模型有助于解决工业领域的复杂性和不确定性问题,尽管在认知能力方面尚未完全具备专家级的复杂决策能力。 4. 消费
    丙丁先生 2025-01-07 09:25 80浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦