Вложений: 6
Автоматическое переключение на камеру заднего хода.
Данное решение предназначено , для мониторов не имеющих автоматического переключения на камеру заднего хода .
При сборке главное не перепутать полярность диода, иначе контроллер умрет.
Код для Carduino nano v.3 (Arduino, Freeduino)
PHP код:
int av_mode = 13; //Выход для нажатии кнопки
int back_on = 12; //вход сигнал включения задней скорости
void setup()
{
pinMode(av_mode, OUTPUT);
pinMode(back_on, INPUT);
digitalWrite(back_on, HIGH); //Подключить внутренний подтягивающий резистор
digitalWrite(av_mode, LOW);
Serial.begin(115200);
}
//-----------------------------------------------
void loop()
{
if (digitalRead(back_on) == HIGH) //проверить включен ли задний ход
{
button_on(); //превое нажатие
button_on(); //второе нажатие
while(digitalRead(back_on) == HIGH)
{
// тупо зацикливаем пока не выключится задний ход
}
delay(500); //ЗДЕСЬ МОЖНО СДЕЛАТЬ ЗАДЕРЖКУ ВЫКЛЮЧНИЯ КАМЕРЫ ЗХ
button_on(); // нажатие кнопки для возврата монитора в режим PC
}
}
//-----------------------------------------------
void button_on()
{
digitalWrite(av_mode, HIGH); // нажать кнопку
delay(200); //длительность нажатия кнопки
digitalWrite(av_mode, LOW); // отпустить кнопку
delay(200); //длительность между нажатиями кнопки
}
Re: Автоматическое переключение на камеру заднего хода.
Можно также сделать переключатель на камеру З.Х. для ноутбуков .
Re: Автоматическое переключение на камеру заднего хода.
Я предложу свой вариант. Еще сырой. но идея развивается. Мой код работает на прерываниях и без задержек в теле программы. При одновременной обработке нескольких задач это критично.
Сейчас программка работает с енкодером для регулировки громкости и переключает монитор. Дальше можно добавлять все что надо. У меня будет включать/выключать bluetooth gps, энкодер будет рулить основными параметрами звука (громкость, баланс, фадер), мониторить температуру за бортом и в салоне, может еще что придумаю. Часть функций будут отрабатывать напрямую исполнительными устройствами, а часть будет заведена на комп (например температура).
Еще раз подчеркну - код не оптимальный совсем. Сегодня только начал писать.
PHP код:
#include <MsTimer2.h>
#define BACKINPUTPIN 2 // Вход включения задней передачи
#define BACKOUTPUTPIN 13 // Выход на кнопку монитора
#define TIMEOUTBACKON 20 // Задержка ожидания на включение камеры для устранения дребезга контактов и ложных срабатывания при включении передачи (у меня автоматическая коробка)
#define ENCODERPIN1 4 // Вход энкодера 1
#define ENCODERPIN2 5 // Вход энкодера 2
// центральный вход энкодера на массу
int state, prevstate = 0, count = 0, backstate = LOW, current_backstate = LOW;
int set_flag_control_state_back = 0;
int command_run = 0, set_command = 0;
int time_massive13[5] = {0,0,0,0,0};
int stat_massive13[5] = {0,0,0,0,0};
int pos_massive13 = 0;
int nextEncoderState[4] = { 2, 0, 3, 1 };
int prevEncoderState[4] = { 1, 3, 0, 2 };
void setup()
{
pinMode(BACKINPUTPIN, INPUT);
pinMode(ENCODERPIN1, INPUT);
pinMode(ENCODERPIN2, INPUT);
digitalWrite(BACKINPUTPIN, HIGH);
digitalWrite(ENCODERPIN1, HIGH);
digitalWrite(ENCODERPIN2, HIGH);
Serial.begin(9600);
pinMode(BACKOUTPUTPIN, OUTPUT);
digitalWrite(BACKOUTPUTPIN, LOW);
current_backstate = digitalRead(BACKINPUTPIN);
backstate = digitalRead(BACKINPUTPIN);
MsTimer2::set(100, flash); // 100ms period
MsTimer2::start();
}
void loop()
{
if(change_state_back())
{
set_flag_control_state_back = TIMEOUTBACKON; // взвели флаг контроля для устранения дребезга
set_command = 1;
}
state = (digitalRead(ENCODERPIN2) << 1) | digitalRead(ENCODERPIN1);
if (state != prevstate) {
if (state == nextEncoderState[prevstate]) {
count++;
} else if (state == prevEncoderState[prevstate]) {
count--;
}
Serial.println(count, DEC);
prevstate = state;
}
}
void flash() {
if(pos_massive13)
{
if(time_massive13[pos_massive13-1]--)
{
return;
}
digitalWrite(BACKOUTPUTPIN, stat_massive13[pos_massive13-1]);
pos_massive13++;
if(!time_massive13[pos_massive13-1])
{
pos_massive13 = 0;
return;
}
}
else if(set_flag_control_state_back)
{
if(!--set_flag_control_state_back)
{
if(current_backstate != backstate)
{
current_backstate = backstate;
if(backstate)
{
stat_massive13[0] = 1; // команда "один раз зажечь на 0.2с и потушить.
time_massive13[0] = 2;
stat_massive13[1] = 0;
time_massive13[1] = 2;
time_massive13[2] = 0;
pos_massive13 = 1;
}
else
{
stat_massive13[0] = 1; // команда "два раза зажечь на 0.2с и потушить.
time_massive13[0] = 2;
stat_massive13[1] = 0;
time_massive13[1] = 2;
stat_massive13[2] = 1;
time_massive13[2] = 2;
stat_massive13[3] = 0;
time_massive13[3] = 2;
time_massive13[4] = 0;
pos_massive13 = 1;
}
}
}
}
return;
}
int change_state_back()
{
if(backstate != digitalRead(BACKINPUTPIN))
{
backstate = digitalRead(BACKINPUTPIN);
return 1;
}
return 0;
}
Re: Автоматическое переключение на камеру заднего хода.
Жалко для задней скорости прерывание использовать, для нее не требуется моментальной реакции(мкс), а внешних прерываний всего 2 и из них одно уже выделено под энкодер.
Re: Автоматическое переключение на камеру заднего хода.
Цитата:
Сообщение от
Chip
Жалко для задней скорости прерывание использовать, для нее не требуется моментальной реакции(мкс), а внешних прерываний всего 2 и из них одно уже выделено под энкодер.
В настоящий момент задействовано только таймерное прерывание. Энкодер по опросу работает. Я тоже не вижу смысла под периферию юзать прерывания. Может только под что-то критическое?
Re: Автоматическое переключение на камеру заднего хода.
а если деть больше некуда, то не все ли равно? :)
Re: Автоматическое переключение на камеру заднего хода.
Цитата:
Сообщение от
(vS)
а если деть больше некуда, то не все ли равно? :)
В том то и проблема , что прерываний как всегда не хватает :)
Re: Автоматическое переключение на камеру заднего хода.
Цитата:
Сообщение от
vab3
В настоящий момент задействовано только таймерное прерывание. Энкодер по опросу работает. Я тоже не вижу смысла под периферию юзать прерывания. Может только под что-то критическое?
Извини сразу код не глянул.
Re: Автоматическое переключение на камеру заднего хода.
У меня коробка автомат и мне нужен алгоритм переключения на камеру ЗХ с задержками, т.е. при коротком импльсе ничего не происходит, при длинном импульсевыдается сигнал на моник, который и переключает на камеру ЗХ. Хотел реализовать на кардуине, но чего-то не получается =(
вот код.
PHP код:
int av_mode = 13; //Выход для нажатии кнопки
int back_on = 12; //вход сигнал включения задней скорости
void setup()
{
pinMode(av_mode, OUTPUT);
pinMode(back_on, INPUT);
digitalWrite(back_on, HIGH); //Подключить внутренний подтягивающий резистор
digitalWrite(av_mode, LOW);
Serial.begin(115200);
}
//-----------------------------------------------
void loop()
{
if (digitalRead(back_on) == HIGH) //проверить включен ли задний ход
{
button_on(); //превое нажатие
while(digitalRead(back_on) == HIGH)
{
// тупо зацикливаем пока не выключится задний ход
}
delay(500); //ЗДЕСЬ МОЖНО СДЕЛАТЬ ЗАДЕРЖКУ ВЫКЛЮЧНИЯ КАМЕРЫ ЗХ
button_off(); // нажатие кнопки для возврата монитора в режим PC
}
}
//-----------------------------------------------
void button_on()
{
digitalWrite(av_mode, HIGH); // нажать кнопку
}
void button_off()
{
digitalWrite(av_mode, LOW); // отпустить кнопку
}
к VIN и gnd поключил +12 и -12В соответственно от компьютерного блока питания, к D13 и к gnd подключил мильтимитр. Включаю комповый БП, мильтиметр показывает 0В. Все правильно. На D12 подаю +12В от VIN (тупо на него замыкаю) Начинают дико грется контроллер. Убираю 12В с D12 мильтиметр скачет на 1.5в, а потом опять показывает ноль. Где моя ошибка?
Re: Автоматическое переключение на камеру заднего хода.
Диод правильно подключил?