728x90
방치해 뒀던 변속 아두이노 글을 이번에 다시 작성하면서 느낀 건데, 오래되니깐 진짜 내가 뭘 했는지 기억이 안 난다..
앞으로는 웬만하면 바로바로 기록으로 남겨야겠음..
목표
자작차에 들어가는 ECU EMU BLACK의 캔 버스에서 데이터 로깅하기
현재 상황
아두이노 우노 R4 : 무작위 CAN 메시지 생성용
ESP32 + 캔 통신 모듈: 생성된 캔 메시지 로깅, 로깅된 무작위 값 파이어베이스로 전송
파이어베이스: ESP32로부터 받은 CAN 데이터 WEB UI로 표시
와이어링
무작위 CAN DATA 송신용 아두이노 우노 R4 WiFi
사진
CAN 데이터 수신 테스트용 ESP 32
사진
코드
무작위 CAN DATA 송신용 아두이노 우노 R4 WiFi
#include <SPI.h>
#include <mcp_can.h>
const int SPI_CS_PIN = 10;
MCP_CAN CAN(SPI_CS_PIN);
void setup() {
Serial.begin(115200);
while (CAN_OK != CAN.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ)) {
Serial.println("CAN 초기화 실패");
delay(100);
}
CAN.setMode(MCP_NORMAL);
Serial.println("CAN 초기화 완료");
randomSeed(analogRead(0));
}
void loop() {
// 무작위 센서 값 생성
int rpm = random(800, 8500); // 2 bytes
int map = random(20, 255); // 2 bytes
byte tps = random(0, 101); // 1 byte (0~100%)
byte clt = random(60, 120); // 1 byte (60~120°C)
byte iat = random(10, 70); // 1 byte (흡입온도)
byte battRaw = random(120, 150); // 1 byte (12.0~15.0V → battRaw=120~150)
float batt = battRaw / 10.0; // 디버깅용
// CAN 데이터 구성
const long canId = 0x600;
byte data[8];
data[0] = (rpm >> 8) & 0xFF;
data[1] = rpm & 0xFF;
data[2] = tps;
data[3] = (map >> 8) & 0xFF;
data[4] = map & 0xFF;
data[5] = iat;
data[6] = clt;
data[7] = battRaw;
// 전송
byte sndStat = CAN.sendMsgBuf(canId, 0, 8, data);
if (sndStat == CAN_OK) {
Serial.print("송신 성공 (ID 0x600) | RPM: ");
Serial.print(rpm);
Serial.print(" | TPS: ");
Serial.print(tps);
Serial.print("% | MAP: ");
Serial.print(map);
Serial.print(" | CLT: ");
Serial.print(clt);
Serial.print(" | IAT: ");
Serial.print(iat);
Serial.print(" | Batt: ");
Serial.print(batt, 1);
Serial.println("V");
} else {
Serial.println("송신 실패");
}
delay(1000);
}CAN 데이터 수신 테스트용 ESP32
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <SPI.h>
#include <mcp_can.h>
#include <EMUcan.h>
// ===== WiFi 설정 =====
const char* WIFI_SSID = ""; //와이파이 SSID
const char* WIFI_PASSWORD = ""; //와이파이 비번
// ===== Firebase 설정 =====
const String FIREBASE_HOST = "";
const String FIREBASE_PATH = "/logs";
const String FIREBASE_SECRET = ""; // DB 비공개 상태일 경우 필요
// ===== CAN 설정 =====
#define SPI_CS_PIN 5
#define CAN_INT_PIN 4
MCP_CAN CAN(SPI_CS_PIN);
EMUcan emu;
void setup() {
Serial.begin(115200);
delay(1000);
// Wi-Fi 연결
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("WiFi 연결 중");
while (WiFi.status() != WL_CONNECTED) {
delay(500); Serial.print(".");
}
Serial.println(" 연결 완료");
// CAN 초기화
if (CAN.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) != CAN_OK) {
Serial.println("CAN 초기화 실패"); while (1);
}
CAN.setMode(MCP_NORMAL);
pinMode(CAN_INT_PIN, INPUT);
Serial.println("시스템 초기화 완료");
}
void loop() {
if (digitalRead(CAN_INT_PIN) == LOW) {
long unsigned int id; byte len, buf[8];
CAN.readMsgBuf(&id, &len, buf);
// 수신된 CAN 메시지 출력 (파싱 전 원시 출력)
Serial.print("RAW CAN ID: 0x");
Serial.print(id, HEX);
Serial.print(" Payload: ");
for (byte i = 0; i < len; i++) {
if (buf[i] < 0x10) Serial.print("0");
Serial.print(buf[i], HEX); Serial.print(" ");
}
Serial.println();
// EMUcan 파싱
emu.checkEMUcan(id, len, buf);
// 파싱된 측정값 출력
int rpm = emu.emu_data.RPM;
int tps = emu.emu_data.TPS;
int clt = emu.emu_data.CLT;
int map = emu.emu_data.MAP;
float batt = emu.emu_data.Batt / 10.0;
Serial.printf("EMU Data - RPM: %d, TPS: %d, CLT: %d, MAP: %d, Batt: %.1fV\n", rpm, tps, clt, map, batt);
// Firebase 업로드
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String url = FIREBASE_HOST + FIREBASE_PATH + "/" + String(millis()) + ".json?auth=" + FIREBASE_SECRET;
StaticJsonDocument<256> doc;
doc["rpm"] = rpm;
doc["tps"] = tps;
doc["clt"] = clt;
doc["map"] = map;
doc["batt"] = batt;
String jsonStr;
serializeJson(doc, jsonStr);
http.begin(url);
http.addHeader("Content-Type", "application/json");
int httpResponseCode = http.PUT(jsonStr);
if (httpResponseCode > 0) {
Serial.println("Firebase 업로드 성공");
} else {
Serial.print("Firebase 업로드 실패: ");
Serial.println(http.errorToString(httpResponseCode));
Serial.print("HTTP 응답 코드: ");
Serial.println(httpResponseCode);
}
http.end();
} else {
Serial.println("WiFi 연결 안 됨");
}
}
delay(50); // 속도 조절
}동작사진

해결할 일


1. EMU 소프트웨어에서도 CAN BUS를 인식 못 함
2. 오실로로 EMU CAN L, H 찍어보면 미러파가 안 나옴
3. 스로틀 밸브를 열어보면 그건 또 소프트웨어 상에 잡힘 (대체 왜???)
일단은 대체 뭐가 문제인지 모르겠어서 전체 배선부터 완료한 뒤에 다시 시도해 볼 듯
-끗-
5.25

ADU->ESP32 로깅은 되는 듯하다.
지금 걍 EMU 커넥터 쪽에 문제가 있거나
EMU 내부에 문제가 있는 듯?
728x90
'.study > .FSK_25' 카테고리의 다른 글
| 마지막 변속 테스트(LED) (0) | 2025.06.26 |
|---|---|
| [작업일지] 공압식 변속 제어 아두이노 제작 - 2 (0) | 2025.05.31 |
| [작업일지] 변속배선 만들기 (진행 중) (0) | 2025.03.08 |
| [작업일지] 전체 배선도 그리기 (완료) (0) | 2025.03.08 |
| [작업일지]BreakOut PCB기반 시동용 배선 그리기 (완료) (0) | 2025.03.04 |