Номерация включённой передачи МКПП на Ардуино

Видимо у вас не было двухколёсный техники. Замок зажигания и зажигание на мопеде это разные вещи. Там ключ, а там прерыватель/коммутатор.

а где оно не так? :slight_smile:

видно товарищ boom - пешеход, для него это тождественно. :wink:

Скорее не ездил на мопеде :wink:

Ошибаетесь.

А в чем суть обратки от оборотов? Если экономить топливо, то обычно переключаюсь от 2,5 до 3х тыс, вплоть до 6й, но если выкручиваю, то от 6 до 7 тыс, соответственно скорость выше между переключениями, получается диапазоны оборотов разные.

Вот это рабочий вариант, хотя и довольно сложный для начинающего.

Суть оборотов двигателя и знание скорости движения может косвенно дать знание какая передача включена и иметь хоть какую обратную связь. Ведь на мопеде нет датчика передач.

Есть еще одна обратная связь- от датчика разряжения. Например, зажигание Шкильменского. Насколько помню, в нем задействован такой датчик.

Вот не знаю, зачем оно только нужно? Сколько ездил(правда было 4 скорости) , даже и мысли не пришло, что неплохо-бы такую индикацию иметь

Для регулировки угла опережения зажигания. Например на старых лодочных только за счет этого обороты управлялись, только вручную, без процессора.

Да нет, я про индикацию включённой передачи, то что ТС делает

У меня 2ю выбивает после 3000 об. Ремонтировать коробку пока нет возможности, т.к. з/ч нет, вот и решил выйти из ситуации с помощью индикации, ну и хотел как-то реализовать ардуино на моте.

Все равно мот зимует и есть время разобраться.

Приветствую. Почитал про считывание показаний датчика скорости и оборотов и понял, что слишком сложно. Решил пока сделать просто индикатор передач. Переделал ваш код на включение передачи, только после отпускания кнопки и повторного нажатия(а то индикация проскальзывала при зажатии кнопки), но при этом столкнулся с проблемой последнего условия, задающего диапазон. При нажатии на кнопку UP_G на 6й передаче, она гаснет и не загорается при повторных нажатиях, только когда нажму DOWN_G, тогда загорается 5я передача, как можно сохранить условия, которые вы написали изначально - при превышении значения переменной Peredacha, всё равно загорается крайняя передача 1я и 6я.

#define ST1  4
#define ST6  9
#define DOWN_G  12
#define UP_G  11
int Peredacha = 4; 
boolean butt_flag = 0;
boolean butt_flag1 = 0;
boolean butt;
boolean butt1;

void setup() 
{
	pinMode(ST1, OUTPUT);
	pinMode(5, OUTPUT);
	pinMode(6, OUTPUT);
	pinMode(7, OUTPUT);
	pinMode(8, OUTPUT);
	pinMode(ST6, OUTPUT);
	pinMode(DOWN_G, INPUT_PULLUP);
	pinMode(UP_G, INPUT_PULLUP);
	digitalWrite(ST1, 0);
	digitalWrite(5, 1);
	digitalWrite(6, 1);
	digitalWrite(7, 1);
	digitalWrite(8, 1);
	digitalWrite(ST6, 1);
	
}

void loop() 
{
	butt = digitalRead(11);
	if (butt == 1 && butt_flag == 0){butt_flag = 1;}
	if(butt == 0 && butt_flag == 1){butt_flag = 0;
		digitalWrite(Peredacha, !butt_flag);	
		Peredacha=	Peredacha + !digitalRead(UP_G);
		Peredacha=	Peredacha - !digitalRead(DOWN_G);
		digitalWrite(Peredacha, butt_flag);
	}
	butt1 = digitalRead(12);
	if (butt1 == 1 && butt_flag1 == 0){butt_flag1 = 1;}
	if(butt1 == 0 && butt_flag1 == 1) 
		{butt_flag1 = 0;	
			digitalWrite(Peredacha, !butt_flag1);	
			Peredacha=	Peredacha + !digitalRead(UP_G);
			Peredacha=	Peredacha - !digitalRead(DOWN_G);
			digitalWrite(Peredacha, butt_flag1);
	}
	if(Peredacha <ST1){Peredacha=ST1 + butt_flag;}
	else if(Peredacha >ST6){Peredacha=ST6;}
}

Задачу решайте по кусочкам . Сделайте отдельную функцию управления светодиодами передач. И скармливайте ее либо + либо - (0 или 1). Работу функции проверьте хоть даже скармливая ей значения через терминал . Как это нормально заработает - Дальше разбирайтесь с блоком программы определения что произошло + или - передач . (Можно как вариант пока библиотекой для кнопок воспользоваться например титановый велосипед ) Потом соедините эти два блока.

1 лайк

Давай по порядку.
Вот, что это в условии написано? "Если номер передачи меньше 1, то …??? передача равна 1 + флаг. ?
Зачем ты его прибавляешь к номеру передачи? Ведь тебе нужно просто ограничить индикацию чтобы она не уходила в не нужный диапазон…

А чтобы код заработал, необходимо было всего то организовать “триггер” на кнопки". То есть проверка по нажатию . Например такое

if (digitalRead(buttonPin) == LOW) { // Если кнопка нажата (состояние LOW)
    delay(50); // Небольшая задержка для устранения дребезга контактов
    
    while(digitalRead(buttonPin) == LOW) {} // Ждем отпускания кнопки

Четкий алгоритм тут можно сделать такой: считаем число оборотов двигателя N на (10) оборотов колеса, и для каждой передачи будет оно своё, по нему определяем Номер передачи.

Если N< n1 P=1,
иначе если N <n2 P=2 и тп.

Будет работать 100% и надежно.
Условия перехода сделать “посредине” чтобы четко отделялись передачи одна от другой, ну это уже нюансы. На нейтрали конечно будет врать, а может удастся условие подобрать, но вряд ли надежно.

При отладке выводить это число на дисплей и записать его для каждой передачи, потом в программе поставить границы переключение посередине. А может не посередине, а в границах, а если не попадает то типа нейтраль. Ну это уже можно поиграться условиями.

Стоим на месте с включенной передачей и выжатым сцеплением. Как будем определять номер передачи?

Никак, разумеется. Нейтраль пусть кажет.
Ну и на месте какбы 3ю передачу включать не правильно, например.