-
Вложений: 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: Автоматическое переключение на камеру заднего хода.
Диод правильно подключил?
-
Re: Автоматическое переключение на камеру заднего хода.
Цитата:
Сообщение от
Chip
Диод правильно подключил?
диод не поключал. А зачем я же знаю что я туда подаю =) Я пока тренируюсь на столе.
-
Re: Автоматическое переключение на камеру заднего хода.
Ну наверно потому что я не просто так его нарисовал.
На вход Ардуино нельзя подавать больше чем 5в, иначе ему придет смерть
-
Re: Автоматическое переключение на камеру заднего хода.
Цитата:
Сообщение от
Chip
Ну наверно потому что я не просто так его нарисовал.
На вход Ардуино нельзя подавать больше чем 5в, иначе ему придет смерть
FR603 подойдет?
-
Re: Автоматическое переключение на камеру заднего хода.
Зачем такой мощный, достаточно любой аналог КД521
-
Re: Автоматическое переключение на камеру заднего хода.
Что-то не работает эта схема. Диод КД521 подключен анодом к D12 порту, как на схеме.
В начальный момент напряжение на катоде 0 В, на аноде около 0,63 В. Подаю на катод 12 В, на аноде опять 0,63 В. Соответственно Ардуиновский код не работает. В чем может быть дело?
-
Re: Автоматическое переключение на камеру заднего хода.
А лампочку имитируешь? Через спираль лампочки вход подтягивается к земле
-
Re: Автоматическое переключение на камеру заднего хода.
как то плохо у меня с электроникой =( Понять не могу. Использую комповый блок для имитации 12В. Мерим напряжение на БП - 11.50В. Подключаем диод КД521, на выходе 11.40В в обратном направлении 0.13В - ну это почти ноль. И как быть если к ардуине можно только 5В максимум подать?
-
Re: Автоматическое переключение на камеру заднего хода.
Поставлю вопрос по другому. Сигнал на задний ход у меня приходит -12В (ну на колодке от стоковой магнитолы так, грех не воспользоватся =) Скетч уже отладил. Для тестов брал -5В (землю). Как мне из -12В сделать -5В.
Код, кому интересно:
PHP код:
int av_mode = 13; //Выход для нажатии кнопки
int back_on = 12; //вход сигнал включения задней скорости
int cam_status = 0; //Первоначально камера выключена
byte temp;
unsigned long time_low_cam = 0;
unsigned long time_high_cam = 0;
void setup()
{
pinMode(av_mode, OUTPUT);
pinMode(back_on, INPUT);
digitalWrite(back_on, HIGH);
digitalWrite(av_mode, LOW);
Serial.begin(115200);
}
//-----------------------------------------------
void loop()
{
cam();
}
//-----------------------------------------------
void cam()
{
temp=digitalRead(back_on);
if ( temp==LOW && digitalRead(av_mode)==LOW)
{
if ( time_high_cam == 0 )
{
time_high_cam = millis();
}
else
{
if ((millis()-time_high_cam)>2000)
{
//Serial.println("Hide");
digitalWrite(av_mode, HIGH);
time_low_cam = 0;
time_high_cam = 0;
}
}
}
if ( temp==HIGH && digitalRead(av_mode)==HIGH)
{
if ( time_low_cam == 0 )
{
time_low_cam = millis();
}
else
{
if ((millis()-time_low_cam)>7000)
{
//Serial.println("Low");
digitalWrite(av_mode, LOW);
time_low_cam = 0;
time_high_cam = 0;
}
}
}
if ( temp==LOW && digitalRead(av_mode)==HIGH)
{
//Это режи когда камера была включена, переход на D а потом снова R
//т.е. в этом режиме камера не должна выключатся
time_low_cam = 0;
time_high_cam = 0;
}
if ( temp==HIGH && digitalRead(av_mode)==LOW)
{
//Это режи когда камера НЕ была включена, переход на D а потом снова R
//т.е. в этом режиме камера не должна ВКЛЮЧАТСЯ
time_low_cam = 0;
time_high_cam = 0;
}
}
-
Re: Автоматическое переключение на камеру заднего хода.
-12 быть не может, может быть 0, а 0, он хоть 220, он ноль...
более интересно, что на этом проводе, когда НЕ задняя передача?
-
Re: Автоматическое переключение на камеру заднего хода.
Цитата:
Сообщение от
(vS)
-12 быть не может, может быть 0, а 0, он хоть 220, он ноль...
более интересно, что на этом проводе, когда НЕ задняя передача?
в полне может быть, мерил сам. Когда задняя не включена там ничего нет.
-
Re: Автоматическое переключение на камеру заднего хода.
мерил относительно земли?
мерить ВСЕГДА в машине нужно относительно корпуса...
если ни чего нет... звони на корпус, т.е. сопротивление смотри.
в принцыпе, если там реально ни чего нет, то на пине включает подтяжку, или снаружи ставишь резистор 10К вверх, в смысле на +5в, и через 100ом подаешь прям на проц свой сигнал. можно диодами вверх/вниз задушить броски возможные.
-
Re: Автоматическое переключение на камеру заднего хода.
Цитата:
Сообщение от
(vS)
мерил относительно земли?
мерить ВСЕГДА в машине нужно относительно корпуса...
если ни чего нет... звони на корпус, т.е. сопротивление смотри.
в принцыпе, если там реально ни чего нет, то на пине включает подтяжку, или снаружи ставишь резистор 10К вверх, в смысле на +5в, и через 100ом подаешь прям на проц свой сигнал. можно диодами вверх/вниз задушить броски возможные.
мерил на корпус - 0, ну понятно земля значит там. Померил на постоянный плюс - получил 12В. Попробую с сопротивлениями.
-
Re: Автоматическое переключение на камеру заднего хода.
ну понятно, что на земле относительно 12В будет 12В :)
сначала УБЕДИСЬ что там +12 не летает в других положениях.
-
Re: Автоматическое переключение на камеру заднего хода.
Данная схема рассчитана на работу от лампочки заднего хода, то есть когда задняя скорость выключена то лампочка через спираль и далее через диод подтянет вход контроллера к земле, когда на лампочке +12в то диод заперт и и на входе контроллера за счет внутренней подтяжки будет +5в
-
Re: Автоматическое переключение на камеру заднего хода.
Цитата:
Сообщение от
Chip
Данная схема рассчитана на работу от лампочки заднего хода, то есть когда задняя скорость выключена то лампочка через спираль и далее через диод подтянет вход контроллера к земле, когда на лампочке +12в то диод заперт и и на входе контроллера за счет внутренней подтяжки будет +5в
спасибо за разьеснение, стало понятнее =)
-
Re: Автоматическое переключение на камеру заднего хода.
запарился я с этими делителями, спалил вход, вернее подтягивающе сопротивление или как там правильно? Сделал на реле, зато работает =) кстате на томже входе, просто сейчас подаю честные +5В. Еще код по правил который выше был в моем сообщении. Ошибка заключалось в том что для таймеров не тот тип данных выбрал. Код правильно работал буквально секунд 30 =)
-
Вложений: 1
Re: Автоматическое переключение на камеру заднего хода.
Помниться на пике собирали аналогичное устройство. Ту тему не нашел, спрошу здесь.
Собрал на авр. Монитор - телек "Супер".
На столе работает как часы, с заглушенным двигателем тоже. Если завести, по кругу переключает монитор. Посоветуйте как повысить помехоустойчивость?
Схема ниже. Питание от монитора. Транзистор параллельно кнопке подключен.
На всякий случай вот исходник:
PHP код:
Chip type : ATtiny13
Clock frequency : 9,600000 MHz
Memory model : Tiny
External SRAM size : 0
Data Stack size : 16
*****************************************************/
#include <tiny13.h>
#include <delay.h>
#include <stdio.h>
int a=0;
void channel()
{
PORTB.3=1;
delay_ms(150);
PORTB.3=0;
delay_ms(3000);
PORTB.3=1;
delay_ms(150);
PORTB.3=0;
}
void main(void)
{
// Crystal Oscillator division factor: 8
#pragma optsize-
CLKPR=0x80;
CLKPR=0x03;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Port B initialization
// Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=In
// State5=T State4=T State3=0 State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x08;
while (1)
{
while(a==0 && PINB.4==1)
{
delay_ms(50);
channel();
a=1;
delay_ms(3000);
}
while(a==1 && PINB.4==0)
{
delay_ms(50);
channel();
a=0;
delay_ms(3000);
}
};
}
-
Re: Автоматическое переключение на камеру заднего хода.
Резистор R2 поставить 2ком и конденсатор от него на землю
-
Re: Автоматическое переключение на камеру заднего хода.
Цитата:
Сообщение от
Chip
Резистор R2 поставить 2ком и конденсатор от него на землю
Спасибо. Всё работает.
-
Re: Автоматическое переключение на камеру заднего хода.
Долго мучался с переключением на камеру из-за автоматической коробки. Наконец демонтировал комп и начал наводить порядок. Мой вариант кода:
PHP код:
#define av_mode 12 // выход для нажатия кнопки
#define back_on 3 // вход для сигнала задней скорости
byte temp1;
byte temp2;
boolean cam_enable=false; // статус работы камеры
void setup()
{
pinMode(av_mode, OUTPUT);
pinMode(back_on, INPUT);
digitalWrite(back_on, HIGH);
digitalWrite(av_mode, LOW);
}
//-----------------------------------------------
void loop()
{
cam();
}
//-----------------------------------------------
void cam()
{
temp1=digitalRead(back_on);
delay(1000);
temp2=digitalRead(back_on);
if (temp1==temp2)
{
if (temp2==HIGH)
{
if (cam_enable==false)
{
button_cam_on();
}
}
else
{
if (cam_enable==true)
{
button_cam_off();
}
}
}
}
void button_cam_off()
{
digitalWrite(av_mode, HIGH); // нажать кнопку
delay(400); //длительность нажатия кнопки
digitalWrite(av_mode, LOW); // отпустить кнопку
delay(700); //длительность между нажатиями кнопки
digitalWrite(av_mode, HIGH);
delay(400);
digitalWrite(av_mode, LOW);
cam_enable=false;
}
void button_cam_on()
{
digitalWrite(av_mode, HIGH);
delay(400);
digitalWrite(av_mode, LOW);
cam_enable=true;
}
UPD. Почистил код.
-
Re: Автоматическое переключение на камеру заднего хода.
Чёт, твой скетч не работает
-
Re: Автоматическое переключение на камеру заднего хода.
Цитата:
Сообщение от
Karas
Чёт, твой скетч не работает
Что именно не работает?
-
Re: Автоматическое переключение на камеру заднего хода.
pinMode(pw_12v, OUTPUT);
Компилятор ругается на эту строчку. Зачем она?
Если ее удалить, работает ток ооооооочень медленно. Для АКПП наверное хорошо :)
-
Re: Автоматическое переключение на камеру заднего хода.
Цитата:
Сообщение от
Karas
pinMode(pw_12v, OUTPUT);
Компилятор ругается на эту строчку. Зачем она?
Если ее удалить, работает ток ооооооочень медленно. Для АКПП наверное хорошо :)
Да действительно. Не все я вычистил, просто у меня ардуина кроме камеры ещё и другими делами занимается. По поводу задержки можно регулировать изменяя эту строку delay(1000)
-
Re: Автоматическое переключение на камеру заднего хода.
Подскажите pls, какую схему использовать если нужна только задержка на включение камеры, а управления кнопками монитора не требуется?
То есть приняли на вход Ардуино сигнал с лампы заднего хода, применили задержку и отдали на провод "сигнал зад. хода" монитора. (моник 669GL)
-
Re: Автоматическое переключение на камеру заднего хода.
Так тебе не Ардуино надо, а обычное реле с задержкой
-
Re: Автоматическое переключение на камеру заднего хода.
Цитата:
Сообщение от
Karas
Так тебе не Ардуино надо, а обычное реле с задержкой
Ну Ардуину по любому буду мучать, для регулировки LED подсветки
Можно и для задержки пару выходов использовать.
А что за реле с задержкой, готовое? Хочется программно менять задержки включения и выключения, мне пока не совсем понятно какие нужны на практике.
-
Re: Автоматическое переключение на камеру заднего хода.
PHP код:
void loop()
{
if (digitalRead(back_on) == LOW) //проверить включен ли задний ход
{
??????????????????????????????????????????????????????????????????????????????
digitalWrite(av_mode, HIGH);
while(digitalRead(back_on) == LOW)
{
}
как сделать вместе ???????????????? задержку delay(5000) после которой будет повторно выполнятся условие if (digitalRead(back_on) == LOW)
((задержка на включение КЗВ)
-
Re: Автоматическое переключение на камеру заднего хода.
PHP код:
void loop()
{
int tmp=digitalRead(back_on);
delay(5000);
if (digitalRead(back_on)==LOW & int tmp==LOW ) //проверить включен ли задний ход
{
digitalWrite(av_mode, HIGH);
while(digitalRead(back_on) == LOW)
{
}
-
Вложений: 1
Re: Автоматическое переключение на камеру заднего хода.
PHP код:
int av_mode = 12; //Выход для нажатии кнопки
int back_on = 13; //вход сигнал включения задней скорости
void setup()
{
pinMode(av_mode, OUTPUT);
pinMode(back_on, INPUT);
digitalWrite(back_on, HIGH); //Подключить внутренний подтягивающий резистор
digitalWrite(av_mode, LOW);
Serial.begin(115200);
}
//-----------------------------------------------
void loop()
{
int tmp=digitalRead(back_on);
delay(5000);
if (digitalRead(back_on)==LOW & int tmp==LOW ) //включен ли задний ход
{
digitalWrite(av_mode, HIGH);
while(digitalRead(back_on) == LOW)
{
}
delay(500); //ЗДЕСЬ МОЖНО СДЕЛАТЬ ЗАДЕРЖКУ ВЫКЛЮЧНИЯ КАМЕРЫ ЗХ
digitalWrite(av_mode, LOW);
}
}
ругается на if (digitalRead(back_on)==LOW & int tmp==LOW )
sketch_apr12a.cpp: In function 'void loop()':
sketch_apr12a:16: error: expected primary-expression before 'int'
sketch_apr12a:16: error: expected `)' before 'int'