CAN ist working

This commit is contained in:
Marcel Peterkau 2022-02-04 21:28:49 +01:00
parent 1ace7a8d6a
commit d92818d4e5
4 changed files with 93 additions and 36 deletions

View File

@ -0,0 +1,43 @@
#include "can.h"
MCP_CAN CAN0(GPIO_CS_CAN);
void Init_CAN()
{
if (CAN0.begin(MCP_STDEXT, CAN_500KBPS, MCP_16MHZ) == CAN_OK)
Serial.println("MCP2515 Initialized Successfully!");
else
Serial.println("Error Initializing MCP2515...");
CAN0.init_Mask(0, 0, 0x07FF0000); // Init first mask...
CAN0.init_Mask(1, 0, 0x07FF0000); // Init second mask...
CAN0.init_Filt(0, 0, 0x012D0000); // Init first filter...
CAN0.setMode(MCP_NORMAL);
}
uint32_t Process_CAN_WheelSpeed()
{
#define FACTOR_RWP_KMH_890ADV 18 // Divider to convert Raw Data to km/h
can_frame canMsg;
static uint32_t lastRecTimestamp;
uint16_t RearWheelSpeed_raw;
if (CAN0.readMsgBuf(&canMsg.can_id, &canMsg.can_dlc, canMsg.data) == CAN_OK)
{
RearWheelSpeed_raw = (uint16_t)canMsg.data[5] << 8 | canMsg.data[6];
// raw / FACTOR_RWP_KMH_890ADV -> km/h * 100000 -> cm/h / 3600 -> cm/s
// raw * 500 -> cm/s
uint32_t RWP_millimeter_per_second = (((uint32_t)RearWheelSpeed_raw * 1000000) / FACTOR_RWP_KMH_890ADV ) / 3600;
uint32_t timesincelast = millis() - lastRecTimestamp;
lastRecTimestamp = millis();
uint32_t milimeters_to_add = (RWP_millimeter_per_second * timesincelast) / 1000;
return milimeters_to_add;
}
return 0;
}

View File

@ -0,0 +1,18 @@
#ifndef _CAN_H_
#define _CAN_H_
#include <Arduino.h>
#include <mcp_can.h>
#include <SPI.h>
#include "common.h"
struct can_frame {
uint32_t can_id;
uint8_t can_dlc;
uint8_t data[8] __attribute__((aligned(8)));
};
void Init_CAN();
uint32_t Process_CAN_WheelSpeed();
#endif

View File

@ -22,6 +22,15 @@ typedef enum SpeedSource_e
#endif
} SpeedSource_t;
const char SpeedSourceString[][8] = {
"Timer",
"Impuls",
"GPS",
#if PCB_REVISION >= 13
"CAN-Bus"
#endif
};
typedef enum GPSBaudRate_e
{
BAUD_9600,
@ -34,7 +43,7 @@ const char GPSBaudRateString[][7] = {
const size_t GPSBaudRateString_Elements = sizeof(GPSBaudRateString) / sizeof(GPSBaudRateString[0]);
#if PCB_REVISION == 13
#if PCB_REVISION >= 13
typedef enum CANSource_e
{
@ -47,15 +56,6 @@ const char CANSourceString[][28] = {
const char CANSourceString_Elements = sizeof(CANSourceString) / sizeof(CANSourceString[0]);
#endif
const char SpeedSourceString[][8] = {
"Timer",
"Impuls",
"GPS",
#if PCB_REVISION == 13
"CAN-Bus"
#endif
};
const size_t SpeedSourceString_Elements = sizeof(SpeedSourceString) / sizeof(SpeedSourceString[0]);
typedef struct
@ -68,10 +68,10 @@ typedef struct
typedef struct
{
uint32_t DistancePerLube_Default = 0;
uint32_t DistancePerLube_Rain = 0;
uint32_t DistancePerLube_Default = 8000;
uint32_t DistancePerLube_Rain = 4000;
uint32_t tankCapacity_ml = 320;
uint32_t amountPerDose_µl = 0;
uint32_t amountPerDose_µl = 72;
uint8_t TankRemindAtPercentage = 30;
uint8_t PulsePerRevolution = 1;
uint32_t TireWidth_mm = 150;

View File

@ -7,10 +7,6 @@
#include <RemoteDebug.h>
#include <FastLED.h>
#include <Ticker.h>
#if PCB_REVISION >= 13
#include <mcp_can.h>
#include <SPI.h>
#endif
#include "common.h"
#include "rmtdbghelp.h"
@ -18,6 +14,7 @@
#include "webui.h"
#include "config.h"
#include "globals.h"
#include "can.h"
#ifdef WIFI_CLIENT
#include <ESP8266WiFiMulti.h>
@ -29,10 +26,6 @@ const uint32_t connectTimeoutMs = 5000;
ESP8266WiFiMulti wifiMulti;
#endif
#if PCB_REVISION >= 13
MCP_CAN CAN0(GPIO_CS_CAN);
#endif
#ifdef DEBUG
const bool debug_flag = true;
#else
@ -102,30 +95,26 @@ void setup()
GetConfig_EEPROM();
GetPersistence_EEPROM();
#if PCB_REVISION >= 13
Init_CAN();
#endif
u8x8.begin();
u8x8.setFont(u8x8_font_chroma48medium8_r);
FastLED.addLeds<WS2811, GPIO_LED, GRB>(leds, 1); // GRB ordering is assumed
#if PCB_REVISION <= 13
pinMode(GPIO_TRIGGER, INPUT_PULLUP);
#endif
if (LubeConfig.SpeedSource == SOURCE_IMPULSE)
{
pinMode(GPIO_TRIGGER, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(GPIO_TRIGGER), trigger_ISR, FALLING);
}
pinMode(GPIO_BUTTON, INPUT_PULLUP);
pinMode(GPIO_PUMP, OUTPUT);
attachInterrupt(digitalPinToInterrupt(GPIO_TRIGGER), trigger_ISR, FALLING);
if (MDNS.begin(DeviceName))
MDNS.addService("telnet", "tcp", 23);
Debug.begin(DeviceName); // Initialize the WiFi server
Debug.setResetCmdEnabled(true); // Enable the reset command
Debug.showProfiler(true); // Profiler (Good to measure times, to optimize codes)
Debug.showColors(true); // Colors
Debug.begin(DeviceName);
Debug.setResetCmdEnabled(true);
Debug.showProfiler(false);
Debug.showColors(true);
Debug.setPassword(QUOTE(ADMIN_PASSWORD));
Debug.setSerialEnabled(true);
Debug.showDebugLevel(true);
@ -170,6 +159,10 @@ void setup()
u8x8.drawString(1, 1, "ChainLube Mk1");
u8x8.refreshDisplay();
#if PCB_REVISION >= 13
Init_CAN();
#endif
initWebUI();
UpdateWebUITicker.start();
Serial.println("Setup Done");
@ -184,13 +177,15 @@ void loop()
case SOURCE_IMPULSE:
wheelDistance = Process_Impulse_WheelSpeed();
break;
case SOURCE_CAN:
wheelDistance = Process_CAN_WheelSpeed();
break;
case SOURCE_TIME:
break;
}
RunLubeApp(wheelDistance);
UpdateWebUITicker.update();
Display_Process();
Button_Process();
LED_Process();
@ -524,7 +519,7 @@ void LED_Process(uint8_t override, CRGB SetColor)
void Display_Process()
{
u8x8.setCursor(0, 3);
u8x8.setCursor(0, 2);
uint32_t DistRemain = globals.systemStatus == sysStat_Normal ? LubeConfig.DistancePerLube_Default : LubeConfig.DistancePerLube_Rain;
DistRemain -= TravelDistance_highRes / 1000;
u8x8.printf("Mode: %10s\n", globals.systemStatustxt);
@ -533,6 +528,7 @@ void Display_Process()
u8x8.printf("WiFi: %10s\n", (WiFi.getMode() == WIFI_AP ? "AP" : WiFi.getMode() == WIFI_OFF ? "OFF"
: WiFi.getMode() == WIFI_STA ? "CLIENT"
: "UNKNOWN"));
u8x8.printf("Source: %8s\n", SpeedSourceString[LubeConfig.SpeedSource]);
u8x8.refreshDisplay();
}