性无码一区二区三区在线观看,少妇被爽到高潮在线观看,午夜精品一区二区三区,无码中文字幕人妻在线一区二区三区,无码精品国产一区二区三区免费

  • 回復(fù)
  • 收藏
  • 點(diǎn)贊
  • 分享
  • 發(fā)新帖

【DigiKey年度寵粉】+ M5Stack Unit Roller485 深度體驗(yàn)報(bào)告

一、購(gòu)買經(jīng)歷:從技術(shù)種草到開箱驚喜

人品大爆炸,非常榮幸地被電源網(wǎng)選上了寵粉活動(dòng)。??作為機(jī)器人開發(fā)愛好者,我在M5Stack官網(wǎng)看到Unit Roller485的技術(shù)參數(shù)后立即被吸引。這款集成FOC控制、485/2C雙通信、滑環(huán)設(shè)計(jì)的旋轉(zhuǎn)執(zhí)行器,完美契合我的項(xiàng)目需求。通過官網(wǎng)授權(quán)經(jīng)銷商下單后,1周天便收到包裹。

 

- 工業(yè)級(jí)黑色包裝內(nèi)含防震泡沫

- 配件齊全(含HT3.96R-4P插頭、雙Grove線、M3螺絲包等)

- 主體采用CNC鋁合金外殼,表面噴砂工藝觸感細(xì)膩

- OLED屏幕保護(hù)膜貼心預(yù)貼

 二、產(chǎn)品體驗(yàn):工業(yè)設(shè)計(jì)與智能控制的完美融合

外觀細(xì)節(jié)

- 立方體造型(40x40x40mm),頂部/底部均有LEGO兼容孔

- 背部集成0.66英寸OLED屏實(shí)時(shí)顯示參數(shù)

- 兩側(cè)分布PWR485接口(6-16V)與Grove插座

- 隱藏式RGB燈帶環(huán)繞主體,動(dòng)態(tài)指示工作狀態(tài)

 硬件性能測(cè)試

- 供電兼容性:同時(shí)支持5V Grove供電(70mA待機(jī))和16V高壓輸入(32mA待機(jī)),自動(dòng)切換模式

- 負(fù)載表現(xiàn):測(cè)試16V供電下,500g負(fù)載穩(wěn)定運(yùn)行(轉(zhuǎn)速560rpm),無明顯發(fā)熱

- 滑環(huán)黑科技:360°旋轉(zhuǎn)時(shí)Grove接口持續(xù)供電,成功驅(qū)動(dòng)旋轉(zhuǎn)攝像頭模塊

- 噪音控制:空載運(yùn)行僅48dB,優(yōu)于同類產(chǎn)品

控制模式實(shí)戰(zhàn)

我打算用M5Stack U182來制作一個(gè)360度慢速旋轉(zhuǎn)展示臺(tái)。這個(gè)展示臺(tái)將能夠精確控制旋轉(zhuǎn)速度,我可以用來展示各種產(chǎn)品參加活動(dòng)的產(chǎn)品。

通過Arduino庫(kù)實(shí)現(xiàn)多模式控制:

// Copyright (c) 2025 misetteichan
// Licensed under the MIT License. See LICENSE file for details.
#include "M5Dial.h"
#include <M5Unified.h>
#include <Avatar.h>
#include <unit_rolleri2c.hpp>

static UnitRollerI2C roller;
int32_t origin = 0;
m5avatar::Avatar avatar;
int mode = 0;

void apply_angle()
{
  auto curr = -(origin - roller.getPosReadback()) / 100.f;
  curr = std::fmod(curr, 360.0f);
  if (curr < 0)
  {
    curr += 360.f;
  }
  printf("angle: %f\n", curr);
  avatar.setRotation(curr);
}

bool judge_mode()
{
  M5Dial.update();
  if (!M5.BtnA.wasClicked())
  {
    return false;
  }
  // 修改為三模式循環(huán)
  mode = (mode + 1) % 3; // 0->1->2->0...
  // mode = 1 - mode;
  printf("mode: %d\n", mode);

  roller.setPos(roller.getPosReadback());

  auto cp = avatar.getColorPalette();
  switch (mode)
  {
  case 0:
    roller.setOutput(0);
    cp.set(COLOR_PRIMARY, WHITE);
    break;
  case 1:
    roller.setOutput(1);
    cp.set(COLOR_PRIMARY, YELLOW);
    break;
  case 2: // 新增模式2顏色標(biāo)識(shí)
    // roller.setOutput(0);
    cp.set(COLOR_PRIMARY, GREEN);
    break;
  }
  avatar.setColorPalette(cp);
  return true;
}

bool move(float deg)
{
  if (judge_mode())
  {
    return false;
  }
  roller.setPos(roller.getPos() + static_cast<int32_t>(deg * 100.f));
  M5.delay(1);
  apply_angle();
  return true;
}

void setup()
{
  auto cfg = M5.config();
  M5Dial.begin(cfg, true, false);

  const auto sda = M5.getPin(m5::pin_name_t::port_a_sda);
  const auto scl = M5.getPin(m5::pin_name_t::port_a_scl);
  while (!roller.begin(&Wire, 0x64, sda, scl, 400000))
  {
    M5.delay(1000);
  }
  roller.setOutput(0);
  roller.setMode(ROLLER_MODE_POSITION);
  roller.setPosMaxCurrent(100000);
  origin = roller.getPos();

  const auto r = avatar.getFace()->getBoundingRect();
  const auto scale = std::min(
      M5.Display.width() / (float)r->getWidth(),
      M5.Display.height() / (float)r->getHeight());
  avatar.setScale(scale);
  const auto offs_x = (r->getWidth() - M5.Display.width()) / 2;
  const auto offs_y = (r->getHeight() - M5.Display.height()) / 2;
  avatar.setPosition(-offs_y, -offs_x);
  avatar.init();
}

void loop()
{
  const auto d = .5f;
  static long lastPosition = 0; // 用于存儲(chǔ)上次的 newPosition
  static long newPosition =0;
  judge_mode();
  switch (mode)
  {
  case 0:    
    apply_angle();
    break;
  case 1:
    newPosition = M5Dial.Encoder.read();

    // 判斷旋轉(zhuǎn)方向
    if (newPosition > lastPosition)
    {
      while (roller.getPos() < origin + newPosition * 100 * 3)
      {
        if (!move(d))
        {
          return;
        }
      }
    }
    else if (newPosition < lastPosition)
    {
      while (roller.getPos() > origin + newPosition * 100 * 3)
      {
        if (!move(-d))
        {
          return;
        }
      }
    }

    lastPosition = newPosition;
    break;
  case 2:
    // if (judge_mode())
    // { // 檢測(cè)模式切換
    //   return;
    // }
    // 持續(xù)慢速順時(shí)針旋轉(zhuǎn)(每次增加0.2度)
    // roller.setPos(roller.getPos() + static_cast<int32_t>(0.2f * 100.f));
    // 持續(xù)慢速順時(shí)針旋轉(zhuǎn)(每次增加0.2度)
    if (!move(0.10f)) // 傳遞較小的角度值
    {
      return;
    }
    M5.delay(1); // 增大延時(shí)降低速度
  }
}

B站演示鏈接

- 位置模式:±0.1°精度,配合磁編碼器實(shí)現(xiàn)精準(zhǔn)定位

- 速度模式:2100rpm空載轉(zhuǎn)速,PID算法動(dòng)態(tài)調(diào)整

- 電流模式:0.5A持續(xù)電流輸出,過載保護(hù)靈敏

 

 五、總結(jié):工業(yè)級(jí)旋轉(zhuǎn)控制的標(biāo)桿產(chǎn)品

M5Stack Unit Roller485重新定義了小型旋轉(zhuǎn)執(zhí)行器的標(biāo)準(zhǔn),其集成度、控制精度和擴(kuò)展性在同類產(chǎn)品中脫穎而出。無論是工業(yè)自動(dòng)化設(shè)備,還是藝術(shù)創(chuàng)作裝置,這款產(chǎn)品都能提供可靠的動(dòng)力支持。對(duì)于追求高效開發(fā)與穩(wěn)定運(yùn)行的工程師來說,Unit Roller485無疑是理想之選。

> 購(gòu)買建議:推薦搭配CoreS3開發(fā)板使用,通過I2C接口可實(shí)現(xiàn)即插即用。建議多備滑環(huán)模塊,擴(kuò)展旋轉(zhuǎn)外設(shè)應(yīng)用場(chǎng)景。

項(xiàng)目完整代碼:pio項(xiàng)目

diialMoter.zip

全部回復(fù)(0)
正序查看
倒序查看
現(xiàn)在還沒有回復(fù)呢,說說你的想法
發(fā)