├── 3D Headset Model ├── Clip_V3b.skp ├── FaceMount2.skp ├── FrontPlate_2.skp ├── LCDPlate_1-1.skp ├── LCDPlate_1.skp ├── LensHolder2.skp ├── ClipV3b_fixed.stl ├── ControlBoxTop.skp ├── ControlBoxBottom.skp ├── FaceMount2_fixed.stl ├── FrontPlate2_fixed.stl ├── LCDPlate1_fixed.stl ├── LensHolder2_fixed.stl ├── ControlBoxTop_fixed.stl └── ControlBoxBottom_fixed.stl ├── Arduino ├── readme.txt ├── Compass.ino ├── Math.ino ├── Output.ino ├── DCM.ino ├── Sensors.ino └── Final_arduino_code.ino ├── IMU Calibration - Processing ├── Razor_AHRS_test │ ├── data │ │ └── Univers-66.vlw │ └── Razor_AHRS_test.pde └── Magnetometer_calibration │ ├── magnetom.float │ ├── code │ └── EJML.jar.jar │ ├── data │ └── Univers-66.vlw │ └── Magnetometer_calibration.pde ├── README.md ├── LVDS-HDMI Extension Board ├── hdmi_breakout_pcb_v02.gm1 ├── hdmi_breakout_pcb_v02-slotholes.txt ├── hdmi_breakout_pcb_v02-roundholes.txt ├── hdmi_breakout_pcb_v02.gbs ├── hdmi_breakout_pcb_v02.gts ├── hdmi_breakout_pcb_v02.gbo ├── hdmi_breakout_pcb_v02.gto ├── hdmi_breakout_pcb_v02.gbl └── hdmi_breakout_pcb_v02.gtl └── FreePie ├── FREEPIE trackir GY85.py ├── FREEPIE vireio GY85.py └── freepie mouse emulation.py /3D Headset Model/Clip_V3b.skp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxabrahamsson/OpenVR/HEAD/3D Headset Model/Clip_V3b.skp -------------------------------------------------------------------------------- /3D Headset Model/FaceMount2.skp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxabrahamsson/OpenVR/HEAD/3D Headset Model/FaceMount2.skp -------------------------------------------------------------------------------- /3D Headset Model/FrontPlate_2.skp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxabrahamsson/OpenVR/HEAD/3D Headset Model/FrontPlate_2.skp -------------------------------------------------------------------------------- /3D Headset Model/LCDPlate_1-1.skp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxabrahamsson/OpenVR/HEAD/3D Headset Model/LCDPlate_1-1.skp -------------------------------------------------------------------------------- /3D Headset Model/LCDPlate_1.skp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxabrahamsson/OpenVR/HEAD/3D Headset Model/LCDPlate_1.skp -------------------------------------------------------------------------------- /3D Headset Model/LensHolder2.skp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxabrahamsson/OpenVR/HEAD/3D Headset Model/LensHolder2.skp -------------------------------------------------------------------------------- /3D Headset Model/ClipV3b_fixed.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxabrahamsson/OpenVR/HEAD/3D Headset Model/ClipV3b_fixed.stl -------------------------------------------------------------------------------- /3D Headset Model/ControlBoxTop.skp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxabrahamsson/OpenVR/HEAD/3D Headset Model/ControlBoxTop.skp -------------------------------------------------------------------------------- /Arduino/readme.txt: -------------------------------------------------------------------------------- 1 | open final_arduino_code.ino replace your processing calibration results in here before uploading to arduino -------------------------------------------------------------------------------- /3D Headset Model/ControlBoxBottom.skp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxabrahamsson/OpenVR/HEAD/3D Headset Model/ControlBoxBottom.skp -------------------------------------------------------------------------------- /3D Headset Model/FaceMount2_fixed.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxabrahamsson/OpenVR/HEAD/3D Headset Model/FaceMount2_fixed.stl -------------------------------------------------------------------------------- /3D Headset Model/FrontPlate2_fixed.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxabrahamsson/OpenVR/HEAD/3D Headset Model/FrontPlate2_fixed.stl -------------------------------------------------------------------------------- /3D Headset Model/LCDPlate1_fixed.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxabrahamsson/OpenVR/HEAD/3D Headset Model/LCDPlate1_fixed.stl -------------------------------------------------------------------------------- /3D Headset Model/LensHolder2_fixed.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxabrahamsson/OpenVR/HEAD/3D Headset Model/LensHolder2_fixed.stl -------------------------------------------------------------------------------- /3D Headset Model/ControlBoxTop_fixed.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxabrahamsson/OpenVR/HEAD/3D Headset Model/ControlBoxTop_fixed.stl -------------------------------------------------------------------------------- /3D Headset Model/ControlBoxBottom_fixed.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxabrahamsson/OpenVR/HEAD/3D Headset Model/ControlBoxBottom_fixed.stl -------------------------------------------------------------------------------- /IMU Calibration - Processing/Razor_AHRS_test/data/Univers-66.vlw: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxabrahamsson/OpenVR/HEAD/IMU Calibration - Processing/Razor_AHRS_test/data/Univers-66.vlw -------------------------------------------------------------------------------- /IMU Calibration - Processing/Magnetometer_calibration/magnetom.float: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxabrahamsson/OpenVR/HEAD/IMU Calibration - Processing/Magnetometer_calibration/magnetom.float -------------------------------------------------------------------------------- /IMU Calibration - Processing/Magnetometer_calibration/code/EJML.jar.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxabrahamsson/OpenVR/HEAD/IMU Calibration - Processing/Magnetometer_calibration/code/EJML.jar.jar -------------------------------------------------------------------------------- /IMU Calibration - Processing/Magnetometer_calibration/data/Univers-66.vlw: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maxabrahamsson/OpenVR/HEAD/IMU Calibration - Processing/Magnetometer_calibration/data/Univers-66.vlw -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OpenVR 2 | 3 | OpenVR is a cheap DIY virtual reality headset project based on Oculus Rift DK1 made on a 3d printed frame. It is relatively easy to make and will cost you around 150 USD. 4 | 5 | Follow the guide to build one of your own: 6 | http://mclightning.com/openvr/ 7 | -------------------------------------------------------------------------------- /LVDS-HDMI Extension Board/hdmi_breakout_pcb_v02.gm1: -------------------------------------------------------------------------------- 1 | %FSTAX25Y25*% 2 | %MOIN*% 3 | %SFA1B1*% 4 | 5 | %IPPOS*% 6 | %ADD22C,0.010000*% 7 | %LNhdmi_breakout_pcb_v02-1*% 8 | %LPD*% 9 | G54D22* 10 | X02015Y03845D02* 11 | Y04935D01* 12 | Y03845D02* 13 | X03235D01* 14 | Y04935* 15 | X02015D02* 16 | X03235D01* 17 | M02* -------------------------------------------------------------------------------- /LVDS-HDMI Extension Board/hdmi_breakout_pcb_v02-slotholes.txt: -------------------------------------------------------------------------------- 1 | %FSTAX25Y25*% 2 | %MOIN*% 3 | %SFA1B1*% 4 | 5 | %IPPOS*% 6 | %ADD9502C,0.035430*% 7 | %LNhdmi_breakout_pcb_v02-slotholes-1*% 8 | %LPD*% 9 | G54D9502* 10 | X0234441Y0455008D02* 11 | Y0447921D01* 12 | X0290346Y0455008D02* 13 | Y0447921D01* 14 | Y0477449D02* 15 | Y0472724D01* 16 | X0234441Y0477449D02* 17 | Y0472724D01* 18 | M02* -------------------------------------------------------------------------------- /FreePie/FREEPIE trackir GY85.py: -------------------------------------------------------------------------------- 1 | import math 2 | 3 | def update(): 4 | global yaw 5 | global roll 6 | global pitch 7 | 8 | yaw = round(ahrsImu.yaw) 9 | roll = round(ahrsImu.roll) 10 | pitch = round(ahrsImu.pitch) 11 | 12 | trackIR.yaw = yaw - cyaw 13 | trackIR.roll = roll - croll 14 | trackIR.pitch = pitch - cpitch 15 | 16 | diagnostics.watch(yaw - cyaw) 17 | 18 | if starting: 19 | cyaw=0 20 | croll=0 21 | cpitch=0 22 | ahrsImu.update += update 23 | 24 | center = keyboard.getPressed(Key.Z) 25 | 26 | if center: 27 | cyaw = yaw 28 | croll = roll 29 | cpitch = pitch -------------------------------------------------------------------------------- /FreePie/FREEPIE vireio GY85.py: -------------------------------------------------------------------------------- 1 | def update(): 2 | global yaw 3 | global roll 4 | global pitch 5 | 6 | yaw = ahrsImu.yaw 7 | roll = ahrsImu.roll 8 | pitch = ahrsImu.pitch 9 | 10 | vireioSMT.yaw = yaw - cyaw 11 | vireioSMT.roll = roll - croll 12 | vireioSMT.pitch = pitch - cpitch 13 | 14 | diagnostics.watch(yaw-cyaw) 15 | diagnostics.watch(roll-croll) 16 | diagnostics.watch(pitch-cpitch) 17 | 18 | if starting: 19 | cyaw = 0 20 | croll = 0 21 | cpitch = 0 22 | ahrsImu.update += update 23 | 24 | center = keyboard.getPressed(Key.Z) 25 | 26 | if center: 27 | cyaw = yaw 28 | croll = roll 29 | cpitch = pitch -------------------------------------------------------------------------------- /Arduino/Compass.ino: -------------------------------------------------------------------------------- 1 | /* This file is part of the Razor AHRS Firmware */ 2 | 3 | void Compass_Heading() 4 | { 5 | float mag_x; 6 | float mag_y; 7 | float cos_roll; 8 | float sin_roll; 9 | float cos_pitch; 10 | float sin_pitch; 11 | 12 | cos_roll = cos(roll); 13 | sin_roll = sin(roll); 14 | cos_pitch = cos(pitch); 15 | sin_pitch = sin(pitch); 16 | 17 | // Tilt compensated magnetic field X 18 | mag_x = magnetom[0] * cos_pitch + magnetom[1] * sin_roll * sin_pitch + magnetom[2] * cos_roll * sin_pitch; 19 | // Tilt compensated magnetic field Y 20 | mag_y = magnetom[1] * cos_roll - magnetom[2] * sin_roll; 21 | // Magnetic Heading 22 | MAG_Heading = atan2(-mag_y, mag_x); 23 | } 24 | -------------------------------------------------------------------------------- /FreePie/freepie mouse emulation.py: -------------------------------------------------------------------------------- 1 | def update(): 2 | global yaw 3 | global roll 4 | global pitch 5 | yaw = ahrsImu.yaw 6 | roll = ahrsImu.roll 7 | pitch = ahrsImu.pitch 8 | 9 | if starting: 10 | yaw = 0 11 | roll = 0 12 | pitch = 0 13 | enabled = False 14 | ahrsImu.update += update 15 | 16 | diagnostics.watch(yaw) 17 | diagnostics.watch(roll) 18 | diagnostics.watch(pitch) 19 | 20 | deltaYaw = filters.delta(yaw) 21 | deltaPitch = filters.delta(pitch) 22 | deltaRoll = filters.delta(roll) 23 | 24 | if (enabled): 25 | mouse.deltaX = deltaYaw*10 26 | mouse.deltaY = -deltaPitch*10 27 | 28 | toggle = keyboard.getPressed(Key.Z) 29 | 30 | if toggle: 31 | enabled = not enabled -------------------------------------------------------------------------------- /LVDS-HDMI Extension Board/hdmi_breakout_pcb_v02-roundholes.txt: -------------------------------------------------------------------------------- 1 | %FSTAX25Y25*% 2 | %MOIN*% 3 | %SFA1B1*% 4 | 5 | %IPPOS*% 6 | %ADD9500C,0.021650*% 7 | %ADD9501C,0.023620*% 8 | %ADD9502C,0.035430*% 9 | %ADD9503C,0.066930*% 10 | %ADD9504C,0.141730*% 11 | %LNhdmi_breakout_pcb_v02-roundholes-1*% 12 | %LPD*% 13 | G54D9500* 14 | X024822Y0442409D03* 15 | X0254126D03* 16 | X0260032D03* 17 | X0265937D03* 18 | X0271843D03* 19 | X0277748D03* 20 | X0279717Y0448315D03* 21 | X0273811D03* 22 | X0267906D03* 23 | X0262D03* 24 | X0256094D03* 25 | X0250189D03* 26 | X0244283D03* 27 | X0246252Y045422D03* 28 | X0252157D03* 29 | X0258063D03* 30 | X0263969D03* 31 | X0269874D03* 32 | X027578D03* 33 | G54D9501* 34 | X0212441Y0392063D03* 35 | X0220315D03* 36 | X0228189D03* 37 | X0236063D03* 38 | X0243937D03* 39 | X0251811D03* 40 | X0259685D03* 41 | X0267559D03* 42 | Y0399937D03* 43 | X0259685D03* 44 | X0251811D03* 45 | X0243937D03* 46 | X0236063D03* 47 | X0228189D03* 48 | X0220315D03* 49 | X0212441D03* 50 | G54D9502* 51 | X0288Y0394D03* 52 | X0298D03* 53 | X0316Y0406D03* 54 | Y0416D03* 55 | Y0426D03* 56 | Y0436D03* 57 | G54D9503* 58 | X0262Y0468D03* 59 | G54D9504* 60 | X0214Y0468D03* 61 | X031D03* 62 | M02* -------------------------------------------------------------------------------- /LVDS-HDMI Extension Board/hdmi_breakout_pcb_v02.gbs: -------------------------------------------------------------------------------- 1 | %FSTAX25Y25*% 2 | %MOIN*% 3 | %SFA1B1*% 4 | 5 | %IPPOS*% 6 | %ADD26C,0.074930*% 7 | %ADD27C,0.045400*% 8 | %ADD28O,0.067060X0.114300*% 9 | %ADD29O,0.067060X0.137920*% 10 | %ADD30R,0.067060X0.067060*% 11 | %ADD31C,0.067060*% 12 | %ADD32R,0.047370X0.047370*% 13 | %ADD33C,0.047370*% 14 | %ADD34R,0.067060X0.067060*% 15 | %LNhdmi_breakout_pcb_v02-1*% 16 | %LPD*% 17 | G54D26* 18 | X0262Y0468D03* 19 | G54D27* 20 | X0262Y0448315D03* 21 | X0267906D03* 22 | X0273811D03* 23 | X0279717D03* 24 | X0256094D03* 25 | X0250189D03* 26 | X0244283D03* 27 | X0246252Y045422D03* 28 | X0252157D03* 29 | X0258063D03* 30 | X0263969D03* 31 | X0269874D03* 32 | X027578D03* 33 | X024822Y0442409D03* 34 | X0254126D03* 35 | X0260032D03* 36 | X0265937D03* 37 | X0271843D03* 38 | X0277748D03* 39 | G54D28* 40 | X0290346Y0475087D03* 41 | X0234441D03* 42 | G54D29* 43 | X0290346Y0451465D03* 44 | X0234441D03* 45 | G54D30* 46 | X0316Y0406D03* 47 | G54D31* 48 | X0316Y0416D03* 49 | Y0426D03* 50 | Y0436D03* 51 | X0298Y0394D03* 52 | G54D32* 53 | X0212441Y0392063D03* 54 | G54D33* 55 | X0220315Y0392063D03* 56 | X0228189D03* 57 | X0236063D03* 58 | X0243937D03* 59 | X0251811D03* 60 | X0259685D03* 61 | X0267559D03* 62 | X0212441Y0399937D03* 63 | X0220315D03* 64 | X0228189D03* 65 | X0236063D03* 66 | X0243937D03* 67 | X0251811D03* 68 | X0259685D03* 69 | X0267559D03* 70 | G54D34* 71 | X0288Y0394D03* 72 | M02* -------------------------------------------------------------------------------- /LVDS-HDMI Extension Board/hdmi_breakout_pcb_v02.gts: -------------------------------------------------------------------------------- 1 | %FSTAX25Y25*% 2 | %MOIN*% 3 | %SFA1B1*% 4 | 5 | %IPPOS*% 6 | %ADD26C,0.074930*% 7 | %ADD27C,0.045400*% 8 | %ADD28O,0.067060X0.114300*% 9 | %ADD29O,0.067060X0.137920*% 10 | %ADD30R,0.067060X0.067060*% 11 | %ADD31C,0.067060*% 12 | %ADD32R,0.047370X0.047370*% 13 | %ADD33C,0.047370*% 14 | %ADD34R,0.067060X0.067060*% 15 | %LNhdmi_breakout_pcb_v02-1*% 16 | %LPD*% 17 | G54D26* 18 | X0262Y0468D03* 19 | G54D27* 20 | X0262Y0448315D03* 21 | X0267906D03* 22 | X0273811D03* 23 | X0279717D03* 24 | X0256094D03* 25 | X0250189D03* 26 | X0244283D03* 27 | X0246252Y045422D03* 28 | X0252157D03* 29 | X0258063D03* 30 | X0263969D03* 31 | X0269874D03* 32 | X027578D03* 33 | X024822Y0442409D03* 34 | X0254126D03* 35 | X0260032D03* 36 | X0265937D03* 37 | X0271843D03* 38 | X0277748D03* 39 | G54D28* 40 | X0290346Y0475087D03* 41 | X0234441D03* 42 | G54D29* 43 | X0290346Y0451465D03* 44 | X0234441D03* 45 | G54D30* 46 | X0316Y0406D03* 47 | G54D31* 48 | X0316Y0416D03* 49 | Y0426D03* 50 | Y0436D03* 51 | X0298Y0394D03* 52 | G54D32* 53 | X0212441Y0392063D03* 54 | G54D33* 55 | X0220315Y0392063D03* 56 | X0228189D03* 57 | X0236063D03* 58 | X0243937D03* 59 | X0251811D03* 60 | X0259685D03* 61 | X0267559D03* 62 | X0212441Y0399937D03* 63 | X0220315D03* 64 | X0228189D03* 65 | X0236063D03* 66 | X0243937D03* 67 | X0251811D03* 68 | X0259685D03* 69 | X0267559D03* 70 | G54D34* 71 | X0288Y0394D03* 72 | M02* -------------------------------------------------------------------------------- /Arduino/Math.ino: -------------------------------------------------------------------------------- 1 | /* This file is part of the Razor AHRS Firmware */ 2 | 3 | // Computes the dot product of two vectors 4 | float Vector_Dot_Product(const float v1[3], const float v2[3]) 5 | { 6 | float result = 0; 7 | 8 | for(int c = 0; c < 3; c++) 9 | { 10 | result += v1[c] * v2[c]; 11 | } 12 | 13 | return result; 14 | } 15 | 16 | // Computes the cross product of two vectors 17 | // out has to different from v1 and v2 (no in-place)! 18 | void Vector_Cross_Product(float out[3], const float v1[3], const float v2[3]) 19 | { 20 | out[0] = (v1[1] * v2[2]) - (v1[2] * v2[1]); 21 | out[1] = (v1[2] * v2[0]) - (v1[0] * v2[2]); 22 | out[2] = (v1[0] * v2[1]) - (v1[1] * v2[0]); 23 | } 24 | 25 | // Multiply the vector by a scalar 26 | void Vector_Scale(float out[3], const float v[3], float scale) 27 | { 28 | for(int c = 0; c < 3; c++) 29 | { 30 | out[c] = v[c] * scale; 31 | } 32 | } 33 | 34 | // Adds two vectors 35 | void Vector_Add(float out[3], const float v1[3], const float v2[3]) 36 | { 37 | for(int c = 0; c < 3; c++) 38 | { 39 | out[c] = v1[c] + v2[c]; 40 | } 41 | } 42 | 43 | // Multiply two 3x3 matrices: out = a * b 44 | // out has to different from a and b (no in-place)! 45 | void Matrix_Multiply(const float a[3][3], const float b[3][3], float out[3][3]) 46 | { 47 | for(int x = 0; x < 3; x++) // rows 48 | { 49 | for(int y = 0; y < 3; y++) // columns 50 | { 51 | out[x][y] = a[x][0] * b[0][y] + a[x][1] * b[1][y] + a[x][2] * b[2][y]; 52 | } 53 | } 54 | } 55 | 56 | // Multiply 3x3 matrix with vector: out = a * b 57 | // out has to different from b (no in-place)! 58 | void Matrix_Vector_Multiply(const float a[3][3], const float b[3], float out[3]) 59 | { 60 | for(int x = 0; x < 3; x++) 61 | { 62 | out[x] = a[x][0] * b[0] + a[x][1] * b[1] + a[x][2] * b[2]; 63 | } 64 | } 65 | 66 | // Init rotation matrix using euler angles 67 | void init_rotation_matrix(float m[3][3], float yaw, float pitch, float roll) 68 | { 69 | float c1 = cos(roll); 70 | float s1 = sin(roll); 71 | float c2 = cos(pitch); 72 | float s2 = sin(pitch); 73 | float c3 = cos(yaw); 74 | float s3 = sin(yaw); 75 | 76 | // Euler angles, right-handed, intrinsic, XYZ convention 77 | // (which means: rotate around body axes Z, Y', X'') 78 | m[0][0] = c2 * c3; 79 | m[0][1] = c3 * s1 * s2 - c1 * s3; 80 | m[0][2] = s1 * s3 + c1 * c3 * s2; 81 | 82 | m[1][0] = c2 * s3; 83 | m[1][1] = c1 * c3 + s1 * s2 * s3; 84 | m[1][2] = c1 * s2 * s3 - c3 * s1; 85 | 86 | m[2][0] = -s2; 87 | m[2][1] = c2 * s1; 88 | m[2][2] = c1 * c2; 89 | } 90 | -------------------------------------------------------------------------------- /Arduino/Output.ino: -------------------------------------------------------------------------------- 1 | /* This file is part of the Razor AHRS Firmware */ 2 | 3 | // Output angles: yaw, pitch, roll 4 | void output_angles() 5 | { 6 | if (output_format == OUTPUT__FORMAT_BINARY) 7 | { 8 | float ypr[3]; 9 | ypr[0] = TO_DEG(yaw); 10 | ypr[1] = TO_DEG(pitch); 11 | ypr[2] = TO_DEG(roll); 12 | Serial.write((byte*) ypr, 12); // No new-line 13 | } 14 | else if (output_format == OUTPUT__FORMAT_TEXT) 15 | { 16 | Serial.print("#YPR="); 17 | Serial.print(TO_DEG(yaw)); Serial.print(","); 18 | Serial.print(TO_DEG(pitch)); Serial.print(","); 19 | Serial.print(TO_DEG(roll)); Serial.println(); 20 | } 21 | } 22 | 23 | void output_calibration(int calibration_sensor) 24 | { 25 | if (calibration_sensor == 0) // Accelerometer 26 | { 27 | // Output MIN/MAX values 28 | Serial.print("accel x,y,z (min/max) = "); 29 | for (int i = 0; i < 3; i++) { 30 | if (accel[i] < accel_min[i]) accel_min[i] = accel[i]; 31 | if (accel[i] > accel_max[i]) accel_max[i] = accel[i]; 32 | Serial.print(accel_min[i]); 33 | Serial.print("/"); 34 | Serial.print(accel_max[i]); 35 | if (i < 2) Serial.print(" "); 36 | else Serial.println(); 37 | } 38 | } 39 | else if (calibration_sensor == 1) // Magnetometer 40 | { 41 | // Output MIN/MAX values 42 | Serial.print("magn x,y,z (min/max) = "); 43 | for (int i = 0; i < 3; i++) { 44 | if (magnetom[i] < magnetom_min[i]) magnetom_min[i] = magnetom[i]; 45 | if (magnetom[i] > magnetom_max[i]) magnetom_max[i] = magnetom[i]; 46 | Serial.print(magnetom_min[i]); 47 | Serial.print("/"); 48 | Serial.print(magnetom_max[i]); 49 | if (i < 2) Serial.print(" "); 50 | else Serial.println(); 51 | } 52 | } 53 | else if (calibration_sensor == 2) // Gyroscope 54 | { 55 | // Average gyro values 56 | for (int i = 0; i < 3; i++) 57 | gyro_average[i] += gyro[i]; 58 | gyro_num_samples++; 59 | 60 | // Output current and averaged gyroscope values 61 | Serial.print("gyro x,y,z (current/average) = "); 62 | for (int i = 0; i < 3; i++) { 63 | Serial.print(gyro[i]); 64 | Serial.print("/"); 65 | Serial.print(gyro_average[i] / (float) gyro_num_samples); 66 | if (i < 2) Serial.print(" "); 67 | else Serial.println(); 68 | } 69 | } 70 | } 71 | 72 | void output_sensors_text(char raw_or_calibrated) 73 | { 74 | Serial.print("#A-"); Serial.print(raw_or_calibrated); Serial.print('='); 75 | Serial.print(accel[0]); Serial.print(","); 76 | Serial.print(accel[1]); Serial.print(","); 77 | Serial.print(accel[2]); Serial.println(); 78 | 79 | Serial.print("#M-"); Serial.print(raw_or_calibrated); Serial.print('='); 80 | Serial.print(magnetom[0]); Serial.print(","); 81 | Serial.print(magnetom[1]); Serial.print(","); 82 | Serial.print(magnetom[2]); Serial.println(); 83 | 84 | Serial.print("#G-"); Serial.print(raw_or_calibrated); Serial.print('='); 85 | Serial.print(gyro[0]); Serial.print(","); 86 | Serial.print(gyro[1]); Serial.print(","); 87 | Serial.print(gyro[2]); Serial.println(); 88 | } 89 | 90 | void output_sensors_binary() 91 | { 92 | Serial.write((byte*) accel, 12); 93 | Serial.write((byte*) magnetom, 12); 94 | Serial.write((byte*) gyro, 12); 95 | } 96 | 97 | void output_sensors() 98 | { 99 | if (output_mode == OUTPUT__MODE_SENSORS_RAW) 100 | { 101 | if (output_format == OUTPUT__FORMAT_BINARY) 102 | output_sensors_binary(); 103 | else if (output_format == OUTPUT__FORMAT_TEXT) 104 | output_sensors_text('R'); 105 | } 106 | else if (output_mode == OUTPUT__MODE_SENSORS_CALIB) 107 | { 108 | // Apply sensor calibration 109 | compensate_sensor_errors(); 110 | 111 | if (output_format == OUTPUT__FORMAT_BINARY) 112 | output_sensors_binary(); 113 | else if (output_format == OUTPUT__FORMAT_TEXT) 114 | output_sensors_text('C'); 115 | } 116 | else if (output_mode == OUTPUT__MODE_SENSORS_BOTH) 117 | { 118 | if (output_format == OUTPUT__FORMAT_BINARY) 119 | { 120 | output_sensors_binary(); 121 | compensate_sensor_errors(); 122 | output_sensors_binary(); 123 | } 124 | else if (output_format == OUTPUT__FORMAT_TEXT) 125 | { 126 | output_sensors_text('R'); 127 | compensate_sensor_errors(); 128 | output_sensors_text('C'); 129 | } 130 | } 131 | } 132 | 133 | -------------------------------------------------------------------------------- /Arduino/DCM.ino: -------------------------------------------------------------------------------- 1 | /* This file is part of the Razor AHRS Firmware */ 2 | 3 | // DCM algorithm 4 | 5 | /**************************************************/ 6 | void Normalize(void) 7 | { 8 | float error=0; 9 | float temporary[3][3]; 10 | float renorm=0; 11 | 12 | error= -Vector_Dot_Product(&DCM_Matrix[0][0],&DCM_Matrix[1][0])*.5; //eq.19 13 | 14 | Vector_Scale(&temporary[0][0], &DCM_Matrix[1][0], error); //eq.19 15 | Vector_Scale(&temporary[1][0], &DCM_Matrix[0][0], error); //eq.19 16 | 17 | Vector_Add(&temporary[0][0], &temporary[0][0], &DCM_Matrix[0][0]);//eq.19 18 | Vector_Add(&temporary[1][0], &temporary[1][0], &DCM_Matrix[1][0]);//eq.19 19 | 20 | Vector_Cross_Product(&temporary[2][0],&temporary[0][0],&temporary[1][0]); // c= a x b //eq.20 21 | 22 | renorm= .5 *(3 - Vector_Dot_Product(&temporary[0][0],&temporary[0][0])); //eq.21 23 | Vector_Scale(&DCM_Matrix[0][0], &temporary[0][0], renorm); 24 | 25 | renorm= .5 *(3 - Vector_Dot_Product(&temporary[1][0],&temporary[1][0])); //eq.21 26 | Vector_Scale(&DCM_Matrix[1][0], &temporary[1][0], renorm); 27 | 28 | renorm= .5 *(3 - Vector_Dot_Product(&temporary[2][0],&temporary[2][0])); //eq.21 29 | Vector_Scale(&DCM_Matrix[2][0], &temporary[2][0], renorm); 30 | } 31 | 32 | /**************************************************/ 33 | void Drift_correction(void) 34 | { 35 | float mag_heading_x; 36 | float mag_heading_y; 37 | float errorCourse; 38 | //Compensation the Roll, Pitch and Yaw drift. 39 | static float Scaled_Omega_P[3]; 40 | static float Scaled_Omega_I[3]; 41 | float Accel_magnitude; 42 | float Accel_weight; 43 | 44 | 45 | //*****Roll and Pitch*************** 46 | 47 | // Calculate the magnitude of the accelerometer vector 48 | Accel_magnitude = sqrt(Accel_Vector[0]*Accel_Vector[0] + Accel_Vector[1]*Accel_Vector[1] + Accel_Vector[2]*Accel_Vector[2]); 49 | Accel_magnitude = Accel_magnitude / GRAVITY; // Scale to gravity. 50 | // Dynamic weighting of accelerometer info (reliability filter) 51 | // Weight for accelerometer info (<0.5G = 0.0, 1G = 1.0 , >1.5G = 0.0) 52 | Accel_weight = constrain(1 - 2*abs(1 - Accel_magnitude),0,1); // 53 | 54 | Vector_Cross_Product(&errorRollPitch[0],&Accel_Vector[0],&DCM_Matrix[2][0]); //adjust the ground of reference 55 | Vector_Scale(&Omega_P[0],&errorRollPitch[0],Kp_ROLLPITCH*Accel_weight); 56 | 57 | Vector_Scale(&Scaled_Omega_I[0],&errorRollPitch[0],Ki_ROLLPITCH*Accel_weight); 58 | Vector_Add(Omega_I,Omega_I,Scaled_Omega_I); 59 | 60 | //*****YAW*************** 61 | // We make the gyro YAW drift correction based on compass magnetic heading 62 | 63 | mag_heading_x = cos(MAG_Heading); 64 | mag_heading_y = sin(MAG_Heading); 65 | errorCourse=(DCM_Matrix[0][0]*mag_heading_y) - (DCM_Matrix[1][0]*mag_heading_x); //Calculating YAW error 66 | Vector_Scale(errorYaw,&DCM_Matrix[2][0],errorCourse); //Applys the yaw correction to the XYZ rotation of the aircraft, depeding the position. 67 | 68 | Vector_Scale(&Scaled_Omega_P[0],&errorYaw[0],Kp_YAW);//.01proportional of YAW. 69 | Vector_Add(Omega_P,Omega_P,Scaled_Omega_P);//Adding Proportional. 70 | 71 | Vector_Scale(&Scaled_Omega_I[0],&errorYaw[0],Ki_YAW);//.00001Integrator 72 | Vector_Add(Omega_I,Omega_I,Scaled_Omega_I);//adding integrator to the Omega_I 73 | } 74 | 75 | void Matrix_update(void) 76 | { 77 | Gyro_Vector[0]=GYRO_SCALED_RAD(gyro[0]); //gyro x roll 78 | Gyro_Vector[1]=GYRO_SCALED_RAD(gyro[1]); //gyro y pitch 79 | Gyro_Vector[2]=GYRO_SCALED_RAD(gyro[2]); //gyro z yaw 80 | 81 | Accel_Vector[0]=accel[0]; 82 | Accel_Vector[1]=accel[1]; 83 | Accel_Vector[2]=accel[2]; 84 | 85 | Vector_Add(&Omega[0], &Gyro_Vector[0], &Omega_I[0]); //adding proportional term 86 | Vector_Add(&Omega_Vector[0], &Omega[0], &Omega_P[0]); //adding Integrator term 87 | 88 | #if DEBUG__NO_DRIFT_CORRECTION == true // Do not use drift correction 89 | Update_Matrix[0][0]=0; 90 | Update_Matrix[0][1]=-G_Dt*Gyro_Vector[2];//-z 91 | Update_Matrix[0][2]=G_Dt*Gyro_Vector[1];//y 92 | Update_Matrix[1][0]=G_Dt*Gyro_Vector[2];//z 93 | Update_Matrix[1][1]=0; 94 | Update_Matrix[1][2]=-G_Dt*Gyro_Vector[0]; 95 | Update_Matrix[2][0]=-G_Dt*Gyro_Vector[1]; 96 | Update_Matrix[2][1]=G_Dt*Gyro_Vector[0]; 97 | Update_Matrix[2][2]=0; 98 | #else // Use drift correction 99 | Update_Matrix[0][0]=0; 100 | Update_Matrix[0][1]=-G_Dt*Omega_Vector[2];//-z 101 | Update_Matrix[0][2]=G_Dt*Omega_Vector[1];//y 102 | Update_Matrix[1][0]=G_Dt*Omega_Vector[2];//z 103 | Update_Matrix[1][1]=0; 104 | Update_Matrix[1][2]=-G_Dt*Omega_Vector[0];//-x 105 | Update_Matrix[2][0]=-G_Dt*Omega_Vector[1];//-y 106 | Update_Matrix[2][1]=G_Dt*Omega_Vector[0];//x 107 | Update_Matrix[2][2]=0; 108 | #endif 109 | 110 | Matrix_Multiply(DCM_Matrix,Update_Matrix,Temporary_Matrix); //a*b=c 111 | 112 | for(int x=0; x<3; x++) //Matrix Addition (update) 113 | { 114 | for(int y=0; y<3; y++) 115 | { 116 | DCM_Matrix[x][y]+=Temporary_Matrix[x][y]; 117 | } 118 | } 119 | } 120 | 121 | void Euler_angles(void) 122 | { 123 | pitch = -asin(DCM_Matrix[2][0]); 124 | roll = atan2(DCM_Matrix[2][1],DCM_Matrix[2][2]); 125 | yaw = atan2(DCM_Matrix[1][0],DCM_Matrix[0][0]); 126 | } 127 | 128 | -------------------------------------------------------------------------------- /LVDS-HDMI Extension Board/hdmi_breakout_pcb_v02.gbo: -------------------------------------------------------------------------------- 1 | %FSTAX25Y25*% 2 | %MOIN*% 3 | %SFA1B1*% 4 | 5 | %IPPOS*% 6 | %ADD24C,0.008000*% 7 | %LNhdmi_breakout_pcb_v02-1*% 8 | %LPD*% 9 | G54D24* 10 | X02925Y04165D02* 11 | Y0420998D01* 12 | X0290251* 13 | X0289501Y0420249* 14 | Y0418749* 15 | X0290251Y0418* 16 | X02925* 17 | X0291001D02* 18 | X0289501Y04165D01* 19 | X0288001D02* 20 | Y0419499D01* 21 | X0286502Y0420998* 22 | X0285002Y0419499* 23 | Y04165* 24 | Y0418749* 25 | X0288001* 26 | X0279004D02* 27 | X0276005D01* 28 | X0270007Y0420998D02* 29 | Y0418D01* 30 | X0268508Y04165* 31 | X0267008Y0418* 32 | Y0420998* 33 | X0265509Y04165D02* 34 | X0264009D01* 35 | X0264759* 36 | Y0419499* 37 | X0265509* 38 | X026176D02* 39 | Y04165D01* 40 | Y0418* 41 | X026101Y0418749* 42 | X026026Y0419499* 43 | X0259511* 44 | X0256512Y0420249D02* 45 | Y0419499D01* 46 | X0257261* 47 | X0255762* 48 | X0256512* 49 | Y041725* 50 | X0255762Y04165* 51 | X0253513Y0419499D02* 52 | Y041725D01* 53 | X0252763Y04165* 54 | X0250514* 55 | Y0419499* 56 | X0248264D02* 57 | X0246765D01* 58 | X0246015Y0418749* 59 | Y04165* 60 | X0248264* 61 | X0249014Y041725* 62 | X0248264Y0418* 63 | X0246015* 64 | X0244515Y04165D02* 65 | X0243016D01* 66 | X0243766* 67 | Y0420998* 68 | X0244515* 69 | X0236268Y04165D02* 70 | Y0420998D01* 71 | X0234019* 72 | X0233269Y0420249* 73 | Y0418749* 74 | X0234019Y0418* 75 | X0236268* 76 | X0234769D02* 77 | X0233269Y04165D01* 78 | X022952D02* 79 | X023102D01* 80 | X023177Y041725* 81 | Y0418749* 82 | X023102Y0419499* 83 | X022952* 84 | X0228771Y0418749* 85 | Y0418* 86 | X023177* 87 | X0226521Y0419499D02* 88 | X0225022D01* 89 | X0224272Y0418749* 90 | Y04165* 91 | X0226521* 92 | X0227271Y041725* 93 | X0226521Y0418* 94 | X0224272* 95 | X0222773Y04165D02* 96 | X0221273D01* 97 | X0222023* 98 | Y0420998* 99 | X0222773* 100 | X0219024Y04165D02* 101 | X0217524D01* 102 | X0218274* 103 | Y0419499* 104 | X0219024* 105 | X0214525Y0420249D02* 106 | Y0419499D01* 107 | X0215275* 108 | X0213775* 109 | X0214525* 110 | Y041725* 111 | X0213775Y04165* 112 | X0211526Y0419499D02* 113 | Y041725D01* 114 | X0210776Y04165* 115 | X0208527* 116 | Y041575* 117 | X0209277Y0415* 118 | X0210027* 119 | X0208527Y04165D02* 120 | Y0419499D01* 121 | X0304Y0430499D02* 122 | Y042825D01* 123 | X030325Y04275* 124 | X0302501Y042825* 125 | X0301751Y04275* 126 | X0301001Y042825* 127 | Y0430499* 128 | X0299501D02* 129 | Y042825D01* 130 | X0298752Y04275* 131 | X0298002Y042825* 132 | X0297252Y04275* 133 | X0296502Y042825* 134 | Y0430499* 135 | X0295003D02* 136 | Y042825D01* 137 | X0294253Y04275* 138 | X0293503Y042825* 139 | X0292754Y04275* 140 | X0292004Y042825* 141 | Y0430499* 142 | X0290504Y04275D02* 143 | Y042825D01* 144 | X0289755* 145 | Y04275* 146 | X0290504* 147 | X0286006Y0430499D02* 148 | X0284506D01* 149 | X0283756Y0429749* 150 | Y04275* 151 | X0286006* 152 | X0286756Y042825* 153 | X0286006Y0429* 154 | X0283756* 155 | X0282257Y04275D02* 156 | Y0430499D01* 157 | X0280008* 158 | X0279258Y0429749* 159 | Y04275* 160 | X0274759Y0431998D02* 161 | Y04275D01* 162 | X0277009* 163 | X0277759Y042825* 164 | Y0429749* 165 | X0277009Y0430499* 166 | X0274759* 167 | X027326D02* 168 | Y042825D01* 169 | X027251Y04275* 170 | X0270261* 171 | Y042675* 172 | X0271011Y0426* 173 | X027176* 174 | X0270261Y04275D02* 175 | Y0430499D01* 176 | X0268761Y04275D02* 177 | X0267262D01* 178 | X0268012* 179 | Y0431998* 180 | X0268761* 181 | X0262763Y04275D02* 182 | X0264263D01* 183 | X0265013Y042825* 184 | Y0429749* 185 | X0264263Y0430499* 186 | X0262763* 187 | X0262014Y0429749* 188 | Y0429* 189 | X0265013* 190 | X0260514Y04275D02* 191 | X0258265D01* 192 | X0257515Y042825* 193 | X0258265Y0429* 194 | X0259764* 195 | X0260514Y0429749* 196 | X0259764Y0430499* 197 | X0257515* 198 | X0256015Y04275D02* 199 | Y0430499D01* 200 | X0253766* 201 | X0253016Y0429749* 202 | Y04275* 203 | X0251517D02* 204 | X0250017D01* 205 | X0250767* 206 | Y0430499* 207 | X0251517* 208 | X0247018D02* 209 | X0245519D01* 210 | X0244769Y0429749* 211 | Y04275* 212 | X0247018* 213 | X0247768Y042825* 214 | X0247018Y0429* 215 | X0244769* 216 | X024327Y04275D02* 217 | Y0431998D01* 218 | Y0429D02* 219 | X024102Y0430499D01* 220 | X024327Y0429D02* 221 | X024102Y04275D01* 222 | X0238771D02* 223 | Y042825D01* 224 | X0238021* 225 | Y04275* 226 | X0238771* 227 | X0232023Y0430499D02* 228 | X0234273D01* 229 | X0235022Y0429749* 230 | Y042825* 231 | X0234273Y04275* 232 | X0232023* 233 | X0229774D02* 234 | X0228274D01* 235 | X0227525Y042825* 236 | Y0429749* 237 | X0228274Y0430499* 238 | X0229774* 239 | X0230524Y0429749* 240 | Y042825* 241 | X0229774Y04275* 242 | X0226025D02* 243 | Y0430499D01* 244 | X0225275* 245 | X0224526Y0429749* 246 | Y04275* 247 | Y0429749* 248 | X0223776Y0430499* 249 | X0223026Y0429749* 250 | Y04275* 251 | X0221527D02* 252 | X0218528Y0430499D01* 253 | X0217028Y04275D02* 254 | Y0431998D01* 255 | X0214779* 256 | X0214029Y0431249* 257 | Y0429749* 258 | X0214779Y0429* 259 | X0217028* 260 | X0215528D02* 261 | X0214029Y04275D01* 262 | X0212529D02* 263 | Y0430499D01* 264 | X021103Y0431998* 265 | X020953Y0430499* 266 | Y04275* 267 | Y0429749* 268 | X0212529* 269 | M02* -------------------------------------------------------------------------------- /IMU Calibration - Processing/Razor_AHRS_test/Razor_AHRS_test.pde: -------------------------------------------------------------------------------- 1 | /************************************************************************************* 2 | * Test Sketch for Razor AHRS v1.4.1 3 | * 9 Degree of Measurement Attitude and Heading Reference System 4 | * for Sparkfun "9DOF Razor IMU" and "9DOF Sensor Stick" 5 | * 6 | * Released under GNU GPL (General Public License) v3.0 7 | * Copyright (C) 2011-2012 Quality & Usability Lab, Deutsche Telekom Laboratories, TU Berlin 8 | * Written by Peter Bartz (peter-bartz@gmx.de) 9 | * 10 | * Infos, updates, bug reports and feedback: 11 | * http://dev.qu.tu-berlin.de/projects/sf-razor-9dof-ahrs 12 | *************************************************************************************/ 13 | 14 | /* 15 | NOTE: There seems to be a bug with the serial library in the latest Processing 16 | versions 1.5 and 1.5.1: "WARNING: RXTX Version mismatch ...". The previous version 17 | 1.2.1 works fine and is still available on the web. 18 | */ 19 | 20 | import processing.opengl.*; 21 | import processing.serial.*; 22 | 23 | // IF THE SKETCH CRASHES OR HANGS ON STARTUP, MAKE SURE YOU ARE USING THE RIGHT SERIAL PORT: 24 | // 1. Have a look at the Processing console output of this sketch. 25 | // 2. Look for the serial port list and find the port you need (it's the same as in Arduino). 26 | // 3. Set your port number here: 27 | final static int SERIAL_PORT_NUM = 0; 28 | // 4. Try again. 29 | 30 | 31 | final static int SERIAL_PORT_BAUD_RATE = 57600; 32 | 33 | float yaw = 0.0f; 34 | float pitch = 0.0f; 35 | float roll = 0.0f; 36 | float yawOffset = 0.0f; 37 | 38 | PFont font; 39 | Serial serial; 40 | 41 | boolean synched = false; 42 | 43 | void drawArrow(float headWidthFactor, float headLengthFactor) { 44 | float headWidth = headWidthFactor * 200.0f; 45 | float headLength = headLengthFactor * 200.0f; 46 | 47 | pushMatrix(); 48 | 49 | // Draw base 50 | translate(0, 0, -100); 51 | box(100, 100, 200); 52 | 53 | // Draw pointer 54 | translate(-headWidth/2, -50, -100); 55 | beginShape(QUAD_STRIP); 56 | vertex(0, 0 ,0); 57 | vertex(0, 100, 0); 58 | vertex(headWidth, 0 ,0); 59 | vertex(headWidth, 100, 0); 60 | vertex(headWidth/2, 0, -headLength); 61 | vertex(headWidth/2, 100, -headLength); 62 | vertex(0, 0 ,0); 63 | vertex(0, 100, 0); 64 | endShape(); 65 | beginShape(TRIANGLES); 66 | vertex(0, 0, 0); 67 | vertex(headWidth, 0, 0); 68 | vertex(headWidth/2, 0, -headLength); 69 | vertex(0, 100, 0); 70 | vertex(headWidth, 100, 0); 71 | vertex(headWidth/2, 100, -headLength); 72 | endShape(); 73 | 74 | popMatrix(); 75 | } 76 | 77 | void drawBoard() { 78 | pushMatrix(); 79 | 80 | rotateY(-radians(yaw - yawOffset)); 81 | rotateX(-radians(pitch)); 82 | rotateZ(radians(roll)); 83 | 84 | // Board body 85 | fill(255, 0, 0); 86 | box(250, 20, 400); 87 | 88 | // Forward-arrow 89 | pushMatrix(); 90 | translate(0, 0, -200); 91 | scale(0.5f, 0.2f, 0.25f); 92 | fill(0, 255, 0); 93 | drawArrow(1.0f, 2.0f); 94 | popMatrix(); 95 | 96 | popMatrix(); 97 | } 98 | 99 | // Skip incoming serial stream data until token is found 100 | boolean readToken(Serial serial, String token) { 101 | // Wait until enough bytes are available 102 | if (serial.available() < token.length()) 103 | return false; 104 | 105 | // Check if incoming bytes match token 106 | for (int i = 0; i < token.length(); i++) { 107 | if (serial.read() != token.charAt(i)) 108 | return false; 109 | } 110 | 111 | return true; 112 | } 113 | 114 | // Global setup 115 | void setup() { 116 | // Setup graphics 117 | size(640, 480, OPENGL); 118 | smooth(); 119 | noStroke(); 120 | frameRate(50); 121 | 122 | // Load font 123 | font = loadFont("Univers-66.vlw"); 124 | textFont(font); 125 | 126 | // Setup serial port I/O 127 | println("AVAILABLE SERIAL PORTS:"); 128 | println(Serial.list()); 129 | String portName = Serial.list()[SERIAL_PORT_NUM]; 130 | println(); 131 | println("HAVE A LOOK AT THE LIST ABOVE AND SET THE RIGHT SERIAL PORT NUMBER IN THE CODE!"); 132 | println(" -> Using port " + SERIAL_PORT_NUM + ": " + portName); 133 | serial = new Serial(this, portName, SERIAL_PORT_BAUD_RATE); 134 | } 135 | 136 | void setupRazor() { 137 | println("Trying to setup and synch Razor..."); 138 | 139 | // On Mac OSX and Linux (Windows too?) the board will do a reset when we connect, which is really bad. 140 | // See "Automatic (Software) Reset" on http://www.arduino.cc/en/Main/ArduinoBoardProMini 141 | // So we have to wait until the bootloader is finished and the Razor firmware can receive commands. 142 | // To prevent this, disconnect/cut/unplug the DTR line going to the board. This also has the advantage, 143 | // that the angles you receive are stable right from the beginning. 144 | delay(3000); // 3 seconds should be enough 145 | 146 | // Set Razor output parameters 147 | serial.write("#ob"); // Turn on binary output 148 | serial.write("#o1"); // Turn on continuous streaming output 149 | serial.write("#oe0"); // Disable error message output 150 | 151 | // Synch with Razor 152 | serial.clear(); // Clear input buffer up to here 153 | serial.write("#s00"); // Request synch token 154 | } 155 | 156 | float readFloat(Serial s) { 157 | // Convert from little endian (Razor) to big endian (Java) and interpret as float 158 | return Float.intBitsToFloat(s.read() + (s.read() << 8) + (s.read() << 16) + (s.read() << 24)); 159 | } 160 | 161 | void draw() { 162 | // Reset scene 163 | background(0); 164 | lights(); 165 | 166 | // Sync with Razor 167 | if (!synched) { 168 | textAlign(CENTER); 169 | fill(255); 170 | text("Connecting to Razor...", width/2, height/2, -200); 171 | 172 | if (frameCount == 2) 173 | setupRazor(); // Set ouput params and request synch token 174 | else if (frameCount > 2) 175 | synched = readToken(serial, "#SYNCH00\r\n"); // Look for synch token 176 | return; 177 | } 178 | 179 | // Read angles from serial port 180 | while (serial.available() >= 12) { 181 | yaw = readFloat(serial); 182 | pitch = readFloat(serial); 183 | roll = readFloat(serial); 184 | } 185 | 186 | // Draw board 187 | pushMatrix(); 188 | translate(width/2, height/2, -350); 189 | drawBoard(); 190 | popMatrix(); 191 | 192 | textFont(font, 20); 193 | fill(255); 194 | textAlign(LEFT); 195 | 196 | // Output info text 197 | text("Point FTDI connector towards screen and press 'a' to align", 10, 25); 198 | 199 | // Output angles 200 | pushMatrix(); 201 | translate(10, height - 10); 202 | textAlign(LEFT); 203 | text("Yaw: " + ((int) yaw), 0, 0); 204 | text("Pitch: " + ((int) pitch), 150, 0); 205 | text("Roll: " + ((int) roll), 300, 0); 206 | popMatrix(); 207 | } 208 | 209 | void keyPressed() { 210 | switch (key) { 211 | case '0': // Turn Razor's continuous output stream off 212 | serial.write("#o0"); 213 | break; 214 | case '1': // Turn Razor's continuous output stream on 215 | serial.write("#o1"); 216 | break; 217 | case 'f': // Request one single yaw/pitch/roll frame from Razor (use when continuous streaming is off) 218 | serial.write("#f"); 219 | break; 220 | case 'a': // Align screen with Razor 221 | yawOffset = yaw; 222 | } 223 | } 224 | 225 | 226 | 227 | -------------------------------------------------------------------------------- /Arduino/Sensors.ino: -------------------------------------------------------------------------------- 1 | /* This file is part of the Razor AHRS Firmware */ 2 | 3 | // I2C code to read the sensors 4 | 5 | // Sensor I2C addresses 6 | #define ACCEL_ADDRESS ((int) 0x53) // 0x53 = 0xA6 / 2 7 | #define MAGN_ADDRESS ((int) 0x1E) // 0x1E = 0x3C / 2 8 | #define GYRO_ADDRESS ((int) 0x68) // 0x68 = 0xD0 / 2 9 | 10 | // Arduino backward compatibility macros 11 | #if ARDUINO >= 100 12 | #define WIRE_SEND(b) Wire.write((byte) b) 13 | #define WIRE_RECEIVE() Wire.read() 14 | #else 15 | #define WIRE_SEND(b) Wire.send(b) 16 | #define WIRE_RECEIVE() Wire.receive() 17 | #endif 18 | 19 | 20 | void I2C_Init() 21 | { 22 | Wire.begin(); 23 | } 24 | 25 | void Accel_Init() 26 | { 27 | Wire.beginTransmission(ACCEL_ADDRESS); 28 | WIRE_SEND(0x2D); // Power register 29 | WIRE_SEND(0x08); // Measurement mode 30 | Wire.endTransmission(); 31 | delay(5); 32 | Wire.beginTransmission(ACCEL_ADDRESS); 33 | WIRE_SEND(0x31); // Data format register 34 | WIRE_SEND(0x08); // Set to full resolution 35 | Wire.endTransmission(); 36 | delay(5); 37 | 38 | // Because our main loop runs at 50Hz we adjust the output data rate to 50Hz (25Hz bandwidth) 39 | Wire.beginTransmission(ACCEL_ADDRESS); 40 | WIRE_SEND(0x2C); // Rate 41 | WIRE_SEND(0x09); // Set to 50Hz, normal operation 42 | Wire.endTransmission(); 43 | delay(5); 44 | } 45 | 46 | // Reads x, y and z accelerometer registers 47 | void Read_Accel() 48 | { 49 | int i = 0; 50 | byte buff[6]; 51 | 52 | Wire.beginTransmission(ACCEL_ADDRESS); 53 | WIRE_SEND(0x32); // Send address to read from 54 | Wire.endTransmission(); 55 | 56 | Wire.beginTransmission(ACCEL_ADDRESS); 57 | Wire.requestFrom(ACCEL_ADDRESS, 6); // Request 6 bytes 58 | while(Wire.available()) // ((Wire.available())&&(i<6)) 59 | { 60 | buff[i] = WIRE_RECEIVE(); // Read one byte 61 | i++; 62 | } 63 | Wire.endTransmission(); 64 | 65 | if (i == 6) // All bytes received? 66 | { 67 | // No multiply by -1 for coordinate system transformation here, because of double negation: 68 | // We want the gravity vector, which is negated acceleration vector. 69 | accel[0] = (((int) buff[3]) << 8) | buff[2]; // X axis (internal sensor y axis) 70 | accel[1] = (((int) buff[1]) << 8) | buff[0]; // Y axis (internal sensor x axis) 71 | accel[2] = (((int) buff[5]) << 8) | buff[4]; // Z axis (internal sensor z axis) 72 | } 73 | else 74 | { 75 | num_accel_errors++; 76 | if (output_errors) Serial.println("!ERR: reading accelerometer"); 77 | } 78 | } 79 | 80 | void Magn_Init() 81 | { 82 | Wire.beginTransmission(MAGN_ADDRESS); 83 | WIRE_SEND(0x02); 84 | WIRE_SEND(0x00); // Set continuous mode (default 10Hz) 85 | Wire.endTransmission(); 86 | delay(5); 87 | 88 | Wire.beginTransmission(MAGN_ADDRESS); 89 | WIRE_SEND(0x00); 90 | WIRE_SEND(0b00011000); // Set 50Hz 91 | Wire.endTransmission(); 92 | delay(5); 93 | } 94 | 95 | void Read_Magn() 96 | { 97 | int i = 0; 98 | byte buff[6]; 99 | 100 | Wire.beginTransmission(MAGN_ADDRESS); 101 | WIRE_SEND(0x03); // Send address to read from 102 | Wire.endTransmission(); 103 | 104 | Wire.beginTransmission(MAGN_ADDRESS); 105 | Wire.requestFrom(MAGN_ADDRESS, 6); // Request 6 bytes 106 | while(Wire.available()) // ((Wire.available())&&(i<6)) 107 | { 108 | buff[i] = WIRE_RECEIVE(); // Read one byte 109 | i++; 110 | } 111 | Wire.endTransmission(); 112 | 113 | if (i == 6) // All bytes received? 114 | { 115 | // 9DOF Razor IMU SEN-10125 using HMC5843 magnetometer 116 | #if HW__VERSION_CODE == 10125 117 | // MSB byte first, then LSB; X, Y, Z 118 | magnetom[0] = -1 * ((((int) buff[2]) << 8) | buff[3]); // X axis (internal sensor -y axis) 119 | magnetom[1] = -1 * ((((int) buff[0]) << 8) | buff[1]); // Y axis (internal sensor -x axis) 120 | magnetom[2] = -1 * ((((int) buff[4]) << 8) | buff[5]); // Z axis (internal sensor -z axis) 121 | // 9DOF Razor IMU SEN-10736 using HMC5883L magnetometer 122 | #elif HW__VERSION_CODE == 10736 123 | // MSB byte first, then LSB; Y and Z reversed: X, Z, Y 124 | magnetom[0] = -1 * ((((int) buff[4]) << 8) | buff[5]); // X axis (internal sensor -y axis) 125 | magnetom[1] = -1 * ((((int) buff[0]) << 8) | buff[1]); // Y axis (internal sensor -x axis) 126 | magnetom[2] = -1 * ((((int) buff[2]) << 8) | buff[3]); // Z axis (internal sensor -z axis) 127 | // 9DOF Sensor Stick SEN-10183 and SEN-10321 using HMC5843 magnetometer 128 | #elif (HW__VERSION_CODE == 10183) || (HW__VERSION_CODE == 10321) 129 | // MSB byte first, then LSB; X, Y, Z 130 | magnetom[0] = (((int) buff[0]) << 8) | buff[1]; // X axis (internal sensor x axis) 131 | magnetom[1] = -1 * ((((int) buff[2]) << 8) | buff[3]); // Y axis (internal sensor -y axis) 132 | magnetom[2] = -1 * ((((int) buff[4]) << 8) | buff[5]); // Z axis (internal sensor -z axis) 133 | // 9DOF Sensor Stick SEN-10724 using HMC5883L magnetometer 134 | #elif HW__VERSION_CODE == 10724 135 | // MSB byte first, then LSB; Y and Z reversed: X, Z, Y 136 | magnetom[0] = (((int) buff[0]) << 8) | buff[1]; // X axis (internal sensor x axis) 137 | magnetom[1] = -1 * ((((int) buff[4]) << 8) | buff[5]); // Y axis (internal sensor -y axis) 138 | magnetom[2] = -1 * ((((int) buff[2]) << 8) | buff[3]); // Z axis (internal sensor -z axis) 139 | #endif 140 | } 141 | else 142 | { 143 | num_magn_errors++; 144 | if (output_errors) Serial.println("!ERR: reading magnetometer"); 145 | } 146 | } 147 | 148 | void Gyro_Init() 149 | { 150 | // Power up reset defaults 151 | Wire.beginTransmission(GYRO_ADDRESS); 152 | WIRE_SEND(0x3E); 153 | WIRE_SEND(0x80); 154 | Wire.endTransmission(); 155 | delay(5); 156 | 157 | // Select full-scale range of the gyro sensors 158 | // Set LP filter bandwidth to 42Hz 159 | Wire.beginTransmission(GYRO_ADDRESS); 160 | WIRE_SEND(0x16); 161 | WIRE_SEND(0x1B); // DLPF_CFG = 3, FS_SEL = 3 162 | Wire.endTransmission(); 163 | delay(5); 164 | 165 | // Set sample rato to 50Hz 166 | Wire.beginTransmission(GYRO_ADDRESS); 167 | WIRE_SEND(0x15); 168 | WIRE_SEND(0x0A); // SMPLRT_DIV = 10 (50Hz) 169 | Wire.endTransmission(); 170 | delay(5); 171 | 172 | // Set clock to PLL with z gyro reference 173 | Wire.beginTransmission(GYRO_ADDRESS); 174 | WIRE_SEND(0x3E); 175 | WIRE_SEND(0x00); 176 | Wire.endTransmission(); 177 | delay(5); 178 | } 179 | 180 | // Reads x, y and z gyroscope registers 181 | void Read_Gyro() 182 | { 183 | int i = 0; 184 | byte buff[6]; 185 | 186 | Wire.beginTransmission(GYRO_ADDRESS); 187 | WIRE_SEND(0x1D); // Sends address to read from 188 | Wire.endTransmission(); 189 | 190 | Wire.beginTransmission(GYRO_ADDRESS); 191 | Wire.requestFrom(GYRO_ADDRESS, 6); // Request 6 bytes 192 | while(Wire.available()) // ((Wire.available())&&(i<6)) 193 | { 194 | buff[i] = WIRE_RECEIVE(); // Read one byte 195 | i++; 196 | } 197 | Wire.endTransmission(); 198 | 199 | if (i == 6) // All bytes received? 200 | { 201 | gyro[0] = -1 * ((((int) buff[2]) << 8) | buff[3]); // X axis (internal sensor -y axis) 202 | gyro[1] = -1 * ((((int) buff[0]) << 8) | buff[1]); // Y axis (internal sensor -x axis) 203 | gyro[2] = -1 * ((((int) buff[4]) << 8) | buff[5]); // Z axis (internal sensor -z axis) 204 | } 205 | else 206 | { 207 | num_gyro_errors++; 208 | if (output_errors) Serial.println("!ERR: reading gyroscope"); 209 | } 210 | } 211 | -------------------------------------------------------------------------------- /LVDS-HDMI Extension Board/hdmi_breakout_pcb_v02.gto: -------------------------------------------------------------------------------- 1 | %FSTAX25Y25*% 2 | %MOIN*% 3 | %SFA1B1*% 4 | 5 | %IPPOS*% 6 | %ADD22C,0.010000*% 7 | %ADD23C,0.007870*% 8 | %ADD24C,0.008000*% 9 | %LNhdmi_breakout_pcb_v02-1*% 10 | %LPD*% 11 | G54D22* 12 | X0225024Y0468D02* 13 | D01* 14 | X0224997Y0468768* 15 | X0224916Y0469534* 16 | X0224783Y0470292* 17 | X0224596Y0471038* 18 | X0224359Y047177* 19 | X022407Y0472483* 20 | X0223733Y0473175* 21 | X0223348Y0473841* 22 | X0222918Y0474479* 23 | X0222444Y0475086* 24 | X022193Y0475657* 25 | X0221376Y0476192* 26 | X0220787Y0476687* 27 | X0220164Y0477139* 28 | X0219512Y0477547* 29 | X0218832Y0477908* 30 | X0218129Y0478221* 31 | X0217406Y0478484* 32 | X0216666Y0478696* 33 | X0215914Y0478856* 34 | X0215152Y0478963* 35 | X0214384Y0479017* 36 | X0213615* 37 | X0212847Y0478963* 38 | X0212085Y0478856* 39 | X0211333Y0478696* 40 | X0210593Y0478484* 41 | X020987Y0478221* 42 | X0209167Y0477908* 43 | X0208488Y0477547* 44 | X0207835Y0477139* 45 | X0207212Y0476687* 46 | X0206623Y0476192* 47 | X0206069Y0475657* 48 | X0205555Y0475086* 49 | X0205081Y0474479* 50 | X0204651Y0473841* 51 | X0204266Y0473175* 52 | X0203929Y0472483* 53 | X020364Y047177* 54 | X0203403Y0471038* 55 | X0203216Y0470292* 56 | X0203083Y0469534* 57 | X0203002Y0468768* 58 | X0202976Y0468* 59 | X0203002Y0467231* 60 | X0203083Y0466465* 61 | X0203216Y0465707* 62 | X0203403Y0464961* 63 | X020364Y0464229* 64 | X0203929Y0463516* 65 | X0204266Y0462824* 66 | X0204651Y0462158* 67 | X0205081Y046152* 68 | X0205555Y0460913* 69 | X0206069Y0460342* 70 | X0206623Y0459807* 71 | X0207212Y0459312* 72 | X0207835Y045886* 73 | X0208488Y0458452* 74 | X0209167Y0458091* 75 | X020987Y0457778* 76 | X0210593Y0457515* 77 | X0211333Y0457303* 78 | X0212085Y0457143* 79 | X0212847Y0457036* 80 | X0213615Y0456982* 81 | X0214384* 82 | X0215152Y0457036* 83 | X0215914Y0457143* 84 | X0216666Y0457303* 85 | X0217406Y0457515* 86 | X0218129Y0457778* 87 | X0218832Y0458091* 88 | X0219512Y0458452* 89 | X0220164Y045886* 90 | X0220787Y0459312* 91 | X0221376Y0459807* 92 | X022193Y0460342* 93 | X0222444Y0460913* 94 | X0222918Y046152* 95 | X0223348Y0462158* 96 | X0223733Y0462824* 97 | X022407Y0463516* 98 | X0224359Y0464229* 99 | X0224596Y0464961* 100 | X0224783Y0465707* 101 | X0224916Y0466465* 102 | X0224997Y0467231* 103 | X0225024Y0468* 104 | X0321024D02* 105 | D01* 106 | X0320997Y0468768* 107 | X0320916Y0469534* 108 | X0320783Y0470292* 109 | X0320596Y0471038* 110 | X0320359Y047177* 111 | X032007Y0472483* 112 | X0319733Y0473175* 113 | X0319348Y0473841* 114 | X0318918Y0474479* 115 | X0318444Y0475086* 116 | X031793Y0475657* 117 | X0317376Y0476192* 118 | X0316787Y0476687* 119 | X0316164Y0477139* 120 | X0315512Y0477547* 121 | X0314832Y0477908* 122 | X0314129Y0478221* 123 | X0313406Y0478484* 124 | X0312666Y0478696* 125 | X0311914Y0478856* 126 | X0311152Y0478963* 127 | X0310384Y0479017* 128 | X0309615* 129 | X0308847Y0478963* 130 | X0308085Y0478856* 131 | X0307333Y0478696* 132 | X0306593Y0478484* 133 | X030587Y0478221* 134 | X0305167Y0477908* 135 | X0304488Y0477547* 136 | X0303835Y0477139* 137 | X0303212Y0476687* 138 | X0302623Y0476192* 139 | X0302069Y0475657* 140 | X0301555Y0475086* 141 | X0301081Y0474479* 142 | X0300651Y0473841* 143 | X0300266Y0473175* 144 | X0299929Y0472483* 145 | X029964Y047177* 146 | X0299403Y0471038* 147 | X0299216Y0470292* 148 | X0299083Y0469534* 149 | X0299002Y0468768* 150 | X0298976Y0468* 151 | X0299002Y0467231* 152 | X0299083Y0466465* 153 | X0299216Y0465707* 154 | X0299403Y0464961* 155 | X029964Y0464229* 156 | X0299929Y0463516* 157 | X0300266Y0462824* 158 | X0300651Y0462158* 159 | X0301081Y046152* 160 | X0301555Y0460913* 161 | X0302069Y0460342* 162 | X0302623Y0459807* 163 | X0303212Y0459312* 164 | X0303835Y045886* 165 | X0304488Y0458452* 166 | X0305167Y0458091* 167 | X030587Y0457778* 168 | X0306593Y0457515* 169 | X0307333Y0457303* 170 | X0308085Y0457143* 171 | X0308847Y0457036* 172 | X0309615Y0456982* 173 | X0310384* 174 | X0311152Y0457036* 175 | X0311914Y0457143* 176 | X0312666Y0457303* 177 | X0313406Y0457515* 178 | X0314129Y0457778* 179 | X0314832Y0458091* 180 | X0315512Y0458452* 181 | X0316164Y045886* 182 | X0316787Y0459312* 183 | X0317376Y0459807* 184 | X031793Y0460342* 185 | X0318444Y0460913* 186 | X0318918Y046152* 187 | X0319348Y0462158* 188 | X0319733Y0462824* 189 | X032007Y0463516* 190 | X0320359Y0464229* 191 | X0320596Y0464961* 192 | X0320783Y0465707* 193 | X0320916Y0466465* 194 | X0320997Y0467231* 195 | X0321024Y0468* 196 | X0236Y04845D02* 197 | Y0488499D01* 198 | X0237999Y0490498* 199 | X0239999Y0488499* 200 | Y04845* 201 | Y0487499* 202 | X0236* 203 | X0241998Y0489498D02* 204 | X0242998Y0490498D01* 205 | X0244997* 206 | X0245997Y0489498* 207 | Y0488499* 208 | X0244997Y0487499* 209 | X0243997* 210 | X0244997* 211 | X0245997Y0486499* 212 | Y04855* 213 | X0244997Y04845* 214 | X0242998* 215 | X0241998Y04855* 216 | X0251995Y0490498D02* 217 | X0247996D01* 218 | Y0487499* 219 | X0249995Y0488499* 220 | X0250995* 221 | X0251995Y0487499* 222 | Y04855* 223 | X0250995Y04845* 224 | X0248996* 225 | X0247996Y04855* 226 | X0253994Y0489498D02* 227 | X0254994Y0490498D01* 228 | X0256993* 229 | X0257993Y0489498* 230 | Y04855* 231 | X0256993Y04845* 232 | X0254994* 233 | X0253994Y04855* 234 | Y0489498* 235 | X0259992Y0490498D02* 236 | X0263991D01* 237 | Y0489498* 238 | X0259992Y04855* 239 | Y04845* 240 | X0269989Y0490498D02* 241 | X026599D01* 242 | Y0487499* 243 | X026799Y0488499* 244 | X0268989* 245 | X0269989Y0487499* 246 | Y04855* 247 | X0268989Y04845* 248 | X026699* 249 | X026599Y04855* 250 | X0271988Y0487499D02* 251 | X0275987D01* 252 | X0277986Y04845D02* 253 | Y0490498D01* 254 | X0281985Y04845* 255 | Y0490498* 256 | X0283984D02* 257 | Y04845D01* 258 | X0286983* 259 | X0287983Y04855* 260 | Y0489498* 261 | X0286983Y0490498* 262 | X0283984* 263 | X02075Y0421999D02* 264 | X0208999Y0419D01* 265 | X0210499Y0421999* 266 | X0211999Y0419D02* 267 | X0213498D01* 268 | X0212748* 269 | Y0423498* 270 | X0211999Y0422749* 271 | X0215747Y0419D02* 272 | Y041975D01* 273 | X0216497* 274 | Y0419* 275 | X0215747* 276 | X0222495D02* 277 | X0219496D01* 278 | X0222495Y0421999* 279 | Y0422749* 280 | X0221745Y0423498* 281 | X0220246* 282 | X0219496Y0422749* 283 | X0228493Y0421249D02* 284 | X0231492D01* 285 | X023749Y0419D02* 286 | Y0421999D01* 287 | X023899Y0423498* 288 | X0240489Y0421999* 289 | Y0419* 290 | Y0421249* 291 | X023749* 292 | X0241989Y0419D02* 293 | Y0421999D01* 294 | X0244238* 295 | X0244988Y0421249* 296 | Y0419* 297 | X0249486Y0423498D02* 298 | Y0419D01* 299 | X0247237* 300 | X0246487Y041975* 301 | Y0421249* 302 | X0247237Y0421999* 303 | X0249486* 304 | X0250986D02* 305 | Y041975D01* 306 | X0251736Y0419* 307 | X0253985* 308 | Y041825* 309 | X0253235Y04175* 310 | X0252485* 311 | X0253985Y0419D02* 312 | Y0421999D01* 313 | X0259983Y0423498D02* 314 | Y0419D01* 315 | X0262982* 316 | X0208Y0430999D02* 317 | Y04265D01* 318 | X0210999* 319 | X0212498Y0430999D02* 320 | Y0427999D01* 321 | X0213998Y04265* 322 | X0215498Y0427999* 323 | Y0430999* 324 | X0216997D02* 325 | Y04265D01* 326 | X0219246* 327 | X0219996Y042725* 328 | Y0430249* 329 | X0219246Y0430999* 330 | X0216997* 331 | X0224495Y0430249D02* 332 | X0223745Y0430999D01* 333 | X0222245* 334 | X0221496Y0430249* 335 | Y0429499* 336 | X0222245Y0428749* 337 | X0223745* 338 | X0224495Y0427999* 339 | Y042725* 340 | X0223745Y04265* 341 | X0222245* 342 | X0221496Y042725* 343 | X0232742Y04265D02* 344 | X0230493Y0428749D01* 345 | X0232742Y0430999* 346 | X0234991Y0428749D02* 347 | X023799D01* 348 | X023949Y04265D02* 349 | X0241739Y0428749D01* 350 | X023949Y0430999* 351 | X0247737D02* 352 | Y04265D01* 353 | Y0428749* 354 | X0250736* 355 | Y0430999* 356 | Y04265* 357 | X0252236Y0430999D02* 358 | Y04265D01* 359 | X0254485* 360 | X0255235Y042725* 361 | Y0430249* 362 | X0254485Y0430999* 363 | X0252236* 364 | X0256734Y04265D02* 365 | Y0430999D01* 366 | X0258234Y0429499* 367 | X0259733Y0430999* 368 | Y04265* 369 | X0261233Y0430999D02* 370 | X0262732D01* 371 | X0261983* 372 | Y04265* 373 | X0261233* 374 | X0262732* 375 | X026948Y0430999D02* 376 | Y04265D01* 377 | X0271729* 378 | X0272479Y042725* 379 | Y0427999* 380 | X0271729Y0428749* 381 | X026948* 382 | X0271729* 383 | X0272479Y0429499* 384 | Y0430249* 385 | X0271729Y0430999* 386 | X026948* 387 | X0276228D02* 388 | X0274728D01* 389 | X0273979Y0430249* 390 | Y042725* 391 | X0274728Y04265* 392 | X0276228* 393 | X0276978Y042725* 394 | Y0430249* 395 | X0276228Y0430999* 396 | X0278477Y04265D02* 397 | Y0429499D01* 398 | X0279977Y0430999* 399 | X0281476Y0429499* 400 | Y04265* 401 | Y0428749* 402 | X0278477* 403 | X0282976Y04265D02* 404 | Y0430999D01* 405 | X0285225* 406 | X0285975Y0430249* 407 | Y0428749* 408 | X0285225Y0427999* 409 | X0282976* 410 | X0284475D02* 411 | X0285975Y04265D01* 412 | X0287474Y0430999D02* 413 | Y04265D01* 414 | X0289724* 415 | X0290473Y042725* 416 | Y0430249* 417 | X0289724Y0430999* 418 | X0287474* 419 | G54D23* 420 | X0311Y0441D02* 421 | X0321D01* 422 | Y0401D02* 423 | Y0441D01* 424 | X0311Y0401D02* 425 | Y0441D01* 426 | Y0401D02* 427 | X0321D01* 428 | X0208504Y0394032D02* 429 | Y0403087D01* 430 | Y038852D02* 431 | Y0397969D01* 432 | Y038852D02* 433 | X0271496D01* 434 | Y0403087* 435 | X0208504D02* 436 | X0271496D01* 437 | X0283Y0399D02* 438 | X0303D01* 439 | X0283Y0389D02* 440 | Y0399D01* 441 | Y0389D02* 442 | X0303D01* 443 | Y0399* 444 | G54D24* 445 | X0204173Y0389307D02* 446 | X0205006D01* 447 | X020459* 448 | Y0391806* 449 | X0204173Y039139* 450 | X0273465Y0398362D02* 451 | X0274298D01* 452 | X0273881* 453 | Y0400861* 454 | X0273465Y0400445* 455 | X0277213Y0400861D02* 456 | X027638Y0400445D01* 457 | X0275547Y0399612* 458 | Y0398779* 459 | X0275964Y0398362* 460 | X0276797* 461 | X0277213Y0398779* 462 | Y0399195* 463 | X0276797Y0399612* 464 | X0275547* 465 | X0209Y0408499D02* 466 | Y0405D01* 467 | X0211333* 468 | X0214831Y0407916D02* 469 | X0214248Y0408499D01* 470 | X0213082* 471 | X0212499Y0407916* 472 | Y0405583* 473 | X0213082Y0405* 474 | X0214248* 475 | X0214831Y0405583* 476 | X0215998Y0408499D02* 477 | Y0405D01* 478 | X0217747* 479 | X021833Y0405583* 480 | Y0407916* 481 | X0217747Y0408499* 482 | X0215998* 483 | X0222995D02* 484 | Y0405D01* 485 | X0225328* 486 | X0226494Y0408499D02* 487 | Y0406166D01* 488 | X0227661Y0405* 489 | X0228827Y0406166* 490 | Y0408499* 491 | X0229993D02* 492 | Y0405D01* 493 | X0231743* 494 | X0232326Y0405583* 495 | Y0407916* 496 | X0231743Y0408499* 497 | X0229993* 498 | X0235825Y0407916D02* 499 | X0235242Y0408499D01* 500 | X0234075* 501 | X0233492Y0407916* 502 | Y0407333* 503 | X0234075Y0406749* 504 | X0235242* 505 | X0235825Y0406166* 506 | Y0405583* 507 | X0235242Y0405* 508 | X0234075* 509 | X0233492Y0405583* 510 | X0296501Y0402D02* 511 | X03D01* 512 | Y0404333* 513 | X0297084Y0407831D02* 514 | X0296501Y0407248D01* 515 | Y0406082* 516 | X0297084Y0405499* 517 | X0299417* 518 | X03Y0406082* 519 | Y0407248* 520 | X0299417Y0407831* 521 | X0296501Y0408998D02* 522 | X03D01* 523 | Y0410747* 524 | X0299417Y041133* 525 | X0297084* 526 | X0296501Y0410747* 527 | Y0408998* 528 | X0298251Y0415996D02* 529 | Y0418328D01* 530 | X0297084Y0417162D02* 531 | X0299417D01* 532 | X0285501Y0402D02* 533 | X0289D01* 534 | Y0404333* 535 | X0286084Y0407831D02* 536 | X0285501Y0407248D01* 537 | Y0406082* 538 | X0286084Y0405499* 539 | X0288417* 540 | X0289Y0406082* 541 | Y0407248* 542 | X0288417Y0407831* 543 | X0285501Y0408998D02* 544 | X0289D01* 545 | Y0410747* 546 | X0288417Y041133* 547 | X0286084* 548 | X0285501Y0410747* 549 | Y0408998* 550 | X0287251Y0415996D02* 551 | Y0418328D01* 552 | X03115Y0397999D02* 553 | Y0395083D01* 554 | X0312083Y03945* 555 | X0313249* 556 | X0313833Y0395083* 557 | Y0397999* 558 | X0317331Y0397416D02* 559 | X0316748Y0397999D01* 560 | X0315582* 561 | X0314999Y0397416* 562 | Y0396833* 563 | X0315582Y0396249* 564 | X0316748* 565 | X0317331Y0395666* 566 | Y0395083* 567 | X0316748Y03945* 568 | X0315582* 569 | X0314999Y0395083* 570 | X0318498Y0397999D02* 571 | Y03945D01* 572 | X0320247* 573 | X032083Y0395083* 574 | Y0395666* 575 | X0320247Y0396249* 576 | X0318498* 577 | X0320247* 578 | X032083Y0396833* 579 | Y0397416* 580 | X0320247Y0397999* 581 | X0318498* 582 | X03065Y0436749D02* 583 | X0308833D01* 584 | X0307666Y0437916D02* 585 | Y0435583D01* 586 | X03065Y0405749D02* 587 | X0308833D01* 588 | X03035Y0427999D02* 589 | Y04245D01* 590 | X0305249* 591 | X0305833Y0425083* 592 | Y0427416* 593 | X0305249Y0427999* 594 | X03035* 595 | X0306999Y0426249D02* 596 | X0309331D01* 597 | X03035Y0417499D02* 598 | Y0414D01* 599 | X0305249* 600 | X0305833Y0414583* 601 | Y0416916* 602 | X0305249Y0417499* 603 | X03035* 604 | X0306999Y0415749D02* 605 | X0309331D01* 606 | X0308165Y0416916D02* 607 | Y0414583D01* 608 | M02* -------------------------------------------------------------------------------- /IMU Calibration - Processing/Magnetometer_calibration/Magnetometer_calibration.pde: -------------------------------------------------------------------------------- 1 | /****************************************************************************************** 2 | * Magnetometer Sampling Sketch for Razor AHRS v1.4.1 3 | * 9 Degree of Measurement Attitude and Heading Reference System 4 | * for Sparkfun "9DOF Razor IMU" and "9DOF Sensor Stick" 5 | * 6 | * Released under GNU GPL (General Public License) v3.0 7 | * Copyright (C) 2011-2012 Quality & Usability Lab, Deutsche Telekom Laboratories, TU Berlin 8 | * Written by Peter Bartz (peter-bartz@gmx.de) 9 | * 10 | * Infos, updates, bug reports and feedback: 11 | * http://dev.qu.tu-berlin.de/projects/sf-razor-9dof-ahrs 12 | ******************************************************************************************/ 13 | 14 | /* 15 | NOTE: There seems to be a bug with the serial library in the latest Processing 16 | versions 1.5 and 1.5.1: "WARNING: RXTX Version mismatch ...". The previous version 17 | 1.2.1 works fine and is still available on the web. 18 | */ 19 | 20 | /* 21 | NOTE: You have to install a library, before this sketch can be run! 22 | We're using EJML for matrix math, because it's really fast: 23 | http://code.google.com/p/java-matrix-benchmark/ 24 | Also, it's released under LGPL, which fits well with our GPL. 25 | Get the library from: http://code.google.com/p/efficient-java-matrix-library/ (you only need 26 | the .jar file), find your Processing "libraries" folder (normally this is Processing/libraries 27 | in your user documents folder). Create a folder "EJML" inside "libraries", 28 | create a folder "library" inside "EJML" and put the .jar inside. Rename to EJML.jar. So you 29 | should have "libraries/EJML/library/EJML.jar". Restart Processing and you're good. 30 | More info on installing libraries in Processing: http://wiki.processing.org/w/How_to_Install_a_Contributed_Library 31 | */ 32 | import org.ejml.data.*; 33 | import org.ejml.simple.*; 34 | import org.ejml.ops.*; 35 | 36 | // IF THE SKETCH CRASHES OR HANGS ON STARTUP, MAKE SURE YOU ARE USING THE RIGHT SERIAL PORT: 37 | // 1. Have a look at the Processing console output of this sketch. 38 | // 2. Look for the serial port list and find the port you need (it's the same as in Arduino). 39 | // 3. Set your port number here: 40 | final static int SERIAL_PORT_NUM = 0; 41 | // 4. Try again. 42 | 43 | 44 | 45 | import processing.opengl.*; 46 | import processing.serial.*; 47 | 48 | final static int SERIAL_PORT_BAUD_RATE = 57600; 49 | 50 | final static int NUM_MAGN_SAMPLES = 10000; 51 | float magnetom[][] = new float[NUM_MAGN_SAMPLES][3]; 52 | int magnetomIndex = 0; 53 | 54 | PFont font; 55 | Serial serial; 56 | 57 | boolean synched = false; 58 | 59 | // Skip incoming serial stream data until token is found 60 | boolean readToken(Serial serial, String token) { 61 | // Wait until enough bytes are available 62 | if (serial.available() < token.length()) 63 | return false; 64 | 65 | // Check if incoming bytes match token 66 | for (int i = 0; i < token.length(); i++) { 67 | if (serial.read() != token.charAt(i)) 68 | return false; 69 | } 70 | 71 | return true; 72 | } 73 | 74 | // Global setup 75 | void setup() { 76 | // Setup graphics 77 | size(800, 800, OPENGL); 78 | smooth(); 79 | noStroke(); 80 | frameRate(50); 81 | colorMode(HSB); 82 | 83 | // Load font 84 | font = loadFont("Univers-66.vlw"); 85 | textFont(font); 86 | 87 | // Setup serial port I/O 88 | println("AVAILABLE SERIAL PORTS:"); 89 | println(Serial.list()); 90 | String portName = Serial.list()[SERIAL_PORT_NUM]; 91 | println(); 92 | println("HAVE A LOOK AT THE LIST ABOVE AND SET THE RIGHT SERIAL PORT NUMBER IN THE CODE!"); 93 | println(" -> Using port " + SERIAL_PORT_NUM + ": " + portName); 94 | serial = new Serial(this, portName, SERIAL_PORT_BAUD_RATE); 95 | } 96 | 97 | void setupRazor() { 98 | println("Trying to setup and synch Razor...\n"); 99 | 100 | // On Mac OSX and Linux (Windows too?) the board will do a reset when we connect, which is really bad. 101 | // See "Automatic (Software) Reset" on http://www.arduino.cc/en/Main/ArduinoBoardProMini 102 | // So we have to wait until the bootloader is finished and the Razor firmware can receive commands. 103 | // To prevent this, disconnect/cut/unplug the DTR line going to the board. This also has the advantage, 104 | // that the angles you receive are stable right from the beginning. 105 | delay(3000); // 3 seconds should be enough 106 | 107 | // Set Razor output parameters 108 | serial.write("#osrb"); // Turn on binary output of raw sensor data 109 | serial.write("#o1"); // Turn on continuous streaming output 110 | serial.write("#oe0"); // Disable error message output 111 | 112 | // Synch with Razor 113 | serial.clear(); // Clear input buffer up to here 114 | serial.write("#s00"); // Request synch token 115 | } 116 | 117 | float readFloat(Serial s) { 118 | // Convert from little endian (Razor) to big endian (Java) and interpret as float 119 | return Float.intBitsToFloat(s.read() + (s.read() << 8) + (s.read() << 16) + (s.read() << 24)); 120 | } 121 | 122 | void skipBytes(Serial s, int numBytes) { 123 | for (int i = 0; i < numBytes; i++) { 124 | s.read(); 125 | } 126 | } 127 | 128 | void draw() { 129 | // Reset scene 130 | lights(); 131 | 132 | // Sync with Razor 133 | if (!synched) { 134 | background(0); 135 | textAlign(CENTER); 136 | fill(255); 137 | text("Connecting to Razor...", width/2, height/2, -200); 138 | 139 | if (frameCount == 2) 140 | setupRazor(); // Set ouput params and request synch token 141 | else if (frameCount > 2) 142 | synched = readToken(serial, "#SYNCH00\r\n"); // Look for synch token 143 | return; 144 | } 145 | 146 | // Output "max samples reached" message? 147 | if (magnetomIndex == NUM_MAGN_SAMPLES - 1) { 148 | fill(0, 255, 255); 149 | text("MAX NUMBER OF SAMPLES REACHED!", width/2, 0, -250); 150 | println("MAX NUMBER OF SAMPLES REACHED!"); 151 | } 152 | 153 | pushMatrix(); { 154 | translate(width/2, height/2, -900); 155 | 156 | // Draw sphere and background once 157 | if (magnetomIndex == 0) { 158 | background(0); 159 | noFill(); 160 | stroke(255); 161 | sphereDetail(10); 162 | sphere(400); 163 | fill(200); 164 | text("Press 'r' to reset. Press SPACE to output calibration parameters to console and quit.", 0, 1100, -600); 165 | } 166 | 167 | // Read and draw new sample 168 | if (magnetomIndex < NUM_MAGN_SAMPLES && serial.available() >= 36) { 169 | // Read all available magnetometer data from serial port 170 | while (serial.available() >= 36) { 171 | // Skip accel data 172 | skipBytes(serial, 12); 173 | // Read magn data 174 | magnetom[magnetomIndex][0] = readFloat(serial); // x 175 | magnetom[magnetomIndex][1] = readFloat(serial); // y 176 | magnetom[magnetomIndex][2] = readFloat(serial); // z 177 | // Skip gyro data 178 | skipBytes(serial, 12); 179 | } 180 | 181 | // Draw new point 182 | fill((magnetom[magnetomIndex][2] + 800) / 8, 255, 255); 183 | noStroke(); 184 | translate(magnetom[magnetomIndex][0], magnetom[magnetomIndex][1], magnetom[magnetomIndex][2]); 185 | sphere(5); 186 | 187 | magnetomIndex++; 188 | } 189 | } popMatrix(); 190 | } 191 | 192 | void keyPressed() { 193 | switch (key) { 194 | case '0': // Turn Razor's continuous output stream off 195 | serial.write("#o0"); 196 | break; 197 | case '1': // Turn Razor's continuous output stream on 198 | serial.write("#o1"); 199 | break; 200 | case 'f': // Request one single yaw/pitch/roll frame from Razor (use when continuous streaming is off) 201 | serial.write("#f"); 202 | break; 203 | case ' ': // Calculate and output calibration parameters, output binary magnetometer samples file, quit 204 | case ENTER: 205 | case RETURN: 206 | outputCalibration(); // Do the magic 207 | exit(); // We're done 208 | break; 209 | case 'r': // Reset samples and clear screen 210 | magnetomIndex = 0; 211 | break; 212 | } 213 | } 214 | 215 | void outputCalibration() { 216 | /* ELLIPSOID FITTING CODE */ 217 | // Adaption of 'ellipsoid_fit' matlab code by Yury Petrov (See 'Matlab' folder 218 | // that came with the archive containing this file). 219 | 220 | // Check if we have at least 9 sample points 221 | if (magnetomIndex < 9) { 222 | println("ERROR: not enough magnetometer samples. We need at least 9 points."); 223 | exit(); 224 | } 225 | 226 | // Seperate xyz magnetometer values and make column vectors 227 | SimpleMatrix x = new SimpleMatrix(magnetomIndex, 1); 228 | SimpleMatrix y = new SimpleMatrix(magnetomIndex, 1); 229 | SimpleMatrix z = new SimpleMatrix(magnetomIndex, 1); 230 | for (int i = 0; i < magnetomIndex; i++) { 231 | x.set(i, magnetom[i][0]); 232 | y.set(i, magnetom[i][1]); 233 | z.set(i, magnetom[i][2]); 234 | } 235 | 236 | 237 | /* 238 | % fit ellipsoid in the form Ax^2 + By^2 + Cz^2 + 2Dxy + 2Exz + 2Fyz + 2Gx + 2Hy + 2Iz = 1 239 | D = [ x .* x, ... 240 | y .* y, ... 241 | z .* z, ... 242 | 2 * x .* y, ... 243 | 2 * x .* z, ... 244 | 2 * y .* z, ... 245 | 2 * x, ... 246 | 2 * y, ... 247 | 2 * z ]; % ndatapoints x 9 ellipsoid parameters 248 | */ 249 | SimpleMatrix D = new SimpleMatrix(x.numRows(), 9); 250 | D.insertIntoThis(0, 0, x.elementMult(x)); 251 | D.insertIntoThis(0, 1, y.elementMult(y)); 252 | D.insertIntoThis(0, 2, z.elementMult(z)); 253 | D.insertIntoThis(0, 3, x.elementMult(y).scale(2)); 254 | D.insertIntoThis(0, 4, x.elementMult(z).scale(2)); 255 | D.insertIntoThis(0, 5, y.elementMult(z).scale(2)); 256 | D.insertIntoThis(0, 6, x.scale(2)); 257 | D.insertIntoThis(0, 7, y.scale(2)); 258 | D.insertIntoThis(0, 8, z.scale(2)); 259 | 260 | /* 261 | % solve the normal system of equations 262 | v = ( D' * D ) \ ( D' * ones( size( x, 1 ), 1 ) ); 263 | */ 264 | SimpleMatrix tempA = D.transpose().mult(D); 265 | SimpleMatrix ones = x.copy(); ones.set(1); 266 | SimpleMatrix tempB = D.transpose().mult(ones); 267 | SimpleMatrix v = tempA.solve(tempB); 268 | 269 | /* 270 | % form the algebraic form of the ellipsoid 271 | A = [ v(1) v(4) v(5) v(7); ... 272 | v(4) v(2) v(6) v(8); ... 273 | v(5) v(6) v(3) v(9); ... 274 | v(7) v(8) v(9) -1 ]; 275 | */ 276 | SimpleMatrix A = new SimpleMatrix(new double[][] 277 | {{v.get(0), v.get(3), v.get(4), v.get(6)}, 278 | {v.get(3), v.get(1), v.get(5), v.get(7)}, 279 | {v.get(4), v.get(5), v.get(2), v.get(8)}, 280 | {v.get(6), v.get(7), v.get(8), -1.0}}); 281 | 282 | /* 283 | % find the center of the ellipsoid 284 | center = -A( 1:3, 1:3 ) \ [ v(7); v(8); v(9) ]; 285 | */ 286 | SimpleMatrix center = A.extractMatrix(0, 3, 0, 3).scale(-1).solve(v.extractMatrix(6, 9, 0, 1)); 287 | 288 | /* 289 | % form the corresponding translation matrix 290 | T = eye( 4 ); 291 | T( 4, 1:3 ) = center'; 292 | */ 293 | SimpleMatrix T = SimpleMatrix.identity(4); 294 | T.insertIntoThis(3, 0, center.transpose()); 295 | 296 | /* 297 | % translate to the center 298 | R = T * A * T'; 299 | % solve the eigenproblem 300 | [ evecs evals ] = eig( R( 1:3, 1:3 ) / -R( 4, 4 ) ); 301 | radii = sqrt( 1 ./ diag( evals ) ); 302 | */ 303 | SimpleMatrix R = T.mult(A).mult(T.transpose()); 304 | SimpleEVD evd = R.extractMatrix(0, 3, 0, 3).divide(-R.get(3, 3)).eig(); 305 | 306 | SimpleMatrix evecs = new SimpleMatrix(3, 3); 307 | evecs.insertIntoThis(0, 0, evd.getEigenVector(0)); 308 | evecs.insertIntoThis(0, 1, evd.getEigenVector(1)); 309 | evecs.insertIntoThis(0, 2, evd.getEigenVector(2)); 310 | 311 | SimpleMatrix radii = new SimpleMatrix(new double[][] 312 | {{Math.sqrt(1.0 / evd.getEigenvalue(0).getReal()), 313 | Math.sqrt(1.0 / evd.getEigenvalue(1).getReal()), 314 | Math.sqrt(1.0 / evd.getEigenvalue(2).getReal())}}); 315 | 316 | //center.print(); 317 | //evecs.print(); 318 | //radii.print(); 319 | 320 | 321 | /* CALCULATE COMPENSATION MATRIX */ 322 | // Adaption of my 'magnetometer_calibration' matlab code. (See 'Matlab' folder 323 | // that came with the archive containing this file). 324 | /* 325 | % compensate distorted magnetometer data 326 | % e_eigenvecs is an orthogonal matrix, so ' can be used instead of inv() 327 | scale = inv([e_radii(1) 0 0; 0 e_radii(2) 0; 0 0 e_radii(3)]) * min(e_radii); % scaling matrix 328 | map = e_eigenvecs'; % transformation matrix to map ellipsoid axes to coordinate system axes 329 | invmap = e_eigenvecs; % inverse of above 330 | comp = invmap * scale * map; 331 | */ 332 | SimpleMatrix scale = new SimpleMatrix(3, 3); 333 | scale.zero(); 334 | scale.set(0, 0, radii.get(0)); 335 | scale.set(1, 1, radii.get(1)); 336 | scale.set(2, 2, radii.get(2)); 337 | scale = scale.invert().scale(CommonOps.elementMin(radii.getMatrix())); 338 | 339 | SimpleMatrix map = evecs.transpose(); 340 | SimpleMatrix invmap = evecs; 341 | SimpleMatrix comp = invmap.mult(scale).mult(map); 342 | //comp.print(); 343 | 344 | /* OUTPUT RESULTS */ 345 | // Output magnetometer samples file 346 | try { 347 | println("Trying to write " + magnetomIndex + " sample points to file magnetom.float ..."); 348 | FileOutputStream fos = new FileOutputStream(sketchPath("magnetom.float")); 349 | DataOutputStream dos = new DataOutputStream(fos); 350 | for (int i = 0; i < magnetomIndex; i++) { 351 | dos.writeFloat(magnetom[i][0]); 352 | dos.writeFloat(magnetom[i][1]); 353 | dos.writeFloat(magnetom[i][2]); 354 | } 355 | fos.close(); 356 | println("Done."); 357 | } catch(Exception e) { 358 | println("Exception: " + e.toString()); 359 | } 360 | println("\n"); 361 | 362 | // Output calibration 363 | System.out.printf("In the Razor_AHRS.pde (or .ino), under 'SENSOR CALIBRATION' find the section that reads 'Magnetometer (extended calibration)'\n"); 364 | System.out.printf("Replace the existing 3 lines with these:\n\n"); 365 | System.out.printf("#define CALIBRATION__MAGN_USE_EXTENDED true\n"); 366 | System.out.printf("const float magn_ellipsoid_center[3] = {%.6g, %.6g, %.6g};\n", center.get(0), center.get(1), center.get(2)); 367 | System.out.printf("const float magn_ellipsoid_transform[3][3] = {{%.6g, %.6g, %.6g}, {%.6g, %.6g, %.6g}, {%.6g, %.6g, %.6g}};\n", 368 | comp.get(0), comp.get(1), comp.get(2), comp.get(3), comp.get(4), comp.get(5), comp.get(6), comp.get(7), comp.get(8)); 369 | println("\n"); 370 | } 371 | -------------------------------------------------------------------------------- /Arduino/Final_arduino_code.ino: -------------------------------------------------------------------------------- 1 | /*************************************************************************************************************** 2 | * Razor AHRS Firmware v1.4.1 3 | * 9 Degree of Measurement Attitude and Heading Reference System 4 | * for Sparkfun "9DOF Razor IMU" (SEN-10125 and SEN-10736) 5 | * and "9DOF Sensor Stick" (SEN-10183, 10321 and SEN-10724) 6 | * 7 | * Released under GNU GPL (General Public License) v3.0 8 | * Copyright (C) 2011-2012 Quality & Usability Lab, Deutsche Telekom Laboratories, TU Berlin 9 | * 10 | * Infos, updates, bug reports and feedback: 11 | * http://dev.qu.tu-berlin.de/projects/sf-razor-9dof-ahrs 12 | * 13 | * 14 | * History: 15 | * * Original code (http://code.google.com/p/sf9domahrs/) by Doug Weibel and Jose Julio, 16 | * based on ArduIMU v1.5 by Jordi Munoz and William Premerlani, Jose Julio and Doug Weibel. Thank you! 17 | * 18 | * * Updated code (http://groups.google.com/group/sf_9dof_ahrs_update) by David Malik (david.zsolt.malik@gmail.com) 19 | * for new Sparkfun 9DOF Razor hardware (SEN-10125). 20 | * 21 | * * Updated and extended by Peter Bartz (peter-bartz@gmx.de): 22 | * * v1.3.0 23 | * * Cleaned up, streamlined and restructured most of the code to make it more comprehensible. 24 | * * Added sensor calibration (improves precision and responsiveness a lot!). 25 | * * Added binary yaw/pitch/roll output. 26 | * * Added basic serial command interface to set output modes/calibrate sensors/synch stream/etc. 27 | * * Added support to synch automatically when using Rovering Networks Bluetooth modules (and compatible). 28 | * * Wrote new easier to use test program (using Processing). 29 | * * Added support for new version of "9DOF Razor IMU": SEN-10736. 30 | * --> The output of this code is not compatible with the older versions! 31 | * --> A Processing sketch to test the tracker is available. 32 | * * v1.3.1 33 | * * Initializing rotation matrix based on start-up sensor readings -> orientation OK right away. 34 | * * Adjusted gyro low-pass filter and output rate settings. 35 | * * v1.3.2 36 | * * Adapted code to work with new Arduino 1.0 (and older versions still). 37 | * * v1.3.3 38 | * * Improved synching. 39 | * * v1.4.0 40 | * * Added support for SparkFun "9DOF Sensor Stick" (versions SEN-10183, SEN-10321 and SEN-10724). 41 | * * v1.4.1 42 | * * Added output modes to read raw and/or calibrated sensor data in text or binary format. 43 | * * Added static magnetometer soft iron distortion compensation 44 | * 45 | * TODOs: 46 | * * Allow optional use of EEPROM for storing and reading calibration values. 47 | * * Use self-test and temperature-compensation features of the sensors. 48 | ***************************************************************************************************************/ 49 | 50 | /* 51 | "9DOF Razor IMU" hardware versions: SEN-10125 and SEN-10736 52 | 53 | ATMega328@3.3V, 8MHz 54 | 55 | ADXL345 : Accelerometer 56 | HMC5843 : Magnetometer on SEN-10125 57 | HMC5883L : Magnetometer on SEN-10736 58 | ITG-3200 : Gyro 59 | 60 | Arduino IDE : Select board "Arduino Pro or Pro Mini (3.3v, 8Mhz) w/ATmega328" 61 | */ 62 | 63 | /* 64 | "9DOF Sensor Stick" hardware versions: SEN-10183, SEN-10321 and SEN-10724 65 | 66 | ADXL345 : Accelerometer 67 | HMC5843 : Magnetometer on SEN-10183 and SEN-10321 68 | HMC5883L : Magnetometer on SEN-10724 69 | ITG-3200 : Gyro 70 | */ 71 | 72 | /* 73 | Axis definition (differs from definition printed on the board!): 74 | X axis pointing forward (towards the short edge with the connector holes) 75 | Y axis pointing to the right 76 | and Z axis pointing down. 77 | 78 | Positive yaw : clockwise 79 | Positive roll : right wing down 80 | Positive pitch : nose up 81 | 82 | Transformation order: first yaw then pitch then roll. 83 | */ 84 | 85 | /* 86 | Serial commands that the firmware understands: 87 | 88 | "#o" - Set OUTPUT mode and parameters. The available options are: 89 | 90 | // Streaming output 91 | "#o0" - DISABLE continuous streaming output. Also see #f below. 92 | "#o1" - ENABLE continuous streaming output. 93 | 94 | // Angles output 95 | "#ob" - Output angles in BINARY format (yaw/pitch/roll as binary float, so one output frame 96 | is 3x4 = 12 bytes long). 97 | "#ot" - Output angles in TEXT format (Output frames have form like "#YPR=-142.28,-5.38,33.52", 98 | followed by carriage return and line feed [\r\n]). 99 | 100 | // Sensor calibration 101 | "#oc" - Go to CALIBRATION output mode. 102 | "#on" - When in calibration mode, go on to calibrate NEXT sensor. 103 | 104 | // Sensor data output 105 | "#osct" - Output CALIBRATED SENSOR data of all 9 axes in TEXT format. 106 | One frame consist of three lines - one for each sensor: acc, mag, gyr. 107 | "#osrt" - Output RAW SENSOR data of all 9 axes in TEXT format. 108 | One frame consist of three lines - one for each sensor: acc, mag, gyr. 109 | "#osbt" - Output BOTH raw and calibrated SENSOR data of all 9 axes in TEXT format. 110 | One frame consist of six lines - like #osrt and #osct combined (first RAW, then CALIBRATED). 111 | NOTE: This is a lot of number-to-text conversion work for the little 8MHz chip on the Razor boards. 112 | In fact it's too much and an output frame rate of 50Hz can not be maintained. #osbb. 113 | "#oscb" - Output CALIBRATED SENSOR data of all 9 axes in BINARY format. 114 | One frame consist of three 3x3 float values = 36 bytes. Order is: acc x/y/z, mag x/y/z, gyr x/y/z. 115 | "#osrb" - Output RAW SENSOR data of all 9 axes in BINARY format. 116 | One frame consist of three 3x3 float values = 36 bytes. Order is: acc x/y/z, mag x/y/z, gyr x/y/z. 117 | "#osbb" - Output BOTH raw and calibrated SENSOR data of all 9 axes in BINARY format. 118 | One frame consist of 2x36 = 72 bytes - like #osrb and #oscb combined (first RAW, then CALIBRATED). 119 | 120 | // Error message output 121 | "#oe0" - Disable ERROR message output. 122 | "#oe1" - Enable ERROR message output. 123 | 124 | 125 | "#f" - Request one output frame - useful when continuous output is disabled and updates are 126 | required in larger intervals only. Though #f only requests one reply, replies are still 127 | bound to the internal 20ms (50Hz) time raster. So worst case delay that #f can add is 19.99ms. 128 | 129 | 130 | "#s" - Request synch token - useful to find out where the frame boundaries are in a continuous 131 | binary stream or to see if tracker is present and answering. The tracker will send 132 | "#SYNCH\r\n" in response (so it's possible to read using a readLine() function). 133 | x and y are two mandatory but arbitrary bytes that can be used to find out which request 134 | the answer belongs to. 135 | 136 | 137 | ("#C" and "#D" - Reserved for communication with optional Bluetooth module.) 138 | 139 | Newline characters are not required. So you could send "#ob#o1#s", which 140 | would set binary output mode, enable continuous streaming output and request 141 | a synch token all at once. 142 | 143 | The status LED will be on if streaming output is enabled and off otherwise. 144 | 145 | Byte order of binary output is little-endian: least significant byte comes first. 146 | */ 147 | 148 | 149 | 150 | /*****************************************************************/ 151 | /*********** USER SETUP AREA! Set your options here! *************/ 152 | /*****************************************************************/ 153 | 154 | // HARDWARE OPTIONS 155 | /*****************************************************************/ 156 | // Select your hardware here by uncommenting one line! 157 | //#define HW__VERSION_CODE 10125 // SparkFun "9DOF Razor IMU" version "SEN-10125" (HMC5843 magnetometer) 158 | #define HW__VERSION_CODE 10736 // SparkFun "9DOF Razor IMU" version "SEN-10736" (HMC5883L magnetometer) 159 | //#define HW__VERSION_CODE 10183 // SparkFun "9DOF Sensor Stick" version "SEN-10183" (HMC5843 magnetometer) 160 | //#define HW__VERSION_CODE 10321 // SparkFun "9DOF Sensor Stick" version "SEN-10321" (HMC5843 magnetometer) 161 | //#define HW__VERSION_CODE 10724 // SparkFun "9DOF Sensor Stick" version "SEN-10724" (HMC5883L magnetometer) 162 | 163 | 164 | // OUTPUT OPTIONS 165 | /*****************************************************************/ 166 | // Set your serial port baud rate used to send out data here! 167 | #define OUTPUT__BAUD_RATE 57600 168 | 169 | // Sensor data output interval in milliseconds 170 | // This may not work, if faster than 20ms (=50Hz) 171 | // Code is tuned for 20ms, so better leave it like that 172 | #define OUTPUT__DATA_INTERVAL 20 // in milliseconds 173 | 174 | // Output mode definitions (do not change) 175 | #define OUTPUT__MODE_CALIBRATE_SENSORS 0 // Outputs sensor min/max values as text for manual calibration 176 | #define OUTPUT__MODE_ANGLES 1 // Outputs yaw/pitch/roll in degrees 177 | #define OUTPUT__MODE_SENSORS_CALIB 2 // Outputs calibrated sensor values for all 9 axes 178 | #define OUTPUT__MODE_SENSORS_RAW 3 // Outputs raw (uncalibrated) sensor values for all 9 axes 179 | #define OUTPUT__MODE_SENSORS_BOTH 4 // Outputs calibrated AND raw sensor values for all 9 axes 180 | // Output format definitions (do not change) 181 | #define OUTPUT__FORMAT_TEXT 0 // Outputs data as text 182 | #define OUTPUT__FORMAT_BINARY 1 // Outputs data as binary float 183 | 184 | // Select your startup output mode and format here! 185 | int output_mode = OUTPUT__MODE_ANGLES; 186 | int output_format = OUTPUT__FORMAT_TEXT; 187 | 188 | // Select if serial continuous streaming output is enabled per default on startup. 189 | #define OUTPUT__STARTUP_STREAM_ON true // true or false 190 | 191 | // If set true, an error message will be output if we fail to read sensor data. 192 | // Message format: "!ERR: reading ", followed by "\r\n". 193 | boolean output_errors = false; // true or false 194 | 195 | // Bluetooth 196 | // You can set this to true, if you have a Rovering Networks Bluetooth Module attached. 197 | // The connect/disconnect message prefix of the module has to be set to "#". 198 | // (Refer to manual, it can be set like this: SO,#) 199 | // When using this, streaming output will only be enabled as long as we're connected. That way 200 | // receiver and sender are synchronzed easily just by connecting/disconnecting. 201 | // It is not necessary to set this! It just makes life easier when writing code for 202 | // the receiving side. The Processing test sketch also works without setting this. 203 | // NOTE: When using this, OUTPUT__STARTUP_STREAM_ON has no effect! 204 | #define OUTPUT__HAS_RN_BLUETOOTH false // true or false 205 | 206 | 207 | // SENSOR CALIBRATION 208 | /*****************************************************************/ 209 | // How to calibrate? Read the tutorial at http://dev.qu.tu-berlin.de/projects/sf-razor-9dof-ahrs 210 | // Put MIN/MAX and OFFSET readings for your board here! 211 | // Accelerometer 212 | // "accel x,y,z (min/max) = X_MIN/X_MAX Y_MIN/Y_MAX Z_MIN/Z_MAX" 213 | #define ACCEL_X_MIN ((float) -289) 214 | #define ACCEL_X_MAX ((float) 294) 215 | #define ACCEL_Y_MIN ((float) -268) 216 | #define ACCEL_Y_MAX ((float) 288) 217 | #define ACCEL_Z_MIN ((float) -294) 218 | #define ACCEL_Z_MAX ((float) 269) 219 | 220 | // Magnetometer (standard calibration) 221 | // "magn x,y,z (min/max) = X_MIN/X_MAX Y_MIN/Y_MAX Z_MIN/Z_MAX" 222 | //#define MAGN_X_MIN ((float) -600) 223 | //#define MAGN_X_MAX ((float) 600) 224 | //#define MAGN_Y_MIN ((float) -600) 225 | //#define MAGN_Y_MAX ((float) 600) 226 | //#define MAGN_Z_MIN ((float) -600) 227 | //#define MAGN_Z_MAX ((float) 600) 228 | 229 | // Magnetometer (extended calibration) 230 | // Uncommend to use extended magnetometer calibration (compensates hard & soft iron errors) 231 | #define CALIBRATION__MAGN_USE_EXTENDED true 232 | const float magn_ellipsoid_center[3] = {3.80526, -16.4455, 87.4052}; 233 | const float magn_ellipsoid_transform[3][3] = {{0.970991, 0.00583310, -0.00265756}, {0.00583310, 0.952958, 2.76726e-05}, {-0.00265756, 2.76726e-05, 0.999751}}; 234 | // Gyroscope 235 | // "gyro x,y,z (current/average) = .../OFFSET_X .../OFFSET_Y .../OFFSET_Z 236 | #define GYRO_AVERAGE_OFFSET_X ((float) 23.85) 237 | #define GYRO_AVERAGE_OFFSET_Y ((float) -53.41) 238 | #define GYRO_AVERAGE_OFFSET_Z ((float) -15.32) 239 | 240 | /* 241 | // Calibration example: 242 | 243 | // "accel x,y,z (min/max) = -278.00/270.00 -254.00/284.00 -294.00/235.00" 244 | #define ACCEL_X_MIN ((float) -278) 245 | #define ACCEL_X_MAX ((float) 270) 246 | #define ACCEL_Y_MIN ((float) -254) 247 | #define ACCEL_Y_MAX ((float) 284) 248 | #define ACCEL_Z_MIN ((float) -294) 249 | #define ACCEL_Z_MAX ((float) 235) 250 | 251 | // "magn x,y,z (min/max) = -511.00/581.00 -516.00/568.00 -489.00/486.00" 252 | //#define MAGN_X_MIN ((float) -511) 253 | //#define MAGN_X_MAX ((float) 581) 254 | //#define MAGN_Y_MIN ((float) -516) 255 | //#define MAGN_Y_MAX ((float) 568) 256 | //#define MAGN_Z_MIN ((float) -489) 257 | //#define MAGN_Z_MAX ((float) 486) 258 | 259 | // Extended magn 260 | #define CALIBRATION__MAGN_USE_EXTENDED true 261 | const float magn_ellipsoid_center[3] = {91.5, -13.5, -48.1}; 262 | const float magn_ellipsoid_transform[3][3] = {{0.902, -0.00354, 0.000636}, {-0.00354, 0.9, -0.00599}, {0.000636, -0.00599, 1}}; 263 | 264 | // Extended magn (with Sennheiser HD 485 headphones) 265 | //#define CALIBRATION__MAGN_USE_EXTENDED true 266 | //const float magn_ellipsoid_center[3] = {72.3360, 23.0954, 53.6261}; 267 | //const float magn_ellipsoid_transform[3][3] = {{0.879685, 0.000540833, -0.0106054}, {0.000540833, 0.891086, -0.0130338}, {-0.0106054, -0.0130338, 0.997494}}; 268 | 269 | //"gyro x,y,z (current/average) = -32.00/-34.82 102.00/100.41 -16.00/-16.38" 270 | #define GYRO_AVERAGE_OFFSET_X ((float) -34.82) 271 | #define GYRO_AVERAGE_OFFSET_Y ((float) 100.41) 272 | #define GYRO_AVERAGE_OFFSET_Z ((float) -16.38) 273 | */ 274 | 275 | 276 | // DEBUG OPTIONS 277 | /*****************************************************************/ 278 | // When set to true, gyro drift correction will not be applied 279 | #define DEBUG__NO_DRIFT_CORRECTION false 280 | // Print elapsed time after each I/O loop 281 | #define DEBUG__PRINT_LOOP_TIME false 282 | 283 | 284 | /*****************************************************************/ 285 | /****************** END OF USER SETUP AREA! *********************/ 286 | /*****************************************************************/ 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | // Check if hardware version code is defined 298 | #ifndef HW__VERSION_CODE 299 | // Generate compile error 300 | #error YOU HAVE TO SELECT THE HARDWARE YOU ARE USING! See "HARDWARE OPTIONS" in "USER SETUP AREA" at top of Razor_AHRS.pde (or .ino)! 301 | #endif 302 | 303 | #include 304 | 305 | // Sensor calibration scale and offset values 306 | #define ACCEL_X_OFFSET ((ACCEL_X_MIN + ACCEL_X_MAX) / 2.0f) 307 | #define ACCEL_Y_OFFSET ((ACCEL_Y_MIN + ACCEL_Y_MAX) / 2.0f) 308 | #define ACCEL_Z_OFFSET ((ACCEL_Z_MIN + ACCEL_Z_MAX) / 2.0f) 309 | #define ACCEL_X_SCALE (GRAVITY / (ACCEL_X_MAX - ACCEL_X_OFFSET)) 310 | #define ACCEL_Y_SCALE (GRAVITY / (ACCEL_Y_MAX - ACCEL_Y_OFFSET)) 311 | #define ACCEL_Z_SCALE (GRAVITY / (ACCEL_Z_MAX - ACCEL_Z_OFFSET)) 312 | 313 | #define MAGN_X_OFFSET ((MAGN_X_MIN + MAGN_X_MAX) / 2.0f) 314 | #define MAGN_Y_OFFSET ((MAGN_Y_MIN + MAGN_Y_MAX) / 2.0f) 315 | #define MAGN_Z_OFFSET ((MAGN_Z_MIN + MAGN_Z_MAX) / 2.0f) 316 | #define MAGN_X_SCALE (100.0f / (MAGN_X_MAX - MAGN_X_OFFSET)) 317 | #define MAGN_Y_SCALE (100.0f / (MAGN_Y_MAX - MAGN_Y_OFFSET)) 318 | #define MAGN_Z_SCALE (100.0f / (MAGN_Z_MAX - MAGN_Z_OFFSET)) 319 | 320 | 321 | // Gain for gyroscope (ITG-3200) 322 | #define GYRO_GAIN 0.06957 // Same gain on all axes 323 | #define GYRO_SCALED_RAD(x) (x * TO_RAD(GYRO_GAIN)) // Calculate the scaled gyro readings in radians per second 324 | 325 | // DCM parameters 326 | #define Kp_ROLLPITCH 0.02f 327 | #define Ki_ROLLPITCH 0.00002f 328 | #define Kp_YAW 1.2f 329 | #define Ki_YAW 0.00002f 330 | 331 | // Stuff 332 | #define STATUS_LED_PIN 13 // Pin number of status LED 333 | #define GRAVITY 256.0f // "1G reference" used for DCM filter and accelerometer calibration 334 | #define TO_RAD(x) (x * 0.01745329252) // *pi/180 335 | #define TO_DEG(x) (x * 57.2957795131) // *180/pi 336 | 337 | // Sensor variables 338 | float accel[3]; // Actually stores the NEGATED acceleration (equals gravity, if board not moving). 339 | float accel_min[3]; 340 | float accel_max[3]; 341 | 342 | float magnetom[3]; 343 | float magnetom_min[3]; 344 | float magnetom_max[3]; 345 | float magnetom_tmp[3]; 346 | 347 | float gyro[3]; 348 | float gyro_average[3]; 349 | int gyro_num_samples = 0; 350 | 351 | // DCM variables 352 | float MAG_Heading; 353 | float Accel_Vector[3]= {0, 0, 0}; // Store the acceleration in a vector 354 | float Gyro_Vector[3]= {0, 0, 0}; // Store the gyros turn rate in a vector 355 | float Omega_Vector[3]= {0, 0, 0}; // Corrected Gyro_Vector data 356 | float Omega_P[3]= {0, 0, 0}; // Omega Proportional correction 357 | float Omega_I[3]= {0, 0, 0}; // Omega Integrator 358 | float Omega[3]= {0, 0, 0}; 359 | float errorRollPitch[3] = {0, 0, 0}; 360 | float errorYaw[3] = {0, 0, 0}; 361 | float DCM_Matrix[3][3] = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}; 362 | float Update_Matrix[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}}; 363 | float Temporary_Matrix[3][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}; 364 | 365 | // Euler angles 366 | float yaw; 367 | float pitch; 368 | float roll; 369 | 370 | // DCM timing in the main loop 371 | unsigned long timestamp; 372 | unsigned long timestamp_old; 373 | float G_Dt; // Integration time for DCM algorithm 374 | 375 | // More output-state variables 376 | boolean output_stream_on; 377 | boolean output_single_on; 378 | int curr_calibration_sensor = 0; 379 | boolean reset_calibration_session_flag = true; 380 | int num_accel_errors = 0; 381 | int num_magn_errors = 0; 382 | int num_gyro_errors = 0; 383 | 384 | void read_sensors() { 385 | Read_Gyro(); // Read gyroscope 386 | Read_Accel(); // Read accelerometer 387 | Read_Magn(); // Read magnetometer 388 | } 389 | 390 | // Read every sensor and record a time stamp 391 | // Init DCM with unfiltered orientation 392 | // TODO re-init global vars? 393 | void reset_sensor_fusion() { 394 | float temp1[3]; 395 | float temp2[3]; 396 | float xAxis[] = {1.0f, 0.0f, 0.0f}; 397 | 398 | read_sensors(); 399 | timestamp = millis(); 400 | 401 | // GET PITCH 402 | // Using y-z-plane-component/x-component of gravity vector 403 | pitch = -atan2(accel[0], sqrt(accel[1] * accel[1] + accel[2] * accel[2])); 404 | 405 | // GET ROLL 406 | // Compensate pitch of gravity vector 407 | Vector_Cross_Product(temp1, accel, xAxis); 408 | Vector_Cross_Product(temp2, xAxis, temp1); 409 | // Normally using x-z-plane-component/y-component of compensated gravity vector 410 | // roll = atan2(temp2[1], sqrt(temp2[0] * temp2[0] + temp2[2] * temp2[2])); 411 | // Since we compensated for pitch, x-z-plane-component equals z-component: 412 | roll = atan2(temp2[1], temp2[2]); 413 | 414 | // GET YAW 415 | Compass_Heading(); 416 | yaw = MAG_Heading; 417 | 418 | // Init rotation matrix 419 | init_rotation_matrix(DCM_Matrix, yaw, pitch, roll); 420 | } 421 | 422 | // Apply calibration to raw sensor readings 423 | void compensate_sensor_errors() { 424 | // Compensate accelerometer error 425 | accel[0] = (accel[0] - ACCEL_X_OFFSET) * ACCEL_X_SCALE; 426 | accel[1] = (accel[1] - ACCEL_Y_OFFSET) * ACCEL_Y_SCALE; 427 | accel[2] = (accel[2] - ACCEL_Z_OFFSET) * ACCEL_Z_SCALE; 428 | 429 | // Compensate magnetometer error 430 | #if CALIBRATION__MAGN_USE_EXTENDED == true 431 | for (int i = 0; i < 3; i++) 432 | magnetom_tmp[i] = magnetom[i] - magn_ellipsoid_center[i]; 433 | Matrix_Vector_Multiply(magn_ellipsoid_transform, magnetom_tmp, magnetom); 434 | #else 435 | magnetom[0] = (magnetom[0] - MAGN_X_OFFSET) * MAGN_X_SCALE; 436 | magnetom[1] = (magnetom[1] - MAGN_Y_OFFSET) * MAGN_Y_SCALE; 437 | magnetom[2] = (magnetom[2] - MAGN_Z_OFFSET) * MAGN_Z_SCALE; 438 | #endif 439 | 440 | // Compensate gyroscope error 441 | gyro[0] -= GYRO_AVERAGE_OFFSET_X; 442 | gyro[1] -= GYRO_AVERAGE_OFFSET_Y; 443 | gyro[2] -= GYRO_AVERAGE_OFFSET_Z; 444 | } 445 | 446 | // Reset calibration session if reset_calibration_session_flag is set 447 | void check_reset_calibration_session() 448 | { 449 | // Raw sensor values have to be read already, but no error compensation applied 450 | 451 | // Reset this calibration session? 452 | if (!reset_calibration_session_flag) return; 453 | 454 | // Reset acc and mag calibration variables 455 | for (int i = 0; i < 3; i++) { 456 | accel_min[i] = accel_max[i] = accel[i]; 457 | magnetom_min[i] = magnetom_max[i] = magnetom[i]; 458 | } 459 | 460 | // Reset gyro calibration variables 461 | gyro_num_samples = 0; // Reset gyro calibration averaging 462 | gyro_average[0] = gyro_average[1] = gyro_average[2] = 0.0f; 463 | 464 | reset_calibration_session_flag = false; 465 | } 466 | 467 | void turn_output_stream_on() 468 | { 469 | output_stream_on = true; 470 | digitalWrite(STATUS_LED_PIN, HIGH); 471 | } 472 | 473 | void turn_output_stream_off() 474 | { 475 | output_stream_on = false; 476 | digitalWrite(STATUS_LED_PIN, LOW); 477 | } 478 | 479 | // Blocks until another byte is available on serial port 480 | char readChar() 481 | { 482 | while (Serial.available() < 1) { } // Block 483 | return Serial.read(); 484 | } 485 | 486 | void setup() 487 | { 488 | // Init serial output 489 | Serial.begin(OUTPUT__BAUD_RATE); 490 | 491 | // Init status LED 492 | pinMode (STATUS_LED_PIN, OUTPUT); 493 | digitalWrite(STATUS_LED_PIN, LOW); 494 | 495 | // Init sensors 496 | delay(50); // Give sensors enough time to start 497 | I2C_Init(); 498 | Accel_Init(); 499 | Magn_Init(); 500 | Gyro_Init(); 501 | 502 | // Read sensors, init DCM algorithm 503 | delay(20); // Give sensors enough time to collect data 504 | reset_sensor_fusion(); 505 | 506 | // Init output 507 | #if (OUTPUT__HAS_RN_BLUETOOTH == true) || (OUTPUT__STARTUP_STREAM_ON == false) 508 | turn_output_stream_off(); 509 | #else 510 | turn_output_stream_on(); 511 | #endif 512 | } 513 | 514 | // Main loop 515 | void loop() 516 | { 517 | // Read incoming control messages 518 | if (Serial.available() >= 2) 519 | { 520 | if (Serial.read() == '#') // Start of new control message 521 | { 522 | int command = Serial.read(); // Commands 523 | if (command == 'f') // request one output _f_rame 524 | output_single_on = true; 525 | else if (command == 's') // _s_ynch request 526 | { 527 | // Read ID 528 | byte id[2]; 529 | id[0] = readChar(); 530 | id[1] = readChar(); 531 | 532 | // Reply with synch message 533 | Serial.print("#SYNCH"); 534 | Serial.write(id, 2); 535 | Serial.println(); 536 | } 537 | else if (command == 'o') // Set _o_utput mode 538 | { 539 | char output_param = readChar(); 540 | if (output_param == 'n') // Calibrate _n_ext sensor 541 | { 542 | curr_calibration_sensor = (curr_calibration_sensor + 1) % 3; 543 | reset_calibration_session_flag = true; 544 | } 545 | else if (output_param == 't') // Output angles as _t_ext 546 | { 547 | output_mode = OUTPUT__MODE_ANGLES; 548 | output_format = OUTPUT__FORMAT_TEXT; 549 | } 550 | else if (output_param == 'b') // Output angles in _b_inary format 551 | { 552 | output_mode = OUTPUT__MODE_ANGLES; 553 | output_format = OUTPUT__FORMAT_BINARY; 554 | } 555 | else if (output_param == 'c') // Go to _c_alibration mode 556 | { 557 | output_mode = OUTPUT__MODE_CALIBRATE_SENSORS; 558 | reset_calibration_session_flag = true; 559 | } 560 | else if (output_param == 's') // Output _s_ensor values 561 | { 562 | char values_param = readChar(); 563 | char format_param = readChar(); 564 | if (values_param == 'r') // Output _r_aw sensor values 565 | output_mode = OUTPUT__MODE_SENSORS_RAW; 566 | else if (values_param == 'c') // Output _c_alibrated sensor values 567 | output_mode = OUTPUT__MODE_SENSORS_CALIB; 568 | else if (values_param == 'b') // Output _b_oth sensor values (raw and calibrated) 569 | output_mode = OUTPUT__MODE_SENSORS_BOTH; 570 | 571 | if (format_param == 't') // Output values as _t_text 572 | output_format = OUTPUT__FORMAT_TEXT; 573 | else if (format_param == 'b') // Output values in _b_inary format 574 | output_format = OUTPUT__FORMAT_BINARY; 575 | } 576 | else if (output_param == '0') // Disable continuous streaming output 577 | { 578 | turn_output_stream_off(); 579 | reset_calibration_session_flag = true; 580 | } 581 | else if (output_param == '1') // Enable continuous streaming output 582 | { 583 | reset_calibration_session_flag = true; 584 | turn_output_stream_on(); 585 | } 586 | else if (output_param == 'e') // _e_rror output settings 587 | { 588 | char error_param = readChar(); 589 | if (error_param == '0') output_errors = false; 590 | else if (error_param == '1') output_errors = true; 591 | else if (error_param == 'c') // get error count 592 | { 593 | Serial.print("#AMG-ERR:"); 594 | Serial.print(num_accel_errors); Serial.print(","); 595 | Serial.print(num_magn_errors); Serial.print(","); 596 | Serial.println(num_gyro_errors); 597 | } 598 | } 599 | } 600 | #if OUTPUT__HAS_RN_BLUETOOTH == true 601 | // Read messages from bluetooth module 602 | // For this to work, the connect/disconnect message prefix of the module has to be set to "#". 603 | else if (command == 'C') // Bluetooth "#CONNECT" message (does the same as "#o1") 604 | turn_output_stream_on(); 605 | else if (command == 'D') // Bluetooth "#DISCONNECT" message (does the same as "#o0") 606 | turn_output_stream_off(); 607 | #endif // OUTPUT__HAS_RN_BLUETOOTH == true 608 | } 609 | else 610 | { } // Skip character 611 | } 612 | 613 | // Time to read the sensors again? 614 | if((millis() - timestamp) >= OUTPUT__DATA_INTERVAL) 615 | { 616 | timestamp_old = timestamp; 617 | timestamp = millis(); 618 | if (timestamp > timestamp_old) 619 | G_Dt = (float) (timestamp - timestamp_old) / 1000.0f; // Real time of loop run. We use this on the DCM algorithm (gyro integration time) 620 | else G_Dt = 0; 621 | 622 | // Update sensor readings 623 | read_sensors(); 624 | 625 | if (output_mode == OUTPUT__MODE_CALIBRATE_SENSORS) // We're in calibration mode 626 | { 627 | check_reset_calibration_session(); // Check if this session needs a reset 628 | if (output_stream_on || output_single_on) output_calibration(curr_calibration_sensor); 629 | } 630 | else if (output_mode == OUTPUT__MODE_ANGLES) // Output angles 631 | { 632 | // Apply sensor calibration 633 | compensate_sensor_errors(); 634 | 635 | // Run DCM algorithm 636 | Compass_Heading(); // Calculate magnetic heading 637 | Matrix_update(); 638 | Normalize(); 639 | Drift_correction(); 640 | Euler_angles(); 641 | 642 | if (output_stream_on || output_single_on) output_angles(); 643 | } 644 | else // Output sensor values 645 | { 646 | if (output_stream_on || output_single_on) output_sensors(); 647 | } 648 | 649 | output_single_on = false; 650 | 651 | #if DEBUG__PRINT_LOOP_TIME == true 652 | Serial.print("loop time (ms) = "); 653 | Serial.println(millis() - timestamp); 654 | #endif 655 | } 656 | #if DEBUG__PRINT_LOOP_TIME == true 657 | else 658 | { 659 | Serial.println("waiting..."); 660 | } 661 | #endif 662 | } 663 | -------------------------------------------------------------------------------- /LVDS-HDMI Extension Board/hdmi_breakout_pcb_v02.gbl: -------------------------------------------------------------------------------- 1 | %FSTAX25Y25*% 2 | %MOIN*% 3 | %SFA1B1*% 4 | 5 | %IPPOS*% 6 | %ADD10C,0.012000*% 7 | %ADD11C,0.007000*% 8 | %ADD13C,0.066930*% 9 | %ADD14C,0.037400*% 10 | %ADD15O,0.059060X0.106300*% 11 | %ADD16O,0.059060X0.129920*% 12 | %ADD17R,0.059060X0.059060*% 13 | %ADD18C,0.059060*% 14 | %ADD19R,0.039370X0.039370*% 15 | %ADD20C,0.039370*% 16 | %ADD21R,0.059060X0.059060*% 17 | %LNhdmi_breakout_pcb_v02-1*% 18 | %LPD*% 19 | G36* 20 | X03235Y03845D02* 21 | X0201354D01* 22 | X0201002Y0384854* 23 | X0201375Y0466252* 24 | X0201875Y0466271* 25 | X0201889Y0466082* 26 | X0202339Y0464211* 27 | X0203075Y0462433* 28 | X020408Y0460793* 29 | X020533Y045933* 30 | X0206793Y045808* 31 | X0208433Y0457075* 32 | X0210211Y0456339* 33 | X0212082Y045589* 34 | X0214Y0455739* 35 | X0215918Y045589* 36 | X0217789Y0456339* 37 | X0219567Y0457075* 38 | X0221207Y045808* 39 | X022267Y045933* 40 | X022392Y0460793* 41 | X0224925Y0462433* 42 | X0225661Y0464211* 43 | X0226111Y0466082* 44 | X0226261Y0468* 45 | X0226111Y0469918* 46 | X0225661Y0471789* 47 | X0224925Y0473567* 48 | X022392Y0475207* 49 | X022267Y047667* 50 | X0221207Y047792* 51 | X0219567Y0478925* 52 | X0217789Y0479661* 53 | X0215918Y0480111* 54 | X0214Y0480261* 55 | X0212082Y0480111* 56 | X0210211Y0479661* 57 | X0208433Y0478925* 58 | X0206793Y047792* 59 | X020533Y047667* 60 | X020408Y0475207* 61 | X0203075Y0473567* 62 | X0202339Y0471789* 63 | X0201889Y0469918* 64 | X0201392Y0469957* 65 | X02015Y04935* 66 | X03235* 67 | Y03845* 68 | G37* 69 | %LNhdmi_breakout_pcb_v02-2*% 70 | %LPC*% 71 | G36* 72 | X0236063Y0402629D02* 73 | X0235366Y0402537D01* 74 | X0234717Y0402268* 75 | X023416Y040184* 76 | X0233732Y0401283* 77 | X0233463Y0400634* 78 | X0233371Y0399937* 79 | X0233463Y039924* 80 | X0233732Y0398591* 81 | X023416Y0398034* 82 | X0234717Y0397606* 83 | X0235366Y0397337* 84 | X0236063Y0397246* 85 | X023676Y0397337* 86 | X0237409Y0397606* 87 | X0237966Y0398034* 88 | X0238394Y0398591* 89 | X0238663Y039924* 90 | X0238755Y0399937* 91 | X0238663Y0400634* 92 | X0238394Y0401283* 93 | X0237966Y040184* 94 | X0237409Y0402268* 95 | X023676Y0402537* 96 | X0236063Y0402629* 97 | G37* 98 | G36* 99 | X0291653Y0397653D02* 100 | X0284347D01* 101 | Y0390347* 102 | X0291653* 103 | Y0397653* 104 | G37* 105 | G36* 106 | X0212441Y0402629D02* 107 | X0211744Y0402537D01* 108 | X0211095Y0402268* 109 | X0210538Y040184* 110 | X021011Y0401283* 111 | X0209841Y0400634* 112 | X020975Y0399937* 113 | X0209841Y039924* 114 | X021011Y0398591* 115 | X0210538Y0398034* 116 | X0211095Y0397606* 117 | X0211744Y0397337* 118 | X0212441Y0397246* 119 | X0213138Y0397337* 120 | X0213787Y0397606* 121 | X0214344Y0398034* 122 | X0214772Y0398591* 123 | X0215041Y039924* 124 | X0215132Y0399937* 125 | X0215041Y0400634* 126 | X0214772Y0401283* 127 | X0214344Y040184* 128 | X0213787Y0402268* 129 | X0213138Y0402537* 130 | X0212441Y0402629* 131 | G37* 132 | G36* 133 | X0259685D02* 134 | X0258988Y0402537D01* 135 | X0258339Y0402268* 136 | X0257782Y040184* 137 | X0257354Y0401283* 138 | X0257085Y0400634* 139 | X0256994Y0399937* 140 | X0257085Y039924* 141 | X0257354Y0398591* 142 | X0257782Y0398034* 143 | X0258339Y0397606* 144 | X0258988Y0397337* 145 | X0259685Y0397246* 146 | X0260382Y0397337* 147 | X0261031Y0397606* 148 | X0261588Y0398034* 149 | X0262016Y0398591* 150 | X0262285Y039924* 151 | X0262376Y0399937* 152 | X0262285Y0400634* 153 | X0262016Y0401283* 154 | X0261588Y040184* 155 | X0261031Y0402268* 156 | X0260382Y0402537* 157 | X0259685Y0402629* 158 | G37* 159 | G36* 160 | X0267559D02* 161 | X0266862Y0402537D01* 162 | X0266213Y0402268* 163 | X0265656Y040184* 164 | X0265228Y0401283* 165 | X0264959Y0400634* 166 | X0264867Y0399937* 167 | X0264959Y039924* 168 | X0265228Y0398591* 169 | X0265656Y0398034* 170 | X0266213Y0397606* 171 | X0266862Y0397337* 172 | X0267559Y0397246* 173 | X0268256Y0397337* 174 | X0268905Y0397606* 175 | X0269462Y0398034* 176 | X026989Y0398591* 177 | X0270159Y039924* 178 | X0270251Y0399937* 179 | X0270159Y0400634* 180 | X026989Y0401283* 181 | X0269462Y040184* 182 | X0268905Y0402268* 183 | X0268256Y0402537* 184 | X0267559Y0402629* 185 | G37* 186 | G36* 187 | X0243937D02* 188 | X024324Y0402537D01* 189 | X0242591Y0402268* 190 | X0242034Y040184* 191 | X0241606Y0401283* 192 | X0241337Y0400634* 193 | X0241246Y0399937* 194 | X0241337Y039924* 195 | X0241606Y0398591* 196 | X0242034Y0398034* 197 | X0242591Y0397606* 198 | X024324Y0397337* 199 | X0243937Y0397246* 200 | X0244634Y0397337* 201 | X0245283Y0397606* 202 | X024584Y0398034* 203 | X0246268Y0398591* 204 | X0246537Y039924* 205 | X0246628Y0399937* 206 | X0246537Y0400634* 207 | X0246268Y0401283* 208 | X024584Y040184* 209 | X0245283Y0402268* 210 | X0244634Y0402537* 211 | X0243937Y0402629* 212 | G37* 213 | G36* 214 | X0251811D02* 215 | X0251114Y0402537D01* 216 | X0250465Y0402268* 217 | X0249908Y040184* 218 | X024948Y0401283* 219 | X0249211Y0400634* 220 | X0249119Y0399937* 221 | X0249211Y039924* 222 | X024948Y0398591* 223 | X0249908Y0398034* 224 | X0250465Y0397606* 225 | X0251114Y0397337* 226 | X0251811Y0397246* 227 | X0252508Y0397337* 228 | X0253157Y0397606* 229 | X0253714Y0398034* 230 | X0254142Y0398591* 231 | X0254411Y039924* 232 | X0254503Y0399937* 233 | X0254411Y0400634* 234 | X0254142Y0401283* 235 | X0253714Y040184* 236 | X0253157Y0402268* 237 | X0252508Y0402537* 238 | X0251811Y0402629* 239 | G37* 240 | G36* 241 | X0298Y0397684D02* 242 | X0297046Y0397559D01* 243 | X0296158Y0397191* 244 | X0295395Y0396605* 245 | X0294809Y0395842* 246 | X0294441Y0394954* 247 | X0294316Y0394* 248 | X0294441Y0393046* 249 | X0294809Y0392158* 250 | X0295395Y0391395* 251 | X0296158Y0390809* 252 | X0297046Y0390441* 253 | X0298Y0390316* 254 | X0298954Y0390441* 255 | X0299842Y0390809* 256 | X0300605Y0391395* 257 | X0301191Y0392158* 258 | X0301559Y0393046* 259 | X0301684Y0394* 260 | X0301559Y0394954* 261 | X0301191Y0395842* 262 | X0300605Y0396605* 263 | X0299842Y0397191* 264 | X0298954Y0397559* 265 | X0298Y0397684* 266 | G37* 267 | G36* 268 | X0243937Y0394755D02* 269 | X024324Y0394663D01* 270 | X0242591Y0394394* 271 | X0242034Y0393966* 272 | X0241606Y0393409* 273 | X0241337Y039276* 274 | X0241246Y0392063* 275 | X0241337Y0391366* 276 | X0241606Y0390717* 277 | X0242034Y039016* 278 | X0242591Y0389732* 279 | X024324Y0389463* 280 | X0243937Y0389371* 281 | X0244634Y0389463* 282 | X0245283Y0389732* 283 | X024584Y039016* 284 | X0246268Y0390717* 285 | X0246537Y0391366* 286 | X0246628Y0392063* 287 | X0246537Y039276* 288 | X0246268Y0393409* 289 | X024584Y0393966* 290 | X0245283Y0394394* 291 | X0244634Y0394663* 292 | X0243937Y0394755* 293 | G37* 294 | G36* 295 | X0236063D02* 296 | X0235366Y0394663D01* 297 | X0234717Y0394394* 298 | X023416Y0393966* 299 | X0233732Y0393409* 300 | X0233463Y039276* 301 | X0233371Y0392063* 302 | X0233463Y0391366* 303 | X0233732Y0390717* 304 | X023416Y039016* 305 | X0234717Y0389732* 306 | X0235366Y0389463* 307 | X0236063Y0389371* 308 | X023676Y0389463* 309 | X0237409Y0389732* 310 | X0237966Y039016* 311 | X0238394Y0390717* 312 | X0238663Y0391366* 313 | X0238755Y0392063* 314 | X0238663Y039276* 315 | X0238394Y0393409* 316 | X0237966Y0393966* 317 | X0237409Y0394394* 318 | X023676Y0394663* 319 | X0236063Y0394755* 320 | G37* 321 | G36* 322 | X0220315D02* 323 | X0219618Y0394663D01* 324 | X0218969Y0394394* 325 | X0218412Y0393966* 326 | X0217984Y0393409* 327 | X0217715Y039276* 328 | X0217623Y0392063* 329 | X0217715Y0391366* 330 | X0217984Y0390717* 331 | X0218412Y039016* 332 | X0218969Y0389732* 333 | X0219618Y0389463* 334 | X0220315Y0389371* 335 | X0221012Y0389463* 336 | X0221661Y0389732* 337 | X0222218Y039016* 338 | X0222646Y0390717* 339 | X0222915Y0391366* 340 | X0223007Y0392063* 341 | X0222915Y039276* 342 | X0222646Y0393409* 343 | X0222218Y0393966* 344 | X0221661Y0394394* 345 | X0221012Y0394663* 346 | X0220315Y0394755* 347 | G37* 348 | G36* 349 | X0251811D02* 350 | X0251114Y0394663D01* 351 | X0250465Y0394394* 352 | X0249908Y0393966* 353 | X024948Y0393409* 354 | X0249211Y039276* 355 | X0249119Y0392063* 356 | X0249211Y0391366* 357 | X024948Y0390717* 358 | X0249908Y039016* 359 | X0250465Y0389732* 360 | X0251114Y0389463* 361 | X0251811Y0389371* 362 | X0252508Y0389463* 363 | X0253157Y0389732* 364 | X0253714Y039016* 365 | X0254142Y0390717* 366 | X0254411Y0391366* 367 | X0254503Y0392063* 368 | X0254411Y039276* 369 | X0254142Y0393409* 370 | X0253714Y0393966* 371 | X0253157Y0394394* 372 | X0252508Y0394663* 373 | X0251811Y0394755* 374 | G37* 375 | G36* 376 | X0215109Y0394731D02* 377 | X0209772D01* 378 | Y0389394* 379 | X0215109* 380 | Y0394731* 381 | G37* 382 | G36* 383 | X0267559Y0394755D02* 384 | X0266862Y0394663D01* 385 | X0266213Y0394394* 386 | X0265656Y0393966* 387 | X0265228Y0393409* 388 | X0264959Y039276* 389 | X0264867Y0392063* 390 | X0264959Y0391366* 391 | X0265228Y0390717* 392 | X0265656Y039016* 393 | X0266213Y0389732* 394 | X0266862Y0389463* 395 | X0267559Y0389371* 396 | X0268256Y0389463* 397 | X0268905Y0389732* 398 | X0269462Y039016* 399 | X026989Y0390717* 400 | X0270159Y0391366* 401 | X0270251Y0392063* 402 | X0270159Y039276* 403 | X026989Y0393409* 404 | X0269462Y0393966* 405 | X0268905Y0394394* 406 | X0268256Y0394663* 407 | X0267559Y0394755* 408 | G37* 409 | G36* 410 | X0259685D02* 411 | X0258988Y0394663D01* 412 | X0258339Y0394394* 413 | X0257782Y0393966* 414 | X0257354Y0393409* 415 | X0257085Y039276* 416 | X0256994Y0392063* 417 | X0257085Y0391366* 418 | X0257354Y0390717* 419 | X0257782Y039016* 420 | X0258339Y0389732* 421 | X0258988Y0389463* 422 | X0259685Y0389371* 423 | X0260382Y0389463* 424 | X0261031Y0389732* 425 | X0261588Y039016* 426 | X0262016Y0390717* 427 | X0262285Y0391366* 428 | X0262376Y0392063* 429 | X0262285Y039276* 430 | X0262016Y0393409* 431 | X0261588Y0393966* 432 | X0261031Y0394394* 433 | X0260382Y0394663* 434 | X0259685Y0394755* 435 | G37* 436 | G36* 437 | X02785Y0459071D02* 438 | X0273654D01* 439 | X0273244Y0458989* 440 | X0272897Y0458757* 441 | X0270771Y0456631* 442 | X0270545Y0456724* 443 | X0269874Y0456813* 444 | X0269203Y0456724* 445 | X0268578Y0456465* 446 | X0268041Y0456053* 447 | X0267629Y0455516* 448 | X026737Y0454891* 449 | X0267282Y045422* 450 | X026737Y0453549* 451 | X0267629Y0452924* 452 | X0268041Y0452387* 453 | X0268578Y0451975* 454 | X0269203Y0451717* 455 | X0269874Y0451628* 456 | X0270545Y0451717* 457 | X027117Y0451975* 458 | X0271707Y0452387* 459 | X0272119Y0452924* 460 | X0272378Y0453549* 461 | X0272466Y045422* 462 | X0272378Y0454891* 463 | X0272285Y0455117* 464 | X0273444Y0456277* 465 | X0274354Y0456653* 466 | X0274409Y045664* 467 | X0274471Y0456456* 468 | X0273947Y0456053* 469 | X0273535Y0455516* 470 | X0273276Y0454891* 471 | X0273187Y045422* 472 | X0273276Y0453549* 473 | X0273535Y0452924* 474 | X0273947Y0452387* 475 | X0274483Y0451975* 476 | X0275109Y0451717* 477 | X027578Y0451628* 478 | X027645Y0451717* 479 | X0277076Y0451975* 480 | X0277613Y0452387* 481 | X0278025Y0452924* 482 | X0278284Y0453549* 483 | X0278372Y045422* 484 | X0278284Y0454891* 485 | X0278025Y0455516* 486 | X0277613Y0456053* 487 | X0277076Y0456465* 488 | X027645Y0456724* 489 | X027578Y0456813* 490 | X0275896Y0456929* 491 | X0278057* 492 | X0283429Y0451556* 493 | Y04455* 494 | X0283511Y044509* 495 | X0283743Y0444743* 496 | X0293243Y0435243* 497 | X029359Y0435011* 498 | X0294Y0434929* 499 | X031249* 500 | X0312809Y0434158* 501 | X0313395Y0433395* 502 | X0314158Y0432809* 503 | X0315046Y0432441* 504 | X0316Y0432316* 505 | X0316954Y0432441* 506 | X0317842Y0432809* 507 | X0318605Y0433395* 508 | X0319191Y0434158* 509 | X0319559Y0435046* 510 | X0319684Y0436* 511 | X0319559Y0436954* 512 | X0319191Y0437842* 513 | X0318605Y0438605* 514 | X0317842Y0439191* 515 | X0316954Y0439559* 516 | X0316Y0439684* 517 | X0315046Y0439559* 518 | X0314158Y0439191* 519 | X0313395Y0438605* 520 | X0312809Y0437842* 521 | X031249Y0437071* 522 | X0294443* 523 | X0285571Y0445943* 524 | Y0452* 525 | X0285489Y045241* 526 | X0285257Y0452757* 527 | X0279257Y0458757* 528 | X027891Y0458989* 529 | X02785Y0459071* 530 | G37* 531 | G36* 532 | X0263969Y0456813D02* 533 | X0263298Y0456724D01* 534 | X0262672Y0456465* 535 | X0262136Y0456053* 536 | X0261724Y0455516* 537 | X026163Y0455291* 538 | X0260401* 539 | X0260308Y0455516* 540 | X0259896Y0456053* 541 | X0259359Y0456465* 542 | X0258734Y0456724* 543 | X0258063Y0456813* 544 | X0257392Y0456724* 545 | X0256767Y0456465* 546 | X025623Y0456053* 547 | X0255818Y0455516* 548 | X0255725Y0455291* 549 | X0254496* 550 | X0254402Y0455516* 551 | X025399Y0456053* 552 | X0253453Y0456465* 553 | X0252828Y0456724* 554 | X0252157Y0456813* 555 | X0251486Y0456724* 556 | X0250861Y0456465* 557 | X0250324Y0456053* 558 | X0249912Y0455516* 559 | X0249819Y0455291* 560 | X024859* 561 | X0248497Y0455516* 562 | X0248085Y0456053* 563 | X0247548Y0456465* 564 | X0246923Y0456724* 565 | X0246252Y0456813* 566 | X0245581Y0456724* 567 | X0244956Y0456465* 568 | X0244419Y0456053* 569 | X024403Y0455546* 570 | X024222* 571 | X0241713Y0455445* 572 | X0241283Y0455158* 573 | X0239563Y0453437* 574 | X0239275Y0453007* 575 | X0239175Y04525* 576 | Y0445049* 577 | X0227252Y0433126* 578 | X0226964Y0432696* 579 | X0226864Y0432189* 580 | Y0402276* 581 | X0226843Y0402268* 582 | X0226286Y040184* 583 | X0225858Y0401283* 584 | X022585Y0401263* 585 | X0222654* 586 | X0222646Y0401283* 587 | X0222218Y040184* 588 | X0221661Y0402268* 589 | X0221012Y0402537* 590 | X0220315Y0402629* 591 | X0219618Y0402537* 592 | X0218969Y0402268* 593 | X0218412Y040184* 594 | X0217984Y0401283* 595 | X0217715Y0400634* 596 | X0217623Y0399937* 597 | X0217715Y039924* 598 | X0217984Y0398591* 599 | X0218412Y0398034* 600 | X0218969Y0397606* 601 | X0219618Y0397337* 602 | X0220315Y0397246* 603 | X0221012Y0397337* 604 | X0221661Y0397606* 605 | X0222218Y0398034* 606 | X0222646Y0398591* 607 | X0222654Y0398611* 608 | X022585* 609 | X0225858Y0398591* 610 | X0226286Y0398034* 611 | X0226843Y0397606* 612 | X0226864Y0397598* 613 | Y0394402* 614 | X0226843Y0394394* 615 | X0226286Y0393966* 616 | X0225858Y0393409* 617 | X0225589Y039276* 618 | X0225498Y0392063* 619 | X0225589Y0391366* 620 | X0225858Y0390717* 621 | X0226286Y039016* 622 | X0226843Y0389732* 623 | X0227492Y0389463* 624 | X0228189Y0389371* 625 | X0228886Y0389463* 626 | X0229535Y0389732* 627 | X0230092Y039016* 628 | X023052Y0390717* 629 | X0230789Y0391366* 630 | X023088Y0392063* 631 | X0230789Y039276* 632 | X023052Y0393409* 633 | X0230092Y0393966* 634 | X0229535Y0394394* 635 | X0229515Y0394402* 636 | Y0397598* 637 | X0229535Y0397606* 638 | X0230092Y0398034* 639 | X023052Y0398591* 640 | X0230789Y039924* 641 | X023088Y0399937* 642 | X0230789Y0400634* 643 | X023052Y0401283* 644 | X0230092Y040184* 645 | X0229535Y0402268* 646 | X0229515Y0402276* 647 | Y043164* 648 | X0241437Y0443563* 649 | X0241725Y0443993* 650 | X0241826Y04445* 651 | Y0446519* 652 | X0242299Y0446679* 653 | X024245Y0446482* 654 | X0242987Y044607* 655 | X0243613Y0445811* 656 | X0244283Y0445723* 657 | X0244954Y0445811* 658 | X024558Y044607* 659 | X0246116Y0446482* 660 | X0246528Y0447019* 661 | X0246787Y0447644* 662 | X0246876Y0448315* 663 | X0246787Y0448986* 664 | X0246528Y0449611* 665 | X0246116Y0450148* 666 | X024558Y045056* 667 | X0244954Y0450819* 668 | X0244283Y0450907* 669 | X0243613Y0450819* 670 | X0242987Y045056* 671 | X024245Y0450148* 672 | X0242299Y0449951* 673 | X0241826Y0450111* 674 | Y0451951* 675 | X0242769Y0452895* 676 | X024403* 677 | X0244419Y0452387* 678 | X0244956Y0451975* 679 | X0245581Y0451717* 680 | X0246252Y0451628* 681 | X0246923Y0451717* 682 | X0247548Y0451975* 683 | X0248085Y0452387* 684 | X0248497Y0452924* 685 | X024859Y045315* 686 | X0249819* 687 | X0249912Y0452924* 688 | X0250324Y0452387* 689 | X0250861Y0451975* 690 | X0251486Y0451717* 691 | X0252157Y0451628* 692 | X0252828Y0451717* 693 | X0253453Y0451975* 694 | X025399Y0452387* 695 | X0254402Y0452924* 696 | X0254496Y045315* 697 | X0255725* 698 | X0255818Y0452924* 699 | X025623Y0452387* 700 | X0256767Y0451975* 701 | X0257392Y0451717* 702 | X0258063Y0451628* 703 | X0258734Y0451717* 704 | X0259359Y0451975* 705 | X0259896Y0452387* 706 | X0260308Y0452924* 707 | X0260401Y045315* 708 | X026163* 709 | X0261724Y0452924* 710 | X0262136Y0452387* 711 | X0262672Y0451975* 712 | X0263298Y0451717* 713 | X0263969Y0451628* 714 | X0264639Y0451717* 715 | X0265265Y0451975* 716 | X0265802Y0452387* 717 | X0266214Y0452924* 718 | X0266473Y0453549* 719 | X0266561Y045422* 720 | X0266473Y0454891* 721 | X0266214Y0455516* 722 | X0265802Y0456053* 723 | X0265265Y0456465* 724 | X0264639Y0456724* 725 | X0263969Y0456813* 726 | G37* 727 | G36* 728 | X0279717Y0450907D02* 729 | X0279046Y0450819D01* 730 | X027842Y045056* 731 | X0277884Y0450148* 732 | X0277472Y0449611* 733 | X0277213Y0448986* 734 | X0277124Y0448315* 735 | X0277213Y0447644* 736 | X0277472Y0447019* 737 | X0277602Y0446848* 738 | X0277381Y04464* 739 | X0276146* 740 | X0275925Y0446848* 741 | X0276056Y0447019* 742 | X0276315Y0447644* 743 | X0276403Y0448315* 744 | X0276315Y0448986* 745 | X0276056Y0449611* 746 | X0275644Y0450148* 747 | X0275107Y045056* 748 | X0274482Y0450819* 749 | X0273811Y0450907* 750 | X027314Y0450819* 751 | X0272515Y045056* 752 | X0271978Y0450148* 753 | X0271566Y0449611* 754 | X0271307Y0448986* 755 | X0271219Y0448315* 756 | X0271307Y0447644* 757 | X0271566Y0447019* 758 | X0271978Y0446482* 759 | X0272515Y044607* 760 | X027314Y0445811* 761 | X027318Y0445806* 762 | X0274413Y0444572* 763 | X0274761Y044434* 764 | X027517Y0444259* 765 | X0275362* 766 | X0275584Y0443811* 767 | X0275503Y0443706* 768 | X0275244Y044308* 769 | X0275156Y0442409* 770 | X0275244Y0441739* 771 | X0275503Y0441113* 772 | X0275915Y0440576* 773 | X0276452Y0440164* 774 | X0277077Y0439906* 775 | X0277748Y0439817* 776 | X0278419Y0439906* 777 | X0279044Y0440164* 778 | X0279581Y0440576* 779 | X0279993Y0441113* 780 | X0280252Y0441739* 781 | X0280294Y0442058* 782 | X0280767Y0442218* 783 | X0297743Y0425243* 784 | X029809Y0425011* 785 | X02985Y0424929* 786 | X031249* 787 | X0312809Y0424158* 788 | X0313395Y0423395* 789 | X0314158Y0422809* 790 | X0315046Y0422441* 791 | X0316Y0422316* 792 | X0316954Y0422441* 793 | X0317842Y0422809* 794 | X0318605Y0423395* 795 | X0319191Y0424158* 796 | X0319559Y0425046* 797 | X0319684Y0426* 798 | X0319559Y0426954* 799 | X0319191Y0427842* 800 | X0318605Y0428605* 801 | X0317842Y0429191* 802 | X0316954Y0429559* 803 | X0316Y0429684* 804 | X0315046Y0429559* 805 | X0314158Y0429191* 806 | X0313395Y0428605* 807 | X0312809Y0427842* 808 | X031249Y0427071* 809 | X0298943* 810 | X0280341Y0445673* 811 | X0280387Y0445811* 812 | X0281013Y044607* 813 | X028155Y0446482* 814 | X0281962Y0447019* 815 | X0282221Y0447644* 816 | X0282309Y0448315* 817 | X0282221Y0448986* 818 | X0281962Y0449611* 819 | X028155Y0450148* 820 | X0281013Y045056* 821 | X0280387Y0450819* 822 | X0279717Y0450907* 823 | G37* 824 | G36* 825 | X0262D02* 826 | X0261329Y0450819D01* 827 | X0260704Y045056* 828 | X0260167Y0450148* 829 | X0259755Y0449611* 830 | X0259496Y0448986* 831 | X0259408Y0448315* 832 | X0259496Y0447644* 833 | X0259755Y0447019* 834 | X0260167Y0446482* 835 | X0260704Y044607* 836 | X0261329Y0445811* 837 | X0262Y0445723* 838 | X0262671Y0445811* 839 | X0263296Y044607* 840 | X0263833Y0446482* 841 | X0264245Y0447019* 842 | X0264504Y0447644* 843 | X0264592Y0448315* 844 | X0264504Y0448986* 845 | X0264245Y0449611* 846 | X0263833Y0450148* 847 | X0263296Y045056* 848 | X0262671Y0450819* 849 | X0262Y0450907* 850 | G37* 851 | G36* 852 | X031Y0480261D02* 853 | X0308082Y0480111D01* 854 | X0306211Y0479661* 855 | X0304433Y0478925* 856 | X0302793Y047792* 857 | X030133Y047667* 858 | X030008Y0475207* 859 | X0299075Y0473567* 860 | X0298339Y0471789* 861 | X0297889Y0469918* 862 | X0297739Y0468* 863 | X0297889Y0466082* 864 | X0298339Y0464211* 865 | X0299075Y0462433* 866 | X030008Y0460793* 867 | X030133Y045933* 868 | X0302793Y045808* 869 | X0304433Y0457075* 870 | X0306211Y0456339* 871 | X0308082Y045589* 872 | X031Y0455739* 873 | X0311918Y045589* 874 | X0313789Y0456339* 875 | X0315567Y0457075* 876 | X0317207Y045808* 877 | X031867Y045933* 878 | X031992Y0460793* 879 | X0320925Y0462433* 880 | X0321661Y0464211* 881 | X0322111Y0466082* 882 | X0322261Y0468* 883 | X0322111Y0469918* 884 | X0321661Y0471789* 885 | X0320925Y0473567* 886 | X031992Y0475207* 887 | X031867Y047667* 888 | X0317207Y047792* 889 | X0315567Y0478925* 890 | X0313789Y0479661* 891 | X0311918Y0480111* 892 | X031Y0480261* 893 | G37* 894 | G36* 895 | X0290346Y0481133D02* 896 | X0289393Y0481007D01* 897 | X0288504Y048064* 898 | X0287741Y0480054* 899 | X0287156Y0479291* 900 | X0286788Y0478402* 901 | X0286662Y0477449* 902 | Y0472724* 903 | X0286788Y0471771* 904 | X0287156Y0470882* 905 | X0287741Y0470119* 906 | X0288504Y0469534* 907 | X0289393Y0469166* 908 | X0290346Y046904* 909 | X02913Y0469166* 910 | X0292189Y0469534* 911 | X0292952Y0470119* 912 | X0293537Y0470882* 913 | X0293905Y0471771* 914 | X0294031Y0472724* 915 | Y0477449* 916 | X0293905Y0478402* 917 | X0293537Y0479291* 918 | X0292952Y0480054* 919 | X0292189Y048064* 920 | X02913Y0481007* 921 | X0290346Y0481133* 922 | G37* 923 | G36* 924 | X0234441D02* 925 | X0233487Y0481007D01* 926 | X0232599Y048064* 927 | X0231836Y0480054* 928 | X023125Y0479291* 929 | X0230882Y0478402* 930 | X0230757Y0477449* 931 | Y0472724* 932 | X0230882Y0471771* 933 | X023125Y0470882* 934 | X0231836Y0470119* 935 | X0232599Y0469534* 936 | X0233487Y0469166* 937 | X0234441Y046904* 938 | X0235395Y0469166* 939 | X0236283Y0469534* 940 | X0237046Y0470119* 941 | X0237632Y0470882* 942 | X0238Y0471771* 943 | X0238125Y0472724* 944 | Y0477449* 945 | X0238Y0478402* 946 | X0237632Y0479291* 947 | X0237046Y0480054* 948 | X0236283Y048064* 949 | X0235395Y0481007* 950 | X0234441Y0481133* 951 | G37* 952 | G36* 953 | X0262Y0472081D02* 954 | X0260944Y0471942D01* 955 | X0259959Y0471535* 956 | X0259114Y0470886* 957 | X0258465Y0470041* 958 | X0258058Y0469056* 959 | X0257919Y0468* 960 | X0258058Y0466944* 961 | X0258465Y0465959* 962 | X0259114Y0465114* 963 | X0259959Y0464465* 964 | X0260944Y0464058* 965 | X0262Y0463919* 966 | X0263056Y0464058* 967 | X0264041Y0464465* 968 | X0264886Y0465114* 969 | X0265535Y0465959* 970 | X0265942Y0466944* 971 | X0266081Y0468* 972 | X0265942Y0469056* 973 | X0265535Y0470041* 974 | X0264886Y0470886* 975 | X0264041Y0471535* 976 | X0263056Y0471942* 977 | X0262Y0472081* 978 | G37* 979 | G36* 980 | X0256094Y0450907D02* 981 | X0255423Y0450819D01* 982 | X0254798Y045056* 983 | X0254261Y0450148* 984 | X0253849Y0449611* 985 | X025359Y0448986* 986 | X0253502Y0448315* 987 | X025359Y0447644* 988 | X0253849Y0447019* 989 | X0254261Y0446482* 990 | X0254798Y044607* 991 | X0255423Y0445811* 992 | X0256094Y0445723* 993 | X0256765Y0445811* 994 | X025739Y044607* 995 | X0257927Y0446482* 996 | X0258339Y0447019* 997 | X0258598Y0447644* 998 | X0258687Y0448315* 999 | X0258598Y0448986* 1000 | X0258339Y0449611* 1001 | X0257927Y0450148* 1002 | X025739Y045056* 1003 | X0256765Y0450819* 1004 | X0256094Y0450907* 1005 | G37* 1006 | G36* 1007 | X0260032Y0445002D02* 1008 | X0259361Y0444913D01* 1009 | X0258735Y0444654* 1010 | X0258199Y0444242* 1011 | X0257787Y0443706* 1012 | X0257528Y044308* 1013 | X0257439Y0442409* 1014 | X0257528Y0441739* 1015 | X0257787Y0441113* 1016 | X0258199Y0440576* 1017 | X0258735Y0440164* 1018 | X0259361Y0439906* 1019 | X0260032Y0439817* 1020 | X0260702Y0439906* 1021 | X0261328Y0440164* 1022 | X0261865Y0440576* 1023 | X0262277Y0441113* 1024 | X0262536Y0441739* 1025 | X0262624Y0442409* 1026 | X0262536Y044308* 1027 | X0262277Y0443706* 1028 | X0261865Y0444242* 1029 | X0261328Y0444654* 1030 | X0260702Y0444913* 1031 | X0260032Y0445002* 1032 | G37* 1033 | G36* 1034 | X0254126D02* 1035 | X0253455Y0444913D01* 1036 | X025283Y0444654* 1037 | X0252293Y0444242* 1038 | X0251881Y0443706* 1039 | X0251622Y044308* 1040 | X0251534Y0442409* 1041 | X0251622Y0441739* 1042 | X0251881Y0441113* 1043 | X0252293Y0440576* 1044 | X025283Y0440164* 1045 | X0253455Y0439906* 1046 | X0254126Y0439817* 1047 | X0254797Y0439906* 1048 | X0255422Y0440164* 1049 | X0255959Y0440576* 1050 | X0256371Y0441113* 1051 | X025663Y0441739* 1052 | X0256718Y0442409* 1053 | X025663Y044308* 1054 | X0256371Y0443706* 1055 | X0255959Y0444242* 1056 | X0255422Y0444654* 1057 | X0254797Y0444913* 1058 | X0254126Y0445002* 1059 | G37* 1060 | G36* 1061 | X024822D02* 1062 | X024755Y0444913D01* 1063 | X0246924Y0444654* 1064 | X0246387Y0444242* 1065 | X0245975Y0443706* 1066 | X0245717Y044308* 1067 | X0245628Y0442409* 1068 | X0245717Y0441739* 1069 | X0245975Y0441113* 1070 | X0246387Y0440576* 1071 | X0246924Y0440164* 1072 | X024755Y0439906* 1073 | X024822Y0439817* 1074 | X0248891Y0439906* 1075 | X0249517Y0440164* 1076 | X0250053Y0440576* 1077 | X0250465Y0441113* 1078 | X0250724Y0441739* 1079 | X0250813Y0442409* 1080 | X0250724Y044308* 1081 | X0250465Y0443706* 1082 | X0250053Y0444242* 1083 | X0249517Y0444654* 1084 | X0248891Y0444913* 1085 | X024822Y0445002* 1086 | G37* 1087 | G36* 1088 | X0234441Y0458692D02* 1089 | X0233487Y0458567D01* 1090 | X0232599Y0458199* 1091 | X0231836Y0457613* 1092 | X023125Y045685* 1093 | X0230882Y0455962* 1094 | X0230757Y0455008* 1095 | Y0447921* 1096 | X0230882Y0446968* 1097 | X023125Y0446079* 1098 | X0231836Y0445316* 1099 | X0232599Y0444731* 1100 | X0233487Y0444363* 1101 | X0234441Y0444237* 1102 | X0235395Y0444363* 1103 | X0236283Y0444731* 1104 | X0237046Y0445316* 1105 | X0237632Y0446079* 1106 | X0238Y0446968* 1107 | X0238125Y0447921* 1108 | Y0455008* 1109 | X0238Y0455962* 1110 | X0237632Y045685* 1111 | X0237046Y0457613* 1112 | X0236283Y0458199* 1113 | X0235395Y0458567* 1114 | X0234441Y0458692* 1115 | G37* 1116 | G36* 1117 | X0250189Y0450907D02* 1118 | X0249518Y0450819D01* 1119 | X0248893Y045056* 1120 | X0248356Y0450148* 1121 | X0247944Y0449611* 1122 | X0247685Y0448986* 1123 | X0247597Y0448315* 1124 | X0247685Y0447644* 1125 | X0247944Y0447019* 1126 | X0248356Y0446482* 1127 | X0248893Y044607* 1128 | X0249518Y0445811* 1129 | X0250189Y0445723* 1130 | X025086Y0445811* 1131 | X0251485Y044607* 1132 | X0252022Y0446482* 1133 | X0252434Y0447019* 1134 | X0252693Y0447644* 1135 | X0252781Y0448315* 1136 | X0252693Y0448986* 1137 | X0252434Y0449611* 1138 | X0252022Y0450148* 1139 | X0251485Y045056* 1140 | X025086Y0450819* 1141 | X0250189Y0450907* 1142 | G37* 1143 | G36* 1144 | X0267906D02* 1145 | X0267235Y0450819D01* 1146 | X026661Y045056* 1147 | X0266073Y0450148* 1148 | X0265661Y0449611* 1149 | X0265402Y0448986* 1150 | X0265313Y0448315* 1151 | X0265402Y0447644* 1152 | X0265661Y0447019* 1153 | X0266073Y0446482* 1154 | X026661Y044607* 1155 | X0267235Y0445811* 1156 | X0267787Y0445738* 1157 | Y0444795* 1158 | X0267338Y0444574* 1159 | X0267233Y0444654* 1160 | X0266608Y0444913* 1161 | X0265937Y0445002* 1162 | X0265266Y0444913* 1163 | X0264641Y0444654* 1164 | X0264104Y0444242* 1165 | X0263692Y0443706* 1166 | X0263433Y044308* 1167 | X0263345Y0442409* 1168 | X0263433Y0441739* 1169 | X0263692Y0441113* 1170 | X0264104Y0440576* 1171 | X0264641Y0440164* 1172 | X0265266Y0439906* 1173 | X0265937Y0439817* 1174 | X0266608Y0439906* 1175 | X0267233Y0440164* 1176 | X0267334Y0440242* 1177 | X0267802Y0440066* 1178 | X0267868Y0439733* 1179 | X02681Y0439386* 1180 | X0302243Y0405243* 1181 | X030259Y0405011* 1182 | X0303Y0404929* 1183 | X0312347* 1184 | Y0402347* 1185 | X0319653* 1186 | Y0409653* 1187 | X0312347* 1188 | Y0407071* 1189 | X0303443* 1190 | X0271073Y0439441* 1191 | X0271294Y0439889* 1192 | X0271843Y0439817* 1193 | X0272514Y0439906* 1194 | X0272739Y0439999* 1195 | X0297495Y0415243* 1196 | X0297842Y0415011* 1197 | X0298252Y0414929* 1198 | X031249* 1199 | X0312809Y0414158* 1200 | X0313395Y0413395* 1201 | X0314158Y0412809* 1202 | X0315046Y0412441* 1203 | X0316Y0412316* 1204 | X0316954Y0412441* 1205 | X0317842Y0412809* 1206 | X0318605Y0413395* 1207 | X0319191Y0414158* 1208 | X0319559Y0415046* 1209 | X0319684Y0416* 1210 | X0319559Y0416954* 1211 | X0319191Y0417842* 1212 | X0318605Y0418605* 1213 | X0317842Y0419191* 1214 | X0316954Y0419559* 1215 | X0316Y0419684* 1216 | X0315046Y0419559* 1217 | X0314158Y0419191* 1218 | X0313395Y0418605* 1219 | X0312809Y0417842* 1220 | X031249Y0417071* 1221 | X0298695* 1222 | X0274253Y0441513* 1223 | X0274346Y0441739* 1224 | X0274435Y0442409* 1225 | X0274346Y044308* 1226 | X0274088Y0443706* 1227 | X0273676Y0444242* 1228 | X0273139Y0444654* 1229 | X0272514Y0444913* 1230 | X0271843Y0445002* 1231 | X0271172Y0444913* 1232 | X0270547Y0444654* 1233 | X0270376Y0444524* 1234 | X0269928Y0444745* 1235 | Y0446728* 1236 | X0270151Y0447019* 1237 | X0270409Y0447644* 1238 | X0270498Y0448315* 1239 | X0270409Y0448986* 1240 | X0270151Y0449611* 1241 | X0269739Y0450148* 1242 | X0269202Y045056* 1243 | X0268577Y0450819* 1244 | X0267906Y0450907* 1245 | G37* 1246 | G36* 1247 | X0290346Y0458692D02* 1248 | X0289393Y0458567D01* 1249 | X0288504Y0458199* 1250 | X0287741Y0457613* 1251 | X0287156Y045685* 1252 | X0286788Y0455962* 1253 | X0286662Y0455008* 1254 | Y0447921* 1255 | X0286788Y0446968* 1256 | X0287156Y0446079* 1257 | X0287741Y0445316* 1258 | X0288504Y0444731* 1259 | X0289393Y0444363* 1260 | X0290346Y0444237* 1261 | X02913Y0444363* 1262 | X0292189Y0444731* 1263 | X0292952Y0445316* 1264 | X0293537Y0446079* 1265 | X0293905Y0446968* 1266 | X0294031Y0447921* 1267 | Y0455008* 1268 | X0293905Y0455962* 1269 | X0293537Y045685* 1270 | X0292952Y0457613* 1271 | X0292189Y0458199* 1272 | X02913Y0458567* 1273 | X0290346Y0458692* 1274 | G37* 1275 | %LNhdmi_breakout_pcb_v02-3*% 1276 | %LPD*% 1277 | G54D10* 1278 | X024222Y045422D02* 1279 | X0246252D01* 1280 | X02405Y04525D02* 1281 | X024222Y045422D01* 1282 | X02405Y04445D02* 1283 | Y04525D01* 1284 | X0228189Y0432189D02* 1285 | X02405Y04445D01* 1286 | X0228189Y0399937D02* 1287 | Y0432189D01* 1288 | Y0392063D02* 1289 | Y0399937D01* 1290 | X0220315D02* 1291 | X0228189D01* 1292 | G54D11* 1293 | X02985Y0426D02* 1294 | X0316D01* 1295 | X027917Y044533D02* 1296 | X02985Y0426D01* 1297 | X027517Y044533D02* 1298 | X027917D01* 1299 | X0273811Y0446689D02* 1300 | X027517Y044533D01* 1301 | X0273811Y0446689D02* 1302 | Y0448315D01* 1303 | X02845Y04455D02* 1304 | Y0452D01* 1305 | X02785Y0458D02* 1306 | X02845Y0452D01* 1307 | X0273654Y0458D02* 1308 | X02785D01* 1309 | X02845Y04455D02* 1310 | X0294Y0436D01* 1311 | X0316* 1312 | X0269874Y045422D02* 1313 | X0273654Y0458D01* 1314 | X0267906Y0448315D02* 1315 | X0268857Y0447364D01* 1316 | Y0440143D02* 1317 | Y0447364D01* 1318 | Y0440143D02* 1319 | X0303Y0406D01* 1320 | X0316* 1321 | X0271843Y0442409D02* 1322 | X0298252Y0416D01* 1323 | X0316* 1324 | X0258063Y045422D02* 1325 | X0263969D01* 1326 | X0252157D02* 1327 | X0258063D01* 1328 | X0246252D02* 1329 | X0252157D01* 1330 | G54D13* 1331 | X0262Y0468D03* 1332 | G54D14* 1333 | X0262Y0448315D03* 1334 | X0267906D03* 1335 | X0273811D03* 1336 | X0279717D03* 1337 | X0256094D03* 1338 | X0250189D03* 1339 | X0244283D03* 1340 | X0246252Y045422D03* 1341 | X0252157D03* 1342 | X0258063D03* 1343 | X0263969D03* 1344 | X0269874D03* 1345 | X027578D03* 1346 | X024822Y0442409D03* 1347 | X0254126D03* 1348 | X0260032D03* 1349 | X0265937D03* 1350 | X0271843D03* 1351 | X0277748D03* 1352 | G54D15* 1353 | X0290346Y0475087D03* 1354 | X0234441D03* 1355 | G54D16* 1356 | X0290346Y0451465D03* 1357 | X0234441D03* 1358 | G54D17* 1359 | X0316Y0406D03* 1360 | G54D18* 1361 | X0316Y0416D03* 1362 | Y0426D03* 1363 | Y0436D03* 1364 | X0298Y0394D03* 1365 | G54D19* 1366 | X0212441Y0392063D03* 1367 | G54D20* 1368 | X0220315Y0392063D03* 1369 | X0228189D03* 1370 | X0236063D03* 1371 | X0243937D03* 1372 | X0251811D03* 1373 | X0259685D03* 1374 | X0267559D03* 1375 | X0212441Y0399937D03* 1376 | X0220315D03* 1377 | X0228189D03* 1378 | X0236063D03* 1379 | X0243937D03* 1380 | X0251811D03* 1381 | X0259685D03* 1382 | X0267559D03* 1383 | G54D21* 1384 | X0288Y0394D03* 1385 | M02* -------------------------------------------------------------------------------- /LVDS-HDMI Extension Board/hdmi_breakout_pcb_v02.gtl: -------------------------------------------------------------------------------- 1 | %FSTAX25Y25*% 2 | %MOIN*% 3 | %SFA1B1*% 4 | 5 | %IPPOS*% 6 | %ADD10C,0.012000*% 7 | %ADD11C,0.007000*% 8 | %ADD13C,0.066930*% 9 | %ADD14C,0.037400*% 10 | %ADD15O,0.059060X0.106300*% 11 | %ADD16O,0.059060X0.129920*% 12 | %ADD17R,0.059060X0.059060*% 13 | %ADD18C,0.059060*% 14 | %ADD19R,0.039370X0.039370*% 15 | %ADD20C,0.039370*% 16 | %ADD21R,0.059060X0.059060*% 17 | %LNhdmi_breakout_pcb_v02-1*% 18 | %LPD*% 19 | G36* 20 | X0323Y0385153D02* 21 | X0322538Y0384962D01* 22 | X03225Y0385* 23 | X0201854* 24 | X0201502Y0385354* 25 | X0201866Y0464071* 26 | X0202357Y0464168* 27 | X0203075Y0462433* 28 | X020408Y0460793* 29 | X020533Y045933* 30 | X0206793Y045808* 31 | X0208433Y0457075* 32 | X0210211Y0456339* 33 | X0212082Y045589* 34 | X0214Y0455739* 35 | X0215918Y045589* 36 | X0217789Y0456339* 37 | X0219567Y0457075* 38 | X0221207Y045808* 39 | X022267Y045933* 40 | X022392Y0460793* 41 | X0224925Y0462433* 42 | X0225661Y0464211* 43 | X0226111Y0466082* 44 | X0226261Y0468* 45 | X0226111Y0469918* 46 | X0225661Y0471789* 47 | X0224925Y0473567* 48 | X022392Y0475207* 49 | X022267Y047667* 50 | X0221207Y047792* 51 | X0219567Y0478925* 52 | X0217789Y0479661* 53 | X0215918Y0480111* 54 | X0214Y0480261* 55 | X0212082Y0480111* 56 | X0210211Y0479661* 57 | X0208433Y0478925* 58 | X0206793Y047792* 59 | X020533Y047667* 60 | X020408Y0475207* 61 | X0203075Y0473567* 62 | X0202393Y047192* 63 | X0201903Y0472019* 64 | X0202Y0493* 65 | X0323* 66 | Y0385153* 67 | G37* 68 | %LNhdmi_breakout_pcb_v02-2*% 69 | %LPC*% 70 | G36* 71 | X0316Y0429684D02* 72 | X0315046Y0429559D01* 73 | X0314158Y0429191* 74 | X0313395Y0428605* 75 | X0312809Y0427842* 76 | X0312441Y0426954* 77 | X0312316Y0426* 78 | X0312441Y0425046* 79 | X0312809Y0424158* 80 | X0313395Y0423395* 81 | X0314158Y0422809* 82 | X0315046Y0422441* 83 | X0316Y0422316* 84 | X0316954Y0422441* 85 | X0317842Y0422809* 86 | X0318605Y0423395* 87 | X0319191Y0424158* 88 | X0319559Y0425046* 89 | X0319684Y0426* 90 | X0319559Y0426954* 91 | X0319191Y0427842* 92 | X0318605Y0428605* 93 | X0317842Y0429191* 94 | X0316954Y0429559* 95 | X0316Y0429684* 96 | G37* 97 | G36* 98 | Y0419684D02* 99 | X0315046Y0419559D01* 100 | X0314158Y0419191* 101 | X0313395Y0418605* 102 | X0312809Y0417842* 103 | X0312441Y0416954* 104 | X0312316Y0416* 105 | X0312441Y0415046* 106 | X0312809Y0414158* 107 | X0313395Y0413395* 108 | X0314158Y0412809* 109 | X0315046Y0412441* 110 | X0316Y0412316* 111 | X0316954Y0412441* 112 | X0317842Y0412809* 113 | X0318605Y0413395* 114 | X0319191Y0414158* 115 | X0319559Y0415046* 116 | X0319684Y0416* 117 | X0319559Y0416954* 118 | X0319191Y0417842* 119 | X0318605Y0418605* 120 | X0317842Y0419191* 121 | X0316954Y0419559* 122 | X0316Y0419684* 123 | G37* 124 | G36* 125 | Y0439684D02* 126 | X0315046Y0439559D01* 127 | X0314158Y0439191* 128 | X0313395Y0438605* 129 | X0312809Y0437842* 130 | X0312441Y0436954* 131 | X0312316Y0436* 132 | X0312441Y0435046* 133 | X0312809Y0434158* 134 | X0313395Y0433395* 135 | X0314158Y0432809* 136 | X0315046Y0432441* 137 | X0316Y0432316* 138 | X0316954Y0432441* 139 | X0317842Y0432809* 140 | X0318605Y0433395* 141 | X0319191Y0434158* 142 | X0319559Y0435046* 143 | X0319684Y0436* 144 | X0319559Y0436954* 145 | X0319191Y0437842* 146 | X0318605Y0438605* 147 | X0317842Y0439191* 148 | X0316954Y0439559* 149 | X0316Y0439684* 150 | G37* 151 | G36* 152 | X0262Y0450907D02* 153 | X0261329Y0450819D01* 154 | X0260704Y045056* 155 | X0260167Y0450148* 156 | X0259755Y0449611* 157 | X0259496Y0448986* 158 | X0259408Y0448315* 159 | X0259496Y0447644* 160 | X0259755Y0447019* 161 | X0260167Y0446482* 162 | X0260704Y044607* 163 | X0260929Y0445977* 164 | Y04455* 165 | X0260935Y0445474* 166 | X0260767Y044507* 167 | X026063Y0444923* 168 | X0260032Y0445002* 169 | X0259361Y0444913* 170 | X0258735Y0444654* 171 | X025854Y0444504* 172 | X0258072Y044468* 173 | X0258035Y0444864* 174 | X0257803Y0445211* 175 | X0257165Y0445849* 176 | Y0445977* 177 | X025739Y044607* 178 | X0257927Y0446482* 179 | X0258339Y0447019* 180 | X0258598Y0447644* 181 | X0258687Y0448315* 182 | X0258598Y0448986* 183 | X0258339Y0449611* 184 | X0257927Y0450148* 185 | X025739Y045056* 186 | X0256765Y0450819* 187 | X0256094Y0450907* 188 | X0255423Y0450819* 189 | X0254798Y045056* 190 | X0254261Y0450148* 191 | X0253849Y0449611* 192 | X025359Y0448986* 193 | X0253502Y0448315* 194 | X025359Y0447644* 195 | X0253849Y0447019* 196 | X0254261Y0446482* 197 | X0254798Y044607* 198 | X0255024Y0445977* 199 | Y0445406* 200 | X0255047Y044529* 201 | X0254705Y0444925* 202 | X0254126Y0445002* 203 | X0253455Y0444913* 204 | X025283Y0444654* 205 | X0252618Y0444492* 206 | X025215Y0444668* 207 | X025213Y0444769* 208 | X0251898Y0445117* 209 | X025126Y0445754* 210 | Y0445977* 211 | X0251485Y044607* 212 | X0252022Y0446482* 213 | X0252434Y0447019* 214 | X0252693Y0447644* 215 | X0252781Y0448315* 216 | X0252693Y0448986* 217 | X0252434Y0449611* 218 | X0252022Y0450148* 219 | X0251485Y045056* 220 | X025086Y0450819* 221 | X0250189Y0450907* 222 | X0249518Y0450819* 223 | X0248893Y045056* 224 | X0248356Y0450148* 225 | X0247944Y0449611* 226 | X0247685Y0448986* 227 | X0247597Y0448315* 228 | X0247685Y0447644* 229 | X0247944Y0447019* 230 | X0248356Y0446482* 231 | X0248893Y044607* 232 | X0249118Y0445977* 233 | Y0445311* 234 | X0249122Y0445293* 235 | X024878Y0444928* 236 | X024822Y0445002* 237 | X024755Y0444913* 238 | X0246924Y0444654* 239 | X0246387Y0444242* 240 | X0245975Y0443706* 241 | X0245844Y0443389* 242 | X0245354Y0443487* 243 | Y0445977* 244 | X024558Y044607* 245 | X0246116Y0446482* 246 | X0246528Y0447019* 247 | X0246787Y0447644* 248 | X0246876Y0448315* 249 | X0246787Y0448986* 250 | X0246528Y0449611* 251 | X0246116Y0450148* 252 | X024558Y045056* 253 | X0244954Y0450819* 254 | X0244283Y0450907* 255 | X0243613Y0450819* 256 | X0242987Y045056* 257 | X024245Y0450148* 258 | X0242038Y0449611* 259 | X0241779Y0448986* 260 | X0241691Y0448315* 261 | X0241779Y0447644* 262 | X0242038Y0447019* 263 | X024245Y0446482* 264 | X0242987Y044607* 265 | X0243213Y0445977* 266 | Y0441717* 267 | X0243294Y0441307* 268 | X0243526Y044096* 269 | X0245429Y0439057* 270 | Y0429944* 271 | X0235306Y041982* 272 | X0235074Y0419473* 273 | X0234992Y0419063* 274 | Y0402382* 275 | X0234717Y0402268* 276 | X023416Y040184* 277 | X0233732Y0401283* 278 | X0233463Y0400634* 279 | X0233371Y0399937* 280 | X0233463Y039924* 281 | X0233732Y0398591* 282 | X023416Y0398034* 283 | X0234717Y0397606* 284 | X0235366Y0397337* 285 | X0236063Y0397246* 286 | X0236141Y0396655* 287 | X0235306Y039582* 288 | X0235074Y0395473* 289 | X0234992Y0395063* 290 | Y0394508* 291 | X0234717Y0394394* 292 | X023416Y0393966* 293 | X0233732Y0393409* 294 | X0233463Y039276* 295 | X0233371Y0392063* 296 | X0233463Y0391366* 297 | X0233732Y0390717* 298 | X023416Y039016* 299 | X0234717Y0389732* 300 | X0235366Y0389463* 301 | X0236063Y0389371* 302 | X023676Y0389463* 303 | X0237409Y0389732* 304 | X0237966Y039016* 305 | X0238394Y0390717* 306 | X0238663Y0391366* 307 | X0238755Y0392063* 308 | X0238663Y039276* 309 | X0238394Y0393409* 310 | X0237966Y0393966* 311 | X0237409Y0394394* 312 | X0237134Y0394508* 313 | Y0394619* 314 | X0239839Y0397324* 315 | X0240071Y0397672* 316 | X0240152Y0398081* 317 | Y0398082* 318 | Y0401187* 319 | X0240071Y0401597* 320 | X0239839Y0401944* 321 | X0238534Y0403249* 322 | Y041804* 323 | X0248977Y0428483* 324 | X0249209Y0428831* 325 | X0249291Y0429241* 326 | Y0440071* 327 | X0249517Y0440164* 328 | X0250053Y0440576* 329 | X0250383Y0440508* 330 | X0251929Y0438962* 331 | Y0426943* 332 | X024318Y0418194* 333 | X0242948Y0417847* 334 | X0242866Y0417437* 335 | Y0402382* 336 | X0242591Y0402268* 337 | X0242034Y040184* 338 | X0241606Y0401283* 339 | X0241337Y0400634* 340 | X0241246Y0399937* 341 | X0241337Y039924* 342 | X0241606Y0398591* 343 | X0242034Y0398034* 344 | X0242591Y0397606* 345 | X024324Y0397337* 346 | X0243637Y0397285* 347 | X0243797Y0396812* 348 | X024318Y0396194* 349 | X0242948Y0395847* 350 | X0242866Y0395437* 351 | Y0394508* 352 | X0242591Y0394394* 353 | X0242034Y0393966* 354 | X0241606Y0393409* 355 | X0241337Y039276* 356 | X0241246Y0392063* 357 | X0241337Y0391366* 358 | X0241606Y0390717* 359 | X0242034Y039016* 360 | X0242591Y0389732* 361 | X024324Y0389463* 362 | X0243937Y0389371* 363 | X0244634Y0389463* 364 | X0245283Y0389732* 365 | X024584Y039016* 366 | X0246268Y0390717* 367 | X0246537Y0391366* 368 | X0246628Y0392063* 369 | X0246537Y039276* 370 | X0246268Y0393409* 371 | X024584Y0393966* 372 | X0245283Y0394394* 373 | X0245008Y0394508* 374 | Y0394994* 375 | X0247757Y0397743* 376 | X0247989Y039809* 377 | X0248071Y03985* 378 | Y0401143* 379 | X0247989Y0401552* 380 | X0247757Y04019* 381 | X0246408Y0403249* 382 | Y0416414* 383 | X0255157Y0425163* 384 | X0255389Y042551* 385 | X0255471Y042592* 386 | Y0439884* 387 | X0255882Y0440168* 388 | X0256045Y0440107* 389 | X0256057Y0440044* 390 | X0256289Y0439697* 391 | X0258929Y0437057* 392 | Y0423443* 393 | X0251054Y0415568* 394 | X0250822Y0415221* 395 | X025074Y0414811* 396 | Y0402382* 397 | X0250465Y0402268* 398 | X0249908Y040184* 399 | X024948Y0401283* 400 | X0249211Y0400634* 401 | X0249119Y0399937* 402 | X0249211Y039924* 403 | X024948Y0398591* 404 | X0249908Y0398034* 405 | X0250465Y0397606* 406 | X0251114Y0397337* 407 | X0251811Y0397246* 408 | X02521Y0397284* 409 | X0252321Y0396835* 410 | X0251054Y0395568* 411 | X0250822Y0395221* 412 | X025074Y0394811* 413 | Y0394508* 414 | X0250465Y0394394* 415 | X0249908Y0393966* 416 | X024948Y0393409* 417 | X0249211Y039276* 418 | X0249119Y0392063* 419 | X0249211Y0391366* 420 | X024948Y0390717* 421 | X0249908Y039016* 422 | X0250465Y0389732* 423 | X0251114Y0389463* 424 | X0251811Y0389371* 425 | X0252508Y0389463* 426 | X0253157Y0389732* 427 | X0253714Y039016* 428 | X0254142Y0390717* 429 | X0254411Y0391366* 430 | X0254503Y0392063* 431 | X0254411Y039276* 432 | X0254142Y0393409* 433 | X0253714Y0393966* 434 | X0253157Y0394394* 435 | X0253116Y0394601* 436 | X0255587Y0397073* 437 | X0255819Y039742* 438 | X02559Y039783* 439 | Y0401187* 440 | X0255819Y0401597* 441 | X0255587Y0401944* 442 | X0254282Y0403249* 443 | Y0413788* 444 | X0262157Y0421663* 445 | X0262389Y042201* 446 | X0262471Y042242* 447 | Y0437362* 448 | X0262932Y0437554* 449 | X0270429Y0430056* 450 | Y0404321* 451 | X0268531Y0402423* 452 | X0268256Y0402537* 453 | X0267559Y0402629* 454 | X0266862Y0402537* 455 | X0266213Y0402268* 456 | X0265656Y040184* 457 | X0265228Y0401283* 458 | X0264959Y0400634* 459 | X0264867Y0399937* 460 | X0264959Y039924* 461 | X0265228Y0398591* 462 | X0265656Y0398034* 463 | X0266213Y0397606* 464 | X0266862Y0397337* 465 | X0267559Y0397246* 466 | X0268256Y0397337* 467 | X0268894Y0397602* 468 | X0269172Y0397186* 469 | X0266802Y0394816* 470 | X0266637Y039457* 471 | X0266213Y0394394* 472 | X0265656Y0393966* 473 | X0265228Y0393409* 474 | X0264959Y039276* 475 | X0264867Y0392063* 476 | X0264959Y0391366* 477 | X0265228Y0390717* 478 | X0265656Y039016* 479 | X0266213Y0389732* 480 | X0266862Y0389463* 481 | X0267559Y0389371* 482 | X0268256Y0389463* 483 | X0268905Y0389732* 484 | X0269462Y039016* 485 | X026989Y0390717* 486 | X0270159Y0391366* 487 | X0270251Y0392063* 488 | X0270159Y039276* 489 | X026989Y0393409* 490 | X0269462Y0393966* 491 | X0269432Y0394419* 492 | X0273657Y0398643* 493 | X0273889Y039899* 494 | X0273971Y03994* 495 | Y043108* 496 | X0273889Y043149* 497 | X0273657Y0431837* 498 | X0267008Y0438486* 499 | Y0440071* 500 | X0267233Y0440164* 501 | X026777Y0440576* 502 | X0268182Y0441113* 503 | X0268441Y0441739* 504 | X0268529Y0442409* 505 | X0268441Y044308* 506 | X0268182Y0443706* 507 | X026777Y0444242* 508 | X0267233Y0444654* 509 | X0266608Y0444913* 510 | X0265937Y0445002* 511 | X0265266Y0444913* 512 | X0264641Y0444654* 513 | X0264503Y0444548* 514 | X0264377* 515 | X0263994Y0444693* 516 | X0263941Y0444958* 517 | X0263709Y0445305* 518 | X0263071Y0445943* 519 | Y0445977* 520 | X0263296Y044607* 521 | X0263833Y0446482* 522 | X0264245Y0447019* 523 | X0264504Y0447644* 524 | X0264592Y0448315* 525 | X0264504Y0448986* 526 | X0264245Y0449611* 527 | X0263833Y0450148* 528 | X0263296Y045056* 529 | X0262671Y0450819* 530 | X0262Y0450907* 531 | G37* 532 | G36* 533 | X0234441Y0458692D02* 534 | X0233487Y0458567D01* 535 | X0232599Y0458199* 536 | X0231836Y0457613* 537 | X023125Y045685* 538 | X0230882Y0455962* 539 | X0230757Y0455008* 540 | Y0447921* 541 | X0230882Y0446968* 542 | X023125Y0446079* 543 | X0231836Y0445316* 544 | X0232599Y0444731* 545 | X0233487Y0444363* 546 | X0234441Y0444237* 547 | X0235395Y0444363* 548 | X0236283Y0444731* 549 | X0237046Y0445316* 550 | X0237632Y0446079* 551 | X0238Y0446968* 552 | X0238125Y0447921* 553 | Y0455008* 554 | X0238Y0455962* 555 | X0237632Y045685* 556 | X0237046Y0457613* 557 | X0236283Y0458199* 558 | X0235395Y0458567* 559 | X0234441Y0458692* 560 | G37* 561 | G36* 562 | X0271843Y0445002D02* 563 | X0271172Y0444913D01* 564 | X0270547Y0444654* 565 | X027001Y0444242* 566 | X0269598Y0443706* 567 | X0269339Y044308* 568 | X026925Y0442409* 569 | X0269339Y0441739* 570 | X0269598Y0441113* 571 | X027001Y0440576* 572 | X0270547Y0440164* 573 | X0271172Y0439906* 574 | X0271843Y0439817* 575 | X0272514Y0439906* 576 | X0273139Y0440164* 577 | X0273676Y0440576* 578 | X0274088Y0441113* 579 | X0274346Y0441739* 580 | X0274435Y0442409* 581 | X0274346Y044308* 582 | X0274088Y0443706* 583 | X0273676Y0444242* 584 | X0273139Y0444654* 585 | X0272514Y0444913* 586 | X0271843Y0445002* 587 | G37* 588 | G36* 589 | X0220315Y0402629D02* 590 | X0219618Y0402537D01* 591 | X0218969Y0402268* 592 | X0218412Y040184* 593 | X0217984Y0401283* 594 | X0217715Y0400634* 595 | X0217623Y0399937* 596 | X0217715Y039924* 597 | X0217984Y0398591* 598 | X0218412Y0398034* 599 | X0218969Y0397606* 600 | X0219618Y0397337* 601 | X0220315Y0397246* 602 | X0221012Y0397337* 603 | X0221661Y0397606* 604 | X0222218Y0398034* 605 | X0222646Y0398591* 606 | X0222915Y039924* 607 | X0223007Y0399937* 608 | X0222915Y0400634* 609 | X0222646Y0401283* 610 | X0222218Y040184* 611 | X0221661Y0402268* 612 | X0221012Y0402537* 613 | X0220315Y0402629* 614 | G37* 615 | G36* 616 | X0259685Y0394755D02* 617 | X0258988Y0394663D01* 618 | X0258339Y0394394* 619 | X0257782Y0393966* 620 | X0257354Y0393409* 621 | X0257085Y039276* 622 | X0256994Y0392063* 623 | X0257085Y0391366* 624 | X0257354Y0390717* 625 | X0257782Y039016* 626 | X0258339Y0389732* 627 | X0258988Y0389463* 628 | X0259685Y0389371* 629 | X0260382Y0389463* 630 | X0261031Y0389732* 631 | X0261588Y039016* 632 | X0262016Y0390717* 633 | X0262285Y0391366* 634 | X0262376Y0392063* 635 | X0262285Y039276* 636 | X0262016Y0393409* 637 | X0261588Y0393966* 638 | X0261031Y0394394* 639 | X0260382Y0394663* 640 | X0259685Y0394755* 641 | G37* 642 | G36* 643 | X0228189D02* 644 | X0227492Y0394663D01* 645 | X0226843Y0394394* 646 | X0226286Y0393966* 647 | X0225858Y0393409* 648 | X0225589Y039276* 649 | X0225498Y0392063* 650 | X0225589Y0391366* 651 | X0225858Y0390717* 652 | X0226286Y039016* 653 | X0226843Y0389732* 654 | X0227492Y0389463* 655 | X0228189Y0389371* 656 | X0228886Y0389463* 657 | X0229535Y0389732* 658 | X0230092Y039016* 659 | X023052Y0390717* 660 | X0230789Y0391366* 661 | X023088Y0392063* 662 | X0230789Y039276* 663 | X023052Y0393409* 664 | X0230092Y0393966* 665 | X0229535Y0394394* 666 | X0228886Y0394663* 667 | X0228189Y0394755* 668 | G37* 669 | G36* 670 | X0319653Y0409653D02* 671 | X0312347D01* 672 | Y0402347* 673 | X0319653* 674 | Y0409653* 675 | G37* 676 | G36* 677 | X0259685Y0402629D02* 678 | X0258988Y0402537D01* 679 | X0258339Y0402268* 680 | X0257782Y040184* 681 | X0257354Y0401283* 682 | X0257085Y0400634* 683 | X0256994Y0399937* 684 | X0257085Y039924* 685 | X0257354Y0398591* 686 | X0257782Y0398034* 687 | X0258339Y0397606* 688 | X0258988Y0397337* 689 | X0259685Y0397246* 690 | X0260382Y0397337* 691 | X0261031Y0397606* 692 | X0261588Y0398034* 693 | X0262016Y0398591* 694 | X0262285Y039924* 695 | X0262376Y0399937* 696 | X0262285Y0400634* 697 | X0262016Y0401283* 698 | X0261588Y040184* 699 | X0261031Y0402268* 700 | X0260382Y0402537* 701 | X0259685Y0402629* 702 | G37* 703 | G36* 704 | X0228189D02* 705 | X0227492Y0402537D01* 706 | X0226843Y0402268* 707 | X0226286Y040184* 708 | X0225858Y0401283* 709 | X0225589Y0400634* 710 | X0225498Y0399937* 711 | X0225589Y039924* 712 | X0225858Y0398591* 713 | X0226286Y0398034* 714 | X0226843Y0397606* 715 | X0227492Y0397337* 716 | X0228189Y0397246* 717 | X0228886Y0397337* 718 | X0229535Y0397606* 719 | X0230092Y0398034* 720 | X023052Y0398591* 721 | X0230789Y039924* 722 | X023088Y0399937* 723 | X0230789Y0400634* 724 | X023052Y0401283* 725 | X0230092Y040184* 726 | X0229535Y0402268* 727 | X0228886Y0402537* 728 | X0228189Y0402629* 729 | G37* 730 | G36* 731 | X031Y0480261D02* 732 | X0308082Y0480111D01* 733 | X0306211Y0479661* 734 | X0304433Y0478925* 735 | X0302793Y047792* 736 | X030133Y047667* 737 | X030008Y0475207* 738 | X0299075Y0473567* 739 | X0298339Y0471789* 740 | X0297889Y0469918* 741 | X0297739Y0468* 742 | X0297889Y0466082* 743 | X0298339Y0464211* 744 | X0299075Y0462433* 745 | X030008Y0460793* 746 | X030133Y045933* 747 | X0302793Y045808* 748 | X0304433Y0457075* 749 | X0306211Y0456339* 750 | X0308082Y045589* 751 | X031Y0455739* 752 | X0311918Y045589* 753 | X0313789Y0456339* 754 | X0315567Y0457075* 755 | X0317207Y045808* 756 | X031867Y045933* 757 | X031992Y0460793* 758 | X0320925Y0462433* 759 | X0321661Y0464211* 760 | X0322111Y0466082* 761 | X0322261Y0468* 762 | X0322111Y0469918* 763 | X0321661Y0471789* 764 | X0320925Y0473567* 765 | X031992Y0475207* 766 | X031867Y047667* 767 | X0317207Y047792* 768 | X0315567Y0478925* 769 | X0313789Y0479661* 770 | X0311918Y0480111* 771 | X031Y0480261* 772 | G37* 773 | G36* 774 | X0269874Y0456813D02* 775 | X0269203Y0456724D01* 776 | X0268578Y0456465* 777 | X0268041Y0456053* 778 | X0267629Y0455516* 779 | X026737Y0454891* 780 | X0267282Y045422* 781 | X026737Y0453549* 782 | X0267629Y0452924* 783 | X0268041Y0452387* 784 | X0268578Y0451975* 785 | X0269203Y0451717* 786 | X0269874Y0451628* 787 | X0270545Y0451717* 788 | X027117Y0451975* 789 | X0271707Y0452387* 790 | X0272119Y0452924* 791 | X0272378Y0453549* 792 | X0272466Y045422* 793 | X0272378Y0454891* 794 | X0272119Y0455516* 795 | X0271707Y0456053* 796 | X027117Y0456465* 797 | X0270545Y0456724* 798 | X0269874Y0456813* 799 | G37* 800 | G36* 801 | X0263969D02* 802 | X0263298Y0456724D01* 803 | X0262672Y0456465* 804 | X0262136Y0456053* 805 | X0261724Y0455516* 806 | X0261465Y0454891* 807 | X0261376Y045422* 808 | X0261465Y0453549* 809 | X0261724Y0452924* 810 | X0262136Y0452387* 811 | X0262672Y0451975* 812 | X0263298Y0451717* 813 | X0263969Y0451628* 814 | X0264639Y0451717* 815 | X0265265Y0451975* 816 | X0265802Y0452387* 817 | X0266214Y0452924* 818 | X0266473Y0453549* 819 | X0266561Y045422* 820 | X0266473Y0454891* 821 | X0266214Y0455516* 822 | X0265802Y0456053* 823 | X0265265Y0456465* 824 | X0264639Y0456724* 825 | X0263969Y0456813* 826 | G37* 827 | G36* 828 | X0290346Y0481133D02* 829 | X0289393Y0481007D01* 830 | X0288504Y048064* 831 | X0287741Y0480054* 832 | X0287156Y0479291* 833 | X0286788Y0478402* 834 | X0286662Y0477449* 835 | Y0472724* 836 | X0286788Y0471771* 837 | X0287156Y0470882* 838 | X0287741Y0470119* 839 | X0288504Y0469534* 840 | X0289393Y0469166* 841 | X0290346Y046904* 842 | X02913Y0469166* 843 | X0292189Y0469534* 844 | X0292952Y0470119* 845 | X0293537Y0470882* 846 | X0293905Y0471771* 847 | X0294031Y0472724* 848 | Y0477449* 849 | X0293905Y0478402* 850 | X0293537Y0479291* 851 | X0292952Y0480054* 852 | X0292189Y048064* 853 | X02913Y0481007* 854 | X0290346Y0481133* 855 | G37* 856 | G36* 857 | X0234441D02* 858 | X0233487Y0481007D01* 859 | X0232599Y048064* 860 | X0231836Y0480054* 861 | X023125Y0479291* 862 | X0230882Y0478402* 863 | X0230757Y0477449* 864 | Y0472724* 865 | X0230882Y0471771* 866 | X023125Y0470882* 867 | X0231836Y0470119* 868 | X0232599Y0469534* 869 | X0233487Y0469166* 870 | X0234441Y046904* 871 | X0235395Y0469166* 872 | X0236283Y0469534* 873 | X0237046Y0470119* 874 | X0237632Y0470882* 875 | X0238Y0471771* 876 | X0238125Y0472724* 877 | Y0477449* 878 | X0238Y0478402* 879 | X0237632Y0479291* 880 | X0237046Y0480054* 881 | X0236283Y048064* 882 | X0235395Y0481007* 883 | X0234441Y0481133* 884 | G37* 885 | G36* 886 | X0262Y0472081D02* 887 | X0260944Y0471942D01* 888 | X0259959Y0471535* 889 | X0259114Y0470886* 890 | X0258465Y0470041* 891 | X0258058Y0469056* 892 | X0257919Y0468* 893 | X0258058Y0466944* 894 | X0258465Y0465959* 895 | X0259114Y0465114* 896 | X0259959Y0464465* 897 | X0260944Y0464058* 898 | X0262Y0463919* 899 | X0263056Y0464058* 900 | X0264041Y0464465* 901 | X0264886Y0465114* 902 | X0265535Y0465959* 903 | X0265942Y0466944* 904 | X0266081Y0468* 905 | X0265942Y0469056* 906 | X0265535Y0470041* 907 | X0264886Y0470886* 908 | X0264041Y0471535* 909 | X0263056Y0471942* 910 | X0262Y0472081* 911 | G37* 912 | G36* 913 | X0290346Y0458692D02* 914 | X0289393Y0458567D01* 915 | X0288504Y0458199* 916 | X0287741Y0457613* 917 | X0287156Y045685* 918 | X0286788Y0455962* 919 | X0286662Y0455008* 920 | Y0450214* 921 | X0286184Y0450069* 922 | X0285937Y0450437* 923 | X0281217Y0455158* 924 | X0280787Y0455445* 925 | X028028Y0455546* 926 | X0278002* 927 | X0277613Y0456053* 928 | X0277076Y0456465* 929 | X027645Y0456724* 930 | X027578Y0456813* 931 | X0275109Y0456724* 932 | X0274483Y0456465* 933 | X0273947Y0456053* 934 | X0273535Y0455516* 935 | X0273276Y0454891* 936 | X0273187Y045422* 937 | X0273276Y0453549* 938 | X0273535Y0452924* 939 | X0273947Y0452387* 940 | X0274483Y0451975* 941 | X0275109Y0451717* 942 | X027578Y0451628* 943 | X027645Y0451717* 944 | X0277076Y0451975* 945 | X0277613Y0452387* 946 | X0278002Y0452895* 947 | X0279731* 948 | X0283675Y0448951* 949 | Y0446727* 950 | X0283196Y0446582* 951 | X0282937Y0446969* 952 | X0282225Y0447681* 953 | X0282309Y0448315* 954 | X0282221Y0448986* 955 | X0281962Y0449611* 956 | X028155Y0450148* 957 | X0281013Y045056* 958 | X0280387Y0450819* 959 | X0279717Y0450907* 960 | X0279046Y0450819* 961 | X027842Y045056* 962 | X0277884Y0450148* 963 | X0277472Y0449611* 964 | X0277213Y0448986* 965 | X0277124Y0448315* 966 | X0277213Y0447644* 967 | X0277472Y0447019* 968 | X0277884Y0446482* 969 | X027842Y044607* 970 | X0279046Y0445811* 971 | X0279717Y0445723* 972 | X0280299Y0445799* 973 | X0280675Y044547* 974 | Y0443342* 975 | X0280184Y0443244* 976 | X0279993Y0443706* 977 | X0279581Y0444242* 978 | X0279044Y0444654* 979 | X0278419Y0444913* 980 | X0277748Y0445002* 981 | X0277077Y0444913* 982 | X0276452Y0444654* 983 | X0275915Y0444242* 984 | X0275503Y0443706* 985 | X0275244Y044308* 986 | X0275156Y0442409* 987 | X0275244Y0441739* 988 | X0275503Y0441113* 989 | X0275915Y0440576* 990 | X0276423Y0440187* 991 | Y0389297* 992 | X0275451Y0388326* 993 | X0214549* 994 | X0213767Y0389108* 995 | Y0389394* 996 | X0215109* 997 | Y0390738* 998 | X0217976* 999 | X0217984Y0390717* 1000 | X0218412Y039016* 1001 | X0218969Y0389732* 1002 | X0219618Y0389463* 1003 | X0220315Y0389371* 1004 | X0221012Y0389463* 1005 | X0221661Y0389732* 1006 | X0222218Y039016* 1007 | X0222646Y0390717* 1008 | X0222915Y0391366* 1009 | X0223007Y0392063* 1010 | X0222915Y039276* 1011 | X0222646Y0393409* 1012 | X0222218Y0393966* 1013 | X0221661Y0394394* 1014 | X0221012Y0394663* 1015 | X0220315Y0394755* 1016 | X0219618Y0394663* 1017 | X0218969Y0394394* 1018 | X0218412Y0393966* 1019 | X0217984Y0393409* 1020 | X0217976Y0393389* 1021 | X0215109* 1022 | Y0394731* 1023 | X0213767* 1024 | Y0397598* 1025 | X0213787Y0397606* 1026 | X0214344Y0398034* 1027 | X0214772Y0398591* 1028 | X0215041Y039924* 1029 | X0215132Y0399937* 1030 | X0215041Y0400634* 1031 | X0214772Y0401283* 1032 | X0214344Y040184* 1033 | X0213787Y0402268* 1034 | X0213138Y0402537* 1035 | X0212441Y0402629* 1036 | X0211744Y0402537* 1037 | X0211095Y0402268* 1038 | X0210538Y040184* 1039 | X021011Y0401283* 1040 | X0209841Y0400634* 1041 | X020975Y0399937* 1042 | X0209841Y039924* 1043 | X021011Y0398591* 1044 | X0210538Y0398034* 1045 | X0211095Y0397606* 1046 | X0211116Y0397598* 1047 | Y0394731* 1048 | X0209772* 1049 | Y0389394* 1050 | X0211116* 1051 | Y0388559* 1052 | X0211216Y0388052* 1053 | X0211504Y0387622* 1054 | X0213063Y0386063* 1055 | X0213493Y0385775* 1056 | X0214Y0385675* 1057 | X0276* 1058 | X0276507Y0385775* 1059 | X0276937Y0386063* 1060 | X0278685Y0387811* 1061 | X0278973Y0388241* 1062 | X0279074Y0388748* 1063 | Y0440187* 1064 | X0279581Y0440576* 1065 | X0279993Y0441113* 1066 | X0280184Y0441575* 1067 | X0280675Y0441477* 1068 | Y0429* 1069 | X0280775Y0428493* 1070 | X0281063Y0428063* 1071 | X0286674Y0422451* 1072 | Y0397653* 1073 | X0284347* 1074 | Y0390347* 1075 | X0291653* 1076 | Y0397653* 1077 | X0289325* 1078 | Y0423* 1079 | X0289225Y0423507* 1080 | X0288937Y0423937* 1081 | X0283326Y0429549* 1082 | Y0430305* 1083 | X0283804Y043045* 1084 | X0284063Y0430063* 1085 | X0296674Y0417451* 1086 | Y0397405* 1087 | X0296158Y0397191* 1088 | X0295395Y0396605* 1089 | X0294809Y0395842* 1090 | X0294441Y0394954* 1091 | X0294316Y0394* 1092 | X0294441Y0393046* 1093 | X0294809Y0392158* 1094 | X0295395Y0391395* 1095 | X0296158Y0390809* 1096 | X0297046Y0390441* 1097 | X0298Y0390316* 1098 | X0298954Y0390441* 1099 | X0299842Y0390809* 1100 | X0300605Y0391395* 1101 | X0301191Y0392158* 1102 | X0301559Y0393046* 1103 | X0301684Y0394* 1104 | X0301559Y0394954* 1105 | X0301191Y0395842* 1106 | X0300605Y0396605* 1107 | X0299842Y0397191* 1108 | X0299325Y0397405* 1109 | Y0418* 1110 | X0299225Y0418507* 1111 | X0298937Y0418937* 1112 | X0286326Y0431549* 1113 | Y0446802* 1114 | X0286816Y04469* 1115 | X0287156Y0446079* 1116 | X0287741Y0445316* 1117 | X0288504Y0444731* 1118 | X0289393Y0444363* 1119 | X0290346Y0444237* 1120 | X02913Y0444363* 1121 | X0292189Y0444731* 1122 | X0292952Y0445316* 1123 | X0293537Y0446079* 1124 | X0293905Y0446968* 1125 | X0294031Y0447921* 1126 | Y0455008* 1127 | X0293905Y0455962* 1128 | X0293537Y045685* 1129 | X0292952Y0457613* 1130 | X0292189Y0458199* 1131 | X02913Y0458567* 1132 | X0290346Y0458692* 1133 | G37* 1134 | G36* 1135 | X0273811Y0450907D02* 1136 | X027314Y0450819D01* 1137 | X0272515Y045056* 1138 | X0271978Y0450148* 1139 | X0271566Y0449611* 1140 | X0271307Y0448986* 1141 | X0271219Y0448315* 1142 | X0271307Y0447644* 1143 | X0271566Y0447019* 1144 | X0271978Y0446482* 1145 | X0272515Y044607* 1146 | X027314Y0445811* 1147 | X0273811Y0445723* 1148 | X0274482Y0445811* 1149 | X0275107Y044607* 1150 | X0275644Y0446482* 1151 | X0276056Y0447019* 1152 | X0276315Y0447644* 1153 | X0276403Y0448315* 1154 | X0276315Y0448986* 1155 | X0276056Y0449611* 1156 | X0275644Y0450148* 1157 | X0275107Y045056* 1158 | X0274482Y0450819* 1159 | X0273811Y0450907* 1160 | G37* 1161 | G36* 1162 | X0267906D02* 1163 | X0267235Y0450819D01* 1164 | X026661Y045056* 1165 | X0266073Y0450148* 1166 | X0265661Y0449611* 1167 | X0265402Y0448986* 1168 | X0265313Y0448315* 1169 | X0265402Y0447644* 1170 | X0265661Y0447019* 1171 | X0266073Y0446482* 1172 | X026661Y044607* 1173 | X0267235Y0445811* 1174 | X0267906Y0445723* 1175 | X0268577Y0445811* 1176 | X0269202Y044607* 1177 | X0269739Y0446482* 1178 | X0270151Y0447019* 1179 | X0270409Y0447644* 1180 | X0270498Y0448315* 1181 | X0270409Y0448986* 1182 | X0270151Y0449611* 1183 | X0269739Y0450148* 1184 | X0269202Y045056* 1185 | X0268577Y0450819* 1186 | X0267906Y0450907* 1187 | G37* 1188 | G36* 1189 | X0258063Y0456813D02* 1190 | X0257392Y0456724D01* 1191 | X0256767Y0456465* 1192 | X025623Y0456053* 1193 | X0255818Y0455516* 1194 | X0255559Y0454891* 1195 | X0255471Y045422* 1196 | X0255559Y0453549* 1197 | X0255818Y0452924* 1198 | X025623Y0452387* 1199 | X0256767Y0451975* 1200 | X0257392Y0451717* 1201 | X0258063Y0451628* 1202 | X0258734Y0451717* 1203 | X0259359Y0451975* 1204 | X0259896Y0452387* 1205 | X0260308Y0452924* 1206 | X0260567Y0453549* 1207 | X0260655Y045422* 1208 | X0260567Y0454891* 1209 | X0260308Y0455516* 1210 | X0259896Y0456053* 1211 | X0259359Y0456465* 1212 | X0258734Y0456724* 1213 | X0258063Y0456813* 1214 | G37* 1215 | G36* 1216 | X0252157D02* 1217 | X0251486Y0456724D01* 1218 | X0250861Y0456465* 1219 | X0250324Y0456053* 1220 | X0249912Y0455516* 1221 | X0249654Y0454891* 1222 | X0249565Y045422* 1223 | X0249654Y0453549* 1224 | X0249912Y0452924* 1225 | X0250324Y0452387* 1226 | X0250861Y0451975* 1227 | X0251486Y0451717* 1228 | X0252157Y0451628* 1229 | X0252828Y0451717* 1230 | X0253453Y0451975* 1231 | X025399Y0452387* 1232 | X0254402Y0452924* 1233 | X0254661Y0453549* 1234 | X025475Y045422* 1235 | X0254661Y0454891* 1236 | X0254402Y0455516* 1237 | X025399Y0456053* 1238 | X0253453Y0456465* 1239 | X0252828Y0456724* 1240 | X0252157Y0456813* 1241 | G37* 1242 | G36* 1243 | X0246252D02* 1244 | X0245581Y0456724D01* 1245 | X0244956Y0456465* 1246 | X0244419Y0456053* 1247 | X0244007Y0455516* 1248 | X0243748Y0454891* 1249 | X024366Y045422* 1250 | X0243748Y0453549* 1251 | X0244007Y0452924* 1252 | X0244419Y0452387* 1253 | X0244956Y0451975* 1254 | X0245581Y0451717* 1255 | X0246252Y0451628* 1256 | X0246923Y0451717* 1257 | X0247548Y0451975* 1258 | X0248085Y0452387* 1259 | X0248497Y0452924* 1260 | X0248756Y0453549* 1261 | X0248844Y045422* 1262 | X0248756Y0454891* 1263 | X0248497Y0455516* 1264 | X0248085Y0456053* 1265 | X0247548Y0456465* 1266 | X0246923Y0456724* 1267 | X0246252Y0456813* 1268 | G37* 1269 | %LNhdmi_breakout_pcb_v02-3*% 1270 | %LPD*% 1271 | G54D10* 1272 | X028028Y045422D02* 1273 | X0285Y04495D01* 1274 | Y0431D02* 1275 | Y04495D01* 1276 | Y0431D02* 1277 | X0298Y0418D01* 1278 | X0212441Y0388559D02* 1279 | Y0392063D01* 1280 | Y0388559D02* 1281 | X0214Y0387D01* 1282 | X0276* 1283 | X0277748Y0388748* 1284 | X027578Y045422D02* 1285 | X028028D01* 1286 | X0298Y0394D02* 1287 | Y0418D01* 1288 | X0279717Y0448315D02* 1289 | X0282Y0446032D01* 1290 | Y0429D02* 1291 | Y0446032D01* 1292 | Y0429D02* 1293 | X0288Y0423D01* 1294 | Y0394D02* 1295 | Y0423D01* 1296 | X0277748Y0388748D02* 1297 | Y0442409D01* 1298 | X0212441Y0392063D02* 1299 | X0220315D01* 1300 | X0212441D02* 1301 | Y0399937D01* 1302 | G54D11* 1303 | X02729Y03994D02* 1304 | Y043108D01* 1305 | X0267559Y0394059D02* 1306 | X02729Y03994D01* 1307 | X0267559Y0392063D02* 1308 | Y0394059D01* 1309 | X0237463Y0402806D02* 1310 | X0239082Y0401187D01* 1311 | X0236063Y0395063D02* 1312 | X0239082Y0398081D01* 1313 | Y0401187* 1314 | X0245337Y0402806D02* 1315 | X0247Y0401143D01* 1316 | Y03985D02* 1317 | Y0401143D01* 1318 | X0243937Y0395437D02* 1319 | X0247Y03985D01* 1320 | X0236063Y0392063D02* 1321 | Y0395063D01* 1322 | X0243937Y0392063D02* 1323 | Y0395437D01* 1324 | X025483Y039783D02* 1325 | Y0401187D01* 1326 | X0251811Y0394811D02* 1327 | X025483Y039783D01* 1328 | X0251811Y0392063D02* 1329 | Y0394811D01* 1330 | X0265937Y0438043D02* 1331 | X02729Y043108D01* 1332 | X0265937Y0438043D02* 1333 | Y0442409D01* 1334 | X02715Y0403878D02* 1335 | Y04305D01* 1336 | X0262952Y0439048D02* 1337 | X02715Y04305D01* 1338 | X0262952Y0439048D02* 1339 | Y0444548D01* 1340 | X02614Y042242D02* 1341 | Y043808D01* 1342 | X0260032Y0439448D02* 1343 | Y0442409D01* 1344 | Y0439448D02* 1345 | X02614Y043808D01* 1346 | X026Y0423D02* 1347 | Y04375D01* 1348 | X0257046Y0440454D02* 1349 | X026Y04375D01* 1350 | X0257046Y0440454D02* 1351 | Y0444454D01* 1352 | X02465Y04295D02* 1353 | Y04395D01* 1354 | X0244283Y0441717D02* 1355 | X02465Y04395D01* 1356 | X0244283Y0441717D02* 1357 | Y0448315D01* 1358 | X0236063Y0419063D02* 1359 | X02465Y04295D01* 1360 | X025114Y0441265D02* 1361 | Y0444359D01* 1362 | X0250189Y0445311D02* 1363 | X025114Y0444359D01* 1364 | X0250189Y0445311D02* 1365 | Y0448315D01* 1366 | X025114Y0441265D02* 1367 | X0253Y0439406D01* 1368 | X0256094Y0445406D02* 1369 | X0257046Y0444454D01* 1370 | X0256094Y0445406D02* 1371 | Y0448315D01* 1372 | X0262Y04455D02* 1373 | X0262952Y0444548D01* 1374 | X0262Y04455D02* 1375 | Y0448315D01* 1376 | X024822Y0429241D02* 1377 | Y0442409D01* 1378 | X0237463Y0418483D02* 1379 | X024822Y0429241D01* 1380 | X0237463Y0402806D02* 1381 | Y0418483D01* 1382 | X0236063Y0399937D02* 1383 | Y0419063D01* 1384 | X0245337Y0416857D02* 1385 | X02544Y042592D01* 1386 | X0253Y04265D02* 1387 | Y0439406D01* 1388 | X02544Y042592D02* 1389 | Y0442135D01* 1390 | X0254126Y0442409D02* 1391 | X02544Y0442135D01* 1392 | X0245337Y0402806D02* 1393 | Y0416857D01* 1394 | X0243937Y0417437D02* 1395 | X0253Y04265D01* 1396 | X0243937Y0399937D02* 1397 | Y0417437D01* 1398 | X0253211Y0414231D02* 1399 | X02614Y042242D01* 1400 | X0253211Y0402806D02* 1401 | Y0414231D01* 1402 | Y0402806D02* 1403 | X025483Y0401187D01* 1404 | X0251811Y0414811D02* 1405 | X026Y0423D01* 1406 | X0251811Y0399937D02* 1407 | Y0414811D01* 1408 | X0267559Y0399937D02* 1409 | X02715Y0403878D01* 1410 | G54D13* 1411 | X0262Y0468D03* 1412 | G54D14* 1413 | X0262Y0448315D03* 1414 | X0267906D03* 1415 | X0273811D03* 1416 | X0279717D03* 1417 | X0256094D03* 1418 | X0250189D03* 1419 | X0244283D03* 1420 | X0246252Y045422D03* 1421 | X0252157D03* 1422 | X0258063D03* 1423 | X0263969D03* 1424 | X0269874D03* 1425 | X027578D03* 1426 | X024822Y0442409D03* 1427 | X0254126D03* 1428 | X0260032D03* 1429 | X0265937D03* 1430 | X0271843D03* 1431 | X0277748D03* 1432 | G54D15* 1433 | X0290346Y0475087D03* 1434 | X0234441D03* 1435 | G54D16* 1436 | X0290346Y0451465D03* 1437 | X0234441D03* 1438 | G54D17* 1439 | X0316Y0406D03* 1440 | G54D18* 1441 | X0316Y0416D03* 1442 | Y0426D03* 1443 | Y0436D03* 1444 | X0298Y0394D03* 1445 | G54D19* 1446 | X0212441Y0392063D03* 1447 | G54D20* 1448 | X0220315Y0392063D03* 1449 | X0228189D03* 1450 | X0236063D03* 1451 | X0243937D03* 1452 | X0251811D03* 1453 | X0259685D03* 1454 | X0267559D03* 1455 | X0212441Y0399937D03* 1456 | X0220315D03* 1457 | X0228189D03* 1458 | X0236063D03* 1459 | X0243937D03* 1460 | X0251811D03* 1461 | X0259685D03* 1462 | X0267559D03* 1463 | G54D21* 1464 | X0288Y0394D03* 1465 | M02* --------------------------------------------------------------------------------