SCIboard(TM): mbed base board data logger - Altimeter: MPL3115A2 - Accelerometer: LSM303DLHC - Gyro: L3G4200D - 4 High Current MOSFET switches

Dependencies:   mbed

/media/uploads/AstrodyneSystems/sciboard_top.jpg

/media/uploads/AstrodyneSystems/sciboard_bottom.jpg

Product Description

SCIboard will take your model rocketry, science, or engineering project to new heights with a complete 10-Degree-Of-Freedom (10-DOF) Inertial Measurement Unit (IMU), 4 high current MOSFET switches, PWM interface (RC servos), USB (memory sticks or BlueTooth) and interfaces for GPS and an XBee® RF module. The SCIboard is an mbed base board ideal for use in college and high school science labs, science fair projects, high power model rocketry, model airplanes, and near space balloon projects. SCIboard is also designed for Open Source software so you can customize the application. Example applications include high power model rocketry, near space balloon projects, and R/C airplanes/quadcopters. While SCIboard requires some basic electronics and software knowledge, it combines multiple breakout boards into a single base board which improves reliability, especially in high g environments such as in model rocketry. Available on Amazon. Search on "SCIboard".

  • Dimensions: 1.5 x 3.8 inches (3.8 x 9.7 cm)
  • Weight: 0.8 ounces (24 g)

10-DOF Inertial Measurement Unit

Going beyond just the 6 degrees of freedom afforded by a 3-axis accelerometer and 3-axis gyro, SCIboard includes an additional 3-axis magnetometer, and highly accurate altimeter / atmospheric pressure sensor. Sensors provide digital measurements over an I2C shared bus (p27 and p28).

Precision Altimeter

(Freescale Semiconductor – MPL3115A2) MEMS pressure sensor with 24-bit Analog-to-Digital Converter (ADC) employs temperature compensation resulting in fully compensated 20-bit pressure/altitude measurements (resolution down to 1 foot).

  • Pressure range: 50 – 110 kPa.
  • Pressure reading noise: 1.5 Pa RMS over -10 to +70° C. Conversion rate: up to 100 Hz.
  • 12-bit temperature sensor measurement range: -40 to +85° C.

3-Axis MEMS Accelerometer

(STMicroelectronics – LSM303DLHC) The sensor measures linear acceleration. Pointing any axis to the earth will apply 1 g in that axis when stationary.

  • Selectable full scale range: +/-2 g to +/-16 g.
  • Sensitivity: 1 – 12 mg/LSB depending on full scale range.
  • Zero-g level offset: +/-60 mg.
  • Acceleration noise density: 220 micro-g/sqrt(Hz).
  • Operating temp range: -40 to +85° C.
  • Conversion rate up to 400 Hz.

3-Axis Ultra-Stable MEMS Gyroscope

(STMicroelectronics – L3G4200D) A gyroscope is an angular rate sensor.

  • Selectable full scale ranges: 250/500/2000 degrees per second (DPS).
  • Resolution: 16-bit.
  • Bandwidth: user selectable.
  • Sensitivity: 8.75/17.50/70 milli-degrees per second/LSB.
  • Nonlinearity: 0.2% full scale
  • Rate noise density: 0.03 DPS/sqrt(Hz).
  • Operating temp range: -40 to +85°C.

Digital I/O

4 MOSFET switches are included. They provide 6-amperes momentary current sinking. Example uses include high power strobes, and lights for night launches or buzzers for location. Switches can be activated at apogee or prior to landing for model rocketry. A continuity check through an analog to digital converter allows verification of circuit continuity before launch. A piezoelectric buzzer provides software control for audible alert and low battery voltage measurement.

/media/uploads/AstrodyneSystems/mosfet.jpg

Host USB Type-A with 5.0 Vdc regulator

USB Type-A connector wired as a host controller provides regulated 5 volt power from a battery. A variety of USB devices from memory sticks, Bluetooth, and Wi-Fi can be used with multiple software projects from the mbed web site.

XBee® and XBee-PRO® Modules

The XBee-PRO® interface supports multiple different XBee and XBee-PRO modules such as Wi-Fi, ZigBee, 802.15.4, Bluetooth, and longer range 900 MHz RF Modules. Compatible modules are Roving Networks and Digi-International. SCIboard provides dual 10 pin headers with regulated 3.3 volt power (from p40) and serial UART (Tx=p9/Rx=p10). Alternatively if the headers are not installed, the serial port may be connected to a SMS cell phone evaluation module. Since the 3.3 volt provided to XBee modules is from the mbed regulator, the user is responsible for power calculations. Testing was done with RN-XV and a 9-volt battery but higher battery voltages or higher current XBee modules could overheat the 3.3 volt regulator on the mbed. When using XBee modules, the user may need to perform hard/soft iron calibration if using the magnetometer.

Interface for GPS

SCIboard provides a serial UART interface for GPS receivers. It also provides 3.3 and 5.0 Vdc for power and Vbat (battery not included). PCB has 0.1” holes for soldered cable or header of your choice. This provides flexibility to use a variety of GPS modules.

/media/uploads/AstrodyneSystems/gps.jpg

Interface for Ethernet Cable

PCB has 0.1” interface for an Ethernet cable of your choice of Ethernet magnetics interface with LEDs. For Ethernet direct wire, use RD-, RD+, TD+, and TD-. For magnetics, several 3.3 Vdc and Grounds are provided allowing easy interfacing. For both LEDs a 160 ohm resistor is provided. Both LEDs share the 2 PWMs out.

/media/uploads/AstrodyneSystems/ethernet.jpg

Interface for PWM RC Servos

SCIboard provides a Pulse Width Modulation (PWM) header for RC servo motors. Up to 6 PWM servos can be controlled. Terminal block is provided for separate servo power source if desired. If the user chooses to not install the headers, the PCB has 0.1” spacing thru-holes for 3-pin R/C servos. (Pins 21 – 26)

/media/uploads/AstrodyneSystems/pwm.jpg

Applications

A 10-Degree-Of-Freedom Inertial Measurement Unit (IMU) can be used to measure distance traveled, velocity, acceleration, attitude (yaw, pitch, and roll), and attitude rate. When combined with a GPS, SCIboard will provide a GPS aided inertial navigation solutions. The PWM can be used to control a camera attached to a servo motor. This enables near space projects to point the camera up at the weather balloon, horizontally at the earth’s horizon, and down directly at the earth.

  1. College and high school science labs
  2. Science Fairs
  3. High Power Model Rocketry
  4. Near Space Balloons
  5. Quadcopters
  6. R/C Airplanes
  7. R/C Helicopter

Processor Board Support (Direct Pin-Out compatible)

  • mbed LPC1768
  • mbed LPC11U24
  • Embedded Artists LPCexpresso LPC1769
Committer:
AstrodyneSystems
Date:
Sun Apr 06 19:03:29 2014 +0000
Revision:
5:dc778a682d29
Added ublox GPS

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AstrodyneSystems 5:dc778a682d29 1 /* SCIboard(TM) SCIboard_ubloxGps.cpp
AstrodyneSystems 5:dc778a682d29 2 Copyright (c) 2013 K. Andres
AstrodyneSystems 5:dc778a682d29 3
AstrodyneSystems 5:dc778a682d29 4 Permission is hereby granted, free of charge, to any person obtaining a copy
AstrodyneSystems 5:dc778a682d29 5 of this software and associated documentation files (the "Software"), to deal
AstrodyneSystems 5:dc778a682d29 6 in the Software without restriction, including without limitation the rights
AstrodyneSystems 5:dc778a682d29 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
AstrodyneSystems 5:dc778a682d29 8 copies of the Software, and to permit persons to whom the Software is
AstrodyneSystems 5:dc778a682d29 9 furnished to do so, subject to the following conditions:
AstrodyneSystems 5:dc778a682d29 10
AstrodyneSystems 5:dc778a682d29 11 The above copyright notice and this permission notice shall be included in
AstrodyneSystems 5:dc778a682d29 12 all copies or substantial portions of the Software.
AstrodyneSystems 5:dc778a682d29 13
AstrodyneSystems 5:dc778a682d29 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
AstrodyneSystems 5:dc778a682d29 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
AstrodyneSystems 5:dc778a682d29 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AstrodyneSystems 5:dc778a682d29 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
AstrodyneSystems 5:dc778a682d29 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
AstrodyneSystems 5:dc778a682d29 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
AstrodyneSystems 5:dc778a682d29 20 THE SOFTWARE.
AstrodyneSystems 5:dc778a682d29 21 */
AstrodyneSystems 5:dc778a682d29 22
AstrodyneSystems 5:dc778a682d29 23 #include "SCIboard_ubloxGps.h"
AstrodyneSystems 5:dc778a682d29 24
AstrodyneSystems 5:dc778a682d29 25 #define SYNC_CHAR_1 0xB5
AstrodyneSystems 5:dc778a682d29 26 #define SYNC_CHAR_2 0x62
AstrodyneSystems 5:dc778a682d29 27
AstrodyneSystems 5:dc778a682d29 28 #define MAX_UBLOX_PACKET_SIZE 512
AstrodyneSystems 5:dc778a682d29 29
AstrodyneSystems 5:dc778a682d29 30 // UBX Class IDs
AstrodyneSystems 5:dc778a682d29 31 #define NAV_CLASS_ID 0x01 // Navigation
AstrodyneSystems 5:dc778a682d29 32 #define RXM_CLASS_ID 0x02 // Receiver
AstrodyneSystems 5:dc778a682d29 33 #define INF_CLASS_ID 0x04 // Information
AstrodyneSystems 5:dc778a682d29 34 #define ACK_CLASS_ID 0x05 // Ack/Nack
AstrodyneSystems 5:dc778a682d29 35 #define CFG_CLASS_ID 0x06 // Configuration input
AstrodyneSystems 5:dc778a682d29 36 #define MON_CLASS_ID 0x0A // Monitoring messages
AstrodyneSystems 5:dc778a682d29 37 #define AID_CLASS_ID 0x0B // AssistNow Aiding
AstrodyneSystems 5:dc778a682d29 38 #define TIM_CLASS_ID 0x0D // Timing
AstrodyneSystems 5:dc778a682d29 39 #define ESF_CLASS_ID 0x10 // External Sensor Fusion
AstrodyneSystems 5:dc778a682d29 40
AstrodyneSystems 5:dc778a682d29 41
AstrodyneSystems 5:dc778a682d29 42 // Default - messages to keep
AstrodyneSystems 5:dc778a682d29 43 #define NAV_SOL 0x06 // TOWms, week, ECEF
AstrodyneSystems 5:dc778a682d29 44
AstrodyneSystems 5:dc778a682d29 45 // Turn ON some messages
AstrodyneSystems 5:dc778a682d29 46 #define NAV_SVINFO 0x30
AstrodyneSystems 5:dc778a682d29 47
AstrodyneSystems 5:dc778a682d29 48 // Turn off some default messages
AstrodyneSystems 5:dc778a682d29 49 #define NAV_POSLLH 0x02
AstrodyneSystems 5:dc778a682d29 50 #define NAV_STATUS 0x03
AstrodyneSystems 5:dc778a682d29 51 #define NAV_VELNED 0x12
AstrodyneSystems 5:dc778a682d29 52
AstrodyneSystems 5:dc778a682d29 53 #define TIM_TP 0x01
AstrodyneSystems 5:dc778a682d29 54 #define TIM_VRFY 0x06
AstrodyneSystems 5:dc778a682d29 55
AstrodyneSystems 5:dc778a682d29 56
AstrodyneSystems 5:dc778a682d29 57 extern Serial pc;
AstrodyneSystems 5:dc778a682d29 58 extern Serial gps;
AstrodyneSystems 5:dc778a682d29 59
AstrodyneSystems 5:dc778a682d29 60 void ublox_gps_callback();
AstrodyneSystems 5:dc778a682d29 61
AstrodyneSystems 5:dc778a682d29 62 #define UBLOX_BUF_SIZE 2048
AstrodyneSystems 5:dc778a682d29 63
AstrodyneSystems 5:dc778a682d29 64 // Input buffer
AstrodyneSystems 5:dc778a682d29 65 char ublox_msg_in[UBLOX_BUF_SIZE];
AstrodyneSystems 5:dc778a682d29 66 int nextin, nextout;
AstrodyneSystems 5:dc778a682d29 67
AstrodyneSystems 5:dc778a682d29 68 // Output buffer
AstrodyneSystems 5:dc778a682d29 69 char ublox_msg_out[UBLOX_BUF_SIZE];
AstrodyneSystems 5:dc778a682d29 70 char ublox_cnt;
AstrodyneSystems 5:dc778a682d29 71 char ublox_msg_out_flag;
AstrodyneSystems 5:dc778a682d29 72
AstrodyneSystems 5:dc778a682d29 73 char packetState;
AstrodyneSystems 5:dc778a682d29 74 int ublox_size;
AstrodyneSystems 5:dc778a682d29 75
AstrodyneSystems 5:dc778a682d29 76 #define UBLOX_MSG_CLASS 2 // field within msg
AstrodyneSystems 5:dc778a682d29 77 #define UBLOX_MSG_ID 3
AstrodyneSystems 5:dc778a682d29 78
AstrodyneSystems 5:dc778a682d29 79 void ubloxMsgRate(char msgclass, char id, char rate);
AstrodyneSystems 5:dc778a682d29 80 void ubloxBaudRate(void);
AstrodyneSystems 5:dc778a682d29 81
AstrodyneSystems 5:dc778a682d29 82 SCIboard_ubloxGps::SCIboard_ubloxGps() {
AstrodyneSystems 5:dc778a682d29 83 ublox_cnt = 0;
AstrodyneSystems 5:dc778a682d29 84 ublox_msg_out_flag = 0;
AstrodyneSystems 5:dc778a682d29 85 nextin=nextout=0;
AstrodyneSystems 5:dc778a682d29 86 packetState=0;
AstrodyneSystems 5:dc778a682d29 87 }
AstrodyneSystems 5:dc778a682d29 88
AstrodyneSystems 5:dc778a682d29 89 FILE *ublox_fp=NULL;
AstrodyneSystems 5:dc778a682d29 90
AstrodyneSystems 5:dc778a682d29 91 void SCIboard_ubloxGps::gps_startup(void) {
AstrodyneSystems 5:dc778a682d29 92 gps.baud(38400);
AstrodyneSystems 5:dc778a682d29 93 wait(.01);
AstrodyneSystems 5:dc778a682d29 94
AstrodyneSystems 5:dc778a682d29 95 if(ublox_fp==NULL) {
AstrodyneSystems 5:dc778a682d29 96 ublox_fp = fopen("/local/GPS.txt", "w"); // Open "GPS.txt" on the local file system for appending
AstrodyneSystems 5:dc778a682d29 97 }
AstrodyneSystems 5:dc778a682d29 98
AstrodyneSystems 5:dc778a682d29 99 // Turn off some of the default messages
AstrodyneSystems 5:dc778a682d29 100 ubloxMsgRate(TIM_CLASS_ID, TIM_TP, 0);
AstrodyneSystems 5:dc778a682d29 101 ubloxMsgRate(TIM_CLASS_ID, TIM_VRFY, 0);
AstrodyneSystems 5:dc778a682d29 102 ubloxMsgRate(NAV_CLASS_ID, NAV_VELNED, 0);
AstrodyneSystems 5:dc778a682d29 103 ubloxMsgRate(NAV_CLASS_ID, NAV_STATUS, 0);
AstrodyneSystems 5:dc778a682d29 104 ubloxMsgRate(NAV_CLASS_ID, NAV_POSLLH, 0);
AstrodyneSystems 5:dc778a682d29 105
AstrodyneSystems 5:dc778a682d29 106 // Turn on some messages
AstrodyneSystems 5:dc778a682d29 107 ubloxMsgRate(NAV_CLASS_ID, NAV_SOL, 4); // Change rate to once per second
AstrodyneSystems 5:dc778a682d29 108 ubloxMsgRate(NAV_CLASS_ID, NAV_SVINFO, 8); // Change rate to once per 2 seconds
AstrodyneSystems 5:dc778a682d29 109
AstrodyneSystems 5:dc778a682d29 110 void ubloxBaudRate(); // Drop baud rate
AstrodyneSystems 5:dc778a682d29 111
AstrodyneSystems 5:dc778a682d29 112 gps.attach(&ublox_gps_callback);
AstrodyneSystems 5:dc778a682d29 113 }
AstrodyneSystems 5:dc778a682d29 114
AstrodyneSystems 5:dc778a682d29 115 void SCIboard_ubloxGps::gps_close(void) {
AstrodyneSystems 5:dc778a682d29 116 gps.attach(NULL);
AstrodyneSystems 5:dc778a682d29 117 wait(0.01);
AstrodyneSystems 5:dc778a682d29 118
AstrodyneSystems 5:dc778a682d29 119 if(nextin) {
AstrodyneSystems 5:dc778a682d29 120 if(ublox_fp!=NULL) {
AstrodyneSystems 5:dc778a682d29 121 memcpy(ublox_msg_out, ublox_msg_in, nextin);
AstrodyneSystems 5:dc778a682d29 122 fwrite(ublox_msg_out, nextin, 1, ublox_fp);
AstrodyneSystems 5:dc778a682d29 123 }
AstrodyneSystems 5:dc778a682d29 124 nextin=0;
AstrodyneSystems 5:dc778a682d29 125 }
AstrodyneSystems 5:dc778a682d29 126
AstrodyneSystems 5:dc778a682d29 127 if(ublox_fp!=NULL) {
AstrodyneSystems 5:dc778a682d29 128 fclose(ublox_fp);
AstrodyneSystems 5:dc778a682d29 129 ublox_fp=NULL;
AstrodyneSystems 5:dc778a682d29 130 }
AstrodyneSystems 5:dc778a682d29 131 }
AstrodyneSystems 5:dc778a682d29 132
AstrodyneSystems 5:dc778a682d29 133
AstrodyneSystems 5:dc778a682d29 134 void ublox_gps_callback() {
AstrodyneSystems 5:dc778a682d29 135 // Note: you need to actually read from the serial to clear the RX interrupt
AstrodyneSystems 5:dc778a682d29 136 __disable_irq();
AstrodyneSystems 5:dc778a682d29 137 ublox_msg_in[nextin++] = gps.getc();
AstrodyneSystems 5:dc778a682d29 138 __enable_irq();
AstrodyneSystems 5:dc778a682d29 139
AstrodyneSystems 5:dc778a682d29 140 if(nextin>=sizeof(ublox_msg_in)) {
AstrodyneSystems 5:dc778a682d29 141 nextin=0;
AstrodyneSystems 5:dc778a682d29 142 if(ublox_fp!=NULL) {
AstrodyneSystems 5:dc778a682d29 143 memcpy(ublox_msg_out, ublox_msg_in, sizeof(ublox_msg_in));
AstrodyneSystems 5:dc778a682d29 144 fwrite(ublox_msg_out, sizeof(ublox_msg_out), 1, ublox_fp);
AstrodyneSystems 5:dc778a682d29 145 }
AstrodyneSystems 5:dc778a682d29 146 }
AstrodyneSystems 5:dc778a682d29 147 }
AstrodyneSystems 5:dc778a682d29 148
AstrodyneSystems 5:dc778a682d29 149
AstrodyneSystems 5:dc778a682d29 150 // Change message rate or turn off message
AstrodyneSystems 5:dc778a682d29 151 void ubloxMsgRate(char msgclass, char id, char rate) {
AstrodyneSystems 5:dc778a682d29 152 unsigned char chkA=0, chkB=0;
AstrodyneSystems 5:dc778a682d29 153 int n;
AstrodyneSystems 5:dc778a682d29 154 uint8_t buf[] = {
AstrodyneSystems 5:dc778a682d29 155 6, // CLASS: CFG
AstrodyneSystems 5:dc778a682d29 156 1, // ID: MSG
AstrodyneSystems 5:dc778a682d29 157 8, // LENGTH
AstrodyneSystems 5:dc778a682d29 158 0, // LENGTH
AstrodyneSystems 5:dc778a682d29 159 msgclass,
AstrodyneSystems 5:dc778a682d29 160 id,
AstrodyneSystems 5:dc778a682d29 161 0,
AstrodyneSystems 5:dc778a682d29 162 rate,
AstrodyneSystems 5:dc778a682d29 163 0, 0, 0, 0};
AstrodyneSystems 5:dc778a682d29 164
AstrodyneSystems 5:dc778a682d29 165 gps.putc(SYNC_CHAR_1);
AstrodyneSystems 5:dc778a682d29 166 gps.putc(SYNC_CHAR_2);
AstrodyneSystems 5:dc778a682d29 167
AstrodyneSystems 5:dc778a682d29 168 for(n=0; n<sizeof(buf); n++) {
AstrodyneSystems 5:dc778a682d29 169 gps.putc(buf[n]);
AstrodyneSystems 5:dc778a682d29 170 chkA += buf[n];
AstrodyneSystems 5:dc778a682d29 171 chkB += chkA;
AstrodyneSystems 5:dc778a682d29 172 }
AstrodyneSystems 5:dc778a682d29 173
AstrodyneSystems 5:dc778a682d29 174 gps.putc(chkA);
AstrodyneSystems 5:dc778a682d29 175 gps.putc(chkB);
AstrodyneSystems 5:dc778a682d29 176 }
AstrodyneSystems 5:dc778a682d29 177
AstrodyneSystems 5:dc778a682d29 178
AstrodyneSystems 5:dc778a682d29 179 // Change message baud rate --------------------------------
AstrodyneSystems 5:dc778a682d29 180 // Baud rate divisors
AstrodyneSystems 5:dc778a682d29 181 // 0, 0, 0x96, 0 // 38,400
AstrodyneSystems 5:dc778a682d29 182 // 0, 0, 0x4B, 0 // 19,200
AstrodyneSystems 5:dc778a682d29 183 // 0, 0x80, 0x25, 0 // 9,600
AstrodyneSystems 5:dc778a682d29 184 // 0, 0xC0, 0x12, 0 // 4,800
AstrodyneSystems 5:dc778a682d29 185
AstrodyneSystems 5:dc778a682d29 186 void ubloxBaudRate(void) {
AstrodyneSystems 5:dc778a682d29 187 unsigned char chkA=0, chkB=0;
AstrodyneSystems 5:dc778a682d29 188 int n;
AstrodyneSystems 5:dc778a682d29 189 uint8_t buf[] = {
AstrodyneSystems 5:dc778a682d29 190 6, 0, // CLASS/id: CFG-PRT
AstrodyneSystems 5:dc778a682d29 191 0x14, 0, // LENGTH
AstrodyneSystems 5:dc778a682d29 192 01, 0,
AstrodyneSystems 5:dc778a682d29 193 0, 0, 0xD0, 8, 0, 0, 0xC0, 0x12,
AstrodyneSystems 5:dc778a682d29 194 0, 0, 7, 0, 1, 0, 0, 0,
AstrodyneSystems 5:dc778a682d29 195 0, 0};
AstrodyneSystems 5:dc778a682d29 196
AstrodyneSystems 5:dc778a682d29 197 gps.putc(SYNC_CHAR_1);
AstrodyneSystems 5:dc778a682d29 198 gps.putc(SYNC_CHAR_2);
AstrodyneSystems 5:dc778a682d29 199
AstrodyneSystems 5:dc778a682d29 200 for(n=0; n<sizeof(buf); n++) {
AstrodyneSystems 5:dc778a682d29 201 gps.putc(buf[n]);
AstrodyneSystems 5:dc778a682d29 202 chkA += buf[n];
AstrodyneSystems 5:dc778a682d29 203 chkB += chkA;
AstrodyneSystems 5:dc778a682d29 204 }
AstrodyneSystems 5:dc778a682d29 205
AstrodyneSystems 5:dc778a682d29 206 gps.putc(chkA);
AstrodyneSystems 5:dc778a682d29 207 gps.putc(chkB);
AstrodyneSystems 5:dc778a682d29 208
AstrodyneSystems 5:dc778a682d29 209 wait(.500);
AstrodyneSystems 5:dc778a682d29 210 gps.baud(4800);
AstrodyneSystems 5:dc778a682d29 211 }