机器人制作开源方案 | 滑板助力器

这篇具有很好参考价值的文章主要介绍了机器人制作开源方案 | 滑板助力器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我们可以用一块废滑板做些什么   

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

机器人制作开源方案 | 滑板助力器,开源

机器人制作开源方案 | 滑板助力器,开源

(图片来源:Backfire Zealot X Belt Drive Electric Skateboard– Backfire Boards

机器人制作开源方案 | 滑板助力器,开源

(图片来源:Electric Skateboards - Boosted USA

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

机器人制作开源方案 | 滑板助力器,开源

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

机器人制作开源方案 | 滑板助力器,开源

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

机器人制作开源方案 | 滑板助力器,开源

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

机器人制作开源方案 | 滑板助力器,开源

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

机器人制作开源方案 | 滑板助力器,开源

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

机器人制作开源方案 | 滑板助力器,开源

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

机器人制作开源方案 | 滑板助力器,开源

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

机器人制作开源方案 | 滑板助力器,开源

机器人制作开源方案 | 滑板助力器,开源

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

机器人制作开源方案 | 滑板助力器,开源

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

机器人制作开源方案 | 滑板助力器,开源

装配完成。

机器人制作开源方案 | 滑板助力器,开源

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

机器人制作开源方案 | 滑板助力器,开源

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

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

机器人制作开源方案 | 滑板助力器,开源

机器人制作开源方案 | 滑板助力器,开源

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

机器人制作开源方案 | 滑板助力器,开源

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

机器人制作开源方案 | 滑板助力器,开源

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

机器人制作开源方案 | 滑板助力器,开源

程序源代码如下:

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个程序文件拷贝到控制器的内存中,即可被固件调用。

接下来测试一下起步。

机器人制作开源方案 | 滑板助力器,开源

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

机器人制作开源方案 | 滑板助力器,开源

最后试一下刹车。

机器人制作开源方案 | 滑板助力器,开源

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

机器人制作开源方案 | 滑板助力器,开源

机器人制作开源方案 | 滑板助力器,开源

机器人制作开源方案 | 滑板助力器,开源

机器人制作开源方案 | 滑板助力器,开源

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

机器人制作开源方案 | 滑板助力器,开源

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

附:Robodyno Pro一体化可编程电机技术文档

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

附:主要零件清单

序号 零件名称 数量 备注
1 普通滑板 1
2 Robodyno Pro-P12一体化可编程电机 1
3 搅拌机摩擦轮轮皮 1
4 Robodyno Pro轮毂零件 1
5 3D打印轮毂外圈 1 PLA
6 Robodyno Pro轮架外板 1
7 Robodyno Pro轮架侧板 1
8 Robodyno Pro轮架顶板 1
9 M2.5*15螺丝 9 不锈钢
10 Robodyno Pro电机线 1
11 ESP32控制器 1 ESP32-Pico-D4芯片
12

TFT3.5通信转接板

1 安装在ESP32控制器外壳中

附:开源资料

资料清单

序号

内容
1

【A004】-程序源代码

2

【A004】-电路原理图

3

【A004】-控制器电路板生产文件

4

【A004】-控制器外壳3D打印文件

5

控制器固件

更多资料内容下载详见 【A004】滑板助力器项目​​​​​​​文章来源地址https://www.toymoban.com/news/detail-663821.html

到了这里,关于机器人制作开源方案 | 滑板助力器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器人制作开源方案 | 智能落叶清扫机器人

    作者:李聪赛 马嘉骏 李佳豪 邵一鸣 池宏伟 单位:唐山学院 指导老师:袁娜       近年来,随着人工智能科学和计算机技术人工智能科学的飞速发展,智能机器人技术已成为当代机器人研究领域的热门话题。其中服务机器人开辟了机器人应用的新领域,服务机器人的出现有

    2024年02月04日
    浏览(70)
  • 机器人制作开源方案 | AI校园服务机器人

    作者:李强、李振宁、毛维雷、李文文、张奥 单位:山西能源学院 指导老师:姚志广、程晟       在这个科技飞速发展的时代,在工业智造、人工智能的飞速发展中,出现了越来越多的智能化机械装置,也有许多创新类的比赛,本作品基于探索者创新套件设计平台设计出一

    2024年01月20日
    浏览(56)
  • 机器人制作开源方案 | 家庭清扫拾物机器人

    作者: 罗诚、李旭洋、胡旭、符粒楷 单位: 南昌交通学院 人工智能学院 指导老师: 揭吁菡       在家庭中我们有时无法到一些低矮阴暗的地方进行探索,比如茶几下或者床底下,特别是在部分家庭中,如果没有及时对这些阴暗低矮的地方进行清扫,则会导致这些地方不干

    2024年02月07日
    浏览(49)
  • 机器人制作开源方案 | 全自动导航分拣机器人

    作者:孙国峰 董阳 张鑫源 单位:山东科技大学 机械电子工程学院 指导老师:张永超 贝广霞 1.1 研究背景       在工业生产中,机器人在解决企业的劳动力不足,提高企业劳动生产率,提高产品质量和降低生产成本方面有着显著的意义。随着计算机自动化技术和社会的发展

    2024年01月23日
    浏览(57)
  • 机器人制作开源方案 | 乒乓球自动拾取机器人

    作者:刘众森、王森、王绘东、崔岳震、宋维鑫 单位:山东农业工程学院 指导老师:潘莹月、廖希杰       我们小组选择项目的任务方向乒乓球的捡取与存放,针对此问题我们研发了一款乒乓球自动拾取机器人。众所周知,乒乓球是一种世界流行的球类体育项目,而我国是

    2024年02月01日
    浏览(51)
  • 机器人制作开源方案 | 图书管理助手

    作者:丁位 朱红磊 程国正 杨秀萍 丁语林 单位:黑龙江科技大学 指导老师:邵文冕 刘安平 1.1 研究背景及意义        通过查阅资料,我们团队了解到自2015年起中国公共图书馆图书流通人次逐年增加,2019年中国公共图书馆图书流通人次达90135万人次,较2018年增加了8103万人

    2024年02月20日
    浏览(41)
  • 机器人制作开源方案 | 智能盲道除雪小车

    作者: 汪荣顺 李明旭 马晓乐 吴泽俊 李以陈 单位:江汉大学 指导老师: 张朝刚 张会利       本文论述了一种新型智能盲道除雪小车的设计与研发。由于目前的除雪设备集中在公路、城市道路、机场路面、高速公路等领域,但对于街道等路况的研究很少。因此,我们针对盲

    2024年02月02日
    浏览(53)
  • 机器人制作开源方案 | 森林管理员

    ​作者: 李佳骏、常睿康、张智斌、李世斌、高华耸 单位:山西能源学院 指导老师: 赵浩成、郜敏       森林作为地球上可再生自然资源及陆地生态的主体,在人类生存和发展的历史中起着不可代替的作用,它不仅能提供国家建设和人民生活所需的木材及林副产品,而且

    2024年02月03日
    浏览(44)
  • 机器人制作开源方案 | 智能垃圾桶

           智能垃圾桶是一种利用物联网技术和智能感知能力的智能设备,旨在提高垃圾分类和处理的效率。通常具备以下特点和功能: ① 智能感知:智能垃圾桶配备各种传感器,如压力传感器、红外线传感器等,可以实时感知垃圾桶内垃圾的填充情况和类型。 ② 垃圾分类:

    2024年02月16日
    浏览(56)
  • 机器人制作开源方案 | 行星探测车概述

           行星探测车(Planetary Rover)是一种用于进行科学探索和勘测任务的无人车辆,它们被设计成能够适应各种复杂的地形条件和极端环境,以便收集数据、拍摄照片、采集样本等。行星探测车通常包含以下主要组件和功能:        ① 底盘和轮子系统:底盘提供了行星探

    2024年02月07日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包