Guia CNC Brasil - Tudo sobre CNC, Router, Laser, Torno e 3D Print
ELETRÔNICA / ELÉTRICA => Arduino => Tópico iniciado por: Blackmore em 07 de Dezembro de 2012, 22:05
-
Estou no meio da programação de um projetinho onde preciso ver o estado de nada mais que 72 botões .. (matriz 8x9) ... estou usando o arduino Mega2560 ... eu perdi um tempo considerável para fazer a matriz ser entendida pelo Mega e isso acontecia quando eu colocava por exemplo tanto as rows qto as cols em sequencia nas portas .. tipo 22,23 até 30 e 32,33 até 39. Coloquei então as rows entre 22 e 36 (apenas nos pares) e as cols de 2 a 10 ... funcionou certinho.
Qual é o segredo de tostines? essa eu não entendi!! existe alguma regra dizendo que isso ou aquilo não pode ser feito com os ports no Arduino?
-
Estou no meio da programação de um projetinho onde preciso ver o estado de nada mais que 72 botões .. (matriz 8x9) ... estou usando o arduino Mega2560 ... eu perdi um tempo considerável para fazer a matriz ser entendida pelo Mega e isso acontecia quando eu colocava por exemplo tanto as rows qto as cols em sequencia nas portas .. tipo 22,23 até 30 e 32,33 até 39. Coloquei então as rows entre 22 e 36 (apenas nos pares) e as cols de 2 a 10 ... funcionou certinho.
Qual é o segredo de tostines? essa eu não entendi!! existe alguma regra dizendo que isso ou aquilo não pode ser feito com os ports no Arduino?
Cada pino da placa Arduino está associado a um bit de uma porta do ATMega. Assim, você poderia escrever seu programa de maneira a utilizar os sinais do Arduino em sequência, ou ler por porta do ATMega. Poderia postar o trecho de seu programa que varre as portas e bits do ATMega?
-
http://arduino.cc/en/Hacking/PinMapping2560 (http://arduino.cc/en/Hacking/PinMapping2560)
As portas do arduino sao todas trocadas e os numeros nao corresponem em sequencia aos numeros dos pinos no programa.
O ideal seria voce escolher uma porta I/O e fazer rows e cols em sequencia nas portas corretas do AVR. Ai voce poderia ler a porta de uma vez so, lendo o registro correspondente a porta e nao pino por pino como e' feito no arduino.
Fazendo isso vai te abrir um leque de possibilidades. Por exemplo voce poderia fazer a varredura do teclado escrevendo 00000001 na porta de saida e fazendo um deslocamento << ou >> do bit o que seria extremamente rapido. Uma outra coisa que te permitiria e' escrever 11111111 na porta de saida e voce poderia connectar um pino de interrupt a todos os pinos de entrada com um diodo em cada pino esperando o acionamento do interrupt. (e quando o interrupt acionarai voce pode fazer a varredura no ISR.) ao inves de usar timer para fazer isso, deixando o processador livre para outas coisas.
-
minilathe
Cada pino da placa Arduino está associado a um bit de uma porta do ATMega. Assim, você poderia escrever seu programa de maneira a utilizar os sinais do Arduino em sequência, ou ler por porta do ATMega.
Sim, eu tentei isso ... mas não funcionou e por isso minha dúvida
Poderia postar o trecho de seu programa que varre as portas e bits do ATMega?
Sim, está logo abaixo ... é um dos exemplos da biblioteca Keypad do próprio Arduino.
#include <Keypad.h>
const byte ROWS = 8; //oito linhas
const byte COLS = 9; /nove colunas
//define os símbolos de cada uma das 72 teclas do keypad
char keys[ROWS][COLS] = {
{'0','1','2','3','4','5','6','7','!!'},
{'8','9','A','B','C','D','E','F','@'},
{'G','H','I','J','K','L','M','N','#'},
{'O','P','Q','R','S','T','U','V','$'},
{'W','X','Y','Z','a','b','c','d','%'},
{'e','f','g','h','i','j','k','l','&'},
{'m','n','o','p','q','r','s','t','*'},
{'u','v','w','x','y','z','=','+','-'}
};
byte rowPins[ROWS] = {22, 24, 26, 28, 30, 32, 34, 36}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {2, 3, 4, 5, 6, 7, 8, 9,10}; //connect to the column pinouts of the keypad
//inicializa uma classe NewKeypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS);
void setup(){
Serial.begin(9600);
}
void loop(){
char key = keypad.getKey();
if (key){
Serial.println(key);
}
}
linearactuator
As portas do arduino sao todas trocadas e os numeros nao corresponem em sequencia aos numeros dos pinos no programa
sim ... o esquemático disponível mostra isso.
O ideal seria voce escolher uma porta I/O e fazer rows e cols em sequencia nas portas corretas do AVR.
tentei fazer isso e não funcionou.
Ai voce poderia ler a porta de uma vez so, lendo o registro correspondente a porta e nao pino por pino como e' feito no arduino...
No Atmega2560 tem muito mais ports que um pic 16f877 por exemplo (comparação injusta!! hahah), porém eu ainda não encontrei nos exemplos um comando que seja semelhante a output_b (0xFF) onde eu utilizava no compilador CCS para escrever um falor direto no port desejado ou mesmo para ler o port inteiro.
Por exemplo voce poderia fazer a varredura do teclado escrevendo 00000001 na porta de saida e fazendo um deslocamento << ou >> do bit o que seria extremamente rapido. Uma outra coisa que te permitiria e' escrever 11111111 na porta de saida e voce poderia connectar um pino de interrupt a todos os pinos de entrada com um diodo em cada pino esperando o acionamento do interrupt. (e quando o interrupt acionarai voce pode fazer a varredura no ISR.) ao inves de usar timer para fazer isso, deixando o processador livre para outas coisas.
era essa minha idéia .... mas estou começando a achar que programando na IDE do Arduino não vou conseguir agora ... terei que partir para o WinAVR dentro em breve ou começar do quase zero no PIC novamente .... aff.
-
Acho que não entendi o seu objetivo.
Poderia postar o trecho de seu programa que varre as portas e bits do ATMega?
Sim, está logo abaixo ... é um dos exemplos da biblioteca Keypad do próprio Arduino.
#include <Keypad.h>
const byte ROWS = 8; //oito linhas
const byte COLS = 9; /nove colunas
//define os símbolos de cada uma das 72 teclas do keypad
char keys[ROWS][COLS] = {
{'0','1','2','3','4','5','6','7','!!'},
{'8','9','A','B','C','D','E','F','@'},
{'G','H','I','J','K','L','M','N','#'},
{'O','P','Q','R','S','T','U','V','$'},
{'W','X','Y','Z','a','b','c','d','%'},
{'e','f','g','h','i','j','k','l','&'},
{'m','n','o','p','q','r','s','t','*'},
{'u','v','w','x','y','z','=','+','-'}
};
byte rowPins[ROWS] = {22, 24, 26, 28, 30, 32, 34, 36}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {2, 3, 4, 5, 6, 7, 8, 9,10}; //connect to the column pinouts of the keypad
//inicializa uma classe NewKeypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS);
void setup(){
Serial.begin(9600);
}
void loop(){
char key = keypad.getKey();
if (key){
Serial.println(key);
}
}
O programa acima é simples e já não faz o que você espera?
Se quer acessar as portas (B, C, D, ...) do ATMega de um Arduino, o link a seguir mostra o "caminho das pedras".
http://www.arduino.cc/en/Reference/PortManipulation (http://www.arduino.cc/en/Reference/PortManipulation)
-
minilathe
Acho que não entendi o seu objetivo.
saber se existe alguma limitação ou bug no compilador que não me permite fazer algo de uma certa maneira.
O programa acima é simples e já não faz o que você espera?
sim faz, aparentemente perfeito ... mas com base no pin map ( http://arduino.cc/en/Hacking/PinMapping2560 (http://arduino.cc/en/Hacking/PinMapping2560) ) eu não entendo é porquê o circuito funcionou com:
byte rowPins[ROWS] = {22, 24, 26, 28, 30, 32, 34, 36}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {2, 3, 4, 5, 6, 7, 8, 9,10}; //connect to the column pinouts of the keypad
que são os ports PE, PG, PH e PB (misturados nas linhas) e PA+PC (nas colunas) e não funcionou com:
byte rowPins[ROWS] = {22,23,24,25,26,27,28,29}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {30, 31, 32, 33, 34, 35, 36, 37,38}; //connect to the column pinouts of the keypad
Penso que seria o mais certo apenas um port inteiro de uma vez sendo ... respectivamente PA nas linhas e PC+PD7 nas colunas no treco acima.
E eu gostaria de fazer da segunda maneira também para facilitar o desenho da placa para montagem, pois com todos os pinos misturados da forma que estão vai dar uma trabalheira chata daquelas rotear tudo!!
Entendeu mestre? as vezes sou meio enrolado para explicar as coisas ... mas uma hora a coisa acerta!! :)
Obrigado por mostrar o caminho das pedras, vou ver se consigo utilizar, pois agora ficou mais complexo!! hehehe
Obrigado pela atenção!
-
Ok, ficou claro. Já tentou estudar a biblioteca "keypad" e usá-la como ponto de partida?
http://playground.arduino.cc/Code/Keypad (http://playground.arduino.cc/Code/Keypad)
Acho que uma das forças do conceito Arduino são as bibliotecas, que você pode usar ou adaptar ao seu gosto e sem ter que sair do zero.
-
Ok, ficou claro, você quer. Já tentou estudar a biblioteca "keypad" e usá-la como ponto de partida?
sim, é dela este programa aí (veja o include)... a diferença é que ao invés de ser uma matriz 4x4 eu preciso de uma 8x9 e aí surgiu toda essa viajem !! hehehe :)
Acho que uma das forças do conceito Arduino são as bibliotecas que você pode usar ou adaptar ao seu gosto. Sem ter que sair do zero.
eu estou tendendo a compartilhar de sua opnião, tem bastante coisa "open" ... diminui e muito o trabalho, e este é um dos motivos que estou deixando o PIC.
Abraço!
-
eu pegaria o datasheet desse IC pois alguns pinos tem limitacao diferente de corrente, uns tem pull up outros tem pull up e pull down, uns tem uso exclusivo de I/O, outros tem mais de uma funcao... (estou generalizando) mas tem umas frescuragens, nao e' tudo igual como a plataforma do arduino nos faz parecer.
-
linearactuator
eu pegaria o datasheet desse IC pois alguns pinos tem limitacao diferente de corrente, uns tem pull up outros tem pull up e pull down
eu até concordaria contigo SE eu estivesse tentando utilizar algo muito diferente do que as portas "são" ... quero usar como IN e OUT puro e simples ... ( Arduino is an open-source electronics prototyping platform based on flexible, easy-to-use hardware and software. It's intended for artists, designers, hobbyists, and anyone interested in creating interactive objects or environments. ) ... sendo assim ela deveria atender como tal pois nem todos possuem ou querem tanto conhecimento em eletrônica para criar seus objetos ou ambientes interativos.
Neste momento o importante é que o circuito está funcionando do jeito que está, e futuramente eu vejo o que acontece ou deva melhorar ...
Obrigado pela ajuda e participação dos colegas foristas .. e até a próxima dúvida!! hahaha
Abraço!
-
Resolvi deixar a preguiça de lado e fazer algo menos gambiarra ... tirei os botões e diodos da protoboard e soltei tudo em uma placa universal, coloquei conectores e liguei no arduino, realoquei os pinos deixando todos eles nas portas digitais ( 22 a 39 com excessão da porta 38) e pronto, o programa da matriz 9x8 funcionou certinho.
Entendo que o problema todo foi falta de atenção ao identificar os pinos da matriz corretamete
byte rowPins[ROWS] = {22, 24, 26, 28, 30, 32, 34, 36};
byte colPins[COLS] = {39, 37, 35, 33, 31, 29, 27, 25, 23};
na linha da coluna sendo indicada "decrescentemente" foi a forma que funcionou tudo perfeitamente.
O próximo passo é identificar cada um dos botões com um valor de 3 números específicos e não com caracteres.
Obrigado a quem se dispôs e abraço!
-
== Problema Resolvido ==
-
Opaaa.
Resolvido, mas para mim é só o começo. rsrsrsr
Tenho umas plaquinhas desse Arduino e até agora nem imaginava para que serviam.
Vou ler com mais detalhe as informações e vou ver em que posso usa-las.
Abraços.
Rubens
-
Olá. Rubens,
Para alguns, esta é uma etapa finalizada, mas pode ser um ponto de partida.
Abraço,