Go Down

Topic: [RESOLVIDO] - Dúvida código servos e LCD (Read 1 time) previous topic - next topic

tuliobaars

Mar 07, 2012, 08:58 pm Last Edit: Mar 13, 2012, 06:55 pm by tuliobaars Reason: 1
Beleza gente!

Seguinte, estava montando um projeto de uma espécie de "controle" para um insetorobô, simples. No Robô, existem 2 servos de 9g (1.3kg.cm) e um sensor ultrassônico (HC-SR04 - 4 pinos). No "controle" são 4 pushbuttons, a [acronym]Arduino[/acronym] Uno R3, LCD 16x2, potenciômetro para contraste e só.

O problema é o seguinte. Fiz o código para que o sonar mostrasse a distancia no LCD, perfeito, funciona. Consegui até remover o ruído do servo da leitura (usando jumpers daqueles "premium"), apenas um problema (provavelmente resolvível por código, não sei como) de o LCD não apagar a casa das centenas qdo passa para dezenas de cm, inclusive peço uma força para isso tbém.

Para a locomoção do bichin, fiz as funções de locomoção (frente, virar direita, ré-esquerda e centralizar servo) e associei casa uma a uma leitura de HIGH de um pushbutton (por função). Mas, quando aperto o PushButton, nada acontece. Usei os pushbuttons no exato mesmo lugar no mesmo layout de montagem para acender LEDs, como prova de conceito, mas agora, necas de pitibirica de funfar... Quem sabe alguém pelas fotos tem uma ideia e pode me dar uma luz nessa.

Código: http://pastebin.com/mEYKv1Zj

Foto geral, que mostra o robô, "controle" e o LCD-que-não-apaga-a-centena:



Foto que mostra a conexão dos pushbuttons, para vcs verem se a ligação está correta:



Abraços e valeu a ajuda!!!
KISS! Keep it simple, Stupid!

Wagner Sartori Junior

Eu dei só uma olhadinha no seu código.

O botão não funcionar, pode ser por causa do delay(1000) que tem no seu código e ele passar pelo digitalread só depois. o arduino não consegue fazer 2 coisas ao mesmo tempo, portanto pode ser que vc está apertando o botão muito rápido e ele não pega no digitalread.

Olhe este exemplo para usar millis() ao invés de delay: http://arduino.cc/en/Tutorial/BlinkWithoutDelay

Eu não entendi o problema que você está tendo no LCD direito.

tuliobaars

Bem, este do millis()... qual é a diferença da função delay()?

E o LCD é o seguinte: Se meço 345cm, tranquilo. Se diminuo a distância, para, por exemplo, 50cm, o 5 do 345 fica e aparece 505. Não sei se expressei bem, mas, ele mantém um dígito da leitura anterior se ele tiver uma dimensão maior (dezenas para centenas, ex).

Valeu, Abs
KISS! Keep it simple, Stupid!

Wagner Sartori Junior


Bem, este do millis()... qual é a diferença da função delay()?

a diferença é que vc pode fazer outra coisa enquanto aguarda. o delay "trava" seu arduino por 1 segundo. é 1 segundo sem fazer nada. olha o exemplo que te mandei, coloque em um arduino e leia o código para entender exatamente o que ele faz.


E o LCD é o seguinte: Se meço 345cm, tranquilo. Se diminuo a distância, para, por exemplo, 50cm, o 5 do 345 fica e aparece 505. Não sei se expressei bem, mas, ele mantém um dígito da leitura anterior se ele tiver uma dimensão maior (dezenas para centenas, ex).

entendi.

vc vai precisar limpar a linha antes de escrever alguma coisa. uma opção meio tosca é esta aí embaixo.
Code: [Select]

lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Distancia:");
lcd.setCursor(0, 1);
lcd.print(distancia);


outra opção é vc depois do lcd.print(distancia) colocar um outro lcd.print("     "). a mais limpa seria vc implementar um contador byte e contar quantos caracteres vc está escrevendo e limpar o resto da linha. enfim, é só programar mesmo.

tuliobaars

"while reading a button press" o que é a preguiça, estava justamente ali... Bem, desculpe quanto a isso!

Pois, quanto ao LCD, o César Osaka do LAB de Garagem me sugeriu isso:
Code: [Select]
  lcd.setCursor(0, 1);
  if (distancia < 100)
    lcd.print(" ");
  if (distancia < 10)
    lcd.print(" ");
  lcd.print(distancia);


Que também acabou não funcionando. O lcd.clear também não funfou, nem printando espaço vazio. Quanto delay, não acho que seja necessário, afinal eu usava isso quando apenas lia da serial, sem o LCD. Acabou herdando do código antigo (falar de herança em C... vixe!!, haha)

No mais, obrigado pela ajuda!

Abraço
KISS! Keep it simple, Stupid!

Go Up