При чем тут Atmega? Ножка 25 TEST микросхемы FT232RL
Ты что через строчку читаешь , я уже устал писать одно и тоже начиная с 235 сообщения
Вид для печати
При чем тут Atmega? Ножка 25 TEST микросхемы FT232RL
Ты что через строчку читаешь , я уже устал писать одно и тоже начиная с 235 сообщения
Мда... реально я туплю.
Я замкнул их вроде всё работает как надо, даже без хаба.
Chip добрый вечер не подскажешь у меня на руле две кнопки вверх вниз кнопка муте и крутилка звука реостатная которая при полном выкручивании в ноль еще и выключает всю музыку, можно это все подключить через аурдино ? И хочу сделать регулировку яркости монитора на аурдино через датчик света как у вас написано , для этого всего хватит одной аурдино или надо две ставить ? Спасибо . P.s не пинайте сильно я только начинаю проект.
Одной хватит
Насколько я помню в CF ничего не менялось.
Значения смотри в конструкциях Send.
Изменение громкости делает SoundSet. Если работаем под Win7 то лучше заменить на:
Список горячих кнопок ЦФ тут: Вложение 11633.PHP код:
; изменение громкости - меньше
Send !5
; изменение громкости - больше
Send !4
Только так и получилось заставить регулировать звук кнопками на выходе SPDIF.
У меня на 7 ке с звуковухой Asus Xonar DX2 мискеры не работают управлять можно только через сам Asus
раньше на ХP такого не было :(
Подскажите, можно HotKey.exe подружить c Arduino Uno?
Читай внимательно нет!
мммда, спасибо.....буду обдуывать дальше)
здрасти
а может кто-нить уже делал полностью автономное устройство???
допустим: резистивная клава->ардуино->IR передатчик
У меня сейчас радио автономно (с рулевых кнопок, через ардуино) работает. А в чем вопрос-то?
поделись как реализовано??
Собран приемник по мотивам темы: http://www.compcar.ru/forum/showthread.php?t=4665
Адруина управляет приемником и обрабатывает нажатие кнопок.
Питается контроллер от, грубо говоря, аккумулятора.
Как я понимаю, тебе нужно объединить в одном скетче управление рулевыми кнопками и работу с ИК-сенсором. Готовое решение, думаю, никто не даст, т.к. задача нормально не сформулирована.
зы: мой скетч тебе ничего не даст совершенно. Он заточенный под мои нужды.
ззы: ты магнитолой управлять хочешь?
да
хочу управлять обычной автомагнитолой по IR....
проще говоря цепляем ардуину к кнопкам руля....при нажатии кнопок ардуина выдает последовательность IR сигнала на светодиод....светодиод направлен на магнитолу...
может я велик изобретаю и все давно придумано до меня?
Однозначно, придумано. Погугли.
Что за магнитола? Проводные пульты к ней не подключаются?
майфун филипс...проводные не подключить-нет интерефейса в ней
гуглил...мож канеш неправильно гуглил....
работает....RC6 протокол....
Ну тогда можно сделать.
можно..сделал...
У меня хрень получается забиваю кнопки в конфиг запускаю hotkey. и ничего не происходит но если развернуть хоткей то в левом верхнем углу пишутся значения нажатых кнопок которые совпадают с забитыми в конфиг.
Удали конфиг, сконфигурируй по новой
Спасибо помогло . Может почистишь конфиг. программы в шапке ?
Вот и я созрел до своего подхода к обработке нажатий на кнопки. Правда я использую их в связке кнопка-ардуино-ИК диод для управления магнитолой. Почему не устроили скетчи в теме?
1 - пропуски нажатий, 2 - иногда получаем неверное значение, вплоть до другой кнопки, 3 - повторные срабатывания.
Для исследования что же происходит при нажатии соорудил небольшой скетч (его же использую в основной программе с добавкой функции на передачу сигнала ИК.
Смысл его - это 5 измерений через определенный интервал, отбрасывание значения ненажатой кнопки (а это как оказалось тоже имеет место), вычисление среднего значения. Как можно заметить, первое измерение в вычислениях не участвует, т.к. в моем случае оно в 90% случаев оказывалось слишком сильно отличающимся от номинального.PHP код:
#define PIN 6 //номер аналогового порта
int sensorValue[5]; // сопротивление кнопки
byte count=5;
int sensorVal, sum;
void setup() {
Serial.begin(9600);
}
void loop(){
if (analogRead(PIN) < 950){
sensorValue[0] = analogRead(PIN); // прочитать данные АЦП
delay(10);
sensorValue[1] = analogRead(PIN); // прочитать данные АЦП
delay(10);
sensorValue[2] = analogRead(PIN); // прочитать данные АЦП
delay(10);
sensorValue[3] = analogRead(PIN); // прочитать данные АЦП
delay(10);
sensorValue[4] = analogRead(PIN); // прочитать данные АЦП
count = 0;
sum = 0;
for (byte i = 0; i < 5; i++) {
if (sensorValue[i] != 1023) {
sum = sum + sensorValue[i];
count++;
}
sensorVal = sum / count;
}
Serial.println(sensorValue[0],DEC);
Serial.println(sensorValue[1],DEC);
Serial.println(sensorValue[2],DEC);
Serial.println(sensorValue[3],DEC);
Serial.println(sensorValue[4],DEC);
Serial.print("R=");
Serial.println(sensorVal,DEC);
Serial.println("End");
}
}
С таким алгоритмом программа у меня работает совершенно без нареканий. Готов к критике и вопросам:)
Попробую твой скетч. У меня тоже к алгоритму из шапки есть серьезные вопросы.
Несколько раз переписывал по-своему, но многократный опрос не пробовал.
Супер. А может поделишься кусочком скетча по отправке сигнала, а то у меня проблемы какие то непонятные с этим.
Да пожалуйста, если это чем то поможет.
Этот кусок нужно вставить вместо "принтов".PHP код:
if (sensorValue >423 && sensorValue < 443) {
irsend.sendNEC(0x807F807F, 32); // NEC code >>|
}
if (sensorValue >901 && sensorValue < 921) {
irsend.sendNEC(0x807F827D, 32); // NEC code vol+
}
if (sensorValue >863 && sensorValue < 883) {
irsend.sendNEC(0x807F40BF, 32); // NEC code vol-
}
if (sensorValue >773 && sensorValue < 793) {
irsend.sendNEC(0x807FE21D, 32); // NEC code source
}
delay(200); // Пауза между нажатиями
И не забудь прицепить библиотеку #include <IRremote.h>.
"Ворота" для измеряемых значений у меня довольно таки большие, можно и уменьшить.
Экспериментальным путем были установлены некоторые проблемы обработки нажатия кнопок.
Все работает очень стабильно и четко, если отключить в скетче функции, выполняющиеся по таймеру и пишущие что-то в порт.
Если контроллер что-то пишет в порт, то, соответственно, нажатие кнопок не обрабатывается. Что-то с этим можно сделать?
Я бы драйвер свежий поставил для начала
О, как. Спасибо.
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); }
Как объеденить в скетче, а то у меня не выходит ничего, работает или то, или другое, вместе не хотят :(
Проще резистивные кнопки объединить, так как они все равно не пересекаются. Попробуй подключи параллельно
Я так и сделал, но мне нужно, чтобы при разных значениях на ЦАП был один результат.
Т.е.
Подключил резистор 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 );//
Как это в скетче обеденить??
Поколдовал я еще малость. Не помогает. Логика прежняя: отключаешь функции, вызываемые по таймеру, кнопки работают так, как-будто они родные.
Вот скетч:
Как только раскоментирую 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;