Форум
 

Вернуться   Форум "Фрикер Клуб" - кодграббер своими руками > Основной раздел > Статьи

Важная информация

Ответ
 
Опции темы Опции просмотра
Старый 25.10.2013, 17:38   #871
AVL Меню Пользователя
Вступил в клуб
 
Аватар для AVL
 
Регистрация: 18.02.2011
Сообщений: 76
По умолчанию Re: Starduino (или Arduino + Starline)

Подкиньте, пожалуйста, приём Килога.
Сигнал Килога через сквозной канал Ардуины проходит без изменений, а пробую разные скетчи заливать, нарытые в сети, то нет у меня приёма
Спасибо!
__________________
Научу катататься на горных лыжах взамен обучения программированию.
AVL вне форума   Ответить с цитированием
Старый 25.10.2013, 18:44   #872
DIVER_SANT Меню Пользователя
Фрикер
 
Аватар для DIVER_SANT
 
Регистрация: 27.03.2011
Сообщений: 2,330
По умолчанию Re: Starduino (или Arduino + Starline)

Вот
Код:
#include "math.h" 


#define txPin 8
#define rxPin 7
#define signalPin 6

int lastRxValue = 0;
int tempRxValue = 0;
unsigned long lastRxTime = 0;
unsigned long tempTime = 0;
unsigned long difTime = 0;
boolean bValidPacket = false;
int decodeMethod = 1; //0 real - as in manual, 1 inver as Oleg do


//Global vars end
void send_meander(int time){
  digitalWrite(txPin, HIGH);
  delayMicroseconds(time);
  digitalWrite(txPin, LOW);
  delayMicroseconds(time);
}
//keelog start
int keelog_state = 0;
int keelogCounter = 0;
byte keelog_code[9];

void keelog_vardump(){
  if(decodeMethod == 0){
    Serial.println(" - keelog origin - ");
  }
  else{
    Serial.println(" - keelog invert - ");
  }
  Serial.print(keelog_code[0], HEX);
  Serial.print(keelog_code[1], HEX);
  Serial.print(keelog_code[2], HEX);
  Serial.print(keelog_code[3], HEX);
  Serial.println("-hop");
  Serial.print(keelog_code[4], HEX);
  Serial.print(keelog_code[5], HEX);
  Serial.print(keelog_code[6], HEX);
  Serial.println("-fix");
  Serial.print(keelog_code[7], HEX);
  Serial.println("-btn");
  Serial.print(keelog_code[8], HEX);
  Serial.println("-dop");
  
  /*for(int i = 0; i<9; i++){
    Serial.print(keelog_code[i], HEX);
    Serial.print(" - ");
  }*/
  keelog_send(keelog_code);
  digitalWrite(signalPin, HIGH);
  delay(100);
  digitalWrite(signalPin, LOW);
  keelog_state = 0;
  for(int i = 0; i<9; i++){
    keelog_code[i]=0;
  }
}
void keelog_send(byte* keelog_code){
  Serial.println("- sending keelog -");
  for(int i = 0; i<9; i++){
    Serial.print(keelog_code[i], HEX);
    Serial.print(" - ");
  }
  for(int i = 0; i<11; i++){//посылаем преамблу
    send_meander(400);
  }
  digitalWrite(txPin, HIGH);
  delayMicroseconds(400);
  digitalWrite(txPin, LOW);
  delayMicroseconds(4000);//посылаем хедер
  
  for( int i = 0; i<9; i++){
    if(decodeMethod==1){
      for(int i2 = 7;i2>=0;i2--){
        if(bitRead(keelog_code[i], i2)){
          digitalWrite(txPin, HIGH);
          delayMicroseconds(400);
          digitalWrite(txPin, LOW);
          delayMicroseconds(2*400);
        }
        else{
          digitalWrite(txPin, HIGH);
          delayMicroseconds(2*400);
          digitalWrite(txPin, LOW);
          delayMicroseconds(400);
        }
      }
    }
    else{
        for(int i2 = 0;i2<8;i2++){
          if(!bitRead(keelog_code[i], i2)){
            digitalWrite(txPin, HIGH);
            delayMicroseconds(400);
            digitalWrite(txPin, LOW);
            delayMicroseconds(2*400);
          }
          else{
            digitalWrite(txPin, HIGH);
            delayMicroseconds(2*400);
            digitalWrite(txPin, LOW);
            delayMicroseconds(400);
          }
       } 
    }
    
  }
}
void keelog_get(){
    bValidPacket = false;
    if(keelog_state==0){//ждем преамбулу и хедер
      if(difTime > 280 && difTime < 620 && lastRxValue != tempRxValue){
        keelogCounter ++;
      }
      else{
        if(keelogCounter==23){
          if(difTime>2800 && difTime<6200 && lastRxValue == 0){
            keelog_state=1;
          }
        }
       keelogCounter = 0;
      }
    }
    else if(keelog_state==1){// получаем биты
      if(difTime > 560 && difTime < 1240 && lastRxValue == 1){// получили 1
        if(decodeMethod==0){
          keelog_code[round(keelogCounter/8)] = (keelog_code[round(keelogCounter/8)]>>1)|B10000000;
        }
        else{
          keelog_code[round(keelogCounter/8)] = (keelog_code[round(keelogCounter/8)]<<1)|B00000000;
        }
        bValidPacket = true;
      }
      else if(difTime > 280 && difTime < 620 && lastRxValue == 1){
        if(decodeMethod==0){
          keelog_code[round(keelogCounter/8)] = (keelog_code[round(keelogCounter/8)]>>1)|B00000000;
        }
        else{
          keelog_code[round(keelogCounter/8)] = (keelog_code[round(keelogCounter/8)]<<1)|B00000001;
        }
        bValidPacket = true;
      }
      else if(lastRxValue == 0){
      }
      else{
        keelog_state=1;
        keelogCounter = 0;
      }
      
      if(bValidPacket){
        keelogCounter++;
        if(keelogCounter==66){
          keelog_vardump();
          keelogCounter = 0;
          keelog_state = 0;
        }
      }
    }
}
//keelog end


void setup() {                
  pinMode(txPin, OUTPUT);
  pinMode(rxPin, INPUT);
  pinMode(signalPin, OUTPUT);
  //
  Serial.begin(9600);
  Serial.println("start");
  lastRxValue = digitalRead(rxPin);
  lastRxTime = micros();
  
  //attachInterrupt(0, grab, CHANGE);
}

void loop() {
  tempRxValue = digitalRead(rxPin);
  
  if(tempRxValue != lastRxValue){
    tempTime = micros();
    difTime = tempTime - lastRxTime;
    keelog_get();  
    lastRxTime = tempTime;
    lastRxValue = tempRxValue;
  }
}
__________________
Правильно поставленный вопрос-на половину полученный ответ;)
++++++++++++++++++++++++++++++++++++++
[url]http://www.youtube.com/watch?v=ktnn-s3ebzw[/url]
DIVER_SANT вне форума   Ответить с цитированием
Старый 26.10.2013, 09:29   #873
AVL Меню Пользователя
Вступил в клуб
 
Аватар для AVL
 
Регистрация: 18.02.2011
Сообщений: 76
По умолчанию Re: Starduino (или Arduino + Starline)

Сасибо, РАБОТАЕТ!

start
- keelog invert -
F2C3A387-hop
8FB6AE-fix
4-btn
0-dop
- sending keelog -
F2 - C3 - A3 - 87 - 8F - B6 - AE - 4 - 0 - - keelog invert -
F2C3A387-hop
8FB6AE-fix
4-btn
0-dop
- sending keelog -
F2 - C3 - A3 - 87 - 8F - B6 - AE - 4 - 0 - - keelog invert -
5790FEA3-hop
8FB6AE-fix
4-btn
0-dop
- sending keelog -
57 - 90 - FE - A3 - 8F - B6 - AE - 4 - 0 - - keelog invert -
5790FEA3-hop
8FB6AE-fix
4-btn
0-dop
- sending keelog -
57 - 90 - FE - A3 - 8F - B6 - AE - 4 - 0 - - keelog invert -
A6C16C4B-hop
8FB6AE-fix
4-btn
0-dop
- sending keelog -
A6 - C1 - 6C - 4B - 8F - B6 - AE - 4 - 0 - - keelog invert -
A6C16C4B-hop
8FB6AE-fix
4-btn
0-dop
- sending keelog -
A6 - C1 - 6C - 4B - 8F - B6 - AE - 4 - 0 - - keelog invert -
746693F3-hop
8FB6AE-fix
2-btn
0-dop
- sending keelog -
74 - 66 - 93 - F3 - 8F - B6 - AE - 2 - 0 - - keelog invert -
746693F3-hop
8FB6AE-fix
2-btn
0-dop
- sending keelog -
74 - 66 - 93 - F3 - 8F - B6 - AE - 2 - 0 -
__________________
Научу катататься на горных лыжах взамен обучения программированию.
AVL вне форума   Ответить с цитированием
Старый 27.11.2013, 00:36   #874
dimitri Меню Пользователя
Гость клуба
 
Регистрация: 03.08.2011
Сообщений: 3
По умолчанию Re: Starduino (или Arduino + Starline)

доброй времени суток

кто небуть подскажите как же послать принятый код код а то уже голова взорвиется


заранее спасибо

Добавлено через 57 минут
я принимаю коды если провильно вырожаюсь но не могу послать обратно

сигналка у меня аллигатор д-910

пожалуиста помогите

:h elllp:
dimitri вне форума   Ответить с цитированием
Старый 27.11.2013, 03:56   #875
DIVER_SANT Меню Пользователя
Фрикер
 
Аватар для DIVER_SANT
 
Регистрация: 27.03.2011
Сообщений: 2,330
По умолчанию Re: Starduino (или Arduino + Starline)

а что толку что пошлете обратно-сигналка килок-надо или алго или с подменой кода делать
__________________
Правильно поставленный вопрос-на половину полученный ответ;)
++++++++++++++++++++++++++++++++++++++
[url]http://www.youtube.com/watch?v=ktnn-s3ebzw[/url]
DIVER_SANT вне форума   Ответить с цитированием
Старый 27.11.2013, 09:41   #876
Kurs Меню Пользователя
Вступил в клуб
 
Аватар для Kurs
 
Регистрация: 02.06.2012
Сообщений: 68
По умолчанию Re: Starduino (или Arduino + Starline)

Цитата:
Сообщение от dimitri
доброй времени суток

кто небуть подскажите как же послать принятый код код а то уже голова взорвиется


заранее спасибо

Добавлено через 57 минут
я принимаю коды если провильно вырожаюсь но не могу послать обратно

сигналка у меня аллигатор д-910

пожалуиста помогите

:h elllp:

Dimitri Не в обиду сказано. Сам не русский живу не в России. Неужели так тяжело проверить орфографию при помощи “Word” кнопка F7 перед написанием поста на форуме.
DIVER_SANT Правильно говорит. Можешь записать посылки своего аллигатора с брелка чтобы блок не слышал и выбросить в эфир при включенном блоке а что дальше. Какая цель. Как ты посылаешь?

Вот основной принцип посылки одного бита tahion описал вначале.

Код:
pinMode(8, OUTPUT);     
}

void loop() {
  digitalWrite(8, HIGH);
  delayMicroseconds(500);
  digitalWrite(8, LOW);
  delayMicroseconds(500);
}
Kurs вне форума   Ответить с цитированием
Старый 02.12.2013, 20:36   #877
7-clown Меню Пользователя
Вступил в клуб
 
Аватар для 7-clown
 
Регистрация: 10.05.2012
Сообщений: 41
По умолчанию Re: Starduino (или Arduino + Starline)

DIVER_SANT, "bitRead", описания функции не вижу, она стандартная?
__________________
«следуй за белым кроликом»
7-clown вне форума   Ответить с цитированием
Старый 03.12.2013, 07:59   #878
DIVER_SANT Меню Пользователя
Фрикер
 
Аватар для DIVER_SANT
 
Регистрация: 27.03.2011
Сообщений: 2,330
По умолчанию Re: Starduino (или Arduino + Starline)

Цитата:
Сообщение от 7-clown
DIVER_SANT, "bitRead", описания функции не вижу, она стандартная?

В каком тексте исходника?откуда взято?

Добавлено через 2 минуты
Вот -стандартная http://arduino.cc/en/Reference/bitRead

Добавлено через 23 минуты
Вот еще http://arduino.net.ua/Arduino_articl...y%20i%20bajty/
__________________
Правильно поставленный вопрос-на половину полученный ответ;)
++++++++++++++++++++++++++++++++++++++
[url]http://www.youtube.com/watch?v=ktnn-s3ebzw[/url]
DIVER_SANT вне форума   Ответить с цитированием
Старый 03.12.2013, 15:31   #879
7-clown Меню Пользователя
Вступил в клуб
 
Аватар для 7-clown
 
Регистрация: 10.05.2012
Сообщений: 41
По умолчанию Re: Starduino (или Arduino + Starline)

for(int i2 = 0;i2<8;i2++){
if(!bitRead(keelog_code[i], i2)){
digitalWrite(txPin, HIGH);
delayMicroseconds(400);
digitalWrite(txPin, LOW);
delayMicroseconds(2*400);


исходник из 872 поста
__________________
«следуй за белым кроликом»
7-clown вне форума   Ответить с цитированием
Старый 11.12.2013, 09:43   #880
Tttyyy Меню Пользователя
Вступил в клуб
 
Регистрация: 05.10.2013
Сообщений: 20
По умолчанию Re: Starduino (или Arduino + Starline)

Добрый день!
Есть ли пример реализации Came для ардуино?
прием/выброс/брут?

Добавлено через 15 минут
нашел пример реализации на ATmega8L
http://trashgate.net/forum/viewthread.php?thread_id=36


Цитата:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <stdlib.h>
#include <string.h>
#include <avr/eeprom.h>


#define RX_AM_PORT PORTD
#define RX_AM_DDR DDRD
#define RX_AM_PIN PIND
#define RX_AM PD2
#define RX_AM_STATE (RX_AM_PIN&(1<<RX_AM))

#define LED1 PD5
#define LED1_ON PORTD|=(1<<LED1)
#define LED1_OFF PORTD&=~(1<<LED1)

#define LED2 PD6
#define LED2_ON PORTD|=(1<<LED2)
#define LED2_OFF PORTD&=~(1<<LED2)

#define SW PC1
#define SW_ON PORTC|=(1<<SW)
#define SW_OFF PORTC&=~(1<<SW)

#define RT PD4
#define RT_HI PORTD|=(1<<RT)
#define RT_LO PORTD&=~(1<<RT)

#define BUT_GRAB PB1
#define BUT_GRAB_STATE !(PINB&(1<<BUT_GRAB))

#define BUT_SAVE PD7
#define BUT_SAVE_STATE !(PIND&(1<<BUT_SAVE))

#define BUT_BANK PB0
#define BUT_BANK_STATE !(PINB&(1<<BUT_BANK))

#define CAME_TE 320
#define NICE_TE 700
#define COUNT 5
#define DELAY 16 //ms

#define TIMER_DIV 50

unsigned char mem[10]={0x00,0x04,0x08,0x0c,0x10,0x14,0x18,0x1c,0x20,0x2 4}; // адресация ячеек памяти. 10 ячеек по 2 байта каждая
unsigned char data[3], bank;

volatile struct
{
volatile unsigned char state;
unsigned char data[3], dat_bit;
} came;


volatile struct
{
volatile unsigned char state;
unsigned char data[2], dat_bit;
} nice_flo;

volatile unsigned long time;
volatile unsigned int p0_len, p0_prev_len; //AM
volatile unsigned char am_process,type;

void clear_states0()
{
came.state=0;
nice_flo.state=0;
}

void blink1()
{
LED1_ON;
_delay_ms(300);
LED1_OFF;
}

void blink2()
{
LED2_ON;
_delay_ms(300);
LED2_OFF;
}

#define CM_MAX_TE (450/TIMER_DIV)
#define CM_MIN_TE (200/TIMER_DIV)
#define CM_MAX_BITS 12
#define CM24_MAX_BITS 24


void process_came()
{
unsigned char a, b;
switch(came.state)
{
case 0:
if(!RX_AM_STATE) break;
came.state=1;
break;

case 1: //start
if(RX_AM_STATE) break;
if(p0_len>CM_MIN_TE && p0_len<CM_MAX_TE)
{
came.dat_bit=0;
for(a=0; a<sizeof(came.data); a++) came.data[a]=0;
came.state=2;
} else came.state=0;

break;

case 2: //dat
if(RX_AM_STATE) break;

if(p0_prev_len<=CM_MAX_TE && p0_prev_len>=CM_MIN_TE &&
p0_len<=CM_MAX_TE*2 && p0_len>=CM_MIN_TE*2) b=0;
else
if(p0_prev_len<=CM_MAX_TE*2 && p0_prev_len>=CM_MIN_TE*2 &&
p0_len<=CM_MAX_TE && p0_len>=CM_MIN_TE) b=1;
else
{
came.state=0;
if(came.dat_bit==CM_MAX_BITS)
{
GICR = (0<<INT0); //сграбили и не слушаем эфир(запрещаем прерывание)
LED1_ON;
LED2_OFF;
came.state=3; //выставили состояние 3 которое значит что посылка принята
type=1;

}
break;
}

if(b) came.data[came.dat_bit/8]|=(1<<(came.dat_bit%8));
if(++came.dat_bit==CM24_MAX_BITS)
{
GICR = (0<<INT0); //сграбили и не слушаем эфир(запрещаем прерывание)
LED1_ON;
LED2_OFF;
came.state=3; //выставили состояние 3 которое значит что посылка принята
type=2;
}
break;
}
}

#define FL_MAX_TE (850/TIMER_DIV)
#define FL_MIN_TE (550/TIMER_DIV)
#define FL_MAX_BITS 12

void process_niceflo()
{
unsigned char a, b;

switch(nice_flo.state)
{
case 0:
if(!RX_AM_STATE) break;
nice_flo.state=1;
break;

case 1: //start
if(RX_AM_STATE) break;

if(p0_len>FL_MIN_TE && p0_len<FL_MAX_TE)
{
nice_flo.state=2;
nice_flo.dat_bit=0;
for(a=0; a<sizeof(nice_flo.data); a++) nice_flo.data[a]=0;
} else nice_flo.state=0;
break;

case 2: //dat
if(RX_AM_STATE) break;

if(p0_prev_len<=FL_MAX_TE && p0_prev_len>=FL_MIN_TE &&
p0_len<=FL_MAX_TE*2 && p0_len>=FL_MIN_TE*2) b=0;
else
if(p0_prev_len<=FL_MAX_TE*2 && p0_prev_len>=FL_MIN_TE*2 &&
p0_len<=FL_MAX_TE && p0_len>=FL_MIN_TE) b=1;
else
{
nice_flo.state=0;
break;
}

if(b) nice_flo.data[nice_flo.dat_bit/8]|=(1<<(nice_flo.dat_bit%8));
if(++nice_flo.dat_bit==FL_MAX_BITS)
{
GICR = (0<<INT0); //сграбили и не слушаем эфир(запрещаем прерывание)
LED1_ON;
LED2_OFF;
nice_flo.state=3;
type=2;
}
break;
}
}

#define CAME_TE 320
#define NICE_TE 700
#define COUNT 5

void data_send(unsigned char *data, unsigned char type)
{
SW_ON; // включаем передачу
signed char a,b;
switch(type)
{
case 1: // came 12
for(b=0; b<COUNT; b++){
//стартовый импульс
RT_HI;
_delay_us(CAME_TE);
RT_LO;
//
for(a=0; a<12; a++)
{
_delay_us(CAME_TE);
if(!(data[a/8]&(1<<(a%8)))) RT_HI;
_delay_us(CAME_TE);
RT_HI;
_delay_us(CAME_TE);
RT_LO;
}
_delay_ms(DELAY);
}
blink2();

break;

case 2: //came24
for(b=0; b<COUNT; b++){
//стартовый импульс
RT_HI;
_delay_us(CAME_TE);
RT_LO;
//
for(a=0; a<24; a++)
{
_delay_us(CAME_TE);
if(!(data[a/8]&(1<<(a%8)))) RT_HI;
_delay_us(CAME_TE);
RT_HI;
_delay_us(CAME_TE);
RT_LO;
}
_delay_ms(DELAY);
}
blink2();
break;

case 3: //nice 12
for(b=0; b<COUNT; b++){
//стартовый импульс
RT_HI;
_delay_us(NICE_TE);
RT_LO;
//
for(a=0; a<12; a++)
{
_delay_us(NICE_TE);
if(!(data[a/8]&(1<<(a%8)))) RT_HI;
_delay_us(NICE_TE);
RT_HI;
_delay_us(NICE_TE);
RT_LO;
}
_delay_ms(DELAY);

}
blink2();
break;
}
}


ISR(TIMER2_COMP_vect)
{
time++;
}

#define FILTER 20
#define FILTER_STEP 3
#define MAX_PULSE (20000/TIMER_DIV)

//AM
ISR(INT0_vect)
{
unsigned char s, a;
static unsigned long last_front;

if(am_process) return;
am_process=1;

s=RX_AM_STATE;
for(a=0; a<FILTER; a+=FILTER_STEP)
{
_delay_us(FILTER_STEP);
if(RX_AM_STATE!=s) goto _end;
}

p0_len=time-last_front;
last_front=time;

if(p0_len>MAX_PULSE) clear_states0();

sei();
process_came();
process_niceflo();

p0_prev_len=p0_len;

_end:
am_process=0;
}


void write2eeprom(unsigned char *data,unsigned char type,unsigned char bank)
{
unsigned char addr,count,a;

if(type==1 || type==3){
count=2;
}else{
count=3;
}
addr=mem[bank];
_delay_ms(200);
eeprom_write_byte ((uint8_t*)addr,type);
addr++;

for(a=0;a<count;a++)
{
eeprom_write_byte ((uint8_t*)addr,data[a]);
addr++;
}
addr=0;
blink2();
_delay_ms(500);
blink2();
_delay_ms(500);
blink2();
_delay_ms(500);
blink2();

}

void read_send_eeprom()
{
unsigned char mem_data[3],addr,i;
for(i=0;i<10;i++)
{
addr=mem[i];
type = eeprom_read_byte((uint8_t*)addr);
addr++;
mem_data[0] = eeprom_read_byte((uint8_t*)addr);
addr++;
mem_data[1] = eeprom_read_byte((uint8_t*)addr);
addr++;
mem_data[2] = eeprom_read_byte((uint8_t*)addr);

data_send(mem_data, type);
blink2();
_delay_ms(500);

}
}

int main(void)
{
SW_ON;
DDRD=(1<<RT)|(1<<LED1)|(1<<LED2);
DDRC=(1<<SW);
PORTB=(1<<BUT_GRAB)|(1<<BUT_BANK);
PORTD=(1<<BUT_SAVE);

TCCR2=(0<<WGM20)|(1<<WGM21)|(0<<CS22)|(1<<CS21)|(0 <<CS20);
OCR2=TIMER_DIV;
TCNT2=0x00;

TIMSK=(1<<OCIE2);
MCUCR=(0<<ISC01)|(1<<ISC00); // конфигурием обработку прерываний на INT0 по любому изменению
GIFR=(1<<INTF0);

sei();

bank=0;
while(1)
{
// разрешаем прерывания после нажатия кнопки
if(BUT_GRAB_STATE)
{
GICR=(1<<INT0);
SW_OFF; // даем минус на свитч для прослушивания эфира
LED2_ON; // длинный бип
}

if(BUT_SAVE_STATE)
{
SW_ON; // даем минус на свитч для передачи
read_send_eeprom();

}

while(came.state==3){
if(BUT_GRAB_STATE)
{
data_send(came.data,type);

}

if(BUT_BANK_STATE)
{
_delay_ms(500);
bank++;
if(bank==10){
bank=0;
blink2();
}

}

if(BUT_SAVE_STATE)
{
write2eeprom(came.data, type, bank);
clear_states0();
}
}

while(nice_flo.state==3)
{
if(BUT_GRAB_STATE)
{
data_send(nice_flo.data,type);
}

if(BUT_BANK_STATE)
{
_delay_ms(500);
bank++;
if(bank==10){
bank=0;
blink2();
}

}

if(BUT_SAVE_STATE)
{
write2eeprom(nice_flo.data, type, bank);
clear_states0();
}

}
}
return 0;
}

Tttyyy вне форума   Ответить с цитированием
Ответ
Опции темы
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



Текущее время: 15:00. Часовой пояс GMT +3.


vBulletin 4.1.0 Перевод: zCarot
(C) www.phreakerclub.com
Яндекс.Метрика