Compare commits

...

13 commits

16 changed files with 3463 additions and 54 deletions

View file

@ -1,3 +1,5 @@
For more extensive documentation, refer to the [Docs Site](https://docs.pyroballpcbs.com) (source included in this repository)
Presenting...
---
@ -22,7 +24,7 @@ Well, yeah a couple. The sensor requires introducing a small amount of physical
### How do I use it?
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.
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.
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,14 +2,58 @@
**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?
**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?
**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?
**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**
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.
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.
**Loop Duration**
@ -145,6 +145,16 @@ The hysteresis value, governed by the `HYST` setting, is a variable used in the
**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:
`scale_constant = internal1.1Ref * 1023 * 1000`

View file

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

View file

@ -91,13 +91,12 @@ update the voltMeterConstant variable in pP_config.h with the correct value
// Headers, variables, and functions
#include "LightChrono.h"
#include "pP_pins.h"
#include <Arduino.h>
#include <EEPROM.h>
#include "pP_function.h"
#include "pP_i2c.hpp"
#include "pP_pins.h"
#include "pP_serial.h"
#include "pP_volatile.h"
#include <Arduino.h>
void setup() {
// Setup PWM on voltage follower (PD3)
@ -146,13 +145,6 @@ void setup() {
void loop() {
if (mainLoop.hasPassed(LOOP_DUR)) {
mainLoop.restart();
// Blink LED's on init
if (BlinkCount > 0) {
BlinkState = !BlinkState;
digitalWriteFast(ERR_LED, BlinkState);
// digitalWriteFast(TRG_OUT, BlinkState);
--BlinkCount;
}
// Get Serial Input
serialInput();
@ -188,25 +180,21 @@ void loop() {
// Check that the piezo disk is properly connected
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
if (Debug > 0) {
serialPrintState();
}
// Sets trigger output state to false after completing loop
// digitalWriteFast(TRG_OUT, HIGH);
sensorHReading = 0;
}
// Blink LED
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

@ -55,9 +55,11 @@ extern long voltMeterConstant; // For fine tuning input voltage sense
extern uint8_t pP_i2c_address;
#ifndef PP_VERSION
#define PP_VERSION "2.3.1"
#define PP_VERSION "2.3.2"
#endif // PP_VERSION fallback if python script fails
#define BLINK_DURATION 100
void eraseEEPROM();
void setDefaultConfig();
void restoreConfig();

View file

@ -38,12 +38,12 @@ void doubleFlash() {
/*------------------------------------------------*/
void pulse() {
if (lastTriggerTimestamp == 0) {
digitalWriteFast(TRG_OUT, LOGIC);
sensorHReading = 1;
delay(TRG_DUR);
digitalWriteFast(TRG_OUT, !LOGIC);
Serial.println("Trig'd!");
doubleFlash();
lastTriggerTimestamp = millis();
}
}
/*------------------------------------------------*/

View file

@ -1,6 +1,7 @@
#include "pP_cmd.h"
#include "pP_volatile.h"
#include "string.h"
#include "Arduino.h"
void parseData() {
@ -162,7 +163,7 @@ void updateParams() {
} else if (strcmp(serialMessageIn, "STATE") == 0) {
serialPrintState();
} else if (strcmp(serialMessageIn, "HELP") == 0) {
#if defined(ARDUINO_AVR_ATmega328PB)
#if defined(ARDUINO_AVR_ATmega328PBA)
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 comparator voltage (high threshold): VCOMP [float value]");

View file

@ -3,7 +3,6 @@
#include "stdint.h"
// 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_COMP = 0; // Variable for Comparator adjustment
volatile int ERR_STATE = 0;
@ -28,8 +27,7 @@ int VFol = 0;
// Error blink parameters
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
int BlinkCount = InitCount * 2; // Multiply Blink count by 2 to handle toggle state
// Serial Input Parsing Variables
char inputBuffer[buffSize];
@ -38,4 +36,7 @@ bool serialIncoming = false;
char serialMessageIn[buffSize] = {0};
long serialLong = 0;
long lastTriggerTimestamp = 0;
LightChrono mainLoop;
LightChrono blinkLoop;

View file

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

View file

@ -1,7 +1,7 @@
#!/usr/bin/python3
import subprocess
major_version = "2.3.1"
major_version = "2.3.2"
git_head = str(subprocess.check_output(["git", "rev-parse", "HEAD"])[0:6])

View file

@ -0,0 +1,869 @@
: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,3 +2430,14 @@ part parent "m328"
"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

@ -0,0 +1,32 @@
: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,16 +19,19 @@ Usage:
EOF
# Default values
serialdevice=COM3
serialdevice=/dev/ttyUSB0
board=m328pb
lowfuse=0xE2
highfuse=0xD6
exfuse=0xF6
firmwarebin=Pyr0_Piezo_Sensor_m328pb_v2.x.x.hex
firmwarebin=../firmware/Compiled-Firmware/pyr0_piezo_firmware_v2.3.2.hex
# Programming functions
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() {
@ -43,11 +46,11 @@ while getopts ":b:d:f:i:u" opt
h) echo "$usage"
exit
;;
b) board="$2";
b) board="$@";
shift ;;
d) serialdevice="$2";
d) serialdevice="$@";
shift ;;
f) firmwarebin="$2";
f) firmwarebin="$@";
shift ;;
i) program-icsp
shift ;;