Compare commits

..

5 commits

25 changed files with 98 additions and 3507 deletions

View file

@ -1,5 +1,3 @@
For more extensive documentation, refer to the [Docs Site](https://docs.pyroballpcbs.com) (source included in this repository)
Presenting... Presenting...
--- ---
@ -24,7 +22,7 @@ Well, yeah a couple. The sensor requires introducing a small amount of physical
### How do I use it? ### How do I use it?
I designed the sensor to connect to a 3D Printer's controller like any other endstop or Z-Probe. The sensor also includes an i2c interface that will allow the 3D Printer's controller to change parameters on the fly depending on the use-case. I designed the sensor to connect to a 3D Printer's controller like any other endstop or Z-Probe. Future versions will have an i2c interface that will allow the 3D Printer's controller to change parameters on the fly during a print or before a fast move.
The piezo element is mounted somewhere on the 3D Printer in such a way that it undergoes mechanical stress when the nozzle touches the bed. So far there have been three distinct mounting schemes that appear to work well: The piezo element is mounted somewhere on the 3D Printer in such a way that it undergoes mechanical stress when the nozzle touches the bed. So far there have been three distinct mounting schemes that appear to work well:

View file

@ -2,58 +2,14 @@
**A:** Pyr0-Piezo refers to the circuit that utilizes Piezoelectric Elements to perform auto bed leveling on 3d Printers, while the EasyPiezi is a standalone board dedicated to carrying this circuit. The Pyr0-Piezo circuit can be integrated into other boards and designs, such as the Pyr0-Piezo FFC. **A:** Pyr0-Piezo refers to the circuit that utilizes Piezoelectric Elements to perform auto bed leveling on 3d Printers, while the EasyPiezi is a standalone board dedicated to carrying this circuit. The Pyr0-Piezo circuit can be integrated into other boards and designs, such as the Pyr0-Piezo FFC.
---
**Q:** What's the difference between the EasyPiezi and the Pyr0-Piezo FFC? **Q:** What's the difference between the EasyPiezi and the Pyr0-Piezo FFC?
**A:** The Pyr0-Piezo FFC allows the user to replace their existing bulky cable chain with a [Flexible Flat Cables](https://en.wikipedia.org/wiki/Flexible_flat_cable), while also incorporating the Pyr0-Piezo Z-Probe circuit, fan voltage regulation, motor driver protection diodes, and visual feedback LED's **A:** The Pyr0-Piezo FFC allows the user to replace their existing bulky cable chain with a [Flexible Flat Cables](https://en.wikipedia.org/wiki/Flexible_flat_cable), while also incorporating the Pyr0-Piezo Z-Probe circuit, fan voltage regulation, motor driver protection diodes, and visual feedback LED's
---
**Q:** Does this sensor support 3.3v logic controllers? **Q:** Does this sensor support 3.3v logic controllers?
**A:** Yes, if you bought a production (v2.3.0 or later) board, the logic level of the circuit is configurable to be either 5v or 3.3v. For pre-production (beta) boards, this is possible by following [this guide](tutorials/wiring/easy-piezi/unregulated-operation/) **A:** Yes, if you bought a production (v2.3.0 or later) board, the logic level of the circuit is configurable to be either 5v or 3.3v. For pre-production (beta) boards, this is possible by following [this guide](tutorials/wiring/easy-piezi/unregulated-operation/)
---
**Q:** Is it required to use the SingleDisk Piezo Adapters? **Q:** Is it required to use the SingleDisk Piezo Adapters?
**A:** No. the SingleDisk adapter board is simply a carrier for a 12mm piezo disk that has the dual benefit of maximizing signal-to-noise ratio, and providing a consistent mounting scheme. All that's required is a piezelectric element that has positive and negative rails that can be connected to the Pyr0-Piezo circuit. **A:** No. the SingleDisk adapter board is simply a carrier for a 12mm piezo disk that has the dual benefit of maximizing signal-to-noise ratio, and providing a consistent mounting scheme. All that's required is a piezelectric element that has positive and negative rails that can be connected to the Pyr0-Piezo circuit.
---
**Q:** Will the sensor work if it experiences constant spring pressure?
**A:** Yes! You can even pre-tension the piezo and pick up the "relief" motion if you hook it up backwards
---
**Q:** Why don't you offer drilled piezo disks or use them in your designs?
**A:** You can certainly use drilled disk and make it work with the Pyr0-Piezo, but I don't recommend using drilled discs. You'll get much more consistent results by bending the disk across it's diametric center by allowing one side of the disk to be free moving, and the other statically mounted. The SingleDisk Adapter PCB uses 12mm disks and produces the same signal to noise ratio as a 27mm drilled disk. You can find those [in the shop](https://pyroballpcbs.com/product/pp-singledisk-adapter-pcb/), or you can use the sources in the hardware section of [this repository](https://github.com/pyr0ball/pyr0piezo) to send out to JLC or another fab house if you'd like to build your own.
---
**Q:** How does heat affect the performance and / or lifespan of the sensors?
**A:** Piezo elements have a particular behavior when it comes to heat, which is that their sensitivity is reduced as more heat is applied. That signal degradation is partially elastic, partially plastic. An analogy that fits is bending a piece of wire. If you deflect a copper wire a small amount, it will return to its original shape, which is an "elastic deformation", but if you bend it further, it will stay in it's deflected state, which is a "plastic deformation". The piezo elements' signal output has a similar effect with heat. After a certain temperature, the signal suppression becomes permanent, but below that threshold, it's elastic. That threshold is different between all elements, so you'll have to test with the ones you've got to find out how much heat they can take.
There's a couple of ways do account for this. The Pyr0-Piezo has the ability to increase it's input signal gain on the fly, so even if the signal from your piezo elements is suppressed, it can be boosted by the sensor to a certain extent. It's also possible to increase the gain beyond the 11x limit of the software, but that would require changing a resistor on the board. If your particular setup requires a higher input gain, and you don't want to do your own modifications, I can rework a unit for you upon request.
Another way to address that issue is to migrate the piezo elements to another location that's still mechanically actuated by the nozzle touching the bed, like under the bed mount screws/springs, or by sandwiching an element between the X/Y gantry carriages of the printer.
---
**Q:** Why is center of my print bed leveling differently than the edges?
**A:** Likely the print bed is too flexible, and is bowing during probing. You may need to add a rigid frame, or an additional plate to increase the rigidity of the bed. Combining several piezo elements under the bed, and on the print-head can also partially mitigate this issue.
---
**Q:** Does filament ooze effect my probing?
**A:** It does! Theres a few ways to handle ooze while probing:
- Add a nozzle cleaning routine to your printer's startup behavior (or to the G29/ABL function alone)
- Account for the offset with `Z-OFFSET` in your printer's configuration
- Only probe with the bed at full temperature, and the nozzle below the glass-transition temperature of the filament

View file

@ -133,7 +133,7 @@ Use case for adjusting `VCOMP`:
**Trigger Duration** **Trigger Duration**
The Trigger duration, governed by the `TRG_D` setting, determines the length of the pulse sent to the printer's control board. Too short of a signal might not be registered by the controller, but too long can interfere with the ADC calculations of the sensor's firmware. The Trigger duration, governed by the `TRG_D` setting, determines the length of the pulse sent to the printer's control board. Too short of a signal might not be registered by the controller, but too long can interfere with the ADC calculations of the firmware.
**Loop Duration** **Loop Duration**
@ -145,16 +145,6 @@ The hysteresis value, governed by the `HYST` setting, is a variable used in the
**Volt Meter Multiplier Constant** **Volt Meter Multiplier Constant**
The section below is still relevant, but the process for adjusting this setting is now simplified. Simply take a voltmeter measurement from the output of the regulator (or the side of the Zener Diode with the line across it) and input the measurement with `VCCADJUST`
Example:
Measured input voltage is 5.12v
```serial
VCCADJUST 5120
```
The Voltage Multiplier Constant, governed by the `CONST` setting, is a value used in the software to accurately determine the microcontroller's input voltage. However, due to minor differences in each chip, this value may not be completely accurate for each individual board. Usually the amount of difference is so minor as to not make much of a difference, but if desired, the end-user can adjust this constant value by using the following: The Voltage Multiplier Constant, governed by the `CONST` setting, is a value used in the software to accurately determine the microcontroller's input voltage. However, due to minor differences in each chip, this value may not be completely accurate for each individual board. Usually the amount of difference is so minor as to not make much of a difference, but if desired, the end-user can adjust this constant value by using the following:
`scale_constant = internal1.1Ref * 1023 * 1000` `scale_constant = internal1.1Ref * 1023 * 1000`

View file

@ -55,9 +55,7 @@ board = ATmega328PB
framework = arduino framework = arduino
lib_deps = Arduino lib_deps = Arduino
build_flags = build_flags = !python version_git.py
!python version_git.py
-Wl,-Map,output.map
; --verbose ; --verbose
upload_protocol = arduino upload_protocol = arduino

View file

@ -15,7 +15,7 @@
* PB7 PCINT7 (Gain Adjustment Resistor 1 'D21') * PB7 PCINT7 (Gain Adjustment Resistor 1 'D21')
* PD5 T1 (Gain Adjustment Resistor 2 'D5') * PD5 T1 (Gain Adjustment Resistor 2 'D5')
* PD6 PCINT22 (Gain Adjustment Resistor 3 'D6') * PD6 PCINT22 (Gain Adjustment Resistor 3 'D6')
* PB0 PCINT0 (VCC Adjustment Resistors 'D8') * PB0 PCINT0 (Signal voltage Adjustment Resistors 'D8')
* PB1 OC1A (Comparator VRef PWM Out 'D9') * PB1 OC1A (Comparator VRef PWM Out 'D9')
* PD3 OC2B (Voltage Follower VRef PWM Out 'D3') * PD3 OC2B (Voltage Follower VRef PWM Out 'D3')
@ -37,7 +37,7 @@ To change trigger active duration: TRG_D [integer for milliseconds]
To change gain factor: GAIN_F [integer for gain state - see note*] To change gain factor: GAIN_F [integer for gain state - see note*]
To change the output logic: LOGIC [0|1] (0 for active low, 1 for active high) To change the output logic: LOGIC [0|1] (0 for active low, 1 for active high)
To enable piezo plugged detection: PZDET [0|1] (0 for disabled, 1 for enabled) To enable piezo plugged detection: PZDET [0|1] (0 for disabled, 1 for enabled)
To set the sensor's output voltage: VCCSW [0|1] (0 for 3.3v, 1 for 5v) To set the sensor's output voltage: SIGVOL [0|1] (0 for 3.3v, 1 for 5v)
To change ADC hysteresis value: HYST [integer in millivolts] To change ADC hysteresis value: HYST [integer in millivolts]
To change sensor input pullup vRef low threshold: VFOL [integer in millivolts] To change sensor input pullup vRef low threshold: VFOL [integer in millivolts]
To change comparator trigger high threshold: VCOMP [integer in millivolts] To change comparator trigger high threshold: VCOMP [integer in millivolts]
@ -91,12 +91,13 @@ update the voltMeterConstant variable in pP_config.h with the correct value
// Headers, variables, and functions // Headers, variables, and functions
#include "LightChrono.h" #include "LightChrono.h"
#include "pP_pins.h"
#include <Arduino.h>
#include <EEPROM.h>
#include "pP_function.h" #include "pP_function.h"
#include "pP_i2c.hpp" #include "pP_i2c.hpp"
#include "pP_pins.h"
#include "pP_serial.h" #include "pP_serial.h"
#include "pP_volatile.h" #include "pP_volatile.h"
#include <Arduino.h>
void setup() { void setup() {
// Setup PWM on voltage follower (PD3) // Setup PWM on voltage follower (PD3)
@ -125,9 +126,9 @@ void setup() {
Serial.begin(9600); Serial.begin(9600);
Serial.print("Pyr0-Piezo Z-Probe Firmware "); Serial.print("Pyr0-Piezo Z-Probe Firmware ");
Serial.println(PP_VERSION); Serial.println(PP_VERSION);
Serial.println("Info: https://docs.pyroballpcbs.com"); //Serial.println("Info: https://docs.pyroballpcbs.com");
Serial.println("Source: https://github.com/pyr0ball/pyr0piezo"); //Serial.println("Source: https://github.com/pyr0ball/pyr0piezo");
Serial.println("Initializing Pyr0-Piezo Sensor..."); //Serial.println("Initializing Pyr0-Piezo Sensor...");
i2cInit(); i2cInit();
@ -135,7 +136,7 @@ void setup() {
adjustGain(); adjustGain();
adjustVcc(); adjustSigVol();
digitalWriteFast(TRG_OUT, !LOGIC); digitalWriteFast(TRG_OUT, !LOGIC);
} }
@ -145,6 +146,13 @@ void setup() {
void loop() { void loop() {
if (mainLoop.hasPassed(LOOP_DUR)) { if (mainLoop.hasPassed(LOOP_DUR)) {
mainLoop.restart(); mainLoop.restart();
// Blink LED's on init
if (BlinkCount > 0) {
BlinkState = !BlinkState;
digitalWriteFast(ERR_LED, BlinkState);
// digitalWriteFast(TRG_OUT, BlinkState);
--BlinkCount;
}
// Get Serial Input // Get Serial Input
serialInput(); serialInput();
@ -158,7 +166,7 @@ void loop() {
adjustGain(); adjustGain();
// Set the VCC input switch // Set the VCC input switch
adjustVcc(); adjustSigVol();
// Check voltage of first and second stages and compare against thresholds // Check voltage of first and second stages and compare against thresholds
readVin(); readVin();
@ -180,21 +188,25 @@ void loop() {
// Check that the piezo disk is properly connected // Check that the piezo disk is properly connected
pzConCheck(); pzConCheck();
// Blink LED's on init
if (BlinkCount > 0) {
BlinkState = !BlinkState;
digitalWriteFast(ERR_LED, BlinkState);
// digitalWriteFast(TRG_OUT, BlinkState);
--BlinkCount;
// } else {
// Check for error state
// checkError();
} else {
digitalWriteFast(ERR_LED, 0);
}
// Print state if debug is on // Print state if debug is on
if (Debug > 0) { if (Debug > 0) {
serialPrintState(); serialPrintState();
} }
} // Sets trigger output state to false after completing loop
// digitalWriteFast(TRG_OUT, HIGH);
// Blink LED sensorHReading = 0;
if (blinkLoop.hasPassed(BLINK_DURATION) && BlinkCount > 0) {
blinkLoop.restart();
BlinkCount--;
digitalWriteFast(ERR_LED, BlinkCount % 2);
}
if (lastTriggerTimestamp > 0 && millis() - lastTriggerTimestamp > TRG_DUR) {
digitalWriteFast(TRG_OUT, !LOGIC);
lastTriggerTimestamp = 0;
} }
} }

View file

@ -81,10 +81,10 @@ void updatePzDet(int value) {
/*------------------------------------------------*/ /*------------------------------------------------*/
void updateVccSwitch(int value) { void updateSigVoltage(int value) {
if (value >= 0) { if (value >= 0) {
VCCSW = value; SIGVOL = value;
EEPROM.put(VCCSW_ADDRESS, VCCSW); EEPROM.put(SIGVOL_ADDRESS, SIGVOL);
} }
} }

View file

@ -9,7 +9,7 @@ void updateTrigDuration(int value);
void updateHysteresis(int value); void updateHysteresis(int value);
void updateLogic(int value); void updateLogic(int value);
void updatePzDet(int value); void updatePzDet(int value);
void updateVccSwitch(int value); void updateSigVoltage(int value);
void updateConstant(long value); void updateConstant(long value);
void adjustConstant(int value); void adjustConstant(int value);
void updateDebug(int value); void updateDebug(int value);

View file

@ -10,7 +10,7 @@ int TRG_DUR = TRG_DUR_DEFAULT;
int Hyst = HYST_DEFAULT; int Hyst = HYST_DEFAULT;
int LOGIC = LOGIC_DEFAULT; int LOGIC = LOGIC_DEFAULT;
int PZDET = PZDET_DEFAULT; int PZDET = PZDET_DEFAULT;
int VCCSW = VCCSW_DEFAULT; int SIGVOL = SIGVOL_DEFAULT;
int Debug = 0; int Debug = 0;
long voltMeterConstant = VM_CONST_DEFAULT; long voltMeterConstant = VM_CONST_DEFAULT;
uint8_t pP_i2c_address = 0x10; uint8_t pP_i2c_address = 0x10;
@ -29,7 +29,7 @@ void eraseEEPROM() {
EEPROM.put(HYST_ADDRESS, Hyst); EEPROM.put(HYST_ADDRESS, Hyst);
EEPROM.put(PZDET_ADDRESS, PZDET); EEPROM.put(PZDET_ADDRESS, PZDET);
EEPROM.put(LOGIC_ADDRESS, LOGIC); EEPROM.put(LOGIC_ADDRESS, LOGIC);
EEPROM.put(VCCSW_ADDRESS, VCCSW); EEPROM.put(SIGVOL_ADDRESS, SIGVOL);
EEPROM.put(VM_CONST_ADDRESS, voltMeterConstant); EEPROM.put(VM_CONST_ADDRESS, voltMeterConstant);
} }
@ -97,11 +97,11 @@ void restoreConfig() {
LOGIC = temp; LOGIC = temp;
} }
EEPROM.get(VCCSW_ADDRESS, temp); EEPROM.get(SIGVOL_ADDRESS, temp);
if (temp < 0 || temp > 1) { if (temp < 0 || temp > 1) {
erase = true; erase = true;
} else { } else {
VCCSW = temp; SIGVOL = temp;
} }
long longTemp; long longTemp;
@ -131,7 +131,7 @@ void setDefaultConfig() {
Hyst = HYST_DEFAULT; Hyst = HYST_DEFAULT;
PZDET = PZDET_DEFAULT; PZDET = PZDET_DEFAULT;
LOGIC = LOGIC_DEFAULT; LOGIC = LOGIC_DEFAULT;
VCCSW = VCCSW_DEFAULT; SIGVOL = SIGVOL_DEFAULT;
voltMeterConstant = VM_CONST_DEFAULT; voltMeterConstant = VM_CONST_DEFAULT;
adjustFollow(); adjustFollow();
adjustComp(); adjustComp();

View file

@ -41,9 +41,9 @@ extern int LOGIC; // Trigger logic scheme, Active LOW is default
#define PZDET_ADDRESS 26 #define PZDET_ADDRESS 26
extern int PZDET; // Enable or disable piezo connection detection, default is off extern int PZDET; // Enable or disable piezo connection detection, default is off
#define VCCSW_DEFAULT 1 #define SIGVOL_DEFAULT 1
#define VCCSW_ADDRESS 28 #define SIGVOL_ADDRESS 28
extern int VCCSW; // Set the signal output to 3.3v [0] or 5v logic [1] extern int SIGVOL; // Set the signal output to 3.3v [0] or 5v logic [1]
extern int Debug; extern int Debug;
@ -58,8 +58,6 @@ extern uint8_t pP_i2c_address;
#define PP_VERSION "2.3.2" #define PP_VERSION "2.3.2"
#endif // PP_VERSION fallback if python script fails #endif // PP_VERSION fallback if python script fails
#define BLINK_DURATION 100
void eraseEEPROM(); void eraseEEPROM();
void setDefaultConfig(); void setDefaultConfig();
void restoreConfig(); void restoreConfig();

View file

@ -38,12 +38,12 @@ void doubleFlash() {
/*------------------------------------------------*/ /*------------------------------------------------*/
void pulse() { void pulse() {
if (lastTriggerTimestamp == 0) { digitalWriteFast(TRG_OUT, LOGIC);
digitalWriteFast(TRG_OUT, LOGIC); sensorHReading = 1;
Serial.println("Trig'd!"); delay(TRG_DUR);
doubleFlash(); digitalWriteFast(TRG_OUT, !LOGIC);
lastTriggerTimestamp = millis(); Serial.println("Trig'd!");
} doubleFlash();
} }
/*------------------------------------------------*/ /*------------------------------------------------*/
@ -177,15 +177,15 @@ void adjustGain() {
/*------------------------------------------------*/ /*------------------------------------------------*/
void adjustVcc() { void adjustSigVol() {
switch (VCCSW) { switch (SIGVOL) {
case 0: case 0:
pinMode(VCCSW_PIN, OUTPUT); pinMode(SIGVOL_PIN, OUTPUT);
digitalWriteFast(VCCSW_PIN, LOW); digitalWriteFast(SIGVOL_PIN, LOW);
break; break;
case 1: case 1:
default: default:
pinMode(VCCSW_PIN, INPUT); pinMode(SIGVOL_PIN, INPUT);
break; break;
} }
} }

View file

@ -19,7 +19,7 @@ long readVcc();
void readVin(); void readVin();
void adjustFollow(); void adjustFollow();
void adjustComp(); void adjustComp();
void adjustVcc(); void adjustSigVol();
void calibrateAlert(); void calibrateAlert();
void adjustGain(); void adjustGain();
void pzConCheck(); void pzConCheck();

View file

@ -38,7 +38,7 @@ void i2cReportConfig() {
i2cWrite(buffer, 10, Hyst); i2cWrite(buffer, 10, Hyst);
i2cWrite(buffer, 12, LOGIC); i2cWrite(buffer, 12, LOGIC);
i2cWrite(buffer, 14, PZDET); i2cWrite(buffer, 14, PZDET);
i2cWrite(buffer, 16, VCCSW); i2cWrite(buffer, 16, SIGVOL);
i2cWrite(buffer, 18, voltMeterConstant); i2cWrite(buffer, 18, voltMeterConstant);
memcpy(buffer + 22, PP_VERSION, length - 22); memcpy(buffer + 22, PP_VERSION, length - 22);
#ifdef __AVR_ATmega328P__ #ifdef __AVR_ATmega328P__
@ -142,8 +142,8 @@ void i2cInput(int bytesReceived) {
break; break;
case CMD_STATE: case CMD_STATE:
break; break;
case CMD_VCCSW: case CMD_SIGVOL:
updateVccSwitch(value); updateSigVoltage(value);
break; break;
case CMD_VCCADJUST: case CMD_VCCADJUST:
adjustConstant(value); adjustConstant(value);

View file

@ -10,5 +10,5 @@
#define CMD_CONFIG 0x09 #define CMD_CONFIG 0x09
#define CMD_ERASE 0x0a #define CMD_ERASE 0x0a
#define CMD_STATE 0x0b #define CMD_STATE 0x0b
#define CMD_VCCSW 0x0c #define CMD_SIGVOL 0x0c
#define CMD_VCCADJUST 0x0d #define CMD_VCCADJUST 0x0d

View file

@ -33,7 +33,7 @@ Default pins (based on Rev.2.x.xPCB layout)
#define V_FOL_PWM 3 // PWM analog output pin for voltage follower adjustment #define V_FOL_PWM 3 // PWM analog output pin for voltage follower adjustment
#define VCOMP_PWM 9 // PWM analog output pin for comparator adjustment #define VCOMP_PWM 9 // PWM analog output pin for comparator adjustment
#define PZDET_PIN 16 // Digital input pin for detecting piezo connection #define PZDET_PIN 16 // Digital input pin for detecting piezo connection
#define VCCSW_PIN 8 // VCC variable regulator switch pin #define SIGVOL_PIN 8 // VCC variable regulator switch pin
#endif //__AVR_ATmega328PB__ #endif //__AVR_ATmega328PB__
@ -55,6 +55,6 @@ Default pins (based on Rev.2.x.xPCB layout)
#define V_FOL_PWM 3 // PD3 PWM analog output pin for voltage follower adjustment #define V_FOL_PWM 3 // PD3 PWM analog output pin for voltage follower adjustment
#define VCOMP_PWM 9 // PB1 PWM analog output pin for comparator adjustment #define VCOMP_PWM 9 // PB1 PWM analog output pin for comparator adjustment
#define PZDET_PIN 16 // PC2 Digital input pin for detecting piezo connection #define PZDET_PIN 16 // PC2 Digital input pin for detecting piezo connection
#define VCCSW_PIN 8 // PB0 VCC variable regulator switch pin #define SIGVOL_PIN 8 // PB0 VCC variable regulator switch pin
#endif //__AVR_ATmega328P__ #endif //__AVR_ATmega328P__

View file

@ -1,7 +1,6 @@
#include "pP_cmd.h" #include "pP_cmd.h"
#include "pP_volatile.h" #include "pP_volatile.h"
#include "string.h" #include "string.h"
#include "Arduino.h"
void parseData() { void parseData() {
@ -82,9 +81,9 @@ void serialPrintConfig() {
Serial.print("PZDET "); Serial.print("PZDET ");
Serial.println(PZDET); Serial.println(PZDET);
Serial.print("VCCSW "); Serial.print("SIGVOL ");
Serial.print(VCCSW); Serial.print(SIGVOL);
switch (VCCSW) { switch (SIGVOL) {
case 0: case 0:
Serial.println(" 3.3v"); Serial.println(" 3.3v");
break; break;
@ -147,8 +146,8 @@ void updateParams() {
updateLogic(serialLong); updateLogic(serialLong);
} else if (strcmp(serialMessageIn, "PZDET") == 0) { } else if (strcmp(serialMessageIn, "PZDET") == 0) {
updatePzDet(serialLong); updatePzDet(serialLong);
} else if (strcmp(serialMessageIn, "VCCSW") == 0) { } else if (strcmp(serialMessageIn, "SIGVOL") == 0) {
updateVccSwitch(serialLong); updateSigVoltage(serialLong);
} else if (strcmp(serialMessageIn, "CONST") == 0) { } else if (strcmp(serialMessageIn, "CONST") == 0) {
updateConstant(serialLong); updateConstant(serialLong);
} else if (strcmp(serialMessageIn, "VCCADJUST") == 0) { } else if (strcmp(serialMessageIn, "VCCADJUST") == 0) {
@ -163,7 +162,7 @@ void updateParams() {
} else if (strcmp(serialMessageIn, "STATE") == 0) { } else if (strcmp(serialMessageIn, "STATE") == 0) {
serialPrintState(); serialPrintState();
} else if (strcmp(serialMessageIn, "HELP") == 0) { } else if (strcmp(serialMessageIn, "HELP") == 0) {
#if defined(ARDUINO_AVR_ATmega328PBA) #if defined(ARDUINO_AVR_ATmega328PB)
Serial.println("To change gain factor: GAIN_F [integer for gain state - see note*]"); Serial.println("To change gain factor: GAIN_F [integer for gain state - see note*]");
Serial.println("To change voltage follower voltage (low threshold): VFOL [float value]"); Serial.println("To change voltage follower voltage (low threshold): VFOL [float value]");
Serial.println("To change comparator voltage (high threshold): VCOMP [float value]"); Serial.println("To change comparator voltage (high threshold): VCOMP [float value]");
@ -173,7 +172,7 @@ void updateParams() {
Serial.println(" (0 for active low, 1 for active high)"); Serial.println(" (0 for active low, 1 for active high)");
Serial.println("To enable piezo plugged detection: PZDET [0|1]"); Serial.println("To enable piezo plugged detection: PZDET [0|1]");
Serial.println(" (0 for disabled, 1 for enabled)"); Serial.println(" (0 for disabled, 1 for enabled)");
Serial.println("To change the main voltage of the circuit: VCCSW [0|1]"); Serial.println("To change the main voltage of the circuit: SIGVOL [0|1]");
Serial.println(" (0 for 3.3v, 1 for 5v)"); Serial.println(" (0 for 3.3v, 1 for 5v)");
Serial.println("To change ADC hysteresis value: HYST [integer in millivolts]"); Serial.println("To change ADC hysteresis value: HYST [integer in millivolts]");
Serial.println("To adjust VCC voltage readings: VCCADJUST [integer in millivolts, use value from multimeter]"); Serial.println("To adjust VCC voltage readings: VCCADJUST [integer in millivolts, use value from multimeter]");

View file

@ -3,6 +3,7 @@
#include "stdint.h" #include "stdint.h"
// these variables will change on their own. Do not edit ANYTHING below this line // these variables will change on their own. Do not edit ANYTHING below this line
volatile int sensorHReading = 0; // variable to store the value read from the sensor pin
volatile int ADJ_FOLLOW = 0; // Variable for Follower adjustment volatile int ADJ_FOLLOW = 0; // Variable for Follower adjustment
volatile int ADJ_COMP = 0; // Variable for Comparator adjustment volatile int ADJ_COMP = 0; // Variable for Comparator adjustment
volatile int ERR_STATE = 0; volatile int ERR_STATE = 0;
@ -27,7 +28,8 @@ int VFol = 0;
// Error blink parameters // Error blink parameters
int BlinkCount = InitCount * 2; // Multiply Blink count by 2 to handle toggle state int BlinkState = 0;
int BlinkCount = (InitCount * 2) + 1; // Multiply Blink count by 2 to handle toggle state, add one extra to make sure light is on after
// Serial Input Parsing Variables // Serial Input Parsing Variables
char inputBuffer[buffSize]; char inputBuffer[buffSize];
@ -36,7 +38,4 @@ bool serialIncoming = false;
char serialMessageIn[buffSize] = {0}; char serialMessageIn[buffSize] = {0};
long serialLong = 0; long serialLong = 0;
long lastTriggerTimestamp = 0; LightChrono mainLoop;
LightChrono mainLoop;
LightChrono blinkLoop;

View file

@ -5,8 +5,9 @@
#include "stdint.h" #include "stdint.h"
// these variables will change on their own. Do not edit ANYTHING below this line // these variables will change on their own. Do not edit ANYTHING below this line
extern volatile int ADJ_FOLLOW; // Variable for Follower adjustment extern volatile int sensorHReading; // variable to store the value read from the sensor pin
extern volatile int ADJ_COMP; // Variable for Comparator adjustment extern volatile int ADJ_FOLLOW; // Variable for Follower adjustment
extern volatile int ADJ_COMP; // Variable for Comparator adjustment
extern volatile int ERR_STATE; extern volatile int ERR_STATE;
extern volatile int PZ_STATE; extern volatile int PZ_STATE;
@ -29,7 +30,8 @@ extern int VFol;
// Error blink parameters // Error blink parameters
extern int BlinkCount; // Multiply Blink count by 2 to handle toggle state, subtract one to make sure light is on after extern int BlinkState;
extern int BlinkCount; // Multiply Blink count by 2 to handle toggle state, add one extra to make sure light is on after
// Serial Input Parsing Variables // Serial Input Parsing Variables
#define buffSize 40 #define buffSize 40
@ -40,13 +42,10 @@ extern bool serialIncoming;
extern char serialMessageIn[buffSize]; extern char serialMessageIn[buffSize];
extern long serialLong; extern long serialLong;
extern long lastTriggerTimestamp;
//#define LOW 0 //#define LOW 0
//#define HIGH 1 //#define HIGH 1
// Task scheduler instances // Task scheduler instances
extern LightChrono mainLoop; extern LightChrono mainLoop;
extern LightChrono blinkLoop;
#endif // PP_VOLATILE_H #endif // PP_VOLATILE_H

View file

@ -56,7 +56,7 @@ config_t requestConfig() {
config.Hyst = read16(); config.Hyst = read16();
config.LOGIC = read16(); config.LOGIC = read16();
config.PZDET = read16(); config.PZDET = read16();
config.VCCSW = read16(); config.SIGVOL = read16();
config.voltMeterConstant = read32(); config.voltMeterConstant = read32();
config.version = Wire.readString(); config.version = Wire.readString();

View file

@ -15,7 +15,7 @@
#define CMD_CONFIG 0x09 #define CMD_CONFIG 0x09
#define CMD_ERASE 0x0a #define CMD_ERASE 0x0a
#define CMD_STATE 0x0b #define CMD_STATE 0x0b
#define CMD_VCCSW 0x0c #define CMD_SIGVOL 0x0c
#define CMD_VCCADJUST 0x0d #define CMD_VCCADJUST 0x0d
#include "WString.h" #include "WString.h"
@ -29,7 +29,7 @@ typedef struct {
uint16_t Hyst; uint16_t Hyst;
uint16_t LOGIC; uint16_t LOGIC;
uint16_t PZDET; uint16_t PZDET;
uint16_t VCCSW; uint16_t SIGVOL;
uint32_t voltMeterConstant; uint32_t voltMeterConstant;
String version; String version;
} config_t; } config_t;

View file

@ -90,9 +90,9 @@ void serialPrintConfig() {
Serial.print("PZDET "); Serial.print("PZDET ");
Serial.println(config.PZDET); Serial.println(config.PZDET);
Serial.print("VCCSW "); Serial.print("SIGVOL ");
Serial.print(config.VCCSW); Serial.print(config.SIGVOL);
switch (config.VCCSW) { switch (config.SIGVOL) {
case 0: case 0:
Serial.println(" 3.3v"); Serial.println(" 3.3v");
break; break;
@ -157,8 +157,8 @@ void updateParams() {
write(CMD_LOGIC, (uint16_t)serialLong); write(CMD_LOGIC, (uint16_t)serialLong);
} else if (strcmp(serialMessageIn, "PZDET") == 0) { } else if (strcmp(serialMessageIn, "PZDET") == 0) {
write(CMD_PZDET, (uint16_t)serialLong); write(CMD_PZDET, (uint16_t)serialLong);
} else if (strcmp(serialMessageIn, "VCCSW") == 0) { } else if (strcmp(serialMessageIn, "SIGVOL") == 0) {
write(CMD_VCCSW, (uint16_t)serialLong); write(CMD_SIGVOL, (uint16_t)serialLong);
} else if (strcmp(serialMessageIn, "CONST") == 0) { } else if (strcmp(serialMessageIn, "CONST") == 0) {
write(CMD_CONST, serialLong); write(CMD_CONST, serialLong);
} else if (strcmp(serialMessageIn, "VCCADJUST") == 0) { } else if (strcmp(serialMessageIn, "VCCADJUST") == 0) {
@ -181,7 +181,7 @@ void updateParams() {
Serial.println(" (0 for active low, 1 for active high)"); Serial.println(" (0 for active low, 1 for active high)");
Serial.println("To enable piezo plugged detection: PZDET [0|1]"); Serial.println("To enable piezo plugged detection: PZDET [0|1]");
Serial.println(" (0 for disabled, 1 for enabled)"); Serial.println(" (0 for disabled, 1 for enabled)");
Serial.println("To change the main voltage of the circuit: VCCSW [0|1]"); Serial.println("To change the main voltage of the circuit: SIGVOL [0|1]");
Serial.println(" (0 for 3.3v, 1 for 5v)"); Serial.println(" (0 for 3.3v, 1 for 5v)");
Serial.println("To change ADC hysteresis value: HYST [integer in millivolts]"); Serial.println("To change ADC hysteresis value: HYST [integer in millivolts]");
Serial.println("To adjust VCC voltage readings: VCCADJUST [integer in millivolts, use value from multimeter]"); Serial.println("To adjust VCC voltage readings: VCCADJUST [integer in millivolts, use value from multimeter]");

View file

@ -1,869 +0,0 @@
:100000000C9497000C94CA0C0C94A30C0C94BF0095
:100010000C94BF000C94BF000C94BF000C94BF0064
:100020000C94BF000C94BF000C94BF000C94BF0054
:100030000C94BF000C94BF000C94BF000C94BF0044
:100040000C94590C0C94BF000C94170D0C94F10CEB
:100050000C94BF000C94BF000C94BF000C94BF0024
:100060000C94690E0C94BF000C94BF000C94BF005C
:100070000C94BF000C94BF000C94BF000C94BF0004
:100080000C94BF000C94BF000C94BF000C94BF00F4
:100090000C94BF000C94BF000C94BF000C94BF00E4
:1000A0000C94490D0C94BF000C94BF000C94BF003D
:1000B0000C94BF00000000002300260029002C0043
:1000C00000000000240027002A002D00000000008E
:1000D000250028002B002E0004040404040404045A
:1000E00002020202020203030303030302020305E6
:1000F00005050501020408102040800102040810D3
:1001000020010204081020408040010204080A0D6A
:100110000E090003020000040508000000000000B2
:1001200000000000000000000000A10F890F112452
:100130001FBECFEFD8E0DEBFCDBF25E0ACE2B3E01D
:1001400001C01D92A938B207E1F713E0A0E0B1E0C9
:10015000E0E1F4E302C005900D92AC32B107D9F7AB
:1001600010E0C6E9D0E004C02197FE010E945F16AE
:10017000C539D107C9F70E94A1100C94FB190C9442
:100180000000880F8093BA0008959B01AC0160E0E5
:1001900072E18AE790E00E941E1620513109410960
:1001A000510956954795379527952093B80008959E
:1001B000882321F085EC8093BC00089585E8FBCF6F
:1001C00085ED8093BC008091BC0084FDFCCF109233
:1001D0007903089585EC8093BC001092790308950B
:1001E000880F8093DA0008950C94C500882321F0CD
:1001F00085EC8093DC00089585E8FBCF85ED809346
:10020000DC008091DC0084FDFCCF1092E3030895B4
:1002100085EC8093DC001092E303089582508D30CA
:1002200008F03EC0E82FF0E0E85EFE4F0C945F1649
:100230004D01510125012B01500150012F013501C4
:1002400039013F01500143014901809180008F77BE
:10025000809380000895809180008F7DF9CF8091F8
:10026000B0008F778093B00008958091B0008F7DAB
:10027000F9CF809190008F778093900008958091BE
:1002800090008F7DF9CF8091A0008F778093A000A0
:1002900008958091A0008F7DF9CF84B58F7784BDBC
:1002A000089584B58F7DFBCF1F93CF93DF93282FC5
:1002B00030E0F901E25FFE4F8491F901ED50FF4F0C
:1002C000D491F901E852FF4FC491CC23A9F0162F25
:1002D00081110E940E01EC2FF0E0EE0FFF1FE4539E
:1002E000FF4FA591B4918FB7F894EC91111108C00C
:1002F000D095DE23DC938FBFDF91CF911F910895BE
:10030000DE2BF8CF1092790381E080937B0310926B
:100310007A0361E082E10E94540161E083E10E947E
:100320005401E9EBF0E080818E7F808380818D7FB6
:10033000808380E28093B80085E48093BC000895B8
:10034000ECEBF0E080818A7B808360E082E10E94B8
:10035000540160E083E10C9454011092E30381E0C6
:100360008093E5031092E40361E087E10E94540169
:1003700061E088E10E945401E9EDF0E080818E7F28
:10038000808380818D7F808380E28093D80085E4A4
:100390008093DC000895ECEDF0E080818A7B80831F
:1003A00060E082E10E94540160E083E10C9454011A
:1003B000CF93DF9390E0FC01ED50FF4F24918852E2
:1003C0009F4FFC0184918823C9F090E0880F991F0A
:1003D000FC01E054FF4FA591B491FC01E453FF4FA1
:1003E000C591D49161110DC09FB7F8948C9120955F
:1003F00082238C938881282328839FBFDF91CF910C
:100400000895623051F49FB7F8943C91822F809503
:1004100083238C93E8812E2BEFCF8FB7F894EC9148
:100420002E2B2C938FBFEACF3FB7F89480917204A4
:1004300090917304A0917404B091750426B5A89BA3
:1004400005C02F3F19F00196A11DB11D3FBFBA2F66
:10045000A92F982F8827BC01CD01620F711D811D26
:10046000911D43E0660F771F881F991F4A95D1F7AA
:1004700008958F929F92AF92BF92CF92DF92EF92A8
:10048000FF926B017C010E9414024B015C01C114BC
:10049000D104E104F104B9F00E9414026819790949
:1004A0008A099B09683E73408105910580F321E02C
:1004B000C21AD108E108F10888EE880E83E0981E80
:1004C000A11CB11CE4CFFF90EF90DF90CF90BF90C4
:1004D000AF909F908F9008950895AF92BF92CF9262
:1004E000DF92EF92FF920F931F93CF93DF936C01F4
:1004F0007B018B01040F151FEB015E01AE18BF08D5
:10050000C017D10759F06991D601ED91FC91019086
:10051000F081E02DC6010995892B79F7C501DF919E
:10052000CF911F910F91FF90EF90DF90CF90BF90F0
:10053000AF900895FC01538D448D252F30E0842F1A
:1005400090E0821B930B541710F0CF9608950197FB
:100550000895FC01918D828D981761F0A28DAE0FE8
:10056000BF2FB11D5D968C91928D9F5F9F73928F6F
:1005700090E008958FEF9FEF0895FC01918D828D9B
:10058000981731F0828DE80FF11D858D90E0089568
:100590008FEF9FEF0895FC01918D228D892F90E0C0
:1005A000805C9F4F821B91098F739927089586E77E
:1005B00094E00E94CB0221E0892B09F420E0822FF5
:1005C0000895FC01A48DA80FB92FB11DA35ABF4FE8
:1005D0002C91848D90E001968F739927848FA68942
:1005E000B7892C93A089B1898C9180648C93938D69
:1005F000848D981306C00288F389E02D80818F7D59
:1006000080830895EF92FF920F931F93CF93DF9310
:10061000EC0181E0888F9B8D8C8D981316C0E88942
:10062000F989808185FF11C0EE89FF896083E8899F
:10063000F98980818064808381E090E0DF91CF91AF
:100640001F910F91FF90EF900895F62E0B8D10E003
:100650000F5F1F4F0F731127E02E8C8D8E110CC072
:100660000FB607FCFACFE889F989808185FFF5CFBD
:10067000CE010E94E102F1CFEB8DEC0FFD2FF11DB9
:10068000E35AFF4FF0820B8FEA89FB8980818062F9
:10069000D2CFCF93DF93EC01888D8823B9F0AA895C
:1006A000BB89E889F9898C9185FD03C0808186FD2D
:1006B0000DC00FB607FCF7CF8C9185FFF2CF80817C
:1006C00085FFEDCFCE010E94E102E9CFDF91CF910E
:1006D000089580E090E0892B29F00E94D7028111D3
:1006E0000E94000080E090E0892B49F080E090E0DB
:1006F000892B29F00E94000081110C9400000895BC
:100700002091BF03260F3327331F21323105ECF42C
:100710002091E303FC0190E080E0243069F082E066
:100720000895A091BF032191AC0141565C4FA40FE5
:10073000B52FB11D2C930196861798F38091BF03B6
:10074000680F6093BF0380E0089581E008950F93E0
:10075000413208F04BC09091E3039111FCCF92E03D
:100760009093E3030093E5039FEF9093E2031092CD
:10077000070440930604362FA6EEB3E0FB019E2F3C
:10078000931B941770F11092080490910804880F3D
:10079000892B809308048091E403813029F510921D
:1007A000E403809108048093DB008091DC0083FDEA
:1007B000F8CF85EC8093DC00222321F08091E303C5
:1007C0008230D1F38091E2038F3F91F08091E20378
:1007D000803281F08091E203803371F084E00F91E8
:1007E000089591919D93CBCF85EEE4CF81E0F7CF33
:1007F00080E0F5CF82E0F3CF83E0F1CF413208F023
:1008000043C09091E3039111FCCF91E09093E303F7
:100810002093E5032FEF2093E20310920704240FA7
:10082000209306049093080490910804880F892B64
:10083000809308048091E403813009F51092E40369
:10084000809108048093DB008091DC0083FDF8CF69
:1008500085EC8093DC008091E3038130E1F38091AB
:100860000704841710F440910704A6EEB3E0962F16
:10087000FB018E2F891B841720F0842F089585EEAD
:10088000E8CF8D918193F5CF40E0F7CFE0916B05F4
:10089000F0916C05309729F0109268051092690567
:1008A00009940895DC0180916D0590916E05892B66
:1008B00019F190916305809164059817E8F090E034
:1008C000292F30E0261737076CF4FD01E20FF31FE4
:1008D0004081E0916105F0916205E20FF31F4083D2
:1008E0009F5FEECF1092630560936405E0916D0504
:1008F000F0916E05CB010994089520915503260FC0
:100900003327331F21323105ECF420917903FC01A8
:1009100090E080E0243069F082E00895A0915503D2
:100920002191AC014B5C5C4FA40FB52FB11D2C93F2
:100930000196861798F380915503680F60935503CD
:1009400080E0089581E008950F93413208F04BC094
:10095000909179039111FCCF92E0909379030093E9
:100960007B039FEF9093780310929D0340939C0329
:10097000362FACE7B3E0FB019E2F931B941770F169
:1009800010929E0390919E03880F892B80939E0363
:1009900080917A03813029F510927A0380919E0329
:1009A0008093BB008091BC0083FDF8CF85EC8093E1
:1009B000BC00222321F0809179038230D1F3809111
:1009C00078038F3F91F080917803803281F080919D
:1009D0007803803371F084E00F91089591919D9395
:1009E000CBCF85EEE4CF81E0F7CF80E0F5CF82E09A
:1009F000F3CF83E0F1CF413208F043C09091790307
:100A00009111FCCF91E09093790320937B032FEF1A
:100A10002093780310929D03240F20939C039093BE
:100A20009E0390919E03880F892B80939E03809153
:100A30007A03813009F510927A0380919E038093A6
:100A4000BB008091BC0083FDF8CF85EC8093BC0097
:100A5000809179038130E1F380919D03841710F434
:100A600040919D03ACE7B3E0962FFB018E2F891BCD
:100A7000841720F0842F089585EEE8CF8D9181931F
:100A8000F5CF40E0F7CFE0913B05F0913C05309782
:100A900029F0109238051092390509940895DC0167
:100AA00080913D0590913E05892B19F19091330578
:100AB000809134059817E8F090E0292F30E0261750
:100AC00037076CF4FD01E20FF31F4081E09131051F
:100AD000F0913205E20FF31F40839F5FEECF10923B
:100AE000330560933405E0913D05F0913E05CB015F
:100AF000099408950895DC015096EC915097519611
:100B00008C915197E81748F41E968D919C91E80FAF
:100B1000F92FF11D808190E008958FEF9FEF0895E8
:100B2000FC01908981892FEF3FEF981740F4A6854B
:100B3000B785A90FB11D2C9130E09F5F908BC90143
:100B40000895FC0181899089891B990B0895CF92A2
:100B5000DF92EF92FF920F931F93CF93DF938C015D
:100B6000CB017A01D80157962C915797222389F00F
:100B7000EB016B01C40ED51ECC15DD0579F0699132
:100B8000D801ED91FC910190F081E02DC80109950B
:100B9000F3CF9896ED91FC91642F0995C701DF91F1
:100BA000CF911F910F91FF90EF90DF90CF9008951C
:100BB000CF93DF931F92CDB7DEB7FC01698387899E
:100BC0008823F9F02689848595852817190654F01D
:100BD00081E090E09383828390E080E00F90DF914A
:100BE000CF9108958981A58923893489A20FB32FD4
:100BF000B11D8C9385898F5F858B868B81E090E01A
:100C0000EDCF00A4F1A5E02D61E0CE01019609959C
:100C1000F5CF90E080E0089525B195B170E0719531
:100C2000619571096227877021E030E002C0220FD0
:100C3000331F8A95E2F76223692765B90895809189
:100C4000080190910901892B41F461E088E00E943C
:100C5000D80160E088E00C940C0660E088E00C9419
:100C6000D8014F925F926F927F92AF92BF92CF92D4
:100C7000DF92EF92FF920F931F93A0911801B09112
:100C800019012FEF33E00E947C162B013C01770CF9
:100C90004408542C3201B0900D01A0900C011B2D82
:100CA000110F110BC12ED12EE12EF12E012F9B0120
:100CB000AC01642D742D842D942D0E9485163093E3
:100CC0008900209388001F910F91FF90EF90DF9093
:100CD000CF90BF90AF907F906F905F904F900895AE
:100CE0004F925F926F927F928F929F92AF92BF923C
:100CF000CF92DF92EF92FF920F931F93A0911A0170
:100D0000B0911B012FEF33E00E947C162B013C01B8
:100D1000770C4408542C3201B0900D01A0900C01C6
:100D20001B2D110F110BC12ED12EE12EF12E012FF3
:100D30009B01AC01642D742D842D942D0E94851689
:100D4000B901330F880B990B24E030E040E050E00C
:100D50000E94401630932F0320932E0380912E0380
:100D600090912F038093B4001F910F91FF90EF900B
:100D7000DF90CF90BF90AF909F908F907F906F90BB
:100D80005F904F9008952BB19BB170E07195619584
:100D90007109622721E030E002C0220F331F8A95DB
:100DA000E2F7622369276BB908958091040190915D
:100DB00005018230910509F13CF4019759F160E099
:100DC00086E00E94D8012EC08330910551F004972F
:100DD000B1F761E084E10E94D80160E084E10C9405
:100DE0000C0661E085E10E94D80160E085E10E9487
:100DF0000C0660E084E10C94D80161E085E00E947B
:100E0000D80160E085E00E94C30660E085E10E94B1
:100E1000D801EFCF61E086E00E94D80160E086E073
:100E20000E94C30660E085E00E94D801EECFFC017D
:100E300001900020E9F73197AF01481B590BBC0125
:100E400086E794E00C946D02CF93DF930E9417071E
:100E5000EC0186E491E00E9417078C0F9D1FDF9143
:100E6000CF91089560910B0487E00E94C30681E052
:100E700090E0909365048093640460910601709102
:100E80000701072E000C880B990B0E94390261E0C4
:100E900080910B0490910C04892B09F060E087E0AD
:100EA0000E94C30689E491E00E94240784E090E058
:100EB000909311018093100108950C9417078F925D
:100EC0009F92AF92BF92CF92DF92EF92FF920F93D9
:100ED0001F93CF93DF93CDB7DEB7A1970FB6F894EA
:100EE000DEBF0FBECDBF6B017C01F7FE41C06DE2DE
:100EF00086E794E00E9402038C0122273327A90190
:100F00002C193D094E095F0919A2CE0181967C0179
:100F10009AE0892E912CA12CB12CCA01B901A5010E
:100F200094010E941E16605DF70162937F012115F6
:100F300031054105510589F790E080E0309719F0BF
:100F4000CF010E941707800F911FA1960FB6F8944A
:100F5000DEBF0FBECDBFDF91CF911F910F91FF90EC
:100F6000EF90DF90CF90BF90AF909F908F900895BB
:100F7000AC019B0119A28E010F5D1F4F8AE0C82EA4
:100F8000D12CE12CF12CCA01B901A70196010E94D4
:100F90001E16605DF80162938F0121153105410530
:100FA000510589F790E080E0309779F2CF010E94F7
:100FB0001707CBCFBC01990F880B990B0C945F07D7
:100FC000CF92DF92EF92FF9281E591E00E945D0760
:100FD00083E591E00E945D0780910C0190910D01E5
:100FE0000E94DA078AE591E00E945D078CE591E0B6
:100FF0000E945D0720916C0430916D04A0910C015A
:10100000B0910D010E946516CC24CA9423E0D22E23
:10101000E12CF12CA70196010E944016CA01B901EA
:101020000E945F078AE591E00E945D0785E691E0F6
:101030000E945D0720916A0430916B04A0910C011D
:10104000B0910D010E946516A70196010E944016FD
:10105000CA01B9010E945F078AE591E00E945D071D
:101060008DE691E00E945D0780916804909169048B
:101070000E94DA078AE591E00E945D0784E791E02B
:101080000E945D078091090490910A040E94DA078A
:101090008DE791E0FF90EF90DF90CF900C942407C4
:1010A000CF93DF930E94DA07EC0186E491E00E947F
:1010B00017078C0F9D1FDF91CF9108958FE791E067
:1010C0000E945D0780910401909105010E94DA075A
:1010D00080910401909105018230910509F474C05A
:1010E00044F4009779F0019709F46BC081EA91E02C
:1010F0000BC08330910509F46AC00497B9F78CE9F5
:1011000091E002C087E891E00E9424078AEA91E01A
:101110000E945D0780911A0190911B010E94500866
:1011200080EB91E00E945D07809118019091190178
:101130000E94500887EB91E00E945D0780911201A8
:10114000909113010E9450088FEB91E00E945D077F
:1011500080910601909107010E94500886EC91E071
:101160000E945D0780910A0190910B010E94500836
:101170008CEC91E00E945D0780910B0490910C042F
:101180000E94500883ED91E00E945D0780910D045C
:1011900090910E040E9450088AED91E00E945D0734
:1011A00080910801909109010E94DA07809108015D
:1011B00090910901009771F0019751F181EA91E056
:1011C0000BC08BE891E0A0CF81E991E09DCF88E949
:1011D00091E09ACF81EE91E00E9424078BEE91E09E
:1011E0000E945D07609114017091150180911601B4
:1011F000909117010E945F0786E491E00E94170713
:1012000085EF91E00E945D0787E092E00C9424074F
:1012100087EE91E0E1CFFF920F931F93CF93DF937F
:10122000EC018B01FB01F0800E94D115F81621F032
:101230006F2DCE010E94D915F801F1802196CE01C3
:101240000E94D115F81621F06F2DCE010E94D915FC
:10125000C801DF91CF911F910F91FF900895FF92E8
:101260000F931F93CF93DF9304E111E0CEE1D0E021
:10127000F801F1908F01CE010E94D115F81621F0EE
:101280006F2DCE010E94D9152196C232D10581F76A
:1012900084E191E0DF91CF911F910F91FF9008952C
:1012A00082E090E090930501809304018AEA95E042
:1012B00090931B0180931A0182E29BE090931901A5
:1012C0008093180182E390E09093130180931201C0
:1012D00084E190E0909307018093060190930B01C5
:1012E00080930A0110920E0410920D0410920C04C7
:1012F00010920B0481E090E0909309018093080123
:1013000084EB9BE2A1E1B0E080931401909315017E
:10131000A0931601B09317010E9470060E94310637
:1013200064E071E090E080E00E940B096AE171E006
:1013300084E090E00E940B0968E171E088E090E0B1
:101340000E940B0962E171E08CE090E00E940B09C1
:1013500066E071E080E190E00E940B096AE071E0D4
:1013600084E190E00E940B096DE074E08AE190E076
:101370000E940B096BE074E086E190E00E940B098B
:1013800068E071E08CE190E00E940B090C942F0959
:10139000CF92DF92EF92FF92CF93DF931816190648
:1013A0000CF03FC0C0910C01D0910D011C161D0620
:1013B000C4F5BC01990F880B990B0E94CD172DEC39
:1013C0003CEC4CE85FE30E9459186B017C01BE01C4
:1013D000DD0F880B990B0E94CD179B01AC01C70153
:1013E000B6010E94231720E030EC4FE754E40E943E
:1013F000591820E030E04AE754E40E9459180E944E
:1014000095176093140170931501809316019093C2
:101410001701DF91CF91FF90EF90DF90CF900C9468
:101420002F09DF91CF91FF90EF90DF90CF9008953B
:10143000CF92DF92EF92FF920F931F93CF93DF93A0
:101440008C01D0E0C0E0C017D107BCF5209741F473
:1014500083E595E00E949005809334032196F3CFB5
:10146000C130D10589F483E595E00E949005092EED
:10147000000CAA0BBB0B8093300390933103A09315
:101480003203B0933303EACFC0903003D0903103DE
:10149000E0903203F0903303FE2CED2CDC2CCC24B6
:1014A00083E595E00E949005092E000CAA0BBB0B6A
:1014B0008C299D29AE29BF29DECFE0913403EE307F
:1014C00008F0E8C0F0E0E959F54F0C945F16750A92
:1014D0008F0AA00AB10AC00ACF0ADE0AF80A070B6F
:1014E0004A0B230B4A0B2D0B3C0B80913003909140
:1014F000310397FDCFC090930501809304010E94B2
:10150000D50664E071E090E080E0DF91CF911F911B
:101510000F91FF90EF90DF90CF900C940B0980918A
:1015200030039091310397FDB5C090931B018093D8
:101530001A010E9470066AE171E084E090E0E5CF54
:10154000809130039091310397FDA4C090931901CD
:10155000809318010E94310668E171E088E090E014
:10156000D4CF809130039091310397FD93C0909335
:1015700013018093120162E171E08CE090E0C5CF2D
:10158000809130039091310397FD84C090930701BF
:101590008093060166E071E080E190E0B6CF809133
:1015A00030039091310397FD75C090930B018093A8
:1015B0000A016AE071E084E190E0A7CF80913003F6
:1015C0009091310397FD66C090930C0480930B04B7
:1015D0006BE074E086E190E00E940B09DF91CF910F
:1015E0001F910F91FF90EF90DF90CF900C943207F6
:1015F000809130039091310397FD4CC090930E047D
:1016000080930D046DE074E08AE190E07ECF8091DC
:10161000300390913103A0913203B0913303B7FDB1
:1016200039C08093140190931501A0931601B093D3
:101630001701DF91CF911F910F91FF90EF90DF90F5
:10164000CF900C942F09DF91CF911F910F91FF90B4
:10165000EF90DF90CF900C945009809130039091DF
:10166000310397FD17C0909309018093080168E04A
:1016700071E08CE190E049CF80913003909131038B
:10168000DF91CF911F910F91FF90EF90DF90CF905E
:101690000C94C809DF91CF911F910F91FF90EF90AB
:1016A000DF90CF9008950F931F93CF93DF938C011A
:1016B000EB010E94D1158883C80101960E94D115C3
:1016C0008983CE01DF91CF911F910F9108958F9261
:1016D0009F92AF92BF92EF92FF920F931F93CF937F
:1016E000DF93CDB7DEB72A970FB6F894DEBF0FBEF3
:1016F000CDBFEDB6FEB680913403893028F08B3033
:10170000C8F08B3009F47DC00FB6F894FEBE0FBE52
:10171000EDBE2A960FB6F894DEBF0FBECDBFDF91A7
:10172000CF911F910F91FF90EF90BF90AF909F903E
:101730008F9008958DB79EB780970FB6F8949EBF8F
:101740000FBE8DBF6DB77EB76F5F7F4F8091040175
:1017500090910501EDB7FEB79183FB0181838091E4
:101760001A0190911B0192838383809118019091BB
:1017700019019483858380911201909113019683BE
:1017800087838091060190910701908781878091DE
:101790000A0190910B019287838780910B049091AD
:1017A0000C049487858780910D0490910E04968790
:1017B00087878091080190910901908B818B80919E
:1017C0001401909115012091160130911701328B6F
:1017D000238B948B858BADB7BEB757968AE0E7E035
:1017E000F2E001900D928A95E1F740E250E083E546
:1017F00095E00E94A7050FB6F894FEBE0FBEEDBEA1
:1018000083CF00910C0110910D0119830A83A091DF
:101810006C04B0916D0498010E94651688248A9426
:1018200023E0922EA12CB12CA50194010E94401618
:101830003B832C83A0916A04B0916B0498010E94B1
:101840006516A50194010E9440163D832E83809168
:101850006804909169049F8388878091090490911E
:101860000A0499878A874AE050E0BE016F5F7F4F84
:1018700083E595E00E94A70547CF61ED71E08BE31A
:1018800094E00E948615BC0183E194E00E94F41963
:1018900061ED71E090E080E00E9486150E945F1586
:1018A00060930F04709310048093110490931204BA
:1018B00008951F920F920FB60F9211242F933F930A
:1018C0008F939F93AF93BF9380911B0590911C05BD
:1018D000A0911D05B0911E053091710426E0230FE3
:1018E0002D3768F129E8230F0396A11DB11D209320
:1018F000710480931B0590931C05A0931D05B09364
:101900001E058091720490917304A0917404B091AB
:1019100075040196A11DB11D809372049093730408
:10192000A0937404B0937504BF91AF919F918F9170
:101930003F912F910F900FBE0F901F901895029618
:10194000A11DB11DD4CF1F920F920FB60F9211247B
:101950002F933F934F935F936F937F938F939F93B7
:10196000AF93BF93EF93FF93E0910201F0910301D6
:101970000995FF91EF91BF91AF919F918F917F91C9
:101980006F915F914F913F912F910F900FBE0F90EC
:101990001F9018951F920F920FB60F9211242F933C
:1019A0003F934F935F936F937F938F939F93AF93E7
:1019B000BF93EF93FF93E0910001F091010109952E
:1019C000FF91EF91BF91AF919F918F917F916F9117
:1019D0005F914F913F912F910F900FBE0F901F90ED
:1019E00018951F920F920FB60F9211242F933F93C9
:1019F0004F935F936F937F938F939F93AF93BF9317
:101A0000EF93FF9386E794E00E94E102FF91EF914C
:101A1000BF91AF919F918F917F916F915F914F9106
:101A20003F912F910F900FBE0F901F9018951F920E
:101A30000F920FB60F9211242F938F939F93EF93D2
:101A4000FF93E0918604F09187048081E0918C04FB
:101A5000F0918D0482FD1BC0908180918F048F5F77
:101A60008F7320919004821741F0E0918F04F0E091
:101A7000EA58FB4F958F80938F04FF91EF919F91D0
:101A80008F912F910F900FBE0F901F90189580810E
:101A9000F4CF1F920F920FB60F9211242F933F9302
:101AA0004F935F936F937F938F939F93AF93BF9366
:101AB000EF93FF938091D900887F803609F44CC062
:101AC00008F03FC0883209F4A8C018F5803109F445
:101AD0009CC0B8F4882309F4F9C0883009F495C093
:101AE000FF91EF91BF91AF919F918F917F916F91F6
:101AF0005F914F913F912F910F900FBE0F901F90CC
:101B00001895883109F489C0803251F78093E20337
:101B100015C0803409F49EC048F48033B9F388338B
:101B2000F9F68093E2030E940801DACF803509F4C8
:101B300085C0883509F496C0883491F60E94FE006D
:101B4000CFCF883909F48CC038F5883729F050F4A4
:101B5000883611F0803721F683E08093E3031092FA
:101B6000E10357C0883809F47BC0803919F0803808
:101B700009F0B6CF8091E103803208F071C0E091A6
:101B8000E10381E08E0F8093E1038091DB00F0E0C0
:101B9000EF53FC4F80833DC0803B39F0E0F4803A46
:101BA00009F479C0883A09F09BCF84E08093E3037D
:101BB0001092C0031092BF03E0911505F091160535
:101BC00009958091BF0381110FC081E08093BF030D
:101BD00010929F0309C0803C09F476C0883C09F448
:101BE00073C0883B09F07CCFE091C00381E08E0F89
:101BF0008093C003F0E0E156FC4F80818093DB00CE
:101C00009091C0038091BF0329C080910804809304
:101C1000DB0085EC8093DC0063CF9091070480911A
:101C20000604981758F5E091070481E08E0F809321
:101C30000704F0E0EA51FC4F8081E9CFE09107040E
:101C400081E08E0F809307048091DB00F0E0EA5181
:101C5000FC4F808390910704809106049817C8F286
:101C600085E8D8CFE091070481E08E0F80930704C8
:101C70008091DB00F0E0EA51FC4F80838091E50326
:101C800081115CCF81E08093E40384EA8093DC00DF
:101C90001092E30325CF0E9408018091E103803276
:101CA00030F4E091E103F0E0EF53FC4F10826091DB
:101CB000E10370E0E0911305F091140581EC93E0ED
:101CC00009951092E1030CCF85ECE0CF1092E2036E
:101CD00035CF1F920F920FB60F9211242F933F937F
:101CE0004F935F936F937F938F939F93AF93BF9324
:101CF000EF93FF938091B900887F803609F44CC040
:101D000008F03FC0883209F4A8C018F5803109F402
:101D10009CC0B8F4882309F4F9C0883009F495C050
:101D2000FF91EF91BF91AF919F918F917F916F91B3
:101D30005F914F913F912F910F900FBE0F901F9089
:101D40001895883109F489C0803251F7809378035F
:101D500015C0803409F49EC048F48033B9F3883349
:101D6000F9F6809378030E94EA00DACF803509F40F
:101D700085C0883509F496C0883491F60E94E00049
:101D8000CFCF883909F48CC038F5883729F050F462
:101D9000883611F0803721F683E080937903109222
:101DA000770357C0883809F47BC0803919F0803830
:101DB00009F0B6CF80917703803208F071C0E091CE
:101DC000770381E08E0F809377038091BB00F0E072
:101DD000E95AFC4F80833DC0803B39F0E0F4803A03
:101DE00009F479C0883A09F09BCF84E080937903A5
:101DF0001092560310925503E0911705F0911805C3
:101E000009958091550381110FC081E0809355039E
:101E10001092350309C0803C09F476C0883C09F46F
:101E200073C0883B09F07CCFE091560381E08E0FB0
:101E300080935603F0E0EB5CFC4F80818093BB0005
:101E4000909156038091550329C080919E03809301
:101E5000BB0085EC8093BC0063CF90919D03809183
:101E60009C03981758F5E0919D0381E08E0F8093B5
:101E70009D03F0E0E458FC4F8081E9CFE0919D03A1
:101E800081E08E0F80939D038091BB00F0E0E458C9
:101E9000FC4F808390919D0380919C039817C8F21A
:101EA00085E8D8CFE0919D0381E08E0F80939D035C
:101EB0008091BB00F0E0E458FC4F808380917B036D
:101EC00081115CCF81E080937A0384EA8093BC0027
:101ED0001092790325CF0E94EA0080917703803227
:101EE00030F4E0917703F0E0E95AFC4F1082609102
:101EF000770370E0E0911905F0911A0587E593E00A
:101F00000995109277030CCF85ECE0CF10927803FF
:101F100035CFCF93DF93C3E2D5E08E859F850E94B6
:101F200062198B899C890E946219C3E5D5E08E8570
:101F30009F850E9462198B899C89DF91CF910C94B7
:101F400062198F929F92AF92BF92EF92FF920F937E
:101F50001F93CF93DF93E6E7F4E01382128288EEBB
:101F6000882E83E0982EA12CB12C84829582A682A3
:101F7000B78286E291E09183808385EC90E095873B
:101F8000848784EC90E09787868780EC90E0918B43
:101F9000808B81EC90E0938B828B82EC90E0958B30
:101FA000848B86EC90E0978B868B118E128E138E2D
:101FB000148EC3E5D5E01B821A828C829D82AE828C
:101FC000BF8298E3E92E91E0F92EF982E88200E2DF
:101FD00010E01D870C8780E290E00E94C6189F8762
:101FE0008E87188A198A1A8A80E290E00E94C618A1
:101FF0009C8B8B8B1D8A1E8A1F8A8DEA91E09D8F98
:102000008C8F8BEC91E09F8F8E8F80EF90E099A367
:1020100088A384EF90E09BA38AA38EEF93E09DA317
:102020008CA387EA93E09FA38EA380E893E099A70F
:1020300088A786EF90E09BA78AA78EEF90E09DA7E8
:102040008CA788E091E09FA78EA782E594E090930B
:1020500014058093130586E494E09093160580930D
:102060001505C3E2D5E01B821A828C829D82AE8266
:10207000BF82F982E8821D870C8780E290E00E948F
:10208000C6189F878E87188A198A1A8A80E290E07C
:102090000E94C6189C8B8B8B1D8A1E8A1F8A82E821
:1020A00091E09D8F8C8F80EA91E09F8F8E8F81ECE5
:1020B00090E099A388A385EC90E09BA38AA38BEF83
:1020C00094E09DA38CA384EA94E09FA38EA38DE764
:1020D00094E099A788A788ED90E09BA78AA780EE57
:1020E00090E09DA78CA78AEE90E09FA78EA78FE433
:1020F00095E090931A058093190583E495E09093F9
:102100001805809317052FB7F89480911B059091BF
:102110001C05A0911D05B0911E052FBF80931F05C2
:1021200090932005A0932105B0932205DF91CF91D4
:102130001F910F91FF90EF90BF90AF909F908F9065
:102140000895CF93DF9300D000D000D0CDB7DEB795
:10215000789484B5836084BD85B5836085BD8091A6
:102160006E00816080936E0012E010938100809178
:1021700081008160809381008091800081608093E4
:1021800080008091B10084608093B1008091B000A4
:1021900081608093B0008091910083608093910072
:1021A000809190008160809390008091A100836075
:1021B0008093A1008091A00081608093A00086E8B8
:1021C00080937A001092C10081E28093B00081E098
:1021D0008093B100539A93E890938000809381009C
:1021E000219A61E087E00E94D80161E084E00E94CA
:1021F000D80162E080E10E94D80162E082E00E94A2
:10220000D80160E08EE00E94D80160E08FE00E947B
:10221000D80160E084E10E94D80160E085E10E947D
:10222000D80160E085E00E94D80160E086E00E946D
:10223000D80182E397E0909301018093000180919F
:1022400069008C7F826080936900E89AE09186043F
:10225000F09187041083E0918204F091830410824E
:10226000E0918404F091850487E6808310928E04C7
:10227000E0918A04F0918B0486E08083E0918804E9
:10228000F0918904808188698083E0918804F091CD
:10229000890480818F7D808384E192E00E945D07C4
:1022A00087E092E00E94240781E392E00E942407E5
:1022B00085E592E00E94240783E892E00E942407CB
:1022C00010926305109264051092680510926905DA
:1022D000E0916F05F09170050995E0917305F0911B
:1022E000740580E1099587E69BE090936C058093E7
:1022F0006B0588E19AE090936E0580936D05BE01B1
:102300006B5F7F4F90E080E00E94530B8D819E8138
:1023100011E08530910528F4909305018093040124
:1023200010E0BE016B5F7F4F84E090E00E94530B92
:102330008D819E81893823E1920708F059C29093DC
:102340001B0180931A01BE016B5F7F4F88E090E014
:102350000E94530B8D819E818938E3E19E0708F02E
:1023600049C29093190180931801BE016B5F7F4FA2
:102370008CE090E00E94530B8D819E81909313011D
:1023800080931201BE016B5F7F4F80E190E00E945D
:10239000530B8D819E81893EF3E09F0708F02CC28C
:1023A0009093070180930601BE016B5F7F4F84E12C
:1023B00090E00E94530B8D819E81893E23E092071D
:1023C00008F01CC290930B0180930A01BE016B5F61
:1023D0007F4F8AE190E00E94530B8D819E81823075
:1023E000910508F00DC290930E0480930D04BE0178
:1023F0006B5F7F4F86E190E00E94530B8D819E8141
:102400008230910508F0FEC190930C0480930B0478
:10241000BE016B5F7F4F8CE190E00E94530B8D817A
:102420009E818230910508F0EFC19093090180935D
:1024300008018EE190E00E94D11589838FE190E040
:102440000E94D1158A8380E290E00E94D1158B838F
:1024500081E290E00E94D1158C8389819A81AB81C1
:10246000BC81AC01BD01405452446F4071094134FC
:102470005D406340710508F4C9C10E9450090E9483
:1024800070060E9431060E94D5060E941F0661E078
:1024900080910B0490910C04892B09F060E087E097
:1024A0000E94C3069EE4392E21E4722E30E4632E8E
:1024B0004EE1C42E41E0D42E53E0A52E51E0B52EBE
:1024C00068EE862E60E0962E55245394EE24E39415
:1024D000F12CE7E24E2E4091120150911301052E8E
:1024E000000C660B770B2FB7F89480911B05909129
:1024F0001C05A0911D05B0911E052FBF00911F0561
:10250000109120052091210530912205801B910B0F
:10251000A20BB30B84179507A607B70708F465C18C
:102520002FB7F89480911B0590911C05A0911D0573
:10253000B0911E052FBF80931F0590932005A09397
:102540002105B09322050091100110911101101680
:102550001106BCF461E080916F0490917004892BA6
:1025600009F060E0862F90E09093700480936F04F0
:1025700084E00E94C30601501109109311010093D9
:10258000100186E794E00E94CB0218161906B4F4F5
:1025900086E794E00E94A90290916304E92FF0E09D
:1025A000E55CFB4F8A3019F08D3009F03AC150924A
:1025B0006E0410820E943D0C1092630480916E04A0
:1025C000882319F110926E0483E194E00E94B21501
:1025D00065EA72E083E194E00E94EB19892B09F02F
:1025E0002AC180910F049091100497FD0CC0909324
:1025F0000501809304010E94D50664E071E090E03B
:1026000080E00E940B090E943D0C0E94D5060E94AA
:102610001F0680910C0190910D0190930F01809302
:102620000E0130927C0062E070E080E090E00E9459
:10263000390280917A00806480937A0080917A00D8
:1026400086FDFCCF8091780020917900322F282FD1
:10265000032E000C440B550B609114017091150171
:1026600080911601909117010E94401630930D0140
:1026700020930C0120917A0080917A00887F8460F9
:1026800080937A0070927C0080917A0080648093BD
:102690007A0080917A0086FDFCCF9091780080913D
:1026A000790020937A0089279827892790936D04D1
:1026B00080936C0420917A0080917A00887F8460F6
:1026C00080937A0060927C0080917A00806480938D
:1026D0007A0080917A0086FDFCCF909178008091FD
:1026E000790020937A0089279827892790936B0493
:1026F00080936A0420910E0130910F0180910C01AA
:1027000090910D01281B390B80910A0190910B01CA
:10271000821793073CF09195819591092817390705
:102720000CF0C0C10E9470060E943106F09269044C
:10273000E0926804F6018491F5011491F40104918A
:10274000002309F4B4C181110E940E01E02FF0E0D2
:10275000EE0FFF1FEC54FF4FA591B4918C911823FD
:1027600031E020E009F430E0832F922F90930A04A7
:10277000809309042091090430910A0480910D048A
:1027800090910E042817390721F4F0926904E09221
:1027900068040091100110911101101611060CF03F
:1027A00089C161E080916F0490917004892B09F0D8
:1027B00060E0862F90E09093700480936F0484E033
:1027C0000E94C306015011091093110100931001DA
:1027D00080916604909167041816190614F40E94FB
:1027E000E00710926504109264040E94690373CE9E
:1027F00011E0A9CD11E0B9CD11E0D6CD11E0E6CDC3
:1028000011E0F5CD11E004CE11E013CE8093140158
:1028100090931501A0931601B093170111112DCEBD
:102820002ECE80839F5F983219F090936304C6CEBA
:1028300040926304C3CE6CEA72E083E194E00E94AC
:10284000EB19892B89F480910F049091100497FD66
:10285000DACE90931B0180931A010E9470066AE100
:1028600071E084E090E0CDCE61EB72E083E194E032
:102870000E94EB19892B89F480910F049091100428
:1028800097FDC1CE90931901809318010E943106E3
:1028900068E171E088E090E0B4CE67EB72E083E13C
:1028A00094E00E94EB19892B79F480910F049091A8
:1028B000100497FDA8CE909313018093120162E15A
:1028C00071E08CE090E09DCE6EEB72E083E194E0ED
:1028D0000E94EB19892B79F480910F0490911004D8
:1028E00097FD91CE909307018093060166E071E019
:1028F00080E190E086CE64EC72E083E194E00E9497
:10290000EB19892B79F480910F049091100497FDB5
:102910007ACE90930B0180930A016AE071E084E122
:1029200090E06FCE69EC72E083E194E00E94EB19D5
:10293000892B99F480910F049091100497FD63CE38
:1029400090930C0480930B046BE074E086E190E0BC
:102950000E940B090E94320756CE6FEC72E083E1B1
:1029600094E00E94EB19892B79F480910F049091E7
:10297000100497FD48CE90930E0480930D046DE0F3
:1029800074E08AE190E03DCE65ED72E083E194E091
:102990000E94EB19892B79F480910F049091100417
:1029A00097FD31CE909309018093080168E071E0B2
:1029B0008CE190E026CE6BED72E083E194E00E9422
:1029C000EB19892BA9F480910F0490911004A09128
:1029D0001104B0911204B7FD16CE809314019093A8
:1029E0001501A0931601B09317010E942F090BCE79
:1029F00061EE72E083E194E00E94EB19892B39F4D7
:102A000080910F04909110040E94C809FCCD6BEED8
:102A100072E083E194E00E94EB19892BA1F480918C
:102A20000F0490911004181619062CF4F092670404
:102A3000E0926604E8CD892B09F0E5CD1092670499
:102A400010926604E0CD61EF72E083E194E00E94B1
:102A5000EB19892B19F40E945E08D5CD68EF72E05E
:102A600083E194E00E94EB19892B19F40E9450092C
:102A7000F2CF6EEF72E083E194E00E94EB19892BB4
:102A800019F40E94E007BFCD64E073E083E194E0B5
:102A90000E94EB19892B09F0B6CD89E093E00E94E2
:102AA0002407B1CD109269041092680443CE90E0DF
:102AB00080E05CCE60E084E00E94C30689CE1F9374
:102AC000FC0199278827BC01E89411911032E9F3A1
:102AD000193010F01E30C8F31B3251F01D3249F48A
:102AE000689406C00E94BC15610F711D811D911D67
:102AF000119110531A30B0F33EF490958095709573
:102B000061957F4F8F4F9F4F1F91089543E855E088
:102B10000E948B150895FA01A191B081009719F4D4
:102B20001097E1F0CD01DC01CD010D90002011F4F2
:102B3000C00113C0FB012191222319F02015D9F700
:102B4000F3CFFB012191201519F41E92119606C0B6
:102B50002223C1F70D900020A1F7D001FA01A19323
:102B6000B0830895DC016C9161566A3108F0605EB3
:102B70006F5B6D93C1F70895592F482F372F262F7C
:102B8000660F771F881F991F660F771F881F991F71
:102B9000620F731F841F951F660F771F881F991F71
:102BA0000895F999FECF92BD81BDF89A992780B515
:102BB0000895262FF999FECF1FBA92BD81BD20BD81
:102BC0000FB6F894FA9AF99A0FBE019608952F92CB
:102BD0003F924F925F926F927F928F929F92AF92AD
:102BE000BF92CF92DF92EF92FF920F931F93CF93FA
:102BF000DF93CDB7DEB7CA1BDB0B0FB6F894DEBF91
:102C00000FBECDBF09942A88398848885F846E84B6
:102C10007D848C849B84AA84B984C884DF80EE8000
:102C2000FD800C811B81AA81B981CE0FD11D0FB609
:102C3000F894DEBF0FBECDBFED010895A1E21A2EBC
:102C4000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1F50
:102C5000A217B307E407F50720F0A21BB30BE40BA0
:102C6000F50B661F771F881F991F1A9469F76095E7
:102C70007095809590959B01AC01BD01CF010895A1
:102C8000052E97FB1EF400940E94571657FD07D09F
:102C90000E941E1607FC03D04EF40C945716509554
:102CA0004095309521953F4F4F4F5F4F0895909538
:102CB0008095709561957F4F8F4F9F4F0895EE0FD0
:102CC000FF1F0590F491E02D09940E946D163323A7
:102CD00012F48A1B9B0B0C947E16A29FB001B39F2B
:102CE000C001A39F700D811D1124911DB29F700D15
:102CF000811D1124911D08950E946D16B7FF08953E
:102D0000821B930B0895689401C0E894F92FF12B6E
:102D100012F00C94B716A0E0B0E0E1E9F6E10C94F3
:102D2000ED15092E059422F40E941317112392F435
:102D3000F0E80F26FFEFE094F09400951095B09422
:102D4000C094D094A194BF0ACF0ADF0AEF0AFF0A09
:102D50000F0B1F0B0E94C21607FC0E941317CDB762
:102D6000DEB7ECE00C940916689401C0E8948F92E9
:102D70009F92CF93DF930E94C216DF91CF919F90D5
:102D80008F90089588249924F401E401B0E49F937E
:102D9000AA279A158B049C04ED05FE05CF05D007E4
:102DA000A10798F4AD2FDC2FCF2FFE2FE92D982C03
:102DB000892E982F872F762F652F542F432F322F50
:102DC0002227B85031F7BF9127C01B2EBF91BB27D8
:102DD000220F331F441F551F661F771F881F991F1F
:102DE000881C991CEE1FFF1FCC1FDD1FAA1FBB1FD5
:102DF0008A149B04EC05FD05CE05DF05A007B1078D
:102E000048F08A189B08EC09FD09CE09DF09A00BE0
:102E1000B10B21601A94E1F62EF49401AF01BE01CA
:102E2000CD01000C08956095709580959095309532
:102E30004095509521953F4F4F4F5F4F6F4F7F4FBC
:102E40008F4F9F4F08950E9437170C941F180E94B0
:102E5000181858F00E94111840F029F45F3F29F02B
:102E60000C94081851110C9453180C940E180E94CD
:102E7000301868F39923B1F3552391F3951B550B43
:102E8000BB27AA2762177307840738F09F5F5F4F3D
:102E9000220F331F441FAA1FA9F335D00E2E3AF07C
:102EA000E0E832D091505040E695001CCAF72BD094
:102EB000FE2F29D0660F771F881FBB1F26173707E5
:102EC0004807AB07B0E809F0BB0B802DBF01FF2717
:102ED00093585F4F3AF09E3F510578F00C940818D4
:102EE0000C9453185F3FE4F3983ED4F3869577959E
:102EF0006795B795F7959F5FC9F7880F911D9695D0
:102F0000879597F90895E1E0660F771F881FBB1F2B
:102F1000621773078407BA0720F0621B730B840BD8
:102F2000BA0BEE1F88F7E09508950E949C176894ED
:102F3000B1110C94531808950E94381888F09F57C7
:102F400098F0B92F9927B751B0F0E1F0660F771FCD
:102F5000881F991F1AF0BA95C9F714C0B13091F0C3
:102F60000E945218B1E008950C945218672F782FE0
:102F70008827B85F39F0B93FCCF386957795679588
:102F8000B395D9F73EF490958095709561957F4FF4
:102F90008F4F9F4F0895E89409C097FB3EF490959A
:102FA0008095709561957F4F8F4F9F4F9923A9F022
:102FB000F92F96E9BB279395F695879577956795B1
:102FC000B795F111F8CFFAF4BB0F11F460FF1BC0F5
:102FD0006F5F7F4F8F4F9F4F16C0882311F096E988
:102FE00011C0772321F09EE8872F762F05C0662336
:102FF00071F096E8862F70E060E02AF09A95660FEF
:10300000771F881FDAF7880F9695879597F90895A7
:1030100097F99F6780E870E060E008959FEF80EC8B
:10302000089500240A94161617061806090608952E
:1030300000240A9412161306140605060895092E94
:103040000394000C11F4882352F0BB0F40F4BF2B03
:1030500011F460FF04C06F5F7F4F8F4F9F4F089543
:1030600057FD9058440F551F59F05F3F71F0479539
:10307000880F97FB991F61F09F3F79F0879508951E
:10308000121613061406551FF2CF4695F1DF08C03D
:10309000161617061806991FF1CF8695710561055A
:1030A00008940895E894BB2766277727CB0197F902
:1030B00008950E946C180C941F180E94111838F083
:1030C0000E94181820F0952311F00C9408180C9405
:1030D0000E1811240C9453180E94301870F3959F09
:1030E000C1F3950F50E0551F629FF001729FBB27FF
:1030F000F00DB11D639FAA27F00DB11DAA1F649F9B
:103100006627B00DA11D661F829F2227B00DA11D4D
:10311000621F739FB00DA11D621F839FA00D611DD3
:10312000221F749F3327A00D611D231F849F600DF4
:10313000211D822F762F6A2F11249F5750409AF01D
:10314000F1F088234AF0EE0FFF1FBB1F661F771FA9
:10315000881F91505040A9F79E3F510580F00C9474
:1031600008180C9453185F3FE4F3983ED4F3869507
:1031700077956795B795F795E7959F5FC1F7FE2B14
:10318000880F911D9695879597F908950F931F9332
:10319000CF93DF938230910510F482E090E0E091CC
:1031A0008705F091880530E020E0B0E0A0E030979E
:1031B00099F42115310509F44AC0281B390B243034
:1031C0003105D8F58A819B816115710589F1FB0173
:1031D00093838283FE0111C040815181028113815A
:1031E00048175907E0F04817590799F4109761F00C
:1031F00012960C93129713961C933296CF01DF917F
:10320000CF911F910F910895009387051093880522
:10321000F4CF2115310551F04217530738F0A901B9
:10322000DB019A01BD01DF01F801C1CFEF01F9CF48
:103230009093880580938705CDCFFE01E20FF31FA1
:10324000819391932250310939832883D7CF2091DC
:10325000850530918605232B41F420911E01309184
:103260001F01309386052093850520911C01309124
:103270001D012115310541F42DB73EB740912001C4
:1032800050912101241B350BE0918505F0918605B5
:10329000E217F307A0F42E1B3F0B2817390778F02D
:1032A000AC014E5F5F4F2417350748F04E0F5F1F8C
:1032B0005093860540938505819391939FCFF0E0CD
:1032C000E0E09CCFCF93DF930097E9F0FC013297C9
:1032D00013821282A0918705B0918805ED0130E03C
:1032E00020E01097A1F420813181820F931F20915B
:1032F0008505309186052817390709F061C0F093DC
:103300008605E0938505DF91CF910895EA01CE17F8
:10331000DF07E8F54A815B819E0141155105B1F750
:10332000E901FB83EA8349915991C40FD51FEC173A
:10333000FD0761F4808191810296840F951FE90158
:1033400099838883828193819B838A83F0E0E0E084
:1033500012968D919C9113970097B9F52D913C9100
:103360001197CD010296820F931F20918505309110
:1033700086052817390739F6309751F510928805D8
:1033800010928705B0938605A0938505BCCFD383A3
:10339000C28340815181840F951FC817D90761F4FA
:1033A0004E5F5F4F88819981480F591F5183408339
:1033B0008A819B81938382832115310509F0B0CFE7
:1033C000F0938805E09387059ECFFD01DC01C0CF17
:1033D00013821282D7CFFB01DC018D9101908019FD
:1033E0000110D9F3990B0895FB01DC0101900D92B6
:1033F0000020E1F7089510E0C6E9D0E004C0FE0126
:103400000E945F162196C739D107C9F7F894FFCFFC
:103410006C020000020014000100140088138813DD
:103420000D003200B42B1100220BAA050000890503
:1034300080000000000002036D029A024903CB02E3
:10344000A902BD0200000000D805A70509067A05FB
:10345000A10590057B050D0A005472696727642158
:10346000007B0022566363223A002C002256436FF1
:103470006D70223A002256466F6C223A0022457245
:1034800072223A0022507A436F6E223A007D004742
:1034900041494E5F4620002033780020332E357896
:1034A0000020342E333378002036780020313178F4
:1034B0000020494E56414C49440056464F4C20008E
:1034C00056434F4D5020004C4F4F505F4420005406
:1034D00052475F4420004859535420004C4F4749FD
:1034E000432000505A44455420005643435357202C
:1034F0000020332E33760020357600564D5F434F43
:103500004E535420004669726D776172652056658E
:103510007273696F6E2000322E332E325F64363143
:1035200030333400507972302D5069657A6F205AEB
:103530002D50726F6265204669726D7761726520E9
:1035400000496E666F3A2068747470733A2F2F6466
:103550006F63732E7079726F62616C6C70636273EB
:103560002E636F6D00536F757263653A20687474D3
:1035700070733A2F2F6769746875622E636F6D2FB1
:103580007079723062616C6C2F707972307069651D
:103590007A6F00496E697469616C697A696E672037
:1035A000507972302D5069657A6F2053656E736F54
:1035B000722E2E2E004741494E5F460056464F4C14
:1035C0000056434F4D50004C4F4F505F44005452F3
:1035D000475F440048595354004C4F4749430050FB
:1035E0005A44455400564343535700434F4E535497
:1035F0000056434341444A555354004445425547BD
:1036000000434F4E464947004552415345005354ED
:103610004154450048454C5000436865636B206445
:103620006F63732E7079726F62616C6C706362731A
:0C3630002E636F6D2F636F6E666967007C
:00000001FF

View file

@ -2430,14 +2430,3 @@ part parent "m328"
"x x x x x x x x x x x x i i i i"; "x x x x x x x x x x x x i i i i";
; ;
; ;
# Linux GPIO definitions for avrdude & Raspberry Picoweb
programmer
id = "pi_spi";
desc = "Use the Linux sysfs interface to bitbang GPIO lines";
type = "linuxgpio";
reset = 12;
sck = 24;
mosi = 23;
miso = 18;
;

File diff suppressed because it is too large Load diff

View file

@ -1,32 +0,0 @@
:107E000001C0ABC0112484B7882361F0982F9A7009
:107E1000923041F081FF02C097EF94BF282E80E09E
:107E2000BFD0EEC085E08093810082E08093C000E7
:107E300088E18093C10089E18093C40086E080934B
:107E4000C2008EE0ADD0259A84E028E13EEF91E0BB
:107E5000309385002093840096BBB09BFECF1D9A83
:107E6000A8954091C00047FD02C0815089F78CD091
:107E7000813461F489D0182F99D01238E9F0113883
:107E800011F488E001C083E078D064C0823411F43A
:107E900084E103C0853419F485E090D05BC085355A
:107EA00039F472D0C82F70D0D82FCC0FDD1F51C03D
:107EB000863521F484E082D080E0E6CF843661F517
:107EC00063D062D0D82E60D0F82E00E011E05CD0F4
:107ED000F80181938F01DE12FACF68D0F5E4FF122A
:107EE00001C0FFCF40E050E063E0CE0136D07E011C
:107EF00000E011E0F801419151918F0161E0C7016B
:107F00002CD0F2E0EF0EF11CD012F4CF40E050E0A4
:107F100065E0CE0122D01EC0843771F435D034D054
:107F2000F82E32D043D08E01F80185918F0125D0F3
:107F3000FA94F110F9CF0EC0853739F437D08EE1BD
:107F40001CD085E91AD086E19FCF813511F488E0F5
:107F500027D02CD080E111D08ACFFC010A0167BF65
:107F6000E895112407B600FCFDCF667029F0452B7B
:107F700019F481E187BFE89508959091C00095FFBD
:107F8000FCCF8093C60008958091C00087FFFCCF8E
:107F90008091C00084FD01C0A8958091C60008951D
:107FA000E0E6F0E098E1908380830895EDDF803291
:107FB00019F088E0F5DFFFCF84E1DFCFCF93C82F42
:0A7FC000E3DFC150E9F7CF91F1CFE4
:027FFE00000879
:0400000300007E007B
:00000001FF

View file

@ -19,19 +19,16 @@ Usage:
EOF EOF
# Default values # Default values
serialdevice=/dev/ttyUSB0 serialdevice=COM3
board=m328pb board=m328pb
lowfuse=0xE2 lowfuse=0xE2
highfuse=0xD6 highfuse=0xD6
exfuse=0xF6 exfuse=0xF6
firmwarebin=../firmware/Compiled-Firmware/pyr0_piezo_firmware_v2.3.2.hex firmwarebin=Pyr0_Piezo_Sensor_m328pb_v2.x.x.hex
# Programming functions # Programming functions
program-icsp() { program-icsp() {
#avrdude -c avrisp -p $board -b19200 -P$serialdevice -U lfuse:w:$lowfuse:m -U hfuse:w:$highfuse:m -U efuse:w:$exfuse:m -U flash:w:$firmwarebin -v avrdude -c avrisp -p $board -b19200 -P$serialdevice -U lfuse:w:$lowfuse:m -U hfuse:w:$highfuse:m -U efuse:w:$exfuse:m -U flash:w:$firmwarebin -v
avrdude -Cbootloader/MiniCire-avrdude.conf -v -patmega328pb -cstk500v1 -P$serialdevice -b19200 -e -Ulock:w:0x3f:m -Uefuse:w:0b11110110:m -Uhfuse:w:0xd6:m -Ulfuse:w:0xe2:m
avrdude -Cbootloader/MiniCire-avrdude.conf -v -patmega328pb -cstk500v1 -P$serialdevice -b19200 -Uflash:w:bootloader/optiboot_flash_atmega328pb_UART0_38400_8000000L.hex:i -Ulock:w:0x0f:m
avrdude -Cbootloader/MiniCire-avrdude.conf -v -c stk500v1 -p $board -b19200 -P$serialdevice -U flash:w:$firmwarebin
} }
program-uart() { program-uart() {
@ -46,11 +43,11 @@ while getopts ":b:d:f:i:u" opt
h) echo "$usage" h) echo "$usage"
exit exit
;; ;;
b) board="$@"; b) board="$2";
shift ;; shift ;;
d) serialdevice="$@"; d) serialdevice="$2";
shift ;; shift ;;
f) firmwarebin="$@"; f) firmwarebin="$2";
shift ;; shift ;;
i) program-icsp i) program-icsp
shift ;; shift ;;