collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[27 de Março de 2024, 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Veículo semi-autónomo RF  (Lida 16122 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline Ricardo

  • Mini Robot
  • *
  • Mensagens: 110
Veículo semi-autónomo RF
« em: 10 de Março de 2010, 18:27 »
Tenho estado a trabalhar num projecto pessoal que consiste num veículo semi-autónomo. O chassis é o da Polulu que comprei na loja da lusorobotica, e o controlador é um arduino duemilanove com um motor shield em cima.

A razão pela qual eu o chamo de semi-autónomo é porque quero transferir grande parte da lógica para um PC, que depois enviará as ordens ao veículo, mantendo ainda assim alguma autonomia que permita ao veículo circular mesmo sem a ajuda do PC.

Como tenho mais do que uma placa arduino (na verdade tenho um duemilanove, um roboduino e um arduino nano), já consegui alguns resultados utilizando transmissores/receptores de 315Mhz que adquiri no ebay, cujo alcance e eficiência me surpreenderam pela positiva.

Os testes que tenho feito envolvem, resumidamente, num lado uma pequena aplicação em vb.net, que comunica via série para um arduino nano ligado a um emissor RF, no outro lado um chassis com um arduino duemilanove, com um motor shield e um receptor RF, que recebe as ordens para o movimento dos motores.

Como ainda estou a dar os primeiros passos nesta área da robótica, têm-se levantado algumas questões sobre as quais pedia ajuda aos mais experientes neste assunto.

Acredito que uma parte do problema esteja no código (já há muito tempo que trabalho em VB, em detrimento do C que desde o tempo da faculdade quase não toco), até porque neste momento as ligações e os componentes estão reduzidos ao mínimo.

Assim sendo, entre outras questões que também tenho, pergunto:

1-   Qual é a “função” dos delays dentro dos loops? Eu percebo o que fazem, mas são sempre necessários? E o tempo de delay deve depender de algum factor em particular? É que com todos os delays dos vários códigos e dos vários arduinos, acabo por ter demasiado desfasamento entre a ordem dada no PC e a resposta do veículo. E se elimino estes delays (ou se coloco valores muito baixos) passo a ter comportamentos muito estranhos quer no emissor,  quer no veículo.

2-   O facto de ter o arduino com um motor shield alimentado por 6 pilhas AA, implica algum cuidado no código? Digo isto porque, mesmo quando os valores recebidos estão correctos (uso um terceiro arduino com um lcd shield para o comprovar), o veículo parece ficar “bloqueado” com uma determinada leitura, e não pára!

3-   Qual é a forma mais eficiente de enviar informação do VB.net para o Arduino via porta série? Já vi vários exemplos e o código que uso actualmente obriga-me a usar um timer com pelo menos 200 ms de delay, pois de outra forma o arduino “atrapalha-se” com os dados que lhe mando (acredito que esteja relacionado com o problema da 1ª questão…)



Assim que conseguir, coloco aqui algumas imagens do layout, e os códigos que utilizo.
Qualquer observação será bem vinda!

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Veículo semi-autónomo RF
« Responder #1 em: 10 de Março de 2010, 19:06 »
1-   Qual é a “função” dos delays dentro dos loops? Eu percebo o que fazem, mas são sempre necessários? E o tempo de delay deve depender de algum factor em particular? É que com todos os delays dos vários códigos e dos vários arduinos, acabo por ter demasiado desfasamento entre a ordem dada no PC e a resposta do veículo. E se elimino estes delays (ou se coloco valores muito baixos) passo a ter comportamentos muito estranhos quer no emissor,  quer no veículo.
No que toca a comunicação, tens de ter uma periodicidade de envio da informação. Isso é uma forma de garantir a integridade dos dados que recebeste, bem como detectar se os estás a receber ou não.
Esta periodicidade é dada pelos delays...

2-   O facto de ter o arduino com um motor shield alimentado por 6 pilhas AA, implica algum cuidado no código? Digo isto porque, mesmo quando os valores recebidos estão correctos (uso um terceiro arduino com um lcd shield para o comprovar), o veículo parece ficar “bloqueado” com uma determinada leitura, e não pára!
Isso parece-me ser um erro de programação ou ligações.
A única coisa que tens de ter em atenção é os sinais que estás a mandar para o Circuito Integrado que controla os motores. Normalmente funcionam por PWM, ou seja, tens de ligar a um pino PWM do Arduino para lhe dares a intensidade dos motores. Talvez te tenhas enganado a ligar isso num pin k nao é PWM.

3-   Qual é a forma mais eficiente de enviar informação do VB.net para o Arduino via porta série? Já vi vários exemplos e o código que uso actualmente obriga-me a usar um timer com pelo menos 200 ms de delay, pois de outra forma o arduino “atrapalha-se” com os dados que lhe mando (acredito que esteja relacionado com o problema da 1ª questão…)
Isso depende muito do tipo de comunicação que estás a usar.
Ainda não percebi se por RF estás a usar módulos RF 433MHz, ou se te referes a "comunicação sem fios".

Offline Ricardo

  • Mini Robot
  • *
  • Mensagens: 110
Re: Veículo semi-autónomo RF
« Responder #2 em: 11 de Março de 2010, 11:35 »
Ora aqui estão algumas imagens do que tenho até agora

O emissor:


O veiculo com o receptor:


O receptor extra para teste:


A app VB.Net simplificada tem este aspecto:


E resume-se, para já, ao envio do valor da caixa de texto num intervalo definido pelo temporizador (normalmente 500ms), resumidamente:

SerialPort1.WriteLine("^" & valor.Text & "$")

Este valor é a direcção e a velocidade dos motores esquerdo e direito.





Offline Ricardo

  • Mini Robot
  • *
  • Mensagens: 110
Re: Veículo semi-autónomo RF
« Responder #3 em: 11 de Março de 2010, 11:47 »
O código dos dois arduinos emissor e receptor, respectivamente:

Citar
#include <VirtualWire.h> 
#undef int
#undef abs
#undef double
#undef float
#undef round
#define START_COLOR_CHAR '^'
#define END_COLOR_CHAR '$'
#define COLOR_SIZE 12
char serialMessage[COLOR_SIZE]="F000F000";
boolean readingSerial;
boolean readingSerial2;
unsigned int count;
unsigned int readChar;

void setup()
{
    vw_set_ptt_inverted(true);
    vw_setup(2000);           
    vw_set_tx_pin(3);         
    Serial.begin(2400);
    readingSerial = false;}

void serialReadColor() {
  readingSerial = true;
  count = 0; 
  iniReading:
  if (Serial.available() > 0) {
    readChar = Serial.read();
    if (readChar == END_COLOR_CHAR || count == COLOR_SIZE) {
      goto endReading;
    } else {
      serialMessage[count++] = readChar;
      goto iniReading;
    }
  }
  goto iniReading;
  endReading:
  readingSerial = false;
}

void loop()
{
    readingSerial2 = false;
    if (Serial.available() > 0 && !readingSerial) {
    if (Serial.read() == START_COLOR_CHAR) {
            readingSerial2 = true;
      serialReadColor();
    }
  }
  const char *msg;
  msg = serialMessage;   
  vw_send((uint8_t *)msg, strlen(msg));
  vw_wait_tx();       
  Serial.println(msg); 
  delay(50);
}


 
Citar
#include <VirtualWire.h>
#undef int
#undef abs
#undef double
#undef float
#undef round

int EN1 = 6;
int EN2 = 5; //Roboduino Motor shield uses Pin 9
int IN1 = 7;
int IN2 = 4; //Latest version use pin 4 instead of pin 8
int ledPin = 13;


void Motor1(int pwm, boolean reverse) {
  analogWrite(EN1,pwm);
  if(reverse) {
    digitalWrite(IN1,HIGH); }
  else {
    digitalWrite(IN1,LOW); }
}
 
void Motor2(int pwm, boolean reverse) {
  analogWrite(EN2,pwm);
  if(reverse) {
    digitalWrite(IN2,HIGH); }
  else { digitalWrite(IN2,LOW); }
}

void setup()
{
    Serial.begin(9600);   
    pinMode(13, OUTPUT); 
    int i; //
    for(i=4;i<=7;i++) //For Roboduino Motor Shield 6-9//
      pinMode(i, OUTPUT);
 
    vw_set_ptt_inverted(true);   
    vw_setup(2000);             
    vw_set_rx_pin(2);         
    vw_rx_start();               
}

void loop()
{

    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;
    char *msg="F000F000";
    char de[2]="F";
    char dd[2]="F";
    char esq[4]="000";
    char dir[4]="000";
    if (vw_get_message(buf, &buflen))
    {
    int i;
   
       
    for (i = 0; i < buflen; i++)
    {
        Serial.print(buf[ i ]); 
         msg[ i ]=buf[ i ];
    } 
    Serial.println("");
   }

   
    strncpy(de,msg+0,1);
    strncpy(esq,msg+1,3);
    strncpy(dd,msg+4,1);
    strncpy(dir,msg+5,3);
   
    int a,b;
    a=atoi(esq);
    b=atoi(dir);
   
    if(de[0]=='F')
    {
      Motor1(atoi(esq),false);
    }
    else
    {
      Motor1(atoi(esq),true);
    }
    if(dd[0]=='F')
    {
      Motor2(atoi(dir),true);
    }
    else
    {
      Motor2(atoi(dir),false);
    }
    delay(200);
}


Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re: Veículo semi-autónomo RF
« Responder #4 em: 11 de Março de 2010, 11:56 »
Está bastante engraçado, a "#include <VirtualWire.h>" é para os módulos?

Offline Ricardo

  • Mini Robot
  • *
  • Mensagens: 110
Re: Veículo semi-autónomo RF
« Responder #5 em: 11 de Março de 2010, 12:19 »
Antes de mais, obrigado pela paciencia e pela resposta rápida!

1-   Qual é a “função” dos delays dentro dos loops? Eu percebo o que fazem, mas são sempre necessários? E o tempo de delay deve depender de algum factor em particular? É que com todos os delays dos vários códigos e dos vários arduinos, acabo por ter demasiado desfasamento entre a ordem dada no PC e a resposta do veículo. E se elimino estes delays (ou se coloco valores muito baixos) passo a ter comportamentos muito estranhos quer no emissor,  quer no veículo.
No que toca a comunicação, tens de ter uma periodicidade de envio da informação. Isso é uma forma de garantir a integridade dos dados que recebeste, bem como detectar se os estás a receber ou não.
Esta periodicidade é dada pelos delays...
Certo. Uma coisa que me apercebi ao tentar diferentes buad rates, é que os 2400 parecem dar os melhores resultados, mas entrentanto reparei que comando "vw_setup(2000);" estará também a definir a velocidade de comunicação do emissor/receptor. Deverei aqui colocar também os 2400? Numa primeira análise pensei que o facto de ter baixado o baud rate (inicialmente estava em 9600) resultava numa comunicação com menos erros, e por isso, mais eficiente.Agora já não tenho tanta certeza...  Esta combinação dos delay com os baud rates não é fácil :)

2-   O facto de ter o arduino com um motor shield alimentado por 6 pilhas AA, implica algum cuidado no código? Digo isto porque, mesmo quando os valores recebidos estão correctos (uso um terceiro arduino com um lcd shield para o comprovar), o veículo parece ficar “bloqueado” com uma determinada leitura, e não pára!
Isso parece-me ser um erro de programação ou ligações.
A única coisa que tens de ter em atenção é os sinais que estás a mandar para o Circuito Integrado que controla os motores. Normalmente funcionam por PWM, ou seja, tens de ligar a um pino PWM do Arduino para lhe dares a intensidade dos motores. Talvez te tenhas enganado a ligar isso num pin k nao é PWM.
Penso que aqui não existem grandes problemas. As ligações são simples, baseadas na sua grande maioria em esquemas vistos na net, e o código também é um copy/paste adaptado de outras experiencias. Mas não garanto nada. Já me tinha esquecido da dificuldade que existe em trabalhar strings em C... :)

3-   Qual é a forma mais eficiente de enviar informação do VB.net para o Arduino via porta série? Já vi vários exemplos e o código que uso actualmente obriga-me a usar um timer com pelo menos 200 ms de delay, pois de outra forma o arduino “atrapalha-se” com os dados que lhe mando (acredito que esteja relacionado com o problema da 1ª questão…)
Isso depende muito do tipo de comunicação que estás a usar.
Ainda não percebi se por RF estás a usar módulos RF 433MHz, ou se te referes a "comunicação sem fios".
Provavelmente não me expliquei lá muito bem. A comunicação sem fios de que falo é os tais modulos RF que mostrei que trabalham a 315MHz, se não estou em erro. Mas esse é um trabalho do arduino, que recebe a informação do VB.net via usb/serie.

Para já, não estou muito preocupado com eventuais delays entre a ordem e a acção do veiculo, mas quanto menor for este atraso, tanto melhor. Até porque o próximo passo será a incoporação de uma camera wireless no veiculo que irá enviar imagens para o PC e que vai utilizar esta informação para orientar o veiculo.

Offline Ricardo

  • Mini Robot
  • *
  • Mensagens: 110
Re: Veículo semi-autónomo RF
« Responder #6 em: 11 de Março de 2010, 12:27 »
Está bastante engraçado, a "#include <VirtualWire.h>" é para os módulos?

Sim, é a biblioteca para as funções dos modulos rf.  A facilidade com que se trabalha com estes módulos extremamente baratos (à volta de 5 euros cada par) é incrivel.
No meu caso, que ainda não domino muito bem o código do arduino, é ótimo resumir a comunição às linhas:
 
 vw_send((uint8_t *)msg, strlen(msg));
 vw_wait_tx();     

Para além disso, numa casa como a minha, onde o wifi quase que necessita de repetidores de uma divisão para a outra, consigo comunicar via rf de um extremo ao outro da casa, e com uma improvisação de antenas ridicula!

Offline LordNelthon

  • Mini Robot
  • *
  • Mensagens: 96
  • Programming Addicted
Re: Veículo semi-autónomo RF
« Responder #7 em: 11 de Março de 2010, 12:38 »
Está com bom aspecto. :)

Também estou a fazer um projecto idêntico, mas com servos e a estrutura meia rectangular feita em acrílico. Mas sem ecrã. :)
« Última modificação: 11 de Março de 2010, 12:39 por SONIC_ »
Simplesmente fanático por Open Source

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Veículo semi-autónomo RF
« Responder #8 em: 11 de Março de 2010, 13:42 »
Estás bem encaminhado :) Parece-me que percebes daquilo que falas e tens tudo bem organizado.
Entretanto não percebi em que parte queres ajuda, podes ser mais específico.

Só uma nota: os baudrates foram "standardizados" e deve tentar-se cumprir com esses standards, ou seja, tal como a comunicação por serial só admite aqueles valores que estão na ComboBox da janela Serial do IDE do Arduino, a comunicação sem fios costuma-se usar esses baud-rates. Isto tudo para dizer que 2000 não é um baudrate standard, mas 2400 já é. ;)

Offline Ricardo

  • Mini Robot
  • *
  • Mensagens: 110
Re: Veículo semi-autónomo RF
« Responder #9 em: 11 de Março de 2010, 16:05 »
Estás bem encaminhado :) Parece-me que percebes daquilo que falas e tens tudo bem organizado.
Obrigado, mas... não será assim tanto. :)
A electrónica não é a minha área. Embora a curiosidade já cá esteja ha algum tempo, só com a descoberta do arduino é que consegui por em prática algumas ideias que com os meus parcos conhecimentos pareciam impossiveis.
De qualquer forma tenho vindo a aprender algumas coisas. E este projecto não é mais que uma desculpa para continuar a explorar este mundo.

Só uma nota: os baudrates foram "standardizados" e deve tentar-se cumprir com esses standards, ou seja, tal como a comunicação por serial só admite aqueles valores que estão na ComboBox da janela Serial do IDE do Arduino, a comunicação sem fios costuma-se usar esses baud-rates. Isto tudo para dizer que 2000 não é um baudrate standard, mas 2400 já é. ;)

Vou tentar "sincronizar" todos os valores e ver o que dá.

Entretanto, aproveitando as simpáticas palavras de apoio do forum e o facto do bébé não estar em casa, fiz um teste com a babycam montada em cima do veiculo e consegui circular por toda a casa (até a babycam perder o sinal...) o que comprovou que a resposta do veiculo não está assim tão atrasada.
Outra constatação é de que terei sempre alguma dificuldade com a precisão do movimento, mas tal como disse antes isso também não é problemático.

Logo colocarei aqui a nova versão com as imagens da camera.

Acrescento que inicialmente a ideia é fazer análise de imagem para, numa primeira fase, seguir o movimento, adaptando o que já fiz antes com uma webcam e um sistema pan&tilt e que me pareceu ter grandes potencialidades! :)

Em relação à navegação pela casa, e antes de tentar algumas ideias "radicais" que me passam pela cabeça (!), alguém tem alguma sugestão?

Obrigado!

Offline Ricardo

  • Mini Robot
  • *
  • Mensagens: 110
Re: Veículo semi-autónomo RF
« Responder #10 em: 11 de Março de 2010, 16:23 »
Está com bom aspecto. :)

Também estou a fazer um projecto idêntico, mas com servos e a estrutura meia rectangular feita em acrílico. Mas sem ecrã. :)

Uma das minhas outras "pancadas" é a de tentar trabalhar com acrilico, que me parece um bom material para criar caixas e estruturas personalizadas.  Já fiz algumas tentativas, mas ainda não domino a técnica ;)
Acho uma excelente ideia, e tenho a certeza que também irei seguir esse caminho lá mais para a frente. A "base" em breadboards actual foi apenas uma ideia para permitir futuros "upgrades" ao veiculo.  :D

Compreendo que com os servos se consegue muito maior precisão sem grande trabalho, mas para já os dc vão servir para os primeiros testes.

E acredito que tem a velocidade necessária para perseguir... o gato...  ;D


Offline VascoP

  • Mini Robot
  • *
  • Mensagens: 66
Re: Veículo semi-autónomo RF
« Responder #11 em: 11 de Março de 2010, 19:15 »
Uma pergunta, a webcam está a transmitir os dados em tempo real para o pc ou armazena-os em algum lado?

Offline Ricardo

  • Mini Robot
  • *
  • Mensagens: 110
Re: Veículo semi-autónomo RF
« Responder #12 em: 12 de Março de 2010, 09:42 »
Uma pergunta, a webcam está a transmitir os dados em tempo real para o pc ou armazena-os em algum lado?

Os dados são trasmitidos em tempo real.
Neste momento não é bem uma webcam, ou melhor, é uma espécie de webcam  wireless.
È um babymonitor que está a venda no continente, que tem uma camera com microfone, mas que se liga via wireless a um receptor usb no PC.
É uma solução de recurso uma vez que esta serve para monitorizar o bébé. Ainda assim surpreendeu-me pela positiva, pelo alcance do sinal.

Assim que puder coloco aqui mais umas fotos

Offline Ricardo

  • Mini Robot
  • *
  • Mensagens: 110
Re: Veículo semi-autónomo RF
« Responder #13 em: 12 de Março de 2010, 14:58 »
Só para dar uma ideia do esquema actual  ;D
 


O próximo passo é colocar uma câmara com o sistema pan&tilt que tenho aqui, controlável também remotamente, e alguns sensores no veículo que impeçam-no de chocar com as coisas (com o sistema de condução remota perde-se muito a sensação de profundidade)

Embora o emissor/receptor rf estejam a responder às necessidades, ainda não sei como irei conseguir enviar informação do veículo para o pc (sem ser a imagem).
Já alguém experimentou utilizar dois pares de emissor/receptor para simular uma comunicação duplex (mesmo que seja só half-duplex)?

Offline VascoP

  • Mini Robot
  • *
  • Mensagens: 66
Re: Veículo semi-autónomo RF
« Responder #14 em: 12 de Março de 2010, 22:30 »
Os dados são trasmitidos em tempo real.
Neste momento não é bem uma webcam, ou melhor, é uma espécie de webcam  wireless.
È um babymonitor que está a venda no continente, que tem uma camera com microfone, mas que se liga via wireless a um receptor usb no PC.
É uma solução de recurso uma vez que esta serve para monitorizar o bébé. Ainda assim surpreendeu-me pela positiva, pelo alcance do sinal.

Assim que puder coloco aqui mais umas fotos

Eu estou a pensar num sistema análogo e andei a ver isso das camaras wireless, essas baby cams têm boa qualidade? É que o que vi de camaras wi-fi era tudo caríssimo, e como sabem o arduino não consegue suportar video ao mesmo tempo do resto das informações todas de sensores e actuadores de modo que fica o Xbee inviabilizado para a camara...

Fico à espera do teu bitaite :P