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

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

#include <CapacitiveSensor.h>
int Light = 12;
CapacitiveSensor   Sensor1 = CapacitiveSensor(4,2); // назначить пины для сенсора 

void setup()                      
{  
   Serial.begin(115200);   // настроить скорость порта 
     pinMode(Light, OUTPUT);
}  

void loop()                      
{  
    long temp1 =  Sensor1.capacitiveSensor(30); // измерить емкость и сохранить в temp1 
   

    if (temp1 > 1000)    // изменяя значение 60 мы регулируем чуствительность сенсора  
    { digitalWrite(12, HIGH);   }    // включить светодиод  
  else { digitalWrite(12, LOW); } // выключить светодиод] 
   
   
   
    Serial.println(temp1);  // для клибровки вашего датчика   // или для использования этого значения в компьютере
                            
}  

в видео видно  на мониторе порта что при косаниях число возростает от 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/ которы помог мне это сделать      

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

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

/* 4-Way Button:  Click, Double-Click, Press+Hold, and Press+Long-Hold Test Sketch

By Jeff Saltzman
Oct. 13, 2009

To keep a physical interface as simple as possible, this sketch demonstrates generating four output events from a single push-button.
1) Click:  rapid press and release
2) Double-Click:  two clicks in quick succession
3) Press and Hold:  holding the button down
4) Long Press and Hold:  holding the button for a long time 
*/

#define buttonPin 19        // analog input pin to use as a digital input
#define ledPin1 18          // digital output pin for LED 1
#define ledPin2 17          // digital output pin for LED 2
#define ledPin3 16          // digital output pin for LED 3
#define ledPin4 15          // digital output pin for LED 4


// LED variables
boolean ledVal1 = false;    // state of LED 1
boolean ledVal2 = false;    // state of LED 2
boolean ledVal3 = false;    // state of LED 3
boolean ledVal4 = false;    // state of LED 4

// Button timing variables
int debounce = 20;          // ms debounce period to prevent flickering when pressing or releasing the button
int DCgap = 250;            // max ms between clicks for a double click event
int holdTime = 1000;        // ms hold period: how long to wait for press+hold event
int longHoldTime = 3000;    // ms long hold period: how long to wait for press+hold event




int checkButton();   

 
    // Button variables
boolean buttonVal = HIGH;   // value read from button
boolean buttonLast = HIGH;  // buffered value of the button's previous state
boolean DCwaiting = false;  // whether we're waiting for a double click (down)
boolean DConUp = false;     // whether to register a double click on next release, or whether to wait and click
boolean singleOK = true;    // whether it's OK to do a single click
long downTime = -1;         // time the button was pressed down
long upTime = -1;           // time the button was released
boolean ignoreUp = false;   // whether to ignore the button release because the click+hold was triggered
boolean waitForUp = false;        // when held, whether to wait for the up event
boolean holdEventPast = false;    // whether or not the hold event happened already
boolean longHoldEventPast = false;// whether or not the long hold event happened already


//=================================================

void setup() {
    // Set button input pin
    pinMode(buttonPin, INPUT);
    digitalWrite(buttonPin, HIGH );
    // Set LED output pins
    pinMode(ledPin1, OUTPUT);
    digitalWrite(ledPin1, ledVal1);
    pinMode(ledPin2, OUTPUT);
    digitalWrite(ledPin2, ledVal2);
    pinMode(ledPin3, OUTPUT);    
    digitalWrite(ledPin3, ledVal3);
    pinMode(ledPin4, OUTPUT);    
    digitalWrite(ledPin4, ledVal4);
    


}

void loop() 

  {
   int b = checkButton();
    
    if (b == 1) clickEvent();
    if (b == 2) doubleClickEvent();
    if (b == 3) holdEvent();
    if (b == 4) longHoldEvent();
  }
    // Get button event and act accordingly
    
  int checkButton()
    {  
    int event = 0;
    buttonVal = digitalRead(buttonPin);

   
    
    // Button pressed down
    if (buttonVal == LOW && buttonLast == HIGH && (millis() - upTime) > debounce)
    {
        downTime = millis();
        ignoreUp = false;
        waitForUp = false;
        singleOK = true;
        holdEventPast = false;
        longHoldEventPast = false;
        if ((millis()-upTime) < DCgap && DConUp == false && DCwaiting == true)  DConUp = true;
        else  DConUp = false;
        DCwaiting = false;
    }
    // Button released
    else if (buttonVal == HIGH && buttonLast == LOW && (millis() - downTime) > debounce)
    {        
        if (not ignoreUp)
        {
            upTime = millis();
            if (DConUp == false) DCwaiting = true;
            else
            {
                event = 2;
                DConUp = false;
                DCwaiting = false;
                singleOK = false;
            }
        }
    }
    // Test for normal click event: DCgap expired
    if ( buttonVal == HIGH && (millis()-upTime) >= DCgap && DCwaiting == true && DConUp == false && singleOK == true && event != 2)
    {
        event = 1;
        DCwaiting = false;
    }
    // Test for hold
    if (buttonVal == LOW && (millis() - downTime) >= holdTime) {
        // Trigger "normal" hold
        if (not holdEventPast)
        {
            event = 3;
            waitForUp = true;
            ignoreUp = true;
            DConUp = false;
            DCwaiting = false;
            //downTime = millis();
            holdEventPast = true;
        }
        // Trigger "long" hold
        if ((millis() - downTime) >= longHoldTime)
        {
            if (not longHoldEventPast)
            {
                event = 4;
                longHoldEventPast = true;
            }
        }
    }
    buttonLast = buttonVal;
    return event;
}





//=================================================
// Events to trigger

 void clickEvent()

 {
    ledVal1 = !ledVal1;
    digitalWrite(ledPin1, ledVal1);
}
void doubleClickEvent() {
    ledVal2 = !ledVal2;
    digitalWrite(ledPin2, ledVal2);
}
void holdEvent() {
    ledVal3 = !ledVal3;
    digitalWrite(ledPin3, ledVal3);
}
void longHoldEvent() {
    ledVal4 = !ledVal4;
    digitalWrite(ledPin4, ledVal4);
} 

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

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

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

/* 4-Way Button:  Click, Double-Click, Press+Hold, and Press+Long-Hold Test Sketch

By Jeff Saltzman
Oct. 13, 2009

To keep a physical interface as simple as possible, this sketch demonstrates generating four output events from a single push-button.
1) Click:  rapid press and release
2) Double-Click:  two clicks in quick succession
3) Press and Hold:  holding the button down
4) Long Press and Hold:  holding the button for a long time 
*/

#include <CapacitiveSensor.h>

CapacitiveSensor   Sensor1 = CapacitiveSensor(4,2);
#define buttonPin 19        // analog input pin to use as a digital input
#define ledPin1 18          // digital output pin for LED 1
#define ledPin2 17          // digital output pin for LED 2
#define ledPin3 16          // digital output pin for LED 3
#define ledPin4 15          // digital output pin for LED 4


// LED variables
boolean ledVal1 = false;    // state of LED 1
boolean ledVal2 = false;    // state of LED 2
boolean ledVal3 = false;    // state of LED 3
boolean ledVal4 = false;    // state of LED 4

// Button timing variables
int debounce = 20;          // ms debounce period to prevent flickering when pressing or releasing the button
int DCgap = 250;            // 
int holdTime = 1000;        // ms hold period: how long to wait for press+hold event
int longHoldTime = 3000;    // ms long hold period: how long to wait for press+hold event



boolean flag=false;
int checkButton();   

 
    // Button variables
boolean buttonVal = HIGH;   // value read from button
boolean buttonLast = HIGH;  // buffered value of the button's previous state
boolean DCwaiting = false;  // whether we're waiting for a double click (down)
boolean DConUp = false;     // whether to register a double click on next release, or whether to wait and click
boolean singleOK = true;    // whether it's OK to do a single click
long downTime = -1;         // time the button was pressed down
long upTime = -1;           // time the button was released
boolean ignoreUp = false;   // whether to ignore the button release because the click+hold was triggered
boolean waitForUp = false;        // when held, whether to wait for the up event
boolean holdEventPast = false;    // whether or not the hold event happened already
boolean longHoldEventPast = false;// whether or not the long hold event happened already


//=================================================

void setup() {
  
  Serial.begin(115200);
  
    // Set button input pin
    pinMode(buttonPin, INPUT);
    digitalWrite(buttonPin, HIGH );
    // Set LED output pins
    pinMode(ledPin1, OUTPUT);
    digitalWrite(ledPin1, ledVal1);
    pinMode(ledPin2, OUTPUT);
    digitalWrite(ledPin2, ledVal2);
    pinMode(ledPin3, OUTPUT);    
    digitalWrite(ledPin3, ledVal3);
    pinMode(ledPin4, OUTPUT);    
    digitalWrite(ledPin4, ledVal4);
    


}


void loop()                      
{  
    
 
   
   
   int b = checkButton();
    
    if (b == 1) clickEvent();
    if (b == 2) doubleClickEvent();
    if (b == 3) holdEvent();
    if (b == 4) longHoldEvent();
  }
    // Get button event and act accordingly
    
  int checkButton()
    {  
    int event = 0;
    
    long temp1 =  Sensor1.capacitiveSensor(30);
    Serial.println(temp1);
    if(temp1>1000)
    
{
  buttonVal=0;
}
else buttonVal=1;

   
    
    // Button pressed down
    if (buttonVal == LOW && buttonLast == HIGH && (millis() - upTime) > debounce )
    {
        downTime = millis();
        ignoreUp = false;
        waitForUp = false;
        singleOK = true;
        holdEventPast = false;
        longHoldEventPast = false;
        if ((millis()-upTime) < DCgap && DConUp == false && DCwaiting == true )  DConUp = true;
        else  DConUp = false;
        DCwaiting = false;
    }
    // Button released
    else if (buttonVal == HIGH && buttonLast == LOW && (millis() - downTime ) > debounce)
    {        
        if (not ignoreUp)
        {
            upTime = millis();
            if (DConUp == false) DCwaiting = true;
            else
            {
                event = 2;
                DConUp = false;
                DCwaiting = false;
                singleOK = false;
            }
        }
    }
    // Test for normal click event: DCgap expired
    if ( buttonVal == HIGH && (millis()-upTime) >= DCgap && DCwaiting == true && DConUp == false && singleOK == true && event != 2 )
    {
        event = 1;
        DCwaiting = false;
    }
    // Test for hold
    if (buttonVal == LOW && (millis() - downTime) >= holdTime ) {
        // Trigger "normal" hold
        if (not holdEventPast)
        {
            event = 3;
            waitForUp = true;
            ignoreUp = true;
            DConUp = false;
            DCwaiting = false;
            //downTime = millis();
            holdEventPast = true;
        }
        // Trigger "long" hold
        if ((millis() - downTime) >= longHoldTime)
        {
            if (not longHoldEventPast)
            {
                event = 4;
                longHoldEventPast = true;
            }
        }
    }
    buttonLast = buttonVal;
    return event;

  }





//=================================================
// Events to trigger

 void clickEvent()

 {
    ledVal1 = !ledVal1;
    digitalWrite(ledPin1, ledVal1);
}
void doubleClickEvent() {
    ledVal2 = !ledVal2;
    digitalWrite(ledPin2, ledVal2);
}
void holdEvent() {
    ledVal3 = !ledVal3;
    digitalWrite(ledPin3, ledVal3);
}
void longHoldEvent() {
    ledVal4 = !ledVal4;
    digitalWrite(ledPin4, ledVal4);
    
    
     Serial.println (buttonVal);
} 

 

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

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