Algumas Dúvidas Rápidas

AlxDroidDev:

joneco:
• qual a diferença de eu comprar um shield de motor ou ligar sem o shield?

Jamais se deve ligar um motor diretamente ao Arduino. Há poucas pessoas que vão te dizer o contrário, portanto vou justificar minha resposta.

Veja bem: cada pino do Arduino tem um limite de corrente de 40mA. Isto é o suficiente para acender um LED ou ligar um pequeno buzzer e nada mais. Sério, NADA MAIS. O objetivo dos pinos de saída do Arduino é comunicar com outros dispositivos digitais ou components como transistores, relés, optoacopladores, etc, portanto com 5V (geralmente) e baixíssima corrente, ou seja: apenas sinalização.

A soma de corrente de todos os pinos do Arduino não deve ser superior a 350mA (se alimentado pela USB) ou 700mA se usada alimentação externa.

Os outros dispositivos digitais ou components é que farão algo maior, como acionar um motor, acender uma lâmpada 110V, e por aí vai.

Um motor, ao ser ligado, tem um consumo de corrente muito alto (chamado "corrente de partida"), e mesmo um pequeno motor de CD-ROM pode chegar fácil a 200mA na partida ou arranque. Durante o uso, ao ter alguma carga no motor (demanda de torque), sua demanda de corrente certamente é superior a 40mA. Isto pode e VAI queimar a porta digitial do seu Arduino.

Os shields de motor são excelentes pois usam um CI dedicado (geralmente o L293D ou L298), que usam um fonte de energia externa, diferente da fonte de energia do Arduino, liga os 2 GND (Arduino + fonte externa) juntos, e então usam a sinalização digital do Arduino para ligar/desligar os motores, que por sua vez são alimentados por uma fonte externa. Tecnicamente falando, cada L293D ou L298 são duas pontes-H ("H-bridges"), são uma série de MOSFETs que isolam as sinalização digital da linha de potência.

Você tem a opção de montar seu próprio shield de motores usando MOSFETs e BJTs, ou usando o L293D (como eu fiz, vou postar vídeo de noite).

Um motor shield comum no mercado é um projetado pela LadyAda, que possui 2 x L293D e 1 x 74HC595. Sua grande vantagem é que você usa apenas 3 pinos digitais do Arduino para se comunicar com o 74HC595, que por sua vez conversa com cada um dos L293D. É suficientemente rápido e te economiza vários pinos de saída do Arduino.

• posso ligar qualquer lcd comprado no ebay ou deve ser algum específico pra arduino?

Sim e não. O LCD não precisa ser específico para Arduino, mas precisa ser baseado em alguma implementação que já exista para Arduino, para te livrar do trabalho de ter que fazer uma engenharia reversa do protocolo de comunicação.

LCDs que são comuns e que já possuem bibliotecas escritas para Arduino:

  • Qualquer um baseado em I2C
  • Nokia 5110 ou qualquer variante baseada no controlador PCD8544
  • LCDs paralelos (normalmente 8, 16 ou 20 colunas x 1, 2 ou 4 linhas, embora exista outras variedades mais exóticas), baseado no controlador HD44780
  • LCDs seriais interfaceados por um CI 74HC595

(na verdade, qualquer display baseado no HD44780 irá funcionar, independentemente se é serial, paralelo, i2c, SPI, etc)

Outros podem funcionar, mas os 4 grupos acima cobrem 98% dos displays disponíveis no mercado, que podem ser facilmente interfaceados com o Arduino.

opa obrigado pelas excelentes dicas..
acho que a maioria dos LCDS que eu vi no ebay eram HD44780, lembro por que a muito tempo queria colocar um no pc para ser comunicado via serial ou usb (acabei nao comprando pois nao tenho serial no pc e usb era meio caro)...
obrigado pelas excelentes respostas, eu acredito que vou comprar um shield, pois no meu projeto que preciso fazer acho que seria excelente 2 motores e o shield é bem barato.. também vi sobre ponte H..

bubulindo:
Não tens aqui evento nenhum... e como o getKey não bloqueia, sempre que carregas numa tecla o Arduino lê umas quantas. Porque não fazer isto bloqueante? Ou pelo menos testar se houve mudanca de teclas.

unsigned char tecla_anterior; 

unsigned char tecla;
if (tecla != tecla_anterior) {
//faz algo
}
tecla_anterior = tecla;



Isto é um exemplo para usar strings em vez de Strings. 



char senha[6];//seenha com 5 caracteres.
unsigned char pointer = 0;

...

if (customKey){
   if (pointer<5) { //só tens 6 espacos...
      senha[pointer++] = customKey;
      senha[pointer] = '\0'; //terminador
      lcd.print(customKey);
   }
 }
 
   if (customKey == 'C'){
     delay (500); //para que é isto?????
     pointer = 0;
     senha[0] = '\0'; //se imprimires, não aparece nada.
     lcd.clear();
 }

if (customKey == '#'){
     delay (500);//Isto é para????
     lcd.clear();
     lcd.print(senha);
   }

opa valeu!
esses delays eram para aparecer mesmo o simbolo na tela por exemplo: 123C e depois apagava, deixei mais para teste mesmo...

o primeiro exemplo eu não entendi direito...
e no segundo botei como você disse, está acontecendo o mesmo de antes, quando digito os numeros e depois o #, para ele imprimir a senha guardada ele imprime apenas o # (última tecla apertada), sendo que deveria imprimir tudo que eu digitei antes. Isto é para apenas eu saber que esta gravando as teclas que aperto nessa variável para eu futuramente compara-la a uma senha CORRETA que irá realizar uma coisa (no caso moveria um servo motor).