LusoRobótica - Robótica em Português
Sistemas específicos => Arduino / AVR => Tópico iniciado por: ghostbuster em 12 de Junho de 2009, 10:58
-
pessoal, alguem sabe se posso utilizar so a cabeça de leitura de um sistema desses directamente no arduino?, por wxemplo em vez de ler os dados do leitor de cartões por serial utilizava so a cabeça do leitor e o arduino
-
O leitor de cartões liga-se por usb ou por porta serie?
Utilizas algum software para leres os dados ou são escritos automáticamente onde está o cursor?
Tal como tenho um leitor de código de barras ligado directamente ao arduino, também quase de certeza que dá para ligar esse leitor.
Se indicares o modelo pode ser mais fácil para o "pessoal" :) procurar mais alguma ajuda.
-
o leitor ligase por serie e e bastante facil ligar ao arduino que ate esta no instructables como se faz,so que eu não queria ligar o circuito todo do leitor ao arduino apenas queria ligar a cabeça magnetica que é igual aos leitores de casette antigos.
O leitor em principio sera este http://www.allelectronics.com/make-a-store/item/MCR-12/MAGNETIC-CARD-READER/-/1.html (http://www.allelectronics.com/make-a-store/item/MCR-12/MAGNETIC-CARD-READER/-/1.html)
aqui esta um ligado ao arduino por serial http://hackmiami.org/2008/12/21/magnetic-stripe-card-reader/ (http://hackmiami.org/2008/12/21/magnetic-stripe-card-reader/)
e no meu caso so quero ligar esta peça ao arduino http://www.tech-rep.co.uk/assets/images/principals/phi-falmouth/heads-montage.png (http://www.tech-rep.co.uk/assets/images/principals/phi-falmouth/heads-montage.png)
-
Dar para ligar dá.. tudo dá para ligar... agora o que vais conseguir fazer só com isso é que já não se sabe :P
-
Tudo o que vou dizer são suposições minhas.
Aquela cabeça magnetica (nem sequer sei se é assim que se chama) que queres ligar ao arduino parece-me que simplesmente é o sensor que recolhe os sinais do cartão, mas depois é necessário ter algo que saiba o que querem dizer os sinais e os processem de uma maneira que possam ser percebidos.
Agora se queres ligar ao arduino aquela cabeça magnetica tens que começar por ler o datasheet da tal cabeça magnetica e saber de que forma ela transforma os sinais magneticos em sinais electricos e depois utilizas isso.
-
Tudo o que vou dizer são suposições minhas.
Aquela cabeça magnetica (nem sequer sei se é assim que se chama) que queres ligar ao arduino parece-me que simplesmente é o sensor que recolhe os sinais do cartão, mas depois é necessário ter algo que saiba o que querem dizer os sinais e os processem de uma maneira que possam ser percebidos.
Agora se queres ligar ao arduino aquela cabeça magnetica tens que começar por ler o datasheet da tal cabeça magnetica e saber de que forma ela transforma os sinais magneticos em sinais electricos e depois utilizas isso.
tens razão em algumas coisas, o circuito normal que liga a cabexa ao arduino por serial sabe processar os sinais, logo tenho que ver como programo o arduino de modo a processar os sinais, e a cabeça magnetica é uma simples bobine a qual o campo vai ser alterado pela fita magnetica e diferentes polaridades escritas nela
-
vim aqui desenterrar isso, porque vou adquirir um leitor desses
http://www.magtek.com/documentation/public/99875349-4.01.pdf (http://www.magtek.com/documentation/public/99875349-4.01.pdf)
http://www.magtek.com/documentation/public/99875258-9.02.pdf (http://www.magtek.com/documentation/public/99875258-9.02.pdf)
isso é a tal cabeça mas com toda a electronica embutida, e manda os dados por shift-out, os pinos que tem são DATA e STROBE. Alguem faz ideia de como funciona o shift-in no arduino com data e strobe da cabeça?
-
Pelo que percebi, no forum arduino, o strobe liga ao pino 2 do arduino, o data a outro qualque e tneho que fazer um interrupt, o data line tenho que o por a guardar num byte como um shift register...
Alguem pode esplicar isto melhor?
-
qual é o comprimento dos dados que vêm do leitor? 8 bits?
e a ordem pla qual os dados entram, começa pelo bit mais à direita (LSB) ou plo mais à esquerda (MSB)?
PS: já comecei a ler a datasheet que contém o protocolo de comunicação. Mais tarde (esta noite, ou amanhã de manhã) tentarei postar um "esboço" de código para comunicar com este tipo de leitor de cartões. Deixo aqui a datasheet que contém o protocolo:
http://www.magtek.com/documentation/public/99875337-8.01.pdf (http://www.magtek.com/documentation/public/99875337-8.01.pdf)
-
obrigado pela ajuda tcustodio ;), quando sair o produto final logo posto aqui ;D
-
A cabeça deve chegar em uma semana ou duas, agora tenho outra duvida, preciso de usar os dois pinos como intrerupt ou so um?
-
Boas, visto que o distribuidor de portugal encomendou a cabeça a magtek em janeiro e ainda não chegou, decidi fazer uma coisa mais old school ::)
Liguei uma cabeça normal de um leitor de cassette a entrada do microfone do pc, e pelos vistos funciona perfeitamente :D
Um programa descodifica o sinal audio e transforma-o em digital, agora como é obvio queria fazer isso com o nosso amigo arduino..
Pelo seguinte esquema:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg526.imageshack.us%2Fimg526%2F9176%2F65572650.jpg&hash=719048bd0e4f64b5952b09688d1017382c1b1dd7) (http://img526.imageshack.us/i/65572650.jpg/)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg717.imageshack.us%2Fimg717%2F4429%2F16548114.jpg&hash=d1d43894702b31faf8daa3af7b945054e8cfcc04) (http://img717.imageshack.us/i/16548114.jpg/)
Como podem ver, um pico naquele espaço de tempo representa 0 e dois picos no mesmo espaço de tempo representa 1
Ideias que eu tenho:
-Ler com o Arduino a cabeça magnetica ligada ao analog pin como se fosse um microfone, e depois analizar os valores(pode ser que de alguma coisa parecida)
-Usar o ADC do Arduino(Nessa parte bloquei completamente visto nunca ter trabalhado com isso)
Basicamente, o que o arduino tem que fazer, e contar quantos picos existem num espaço de tempo, e devolver 0 ou 1
-
Quando começares a fazer isso partilha, tenho um velho video aqui e vinha mesmo a calhar um coisa do género.
=)
-
Tenho ideia que o Arduino(Atmega328p) não consegue ler um sinal a essa frequência mas só indo à datasheet confirmar. O Arduino possui uma função que é a pulsein (http://www.arduino.cc/en/Reference/PulseIn), dá uma vista de olhos.
Acabei de me lembrar que não precisas de usar o ADC, um IO digital serve perfeitamente, tens aqui até como acelerar esse processo em relação ao código usado pelo Arduino. (http://www.societyofrobots.com/robotforum/index.php?topic=9947.0)
-
E mesmo a adc podes alterar o prescaler do clock para fazer leituras da adc a 200kHz, coisa que no arduino é muito mais lento.
-
Afinal já recebi a cabeça.
Em anexo está o codigo em C que a magtek aconselha, e aqui fica um esboço do meu codigo mas da um erro qeu não sei o que é :(
O loop está vazio pois ainda não cheguei a essa parte
#define WAIT_FOR_CARD_PRESENT 0
#define WAIT_FOR_BUFFER_READY 1
static unsigned byte DataAcquisitionState;
const int DataPin = 2;
const int StrobePin = 3;
volatile unsigned byte ReceiveBufferReadySignal;
int CardDataReady;
void setup(){
DataAcquisitionState = WAIT_FOR_CARD_PRESENT;
pinMode(DataPin, INPUT);
pinMode(StrobePin, INPUT);
digitalWrite(StrobePin, HIGH);
delay(10);
Reset();
Armar();
ReceiveBufferReadySignal = 0;
}
void loop(){
}
//-------------------------------------------------------------------------------
int DataAcquisitionManager()
{
switch (DataAcquisitionState)
{
case WAIT_FOR_CARD_PRESENT:
if (digitalWrite(DataPin, LOW) && !CardDataReady)
{
ClearCardPresent();
DataAcquisitionState = WAIT_FOR_BUFFER_READY;
ReceiveBufferReadySignal = 31; /* 3 seconds minimum */
}
break;
case WAIT_FOR_BUFFER_READY:
if (digitalRead(DataPin) == LOW)
{
CardDataReady = true;
DataAcquisitionState = WAIT_FOR_CARD_PRESENT;
}
else if (ReceiveBufferReadySignal == 0)
{
Reset();
Armar();
DataAcquisitionState = WAIT_FOR_CARD_PRESENT;
}
break;
}
}
//------------------------------------------------------------------------------
int ClearCardPresent()
{
delayMicroseconds(1);
digitalWrite(StrobePin, HIGH);
delayMicroseconds(2);
digitalWrite(StrobePin, LOW);
}
//-------------------------------------------------------------------------------
int Reset()
{
delayMicroseconds(1);
digitalWrite(StrobePin, HIGH);
delayMicroseconds(1);
digitalWrite(DataPin, LOW);
delayMicroseconds(5);
digitalWrite(StrobePin, LOW);
delayMicroseconds(1);
digitalWrite(StrobePin, HIGH);
delayMicroseconds(1);
digitalWrite(StrobePin, LOW);
delayMicroseconds(1);
digitalWrite(DataPin, HIGH);
delayMicroseconds(1);
digitalWrite(StrobePin, HIGH);
delayMicroseconds(130);
digitalWrite(StrobePin, LOW);
}
//------------------------------------------------------------------
int Armar()
{
delayMicroseconds(1);
digitalWrite(StrobePin, HIGH);
delayMicroseconds(1);
digitalWrite(StrobePin, LOW);
}
//-----------------------------------------------------------
int ClearCardData()
{
if (CardDataReady)
{
CardDataReady = false;
Reset();
Armar();
}
}
//-----------------------------------------------------
int GetData(unsigned byte xdata * pryubTkData, uword uwCntInBits)
{
unsigned byte ubTkBitPos;
ubTkBitPos = 1;
*pryubTkData = 0;
delayMicroseconds(1);
while (uwCntInBits--)
{
digitalWrite(StrobePin, HIGH);
delayMicroseconds(1);
digitalWrite(StrobePin, LOW);
delayMicroseconds(1);
if (digitalWrite(DataPin, LOW)) {
*pryubTkData |= ubTkBitPos;
}
ubTkBitPos <<= 1;
if (ubTkBitPos == 0)
{
ubTkBitPos = 1;
pryubTkData++;
if (uwCntInBits)
{
*pryubTkData = 0;
}
}
}
}
//--------------------------------------------------------------------------
-
Que tipo de erro dá?
-
Que tipo de erro dá
Portando diz assim...
error: expected ',' or '...' before 'xdata' In function 'void setup()':
In function 'int DataAcquisitionManager()':
At global scope:
In function 'int GetData(unsigned int)':
o #define WAIT_FOR_BUFFER_READY 1 fica a amarelo
Mas atenção, ele so da o erro se tiver ai a função read data, porque se ela nao tiver ai ele compila bem, Para terem uma melhor idea é abrirem os ficheiros em C do anexo, que la está tudo explicado
-
Falta ai algum caracter como ele te está a dizer, agora é só dar com o erro, as vezes isso é muito chato
-
Afinal vou fazer o codigo do zero, queria um sketch se alguem tiver de como faço, para ler o seguinte:
Quando detecta Digital Pin High é 1 e Low é 0, e eu quero que ele grave isso numa variavel tudo de seguida
ou seja a cabeça vai-me mandar no maximo 250 bytes de informaçao mas em binario
-
Eu posso ajudar, me envie seu MSN
--
I can help you, send me your MSN