Еще раз о связи с ПК

npu3paks
npu3paks аватар
Offline
Зарегистрирован: 02.11.2012

Просмотрел вроде весь форум но так и не получил для себя адекватного ответа.

Помогите разобраться новичку.

1. Как ардуинкой отслеживать нажатие клавиш на ПК? в основном нажатие стрелок и пробела и какая-то обработка при нажатии определенной клавиши. При этом хотелось бы не вызывать программы и терминалы, а просто при подключении по USB перехватывать (или в теневом режиме) получать код нажатой клавиши. Или это требует запуска какой-то внешней программы?

2. К этому следует и вопрос портирования - возможность подключения платы к любому ПК с сохранением работоспособности и не устанавливать ПО.

3. Микросхема FTDI помимо моста USB-UART поддерживает работу с SPI-памятью. Возможно ли получить доступ с Ардуинки к этой памяти? И возможно ли с этой памяти загружать требуемые драйвера и подпрограмки на ПК как с внешнего диска?

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

снова новички с адекватными вопросами...

1. Кнопа "расшарить клаву для всех" в системе отсутвует - делаем выводы, почему.

2. лепите железный логгер в разрез кабеля клавы и подслушиваете чужие пин-коды.

3. возможно.

ramon_sobaka
Offline
Зарегистрирован: 24.10.2012

По поводу пукта 1- можно как вариант написать программу которая будет отслеживать нажатие клавиш на клавиатуре ПК и отправлять на порт команду... получив опредильонную команду с порта ардуина выполнит некоторое действие. (ету программу можно поставить в автозагрузку в фоновом режиме при старте ОС) Без такого дополнительного ПО нужно копать в сторону драйвера платы ардуино установленого  на ПК и драйвера клавиатуры.

npu3paks
npu3paks аватар
Offline
Зарегистрирован: 02.11.2012

ramon_sobaka пишет:

По поводу пукта 1- можно как вариант написать программу которая будет отслеживать нажатие клавиш на клавиатуре ПК и отправлять на порт команду... получив опредильонную команду с порта ардуина выполнит некоторое действие. (ету программу можно поставить в автозагрузку в фоновом режиме при старте ОС) Без такого дополнительного ПО нужно копать в сторону драйвера платы ардуино установленого  на ПК и драйвера клавиатуры.

Т.е прога должна определять на какой порт подключена ардуина и посылать туда команду - но как  по запросу или постоянно??

npu3paks
npu3paks аватар
Offline
Зарегистрирован: 02.11.2012

Клапауций пишет:

2. лепите железный логгер в разрез кабеля клавы и подслушиваете чужие пин-коды.

3. возможно.

как раз пин-коды свои и хотелось без наворотов типа логгеров т.к программа дешифровки займет больше чем основная прога.

3.возможно - возможно что? кто-то делал что бы посмотреть как это в кодах?

ramon_sobaka
Offline
Зарегистрирован: 24.10.2012

в С#  можеш зделать перебор портов и оприделение на каком порту ардуина, потом в потоке зделать обработчик который при нажати определонной клавиши будет на етот порт посилать команду - просто текст например: pressedup, presseddown, pressedleft.... а в ардуине уже зделать программу которая примет етот масив и сравнит ...если ето масив равен pressedup то зделать то, если равен presseddown то зделать другое...

npu3paks
npu3paks аватар
Offline
Зарегистрирован: 02.11.2012

Я нашел кто мне напишет прогу для винды, которая будет опрашивать клавиши и пересылать в компорт 

Но посоветуйте как написать в ардуине опрос этого порта

Looka
Offline
Зарегистрирован: 24.04.2012

Посмотрите стандартные примеры, например так

 

 

int incomingByte = 0;   // переменная для хранения полученного байта
 
void setup() {
    Serial.begin(9600); // устанавливаем последовательное соединение
}
 
 
void loop() {
    if (Serial.available() > 0) {  //если есть доступные данные
        // считываем байт
        incomingByte = Serial.read();
 
        // отсылаем то, что получили
        Serial.print("I received: ");
        Serial.println(incomingByte, DEC);
    }
}
 
Клапауций
Offline
Зарегистрирован: 10.02.2013

npu3paks пишет:

3.возможно - возможно что? кто-то делал что бы посмотреть как это в кодах?

как-то так 

http://www.irongeek.com/i.php?page=security/homemade-hardware-keylogger-phukd

http://habrahabr.ru/post/153571/

http://habrahabr.ru/company/dsec/blog/141838/

npu3paks
npu3paks аватар
Offline
Зарегистрирован: 02.11.2012

Клапауций пишет:

npu3paks пишет:

3.возможно - возможно что? кто-то делал что бы посмотреть как это в кодах?

как-то так 

http://www.irongeek.com/i.php?page=security/homemade-hardware-keylogger-phukd

http://habrahabr.ru/post/153571/

http://habrahabr.ru/company/dsec/blog/141838/

Это не овсем то что нужно - слишком дорого и наворочено чтобы просто тестить с клавиатуры ( со своей) нажатие клавиш 

Больше интересует именно применение флеш-памяти на FTDI

npu3paks
npu3paks аватар
Offline
Зарегистрирован: 02.11.2012

Looka пишет:

Посмотрите стандартные примеры, например так

int incomingByte = 0;   // переменная для хранения полученного байта

void setup() {
    Serial.begin(9600); // устанавливаем последовательное соединение
}
void loop() {
    if (Serial.available() > 0) {  //если есть доступные данные
        // считываем байт
        incomingByte = Serial.read();
 
        // отсылаем то, что получили
        Serial.print("I received: ");
        Serial.println(incomingByte, DEC);
    }
}

а надо использовать serial.flush() ? чтобы почистить или обнулить буфер компорта?

ramon_sobaka
Offline
Зарегистрирован: 24.10.2012


int led = 12;
int inSize = 0;
char str[128];
void setup ()
{
pinMode(led, OUTPUT);
Serial.begin(9600);
}

void loop()
{
inSize=0;
memset(str,'\0',128);
delay(100);
if (Serial.available()>0)
{
inSize = Serial.available();
for (int i = 0; i < inSize; i++)
{
str[i] = Serial.read();
}

if (strcmp(str,"on") == 0)
{
Serial.println("ON");
digitalWrite(led, HIGH);
}
else if (strcmp(str,"off") == 0)
{
Serial.println("OFF");
digitalWrite(led, LOW);
}
else if (strcmp(str, "hello") == 0)
{
Serial.println("Hello! My name is Arduin!");
}

 

Если на порт с ПК отправить слово ON - загорится диод на 12 пине (и назад на компор ардуино отправит подтверждение выполненого дейстива слово Оn - ето не обезательно), если на компорт с ПК отправить OFF - потухнет диод на 12 пине и подверждение отправит слово Офф... если с ПК на порт отправить слово hello то ардуина в ответ на ком порт отправит строку Hello! My name is Arduin! 

ramon_sobaka
Offline
Зарегистрирован: 24.10.2012

если к выше указаному коду добавить

}
else
{
Serial.println("Error command!");
}
}
}

когда ардуина получит команду которая не описана в коде то в ответ она отправит на компорт строку Error command!

Looka
Offline
Зарегистрирован: 24.04.2012

npu3paks пишет:

Looka пишет:

Посмотрите стандартные примеры, например так

int incomingByte = 0;   // переменная для хранения полученного байта

void setup() {
    Serial.begin(9600); // устанавливаем последовательное соединение
}
void loop() {
    if (Serial.available() > 0) {  //если есть доступные данные
        // считываем байт
        incomingByte = Serial.read();
 
        // отсылаем то, что получили
        Serial.print("I received: ");
        Serial.println(incomingByte, DEC);
    }
}

а надо использовать serial.flush() ? чтобы почистить или обнулить буфер компорта?

От Вас зависит, от логики того что пишете. 
Если с читого листа начать и забыть что было раньше то надо. 

 

 

npu3paks
npu3paks аватар
Offline
Зарегистрирован: 02.11.2012

В принципе надо опрашивать нажатие стрелок и пробела..

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

"      Serial.flush()

Ожидает окончания передачи исходящих данных (до версии Arduino 1.0 функция очищала буфер последовательного соединения).    "

очистится или нет?

Looka
Offline
Зарегистрирован: 24.04.2012

Лень копаться в исходниках, но насколько я понимаю, после чтения обнулять не надо, повторно тоже самое не считаете.  Там а-ля стек организован.

А флеш обнуляет стек, что дает уверенности что никакого наследства не досталось.

npu3paks
npu3paks аватар
Offline
Зарегистрирован: 02.11.2012

Looka пишет:

Посмотрите стандартные примеры, например так

int incomingByte = 0;   // переменная для хранения полученного байта

 
void setup() {
    Serial.begin(9600); // устанавливаем последовательное соединение
}
 
void loop() {
    if (Serial.available() > 0) {  //если есть доступные данные
        // считываем байт
        incomingByte = Serial.read();
        // отсылаем то, что получили
        Serial.print("I received: ");
        Serial.println(incomingByte, DEC);
    }
}
Попробовал этот скетч..
откомпилился и загрузился но при работе пишет
 
avrdude: stk500_getsync(): not in sync: resp=0x00
 
в чем трабла?

 

npu3paks
npu3paks аватар
Offline
Зарегистрирован: 02.11.2012

Попробовал и этот 

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

avrdude: stk500_getsync(): not in sync: resp=0x00