Страница 28 из 57 ПерваяПервая ... 182223242526272829303132333438 ... ПоследняяПоследняя
Показано с 271 по 280 из 561
  1. #271
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    55
    Сообщений
    13,381
    Вес репутации
    10

    По умолчанию Re: Управление рулевыми кнопками при помощи Carduino.

    Я бы драйвер свежий поставил для начала

  2. #272
    Продвинутый
    Регистрация
    19.02.2010
    Возраст
    47
    Сообщений
    244
    Вес репутации
    237

    По умолчанию Re: Управление рулевыми кнопками при помощи Carduino.

    О, как. Спасибо.

  3. #273
    Местный Аватар для zhserg
    Регистрация
    12.11.2010
    Сообщений
    135
    Вес репутации
    207

    По умолчанию Re: Управление рулевыми кнопками при помощи Carduino.

    BlkDem, а с каким скетчем у тебя не обрабатываются нажатия?

  4. #274
    Продвинутый
    Регистрация
    19.02.2010
    Возраст
    47
    Сообщений
    244
    Вес репутации
    237

    По умолчанию Re: Управление рулевыми кнопками при помощи Carduino.

    Скетчи все более или менее работают. Грабли (переустановка драйвера на свежий не помогла) наступают, когда нажимаешь рулевую кнопку в тот момент, когда контроллер что-то пишет в порт. Тогда не срабатывает.
    Можно отключить контроллер от компа, но это тоже не помогает.
    Затыки возникают регулярно.
    Я уже думаю на прерывание кнопки рулевые повесить.

  5. #275
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    55
    Сообщений
    13,381
    Вес репутации
    10

    По умолчанию Re: Управление рулевыми кнопками при помощи Carduino.

    Может быть у тебя еще подключено по USB FTDI устройство
    Какая операционка? какой версии драйвер?

  6. #276
    Продвинутый
    Регистрация
    19.02.2010
    Возраст
    47
    Сообщений
    244
    Вес репутации
    237

    По умолчанию Re: Управление рулевыми кнопками при помощи Carduino.

    Ось - ХП сп3. Драйвер их шапки темы про компилятор (кста, там бы ссылку не помешало обновить на 0022).
    Дело не в компе. Либо я где-то туплю со скетчем, либо я слишком многого хочу от контроллера. У меня две кнопки управляют радиоприемником (станция вверх, станция вниз), т.е. даже тогда, когда компьютер полностью отключен. Кнопка "вниз" - это короткое, т.е. вообще без сопротивления, но даже она спотыкается. Т.е. ошибка замера сопротивления не при чем. Затык именно при синхронном выполнении двух операций: нажатие рулевой кнопки и запись в порт...
    Завтра выложу скетч. Глянете опытным взглядом.

    зы: только сейчас вспомнил. я же 0018-ым компилятором прошивал ардуину. Может повлиять?
    Собственно, завтра проверю.

  7. #277
    Пользователь
    Регистрация
    07.12.2009
    Сообщений
    29
    Вес репутации
    197

    По умолчанию Re: Управление рулевыми кнопками при помощи Carduino.

    Дорогие друзья! Помогите решить следующую проблему.

    Имеем штатные рулевые кнопки на резистивной матрице, которая подключена к арудуине. Имеем скетч:

    define PIN 7 //номер аналогового порта
    #define LIMIT 6 //предел погрешности сопротивления
    int knopka_trg=0;

    byte bytes[2];
    int res_dt1;
    unsigned long math_time,old_time,real_time;
    void setup()
    {

    pinMode(2,OUTPUT);
    pinMode(3,OUTPUT);
    pinMode(4,OUTPUT);
    pinMode(5,OUTPUT);
    pinMode(6,OUTPUT);
    pinMode(7,OUTPUT);
    pinMode(8,OUTPUT);
    pinMode(9,OUTPUT);

    Serial.begin(115200); // настроить скорость com порта
    }

    void loop()
    {
    old_time = real_time;
    math_time = 0;
    res_dt1 = analogRead(PIN); // прочитать данные АЦП
    while(math_time < 300 && (analogRead(PIN)>res_dt1-LIMIT && analogRead(PIN) < res_dt1+LIMIT ))
    {
    real_time = millis(); //получить реальное время
    math_time = real_time - old_time; //считаем длительность паузы
    }

    if( math_time > 80 ) //если нет дребезга
    {

    if (res_dt1>965 && res_dt1<975) digitalWrite(6,HIGH );// увеличиваем громкость
    else { digitalWrite(6, LOW); }

    if (res_dt1>980 && res_dt1<990) digitalWrite(5,HIGH ); // уменьшаем громкость
    else { digitalWrite(5, LOW); }

    if (res_dt1>1000 && res_dt1<1010) {
    knopka_trg=1-knopka_trg;
    digitalWrite(2, knopka_trg); // вкл_выкл
    }


    bytes[0] = res_dt1 & 255; // преобразовать в 2-байта
    bytes[1] = (res_dt1 & 768) >> 8;
    Serial.write( bytes,2); // отправить прочитаное значение компьютеру

    }
    }


    Всё рабоает.

    Появилась необходимость паралельного подключения джойстика СОНИ , он тоже на резистивной матрице. Значения в АЦП ардуино он даёт ес-но другие.

    Вопрос - как обеденить два значения АЦП для решения одной задачи ?

    Пример:

    if (res_dt1>111 && res_dt1<112) digitalWrite(6,HIGH );// увеличиваем громкость
    else { digitalWrite(6, LOW); }

    Это при нажатии штатки.

    А это при нажатии джойстика:

    if (res_dt1>221 && res_dt1<222) digitalWrite(6,HIGH );// увеличиваем громкость
    else { digitalWrite(6, LOW); }



    Как объеденить в скетче, а то у меня не выходит ничего, работает или то, или другое, вместе не хотят
    Последний раз редактировалось Rover 176; 17.05.2011 в 16:02.

  8. #278
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    55
    Сообщений
    13,381
    Вес репутации
    10

    По умолчанию Re: Управление рулевыми кнопками при помощи Carduino.

    Проще резистивные кнопки объединить, так как они все равно не пересекаются. Попробуй подключи параллельно

  9. #279
    Пользователь
    Регистрация
    07.12.2009
    Сообщений
    29
    Вес репутации
    197

    По умолчанию Re: Управление рулевыми кнопками при помощи Carduino.

    Цитата Сообщение от Chip Посмотреть сообщение
    Проще резистивные кнопки объединить, так как они все равно не пересекаются. Попробуй подключи параллельно
    Я так и сделал, но мне нужно, чтобы при разных значениях на ЦАП был один результат.

    Т.е.
    Подключил резистор 1 кОм- получил на выходе 5 ардуины 1.
    if (res_dt1>111 && res_dt1<112) digitalWrite(5,HIGH );//


    Подключил резистор 2 кОм- тоже получил на выходе 5 ардуины 1.
    if (res_dt1>221 && res_dt1<222) digitalWrite(5,HIGH );//


    Как это в скетче обеденить??
    Последний раз редактировалось Rover 176; 17.05.2011 в 21:53.

  10. #280
    Продвинутый
    Регистрация
    19.02.2010
    Возраст
    47
    Сообщений
    244
    Вес репутации
    237

    По умолчанию Re: Управление рулевыми кнопками при помощи Carduino.

    Поколдовал я еще малость. Не помогает. Логика прежняя: отключаешь функции, вызываемые по таймеру, кнопки работают так, как-будто они родные.
    Вот скетч:

    PHP код:
    #include <DallasTemperature.h>
    #include <EEPROM.h>
    #define D13_High PORTB |=B00100000 
    #define D13_LOW PORTB &= B11011111 
    #define PIN 5  //номер аналогового порта 
    #define LIMIT 6 //предел погрешности сопротивления

    #define CE (12) //LM7001 PIN3
    #define CL (11) //LM7001 PIN4
    #define DA (10) //LM7001 PIN5
    // Задержка на тактах, в микросекундах
    #define LM_DELAY (2)

    volatile unsigned int tcnt2
    volatile byte pwm_time
    volatile int incomingByte 0;
    volatile byte bytes[] = {100};

    DallasTemperature tempSensor;
    byte buttons[8];  
    int res_dt1res_dtres_pwr;
    int back_cam 2;
    byte cam_status=0;
    int remotePin 4
    int speakerPin 5;
    char names[] = { 'c''d''e''f''g''a''b''C' };
    int tones[] = { 1915170015191432127511361014956 };
    int StList[] = {9731074100510111026103010401044105010551062989};
    byte StID 0;
    volatile long remoteCount 0;
    byte idx=0;
    byte temp=0;
    int tempSens 250;
    volatile boolean remoteOn=false;
    unsigned long math_time,old_time,real_timestime
    boolean lockwrite false;

    void setup()   
    {  
        
    TIMSK2 &= ~(1<<TOIE2); //разрешения прерывания по переполнению таймера/счетчика Т2  
        
    TCCR2A &= ~((1<<WGM21) | (1<<WGM20));// Режим работы таймера/счетчика 
        
    TCCR2B &= ~(1<<WGM22);// Режим работы таймера/счетчика 
        
    ASSR &= ~(1<<AS2);  //Выбор источника синхронизации таймера если AS2=0 от системного генератора 
        
    tcnt2 237;      
        
    TIMSK2 |= (1<<TOIE2);//Разрешение прерывания по переполнению Т2. 
        
    pinMode(remotePinOUTPUT);  
        
    buttons[0]=255;
        
    buttons[1]=0;
        
    buttons[5]=0;
        
    buttons[6]=0;
        
    buttons[7]=0;
        
    buttons[4]=0;
        
        
    Serial.begin(115200);
        
    tempSensor.begin(4);
        
    pinMode(CEOUTPUT);
        
    pinMode(CLOUTPUT);
        
    pinMode(DAOUTPUT);
        
    pinMode(back_camINPUT); //камера ЗХ
        
    pinMode(speakerPinOUTPUT); //спикер
        
    digitalWrite(2HIGH);
    // Да будет радио сразу!
    delay(500);
       
    byte lA=0;
       
    byte hA=0;
       
    word f;
        
    hA=EEPROM.read(0);
        
    lA=EEPROM.read(1);
        
           
    // Serial.println(lowByte(f), DEC);
        //Serial.println(highByte(f), DEC);
         // Serial.println(f, DEC);  Serial.println(f, DEC);
        
    f=word(hAlA);
        
    int fint=f;
        
    //Serial.println(f, DEC);
        
    delay(3000);
        if ((
    lA>0) || (hA>0)) SetRF(fint); else  SetRF(973); 
    }   

    void cam()
    {
     
    temp=digitalRead(back_cam);
      if(
    temp==HIGH && cam_status==0)
      {
           
    //clear_buf();
           
    delay(500);
           if (
    digitalRead(back_cam) != HIGH) return;
           
    cam_status=255;
           
    buttons[6]=111;
           
    Serial.writebuttons,8);
           
    delay(10);
           
    buttons[6]=0;
           
    Serial.writebuttons,8);
           
    //Serial.println("on");
      
    }
          if(
    temp==LOW && cam_status==255)
            {
             
    //clear_buf();
             
    cam_status=0;
             
    buttons[6]=110;
             
    Serial.writebuttons,8);
             
    delay(10);
             
    buttons[6]=0;
             
    Serial.writebuttons,8);
             
    //Serial.println("off");
            
    }
    }

    void Notify(byte Note)
    {
    for (
    int j=0;j<=8;j++) {        // проверяем - это нота?
        
    if (names[j] == Note) {    // ага - нота! 
          
    for( int i=0i<50i++ ) { // проигрываем ноту 50 раз
            
    digitalWrite(speakerPinHIGH);
            
    delayMicroseconds(tones[j]);
            
    digitalWrite(speakerPinLOW);
            
    delayMicroseconds(tones[j]);
          }
        }
      } 
    }

    void ReadTemp()
    {
      
        switch(
    tempSensor.isValid())
        {
            case 
    1:
                
    //Serial.println("Invalid CRC");
                
    buttons[2]=111tempSens 60;
                
    tempSensor.reset(); // сбросить девайс
                
    return;
            case 
    2:
                
    //Serial.println("Invalid device");
                
    buttons[2]=111;
                
    tempSens 60;
                
    tempSensor.reset(); // сбросить девайс
                
    return;
        }
      
    tempSens tempSensor.getTemperature();
      
    buttons[2]=tempSens;
    }

    void bc(boolean fwd)  // Загадочная функция :) Листает список радиостанций
    {
      if (
    fwd)
      {
        if (
    StID 11) {StID++; SetRF(StList[StID]);} else {StID=0SetRF(StList[0]);}
      }
      else
      {
        if (
    StID 0
        {
          
    StID--; SetRF(StList[StID]);
        }
        else
        {
          if (
    StID==0)
          {
            
    StID=11SetRF(StList[StID]);
          }
        }
      }
      
    delay(500);
    }

    void RadioCmd()
    {
      
    int inRF;
      
    byte p[3];
      
    int t;

    // Длина команды 8 байт, формат:
    // rfXXXXX<cr>
      
    Serial.available();
      if (
    >= 9)
      {
        
    p[0] = Serial.read();
        
    p[1] = Serial.read();
        
    p[2] = Serial.read();
        if ( 
    p[0]=='r' and p[1]=='f' and p[2]=='s')
        {
          
    inRF 1;
          for (
    int x=3x>=0x--)
            {
              
    inRF += (int(Serial.read())-48) * pow(10x);
            }
          
    Serial.flush();  
          if (
    inRF >= 875 and inRF <= 1080)  {SetRF(inRF);}
        }
        if ( 
    p[0]=='r' and p[1]=='f' and p[2]=='n')
        {
          
    bc(true);
        }
        if ( 
    p[0]=='r' and p[1]=='f' and p[2]=='p')
        {
          
    bc(false);
        }
      }
      else 
      {
      if (
    0) {Serial.flush();}
      }
      
    delay(100); 
    }

    void voltmetr()
    {
      
    res_pwr analogRead(1)/4;
      
    buttons[1]=res_pwr


    void autolight()
    {
      
    byte light;  
      
    int sens analogRead(0)/4;  
      
    buttons[3] = sens;
    }

    void joystik()
    {  
      
    res_dt analogRead(5); // прочитать данные АЦП 
      
    int tmp =0;
      if (
    res_dt 1000) return;
      {
        
    delay(30); // пауза для проверки дребезга
        
    tmp analogRead(5);
        if(((
    res_dt LIMIT) <= tmp) && ((res_dt LIMIT)>=tmp) ) //если нет дребезга
          
    {
            
    buttons[0]=0;
            
           switch (
    res_dt/4)
           {
             case 
    212buttons[0]=15Serial.write(buttons,8); Notify('a'); break;
             case 
    213buttons[0]=15Serial.write(buttons,8); Notify('a'); break;
             case 
    214buttons[0]=15Serial.write(buttons,8); Notify('a'); break;
             case 
    211buttons[0]=15Serial.write(buttons,8); Notify('a'); break;
             case 
    215buttons[0]=15Serial.write(buttons,8); Notify('a'); break;
             
             case 
    245:buttons[0]=14Serial.write(buttons,8); Notify('a'); break;
             case 
    246:buttons[0]=14Serial.write(buttons,8); Notify('a'); break;
             case 
    247:buttons[0]=14Serial.write(buttons,8); Notify('a'); break;
             case 
    244:buttons[0]=14Serial.write(buttons,8); Notify('a'); break;
             
             case 
    232buttons[0]=13Serial.write(buttons,8); Notify('a'); break;
             case 
    231buttons[0]=13Serial.write(buttons,8); Notify('a'); break;
             case 
    233buttons[0]=13Serial.write(buttons,8); Notify('a'); break;
             case 
    234buttons[0]=13Serial.write(buttons,8); Notify('a'); break;
             case 
    235buttons[0]=13Serial.write(buttons,8); Notify('a'); break;
             
             case 
    181buttons[0]=12Serial.write(buttons,8); bc(true); Notify('a'); break;
             case 
    182buttons[0]=12Serial.write(buttons,8); bc(true); Notify('a'); break;
             case 
    183buttons[0]=12Serial.write(buttons,8); bc(true); Notify('a'); break;
             case 
    184buttons[0]=12Serial.write(buttons,8); bc(true); Notify('a'); break;
             case 
    185buttons[0]=12Serial.write(buttons,8); bc(true); Notify('a'); break;
             
             case 
    0buttons[0]=11Serial.write(buttons,8); bc(false); Notify('a'); break;
           }
            
    delay(50); // Пауза между нажатиями
          
    }  
      }    


    void loop()  

       
    joystik(); //return;
       
    RadioCmd();
       
      if ((
    millis()-stime)>2000//запуск процедур по таймеру
      
    {    
        
    stime millis();
        
    autolight();
        
    cam();
        
    ReadTemp();
        
    voltmetr();
        
    buttons[0]=0;
        
    Serial.write(buttons,8);
      }


    //****************обработчик прерывания******************** 
    ISR(TIMER2_OVF_vect)  

        
    TCNT2 tcnt2;
        
    remoteCount++;
        if (
    remoteCount 100000)
        {
          
    remoteOn false;
          
    remoteCount 0;
        }
        
      if (
    tempSens==85) {bytes[0]=100buttons[4]=50;}
      else
      {
        if (
    tempSens <= 30) {bytes[0]=30;buttons[4]=10;}
        if ((
    tempSens 30) && (tempSens <= 40)) {bytes[0]=50buttons[4]=25;}
        if ((
    tempSens 40) && (tempSens <= 50)) {bytes[0]=100;buttons[4]=45;}
        if ((
    tempSens 50) && (tempSens <= 60)) {bytes[0]=150;buttons[4]=60;}
        if ((
    tempSens 60) && (tempSens <= 70)) {bytes[0]=200;buttons[4]=80;}
        if (
    tempSens 70) {bytes[0]=250;buttons[4]=100;}
      }
     
      
    pwm_time++;       
      if(
    bytes[0] > pwm_time)  D13_High; else D13_LOW;



    //========= Устанавливаем частоту радио

    void SetRF(int RF)
    {
      
    word f=word(RF);
      
    EEPROM.write(0,highByte(RF)); EEPROM.write(1,lowByte(RF)); RF += 107;
      
    digitalWrite(CEHIGH);
      
    writeToLM(byte(RF));
      
    writeToLM(byte(RF >> 8));
      
    writeToLM(135);
      
    digitalWrite(CELOW);
    }

    //======== Пишем частоту в LM7001

    void writeToLM(byte ByteToSend)
    {
    int D
    int D1;

      
    delayMicroseconds(LM_DELAY);
      for (
    int x=0x<=7x++)
        {
          
    // Выставляем DA
          
    ByteToSend >> 1;
          
    D1 << 1;
          if (
    ByteToSend==D1)  // Значит был 0
            
    {
              
    digitalWrite(DA,LOW);
            }
          else
            {
              
    digitalWrite(DA,HIGH);         
            }  
          
    // Формируем строб CL  
          
    digitalWrite(CLHIGH);
          
    delayMicroseconds(LM_DELAY);
          
    digitalWrite(CL,LOW);
          
    delayMicroseconds(LM_DELAY);  
          
    ByteToSend ByteToSend >> 1;    
        }
      
    delayMicroseconds(LM_DELAY);
    }

    void SendOK()
    {
      
    Serial.println("OK");
    }

    void SendERR()
    {
      
    Serial.println("ER");

    Как только раскоментирую return:
    PHP код:
    joystik(); //return; 
    кнопки оживают. Включаю процедуры по таймеру, все писец - срабатывание кнопок через раз.
    Последний раз редактировалось BlkDem; 18.05.2011 в 11:18.

Страница 28 из 57 ПерваяПервая ... 182223242526272829303132333438 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •