Добавить в корзинуПозвонить
Найти в Дзене

Эмулятор селектора передач для Nissan Juke на Arduino

В этой статье я расскажу, как сделать эмулятор селектора автоматической коробки передач для Nissan Juke на базе Arduino или HAL(Cube32Ide). Устройство подключается к CAN-шине автомобиля и может имитировать сигналы селектора, что полезно для создания кастомных решений, таких как замена вариатора на автоматическую коробку. Также тут есть печатная плата и корпус для этого проекта. Здесь код для Cube32Ide и вся информация для сборки. Также на этой платформе вы можете быстро запустить любой другой свой проект требующий работы с кан шиной и аналоговыми входами, нужно лишь написать свою логику работы. Оригинальный селектор передач отправляет по CAN-шине сообщения с ID 0x421, которые содержат информацию о текущем положении. Печатная плата нашего устройства выглядит так, либо вы можете собрать на ардуино. Без корпуса никакое устройство нельзя назвать законченным, поэтому корпус в комплекте. Arduino PinMCP251510 (CS)CS11 (MOSI)SI12 (MISO)SO13 (SCK)SCK Программа реализует ту же логику, что и ор
Оглавление

В этой статье я расскажу, как сделать эмулятор селектора автоматической коробки передач для Nissan Juke на базе Arduino или HAL(Cube32Ide). Устройство подключается к CAN-шине автомобиля и может имитировать сигналы селектора, что полезно для создания кастомных решений, таких как замена вариатора на автоматическую коробку. Также тут есть печатная плата и корпус для этого проекта. Здесь код для Cube32Ide и вся информация для сборки. Также на этой платформе вы можете быстро запустить любой другой свой проект требующий работы с кан шиной и аналоговыми входами, нужно лишь написать свою логику работы.

Как это работает?

Оригинальный селектор передач отправляет по CAN-шине сообщения с ID 0x421, которые содержат информацию о текущем положении. Печатная плата нашего устройства выглядит так, либо вы можете собрать на ардуино.

Без корпуса никакое устройство нельзя назвать законченным, поэтому корпус в комплекте.

-2

  1. Считывает состояние входных пинов
  2. Формирует правильное значение байта состояния
  3. Отправлять CAN-сообщение каждые 50 мс

Компоненты для сборки на ардуинке

  • Arduino (Uno/Nano)
  • CAN-модуль SIT1040 (TJA1050, MCP2515)
  • Провода для подключения
  • Источник питания 5V

Схема подключения

Arduino PinMCP251510 (CS)CS11 (MOSI)SI12 (MISO)SO13 (SCK)SCK

Логика работы

Программа реализует ту же логику, что и оригинальный проект на STM32 (плата и корпус тут):

  • Формирует байт состояния из битов 3,4,5 (значения 0x08, 0x10, 0x20)
  • Обрабатывает специальные режимы: если активен пин A6 - отправляет 0x30, если A4 - 0x18
  • Сохраняет последнее валидное состояние
  • Отправляет данные каждые 50 мс (как в оригинале для Juke)

Установка и настройка

  1. Подключите MCP2515 к Arduino согласно таблице
  2. Подключите тактовые кнопки или переключатели к указанным пинам
  3. Загрузите скетч в Arduino
  4. Подключите CAN-H и CAN-L к шине автомобиля
  5. Проверьте монитор порта для отладки

Отладка

В коде предусмотрен вывод отладочной информации в Serial:

  • Отправляемые данные
  • Состояние всех входных пинов
  • Ошибки отправки

Модификации

При необходимости можно легко адаптировать код под другие модели Nissan, изменив:

  • ID сообщения (TARGET_ID)
  • DLC (длину данных)
  • Индекс модифицируемого байта
  • Период отправки

Заключение

Этот проект демонстрирует, как можно эмулировать работу CAN-устройства на Arduino. Полный код доступен в статье. Подписывайтесь, чтобы не пропустить новые проекты по автомобильной электронике!

Внимание: Работы с CAN-шиной автомобиля требуют осторожности. Неправильное подключение может повредить электронику. Все манипуляции выполняйте на свой страх и риск.

ARDUINO код

/*
* Эмулятор селектора передач для Nissan Juke
* Версия для Arduino
*
* Подключается к CAN-шине автомобиля через TJA1050
* Отслеживает состояние пинов A2, A3, A5, A4, A6
* и отправляет соответствующие CAN-сообщения с ID 0x421
*/
#include <SPI.h>
#include <mcp_can.h>
// Настройки CAN
#define CAN_ID 0x421
#define CAN_SPEED CAN_500KBPS
// Настройки таймера (период отправки 50 мс)
#define TX_INTERVAL 50
// Пины для MCP2515 (стандартное подключение для Arduino Uno/Nano)
#define SPI_CS_PIN 10
// Пины для чтения состояния селектора
#define PIN_PA2 A2 // Бит 3 (0x08)
#define PIN_PA3 A3 // Бит 4 (0x10)
#define PIN_PA5 A5 // Бит 5 (0x20)
#define PIN_PA4 A4 // Специальный режим 0x18
#define PIN_PA6 A6 // Специальный режим 0x30
// Создаем объект CAN
MCP_CAN CAN(SPI_CS_PIN);
// Переменная для хранения последнего отправленного значения
volatile uint8_t last_sent_byte = 0;
unsigned long lastTxTime = 0;
// Функция подсчета установленных битов
uint8_t count_bits(uint8_t byte) {
uint8_t count = 0;
while (byte) {
count += byte & 1;
byte >>= 1;
}
return count;
}
void setup() {
Serial.begin(115200);
Serial.println("Nissan Juke Selector Emulator starting...");
// Настройка пинов как входов с подтяжкой к GND
pinMode(PIN_PA2, INPUT_PULLDOWN);
pinMode(PIN_PA3, INPUT_PULLDOWN);
pinMode(PIN_PA5, INPUT_PULLDOWN);
pinMode(PIN_PA4, INPUT_PULLDOWN);
pinMode(PIN_PA6, INPUT_PULLDOWN);
// Инициализация CAN
if (CAN.begin(CAN_SPEED) == CAN_OK) {
Serial.println("CAN initialized successfully");
} else {
Serial.println("CAN initialization FAILED!");
while (1) {
delay(100);
Serial.print(".");
}
}
// Настройка маски и фильтров (необязательно, так как мы только передаем)
// Можно настроить прием, если нужно
Serial.println("Ready to transmit");
}
void loop() {
// Проверяем, не пора ли отправить сообщение
if (millis() - lastTxTime >= TX_INTERVAL) {
sendCanMessage();
lastTxTime = millis();
}
}
void sendCanMessage() {
uint8_t data[3] = {0, 0, 0}; // DLC = 3 для Juke
uint8_t current_byte = 0;
// Чтение состояния входов согласно оригинальной логике
current_byte |= digitalRead(PIN_PA2) << 3; // Бит 3 (0x08)
current_byte |= digitalRead(PIN_PA3) << 4; // Бит 4 (0x10)
current_byte |= digitalRead(PIN_PA5) << 5; // Бит 5 (0x20)
// Специальные режимы (приоритетные)
if (digitalRead(PIN_PA6)) {
current_byte = 0x30; // Режим 0x30
}
if (digitalRead(PIN_PA4)) {
current_byte = 0x18; // Режим 0x18
}
// Проверка валидности состояния
if ((current_byte != 0 && count_bits(current_byte) == 1) ||
(current_byte == 0x18) || (current_byte == 0x30)) {
last_sent_byte = current_byte;
}
// Формируем данные
data[0] = last_sent_byte; // Модифицируемый байт (индекс 0 для Juke)
// Отправка CAN сообщения
byte sndStat = CAN.sendMsgBuf(CAN_ID, 0, 3, data);
if (sndStat == CAN_OK) {
// Отладочный вывод
Serial.print("Sent: ID=0x");
Serial.print(CAN_ID, HEX);
Serial.print(" Data=0x");
Serial.print(data[0], HEX);
Serial.print(" (Raw pins: A2=");
Serial.print(digitalRead(PIN_PA2));
Serial.print(" A3=");
Serial.print(digitalRead(PIN_PA3));
Serial.print(" A5=");
Serial.print(digitalRead(PIN_PA5));
Serial.print(" A4=");
Serial.print(digitalRead(PIN_PA4));
Serial.print(" A6=");
Serial.print(digitalRead(PIN_PA6));
Serial.println(")");
} else {
Serial.println("Error sending CAN message");
}
}