M5Unit-HUB 0.3.1 git rev:3cfc07a
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
58 explicit UnitPbHub(const uint8_t addr = DEFAULT_ADDRESS);
59 virtual ~UnitPbHub() = default;
60
63 virtual bool begin() override;
64
71 inline uint8_t firmwareVersion() const
72 {
73 return _ver;
74 }
75
78
84 inline bool writeDigital0(const uint8_t ch, const bool high)
85 {
86 return write_digital(ch, 0, high);
87 }
94 inline bool writeDigital1(const uint8_t ch, const bool high)
95 {
96 return write_digital(ch, 1, high);
97 }
104 inline bool readDigital0(bool& high, const uint8_t ch)
105 {
106 return read_digital(ch, 0, high);
107 }
114 inline bool readDigital1(bool& high, const uint8_t ch)
115 {
116 return read_digital(ch, 1, high);
117 }
119
123
129 inline bool writeAnalog0(const uint8_t ch, const uint8_t val)
130 {
131 return write_analog(ch, 0, val);
132 }
139 inline bool writeAnalog1(const uint8_t ch, const uint8_t val)
140 {
141 return write_analog(ch, 1, val);
142 }
144
147
153 bool readAnalog0(uint16_t& val, const uint8_t ch);
155
159
165 inline bool writePWM0(const uint8_t ch, const uint8_t pwm)
166 {
167 return write_pwm(ch, 0, pwm);
168 }
175 inline bool writePWM1(const uint8_t ch, const uint8_t pwm)
176 {
177 return write_pwm(ch, 1, pwm);
178 }
185 inline bool readPWM0(uint8_t& pwm, const uint8_t ch)
186 {
187 return read_pwm(ch, 0, pwm);
188 }
195 inline bool readPWM1(uint8_t& pwm, const uint8_t ch)
196 {
197 return read_pwm(ch, 1, pwm);
198 }
200
204
211 bool writeLEDCount(const uint8_t ch, const uint16_t num);
219 bool writeLEDColor(const uint8_t ch, const uint16_t index, const uint32_t rgb888);
228 bool fillLEDColor(const uint8_t ch, const uint32_t rgb888, const uint16_t first = 0, const uint16_t count = 0);
235 bool writeLEDBrightness(const uint8_t ch, const uint8_t value);
243 bool writeLEDMode(const pbhub::LEDMode m);
252
258
264 inline bool writeServo0Angle(const uint8_t ch, const uint8_t angle)
265 {
266 return write_servo_angle(ch, 0, angle);
267 }
274 inline bool writeServo1Angle(const uint8_t ch, const uint8_t angle)
275 {
276 return write_servo_angle(ch, 1, angle);
277 }
284 inline bool writeServo0Pulse(const uint8_t ch, const uint16_t pulse)
285 {
286 return write_servo_pulse(ch, 0, pulse);
287 }
294 inline bool writeServo1Pulse(const uint8_t ch, const uint16_t pulse)
295 {
296 return write_servo_pulse(ch, 1, pulse);
297 }
304 inline bool readServo0Angle(uint8_t& angle, const uint8_t ch)
305 {
306 return read_servo_angle(ch, 0, angle);
307 }
314 inline bool readServo1Angle(uint8_t& angle, const uint8_t ch)
315 {
316 return read_servo_angle(ch, 1, angle);
317 }
324 inline bool readServo0Pulse(uint16_t& pulse, const uint8_t ch)
325 {
326 return read_servo_pulse(ch, 0, pulse);
327 }
334 inline bool readServo1Pulse(uint16_t& pulse, const uint8_t ch)
335 {
336 return read_servo_pulse(ch, 1, pulse);
337 }
339
346 bool readFirmwareVersion(uint8_t& ver);
347
355 bool changeI2CAddress(const uint8_t addr);
356
357protected:
358 virtual std::shared_ptr<Adapter> ensure_adapter(const uint8_t ch) override;
359
360 bool write_digital(const uint8_t ch, const uint8_t index, const bool high);
361 bool read_digital(const uint8_t ch, const uint8_t index, bool& high);
362 bool write_analog(const uint8_t ch, const uint8_t index, const uint8_t val);
363 bool write_pwm(const uint8_t ch, const uint8_t index, const uint8_t val);
364 bool read_pwm(const uint8_t ch, const uint8_t index, uint8_t& val);
365 bool write_servo_angle(const uint8_t ch, const uint8_t index, const uint8_t angle);
366 bool read_servo_angle(const uint8_t ch, const uint8_t index, uint8_t& angle);
367 bool write_servo_pulse(const uint8_t ch, const uint8_t index, const uint16_t pulse);
368 bool read_servo_pulse(const uint8_t ch, const uint8_t index, uint16_t& pulse);
369 void wait_led_output(const uint16_t num_leds) const;
370
371 inline bool is_firmware_2_or_later() const
372 {
373 return (_ver != 0xFF) && (_ver >= 2);
374 }
375 inline bool is_pbhub() const
376 {
377 return (_ver != 0xFF) && (_ver == 0);
378 }
379 inline bool is_pbhub_v11() const
380 {
381 return (_ver != 0xFF) && _ver;
382 }
383
384private:
385 std::array<uint16_t, +MAX_CHANNEL> _numLED{74, 74, 74, 74, 74, 74};
386 uint8_t _ver{0xFF};
387};
388
389namespace pbhub {
390namespace command {
392constexpr uint8_t WRITE_DIGITAL_0_REG{0x00};
393constexpr uint8_t WRITE_DIGITAL_1_REG{0x01};
394
395constexpr uint8_t PWM_0_REG{0x02}; // v1.1
396constexpr uint8_t PWM_1_REG{0x03}; // v1.1
397constexpr uint8_t WRITE_ANALOG_0_REG{0x02};
398constexpr uint8_t WRITE_ANALOG_1_REG{0x03};
399
400constexpr uint8_t READ_DIGITAL_0_REG{0x04};
401constexpr uint8_t READ_DIGITAL_1_REG{0x05};
402constexpr uint8_t READ_ANALOG_0_REG{0x06};
403// reserved
404constexpr uint8_t LED_NUM_REG{0x08};
405constexpr uint8_t LED_COLOR_SINGLE_REG{0x09};
406constexpr uint8_t LED_COLOR_MORE_REG{0x0A};
407constexpr uint8_t LED_BRIGHTNESS_REG{0x0B};
408
409constexpr uint8_t SERVO_ANGLE_0_REG{0x0C}; // v1.1
410constexpr uint8_t SERVO_ANGLE_1_REG{0x0D}; // v1.1
411constexpr uint8_t SERVO_PULSE_0_REG{0x0E}; // v1.1
412constexpr uint8_t SERVO_PULSE_1_REG{0x0F}; // v1.1
413
414constexpr uint8_t LED_MODE_REG{0xFA}; // v1.1 FW V2
415constexpr uint8_t FIRMWARE_VERSION_REG{0xFE}; // v1.1
416constexpr uint8_t I2C_ADDRESS_REG{0xFF}; // v1.1
418} // namespace command
419} // namespace pbhub
420
421} // namespace unit
422} // namespace m5
423#endif
bool readPWM0(uint8_t &pwm, const uint8_t ch)
Read PWM 0 from a specific channel.
Definition unit_PbHub.hpp:185
bool writeAnalog1(const uint8_t ch, const uint8_t val)
Write analog 1 to a specific channel.
Definition unit_PbHub.hpp:139
UnitPbHub(const uint8_t addr=DEFAULT_ADDRESS)
Constructor.
Definition unit_PbHub.cpp:473
bool readLEDMode(pbhub::LEDMode &m)
Read the LED control mode.
Definition unit_PbHub.cpp:612
bool readDigital1(bool &high, const uint8_t ch)
Read digital 1 from a specific channel.
Definition unit_PbHub.hpp:114
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:541
bool readServo0Pulse(uint16_t &pulse, const uint8_t ch)
Read servo 0 pulse from a specific channel.
Definition unit_PbHub.hpp:324
bool readDigital0(bool &high, const uint8_t ch)
Read digital 0 from a specific channel.
Definition unit_PbHub.hpp:104
bool writeDigital0(const uint8_t ch, const bool high)
Write digital 0 to a specific channel.
Definition unit_PbHub.hpp:84
virtual bool begin() override
Begin communication and detect hardware version.
Definition unit_PbHub.cpp:481
bool writeLEDCount(const uint8_t ch, const uint16_t num)
Write the number of the LED to a specific channel.
Definition unit_PbHub.cpp:523
bool readAnalog0(uint16_t &val, const uint8_t ch)
Read analog 0 from a specific channel.
Definition unit_PbHub.cpp:515
bool readFirmwareVersion(uint8_t &ver)
Read the firmware version.
Definition unit_PbHub.cpp:633
bool writeServo1Pulse(const uint8_t ch, const uint16_t pulse)
Write servo 1 pulse to a specific channel.
Definition unit_PbHub.hpp:294
uint8_t firmwareVersion() const
Get the firmware version.
Definition unit_PbHub.hpp:71
bool writeLEDBrightness(const uint8_t ch, const uint8_t value)
Write the LED brightness to a specific channel.
Definition unit_PbHub.cpp:597
bool writePWM0(const uint8_t ch, const uint8_t pwm)
Write PWM 0 to a specific channel.
Definition unit_PbHub.hpp:165
bool writePWM1(const uint8_t ch, const uint8_t pwm)
Write PWM 1 to a specific channel.
Definition unit_PbHub.hpp:175
bool readServo0Angle(uint8_t &angle, const uint8_t ch)
Read servo 0 angle from a specific channel.
Definition unit_PbHub.hpp:304
bool writeDigital1(const uint8_t ch, const bool high)
Write digital 1 to a specific channel.
Definition unit_PbHub.hpp:94
bool readPWM1(uint8_t &pwm, const uint8_t ch)
Read PWM 1 from a specific channel.
Definition unit_PbHub.hpp:195
bool readServo1Pulse(uint16_t &pulse, const uint8_t ch)
Read servo 1 pulse from a specific channel.
Definition unit_PbHub.hpp:334
bool writeLEDMode(const pbhub::LEDMode m)
Write the LED control mode.
Definition unit_PbHub.cpp:603
static constexpr uint8_t MAX_CHANNEL
Maximum number of channels.
Definition unit_PbHub.hpp:53
bool writeServo1Angle(const uint8_t ch, const uint8_t angle)
Write servo 1 angle to a specific channel.
Definition unit_PbHub.hpp:274
static constexpr uint8_t MAX_LED_COUNT
Maximum number of LEDs per channel.
Definition unit_PbHub.hpp:54
bool readServo1Angle(uint8_t &angle, const uint8_t ch)
Read servo 1 angle from a specific channel.
Definition unit_PbHub.hpp:314
bool writeAnalog0(const uint8_t ch, const uint8_t val)
Write analog 0 to a specific channel.
Definition unit_PbHub.hpp:129
bool writeServo0Angle(const uint8_t ch, const uint8_t angle)
Write servo 0 angle to a specific channel.
Definition unit_PbHub.hpp:264
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:567
bool changeI2CAddress(const uint8_t addr)
Change device I2C address.
Definition unit_PbHub.cpp:639
bool writeServo0Pulse(const uint8_t ch, const uint16_t pulse)
Write servo 0 pulse to a specific channel.
Definition unit_PbHub.hpp:284
Top level namespace of M5Stack.
namespace for PbHub
Unit-related namespace.
LEDMode
LED control type.
Definition unit_PbHub.hpp:31
@ WS28xx
WS28xx, SK6812 (as default)
@ SK6822
SK6822, APA106.