0 Membros e 1 Visitante estão a ver este tópico.
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…)
#include <VirtualWire.h> #undef int#undef abs#undef double#undef float#undef round#define START_COLOR_CHAR '^'#define END_COLOR_CHAR '$'#define COLOR_SIZE 12char 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);}
#include <VirtualWire.h> #undef int#undef abs#undef double#undef float#undef roundint 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 8int 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);}
Citação de: Ricardo em Março 10, 2010, 19:271- 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...
Citação de: Ricardo em Março 10, 2010, 19:272- 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.
Citação de: Ricardo em Março 10, 2010, 19:273- 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".
Está bastante engraçado, a "#include <VirtualWire.h>" é para os módulos?
Estás bem encaminhado Parece-me que percebes daquilo que falas e tens tudo bem organizado.
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á é.
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 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