03-19-2018 08:49 PM
What is the device sending the data? I'd like to take a look at its manual (presumed available on the Web) to better understand its data structure.
Bob Schor
03-20-2018 01:32 PM
I have a gyroscope sending data to a ATmega2560 arduino, the Arduino sends the data to the PC.
Below is the Arduino code:
#include "TimerOne.h"
enum Gyro_Status {
WARNING,
NO_DATA,
CAUTION,
NORMAL,
CHECKSUM_FAIL
};
struct PacketType {
byte Status;
byte TagID;
byte angleLSB;
byte angleMSB;
byte TagData;
byte CheckSum;
byte index;
boolean complete;
boolean processed;
};
PacketType GyroPacket = {0, 0, 0, 0, 0, 0, 0, false, true};
unsigned short combined;
boolean Trigger=false;
boolean LoopTrigger=false;
unsigned long StartTime;
unsigned long LoopTime;
void setup() {
pinMode(42, OUTPUT);
pinMode(34, OUTPUT);
pinMode(38, OUTPUT);
pinMode(32, INPUT);
// put your setup code here, to run once:
Serial.begin(57600);
Serial1.begin(1000000);
digitalWrite(38,HIGH);
digitalWrite(34,HIGH);
Timer1.initialize(2000);
Timer1.attachInterrupt(Blink);
StartTime = millis()-1;
}
void loop() {
while (Serial.available()){
byte val= Serial.read();
if (val == 'A'){
Serial.println("Hello!");
StartTime = millis();
LoopTrigger=true;
}
if (val == 'Z'){
Serial.println("Hi!");
LoopTrigger=false;
}
}
if(Trigger && LoopTrigger){
//Serial.println("Hello world!");
digitalWrite(38,HIGH);
LoopTime=millis()-StartTime;
digitalWrite(42,HIGH);
while(Serial1.available() && !GyroPacket.complete && GyroPacket.processed){
// Serial.println("Reading!");
byte Sum = 0;
byte RECvalue = Serial1.read();
byte statusCheck;
PacketWrite(GyroPacket, GyroPacket.index, RECvalue);
GyroPacket.index++;
// Serial.print("I received: ");
// Serial.println(GyroPacket.index);
// Serial.println(RECvalue);
if(GyroPacket.index == 6){
GyroPacket.complete = true;
GyroPacket.processed = false;
GyroPacket.index = 0;
statusCheck = (GyroPacket.Status & 0xC0) >> 6;
Sum = GyroPacket.Status + GyroPacket.TagID + GyroPacket.angleLSB + GyroPacket.angleMSB + GyroPacket.TagData + GyroPacket.CheckSum;
// Serial.print("Sum = ");
// Serial.println(Sum);
if (Sum != 0xFF){
// Serial.println("CHECKSUM_FAIL!");
// Serial.println("C_F");
}else{
//Serial.println("CHECKSUM_CORRECT!");
//Serial.println("C_C");
if (statusCheck != NORMAL){
switch (statusCheck) {
case WARNING:
Serial.println("WARNING");
break;
case NO_DATA:
Serial.println("NO_DATA");
break;
case CAUTION:
Serial.println("CAUTION");
break;
default:
//error
Serial.println("Status Read Error");
}
} else {
// Serial.println("NORMAL");
if(digitalRead(32)== HIGH){
// Serial.println("OK");
combined = GyroPacket.angleMSB; //send MSB to rightmost 8 bits
combined = combined<<8; //shift MSB over to leftmost 8 bits
combined |= GyroPacket.angleLSB; //logical OR keeps MSB intact in combined and fills in rightmost 8 bits
Serial.print("*");
Serial.print(LoopTime);
Serial.print("$");
Serial.print(combined,DEC);
Serial.print("#");
}
else{
Serial.print("Gyro NOT OK!");
}
}
}
}
}
digitalWrite(42,LOW);
GyroPacket.complete = false;
GyroPacket.processed = true;
digitalWrite(38,LOW);
Trigger=false;
}
}
void Blink()
{
Trigger=true;
}
void PacketWrite(PacketType &dataPacket, byte index, byte value){
switch(index){
case 0:
dataPacket.Status = value;
break;
case 1:
dataPacket.TagID = value;
break;
case 2:
dataPacket.angleLSB = value;
break;
case 3:
dataPacket.angleMSB = value;
break;
case 4:
dataPacket.TagData = value;
break;
case 5:
dataPacket.CheckSum = value;
break;
default:
dataPacket.index = 0;
}
}
The output data from LabVIEW looks like this:
*11$64600# *13$64600# *16$64600# *18$64598# *19$64597# *21$64598# *23$64600# *25$64599#