7 Commits

5 changed files with 158 additions and 20 deletions

View File

@@ -25,9 +25,11 @@ void openPITmanually() {
void arenaLIGHT() {
if (switchLIGHT.on()) {
digitalWrite(LIGHT_PIN, LOW);
digitalWrite(LIGHT_PIN2, LOW);
}
else {
digitalWrite(LIGHT_PIN, HIGH);
digitalWrite(LIGHT_PIN2, HIGH);
}
}

View File

@@ -1,12 +1,18 @@
// ROFLS+ Arena Controller
#include <WiFi.h>
#include <esp_wifi.h> // Required for wifi_tx_info_t
#include <esp_now.h> // automatically installed for ESP32 boards, I think?
#include <Preferences.h> // automatically installed for ESP32 boards
#include <avdweb_Switch.h> // https://github.com/avdwebLibraries/avdweb_Switch
#include <CountDown.h> // https://github.com/RobTillaart/CountDown
#include <StopWatch.h> // https://github.com/RobTillaart/StopWatch_RT
// set Arena, switches the MAC addresses out
// 1 = Arena A (Ant)
// 2 = Arena B (Beetle)
#define ARENA 1
// Hardware connections
// Buttons:
#define START_BTN_PIN 1
@@ -25,7 +31,7 @@
// Relays:
#define PIT_RELEASE_PIN 37
#define LIGHT_PIN 39
#define UNUSED_RELAY3_PIN 35
#define LIGHT_PIN2 35
#define UNUSED_RELAY4_PIN 33
const byte relayOnState = LOW;
@@ -68,7 +74,7 @@ CountDown ReadyCountDown(CountDown::SECONDS);
// Rumble stopwatch
StopWatch rumbleTIME(StopWatch::SECONDS);
int CLOCK_LED_BRIGHTNESS = 32; // 64 is okay
int CLOCK_LED_BRIGHTNESS = 128; // 64 is okay
int BLINK_COUNTER_REDTEAM = 0;
int BLINK_COUNTER_BLUETEAM = 0;
@@ -83,7 +89,16 @@ bool resumeFight = false;
//------------------------------------------------------------------------------------
// ESP-NOW config
// send config, Clock:
uint8_t broadcastAddressClock[] = {0x48, 0x27, 0xE2, 0x5D, 0xB6, 0x84};
#if ARENA == 1
// A Arena
uint8_t broadcastAddressClock1[] = {0x48, 0x27, 0xE2, 0x5D, 0xB6, 0x84};
uint8_t broadcastAddressClock2[] = {0xD8, 0x3B, 0xDA, 0xC9, 0x49, 0xC6};
#elif ARENA == 2
// B Arena
uint8_t broadcastAddressClock1[] = {0xD8, 0x3B, 0xDA, 0xC9, 0x49, 0xC6};
uint8_t broadcastAddressClock2[] = {0xD8, 0x3B, 0xDA, 0xC8, 0xFF, 0xFA};
#endif
// struct for clock data
typedef struct struct_message_Clock {
int sendMinutes;
@@ -98,8 +113,15 @@ typedef struct struct_message_Clock {
struct_message_Clock sendClockDATA;
// send config, pilot buttons:
#if ARENA == 1
// A Arena
uint8_t broadcastAddressREDTEAMbutton[] = {0x84, 0xFC, 0xE6, 0xC7, 0x23, 0x14};
uint8_t broadcastAddressBLUETEAMbutton[] = {0x84, 0xFC, 0xE6, 0xC7, 0x1A, 0x02};
#elif ARENA == 2
// B Arena
uint8_t broadcastAddressREDTEAMbutton[] = {0xD8, 0x3B, 0xDA, 0xC8, 0x95, 0x58};
uint8_t broadcastAddressBLUETEAMbutton[] = {0xD8, 0x3B, 0xDA, 0xC8, 0x95, 0x1C};
#endif
// Structure for sending data
typedef struct struct_message_send {
@@ -111,7 +133,16 @@ struct_message_send sendToREDTEAMbutton;
struct_message_send sendToBLUETEAMbutton;
// ESP-Now stuff for the Pit controller
#if ARENA == 1
// A Arena
uint8_t broadcastAddressPitController[] = {0x84, 0xFC, 0xE6, 0xC7, 0x19, 0xDE};
#elif ARENA == 2
// B Arena
uint8_t broadcastAddressPitController[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xB0, 0x0B};
#endif
// Test Pit controller
//uint8_t broadcastAddressPitController[] = {0x94, 0xA9, 0x90, 0x0B, 0x21, 0x64};
// Structure for sending data
typedef struct struct_message_pit {
bool PIT; // LED state
@@ -122,7 +153,7 @@ esp_now_peer_info_t peerInfo;
// callback when data is sent
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
void OnDataSent(const wifi_tx_info_t *tx_info, esp_now_send_status_t status) {
Serial.print("\r\nLast Packet Send Status:\t");
Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}
@@ -202,8 +233,10 @@ void sendTimeDisplay(int MINUTES, int SECONDS, int RED, int GREEN, int BLUE, int
sendClockDATA.sendGREENchannel = GREEN;
sendClockDATA.sendBLUEchannel = BLUE;
sendClockDATA.sendBrightness = BRIGHTNESS;
// actually send it
esp_err_t result = esp_now_send(broadcastAddressClock, (uint8_t *) &sendClockDATA, sizeof(sendClockDATA));
// actually send it to first clock
esp_err_t result1 = esp_now_send(broadcastAddressClock1, (uint8_t *) &sendClockDATA, sizeof(sendClockDATA));
// actually send it to second clock
esp_err_t result2 = esp_now_send(broadcastAddressClock2, (uint8_t *) &sendClockDATA, sizeof(sendClockDATA));
}
}
@@ -234,13 +267,13 @@ void setup() {
digitalWrite(PIT_RELEASE_PIN, relayOffState);
pinMode(LIGHT_PIN, OUTPUT);
digitalWrite(LIGHT_PIN, LOW); // have it by default on, to prevent flickering, needs a better fix tho
pinMode(UNUSED_RELAY3_PIN, OUTPUT);
digitalWrite(UNUSED_RELAY3_PIN, relayOffState);
pinMode(LIGHT_PIN2, OUTPUT);
digitalWrite(LIGHT_PIN2, LOW); // have it by default on, to prevent flickering, needs a better fix tho
pinMode(UNUSED_RELAY4_PIN, OUTPUT);
digitalWrite(UNUSED_RELAY4_PIN, relayOffState);
// set status LED outputs:
pinMode(LIGHT_STATUS_LED, OUTPUT);
digitalWrite(LIGHT_PIN, HIGH); // have it by default on, to prevent flickering, needs a better fix tho
digitalWrite(LIGHT_STATUS_LED, HIGH);
pinMode(AUTOPIT_STATUS_LED, OUTPUT);
digitalWrite(AUTOPIT_STATUS_LED, LOW);
pinMode(MODE_STATUS_LED, OUTPUT);
@@ -260,17 +293,27 @@ void setup() {
// get the status of Transmitted packet
esp_now_register_send_cb(OnDataSent);
// Register clock peer
memcpy(peerInfo.peer_addr, broadcastAddressClock, 6);
// Register first clock peer
memcpy(peerInfo.peer_addr, broadcastAddressClock1, 6);
peerInfo.channel = 0;
peerInfo.encrypt = false;
// Add peer
if (esp_now_add_peer(&peerInfo) != ESP_OK){
Serial.println("Failed to add peer");
Serial.println("Failed to add Clock1 peer");
return;
}
esp_err_t result = esp_now_send(broadcastAddressClock, (uint8_t *) &sendClockDATA, sizeof(sendClockDATA));
// 2) Register second clock peer
memcpy(peerInfo.peer_addr, broadcastAddressClock2, 6);
// peerInfo.channel & peerInfo.encrypt already set above
if (esp_now_add_peer(&peerInfo) != ESP_OK) {
Serial.println("Failed to add Clock2 peer");
return;
}
// send initial data (I think that doesn't work but meh...)
esp_err_t result1 = esp_now_send(broadcastAddressClock1, (uint8_t *) &sendClockDATA, sizeof(sendClockDATA));
esp_err_t result2 = esp_now_send(broadcastAddressClock2, (uint8_t *) &sendClockDATA, sizeof(sendClockDATA));
// Register Red Team Button peer
memcpy(peerInfo.peer_addr, broadcastAddressREDTEAMbutton, 6);

View File

@@ -4,6 +4,7 @@
// 48:27:E2:50:86:84
#include <WiFi.h>
#include <esp_wifi.h> // Required for wifi_tx_info_t
#include <esp_now.h> // automatically installed for ESP32 boards, I think?
#include <Preferences.h> // automatically installed for ESP32 boards
#include <FastLED.h> // https://fastled.io/
@@ -58,7 +59,7 @@ void setup() {
//FastLED.addLeds<WS2811Controller800Khz, LED_DATA_PIN_TIMER, GRB>(leds_TIMER, NUM_LEDS_TIMER); // GRB ordering is typical
FastLED.addLeds<WS2812B, LED_DATA_PIN_TIMER, GRB>(leds_TIMER, NUM_LEDS_TIMER); // GRB ordering is typical
//FastLED.setMaxRefreshRate(10, true);
FastLED.setMaxPowerInVoltsAndMilliamps(5,2000); // Limit to 10W of output power
FastLED.setMaxPowerInVoltsAndMilliamps(5,4000); // Limit to 20W of output power
// set default values
// default screen, just to show it's up and running but hasn't received any data, should display 00:00 in blue

View File

@@ -1,6 +1,7 @@
// ROFLS+ Referee Remote
#include <WiFi.h>
#include <esp_wifi.h> // Required for wifi_tx_info_t
#include <esp_now.h> // automatically installed for ESP32 boards, I think?
#include <Preferences.h> // automatically installed for ESP32 boards
#include <avdweb_Switch.h> // https://github.com/avdwebLibraries/avdweb_Switch
@@ -12,7 +13,12 @@
// 1 = Red Team Button
// 2 = Blue Team Button
const bool writeBoardID = false;
int boardID = 0;
int boardID = 1;
// set Arena, switches the MAC addresses out
// 1 = Arena A (Ant)
// 2 = Arena B (Beetle)
#define ARENA 1
// Hardware connections
#define START_BTN_PIN 10
@@ -45,7 +51,13 @@ bool sendDATAvar = false;
// ESP-NOW config
// REPLACE WITH YOUR RECEIVER MAC Address
#if ARENA == 1
// A Arena Controller MAC Address
uint8_t broadcastAddress[] = {0x84, 0xFC, 0xE6, 0xC7, 0x1A, 0x8C};
#elif ARENA == 2
// B Arena Controller MAC Address
uint8_t broadcastAddress[] = {0xD8, 0x3B, 0xDA, 0xC9, 0x0C, 0xEE};
#endif
// Structure example to send data
// Must match the receiver structure
@@ -79,7 +91,7 @@ esp_now_peer_info_t peerInfo;
Preferences preferences;
// callback when data is sent
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
void OnDataSent(const wifi_tx_info_t *tx_info, esp_now_send_status_t status) {
Serial.print("\r\nLast Packet Send Status:\t");
Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}

80
Reference_Manual.md Normal file
View File

@@ -0,0 +1,80 @@
# ROFLS Arena Reference Manual
### Before a fight/tournament (omit step 1-6 after initial setup):
1. Check all connections
2. Power on the PSU
3. Turn on the Teambuttons and the Referee Remote
4. Wait for the 7 Segment Clock to turn on (~2s)
5. Turn on the lights (if off and needed)
6. Open the Controller Box and set the brightness with the potentiometer on the top right
7. Select the mode (explanations for the modes, see below):
8. Press and Hold Reset for >1s, can be on the Controller itself or the Referee Remote
9. Arena is ready
### Start a normal fight:
1. for good measure: Press and Hold Reset for >1s, can be on the Controller itself or the Referee Remote.
2. Team Red and Team Blue need to (short) press their respective Teambuttons, the Clock turns green to signal that both are ready.
3. Press Start, if the Teambuttons are not working, the Start button can be long pressed (>1s), to force a start.
4. To prevent the automatic pit opening, press and hold the Pit button, as soon as the pit button gets released, the pit will open.
### Start a rumble fight:
1. for good measure: Press and Hold Reset for >1s, can be on the Controller itself or the Referee Remote.
2. Press Start
3. To prevent the automatic pit opening, press and hold the Pit button, as soon as the pit button gets released, the pit will open.
### Pausing a running fight:
1. Press the Pause button
2. To resume:
- normal fight:
Both Teams need to press their respective Teambuttons to signal that they are both ready.
- Press start, after 3s, the timer resumes.
- rumble fight:
- Press start, after 3s, the stop watch resumes.
## Modes
* Normal Mode:
* Normal fight mode, 3 Minute Timer, Tapout enabled, after 90s (halftime) automatic pit opening (if enabled)
* Teambuttons are active and need to be pressed once to sign that they are ready. They light up if ready.
* Teambuttons LEDs turn of when the fight starts
* During a running fight, if one of the Teambuttons is pressed >1s, it counts as a tapout. The Timer stops and displays "TAPOUT", cycles between "TAPOUT" and the end time.
* Can be paused, resuming works the same as starting, Teams must be ready
* Rumble Mode:
* Rumble mode, stop watch counting up, Tapout disabled, after 90s automatic pit opening (if enabled)
* Match starts 3s after pressing start
* Teambuttons are inactive
* Teambutton LEDs Light up 3s before the match begins, and turn off when it starts.
* No Tapout available
* Can be paused, resuming works the same as starting, Teams must be ready
## Buttons explained
> The 4 buttons on the referee remote and the controller box have the same function and can both be used.
* Start
* Starts a fight, can be long pressed (>1s) to force start a fight
* Pause
* Pauses a fight
* Pit
* Short press (<1s) immediately opens the pit, Long press (>1s) prevents the pit from automatically open, but opens immediately after released
* Reset
* Resets the Arena Controller, needs to be long pressed (>1s)
* Lights Switch
* Turns on/off the Arena Lights, lights up if lights are on.
* Auto Pit Switch
* Turn on/off the automatic pit opening, lights up if enabled
* Mode Switch
* R = Rumble mode
* N = Normal mode
* T = Self Test (not implemented yet)
## Display Colours & Status explained
| Colour | Meaning |
|--------|---------|
| Blue with one purple segment, displaying 00:00 | not initialized (hit reset to fix) |
| Purple, displaying 03:00 | Normal Mode, Idle/Arena Ready |
| Green | Normal Mode, Both Teams Ready/Running Fight |
| Yellow | 3s Ready Countdown or Paused |
| Yellow, initally blinking 3 times | Timer run out / finish |
| Red, cycling between tap, out and time | Red Team has tapped out |
| Blue, cycling between tap, out and time | Blue Team has tapped out |
| Teal, displaying 00:00 | Rumble mode, Idle/Arena Ready |
| Teal, displaying timer | Rumble mode, active fight |