MatrixMiniR4 1.1.5
Matrix Mini R4 Arduino Library API Documentation
Loading...
Searching...
No Matches
MiniR4MxCtrlExt.cpp
Go to the documentation of this file.
1
6#include "MiniR4MxCtrlExt.h"
7
8
10 i2cMUXSelect();
11
12 i2cWriteData(MC_REG_TIMEOUT, 0); // disable timeout
13
14 i2cWriteData(MC_REG_MOTOR_MODE, 0x05); // reset motor
15 i2cWriteData(MC_REG_MOTOR_MODE+10, 0x05);
16 i2cWriteData(MC_REG_MOTOR_MODE+20, 0x05);
17 i2cWriteData(MC_REG_MOTOR_MODE+30, 0x05);
18
19 i2cWriteData(MC_REG_SERVO_ENABLE, 0x0F); // enable servo
20
21 i2cWriteData(MC_REG_SERVO_SPEED, 0x0); //set serve speed to fastest
22 i2cWriteData(MC_REG_SERVO_SPEED+2, 0x0);
23 i2cWriteData(MC_REG_SERVO_SPEED+4, 0x0);
24 i2cWriteData(MC_REG_SERVO_SPEED+6, 0x0);
25}
26
27void MatrixController::motorSet(uint8_t motor_ch, uint8_t speed){
28 i2cMUXSelect();
29
30 motorMode(motor_ch, MODE_BRAKE);
31 uint8_t addr = MC_REG_MOTOR_SPEED + (motor_ch-1) * MC_REG_MOTOR_OFFSET;
32
33 i2cWriteData(addr, speed);
34 i2cWriteData(addr, speed);
35}
36
37void MatrixController::motorRound(uint8_t motor_ch, float round){
38 i2cMUXSelect();
39 motorSet(motor_ch, 0);
40
41 motorMode(motor_ch, MODE_POSITION);
42
43 uint8_t addr = MC_REG_MOTOR_TARGET + (motor_ch-1) * MC_REG_MOTOR_OFFSET;
44 uint32_t target = motorPosition(motor_ch) + round * 756;
45 uint32_t data;
46 int shift;
47
48 i2cWriteData(addr+4, 100);
49
50 for(int i=0; i<4; i++){
51 shift = 24 - (i*8);
52 data = target >> shift;
53 i2cWriteData(addr+i, data);
54 target = target - (data << shift);
55 }
56
57}
58
59
60void MatrixController::motorInvert(uint8_t motor_ch, bool invert){
61 if(invert){
62 switch (motor_ch)
63 {
64 case 1:
65 _invert1 = 0x10;
66 break;
67 case 2:
68 _invert2 = 0x10;
69 break;
70 case 3:
71 _invert3 = 0x10;
72 break;
73 case 4:
74 _invert4 = 0x10;
75 break;
76 default:
77 break;
78 }
79 }
80 else{
81 switch (motor_ch)
82 {
83 case 1:
84 _invert1 = 0;
85 break;
86 case 2:
87 _invert2 = 0;
88 break;
89 case 3:
90 _invert3 = 0;
91 break;
92 case 4:
93 _invert4 = 0;
94 break;
95 default:
96 break;
97 }
98 }
99}
100
101void MatrixController::servoSet(uint8_t servo_ch, uint8_t angle){
102 i2cMUXSelect();
103
104 if(angle > 180){
105 angle = 250;
106 }
107 else{
108 angle = round(float(angle)*1.388);
109 }
110 uint8_t addr = MC_REG_SERVO_TARGET + (servo_ch-1) * MC_REG_SERVO_OFFSET;
111
112 i2cWriteData(addr, angle);
113 i2cWriteData(addr, angle);
114}
115
117 return (i2cReadData(MC_REG_BATTERY, 1) * 0.04);
118}
119
120void MatrixController::motorMode(uint8_t motor_ch, uint8_t mode){
121 if(mode){
122 switch (motor_ch)
123 {
124 case 1:
125 i2cWriteData(MC_REG_MOTOR_MODE, _invert1 + 0x01);
126 break;
127 case 2:
128 i2cWriteData(MC_REG_MOTOR_MODE + 10, _invert2 + 0x01);
129 break;
130 case 3:
131 i2cWriteData(MC_REG_MOTOR_MODE + 20, _invert3 + 0x01);
132 break;
133 case 4:
134 i2cWriteData(MC_REG_MOTOR_MODE + 30, _invert4 + 0x01);
135 break;
136 default:
137 break;
138 }
139 }
140 else{
141 switch (motor_ch)
142 {
143 case 1:
144 i2cWriteData(MC_REG_MOTOR_MODE, _invert1 + 0x03);
145 break;
146 case 2:
147 i2cWriteData(MC_REG_MOTOR_MODE + 10, _invert2 + 0x03);
148 break;
149 case 3:
150 i2cWriteData(MC_REG_MOTOR_MODE + 20, _invert3 + 0x03);
151 break;
152 case 4:
153 i2cWriteData(MC_REG_MOTOR_MODE + 30, _invert4 + 0x03);
154 break;
155 default:
156 break;
157 }
158 }
159}
160
161uint32_t MatrixController::motorPosition(uint8_t motor_ch){
162 uint8_t addr = MC_REG_MOTOR_POS + (motor_ch-1) * MC_REG_MOTOR_OFFSET;
163 return i2cReadData(addr, 4); // 28ppr * 27:1 = 756 / r
164}
165
166void MatrixController::i2cMUXSelect(){
167 if (_ch < 0) return; // no MUX
168 _pWire->beginTransmission(ADDR_PCA954X);
169 _pWire->write((1 << _ch));
170 _pWire->endTransmission(1);
171 delayMicroseconds(300);
172}
173
174void MatrixController::i2cWriteData(uint8_t reg, uint8_t data){
175
176 _pWire->beginTransmission(MatrixCtrl_ADDR);
177
178 _pWire->write(reg);
179 _pWire->write(data);
180
181 _pWire->endTransmission(1);
182}
183
184uint32_t MatrixController::i2cReadData(int reg, int num){
185
186 _pWire->beginTransmission(MatrixCtrl_ADDR);
187 _pWire->write(reg);
188 _pWire->endTransmission(1);
189
190 delay(1);
191
192 _pWire->requestFrom(MatrixCtrl_ADDR, num);
193
194 delay(1);
195
196 uint32_t dataBuf = 0;
197
198 int i = 0;
199
200 while (_pWire->available() && i<num){
201 dataBuf = dataBuf << 8;
202 dataBuf += _pWire->read();
203 i++;
204 }
205 return dataBuf;
206}
Handling Matrix Controller (HT) functions.
#define MC_REG_SERVO_ENABLE
#define MC_REG_MOTOR_SPEED
#define MODE_BRAKE
#define MC_REG_MOTOR_MODE
#define MatrixCtrl_ADDR
#define ADDR_PCA954X
#define MC_REG_MOTOR_POS
#define MC_REG_BATTERY
#define MC_REG_SERVO_OFFSET
#define MC_REG_TIMEOUT
#define MODE_POSITION
#define MC_REG_SERVO_TARGET
#define MC_REG_MOTOR_TARGET
#define MC_REG_MOTOR_OFFSET
#define MC_REG_SERVO_SPEED
void motorRound(uint8_t motor_ch, float round)
Moves the specified motor a certain number of rounds.
void begin()
Initializes the MatrixController.
void motorSet(uint8_t motor_ch, uint8_t speed)
Sets the speed of the specified motor.
float getBattery()
Gets the current battery status.
void motorInvert(uint8_t motor_ch, bool invert)
Inverts the direction of the specified motor.
void servoSet(uint8_t servo_ch, uint8_t angle)
Sets the angle of the specified servo.