一、購買經歷:從技術種草到開箱驚喜
人品大爆炸,非常榮幸地被電源網選上了寵粉活動。??作為機器人開發愛好者,我在M5Stack官網看到Unit Roller485的技術參數后立即被吸引。這款集成FOC控制、485/2C雙通信、滑環設計的旋轉執行器,完美契合我的項目需求。通過官網授權經銷商下單后,1周天便收到包裹。
- 工業級黑色包裝內含防震泡沫
- 配件齊全(含HT3.96R-4P插頭、雙Grove線、M3螺絲包等)
- 主體采用CNC鋁合金外殼,表面噴砂工藝觸感細膩
- OLED屏幕保護膜貼心預貼
二、產品體驗:工業設計與智能控制的完美融合
外觀細節
- 立方體造型(40x40x40mm),頂部/底部均有LEGO兼容孔
- 背部集成0.66英寸OLED屏實時顯示參數
- 兩側分布PWR485接口(6-16V)與Grove插座
- 隱藏式RGB燈帶環繞主體,動態指示工作狀態
硬件性能測試
- 供電兼容性:同時支持5V Grove供電(70mA待機)和16V高壓輸入(32mA待機),自動切換模式
- 負載表現:測試16V供電下,500g負載穩定運行(轉速560rpm),無明顯發熱
- 滑環黑科技:360°旋轉時Grove接口持續供電,成功驅動旋轉攝像頭模塊
- 噪音控制:空載運行僅48dB,優于同類產品
控制模式實戰
我打算用M5Stack U182來制作一個360度慢速旋轉展示臺。這個展示臺將能夠精確控制旋轉速度,我可以用來展示各種產品參加活動的產品。
通過Arduino庫實現多模式控制:
// 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;
}
// 修改為三模式循環
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顏色標識
// 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; // 用于存儲上次的 newPosition
static long newPosition =0;
judge_mode();
switch (mode)
{
case 0:
apply_angle();
break;
case 1:
newPosition = M5Dial.Encoder.read();
// 判斷旋轉方向
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())
// { // 檢測模式切換
// return;
// }
// 持續慢速順時針旋轉(每次增加0.2度)
// roller.setPos(roller.getPos() + static_cast<int32_t>(0.2f * 100.f));
// 持續慢速順時針旋轉(每次增加0.2度)
if (!move(0.10f)) // 傳遞較小的角度值
{
return;
}
M5.delay(1); // 增大延時降低速度
}
}
- 位置模式:±0.1°精度,配合磁編碼器實現精準定位
- 速度模式:2100rpm空載轉速,PID算法動態調整
- 電流模式:0.5A持續電流輸出,過載保護靈敏
五、總結:工業級旋轉控制的標桿產品
M5Stack Unit Roller485重新定義了小型旋轉執行器的標準,其集成度、控制精度和擴展性在同類產品中脫穎而出。無論是工業自動化設備,還是藝術創作裝置,這款產品都能提供可靠的動力支持。對于追求高效開發與穩定運行的工程師來說,Unit Roller485無疑是理想之選。
> 購買建議:推薦搭配CoreS3開發板使用,通過I2C接口可實現即插即用。建議多備滑環模塊,擴展旋轉外設應用場景。
項目完整代碼:pio項目