RFID помогите

kozusev
Offline
Зарегистрирован: 30.10.2012

Привет всем!
ПОмогите разобраться с подключение и кодом для считывателя на чипе htrc110 http://www.nxp.com/documents/data_sheet/ht037030.pdf. Пробовал и через SoftwareSerial  и просто дрыгать ногами нифига молчит. Подключаю к Мега2650.

maksim
Offline
Зарегистрирован: 12.02.2012

Мне вот интересно вы куда подключали TX и RX?
HTRC110 имеет 3 линии для связи с МК - DIN, DOUT и SCLK (вас наличие лишнего провода не смутило?)  это что то типа SPI без SS, изучайте интерфейс SPI и протокол связи HTRC110, если то что я сейчас вам написал не понятно, то бросайте эту затею и купите какой-нибудь готовый модуль с готовой библиотекой.

kozusev
Offline
Зарегистрирован: 30.10.2012

Проще всего бросить задачу чем решить её. Хочу разобрасть и заставить работать. Там даташине написано что это типа последовательный порт, но он работает по другому. Для чтения данны нужен только DOUT, а CLK нужен для того чтобы подать сигнал на считывание и для начала и конца переждачи. Посылаем в CLK 111 и на низком уровне ждём ответа, а завершаем высоким уровнем. Вот только пока что у меня не получается. Толи резистор нужен толи ещё что.

maksim
Offline
Зарегистрирован: 12.02.2012

Вы вообще сами понимаете, что вы пишите, что значит послать 111 в CLK? и в даташите такого не написано и использовать нужно все 3 вывода. В общем вы в корне двигаетесь не в том направлении, что вам делать я вам уже написал выше - или изучайте для начала SPI или брасайте, с теми знаниями, которыми вы обладаете сейчас вы ничего не добьетесь, ну разве что спалите микруху.

kozusev
Offline
Зарегистрирован: 30.10.2012

Этот ридер(СПКС-01) готовое устройство и он работает с другими контроллерами, но мне нужно его повесить на ардуино. На ридере нога CLK и DIN спаяны вместе.  

maksim
Offline
Зарегистрирован: 12.02.2012

Так сделано потому, что команда READ TAG имеет вид В111ХХХХХ, ридер пользуется только этой командой, поэтому DIN запараллелен с SCLK и с DIN всегда читаются единицы. И еще раз вам повторяю пока вы не разберетесь как работает синхронный последовательный интерфейс, вы ничего не добьетесь.

kozusev
Offline
Зарегистрирован: 30.10.2012

Я повесил спаяный контакт CLK на TX(pin 1), а  DOUT вешаю на RX(pin 0). Запускаю SoftwareSerial на эти пины. Посылаю командой и write и print(пробовал) 111 и слушаю этот порт на предмет пережачи. Всё что должно прийти кидаю в serial monitor.

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Да не мучайте Вы сериал!!! Попробуйте shiftIn(), просится же сюда!!! 

maksim
Offline
Зарегистрирован: 12.02.2012

 

maksim пишет:
это что то типа SPI без SS, изучайте интерфейс SPI и протокол связи HTRC110

maksim пишет:
В общем вы в корне двигаетесь не в том направлении, что вам делать я вам уже написал выше - или изучайте для начала SPI или брасайте, с теми знаниями, которыми вы обладаете сейчас вы ничего не добьетесь, ну разве что спалите микруху.

maksim пишет:
И еще раз вам повторяю пока вы не разберетесь как работает синхронный последовательный интерфейс, вы ничего не добьетесь.

maksim
Offline
Зарегистрирован: 12.02.2012

  Да пусть мучает, если нравится, уже 10 раз написал в какую сторону копать и все побую...(((
И кстати интересно как вообще работает ридер с запаралленными SCLK и с DIN на рисунке есть такой момент - начало передачи данных - initialization, (примерно так же организовано начало передачи в I2C) так вот как этого добиться с запараллеленными линиями для меня загадка.

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Ничего загадочного. Просто устройство всегда (что бы мы не передали) получит FF, а потом слушаем и получаем ответ. 

kozusev
Offline
Зарегистрирован: 30.10.2012

Спасибо большое за направление. Пацаны помогите. Помогите с кодом. Буду благодарен. С меня пиво и рыба или эквивалент. ???

maksim
Offline
Зарегистрирован: 12.02.2012

AlexFisher пишет:
Ничего загадочного. Просто устройство всегда (что бы мы не передали) получит FF, а потом слушаем и получаем ответ. 
О том, что всегда шлются единицы я уже писал выше, я говорю именно о начале передачи

maksim
Offline
Зарегистрирован: 12.02.2012

Вот вам пример, но не знаю чем вам это поможет.

#define SCKL 2 // Линия тактирования
#define DOUT 3 // Линия данных, на самом деле входная

#define LEN 8 // Длинна прочитанной информации, в байтах

void setup() { 
  Serial.begin(9600);  
  pinMode(SCKL, OUTPUT); 
  digitalWrite(DOUT, HIGH); 
}

void loop() {
  shiftIn(DOUT, SCKL, MSBFIRST); // Посылаем команду В111ХХХХХ
  for(byte i = 0; i < LEN; i++) {
    Serial.print(shiftIn(DOUT, SCKL, MSBFIRST), HEX); // Читаем данные
    Serial.print(" ");
  }
  Serial.println();
  delay(500); // Ждем пол секунды         
}


maksim
Offline
Зарегистрирован: 12.02.2012

kozusev пишет:
Пробовал и через SoftwareSerial  и просто дрыгать ногами нифига молчит. Подключаю к Мега2650.
И на будущее, у Меги 4 аппаратных UART, один занимает комп и остается 3 свободных... так что пользоваться SoftwareSerial нужно когда не остается свободных UART или нет возможности подключиться к соответствующим выводам.

kozusev
Offline
Зарегистрирован: 30.10.2012

Ничего. В ответ FF FF FF FF FF FF FF FF (тишина)

maksim
Offline
Зарегистрирован: 12.02.2012

У вас ридер от чего питается? Если дуина питается от USB, а ридер от отдельного источника и вы соединяете только две линии DOUT и SCLK, то естественно ничего работать не будет, нужно еще соединить земли (GND).

kozusev
Offline
Зарегистрирован: 30.10.2012

Питаю ридер от дуины. ПРобовал и от отдельного источника. Конечно же GND соединял между платами. ничего

maksim
Offline
Зарегистрирован: 12.02.2012

 Быть может shiftIn() читает данные в момент, когда линия тактирования имеет состояние 0, но даже если и так, то все равно читался бы какой нибудь мусор, но попробуйте 

#define SCKL 2 // Линия тактирования
#define DOUT 3 // Линия данных, на самом деле входная

#define LEN 8 // Длинна прочитанной информации, в байтах

void setup() { 
  Serial.begin(9600);  
  pinMode(SCKL, OUTPUT); 
  digitalWrite(DOUT, HIGH); 
}

void loop() {
  Read(DOUT, SCKL); // Посылаем команду В111ХХХХХ
  for(byte i = 0; i < LEN; i++) {
    Serial.print(Read(DOUT, SCKL), HEX); // Читаем данные
    Serial.print(" ");
  }
  Serial.println();
  delay(500); // Ждем пол секунды         
}

byte Read(byte dataPin, byte clokPin){
  byte data = 0;
  byte mask = 0x80;
  while(mask){
    digitalWrite(clokPin, 1);
    if(digitalRead(dataPin)) data |= mask;
    digitalWrite(clokPin, 0);
    mask >>= 1;
  }

  return data;
}


maksim
Offline
Зарегистрирован: 12.02.2012

Да, и вот еще что попробуйте закоментировать 9 строку

 // digitalWrite(DOUT, HIGH);

потому как в даташите написано, что линия DOUT уже имеет внутреннюю подтяжку и если к земле то они тянут линию в разные стороны...

kozusev
Offline
Зарегистрирован: 30.10.2012

Ок. попробую. Отпишусь

kozusev
Offline
Зарегистрирован: 30.10.2012

Нифига. С коментом и без комента 9 строки нифига. Вот видео www.youtube.com/watch

maksim
Offline
Зарегистрирован: 12.02.2012

 А зачем у вас на макетке резисторная сборка на линиях DOUT и SCLK ???

maksim
Offline
Зарегистрирован: 12.02.2012

 И что там еще за клемы на ридере? они подписаны?

ЗЫ: сериал мнитор можно вот этой кнопочкой открывать

kozusev
Offline
Зарегистрирован: 30.10.2012

 С лева на право. +12 GND +5 CND CLK DATA LedGreen LedRed. Резистор.сборка не подтянута к GND. 

kozusev
Offline
Зарегистрирован: 30.10.2012

Я ошибся насчёт того что DIN и CLK спаяны вместе. Вот ещё одна фотка где видно ноги чипа DOUT+DIN вместе.

maksim
Offline
Зарегистрирован: 12.02.2012

Так в макетке зачем сборка стоит?

kozusev
Offline
Зарегистрирован: 30.10.2012

Сборка просто так стоит. Я и без неё пробовал. Я ошибся насчёт того что DIN и CLK спаяны вместе. Там DOUT+DIN вместе.

maksim
Offline
Зарегистрирован: 12.02.2012

 Вот куда вы смотрели??? замкнуты между собой не DOUT и SCLK, а DOUT и DIN!!!!
Не успел. Поэтому и не работает.

kozusev
Offline
Зарегистрирован: 30.10.2012

Виноват .... 

kozusev
Offline
Зарегистрирован: 30.10.2012

Опять с меня причитается.

maksim
Offline
Зарегистрирован: 12.02.2012

При таком подключении, получается что-то типа урезанно-упрощенного I2C без адресации и подтверждения принятого байта.

maksim
Offline
Зарегистрирован: 12.02.2012

 Пробуйте

#define SCKL 2 // Линия тактирования
#define DATA 3 // Линия данных, на самом деле входная

#define LEN 8 // Длинна прочитанной информации, в байтах

// Команды
#define READ_TAG B11100000
#define WRITE_TAG B11000000

void setup() { 
  Serial.begin(9600);  
  pinMode(SCKL, OUTPUT); 
}

void loop() {
  READER_begin(); // Инициализация начала передачи
  READER_write(READ_TAG); // Посылаем команду В111ХХХХХ
  for(byte i = 0; i < LEN; i++) {
    Serial.print(READER_read(), HEX); // Читаем данные
    Serial.print(" ");
  }
  Serial.println();
  delay(500); // Ждем пол секунды         
}

byte READER_read(){
  pinMode(DATA, INPUT); 
  byte data = 0;
  byte mask = 0x80;
  while(mask){
    digitalWrite(SCKL, 1);
    if(digitalRead(DATA)) data |= mask;
    digitalWrite(SCKL, 0);
    mask >>= 1;
  }
  return data;
}

void READER_write(byte data){
  pinMode(DATA, OUTPUT);
  byte mask = 0x80;
  while(mask){    
    if(data & mask) digitalWrite(DATA, 1);
    else digitalWrite(DATA, 0);
    digitalWrite(SCKL, 1);
    digitalWrite(SCKL, 0);
    mask >>= 1;
  }
  digitalWrite(DATA, 0);
}

void READER_begin(){ // Инициализация начала передачи
  pinMode(DATA, OUTPUT);  
  digitalWrite(DATA, 0); 
  digitalWrite(SCKL, 1);
  digitalWrite(DATA, 1);
  digitalWrite(SCKL, 0);   
} 

И уберите резисторную сборку.

kozusev
Offline
Зарегистрирован: 30.10.2012

Убрал всё и  Нифига

maksim
Offline
Зарегистрирован: 12.02.2012

Попробуйте так изменить функцию READER_begin()

void READER_begin(){ // Инициализация начала передачи
  pinMode(DATA, OUTPUT);  
  digitalWrite(DATA, 0);
  digitalWrite(SCKL, 1);
  delayMicroseconds(10);
  digitalWrite(DATA, 1);
  delayMicroseconds(10);
  digitalWrite(SCKL, 0);   
} 


kozusev
Offline
Зарегистрирован: 30.10.2012

 Ничего не меняется. Всё теже FF FF FF FF FF FF FF FF

kozusev
Offline
Зарегистрирован: 30.10.2012

Максим, а вы откуда? Где живёте? В каком городе? Мож вам такой ридер передать?

maksim
Offline
Зарегистрирован: 12.02.2012

Нижний Новгород, но он мне не нужен, что бы заставить его работать, нужно еще внимательнее смотреть даташит, может прежде чем читать метки его нужно как-то предварительно настроить... поэтому для начала нужно убедиться что есть связь и прочитать какую-нибудь настройку

#define SCKL 2 // Линия тактирования
#define DATA 3 // Линия данных, на самом деле входная

#define LEN 1 // Длинна прочитанной информации, в байтах

// Команды
#define READ_TAG           B11100000
#define WRITE_TAG          B11000000
#define GET_SAMPLING_TIME  B00000010
#define READ_PHASE         B00001000

void setup() { 
  Serial.begin(9600);  
  pinMode(SCKL, OUTPUT); 
}

void loop() {
  Print_response(GET_SAMPLING_TIME);
  delay(500); // Ждем пол секунды  
  Print_response(READ_PHASE);  
  delay(500); // Ждем пол секунды          
}

void Print_response(byte comand){
  READER_begin(); // Инициализация начала передачи
  READER_write(comand); // Посылаем команду
  byte r = READER_read(); // Читаем данные
  Serial.print(r, DEC); 
  Serial.print(" ");
  Serial.print(r, HEX); 
  Serial.print(" ");
  Serial.println(r, BIN);
}


byte READER_read(){
  pinMode(DATA, INPUT); 
  byte data = 0;
  byte mask = 0x80;
  while(mask){
    digitalWrite(SCKL, 1);
    delayMicroseconds(10);
    if(digitalRead(DATA)) data |= mask;  
    digitalWrite(SCKL, 0);
    delayMicroseconds(10);
    mask >>= 1;
  }
  return data;
}

void READER_write(byte data){
  pinMode(DATA, OUTPUT);
  byte mask = 0x80;
  while(mask){    
    if(data & mask) digitalWrite(DATA, 1);
    else digitalWrite(DATA, 0);
    delayMicroseconds(10);
    digitalWrite(SCKL, 1);
    delayMicroseconds(10);
    digitalWrite(SCKL, 0);
    mask >>= 1;
  }
  digitalWrite(DATA, 0);
}

void READER_begin(){ // Инициализация начала передачи
  pinMode(DATA, OUTPUT);  
  digitalWrite(DATA, 0); 
  digitalWrite(SCKL, 1);
  delayMicroseconds(10);
  digitalWrite(DATA, 1);
  delayMicroseconds(10);
  digitalWrite(SCKL, 0);   
} 


kozusev
Offline
Зарегистрирован: 30.10.2012

kozusev
Offline
Зарегистрирован: 30.10.2012

Максим, что думаете по поводу ....

maksim
Offline
Зарегистрирован: 12.02.2012

По поводу чего? Судя по картинке связь с ридером есть, а значит прежде чем читать ключи нужно как то сконфигурировать ридер, то есть предварительно что то в него отправить. Изучайте даташит, как правильно работать с ридером.

capt_smile
Offline
Зарегистрирован: 18.12.2012

http://www.elektroda.pl/rtvforum/topic2267627.html#10766103 вот неплохой пример работы с этим чипом, но, к сожалению, и он не выдает ничего толкового на ардуине. правда примерчик расчитан на отдельную линию DOUT, но это легко решаемо, по моему, раз линия запаралелена с DIN

грешили и на задержки, все по инструкции...50милисекунд. Иницализация проще некуда.

HTRC110_SCK_H;	//CLK 1
HTRC110_DIN_L;	//DIN 0
HTRC110_DIN_H;	//DIN 1
HTRC110_SCK_L;	//CLK 0

Дальше передаем три еденицы и сразу должны получить 5 байт ответа (правда в даташите не совсем понятно описано, они пишут 5 bit response)