A priori, c'est la version 1.4
J'ai copié/collé directement le code dispo sur le site sans aucune modification.
J'ai juste branché la sortie detection sur le GPIO14
J'avais auparavant essayé avec Railcom in class sur la pin 33 mais ça ne fonctionnait pas non plus.
Je me demandais comment pouvoir controler le signal qui sort de la carte
/*
Programme de lecture et de décodage des messages Railcom ©
qui retourne l'adresse d'un décodeur (adresse courte ou longue)
Fonctionne exclusivement sur ESP32
*/
#ifndef ARDUINO_ARCH_ESP32
#error "Select an ESP32 board"
#endif
#include <Arduino.h>
#define VERSION "v 1.4"
#define PROJECT "Railcom Detector ESP32 (freeRTOS)"
#define AUTHOR "christophe BOBILLE Locoduino : christophe.bobille@gmail.com"
#include <RingBuf.h> // https://github.com/Locoduino/RingBuffer
#define NB_ADDRESS_TO_COMPARE 100 // Nombre de valeurs à comparer pour obtenir l'adresse de la loco
RingBuf<uint16_t, NB_ADDRESS_TO_COMPARE> buffer;
TaskHandle_t ReceiveData;
TaskHandle_t ParseData;
// Identifiants des données du canal 1
#define CH1_ADR_LOW 4
#define CH1_ADR_HIGH 8
const byte railComRX = 14; // GPIO14 connecté à RailCom Detector RX
const byte railComTX = 12; // GPIO12 non utilisée mais doit être déclarée
// Queue
#define QUEUE_SIZE 10
QueueHandle_t xQueue;
void receiveData(void *pvParameters)
{
TickType_t xLastWakeTime;
xLastWakeTime = xTaskGetTickCount();
uint8_t compt{0};
uint8_t inByte{0};
for (;;)
{
while (Serial1.available() > 0)
{
if (compt == 0)
inByte = '\0';
else
inByte = (uint8_t)Serial1.read();
compt++;
if (compt == 3)
compt = 0;
xQueueSend(xQueue, &inByte, 0);
Serial.println(inByte);
}
// Serial.println("---------");
vTaskDelayUntil(&xLastWakeTime, pdMS_TO_TICKS(10)); // toutes les x ms
}
}
void parseData(void *pvParameters)
{
bool start{false};
byte inByte{0};
uint8_t rxArray[8]{0};
uint8_t rxArrayCnt{0};
byte dccAddr[2]{0};
int16_t address{0};
TickType_t xLastWakeTime;
xLastWakeTime = xTaskGetTickCount();
const byte decodeArray[] = {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 64, 255, 255, 255, 255, 255, 255, 255, 51, 255, 255, 255, 52,
255, 53, 54, 255, 255, 255, 255, 255, 255, 255, 255, 58, 255, 255, 255, 59, 255, 60, 55, 255, 255, 255, 255, 63, 255, 61, 56, 255, 255, 62,
57, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 36, 255, 255, 255, 35, 255, 34, 33, 255, 255, 255, 255, 31, 255, 30, 32, 255,
255, 29, 28, 255, 27, 255, 255, 255, 255, 255, 255, 25, 255, 24, 26, 255, 255, 23, 22, 255, 21, 255, 255, 255, 255, 37, 20, 255, 19, 255, 255,
255, 50, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 14, 255, 13, 12, 255, 255, 255, 255, 10, 255,
9, 11, 255, 255, 8, 7, 255, 6, 255, 255, 255, 255, 255, 255, 4, 255, 3, 5, 255, 255, 2, 1, 255, 0, 255, 255, 255, 255, 15, 16, 255, 17, 255, 255, 255,
18, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 43, 48, 255, 255, 42, 47, 255, 49, 255, 255, 255, 255, 41, 46, 255, 45, 255, 255,
255, 44, 255, 255, 255, 255, 255, 255, 255, 255, 66, 40, 255, 39, 255, 255, 255, 38, 255, 255, 255, 255, 255, 255, 255, 65, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255};
auto check_4_8_code = [&]() -> bool
{
if(decodeArray[inByte] < 255)
{
inByte = decodeArray[inByte];
return true;
}
return false;
};
auto printAdress = [&address]()
{
Serial.printf("Adresse loco : %d\n", address);
};
for (;;)
{
do
{
xQueueReceive(xQueue, &inByte, pdMS_TO_TICKS(100));
if (inByte == '\0')
start = true;
} while (! start);
start = false;
for (byte i = 0; i < 2; i++)
{
if (xQueueReceive(xQueue, &inByte, pdMS_TO_TICKS(100)) == pdPASS)
{
if (inByte > 0x0F && inByte < 0xF0)
{
if (check_4_8_code())
{
rxArray[rxArrayCnt] = inByte;
rxArrayCnt++;
}
}
}
}
if (rxArrayCnt == 2)
{
if (rxArray[0] & CH1_ADR_HIGH)
dccAddr[0] = rxArray[1] | (rxArray[0] << 6);
if (rxArray[0] & CH1_ADR_LOW)
dccAddr[1] = rxArray[1] | (rxArray[0] << 6);
address = (dccAddr[1] - 128) << 8;
if (address < 0)
address = dccAddr[0];
else
address += dccAddr[0];
uint16_t j = 0;
buffer.pop(j);
buffer.push(address);
bool test = true;
do
{
if (buffer[j] != address)
test = false;
j++;
} while (test && j <= buffer.size());
if (test && address > 0)
{
printAdress();
}
// else
// Serial.println("NOK");
}
rxArrayCnt = 0;
for (byte i = 0; i < 2; i++)
rxArray[i] = 0;
vTaskDelayUntil(&xLastWakeTime, pdMS_TO_TICKS(100)); // toutes les x ms
}
}
void setup()
{
Serial.begin(115200);
Serial.printf("\n\nProject : %s", PROJECT);
Serial.printf("\nVersion : %s", VERSION);
Serial.printf("\nAuthor : %s", AUTHOR);
Serial.printf("\nFichier : %s", __FILE__);
Serial.printf("\nCompiled : %s", __DATE__);
Serial.printf(" - %s\n\n", __TIME__);
Serial1.begin(250000, SERIAL_8N1, railComRX, railComTX); // Port série pour la réception des données (250k bauds)
uint16_t x = 0;
for (uint8_t i = 0; i < NB_ADDRESS_TO_COMPARE; i++) // On place des zéros dans le buffer de comparaison
buffer.push(x);
xQueue = xQueueCreate(QUEUE_SIZE, sizeof(uint8_t)); // Création de la file pour les échanges de data entre les 2 tâches
xTaskCreatePinnedToCore(receiveData, "ReceiveData", 2048, NULL, 10, NULL, 0); // Création de la tâches pour la réception
xTaskCreatePinnedToCore(parseData, "ParseData", 2048, NULL, 10, NULL, 1); // Création de la tâches pour le traitement
while (true)
;
}
void loop(){}
Tu reconnaiteras la carte
je ne m'en sers que comme branchement de la pin14, pour le reste (Can..) rien n'est activé dans le code