More Serial Trouble
hi. in program works great. however, in program gather gyro data. data contaminated byte command sets motor speed. how can prevent happening.
//libraries
#include <afmotor.h>
#include <softwareserial.h>
#include "math.h"
//software serial
#define rxpin 6 // defines "recieve" pin software serial motor controller
#define txpin 7 // defines "transmit" pin software serial motor controller
#define resetpin 8 // defines reset pin motor controller
//variable declaration
softwareserial motorserial = softwareserial(rxpin, txpin);
float vzero=analogread(0);
float vinputv=analogread(1);
float vinputh=analogread(2);
float biasv=0.00;
float biash=0.00;
float sense=2.00;
float angvv=0.000000;
float angvh=0.000000;
float analogv=0.00;
float analogh=0.00;
float angvvcorr=4.28*2.5;
float angvhcorr=4.28*2.5;
int correction=0;
int mspeed=0;
int input=0;
char upk='8';
char downk='2';
char stablek='5';
char leftk='4';
char rightk='6';
char sup='a';
char sdown='s';
int setspeed=0;
void setup()
{
serial.begin(9600);
serial.flush();
initmotor();
}
void loop()
{
if ( serial.available() > 0)
{
input=serial.read();
if (input==sup)
{
setspeed=setspeed+5;
setmotor(setspeed);
}
else if (input==sdown)
{
setspeed=setspeed-5;
setmotor(setspeed);
}
else if(input==upk)
{
}
else if(input==stablek)
{
}
else if(input==downk)
{
}
else if(input==leftk)
{
}
else if(input==rightk)
{
}
else if(input=='q')
{
gyro();
}
}
}
void gyro()
{
vzero=analogread(0);
vinputv=analogread(1);
vinputh=analogread(2);
if (correction==0)
{
biasv=vinputv-vzero;
biash=vinputh-vzero;
correction=1;
}
analogv=(vinputv)-(vzero)-biasv;
analogh=(vinputh)-(vzero)-biash;
if((analogv==-2)||(analogv==-1)||(analogv==1)||(analogv==2))
{
analogv=0.00;
}
if((analogh==-2)||(analogh==-1)||(analogh==1)||(analogh==2))
{
analogh=0.00;
}
angvv=(angvvcorr*(analogv/sense));
angvh=(angvhcorr*(analogh/sense));
serial.write(char(int(angvv)/3));
serial.write(char(int(angvh)/3));
}
void initmotor()
{
pinmode(txpin, output);// serial transmit pin
pinmode(resetpin, output); // motor reset pin
motorserial.begin(9600);
// reset motor controller (by setting low high signals resetpin)
digitalwrite(resetpin, high);
delay(10);
digitalwrite(resetpin, low);
delay(10);
digitalwrite(resetpin, high);
delay(10);
}
void setmotor(int speed)
{
int motorindex=0;
unsigned char buffer[4];// create packet buffer
unsigned char index = 0;
unsigned char targetspeed = speed;
buffer[0] = 0x80;
buffer[1] = 0x00;
buffer[2] = 0x00 | index;
buffer[3] = targetspeed;
sendpacket(buffer, 4);
}
void sendpacket(unsigned char *buffer, int buffercount)
{
for(int = 0; < buffercount; i++)
{
motorserial.print(buffer,byte);
}
}
//libraries
#include <afmotor.h>
#include <softwareserial.h>
#include "math.h"
//software serial
#define rxpin 6 // defines "recieve" pin software serial motor controller
#define txpin 7 // defines "transmit" pin software serial motor controller
#define resetpin 8 // defines reset pin motor controller
//variable declaration
softwareserial motorserial = softwareserial(rxpin, txpin);
float vzero=analogread(0);
float vinputv=analogread(1);
float vinputh=analogread(2);
float biasv=0.00;
float biash=0.00;
float sense=2.00;
float angvv=0.000000;
float angvh=0.000000;
float analogv=0.00;
float analogh=0.00;
float angvvcorr=4.28*2.5;
float angvhcorr=4.28*2.5;
int correction=0;
int mspeed=0;
int input=0;
char upk='8';
char downk='2';
char stablek='5';
char leftk='4';
char rightk='6';
char sup='a';
char sdown='s';
int setspeed=0;
void setup()
{
serial.begin(9600);
serial.flush();
initmotor();
}
void loop()
{
if ( serial.available() > 0)
{
input=serial.read();
if (input==sup)
{
setspeed=setspeed+5;
setmotor(setspeed);
}
else if (input==sdown)
{
setspeed=setspeed-5;
setmotor(setspeed);
}
else if(input==upk)
{
}
else if(input==stablek)
{
}
else if(input==downk)
{
}
else if(input==leftk)
{
}
else if(input==rightk)
{
}
else if(input=='q')
{
gyro();
}
}
}
void gyro()
{
vzero=analogread(0);
vinputv=analogread(1);
vinputh=analogread(2);
if (correction==0)
{
biasv=vinputv-vzero;
biash=vinputh-vzero;
correction=1;
}
analogv=(vinputv)-(vzero)-biasv;
analogh=(vinputh)-(vzero)-biash;
if((analogv==-2)||(analogv==-1)||(analogv==1)||(analogv==2))
{
analogv=0.00;
}
if((analogh==-2)||(analogh==-1)||(analogh==1)||(analogh==2))
{
analogh=0.00;
}
angvv=(angvvcorr*(analogv/sense));
angvh=(angvhcorr*(analogh/sense));
serial.write(char(int(angvv)/3));
serial.write(char(int(angvh)/3));
}
void initmotor()
{
pinmode(txpin, output);// serial transmit pin
pinmode(resetpin, output); // motor reset pin
motorserial.begin(9600);
// reset motor controller (by setting low high signals resetpin)
digitalwrite(resetpin, high);
delay(10);
digitalwrite(resetpin, low);
delay(10);
digitalwrite(resetpin, high);
delay(10);
}
void setmotor(int speed)
{
int motorindex=0;
unsigned char buffer[4];// create packet buffer
unsigned char index = 0;
unsigned char targetspeed = speed;
buffer[0] = 0x80;
buffer[1] = 0x00;
buffer[2] = 0x00 | index;
buffer[3] = targetspeed;
sendpacket(buffer, 4);
}
void sendpacket(unsigned char *buffer, int buffercount)
{
for(int = 0; < buffercount; i++)
{
motorserial.print(buffer,byte);
}
}
i'm not sure mean "but data contaminated byte command sets motor speed" -- think problem casts incorrect in serial.write() commands.
also: use # button posting code.
also: use # button posting code.
Arduino Forum > Forum 2005-2010 (read only) > Software > Interfacing > More Serial Trouble
arduino
Comments
Post a Comment