Стеклоподъемники с сенсорными кнопками.

Omigovolt
Offline
Зарегистрирован: 22.08.2013

 У меня ваз 2106. Вообще, идея пришла ко мне, где то, за пару недель до просмотра, вот этого видео.

http://www.youtube.com/watch?v=PrvyvyRhAYw

Я уже могу запускать, глушить автомобиль с голосовых команд.

http://www.youtube.com/watch?v=x8XzUHNXHPM

На данный момент, я могу управлять светом, открытием багажника и делать mute, на магнитоле, раньше я делал все это с голосовых команд, но после добавления (блю тус) БТ и небольшого изменения скетча, я смог все это делать и с телефона. В будущем я смогу управлять мультимедийными функциями, заводить, глушить автомобиль (для демонстрации потом отключу в целях безопасности). Расстояние на открытой месности 4-10 метров.

Стеклоподъемники, я мог бы реализовать и на обычных вазовских кнопках, но не устраивают габариты. При продумывании алгоритмов работы, пришел к выводу, что получится, что то типо, блока комфорта, как на приорах или VW 

алгоритмы следующие:

На каждой двери по 2 кнопки, на водительской 3.  Все работает без зажигания. При кратковременном нажатии на 3-ю кнопку, я переключаю управление с водительской двери на пассажирскую  и т. д. по часовой стрелке. Все это сопровождается сведовой индикацией, на панели приборов (диод), а при длителном нажатии, более 3-х секунд, автомотическое поднятие 3-х стекол, с их блокировкой. По БТ я смогу поднимать стеклоподъемники по сторонам или опускать их (только крайние положения), естесственно при постановке на сигнализаыию, все стекла понимаются.

Ардуино будет контролировать только кнопки и будет связанна с другой ардуинкой, по тх и рх, которая в свою очередь, контролирует БТ, модуль распознования голоса и сдвиговый регистр.

При движении автомобиля, с телефона, можно будет управлять только мультимедиа и стеклоподъемниками

Aghrr
Offline
Зарегистрирован: 07.11.2013

Что за голосовой модуль?

lihachov
Offline
Зарегистрирован: 20.07.2013

Привет Omigovolt!
Делись какой модуль и тд))

тоже обдумываю подобную штуку в машину что бы можно было голосом управлять и еще интересные плюшки какие нибудь.
у меня ваз 2109.
С радостью объединил бы усилия в таком эксклюзивном деле)

Omigovolt
Offline
Зарегистрирован: 22.08.2013
Aghrr
Offline
Зарегистрирован: 07.11.2013

Ок, почитаю 25 страниц флуда ради одного названия

Aghrr
Offline
Зарегистрирован: 07.11.2013
Omigovolt
Offline
Зарегистрирован: 22.08.2013

  Все это будет стоять в автомобиле самый длинный провод будет 6 метров. Вопрос мне поставить конденсатор как на картинке (указан пунктиром) или поставить экранированные провода, что бы небыло наводок?

 

Клапауций
Offline
Зарегистрирован: 10.02.2013

Omigovolt пишет:

  Все это будет стоять в автомобиле самый длинный провод будет 6 метров. Вопрос мне поставить конденсатор как на картинке (указан пунктиром) или поставить экранированные провода, что бы небыло наводок?

и, себя заземлить на корпус автомобиля,.. что бы наводок не было - цирк получится, детям поиграться

от сенсорных кнопок даже на бытовой аппаратуре производители давно отказались из-за невнятного их срабатывания, тем более на серьёзном оборудовании.

Omigovolt
Offline
Зарегистрирован: 22.08.2013

сенсорными телефонами пользуются все!

Клапауций
Offline
Зарегистрирован: 10.02.2013

Omigovolt пишет:

сенсорными телефонами пользуются все!

вот и ставьте сенсорную панель на кнопку, как у сенсорного телефона, вместо обкладки конденсатора

[освобождаю андроидов из телефона - свободу роботам!]

Omigovolt
Offline
Зарегистрирован: 22.08.2013

Попробывал поработать с 6-ю метрами провода))) Приобрел в радио магазине экранированный многожильный провод написал простейший скетч. На просторах интернета нашел даташит на  at42qt1010 (одноканальный емкостный датчик)

и в даташите выяснил емкости конденсаторв Сs  от 2 до 50 nF и Cх от 2 до 50 pF 

в своем случае я взял Сх 5 pF

провод у меня 4-х жильный 3 жилы я замкнул на массу и оставил только одну  а ее через конденсатор на массу.

http://youtu.be/7W_4EfdcxyY

01#include <CapacitiveSensor.h>
02int Light = 12;
03CapacitiveSensor   Sensor1 = CapacitiveSensor(4,2); // назначить пины для сенсора
04 
05void setup()                     
06
07   Serial.begin(115200);   // настроить скорость порта
08     pinMode(Light, OUTPUT);
09
10 
11void loop()                     
12
13    long temp1 =  Sensor1.capacitiveSensor(30); // измерить емкость и сохранить в temp1
14    
15 
16    if (temp1 > 1000)    // изменяя значение 60 мы регулируем чуствительность сенсора 
17    { digitalWrite(12, HIGH);   }    // включить светодиод 
18  else { digitalWrite(12, LOW); } // выключить светодиод]
19    
20    
21    
22    Serial.println(temp1);  // для клибровки вашего датчика   // или для использования этого значения в компьютере
23                             
24

в видео видно  на мониторе порта что при косаниях число возростает от 150 до 9 тысяч когда провод я держал в руке то чисто было где то 150 может чуть больше когда я его положил то от 25 до 80 а потом я положил локоть на все провода  число поднялось 

опять где то до 150 я считаю что это не значительные наводки по с равнению с прикосноыением тем более что провод будет растянут ))) 

так же я эксперементировал с 2-мя жилами в одном экране  так не получается так как один провод даст наводку на дргой внутри экрана и загорятся 2 диода одновременно. Продолжаем эксперементировать)))

 

Omigovolt
Offline
Зарегистрирован: 22.08.2013

Пересмотрел общую схему работы. От доводчиков придется  отказаться так как не удовлетворяют они моим требованиям. Да и поиграться с таймерами можно будет на данный момент выкладываю общую схему.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Не забывайте также о ёмкости кабеля...

Electrical characteristics for Cat 5e UTP

.............................

Capacitance at 800 Hz 52   pF/m

................................

 

Omigovolt
Offline
Зарегистрирован: 22.08.2013

trembo спасибо хочу попробывать вообще без конденсатора на конце и посмотреть значения

а вы работали с емкостными датчиками?

 

Появился вопрос так как у меня функция автомата будет присутствовать на всех 4 подъемниках и вверх и вниз нужно это как то контролировать на данный момент склоняюсь к 

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

a5021
Offline
Зарегистрирован: 07.07.2013

Он при нулевом протекающем токе показывает половину напряжения. Потек ток в одну сторону, пошел рост напряжения от половины вверх. Если ток изменил направление, то напряжение на сенсоре пошло вниз.

Omigovolt
Offline
Зарегистрирован: 22.08.2013

наконец определился с датчиком  ACS706ELC-20A

думаю 20 ампер на один мотор будет с запасом да же при условии нагрузки можно было конечно взять 15 А но я чуть подстраховался да и размеры у него по меньше чем у предыдущего)

вопрос хочется сделать кнопки многофункциональными например что бы у меня работал двойной клик или зажатие более 1 секунды это можно сделать при помощи функции Millis или ввести таймер хотел узнать ваше мнение что проще в плане кода и где я смогу поэксперементировать с долями секунд (пауза между двумя нажатиями) ?

Omigovolt
Offline
Зарегистрирован: 22.08.2013

Наконец решена задача по многофункциональности на нглийской версии сайта Arduino наткнулся а точнее меня туда завел поиск на статью по многофункциональности там она называлась мультиклик 

http://forum.arduino.cc/index.php/topic,14479.0.html

оставалось только совместить все это в один скетч 

спасибо огромное  manu_245  с сайта http://compcar.ru/ которы помог мне это сделать      

в итоге я получил именно то что хотел это двойной клик  и зажатие  в данном скетче все работает с обыкновенной кнопкой 

осталось поэксперементировать с сенсором

001/* 4-Way Button:  Click, Double-Click, Press+Hold, and Press+Long-Hold Test Sketch
002 
003By Jeff Saltzman
004Oct. 13, 2009
005 
006To keep a physical interface as simple as possible, this sketch demonstrates generating four output events from a single push-button.
0071) Click:  rapid press and release
0082) Double-Click:  two clicks in quick succession
0093) Press and Hold:  holding the button down
0104) Long Press and Hold:  holding the button for a long time
011*/
012 
013#define buttonPin 19        // analog input pin to use as a digital input
014#define ledPin1 18          // digital output pin for LED 1
015#define ledPin2 17          // digital output pin for LED 2
016#define ledPin3 16          // digital output pin for LED 3
017#define ledPin4 15          // digital output pin for LED 4
018 
019 
020// LED variables
021boolean ledVal1 = false;    // state of LED 1
022boolean ledVal2 = false;    // state of LED 2
023boolean ledVal3 = false;    // state of LED 3
024boolean ledVal4 = false;    // state of LED 4
025 
026// Button timing variables
027int debounce = 20;          // ms debounce period to prevent flickering when pressing or releasing the button
028int DCgap = 250;            // max ms between clicks for a double click event
029int holdTime = 1000;        // ms hold period: how long to wait for press+hold event
030int longHoldTime = 3000;    // ms long hold period: how long to wait for press+hold event
031 
032 
033 
034 
035int checkButton();  
036 
037  
038    // Button variables
039boolean buttonVal = HIGH;   // value read from button
040boolean buttonLast = HIGH;  // buffered value of the button's previous state
041boolean DCwaiting = false// whether we're waiting for a double click (down)
042boolean DConUp = false;     // whether to register a double click on next release, or whether to wait and click
043boolean singleOK = true;    // whether it's OK to do a single click
044long downTime = -1;         // time the button was pressed down
045long upTime = -1;           // time the button was released
046boolean ignoreUp = false;   // whether to ignore the button release because the click+hold was triggered
047boolean waitForUp = false;        // when held, whether to wait for the up event
048boolean holdEventPast = false;    // whether or not the hold event happened already
049boolean longHoldEventPast = false;// whether or not the long hold event happened already
050 
051 
052//=================================================
053 
054void setup() {
055    // Set button input pin
056    pinMode(buttonPin, INPUT);
057    digitalWrite(buttonPin, HIGH );
058    // Set LED output pins
059    pinMode(ledPin1, OUTPUT);
060    digitalWrite(ledPin1, ledVal1);
061    pinMode(ledPin2, OUTPUT);
062    digitalWrite(ledPin2, ledVal2);
063    pinMode(ledPin3, OUTPUT);   
064    digitalWrite(ledPin3, ledVal3);
065    pinMode(ledPin4, OUTPUT);   
066    digitalWrite(ledPin4, ledVal4);
067     
068 
069 
070}
071 
072void loop()
073 
074  {
075   int b = checkButton();
076     
077    if (b == 1) clickEvent();
078    if (b == 2) doubleClickEvent();
079    if (b == 3) holdEvent();
080    if (b == 4) longHoldEvent();
081  }
082    // Get button event and act accordingly
083     
084  int checkButton()
085    
086    int event = 0;
087    buttonVal = digitalRead(buttonPin);
088 
089    
090     
091    // Button pressed down
092    if (buttonVal == LOW && buttonLast == HIGH && (millis() - upTime) > debounce)
093    {
094        downTime = millis();
095        ignoreUp = false;
096        waitForUp = false;
097        singleOK = true;
098        holdEventPast = false;
099        longHoldEventPast = false;
100        if ((millis()-upTime) < DCgap && DConUp == false && DCwaiting == true)  DConUp = true;
101        else  DConUp = false;
102        DCwaiting = false;
103    }
104    // Button released
105    else if (buttonVal == HIGH && buttonLast == LOW && (millis() - downTime) > debounce)
106    {       
107        if (not ignoreUp)
108        {
109            upTime = millis();
110            if (DConUp == false) DCwaiting = true;
111            else
112            {
113                event = 2;
114                DConUp = false;
115                DCwaiting = false;
116                singleOK = false;
117            }
118        }
119    }
120    // Test for normal click event: DCgap expired
121    if ( buttonVal == HIGH && (millis()-upTime) >= DCgap && DCwaiting == true && DConUp == false && singleOK == true && event != 2)
122    {
123        event = 1;
124        DCwaiting = false;
125    }
126    // Test for hold
127    if (buttonVal == LOW && (millis() - downTime) >= holdTime) {
128        // Trigger "normal" hold
129        if (not holdEventPast)
130        {
131            event = 3;
132            waitForUp = true;
133            ignoreUp = true;
134            DConUp = false;
135            DCwaiting = false;
136            //downTime = millis();
137            holdEventPast = true;
138        }
139        // Trigger "long" hold
140        if ((millis() - downTime) >= longHoldTime)
141        {
142            if (not longHoldEventPast)
143            {
144                event = 4;
145                longHoldEventPast = true;
146            }
147        }
148    }
149    buttonLast = buttonVal;
150    return event;
151}
152 
153 
154 
155 
156 
157//=================================================
158// Events to trigger
159 
160 void clickEvent()
161 
162 {
163    ledVal1 = !ledVal1;
164    digitalWrite(ledPin1, ledVal1);
165}
166void doubleClickEvent() {
167    ledVal2 = !ledVal2;
168    digitalWrite(ledPin2, ledVal2);
169}
170void holdEvent() {
171    ledVal3 = !ledVal3;
172    digitalWrite(ledPin3, ledVal3);
173}
174void longHoldEvent() {
175    ledVal4 = !ledVal4;
176    digitalWrite(ledPin4, ledVal4);
177}

http://www.youtube.com/watch?v=G3fwmjtVAQ8

Omigovolt
Offline
Зарегистрирован: 22.08.2013

Вчера вечером дописав несколько строк с  manu_245   все заработало с сенсором ) 

001/* 4-Way Button:  Click, Double-Click, Press+Hold, and Press+Long-Hold Test Sketch
002 
003By Jeff Saltzman
004Oct. 13, 2009
005 
006To keep a physical interface as simple as possible, this sketch demonstrates generating four output events from a single push-button.
0071) Click:  rapid press and release
0082) Double-Click:  two clicks in quick succession
0093) Press and Hold:  holding the button down
0104) Long Press and Hold:  holding the button for a long time
011*/
012 
013#include <CapacitiveSensor.h>
014 
015CapacitiveSensor   Sensor1 = CapacitiveSensor(4,2);
016#define buttonPin 19        // analog input pin to use as a digital input
017#define ledPin1 18          // digital output pin for LED 1
018#define ledPin2 17          // digital output pin for LED 2
019#define ledPin3 16          // digital output pin for LED 3
020#define ledPin4 15          // digital output pin for LED 4
021 
022 
023// LED variables
024boolean ledVal1 = false;    // state of LED 1
025boolean ledVal2 = false;    // state of LED 2
026boolean ledVal3 = false;    // state of LED 3
027boolean ledVal4 = false;    // state of LED 4
028 
029// Button timing variables
030int debounce = 20;          // ms debounce period to prevent flickering when pressing or releasing the button
031int DCgap = 250;            //
032int holdTime = 1000;        // ms hold period: how long to wait for press+hold event
033int longHoldTime = 3000;    // ms long hold period: how long to wait for press+hold event
034 
035 
036 
037boolean flag=false;
038int checkButton();  
039 
040  
041    // Button variables
042boolean buttonVal = HIGH;   // value read from button
043boolean buttonLast = HIGH;  // buffered value of the button's previous state
044boolean DCwaiting = false// whether we're waiting for a double click (down)
045boolean DConUp = false;     // whether to register a double click on next release, or whether to wait and click
046boolean singleOK = true;    // whether it's OK to do a single click
047long downTime = -1;         // time the button was pressed down
048long upTime = -1;           // time the button was released
049boolean ignoreUp = false;   // whether to ignore the button release because the click+hold was triggered
050boolean waitForUp = false;        // when held, whether to wait for the up event
051boolean holdEventPast = false;    // whether or not the hold event happened already
052boolean longHoldEventPast = false;// whether or not the long hold event happened already
053 
054 
055//=================================================
056 
057void setup() {
058   
059  Serial.begin(115200);
060   
061    // Set button input pin
062    pinMode(buttonPin, INPUT);
063    digitalWrite(buttonPin, HIGH );
064    // Set LED output pins
065    pinMode(ledPin1, OUTPUT);
066    digitalWrite(ledPin1, ledVal1);
067    pinMode(ledPin2, OUTPUT);
068    digitalWrite(ledPin2, ledVal2);
069    pinMode(ledPin3, OUTPUT);   
070    digitalWrite(ledPin3, ledVal3);
071    pinMode(ledPin4, OUTPUT);   
072    digitalWrite(ledPin4, ledVal4);
073     
074 
075 
076}
077 
078 
079void loop()                     
080
081     
082  
083    
084    
085   int b = checkButton();
086     
087    if (b == 1) clickEvent();
088    if (b == 2) doubleClickEvent();
089    if (b == 3) holdEvent();
090    if (b == 4) longHoldEvent();
091  }
092    // Get button event and act accordingly
093     
094  int checkButton()
095    
096    int event = 0;
097     
098    long temp1 =  Sensor1.capacitiveSensor(30);
099    Serial.println(temp1);
100    if(temp1>1000)
101     
102{
103  buttonVal=0;
104}
105else buttonVal=1;
106 
107    
108     
109    // Button pressed down
110    if (buttonVal == LOW && buttonLast == HIGH && (millis() - upTime) > debounce )
111    {
112        downTime = millis();
113        ignoreUp = false;
114        waitForUp = false;
115        singleOK = true;
116        holdEventPast = false;
117        longHoldEventPast = false;
118        if ((millis()-upTime) < DCgap && DConUp == false && DCwaiting == true )  DConUp = true;
119        else  DConUp = false;
120        DCwaiting = false;
121    }
122    // Button released
123    else if (buttonVal == HIGH && buttonLast == LOW && (millis() - downTime ) > debounce)
124    {       
125        if (not ignoreUp)
126        {
127            upTime = millis();
128            if (DConUp == false) DCwaiting = true;
129            else
130            {
131                event = 2;
132                DConUp = false;
133                DCwaiting = false;
134                singleOK = false;
135            }
136        }
137    }
138    // Test for normal click event: DCgap expired
139    if ( buttonVal == HIGH && (millis()-upTime) >= DCgap && DCwaiting == true && DConUp == false && singleOK == true && event != 2 )
140    {
141        event = 1;
142        DCwaiting = false;
143    }
144    // Test for hold
145    if (buttonVal == LOW && (millis() - downTime) >= holdTime ) {
146        // Trigger "normal" hold
147        if (not holdEventPast)
148        {
149            event = 3;
150            waitForUp = true;
151            ignoreUp = true;
152            DConUp = false;
153            DCwaiting = false;
154            //downTime = millis();
155            holdEventPast = true;
156        }
157        // Trigger "long" hold
158        if ((millis() - downTime) >= longHoldTime)
159        {
160            if (not longHoldEventPast)
161            {
162                event = 4;
163                longHoldEventPast = true;
164            }
165        }
166    }
167    buttonLast = buttonVal;
168    return event;
169 
170  }
171 
172 
173 
174 
175 
176//=================================================
177// Events to trigger
178 
179 void clickEvent()
180 
181 {
182    ledVal1 = !ledVal1;
183    digitalWrite(ledPin1, ledVal1);
184}
185void doubleClickEvent() {
186    ledVal2 = !ledVal2;
187    digitalWrite(ledPin2, ledVal2);
188}
189void holdEvent() {
190    ledVal3 = !ledVal3;
191    digitalWrite(ledPin3, ledVal3);
192}
193void longHoldEvent() {
194    ledVal4 = !ledVal4;
195    digitalWrite(ledPin4, ledVal4);
196     
197     
198     Serial.println (buttonVal);
199}

 

http://www.youtube.com/watch?v=s2-Bthqtv9o&feature=youtu.be

теперь осталось приобрести датчики тока и можно будет собирать первый тестовый вариант 

Еще мне объяснили что нужно что бы все окружающие понимали чего я хочу от этого проэкта и как я его вижу его  у себя в голове ))))

Постараюсь объяснить. Всего 9  кнопок, по 2 на каждую дверь и 3 на дверь водителя. На всех дверях функция атомата которая срабатывает по двойному клику, почму двойному, по тому, что может получиться эффект скольжения. Те кто ставили доводчики сктекол с функцией автомата, поймут меня (стекло очень трудно подогнать в то место в которое хочешь ), а тут гоняй сколько хочешь . Автомат и вуерх и вниз. И только по двойному клику, на практике посмотрим как это будет выглядить. В водительской двери третья кнопка, будет иметь функцию переключателя. Например нажатие на 2 секунды  на табло загорается соответствующий диод или цифра (пока еще не определился) и уже с водительской двери можно будет управлять  любым стеклоподъемником, в зависимости от цифры или индикатора. А если ее зажать на 4 секунды то сработает режим блока, все три стеклоподъемника закроются и заблокируются, а водитель сможет ими управлять путем 2-х секундного переключения между ними. Tще была мысль, поставить бипер с условными сигналами, было бы удобно. Еще можно будет управлять магнитолой. На рисунке, на втором, который я нарисовал от руки, я нарисовал сдвиговый регистр, от которого я отказался, так как у меги вполне хватает выходов и все управление магнитолой, можно будет сделать на одной плате с минимальной разводкой. Управлять я смогу громкостью, переключениями треков и тишиной. Все это работает через блютус. Сначала нано принимает сигнал, а потом по Тх и Рх посылает на мегу, а та в свою очередь управляет магнитолой. Так же с телефона по блютус можно будет управлять и стеклоподъемниками, но только по парам и по сторонам и то, только в крайних полождениях, либо открыть, либо закрыть. Еще думал, но уже в качестве прикола, попробывать сделать при одновременном зажатии 2-х кнопок, на любой из задних дверей, на 2 секунды,   отключение управления стеклоподъемником и подключением функции управления магнитолой. Например громгостью! При отключении питания, (постановке на сигнализацию) ардуино будет видеть это и  закрывать все стеклоподъемники, по парам или нет, еще не определился и отключаться путем, отключения питания на транзисторе, который будет отключать  полностью питание, на всем устройстве!  Естесственно, при обрыве тросика, стеклоподъемник будет работать в ту или иную сторону, не более 10-15 секунд, а потом отклюаться.

 

 

Вроде все рассказал! Приминаю любую критику комментируйте.

 

 

Omigovolt
Offline
Зарегистрирован: 22.08.2013

после выключения питания ардуина должна закрыть все окна и отключить питание (обесточить себя ) можно это сделать несколькими способами один из которых такой:

 

вопрос какой транзистор использовать и на сколько правильно я рассуждаю?

 

Omigovolt
Offline
Зарегистрирован: 22.08.2013

кажется кое что нашел)))

 

Omigovolt
Offline
Зарегистрирован: 22.08.2013

нарисовал почти полноценную схему))))

Omigovolt
Offline
Зарегистрирован: 22.08.2013

только что опытным путем выяснил что вполне достаточно резистора в 50 кОм при косании значени в мониторе порта не превышает 50 - 60 а при состоянии покоя 2-3 а когда был 1 мОм то значение при косании могло подняться до 170000 и скорость значительно падала а вот от конденсатора избавиться не удалсь иногда значения подвисали 

Omigovolt
Offline
Зарегистрирован: 22.08.2013

Давно ни чего не писал но проект не умер а перерос в нечто другое! Я купил др автомобиль и он уже имеет 2 стеклоподъемника. От сенсорных кнопок я отказался. Вот схема последней редакции.

a5021
Offline
Зарегистрирован: 07.07.2013

Нет, не могу я найти на этой карте место, где зарыт клад. :)