-
Notifications
You must be signed in to change notification settings - Fork 60
/
receiver.ino
93 lines (73 loc) · 2 KB
/
receiver.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <SPI.h>
#include <nRF24L01.h>
#include "RF24.h"
#include "VescUart.h"
struct vescValues {
float ampHours;
float inpVoltage;
long rpm;
long tachometerAbs;
};
RF24 radio(9, 10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
bool recievedData = false;
uint32_t lastTimeReceived = 0;
int motorSpeed = 127;
int timeoutMax = 500;
int speedPin = 5;
struct bldcMeasure measuredValues;
struct vescValues data;
unsigned long lastDataCheck;
void setup() {
SERIALIO.begin(115200);
radio.begin();
radio.enableAckPayload();
radio.enableDynamicPayloads();
radio.openReadingPipe(1, pipe);
radio.startListening();
pinMode(speedPin, OUTPUT);
analogWrite(speedPin, motorSpeed);
}
void loop() {
getVescData();
// If transmission is available
if (radio.available())
{
// The next time a transmission is received on pipe, the data in gotByte will be sent back in the acknowledgement (this could later be changed to data from VESC!)
radio.writeAckPayload(pipe, &data, sizeof(data));
// Read the actual message
radio.read(&motorSpeed, sizeof(motorSpeed));
recievedData = true;
}
if (recievedData == true)
{
// A speed is received from the transmitter (remote).
lastTimeReceived = millis();
recievedData = false;
// Write the PWM signal to the ESC (0-255).
analogWrite(speedPin, motorSpeed);
}
else if ((millis() - lastTimeReceived) > timeoutMax)
{
// No speed is received within the timeout limit.
motorSpeed = 127;
analogWrite(speedPin, motorSpeed);
}
}
void getVescData() {
if (millis() - lastDataCheck >= 250) {
lastDataCheck = millis();
// Only transmit what we need
if (VescUartGetValue(measuredValues)) {
data.ampHours = measuredValues.ampHours;
data.inpVoltage = measuredValues.inpVoltage;
data.rpm = measuredValues.rpm;
data.tachometerAbs = measuredValues.tachometerAbs;
} else {
data.ampHours = 0.0;
data.inpVoltage = 0.0;
data.rpm = 0;
data.tachometerAbs = 0;
}
}
}