Я бы драйвер свежий поставил для начала
Я бы драйвер свежий поставил для начала
О, как. Спасибо.
BlkDem, а с каким скетчем у тебя не обрабатываются нажатия?
Скетчи все более или менее работают. Грабли (переустановка драйвера на свежий не помогла) наступают, когда нажимаешь рулевую кнопку в тот момент, когда контроллер что-то пишет в порт. Тогда не срабатывает.
Можно отключить контроллер от компа, но это тоже не помогает.
Затыки возникают регулярно.
Я уже думаю на прерывание кнопки рулевые повесить.
Может быть у тебя еще подключено по USB FTDI устройство
Какая операционка? какой версии драйвер?
Ось - ХП сп3. Драйвер их шапки темы про компилятор (кста, там бы ссылку не помешало обновить на 0022).
Дело не в компе. Либо я где-то туплю со скетчем, либо я слишком многого хочу от контроллера. У меня две кнопки управляют радиоприемником (станция вверх, станция вниз), т.е. даже тогда, когда компьютер полностью отключен. Кнопка "вниз" - это короткое, т.е. вообще без сопротивления, но даже она спотыкается. Т.е. ошибка замера сопротивления не при чем. Затык именно при синхронном выполнении двух операций: нажатие рулевой кнопки и запись в порт...
Завтра выложу скетч. Глянете опытным взглядом.
зы: только сейчас вспомнил. я же 0018-ым компилятором прошивал ардуину. Может повлиять?
Собственно, завтра проверю.
Дорогие друзья! Помогите решить следующую проблему.
Имеем штатные рулевые кнопки на резистивной матрице, которая подключена к арудуине. Имеем скетч:
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.
Проще резистивные кнопки объединить, так как они все равно не пересекаются. Попробуй подключи параллельно
Я так и сделал, но мне нужно, чтобы при разных значениях на ЦАП был один результат.
Т.е.
Подключил резистор 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.
Поколдовал я еще малость. Не помогает. Логика прежняя: отключаешь функции, вызываемые по таймеру, кнопки работают так, как-будто они родные.
Вот скетч:
Как только раскоментирую return: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_dt1, res_dt, res_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[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };
int StList[] = {973, 1074, 1005, 1011, 1026, 1030, 1040, 1044, 1050, 1055, 1062, 989};
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_time, stime;
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(remotePin, OUTPUT);
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(CE, OUTPUT);
pinMode(CL, OUTPUT);
pinMode(DA, OUTPUT);
pinMode(back_cam, INPUT); //камера ЗХ
pinMode(speakerPin, OUTPUT); //спикер
digitalWrite(2, HIGH);
// Да будет радио сразу!
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(hA, lA);
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.write( buttons,8);
delay(10);
buttons[6]=0;
Serial.write( buttons,8);
//Serial.println("on");
}
if(temp==LOW && cam_status==255)
{
//clear_buf();
cam_status=0;
buttons[6]=110;
Serial.write( buttons,8);
delay(10);
buttons[6]=0;
Serial.write( buttons,8);
//Serial.println("off");
}
}
void Notify(byte Note)
{
for (int j=0;j<=8;j++) { // проверяем - это нота?
if (names[j] == Note) { // ага - нота!
for( int i=0; i<50; i++ ) { // проигрываем ноту 50 раз
digitalWrite(speakerPin, HIGH);
delayMicroseconds(tones[j]);
digitalWrite(speakerPin, LOW);
delayMicroseconds(tones[j]);
}
}
}
}
void ReadTemp()
{
switch(tempSensor.isValid())
{
case 1:
//Serial.println("Invalid CRC");
buttons[2]=111; tempSens = 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=0; SetRF(StList[0]);}
}
else
{
if (StID > 0)
{
StID--; SetRF(StList[StID]);
}
else
{
if (StID==0)
{
StID=11; SetRF(StList[StID]);
}
}
}
delay(500);
}
void RadioCmd()
{
int inRF;
byte p[3];
int t;
// Длина команды 8 байт, формат:
// rfXXXXX<cr>
t = Serial.available();
if (t >= 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=3; x>=0; x--)
{
inRF += (int(Serial.read())-48) * pow(10, x);
}
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 (t > 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 212: buttons[0]=15; Serial.write(buttons,8); Notify('a'); break;
case 213: buttons[0]=15; Serial.write(buttons,8); Notify('a'); break;
case 214: buttons[0]=15; Serial.write(buttons,8); Notify('a'); break;
case 211: buttons[0]=15; Serial.write(buttons,8); Notify('a'); break;
case 215: buttons[0]=15; Serial.write(buttons,8); Notify('a'); break;
case 245:buttons[0]=14; Serial.write(buttons,8); Notify('a'); break;
case 246:buttons[0]=14; Serial.write(buttons,8); Notify('a'); break;
case 247:buttons[0]=14; Serial.write(buttons,8); Notify('a'); break;
case 244:buttons[0]=14; Serial.write(buttons,8); Notify('a'); break;
case 232: buttons[0]=13; Serial.write(buttons,8); Notify('a'); break;
case 231: buttons[0]=13; Serial.write(buttons,8); Notify('a'); break;
case 233: buttons[0]=13; Serial.write(buttons,8); Notify('a'); break;
case 234: buttons[0]=13; Serial.write(buttons,8); Notify('a'); break;
case 235: buttons[0]=13; Serial.write(buttons,8); Notify('a'); break;
case 181: buttons[0]=12; Serial.write(buttons,8); bc(true); Notify('a'); break;
case 182: buttons[0]=12; Serial.write(buttons,8); bc(true); Notify('a'); break;
case 183: buttons[0]=12; Serial.write(buttons,8); bc(true); Notify('a'); break;
case 184: buttons[0]=12; Serial.write(buttons,8); bc(true); Notify('a'); break;
case 185: buttons[0]=12; Serial.write(buttons,8); bc(true); Notify('a'); break;
case 0: buttons[0]=11; Serial.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]=100; buttons[4]=50;}
else
{
if (tempSens <= 30) {bytes[0]=30;buttons[4]=10;}
if ((tempSens > 30) && (tempSens <= 40)) {bytes[0]=50; buttons[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(CE, HIGH);
writeToLM(byte(RF));
writeToLM(byte(RF >> 8));
writeToLM(135);
digitalWrite(CE, LOW);
}
//======== Пишем частоту в LM7001
void writeToLM(byte ByteToSend)
{
int D;
int D1;
delayMicroseconds(LM_DELAY);
for (int x=0; x<=7; x++)
{
// Выставляем DA
D = ByteToSend >> 1;
D1 = D << 1;
if (ByteToSend==D1) // Значит был 0
{
digitalWrite(DA,LOW);
}
else
{
digitalWrite(DA,HIGH);
}
// Формируем строб CL
digitalWrite(CL, HIGH);
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");
}
кнопки оживают. Включаю процедуры по таймеру, все писец - срабатывание кнопок через раз.PHP код:
joystik(); //return;
Последний раз редактировалось BlkDem; 18.05.2011 в 11:18.
Эту тему просматривают: 2 (пользователей: 0 , гостей: 2)