Estou usando a porta serial do compilador do arduino para enviar os comandos w,s,a,d, responsáveis por subir, descer, girar para a esquerda, girar para a direita meu robô, isso está funcionando perfeitamente! =D

Agora gostaria de depois de escolher o sentido do movimento fosse possível escolher quantos passos ele utilizaria. mas não sei como programar isso de forma que ele identifique os numerais do teclado como valores inteiros. Isso é possível? 

Exibições: 12470

Responder esta

Respostas a este tópico

Você gostaria de que?

Números de 0-9 identificando quantos passos o robô deve andar?

Se for isso é relativamente simples.

O terminal do Arduino trabalha com caracteres, ascii, certo? Internamente ele converte o caractere '0' para o decimal (inteiro) 48.

Da uma olhada na tabela ascii

Assim, para ter o Byte 0 em vez do caractere "0" é só diminuir 48 dele, e sucessivamente para os numeros até 9.

Um trecho de código que usei a trocentos anos:

for (int i=0; i < 3; i++) {
input[i] = Serial.read(); // Read the characters into an array

}
//---remover---- Gambiarra.BEGIN
input[0] = input[0]-48; // para teste: "converte", a'la monge do age of empires 1,
input[1] = input[1]-48; // caracteres numéricos em inteiro.


Neste programa eu trabalhava com inteiros no driver que criamos pro dispositivo, então rolou essa "gambiarra" pra testar o firmware no terminal (que só trabalha com ASCII).

Agora, se vc for trabalhar com números maiores, uma vez que a serial lê caractere por caractere, vais ter que jogar eles num vetor de buffer, concatenar e usar um algoritmozinho pra converter uma string em inteiro (não sei se a Arduino.h implementa isso, desconheço).

Meu programa Desktop enviava inteiros de 0 a 255 (ja que trafegam Bytes pela serial ). Ou seja, eu tinha de 0 a 255 sem me preocupar com conversão de formato.

Exatamente esse codigo caso queira trabalhar com Char mesmo.

Olá, sou bem iniciante no arduino.

Vi a explicação, mas fiquei com dúvidas,

Eu quero, que ele reconheça uma senha, no caso, eu digitaria 4 números, e então ele excutaria o meu programa.

Nós tinhamos feito da forma abaixo, mas ele só enxerga o primeiro "0"..
Foi então, que pensamos que podia ser, por culpa do tal 48 da tabela asc..
Mas, não entendi, como aplico, o código acima, no meu programa...

//------------------------------------------------------------

void senha()

{

Serial.println("------------------------------------------------------");
Serial.println("Inserir Senha");

//opção da serial escolhido
int opcao_senha = Serial.read();

//fico aguardando a escolha de uma opção
while(opcao_senha == -1){
opcao_senha = Serial.read();
}
opcao_senha = opcao_senha - 48; //codigo da tabela asc;

//Serial.println(opcao);
if(opcao_senha == 0000){
administrador();
}
else
{
loop();
}
}

//---------------------------------------------------------------------------------

Boa noite faz muito tempo já esta tua postagem provavelmente deu certo teu programa já mais caso alguem leia e tenha a mesma dúvida talvez minha idéia resolva o problema..

É ainda nem fiz o programa no Arduino para testa caso eu esteja errado me descupem..

pensei assim:

Caso tenha dúvida nessa função leia a minha resposta abaixo que tem uma explicação detalhada dela..

Antes Leia isso..

Mais antes preste atenção nisso "para Senha" você não precisa usar valores inteiros pode ser Valores Char que é bem mais Facil para o Arduino entender e ele da o valor escrito exato só que tem um detalhe, pela porta Serial passa por um cabo certo, então quer dizer que tipo o processamento do PC ou também do Arduino é bem mais rapido que a valocidade que passa os dados do Arduino para o Pc ou seja não chegara todos teus caracteres do Arduino para o Pc (Digita algo tipo "Coisa" so chegara na tela do Serial do PC "Coi" o "sa" não terá velocidade para char junto)então um truque.. Então faça isso:

Serial.flush(); //Limpa a porta Serial para que se possa digitar algo novo ou seja apaga o lixo que sobra na porta Serial

Serial.println("Que temperatura ?"); //Mostra para o usuario digitar algo
delay(5000);

Serial.available(); //Vê que algo foi digitaldo, o "Truque é aqui nesse momento que ha o                                        //transporte dos dados do Arduino para o PC"
delay(100); //Este tempo sera como uma pausa para que todos os dados digitados                         //possam chegar no PC de boa..

Fim.

Caso queira usar inteiro para senhar:

//Convertendo valor serial em número inteiro ARDUINO
//Primeiro fiz uma váriavel CHAR receber os valores como se fossem caracter


for(int x = 0; x < 3; x++){

recebe[x] = Serial.read();

}

//Depois fiz uma Váriavel inteira receber o valor convertido da Váriavel "recebe" para inteiro


programmer = strtol(recebe + 0, NULL, 10);

Serial.println(programmer);

delay(5000);

}

...

Usa o programer no teu IF para ver se a senha esta correta...

Meu Professor de programação me disse assim inteiros você usa para fazer contas ou seja para calculos na programação já CHAR você não faz calculos você usa em Senha, RG, CPF entre outros que não realizem contas matemáticas..

Espero ter ajudado..

Já faz algum tempo desse post mais é sempre bom adicionar conteúdo para ajudar alguém que precise.
Achei um método muito fácil estava estudando um livro e usei esta função, depois fica da necessidade de cada uma de como utiliza-la.

Meu caso:  Arduino "não lê números inteiro" ai lembrei da Função "strtol(variável char + local de onde começa a converção, NULL, 10 )".

ou seja: 1 - "variável char + local de onde começa a converção" =  tenho uma variavel char[3] que tenha 3 números ou letras no meio de números que são vistos como caracteres, eu pego o valor total da váriavel char "sem usar os colchetes" exemplo: "variável + número", este número seria a partir de que valor que você quer que comece a conversão exemplo: "variável[3] = R10" se eu colocasse "variável + 1" a variável inteiro que receberia a conversão pegaria os valor "10".

2 - NULL meio confuso mais no caso se houvesse um ponteiro mais na duvida sempre use NULL

3 - 10 por que valores inteiros são decimais.

Segue meu código bem simples:

...

//Convertendo valor serial em número inteiro ARDUINO
//Primeiro fiz uma váriavel CHAR receber os valores como se fossem caracter


for(int x = 0; x < 3; x++){

recebe[x] = Serial.read();

}

//Depois fiz uma Váriavel inteira receber o valor convertido da Váriavel "recebe" para inteiro


programmer = strtol(recebe + 0, NULL, 10);

Serial.println(programmer);

delay(5000);

}

...

Depois você utiliza o valor de "programmer" que no meu caso seria a temperatura escolhida..

O ser humano tem muita dificuldade em pensar com um computador, por isto escrevem rotinas imensas para coisas simples, por exemplo, se o valor máximo que eu quero transmitir para o meu uC for de 16bits, basta fazer isto no lado do cliente:

int a = 25;unsigned char * aux;

//faço minha variável auxiliar apontar para o endereço de memoria da variável "a"
aux = &a;

send_byte(aux[1]);
send_byte(aux[0]);

Já no uC você deve fazer o contrário, veja o código:

unsigned char * number;int a;


//faço minha variável number apontar para o endereço de memoria da variável "a"
number = &a;

number[1] = read_byte();
number[0] = read_byte();

Desta forma quando você olhar o valor de "a" ele trará o valor transmitido pela USART, veja é um código simples para ser executado pelo uC e garanto que será executado inúmeras vezes mais rápido que tentar converter texto em inteiro, se o numero não for muito grande (0-255) aconselho ainda utilizar unsigned char.

{

Para alguém que usa Delphi ou Lazarus para acessar um chip ARM via USB-UART usando componente de acesso a serial

}

//declare strutils no USES

//para enviar:

begin

porta.SendData(valor inteiro);

end;

//para receber via serial

begin

//recebe como inteiro

valor :=  inttostr( int64 ( chr ( variant(porta.ReadData) ) ) );

//recebe como binario string '00000000'

seu_texto:=( string( ( strutils.intToBin(int64(chr(variant(porta.ReadData))),8) ) ) );

end;

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço