M5Unit-HUB 0.2.1 git rev:9518267
Loading...
Searching...
No Matches
unit_PbHub.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
10#ifndef M5_UNIT_HUB_UNIT_PBHUB_HPP
11#define M5_UNIT_HUB_UNIT_PBHUB_HPP
12
13#include <M5UnitComponent.hpp>
14#include <array>
15
16class TwoWire;
17
18namespace m5 {
19namespace unit {
20
25namespace pbhub {
26
31enum class LEDMode : uint8_t {
32 WS28xx,
33 SK6822,
34 Unknown = 0xFF,
35};
36
37} // namespace pbhub
38
49class UnitPbHub : public Component {
50 M5_UNIT_COMPONENT_HPP_BUILDER(UnitPbHub, 0x61);
51
52public:
53 constexpr static uint8_t MAX_CHANNEL{6};
54 constexpr static uint8_t MAX_LED_COUNT{74};
55
56 explicit UnitPbHub(const uint8_t addr = DEFAULT_ADDRESS);
57 virtual ~UnitPbHub() = default;
58
59 virtual bool begin() override;
60
67 inline uint8_t firmwareVersion() const
68 {
69 return _ver;
70 }
71
74
80 inline bool writeDigital0(const uint8_t ch, const bool high)
81 {
82 return write_digital(ch, 0, high);
83 }
90 inline bool writeDigital1(const uint8_t ch, const bool high)
91 {
92 return write_digital(ch, 1, high);
93 }
100 inline bool readDigital0(bool& high, const uint8_t ch)
101 {
102 return read_digital(ch, 0, high);
103 }
110 inline bool readDigital1(bool& high, const uint8_t ch)
111 {
112 return read_digital(ch, 1, high);
113 }
115
119
125 inline bool writeAnalog0(const uint8_t ch, const uint8_t val)
126 {
127 return write_analog(ch, 0, val);
128 }
135 inline bool writeAnalog1(const uint8_t ch, const uint8_t val)
136 {
137 return write_analog(ch, 0, val);
138 }
140
143
149 bool readAnalog0(uint16_t& val, const uint8_t ch);
151
155
161 inline bool writePWM0(const uint8_t ch, const uint8_t pwm)
162 {
163 return write_pwm(ch, 0, pwm);
164 }
171 inline bool writePWM1(const uint8_t ch, const uint8_t pwm)
172 {
173 return write_pwm(ch, 1, pwm);
174 }
181 inline bool readPWM0(uint8_t& pwm, const uint8_t ch)
182 {
183 return read_pwm(ch, 0, pwm);
184 }
191 inline bool readPWM1(uint8_t& pwm, const uint8_t ch)
192 {
193 return read_pwm(ch, 1, pwm);
194 }
196
200
207 bool writeLEDCount(const uint8_t ch, const uint16_t num);
215 bool writeLEDColor(const uint8_t ch, const uint16_t index, const uint32_t rgb888);
224 bool fillLEDColor(const uint8_t ch, const uint32_t rgb888, const uint16_t first = 0, const uint16_t count = 0);
231 bool writeLEDBrightness(const uint8_t ch, const uint8_t value);
239 bool writeLEDMode(const pbhub::LEDMode m);
248
254
260 inline bool writeServo0Angle(const uint8_t ch, const uint8_t angle)
261 {
262 return write_servo_angle(ch, 0, angle);
263 }
270 inline bool writeServo1Angle(const uint8_t ch, const uint8_t angle)
271 {
272 return write_servo_angle(ch, 1, angle);
273 }
280 inline bool writeServo0Pulse(const uint8_t ch, const uint16_t pulse)
281 {
282 return write_servo_pulse(ch, 0, pulse);
283 }
290 inline bool writeServo1Pulse(const uint8_t ch, const uint16_t pulse)
291 {
292 return write_servo_pulse(ch, 1, pulse);
293 }
300 inline bool readServo0Angle(uint8_t& angle, const uint8_t ch)
301 {
302 return read_servo_angle(ch, 0, angle);
303 }
310 inline bool readServo1Angle(uint8_t& angle, const uint8_t ch)
311 {
312 return read_servo_angle(ch, 1, angle);
313 }
320 inline bool readServo0Pulse(uint16_t& pulse, const uint8_t ch)
321 {
322 return read_servo_pulse(ch, 0, pulse);
323 }
330 inline bool readServo1Pulse(uint16_t& pulse, const uint8_t ch)
331 {
332 return read_servo_pulse(ch, 1, pulse);
333 }
335
342 bool readFirmwareVersion(uint8_t& ver);
343
351 bool changeI2CAddress(const uint8_t addr);
352
353protected:
354 virtual std::shared_ptr<Adapter> ensure_adapter(const uint8_t ch) override;
355
356 bool write_digital(const uint8_t ch, const uint8_t index, const bool high);
357 bool read_digital(const uint8_t ch, const uint8_t index, bool& high);
358 bool write_analog(const uint8_t ch, const uint8_t index, const uint8_t val);
359 bool write_pwm(const uint8_t ch, const uint8_t index, const uint8_t val);
360 bool read_pwm(const uint8_t ch, const uint8_t index, uint8_t& val);
361 bool write_servo_angle(const uint8_t ch, const uint8_t index, const uint8_t angle);
362 bool read_servo_angle(const uint8_t ch, const uint8_t index, uint8_t& angle);
363 bool write_servo_pulse(const uint8_t ch, const uint8_t index, const uint16_t angle);
364 bool read_servo_pulse(const uint8_t ch, const uint8_t index, uint16_t& angle);
365
366 inline bool is_firmware_2_or_later() const
367 {
368 return (_ver != 0xFF) && (_ver >= 2);
369 }
370 inline bool is_pbhub() const
371 {
372 return (_ver != 0xFF) && (_ver == 0);
373 }
374 inline bool is_pbhub_v11() const
375 {
376 return (_ver != 0xFF) && _ver;
377 }
378
379private:
380 std::array<uint16_t, +MAX_CHANNEL> _numLED{74, 74, 74, 74, 74, 74};
381 uint8_t _ver{0xFF};
382};
383
384namespace pbhub {
385namespace command {
387constexpr uint8_t WRITE_DIGITAL_0_REG{0x00};
388constexpr uint8_t WRITE_DIGITAL_1_REG{0x01};
389
390constexpr uint8_t PWM_0_REG{0x02}; // v1.1
391constexpr uint8_t PWM_1_REG{0x03}; // v1.1
392constexpr uint8_t WRITE_ANALOG_0_REG{0x02};
393constexpr uint8_t WRITE_ANALOG_1_REG{0x03};
394
395constexpr uint8_t READ_DIGITAL_0_REG{0x04};
396constexpr uint8_t READ_DIGITAL_1_REG{0x05};
397constexpr uint8_t READ_ANALOG_0_REG{0x06};
398// reserved
399constexpr uint8_t LED_NUM_REG{0x08};
400constexpr uint8_t LED_COLOR_SINGLE_REG{0x09};
401constexpr uint8_t LED_COLOR_MORE_REG{0x0A};
402constexpr uint8_t LED_BRIGHTNESS_REG{0x0B};
403
404constexpr uint8_t SERVO_ANGLE_0_REG{0x0C}; // v1.1
405constexpr uint8_t SERVO_ANGLE_1_REG{0x0D}; // v1.1
406constexpr uint8_t SERVO_PULSE_0_REG{0x0E}; // v1.1
407constexpr uint8_t SERVO_PULSE_1_REG{0x0F}; // v1.1
408
409constexpr uint8_t LED_MODE_REG{0x0FA}; // v1.1 FW V2
410constexpr uint8_t FIRMWARE_VERSION_REG{0xFE}; // v1.1
411constexpr uint8_t I2C_ADDRESS_REG{0xFF}; // v1.1
413} // namespace command
414} // namespace pbhub
415
416} // namespace unit
417} // namespace m5
418#endif
bool readPWM0(uint8_t &pwm, const uint8_t ch)
Read PWN 0 from a specific channel.
Definition unit_PbHub.hpp:181
bool writeAnalog1(const uint8_t ch, const uint8_t val)
Write analog 1 to a specific channel.
Definition unit_PbHub.hpp:135
bool readLEDMode(pbhub::LEDMode &m)
Read the LED control mode.
Definition unit_PbHub.cpp:320
bool readDigital1(bool &high, const uint8_t ch)
Read digital 0 from a specific channel.
Definition unit_PbHub.hpp:110
bool writeLEDColor(const uint8_t ch, const uint16_t index, const uint32_t rgb888)
Write the LED color to a specific channel.
Definition unit_PbHub.cpp:264
bool readServo0Pulse(uint16_t &pulse, const uint8_t ch)
Read servo 0 pulse from a specific channel.
Definition unit_PbHub.hpp:320
bool readDigital0(bool &high, const uint8_t ch)
Read digital 0 from a specific channel.
Definition unit_PbHub.hpp:100
bool writeDigital0(const uint8_t ch, const bool high)
Write digital 0 to a specific channel.
Definition unit_PbHub.hpp:80
bool writeLEDCount(const uint8_t ch, const uint16_t num)
Write the number of the LED to a specific channel.
Definition unit_PbHub.cpp:249
bool readAnalog0(uint16_t &val, const uint8_t ch)
Read analog 0 from a specific channel.
Definition unit_PbHub.cpp:241
bool readFirmwareVersion(uint8_t &ver)
Read the firmware version.
Definition unit_PbHub.cpp:337
bool writeServo1Pulse(const uint8_t ch, const uint16_t pulse)
Write servo 1 pulse to a specific channel.
Definition unit_PbHub.hpp:290
uint8_t firmwareVersion() const
Get the firmware version.
Definition unit_PbHub.hpp:67
bool writeLEDBrightness(const uint8_t ch, const uint8_t value)
Write the LED brightness to a specific channel.
Definition unit_PbHub.cpp:305
bool writePWM0(const uint8_t ch, const uint8_t pwm)
Write PWN 0 to a specific channel.
Definition unit_PbHub.hpp:161
bool writePWM1(const uint8_t ch, const uint8_t pwm)
Write PWN 1 to a specific channel.
Definition unit_PbHub.hpp:171
bool readServo0Angle(uint8_t &angle, const uint8_t ch)
Read servo 0 angle from a specific channel.
Definition unit_PbHub.hpp:300
bool writeDigital1(const uint8_t ch, const bool high)
Write digital 1 to a specific channel.
Definition unit_PbHub.hpp:90
bool readPWM1(uint8_t &pwm, const uint8_t ch)
Read PWN 0 from a specific channel.
Definition unit_PbHub.hpp:191
bool readServo1Pulse(uint16_t &pulse, const uint8_t ch)
Read servo 1 pulse from a specific channel.
Definition unit_PbHub.hpp:330
bool writeLEDMode(const pbhub::LEDMode m)
Write the LED control mode.
Definition unit_PbHub.cpp:311
bool writeServo1Angle(const uint8_t ch, const uint8_t angle)
Write servo 1 angle to a specific channel.
Definition unit_PbHub.hpp:270
bool readServo1Angle(uint8_t &angle, const uint8_t ch)
Read servo 1 angle from a specific channel.
Definition unit_PbHub.hpp:310
bool writeAnalog0(const uint8_t ch, const uint8_t val)
Write analog 0 to a specific channel.
Definition unit_PbHub.hpp:125
bool writeServo0Angle(const uint8_t ch, const uint8_t angle)
Write servo 0 angle to a specific channel.
Definition unit_PbHub.hpp:260
bool fillLEDColor(const uint8_t ch, const uint32_t rgb888, const uint16_t first=0, const uint16_t count=0)
Fill the LED color to a specific channel.
Definition unit_PbHub.cpp:283
bool changeI2CAddress(const uint8_t addr)
Change device I2C address.
Definition unit_PbHub.cpp:343
bool writeServo0Pulse(const uint8_t ch, const uint16_t pulse)
Write servo 0 pulse to a specific channel.
Definition unit_PbHub.hpp:280
Top level namespace of M5stack.
namespace for PbHub
Unit-related namespace.
LEDMode
LED contol type.
Definition unit_PbHub.hpp:31
@ WS28xx
WS28xx, SK6812 (as default)
@ SK6822
SK6822, APA106.