First commit

master
marcel 3 months ago
parent 54da6fbfac
commit 5b646d27ae
  1. 36
      README.md
  2. 13
      build_doc/Makefile
  3. 277
      build_doc/aprs_digipeater.html
  4. 142
      build_doc/aprs_digipeater.md
  5. 563
      build_doc/css/mvp.css
  6. BIN
      build_doc/images/RPi-LoRa-shield_prototype.jpg
  7. BIN
      build_doc/images/RPi-LoRa-shield_schematic.pdf
  8. BIN
      build_doc/images/RPi-LoRa-shield_schematic.png
  9. BIN
      build_doc/images/alinco_dj580t.jpg
  10. 346
      build_doc/images/block_diagram_overview.svg
  11. BIN
      build_doc/images/diamond-x30.jpg
  12. BIN
      build_doc/images/lilygo-ttgo-lora32.jpg
  13. 275
      build_doc/images/mees_logo.svg
  14. 75
      build_doc/images/packetmodem_nano2/packetmodem_nano2_rev2.kicad_prl
  15. 361
      build_doc/images/packetmodem_nano2/packetmodem_nano2_rev2.kicad_pro
  16. BIN
      build_doc/images/packetmodem_nano2_pcb_small.jpg
  17. BIN
      build_doc/images/packetmodem_nano2_rev2.pdf
  18. BIN
      build_doc/images/packetmodem_nano2_rev2.png
  19. BIN
      build_doc/images/raspberry_pi_proto.jpg
  20. BIN
      build_doc/images/raspberry_pi_proto_backside.jpg
  21. BIN
      build_doc/images/raspberry_pi_proto_small.jpg
  22. BIN
      build_doc/images/rs-485_dongle.webp
  23. BIN
      build_doc/images/triplexer.png
  24. BIN
      build_doc/images/weather_station_sensors_small.jpg
  25. 482
      build_doc/installation_pe1rxf_aprs_weather_server.html
  26. 541
      build_doc/installation_pe1rxf_aprs_weather_server.md
  27. 16
      build_doc/template/custom_settings.tex
  28. 120
      build_doc/template/template.html
  29. 1959
      hardware/RPi_LoRa_shield-KiCad/Connector.dcm
  30. 17441
      hardware/RPi_LoRa_shield-KiCad/Connector.lib
  31. 6
      hardware/RPi_LoRa_shield-KiCad/README.md
  32. 2054
      hardware/RPi_LoRa_shield-KiCad/RPi_LoRa_shield-B_Cu.gbr
  33. BIN
      hardware/RPi_LoRa_shield-KiCad/RPi_LoRa_shield-B_Cu.pdf
  34. 8317
      hardware/RPi_LoRa_shield-KiCad/RPi_LoRa_shield-F_Cu.gbr
  35. BIN
      hardware/RPi_LoRa_shield-KiCad/RPi_LoRa_shield-F_Cu.pdf
  36. 2437
      hardware/RPi_LoRa_shield-KiCad/RPi_LoRa_shield-F_SilkS.gbr
  37. BIN
      hardware/RPi_LoRa_shield-KiCad/RPi_LoRa_shield-F_SilkS.pdf
  38. 425
      hardware/RPi_LoRa_shield-KiCad/RPi_LoRa_shield-cache.lib
  39. 78
      hardware/RPi_LoRa_shield-KiCad/RPi_LoRa_shield-job.gbrjob
  40. 17
      hardware/RPi_LoRa_shield-KiCad/RPi_LoRa_shield.csv
  41. 2946
      hardware/RPi_LoRa_shield-KiCad/RPi_LoRa_shield.kicad_pcb
  42. 2946
      hardware/RPi_LoRa_shield-KiCad/RPi_LoRa_shield.kicad_pcb-bak
  43. 698
      hardware/RPi_LoRa_shield-KiCad/RPi_LoRa_shield.net
  44. BIN
      hardware/RPi_LoRa_shield-KiCad/RPi_LoRa_shield.ods
  45. BIN
      hardware/RPi_LoRa_shield-KiCad/RPi_LoRa_shield.pdf
  46. 252
      hardware/RPi_LoRa_shield-KiCad/RPi_LoRa_shield.pro
  47. 1698
      hardware/RPi_LoRa_shield-KiCad/RPi_LoRa_shield.sch
  48. 1698
      hardware/RPi_LoRa_shield-KiCad/RPi_LoRa_shield.sch-bak
  49. 863
      hardware/RPi_LoRa_shield-KiCad/RPi_LoRa_shield.xml
  50. BIN
      hardware/RPi_LoRa_shield-KiCad/RPi_LoRa_shield_BOM.pdf
  51. BIN
      hardware/RPi_LoRa_shield-KiCad/RPi_LoRa_shield_prototype.jpg
  52. 1947
      hardware/RPi_LoRa_shield-KiCad/fp-info-cache
  53. BIN
      hardware/RPi_LoRa_shield-KiCad/modification_LM2596.jpg
  54. 675
      hardware/packetmodem_nano2/MicroModemGP/LICENSE
  55. 378
      hardware/packetmodem_nano2/MicroModemGP/Makefile
  56. 39
      hardware/packetmodem_nano2/MicroModemGP/README.md
  57. 9
      hardware/packetmodem_nano2/MicroModemGP/config.h
  58. 40
      hardware/packetmodem_nano2/MicroModemGP/device.h
  59. 2
      hardware/packetmodem_nano2/MicroModemGP/flash
  60. 546
      hardware/packetmodem_nano2/MicroModemGP/hardware/AFSK.c
  61. 162
      hardware/packetmodem_nano2/MicroModemGP/hardware/AFSK.h
  62. 49
      hardware/packetmodem_nano2/MicroModemGP/hardware/Serial.c
  63. 20
      hardware/packetmodem_nano2/MicroModemGP/hardware/Serial.h
  64. 0
      hardware/packetmodem_nano2/MicroModemGP/images/.keepdir
  65. 58
      hardware/packetmodem_nano2/MicroModemGP/main.c
  66. 669
      hardware/packetmodem_nano2/MicroModemGP/precompiled/MicroModemGP-direct.hex
  67. 688
      hardware/packetmodem_nano2/MicroModemGP/precompiled/MicroModemGP-kiss.hex
  68. 88
      hardware/packetmodem_nano2/MicroModemGP/protocol/AX25.c
  69. 40
      hardware/packetmodem_nano2/MicroModemGP/protocol/AX25.h
  70. 8
      hardware/packetmodem_nano2/MicroModemGP/protocol/HDLC.h
  71. 159
      hardware/packetmodem_nano2/MicroModemGP/protocol/KISS.c
  72. 32
      hardware/packetmodem_nano2/MicroModemGP/protocol/KISS.h
  73. 696
      hardware/packetmodem_nano2/MicroModemGP/protocol/LLP.c
  74. 72
      hardware/packetmodem_nano2/MicroModemGP/protocol/LLP.h
  75. 36
      hardware/packetmodem_nano2/MicroModemGP/util/CRC-CCIT.c
  76. 18
      hardware/packetmodem_nano2/MicroModemGP/util/CRC-CCIT.h
  77. 85
      hardware/packetmodem_nano2/MicroModemGP/util/FIFO.h
  78. 12
      hardware/packetmodem_nano2/MicroModemGP/util/constants.h
  79. 43
      hardware/packetmodem_nano2/MicroModemGP/util/time.h
  80. 71
      hardware/packetmodem_nano2/README.md
  81. BIN
      hardware/packetmodem_nano2/images/ISP-modification.jpg
  82. BIN
      hardware/packetmodem_nano2/images/modification.jpg
  83. BIN
      hardware/packetmodem_nano2/images/modification_small.jpg
  84. BIN
      hardware/packetmodem_nano2/images/print.jpg
  85. BIN
      hardware/packetmodem_nano2/images/print_small.jpg
  86. 378
      hardware/packetmodem_nano2/microaprs-3v-kiss-latest.hex
  87. 89
      hardware/packetmodem_nano2/packetmodem_nano2/bom.ini
  88. 72143
      hardware/packetmodem_nano2/packetmodem_nano2/fp-info-cache
  89. BIN
      hardware/packetmodem_nano2/packetmodem_nano2/packetmodem_nano2-B_Cu.pdf
  90. BIN
      hardware/packetmodem_nano2/packetmodem_nano2/packetmodem_nano2-F_Cu.pdf
  91. BIN
      hardware/packetmodem_nano2/packetmodem_nano2/packetmodem_nano2-F_Mask.pdf
  92. BIN
      hardware/packetmodem_nano2/packetmodem_nano2/packetmodem_nano2-F_SilkS.pdf
  93. 437
      hardware/packetmodem_nano2/packetmodem_nano2/packetmodem_nano2-cache.lib
  94. 3
      hardware/packetmodem_nano2/packetmodem_nano2/packetmodem_nano2-rescue.dcm
  95. 28
      hardware/packetmodem_nano2/packetmodem_nano2/packetmodem_nano2-rescue.lib
  96. 4233
      hardware/packetmodem_nano2/packetmodem_nano2/packetmodem_nano2.kicad_pcb
  97. 4223
      hardware/packetmodem_nano2/packetmodem_nano2/packetmodem_nano2.kicad_pcb-bak
  98. 909
      hardware/packetmodem_nano2/packetmodem_nano2/packetmodem_nano2.net
  99. 252
      hardware/packetmodem_nano2/packetmodem_nano2/packetmodem_nano2.pro
  100. 1235
      hardware/packetmodem_nano2/packetmodem_nano2/packetmodem_nano2.sch
  101. Some files were not shown because too many files have changed in this diff Show More

@ -1,3 +1,35 @@
# aprs_digipeater_weather_telemetry
# APRS digipeater with weather station and PE1RXF telemetry server
This project is a collection of former (and some new) projects connected together to make an APRS digipeater, which doubles as an APRS weather station, with PE1RXF telemetry server capabilities.
## Abstract
This project is a collection of former (and some new) projects connected together to make an APRS digipeater, which doubles as an APRS weather station, with PE1RXF telemetry server capabilities.
![Block diagram of digipeater](./build_doc/images/block_diagram_overview.svg "Block diagram of digipeater")
## Documentation
An apprehensive description of the project can be found here: [https://meezenest.nl/mees/aprs_digipeater.html](https://meezenest.nl/mees/aprs_digipeater.html)
## Specifications
- 2 meter transceiver with 5 Watt output power
- 70 cm LoRa transceiver with 20 dBm output power
- Raspberry Pi Zero 2 W
- APRS cross band digipeater software
- Weather station via ModBus
- Rnode TCP/IP over 70 cm LoRa for internet
## License
Copyright (C) 2024 M.T. Konstapel
### Software
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
### Hardware and documentation
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

@ -0,0 +1,13 @@
html:
pandoc -s aprs_digipeater.md --toc --toc-depth=1 -c ./css/mvp.css \
--template ./template/template.html -o aprs_digipeater.html
installation_guide:
pandoc -s installation_pe1rxf_aprs_weather_server.md --toc --toc-depth=1 -c ./css/mvp.css \
--template ./template/template.html -o installation_pe1rxf_aprs_weather_server.html
pdf:
pandoc aprs_digipeater.md --toc -o aprs_digipeater.pdf --pdf-engine=xelatex -H ./template/custom_settings.tex
clean:
rm -rvf build

@ -0,0 +1,277 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
<head>
<meta charset="utf-8" />
<meta name="generator" content="pandoc" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
<meta name="author" content="M.T. Konstapel" />
<meta name="dcterms.date" content="2024-02-14" />
<title>APRS digipeater</title>
<link rel="stylesheet" href="./css/mvp.css" />
<style type="text/css">
:root {
--width-content: 1080px;
}
nav {
justify-content: space-around;
}
</style>
</head>
<body>
<header id="title-block-header">
<nav id="TOC">
<ul>
<li>
<a href="#">Index</a>
<ul>
<li><a href="#the-story" id="toc-the-story">The
story</a></li>
<li><a href="#the-design" id="toc-the-design">The
design</a></li>
<li><a href="#the-build" id="toc-the-build">The
build</a></li>
<li><a href="#the-specifications"
id="toc-the-specifications">The specifications</a></li>
<li><a href="#license" id="toc-license">License</a></li>
</ul>
</li>
<li>
<a href="./aprs_digipeater.pdf">PDF version</a>
</li>
<li>
<a href="https://git.meezenest.nl/marcel/aprs_digipeater">Git repo</a>
</li>
<li>
<a href="https://meezenest.nl/mees/aprs_digipeater.html">Back</a>
</li>
</ul>
<a href="https://www.meezenest.nl/mees/"><img alt="Logo" src="./images/mees_logo.svg" height="70"></a>
</nav>
<h1 class="title">APRS digipeater</h1>
<p class="subtitle">with weather and PE1RXF telemetry server</p>
<p class="author">M.T. Konstapel</p>
<p class="date">2024-02-14</p>
<p><a href="./aprs_digipeater.pdf"><i>PDF version</i></a></p>
</header>
<main>
<article>
<p><b>Abstract </b><p>This project is a collection of former (and some
new) projects connected together to make an APRS digipeater, which
doubles as an APRS weather station, with PE1RXF telemetry server
capabilities.</p></p>
<figure>
<img src="./images/block_diagram_overview.svg"
title="Block diagram ofdigipeater" alt="Block diagram of digipeater" />
<figcaption aria-hidden="true">Block diagram of digipeater</figcaption>
</figure>
<h1 id="the-story">The story</h1>
<p>For several years I operate an APRS iGate on both 2 meter and 70 cm
LoRa. I added my own PE1RXF telemetry support (see: <a
href="https://www.meezenest.nl/mees-elektronica/aprs_telemetry.html">https://www.meezenest.nl/mees-elektronica/aprs_telemetry.html</a>).
This worked fine, but I already had designed an updated version of the
iGate. The prototype worked, but had some issues. So I kept using the
old iGate and forgot all about the new version.</p>
<p>Some time ago I started to design a weather station (<a
href="https://www.meezenest.nl/mees-elektronica/weather_station.html">https://www.meezenest.nl/mees-elektronica/weather_station.html</a>)
which I located in the back garden. Because it was out of reach of my
wifi network, I used the APRS iGate prototype to send the weather data
via its build in LoRa modem to my PE1RXF telemetry server.</p>
<p>Than the idea of relocating my existing iGate to the location of my
weather station emerged. The weather station had all the hardware I
needed build in. And it made sense to combine the two systems, as both
handle APRS traffic. Besides, both systems use energy so shutting one
down seems sensible.</p>
<p>But the reason I used the APRS iGate prototype in the first place,
namely the absence of wifi, became a problem again. An APRS iGate has to
have access to the internet, that’s the whole point! But the amount of
data it sends is small, so I didn’t need lots of bandwidth. And at that
point another dormant project woke up: I always wanted to experiment
with TCP/IP over the air. In the past I did some experiments with TCP/IP
over AX.25 (packet radio), but the 1200 baud modems were simply too
slow. I also had build a 5GHz HamNet link, but 350 Mbit/s is quite the
overkill. I needed a link speed between 15kB/s to 500kB/s. The Rnode
project from <a
href="https://unsigned.io/hardware/RNode.html">https://unsigned.io/hardware/RNode.html</a>
seemed perfect.</p>
<h1 id="the-design">The design</h1>
<h2 id="weather-station">Weather station</h2>
<p>This project started with a weather station. I designed it as a stand
alone weather station with an RS-484 ModBus interface. It can measure
wind speed, wind direction, rain fall, humidity, air pressure and
temperature. The complete build document of the weather station can be
found here: <a
href="https://www.meezenest.nl/mees-elektronica/projects/weather_station/build_doc/weather_station.html">https://www.meezenest.nl/mees-elektronica/projects/weather_station/build_doc/weather_station.html</a></p>
<figure>
<img src="./images/weather_station_sensors_small.jpg"
title="Weather station" alt="Weather station" />
<figcaption aria-hidden="true">Weather station</figcaption>
</figure>
<h2 id="brains">Brains</h2>
<p>Although stand alone in operation, to read the measurements the
weather station must be connected to a host via RS-485. This host is a
Raspberry Pi LoRa shield I designed to be the successor of my first APRS
iGate. It is a simple PCB with room for a Raspberry Pi Zero 2 W, a LoRa
transceiver, a real time clock and a power supply.</p>
<figure>
<img src="./images/RPi-LoRa-shield_prototype.jpg"
title="Raspberry Pi LoRa shield prototype"
alt="Raspberry Pi LoRa shield prototype" />
<figcaption aria-hidden="true">Raspberry Pi LoRa shield
prototype</figcaption>
</figure>
<figure>
<img src="./images/RPi-LoRa-shield_schematic.png"
title="Raspberry Pi LoRa shield schematic"
alt="Raspberry Pi LoRa shield schematic" />
<figcaption aria-hidden="true">Raspberry Pi LoRa shield
schematic</figcaption>
</figure>
<p><a href="./images/RPi-LoRa-shield_schematic.pdf">PDF version of
schematic</a></p>
<h2 id="peripherals">Peripherals</h2>
<p>The Raspberry Pi need some extra hardware for interfacing the various
peripherals, like the transceiver, the ModBus and the Rnode modem.</p>
<h3 id="usb-hub">USB hub</h3>
<p>As the Raspberry Pi only has one USB port, a hub is essential. I used
an old one I had laying around. Taken out of its case, it fits
perfectly.</p>
<h3 id="rs-485-dongle">RS-485 dongle</h3>
<p>To interface with the weather station a USB to RS-485 dongle is
needed. A cheap one from Joy-IT (<a
href="https://joy-it.net/en/products/SBC-TTL-RS485">https://joy-it.net/en/products/SBC-TTL-RS485</a>)
is fine.</p>
<figure>
<img src="./images/rs-485_dongle.webp" title="RS-485 dongle"
alt="RS-485 dongle" />
<figcaption aria-hidden="true">RS-485 dongle</figcaption>
</figure>
<h3 id="baud-aprs-modem">1200 baud APRS modem</h3>
<p>This modem I also had laying around. It is called “Packet modem nano
2” and it is based on the Micromodem from unsigned.io (<a
href="https://unsigned.io/hardware/MicroModem.html">https://unsigned.io/hardware/MicroModem.html</a>).
The design files for this modem are part of this project and can be
found in the git repository.</p>
<figure>
<img src="./images/packetmodem_nano2_pcb_small.jpg"
title="Packet modem nano 2" alt="Packet modem nano 2" />
<figcaption aria-hidden="true">Packet modem nano 2</figcaption>
</figure>
<figure>
<img src="./images/packetmodem_nano2_rev2.png"
title="Packet modem nano 2 schematic"
alt="Packet modem nano 2 schamatic" />
<figcaption aria-hidden="true">Packet modem nano 2
schamatic</figcaption>
</figure>
<p><a href="./images/packetmodem_nano2_rev2.pdf">PDF version of
schematic</a></p>
<h3 id="rnode-modem">Rnode modem</h3>
<p>For the low speed network link I use the Rnode project from <a
href="https://unsigned.io/hardware/RNode.html">https://unsigned.io/hardware/RNode.html</a>.
This is an amazing project and I only use a small part of the features
available. In my ow project is works as a KISS compatible LoRa modem.
Together with the tncattach program (<a
href="https://unsigned.io/software/tncattach.html">https://unsigned.io/software/tncattach.html</a>)
it forms a Linux network adapter over which I can route all the network
traffic. The maximum speed is just above 20 KB/s, which is enough for
APRS-IS traffic. For archival reasons, I included the source code of
tncattach as well as rns (the firmware and configuration utility) in the
git repository.</p>
<p>The hardware on which the Rnode firmware is flashed is a LilyGO
LoRa32 v2.1 (also known as TTGO T3 v1.6.1). Of course you need at least
two boards to form a network. With a good antenna, the range is easily
100 meters (and probably more than 1 km), which is plenty enough for
what I need.</p>
<figure>
<img src="./images/lilygo-ttgo-lora32.jpg" title="LilyGO LoRa32"
alt="LilyGO LoRa32" />
<figcaption aria-hidden="true">LilyGO LoRa32</figcaption>
</figure>
<h2 id="more-than-brains-alone">More than brains alone</h2>
<p>The Raspberry Pi with all the extra hardware is housed in a small
plastic housing. On the back panel behind the SMA connectors and the
power jack, I placed a copper strip. This acts as the start grounding
strip on which all other ground wires are connected. This prevents a lot
of RF and EMC problems.</p>
<figure>
<img src="./images/raspberry_pi_proto_small.jpg"
title="Inside the brains" alt="Inside the brains" />
<figcaption aria-hidden="true">Inside the brains</figcaption>
</figure>
<p><a href="./images/raspberry_pi_proto.jpg">Large version of
photo</a></p>
<figure>
<img src="./images/raspberry_pi_proto_backside.jpg" title="Back side"
alt="Back side" />
<figcaption aria-hidden="true">Back side</figcaption>
</figure>
<h2 id="external-hardware">External hardware</h2>
<h3 id="meter-transceiver">2 meter transceiver</h3>
<p>The 2 meter transceiver is an old Alinco DJ-580 hand held radio with
an output power of 5 Watt. It is connected to both the 5 pin DIN
connector and the 12 Volt barrel jack on the Raspberry Pi.</p>
<figure>
<img src="./images/alinco_dj580t.jpg" title="Alinco DJ-580"
alt="Alinco DJ-580" />
<figcaption aria-hidden="true">Alinco DJ-580</figcaption>
</figure>
<h3 id="diplexer">Diplexer</h3>
<p>The LoRa APRS transceiver (70cm) and the APRS transceiver (2m) are
connected to a triplexer, making it possible to use one dual band
antenna for both radios. Why a triplexer? Well, I had one laying around.
I terminated the unused 1200MHz connector with a 50 Ohm load. But a
diplexer would have been sufficient, of course.</p>
<figure>
<img src="./images/triplexer.png" title="Triplexer" alt="Triplexer" />
<figcaption aria-hidden="true">Triplexer</figcaption>
</figure>
<h3 id="antenna">Antenna</h3>
<p>This is a simple 2m/70cm dual band antenna from Diamond, the X30.</p>
<figure>
<img src="./images/diamond-x30.jpg" title="Antenna" alt="Antenna" />
<figcaption aria-hidden="true">Antenna</figcaption>
</figure>
<h1 id="the-build">The build</h1>
<h2 id="software">Software</h2>
<p>The instalation of all the needed software on the Raspberry Pi is
complicated, so I wrote a separate document: <a
href="./installation_pe1rxf_aprs_weather_server.html">installation_pe1rxf_aprs_weather_server.html</a></p>
<h1 id="the-specifications">The specifications</h1>
<ul>
<li>2 meter transceiver with 5 Watt output power</li>
<li>70 cm LoRa transceiver with 20 dBm output power</li>
<li>Raspberry Pi Zero 2 W</li>
<li>APRS cross band digipeater software</li>
<li>Weather station via ModBus</li>
<li>Rnode TCP/IP over 70 cm LoRa for internet</li>
</ul>
<h1 id="license">License</h1>
<p>Copyright (C) 2023, 2024 M.T. Konstapel</p>
<p><a
href="https://meezenest.nl/mees/">https://meezenest.nl/mees/</a></p>
<p>The software is published as open-source software (GPL). The hardware
is published as open-source hardware (OSH).</p>
<h2 id="software-1">Software</h2>
<p>This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by the
Free Software Foundation, either version 3 of the License, or (at your
option) any later version.</p>
<h2 id="hardware-and-documentation">Hardware and documentation</h2>
<p>This work is licensed under a Creative Commons Attribution-ShareAlike
4.0 International License.</p>
<hr>
</article>
</main>
<footer>
<p>&copy;
2024-02-14
M.T. Konstapel
<a href="https://meezenest.nl/mees/">https://meezenest.nl/mees/</a>
</p><p>This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike 4.0 International License</a>.
</p>
</footer>
</body>
</html>

@ -0,0 +1,142 @@
---
title: APRS digipeater
subtitle: with weather and PE1RXF telemetry server
author: M.T. Konstapel
date: 2024-02-14
website: https://meezenest.nl/mees/
page_back: https://meezenest.nl/mees/aprs_digipeater.html
logo: ./images/mees_logo.svg
pdf_version: ./aprs_digipeater.pdf
git_repo: https://git.meezenest.nl/marcel/aprs_digipeater
numbersections: true
# Formatting:
geometry: "a4paper, left=2.0cm, right=2.0cm, top=1.9cm, bottom=2.54cm"
abstract: >
This project is a collection of former (and some new) projects connected together to make an APRS digipeater, which doubles as an APRS weather station, with PE1RXF telemetry server capabilities.
---
![Block diagram of digipeater](./images/block_diagram_overview.svg "Block diagram ofdigipeater")
# The story
For several years I operate an APRS iGate on both 2 meter and 70 cm LoRa. I added my own PE1RXF telemetry support (see: [https://www.meezenest.nl/mees-elektronica/aprs_telemetry.html](https://www.meezenest.nl/mees-elektronica/aprs_telemetry.html)). This worked fine, but I already had designed an updated version of the iGate. The prototype worked, but had some issues. So I kept using the old iGate and forgot all about the new version.
Some time ago I started to design a weather station ([https://www.meezenest.nl/mees-elektronica/weather_station.html](https://www.meezenest.nl/mees-elektronica/weather_station.html)) which I located in the back garden. Because it was out of reach of my wifi network, I used the APRS iGate prototype to send the weather data via its build in LoRa modem to my PE1RXF telemetry server.
Than the idea of relocating my existing iGate to the location of my weather station emerged. The weather station had all the hardware I needed build in. And it made sense to combine the two systems, as both handle APRS traffic. Besides, both systems use energy so shutting one down seems sensible.
But the reason I used the APRS iGate prototype in the first place, namely the absence of wifi, became a problem again. An APRS iGate has to have access to the internet, that's the whole point! But the amount of data it sends is small, so I didn't need lots of bandwidth. And at that point another dormant project woke up: I always wanted to experiment with TCP/IP over the air. In the past I did some experiments with TCP/IP over AX.25 (packet radio), but the 1200 baud modems were simply too slow. I also had build a 5GHz HamNet link, but 350 Mbit/s is quite the overkill. I needed a link speed between 15kB/s to 500kB/s. The Rnode project from [https://unsigned.io/hardware/RNode.html](https://unsigned.io/hardware/RNode.html) seemed perfect.
# The design
## Weather station
This project started with a weather station. I designed it as a stand alone weather station with an RS-484 ModBus interface. It can measure wind speed, wind direction, rain fall, humidity, air pressure and temperature. The complete build document of the weather station can be found here: [https://www.meezenest.nl/mees-elektronica/projects/weather_station/build_doc/weather_station.html](https://www.meezenest.nl/mees-elektronica/projects/weather_station/build_doc/weather_station.html)
![Weather station](./images/weather_station_sensors_small.jpg "Weather station")
## Brains
Although stand alone in operation, to read the measurements the weather station must be connected to a host via RS-485. This host is a Raspberry Pi LoRa shield I designed to be the successor of my first APRS iGate. It is a simple PCB with room for a Raspberry Pi Zero 2 W, a LoRa transceiver, a real time clock and a power supply.
![Raspberry Pi LoRa shield prototype](./images/RPi-LoRa-shield_prototype.jpg "Raspberry Pi LoRa shield prototype")
![Raspberry Pi LoRa shield schematic](./images/RPi-LoRa-shield_schematic.png "Raspberry Pi LoRa shield schematic")
[PDF version of schematic](./images/RPi-LoRa-shield_schematic.pdf)
## Peripherals
The Raspberry Pi need some extra hardware for interfacing the various peripherals, like the transceiver, the ModBus and the Rnode modem.
### USB hub
As the Raspberry Pi only has one USB port, a hub is essential. I used an old one I had laying around. Taken out of its case, it fits perfectly.
### RS-485 dongle
To interface with the weather station a USB to RS-485 dongle is needed. A cheap one from Joy-IT ([https://joy-it.net/en/products/SBC-TTL-RS485](https://joy-it.net/en/products/SBC-TTL-RS485)) is fine.
![RS-485 dongle](./images/rs-485_dongle.webp "RS-485 dongle")
### 1200 baud APRS modem
This modem I also had laying around. It is called "Packet modem nano 2" and it is based on the Micromodem from unsigned.io ([https://unsigned.io/hardware/MicroModem.html](https://unsigned.io/hardware/MicroModem.html)). The design files for this modem are part of this project and can be found in the git repository.
![Packet modem nano 2](./images/packetmodem_nano2_pcb_small.jpg "Packet modem nano 2")
![Packet modem nano 2 schamatic](./images/packetmodem_nano2_rev2.png "Packet modem nano 2 schematic")
[PDF version of schematic](./images/packetmodem_nano2_rev2.pdf)
### Rnode modem
For the low speed network link I use the Rnode project from [https://unsigned.io/hardware/RNode.html](https://unsigned.io/hardware/RNode.html). This is an amazing project and I only use a small part of the features available. In my ow project is works as a KISS compatible LoRa modem. Together with the tncattach program ([https://unsigned.io/software/tncattach.html](https://unsigned.io/software/tncattach.html)) it forms a Linux network adapter over which I can route all the network traffic. The maximum speed is just above 20 KB/s, which is enough for APRS-IS traffic. For archival reasons, I included the source code of tncattach as well as rns (the firmware and configuration utility) in the git repository.
The hardware on which the Rnode firmware is flashed is a LilyGO LoRa32 v2.1 (also known as TTGO T3 v1.6.1). Of course you need at least two boards to form a network. With a good antenna, the range is easily 100 meters (and probably more than 1 km), which is plenty enough for what I need.
![LilyGO LoRa32](./images/lilygo-ttgo-lora32.jpg "LilyGO LoRa32")
## More than brains alone
The Raspberry Pi with all the extra hardware is housed in a small plastic housing. On the back panel behind the SMA connectors and the power jack, I placed a copper strip. This acts as the start grounding strip on which all other ground wires are connected. This prevents a lot of RF and EMC problems.
![Inside the brains](./images/raspberry_pi_proto_small.jpg "Inside the brains")
[Large version of photo](./images/raspberry_pi_proto.jpg)
![Back side](./images/raspberry_pi_proto_backside.jpg "Back side")
## External hardware
### 2 meter transceiver
The 2 meter transceiver is an old Alinco DJ-580 hand held radio with an output power of 5 Watt. It is connected to both the 5 pin DIN connector and the 12 Volt barrel jack on the Raspberry Pi.
![Alinco DJ-580](./images/alinco_dj580t.jpg "Alinco DJ-580")
### Diplexer
The LoRa APRS transceiver (70cm) and the APRS transceiver (2m) are connected to a triplexer, making it possible to use one dual band antenna for both radios. Why a triplexer? Well, I had one laying around. I terminated the unused 1200MHz connector with a 50 Ohm load. But a diplexer would have been sufficient, of course.
![Triplexer](./images/triplexer.png "Triplexer")
### Antenna
This is a simple 2m/70cm dual band antenna from Diamond, the X30.
![Antenna](./images/diamond-x30.jpg "Antenna")
# The build
## Software
The instalation of all the needed software on the Raspberry Pi is complicated, so I wrote a separate document: [installation_pe1rxf_aprs_weather_server.html](./installation_pe1rxf_aprs_weather_server.html)
# The specifications
- 2 meter transceiver with 5 Watt output power
- 70 cm LoRa transceiver with 20 dBm output power
- Raspberry Pi Zero 2 W
- APRS cross band digipeater software
- Weather station via ModBus
- Rnode TCP/IP over 70 cm LoRa for internet
# License
Copyright (C) 2023, 2024 M.T. Konstapel
[https://meezenest.nl/mees/](https://meezenest.nl/mees/)
The software is published as open-source software (GPL). The hardware is published as open-source hardware (OSH).
## Software
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
## Hardware and documentation
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

@ -0,0 +1,563 @@
/* MVP.css v1.14 - https://github.com/andybrewer/mvp */
/* Edited by Konstapel https://meezenest.nl/mees */
:root {
--active-brightness: 0.85;
--border-radius: 5px;
--box-shadow: 2px 2px 10px;
--color-accent: #f4f0ec;
--color-bg: #fff;
--color-bg-secondary: #e9e9e9;
--color-link: #a9a9a9;
--color-secondary: #3366FF;
--color-secondary-accent: #920de90b;
--color-shadow: #f4f4f4;
--color-table: #a9a9a9;
--color-text: #000;
--color-text-secondary: #999;
--font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
--hover-brightness: 1.2;
--justify-important: center;
--justify-normal: left;
--line-height: 1.5;
--width-card: 285px;
--width-card-medium: 460px;
--width-card-wide: 1080px;
--width-content: 1080px;
}
@media (prefers-color-scheme: dark) {
:root[color-mode="user"] {
--color-accent: #0097fc4f;
--color-bg: #333;
--color-bg-secondary: #555;
--color-link: #0097fc;
--color-secondary: #e20de9;
--color-secondary-accent: #e20de94f;
--color-shadow: #bbbbbb20;
--color-table: #0097fc;
--color-text: #f7f7f7;
--color-text-secondary: #aaa;
}
}
html {
scroll-behavior: smooth;
}
@media (prefers-reduced-motion: reduce) {
html {
scroll-behavior: auto;
}
}
/* Layout */
article aside {
background: var(--color-secondary-accent);
border-left: 4px solid var(--color-secondary);
padding: 0.01rem 0.8rem;
}
body {
background: var(--color-bg);
color: var(--color-text);
font-family: var(--font-family);
line-height: var(--line-height);
margin: 0;
overflow-x: hidden;
padding: 0;
font-size: 110%;
}
footer,
header,
main {
margin: 0 auto;
max-width: var(--width-content);
padding: 3rem 1rem;
}
main {
border: 1px solid lightgray;
border-radius: 5px;
}
footer {
font-size: 0.7em;
}
hr {
background-color: var(--color-bg-secondary);
border: none;
height: 1px;
margin: 4rem 0;
width: 100%;
}
section {
display: flex;
flex-wrap: wrap;
justify-content: var(--justify-important);
}
section img,
article img {
max-width: 100%;
}
section pre {
overflow: auto;
}
section aside {
border: 1px solid var(--color-bg-secondary);
border-radius: var(--border-radius);
box-shadow: var(--box-shadow) var(--color-shadow);
margin: 1rem;
padding: 1.25rem;
width: var(--width-card);
}
section aside:hover {
box-shadow: var(--box-shadow) var(--color-bg-secondary);
}
[hidden] {
display: none;
}
/* Headers */
article header,
div header,
main header {
padding-top: 0;
}
header {
text-align: var(--justify-important);
}
header a b,
header a em,
header a i,
header a strong {
margin-left: 0.5rem;
margin-right: 0.5rem;
}
header nav img {
margin: 1rem 0;
}
section header {
padding-top: 0;
width: 100%;
}
/* Nav */
nav {
align-items: center;
display: flex;
font-weight: bold;
justify-content: space-between;
margin-bottom: 7rem;
}
nav ul {
list-style: none;
padding: 0;
}
nav ul li {
display: inline-block;
margin: 0 0.5rem;
position: relative;
text-align: left;
}
/* Nav Dropdown */
nav ul li:hover ul {
display: block;
}
nav ul li ul {
background: var(--color-bg);
border: 1px solid var(--color-bg-secondary);
border-radius: var(--border-radius);
box-shadow: var(--box-shadow) var(--color-shadow);
display: none;
height: auto;
left: -2px;
padding: .5rem 1rem;
position: absolute;
top: 1.7rem;
white-space: nowrap;
width: auto;
z-index: 1;
}
nav ul li ul::before {
/* fill gap above to make mousing over them easier */
content: "";
position: absolute;
left: 0;
right: 0;
top: -0.5rem;
height: 0.5rem;
}
nav ul li ul li,
nav ul li ul li a {
display: block;
}
/* Typography */
code,
samp {
background-color: var(--color-accent);
border-radius: var(--border-radius);
color: var(--color-text);
display: inline-block;
margin: 0 0.1rem;
padding: 0 0.5rem;
}
details {
margin: 1.3rem 0;
}
details summary {
font-weight: bold;
cursor: pointer;
}
h1,
h2,
h3,
h4,
h5,
h6 {
line-height: var(--line-height);
}
h1 {
font-size: 1.875em;
border-bottom: 1px solid lightgray;
}
h2 {
font-size: 1.4em;
}
mark {
padding: 0.1rem;
}
ol li,
ul li {
padding: 0.2rem 0;
}
p {
margin: 0.75rem 0;
padding: 0;
width: 100%;
}
pre {
margin: 1rem 0;
max-width: var(--width-card-wide);
padding: 1rem 0;
}
pre code,
pre samp {
display: block;
max-width: var(--width-card-wide);
padding: 0.8rem 2rem;
/*white-space: pre-wrap;*/
overflow-x: auto;
}
small {
color: var(--color-text-secondary);
}
sup {
background-color: var(--color-secondary);
border-radius: var(--border-radius);
color: var(--color-bg);
font-size: xx-small;
font-weight: bold;
margin: 0.2rem;
padding: 0.2rem 0.3rem;
position: relative;
top: -2px;
}
/* Links */
a {
color: var(--color-link);
display: inline-block;
font-weight: bold;
text-decoration: underline;
}
a:active {
filter: brightness(var(--active-brightness));
}
a:hover {
filter: brightness(var(--hover-brightness));
}
a b,
a em,
a i,
a strong,
button,
input[type="submit"] {
border-radius: var(--border-radius);
display: inline-block;
font-size: medium;
font-weight: bold;
line-height: var(--line-height);
margin: 0.5rem 0;
padding: 1rem 2rem;
}
button,
input[type="submit"] {
font-family: var(--font-family);
}
button:active,
input[type="submit"]:active {
filter: brightness(var(--active-brightness));
}
button:hover,
input[type="submit"]:hover {
cursor: pointer;
filter: brightness(var(--hover-brightness));
}
a b,
a strong,
button,
input[type="submit"] {
background-color: var(--color-link);
border: 2px solid var(--color-link);
color: var(--color-bg);
}
a em,
a i {
border: 2px solid var(--color-link);
border-radius: var(--border-radius);
color: var(--color-link);
display: inline-block;
padding: 1rem 2rem;
}
article aside a {
color: var(--color-secondary);
}
/* Images */
figure {
margin: 0;
padding: 0;
text-align: center;
}
figure img {
max-width: 100%;
max-height: 500px;
}
figure figcaption {
color: var(--color-text-secondary);
}
/* Forms */
button:disabled,
input:disabled {
background: var(--color-bg-secondary);
border-color: var(--color-bg-secondary);
color: var(--color-text-secondary);
cursor: not-allowed;
}
button[disabled]:hover,
input[type="submit"][disabled]:hover {
filter: none;
}
form {
border: 1px solid var(--color-bg-secondary);
border-radius: var(--border-radius);
box-shadow: var(--box-shadow) var(--color-shadow);
display: block;
max-width: var(--width-card-wide);
min-width: var(--width-card);
padding: 1.5rem;
text-align: var(--justify-normal);
}
form header {
margin: 1.5rem 0;
padding: 1.5rem 0;
}
input,
label,
select,
textarea {
display: block;
font-size: inherit;
max-width: var(--width-card-wide);
}
input[type="checkbox"],
input[type="radio"] {
display: inline-block;
}
input[type="checkbox"]+label,
input[type="radio"]+label {
display: inline-block;
font-weight: normal;
position: relative;
top: 1px;
}
input[type="range"] {
padding: 0.4rem 0;
}
input,
select,
textarea {
border: 1px solid var(--color-bg-secondary);
border-radius: var(--border-radius);
margin-bottom: 1rem;
padding: 0.4rem 0.8rem;
}
input[type="text"],
textarea {
width: calc(100% - 1.6rem);
}
input[readonly],
textarea[readonly] {
background-color: var(--color-bg-secondary);
}
label {
font-weight: bold;
margin-bottom: 0.2rem;
}
/* Popups */
dialog {
border: 1px solid var(--color-bg-secondary);
border-radius: var(--border-radius);
box-shadow: var(--box-shadow) var(--color-shadow);
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 50%;
z-index: 999;
}
/* Tables */
table {
border: 1px solid var(--color-bg-secondary);
border-radius: var(--border-radius);
border-spacing: 0;
display: inline-block;
max-width: 100%;
overflow-x: auto;
padding: 0;
white-space: nowrap;
}
table td,
table th,
table tr {
padding: 0.4rem 0.8rem;
text-align: var(--justify-important);
}
table thead {
background-color: var(--color-table);
border-collapse: collapse;
border-radius: var(--border-radius);
/*color: var(--color-bg);*/
margin: 0;
padding: 0;
}
table thead th:first-child {
border-top-left-radius: var(--border-radius);
}
table thead th:last-child {
border-top-right-radius: var(--border-radius);
}
table thead th:first-child,
table tr td:first-child {
text-align: var(--justify-normal);
}
table tr:nth-child(even) {
background-color: var(--color-accent);
}
/* Quotes */
blockquote {
display: block;
font-size: x-large;
line-height: var(--line-height);
margin: 1rem auto;
max-width: var(--width-card-medium);
padding: 1.5rem 1rem;
text-align: var(--justify-important);
}
blockquote footer {
color: var(--color-text-secondary);
display: block;
font-size: small;
line-height: var(--line-height);
padding: 1.5rem 0;
}
/* Scrollbars */
* {
scrollbar-width: thin;
scrollbar-color: rgb(202, 202, 232) auto;
}
*::-webkit-scrollbar {
width: 5px;
height: 5px;
}
*::-webkit-scrollbar-track {
background: transparent;
}
*::-webkit-scrollbar-thumb {
background-color: rgb(202, 202, 232);
border-radius: 10px;
}
h1.title {
border-bottom: 0px solid white;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 515 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

@ -0,0 +1,346 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
width="214.84991mm"
height="100.50046mm"
viewBox="0 0 214.84991 100.50046"
version="1.1"
id="svg8">
<defs
id="defs2">
<rect
x="22.16769"
y="3.8238685"
width="80.499229"
height="26.173925"
id="rect1269" />
</defs>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
transform="translate(-19.703887,-34.737515)">
<rect
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round"
id="rect833"
width="32.358166"
height="17.884912"
x="19.953886"
y="61.708118" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="21.454836"
y="72.269768"
id="text837"><tspan
id="tspan835"
x="21.454836"
y="72.269768"
style="font-size:4.23333px;stroke-width:0.264583">weather station</tspan></text>
<rect
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round"
id="rect833-7"
width="32.358166"
height="17.884912"
x="71.045479"
y="61.708118" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="75.03212"
y="72.269775"
id="text837-8"><tspan
id="tspan835-5"
x="75.03212"
y="72.269775"
style="font-size:4.23333px;stroke-width:0.264583">Raspberry Pi</tspan></text>
<rect
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round"
id="rect833-7-7"
width="32.358166"
height="17.884912"
x="122.59509"
y="61.708118" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="123.90763"
y="72.269775"
id="text837-8-4"><tspan
id="tspan835-5-1"
x="123.90763"
y="72.269775"
style="font-size:4.23333px;stroke-width:0.264583">1200bd modem</tspan></text>
<rect
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round"
id="rect833-7-8"
width="32.358166"
height="17.884912"
x="122.59509"
y="89.350433" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="126.58173"
y="99.912094"
id="text837-8-3"><tspan
id="tspan835-5-18"
x="126.58173"
y="99.912094"
style="font-size:4.23333px;stroke-width:0.264583">LoRa modem</tspan></text>
<rect
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round"
id="rect833-7-9"
width="32.358166"
height="17.884912"
x="122.59509"
y="117.10306" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="125.43665"
y="127.66472"
id="text837-8-6"><tspan
id="tspan835-5-4"
x="125.43665"
y="127.66472"
style="font-size:4.23333px;stroke-width:0.264583">Rnode modem</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 52.249003,70.625797 h 18.892218 v 0.142885"
id="path947" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 103.45611,70.806256 h 18.89221 v 0.142885"
id="path947-3" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 122.56167,99.417808 H 95.672787 V 79.783034"
id="path970" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 122.74772,126.3903 H 85.552755 V 79.872569"
id="path976" />
<text
xml:space="preserve"
style="font-size:3.52778px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="54.93726"
y="69.550896"
id="text998"><tspan
id="tspan996"
x="54.93726"
y="69.550896"
style="font-size:3.52778px;stroke-width:0.264583">ModBus</tspan></text>
<text
xml:space="preserve"
style="font-size:3.52777px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="108.74959"
y="69.571716"
id="text998-3"><tspan
id="tspan996-8"
x="108.74959"
y="69.571716"
style="font-size:3.52777px;stroke-width:0.264583">USB</tspan></text>
<text
xml:space="preserve"
style="font-size:3.52777px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="108.33673"
y="125.29066"
id="text998-3-6"><tspan
id="tspan996-8-0"
x="108.33673"
y="125.29066"
style="font-size:3.52777px;stroke-width:0.264583">USB</tspan></text>
<text
xml:space="preserve"
style="font-size:3.52777px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="108.95499"
y="98.305733"
id="text998-3-4"><tspan
id="tspan996-8-8"
x="108.95499"
y="98.305733"
style="font-size:3.52777px;stroke-width:0.264583">SPI</tspan></text>
<rect
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round"
id="rect833-7-7-8"
width="32.358166"
height="17.884912"
x="173.7784"
y="89.350433" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="182.17464"
y="99.931183"
id="text837-8-4-8"><tspan
id="tspan835-5-1-9"
x="182.17464"
y="99.931183"
style="font-size:4.23333px;stroke-width:0.264583">Diplexer</tspan></text>
<rect
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round"
id="rect833-7-7-7"
width="32.358166"
height="17.884912"
x="173.84229"
y="61.708118" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="176.33116"
y="72.269775"
id="text837-8-4-7"><tspan
id="tspan835-5-1-6"
x="176.33116"
y="72.269775"
style="font-size:4.23333px;stroke-width:0.264583">2m transceiver</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 154.92819,70.949141 h 18.89221 v 0.142885"
id="path947-3-4" />
<text
xml:space="preserve"
style="font-size:3.52777px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="160.22166"
y="69.7146"
id="text998-3-3"><tspan
id="tspan996-8-03"
x="160.22166"
y="69.7146"
style="font-size:3.52777px;stroke-width:0.264583" /></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 154.95583,98.80263 h 18.89221 v 0.142885"
id="path947-3-4-0" />
<text
xml:space="preserve"
style="font-size:3.52777px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="160.24931"
y="97.568092"
id="text998-3-3-9"><tspan
id="tspan996-8-03-2"
x="160.24931"
y="97.568092"
style="font-size:3.52777px;stroke-width:0.264583">Coax</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 206.30928,98.945515 h 18.89221 v 0.14289"
id="path947-3-4-0-5" />
<text
xml:space="preserve"
style="font-size:3.52777px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="211.60277"
y="97.710983"
id="text998-3-3-9-4"><tspan
id="tspan996-8-03-2-0"
x="211.60277"
y="97.710983"
style="font-size:3.52777px;stroke-width:0.264583">Coax</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 190.18904,79.794096 v 9.605169"
id="path1138" />
<text
xml:space="preserve"
style="font-size:3.52777px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="191.15703"
y="86.260994"
id="text998-3-3-9-5"><tspan
id="tspan996-8-03-2-9"
x="191.15703"
y="86.260994"
style="font-size:3.52777px;stroke-width:0.264583">Coax</tspan></text>
<g
id="g1180"
transform="translate(-26.48906,9.50855)">
<path
style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 251.93497,68.891522 c 0,20.545443 -0.24442,20.545443 -0.24442,20.545443"
id="path1158" />
<path
style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 251.82973,78.242627 c 8.79116,-8.791154 8.79116,-8.791154 8.79116,-8.791154"
id="path1160" />
<path
style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 243.03857,69.451473 c 8.79116,8.791154 8.79116,8.791154 8.79116,8.791154"
id="path1160-4" />
</g>
<g
id="g1180-6"
transform="translate(-26.20851,37.454075)">
<path
style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 251.93497,68.891522 c 0,20.545443 -0.24442,20.545443 -0.24442,20.545443"
id="path1158-9" />
<path
style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 251.82973,78.242627 c 8.79116,-8.791154 8.79116,-8.791154 8.79116,-8.791154"
id="path1160-2" />
<path
style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 243.03857,69.451473 c 8.79116,8.791154 8.79116,8.791154 8.79116,8.791154"
id="path1160-4-2" />
</g>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 154.90857,126.89104 h 70.57347"
id="path1206" />
<text
xml:space="preserve"
style="font-size:3.52777px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="160.12888"
y="125.05822"
id="text998-3-3-9-4-4"><tspan
id="tspan996-8-03-2-0-7"
x="160.12888"
y="125.05822"
style="font-size:3.52777px;stroke-width:0.264583">Coax</tspan></text>
<rect
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round"
id="rect833-7-75"
width="32.358166"
height="17.884912"
x="71.045479"
y="34.987514" />
<text
xml:space="preserve"
style="font-size:4.23333px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="81.602333"
y="45.155029"
id="text837-8-48"><tspan
id="tspan835-5-12"
x="81.602333"
y="45.155029"
style="font-size:4.23333px;stroke-width:0.264583">RTC</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 85.705478,61.745883 V 52.851494"
id="path1247" />
<text
xml:space="preserve"
style="font-size:3.52777px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583"
x="87.162468"
y="58.533051"
id="text998-3-8"><tspan
id="tspan996-8-9"
x="87.162468"
y="58.533051"
style="font-size:3.52777px;stroke-width:0.264583">I2C</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

@ -0,0 +1,275 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:ooo="http://xml.openoffice.org/svg/export"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.2"
width="70.505592mm"
height="29.969891mm"
viewBox="0 0 7050.5593 2996.989"
preserveAspectRatio="xMidYMid"
fill-rule="evenodd"
stroke-width="28.222"
stroke-linejoin="round"
xml:space="preserve"
id="svg124"><metadata
id="metadata128"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata>
<defs
class="ClipPathGroup"
id="defs8">
<clipPath
id="presentation_clip_path"
clipPathUnits="userSpaceOnUse">
<rect
x="0"
y="0"
width="21000"
height="29700"
id="rect2" />
</clipPath>
<clipPath
id="presentation_clip_path_shrink"
clipPathUnits="userSpaceOnUse">
<rect
x="21"
y="29"
width="20958"
height="29641"
id="rect5" />
</clipPath>
</defs>
<defs
id="defs19">
<font
id="EmbeddedFont_1"
horiz-adv-x="2048"
horiz-origin-x="0"
horiz-origin-y="0"
vert-origin-x="512"
vert-origin-y="768"
vert-adv-y="1024">
<font-face
font-family="Nasa embedded"
units-per-em="2048"
font-weight="normal"
font-style="normal"
ascent="1508"
descent="397"
id="font-face10" />
<missing-glyph
horiz-adv-x="2048"
d="M 0,0 L 2047,0 2047,2047 0,2047 0,0 Z"
id="missing-glyph12" />
<glyph
unicode="s"
horiz-adv-x="1086"
d="M 1087,968 L 437,968 C 408,968 385,957 368,935 351,912 342,886 342,856 342,827 350,802 367,781 383,760 406,750 437,750 L 820,750 C 923,750 1005,711 1065,634 1119,565 1146,479 1146,377 1146,276 1119,190 1065,120 1005,43 923,4 820,4 L 123,4 123,264 776,264 C 804,264 826,276 842,299 858,322 866,348 866,378 866,408 858,434 843,455 828,476 805,486 776,486 L 392,486 C 288,486 206,524 145,601 90,670 63,755 63,856 63,956 90,1041 145,1110 206,1187 289,1226 392,1226 L 1087,1226 1087,968 Z"
id="glyph14" />
<glyph
unicode="e"
horiz-adv-x="1033"
d="M 1087,4 L 392,4 C 288,4 206,43 145,121 90,191 63,277 63,379 63,471 86,551 132,618 86,685 63,764 63,855 63,955 90,1040 145,1110 206,1187 288,1226 392,1226 L 1087,1226 1087,968 437,968 C 408,968 385,957 368,935 351,912 342,886 342,856 342,827 350,802 367,781 383,760 406,750 437,750 L 1087,750 1087,489 1087,489 400,489 C 382,481 368,467 358,446 347,426 342,404 342,380 342,349 350,323 367,300 383,278 406,267 437,267 L 1087,267 1087,4 Z"
id="glyph16" />
</font>
</defs>
<defs
class="TextShapeIndex"
id="defs23">
<g
ooo:slide="id1"
ooo:id-list="id3 id4 id5 id6"
id="g21" />
</defs>
<defs
class="EmbeddedBulletChars"
id="defs55">
<g
id="bullet-char-template-57356"
transform="matrix(4.8828125e-4,0,0,-4.8828125e-4,0,0)">
<path
d="M 580,1141 1163,571 580,0 -4,571 Z"
id="path25" />
</g>
<g
id="bullet-char-template-57354"
transform="matrix(4.8828125e-4,0,0,-4.8828125e-4,0,0)">
<path
d="M 8,1128 H 1137 V 0 H 8 Z"
id="path28" />
</g>
<g
id="bullet-char-template-10146"
transform="matrix(4.8828125e-4,0,0,-4.8828125e-4,0,0)">
<path
d="M 174,0 602,739 174,1481 1456,739 Z M 1358,739 309,1346 659,739 Z"
id="path31" />
</g>
<g
id="bullet-char-template-10132"
transform="matrix(4.8828125e-4,0,0,-4.8828125e-4,0,0)">
<path
d="M 2015,739 1276,0 H 717 l 543,543 H 174 v 393 h 1086 l -543,545 h 557 z"
id="path34" />
</g>
<g
id="bullet-char-template-10007"
transform="matrix(4.8828125e-4,0,0,-4.8828125e-4,0,0)">
<path
d="m 0,-2 c -7,16 -16,29 -25,39 l 381,530 c -94,256 -141,385 -141,387 0,25 13,38 40,38 9,0 21,-2 34,-5 21,4 42,12 65,25 l 27,-13 111,-251 280,301 64,-25 24,25 c 21,-10 41,-24 62,-43 C 886,937 835,863 770,784 769,783 710,716 594,584 L 774,223 c 0,-27 -21,-55 -63,-84 l 16,-20 C 717,90 699,76 672,76 641,76 570,178 457,381 L 164,-76 c -22,-34 -53,-51 -92,-51 -42,0 -63,17 -64,51 -7,9 -10,24 -10,44 0,9 1,19 2,30 z"
id="path37" />
</g>
<g
id="bullet-char-template-10004"
transform="matrix(4.8828125e-4,0,0,-4.8828125e-4,0,0)">
<path
d="M 285,-33 C 182,-33 111,30 74,156 52,228 41,333 41,471 c 0,78 14,145 41,201 34,71 87,106 158,106 53,0 88,-31 106,-94 l 23,-176 c 8,-64 28,-97 59,-98 l 735,706 c 11,11 33,17 66,17 42,0 63,-15 63,-46 V 965 c 0,-36 -10,-64 -30,-84 L 442,47 C 390,-6 338,-33 285,-33 Z"
id="path40" />
</g>
<g
id="bullet-char-template-9679"
transform="matrix(4.8828125e-4,0,0,-4.8828125e-4,0,0)">
<path
d="M 813,0 C 632,0 489,54 383,161 276,268 223,411 223,592 c 0,181 53,324 160,431 106,107 249,161 430,161 179,0 323,-54 432,-161 108,-107 162,-251 162,-431 0,-180 -54,-324 -162,-431 C 1136,54 992,0 813,0 Z"
id="path43" />
</g>
<g
id="bullet-char-template-8226"
transform="matrix(4.8828125e-4,0,0,-4.8828125e-4,0,0)">
<path
d="m 346,457 c -73,0 -137,26 -191,78 -54,51 -81,114 -81,188 0,73 27,136 81,188 54,52 118,78 191,78 73,0 134,-26 185,-79 51,-51 77,-114 77,-187 0,-75 -25,-137 -76,-188 -50,-52 -112,-78 -186,-78 z"
id="path46" />
</g>
<g
id="bullet-char-template-8211"
transform="matrix(4.8828125e-4,0,0,-4.8828125e-4,0,0)">
<path
d="M -4,459 H 1135 V 606 H -4 Z"
id="path49" />
</g>
<g
id="bullet-char-template-61548"
transform="matrix(4.8828125e-4,0,0,-4.8828125e-4,0,0)">
<path
d="m 173,740 c 0,163 58,303 173,419 116,115 255,173 419,173 163,0 302,-58 418,-173 116,-116 174,-256 174,-419 0,-163 -58,-303 -174,-418 C 1067,206 928,148 765,148 601,148 462,206 346,322 231,437 173,577 173,740 Z"
id="path52" />
</g>
</defs>
<defs
class="TextEmbeddedBitmaps"
id="defs57" />
<g
id="g62"
transform="translate(-4012.2687,-5881.0823)">
<g
id="id2"
class="Master_Slide">
<g
id="bg-id2"
class="Background" />
<g
id="bo-id2"
class="BackgroundObjects" />
</g>
</g>
<g
aria-label="e"
transform="rotate(89.9)"
id="text72"
class="TextShape"><path
d="M 1697.0783,-29.243069 H 547.68128 q -257.99414,0 -408.49072,-193.495601 Q 3.5782547,-396.38858 3.5782547,-649.42129 q 0,-228.22559 114.1127953,-395.26021 -114.1127953,-167.0347 -114.1127953,-391.9527 0,-248.0713 135.6123053,-421.7212 150.49658,-191.8418 408.49072,-191.8418 H 1697.0783 v 426.6826 H 622.10267 q -72.76758,0 -115.7666,56.2295 -41.34522,54.5757 -41.34522,128.9971 0,72.7676 39.69141,124.0357 41.34521,51.268 117.42041,51.268 H 1697.0783 v 425.02883 11.57666 H 560.91175 q -44.65283,19.8457 -71.11377,69.45996 -24.80713,49.61426 -24.80713,109.15137 0,74.42138 39.69141,128.99707 41.34521,54.57568 117.42041,54.57568 H 1697.0783 Z"
style="fill:#000000;stroke:none"
id="path925" /></g><g
aria-label="e"
id="text85"
class="TextShape"><path
d="m 3669.2615,1691.8372 h -957.6612 q -214.957,0 -340.3486,-161.2178 -112.9902,-144.6826 -112.9902,-355.5059 0,-190.15427 95.0771,-329.32517 -95.0771,-139.1709 -95.0771,-326.56934 0,-206.68945 112.9902,-351.37207 Q 2496.6433,8.0070801 2711.6003,8.0070801 h 957.6612 V 363.51294 h -895.6543 q -60.6289,0 -96.4551,46.84961 -34.4482,45.47168 -34.4482,107.47851 0,60.62891 33.0703,103.34473 34.4482,42.71582 97.833,42.71582 h 895.6543 v 354.12789 9.6455 h -946.6377 q -37.2041,16.5352 -59.251,57.8731 -20.6689,41.3379 -20.6689,90.9434 0,62.0068 33.0703,107.4785 34.4482,45.4717 97.833,45.4717 h 895.6543 z"
style="fill:#000000;stroke:none"
id="path928" /></g><g
aria-label="e"
id="text98"
class="TextShape"><path
d="m 5346.2615,1691.8372 h -957.6612 q -214.957,0 -340.3486,-161.2178 -112.9902,-144.6826 -112.9902,-355.5059 0,-190.15427 95.0771,-329.32517 -95.0771,-139.1709 -95.0771,-326.56934 0,-206.68945 112.9902,-351.37207 Q 4173.6433,8.0070801 4388.6003,8.0070801 h 957.6612 V 363.51294 h -895.6543 q -60.6289,0 -96.4551,46.84961 -34.4482,45.47168 -34.4482,107.47851 0,60.62891 33.0703,103.34473 34.4482,42.71582 97.833,42.71582 h 895.6543 v 354.12789 9.6455 h -946.6377 q -37.2041,16.5352 -59.251,57.8731 -20.6689,41.3379 -20.6689,90.9434 0,62.0068 33.0703,107.4785 34.4482,45.4717 97.833,45.4717 h 895.6543 z"
style="fill:#000000;stroke:none"
id="path931" /></g><g
aria-label="s"
id="text111"
class="TextShape"><path
d="m 6969.2617,371.51294 h -895.6543 q -60.6289,0 -96.4551,46.84961 -34.4482,45.47168 -34.4482,107.47851 0,60.62891 33.0703,103.34473 34.4483,42.71582 97.833,42.71582 h 527.7471 q 213.5791,0 337.5928,159.83985 111.6123,143.30468 111.6123,354.12794 0,209.4453 -111.6123,354.1279 -124.0137,159.8399 -337.5928,159.8399 h -960.417 v -358.2618 h 899.7881 q 57.873,0 90.9433,-46.8496 33.0704,-48.2275 33.0704,-110.2343 0,-62.0069 -31.6924,-104.7227 -31.6924,-44.0938 -92.3213,-44.0938 h -529.125 q -214.957,0 -340.3486,-158.46187 -112.9903,-141.92675 -112.9903,-351.37207 0,-206.68945 112.9903,-349.99414 126.7695,-159.83984 340.3486,-159.83984 h 957.6611 z"
style="fill:#000000;stroke:none"
id="path934" /></g>
<g
aria-label="electronics"
transform="scale(0.80512419,1.2420444)"
id="text839"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1541.64px;line-height:125%;font-family:PLTypewriter9;-inkscape-font-specification:'PLTypewriter9, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:39.6875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"><path
d="M 594.46122,2097.9831 H 144.30233 q 21.58296,100.2066 95.58168,149.539 73.99872,49.3325 154.164,49.3325 115.62301,0 152.62237,-87.8735 13.87476,-33.916 55.49904,-33.916 57.04068,0 57.04068,46.2492 0,16.958 -15.4164,44.7075 -13.87476,26.2079 -44.70756,57.0407 -29.29116,30.8328 -86.33184,52.4158 -57.04069,21.5829 -129.49777,21.5829 -147.99744,0 -252.82896,-100.2066 Q 25.59605,2196.648 25.59605,2053.2755 q 0,-138.7476 97.12332,-238.9542 97.12332,-101.7482 237.41256,-101.7482 143.37252,0 220.45453,92.4984 78.62364,92.4984 78.62364,234.3292 0,27.7496 -10.79148,41.6243 -10.79148,12.3331 -21.58296,15.4164 -10.79148,1.5417 -32.37444,1.5417 z m -448.61725,-98.665 h 396.20149 q -7.7082,-87.8735 -55.49905,-137.206 -46.2492,-49.3324 -126.41448,-49.3324 -70.91544,0 -132.58104,49.3324 -61.6656,47.7909 -81.70692,137.206 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1541.64px;font-family:PLTypewriter9;-inkscape-font-specification:'PLTypewriter9, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke:#ffffff;stroke-width:39.6875;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path902" /><path
d="m 1214.1999,1512.1599 v 776.9865 h 200.4132 q 64.7489,0 64.7489,50.8741 0,49.3325 -64.7489,49.3325 H 899.70534 q -64.74888,0 -64.74888,-50.8741 0,-49.3325 64.74888,-49.3325 H 1100.1185 V 1547.6176 H 899.70534 q -64.74888,0 -64.74888,-50.8741 0,-49.3325 64.74888,-49.3325 H 1149.451 q 38.541,0 50.8741,13.8747 13.8748,12.3332 13.8748,50.8742 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1541.64px;font-family:PLTypewriter9;-inkscape-font-specification:'PLTypewriter9, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke:#ffffff;stroke-width:39.6875;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path904" /><path
d="m 2213.182,2097.9831 h -450.1588 q 21.5829,100.2066 95.5816,149.539 73.9988,49.3325 154.164,49.3325 115.623,0 152.6224,-87.8735 13.8748,-33.916 55.499,-33.916 57.0407,0 57.0407,46.2492 0,16.958 -15.4164,44.7075 -13.8747,26.2079 -44.7075,57.0407 -29.2912,30.8328 -86.3319,52.4158 -57.0407,21.5829 -129.4977,21.5829 -147.9975,0 -252.829,-100.2066 -104.8315,-100.2066 -104.8315,-243.5791 0,-138.7476 97.1233,-238.9542 97.1233,-101.7482 237.4126,-101.7482 143.3725,0 220.4545,92.4984 78.6236,92.4984 78.6236,234.3292 0,27.7496 -10.7915,41.6243 -10.7914,12.3331 -21.5829,15.4164 -10.7915,1.5417 -32.3745,1.5417 z m -448.6172,-98.665 h 396.2015 q -7.7082,-87.8735 -55.4991,-137.206 -46.2492,-49.3324 -126.4144,-49.3324 -70.9155,0 -132.5811,49.3324 -61.6656,47.7909 -81.7069,137.206 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1541.64px;font-family:PLTypewriter9;-inkscape-font-specification:'PLTypewriter9, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke:#ffffff;stroke-width:39.6875;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path906" /><path
d="m 3090.3747,2221.3143 q 0,9.2498 -6.1666,27.7495 -6.1665,16.958 -26.2079,44.7075 -18.4996,26.2079 -46.2492,49.3325 -27.7495,21.583 -78.6236,38.541 -49.3325,15.4164 -110.9981,15.4164 -141.8309,0 -242.0375,-98.6649 -98.6649,-100.2066 -98.6649,-242.0375 0,-55.4991 20.0413,-110.9981 20.0413,-57.0407 58.5823,-110.9981 40.0827,-53.9574 114.0814,-87.8735 73.9987,-33.916 168.0387,-33.916 32.3745,0 52.4158,1.5416 21.583,0 58.5823,6.1666 36.9994,6.1665 58.5823,16.958 23.1246,10.7915 41.6243,35.4577 18.4997,23.1246 18.4997,55.4991 0,30.8328 -21.583,52.4157 -20.0413,20.0413 -50.8741,20.0413 -23.1246,0 -46.2492,-15.4164 -21.5829,-16.958 -24.6662,-52.4157 -1.5417,-10.7915 -6.1666,-13.8748 -4.6249,-3.0833 -27.7495,-4.6249 l -20.0413,-1.5416 q -18.4997,0 -33.9161,0 -69.3738,0 -121.7896,26.2078 -50.8741,26.2079 -75.5403,67.8322 -24.6663,40.0826 -36.9994,78.6236 -10.7915,36.9994 -10.7915,70.9155 0,100.2066 69.3738,171.122 69.3738,69.3738 168.0388,69.3738 36.9994,0 64.7489,-9.2498 29.2911,-9.2499 44.7075,-26.2079 16.9581,-18.4997 21.583,-27.7495 6.1666,-9.2499 13.8748,-24.6663 13.8747,-33.916 55.499,-33.916 57.0407,0 57.0407,46.2492 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1541.64px;font-family:PLTypewriter9;-inkscape-font-specification:'PLTypewriter9, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke:#ffffff;stroke-width:39.6875;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path908" /><path
d="m 3528.1998,1825.1128 v 351.4939 q 0,21.583 1.5416,35.4577 3.0833,13.8748 12.3331,36.9994 9.2499,23.1246 33.9161,35.4577 26.2079,12.3331 66.2905,12.3331 44.7076,0 80.1653,-27.7495 35.4577,-29.2912 36.9994,-80.1653 1.5416,-52.4157 57.0407,-52.4157 57.0406,0 57.0406,53.9574 0,86.3318 -70.9154,146.4558 -69.3738,60.1239 -168.0388,60.1239 -92.4984,0 -157.2472,-50.8741 -63.2073,-52.4158 -63.2073,-163.4138 v -357.6605 h -129.4977 q -64.7489,0 -64.7489,-49.3325 0,-50.8741 66.2905,-50.8741 h 127.9561 V 1601.575 q 0,-21.583 1.5417,-32.3745 1.5416,-10.7914 15.4164,-21.5829 13.8747,-12.3331 40.0826,-12.3331 26.2079,0 40.0826,12.3331 13.8748,10.7915 15.4164,21.5829 1.5417,10.7915 1.5417,30.8328 v 124.8729 h 245.1207 q 64.7489,0 64.7489,50.8741 0,49.3325 -64.7489,49.3325 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1541.64px;font-family:PLTypewriter9;-inkscape-font-specification:'PLTypewriter9, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke:#ffffff;stroke-width:39.6875;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path910" /><path
d="m 4336.0185,2105.6913 v 183.4551 h 171.122 q 66.2906,0 66.2906,50.8741 0,49.3325 -66.2906,49.3325 h -408.5346 q -66.2905,0 -66.2905,-50.8741 0,-49.3325 66.2905,-49.3325 h 123.3312 v -464.0336 h -123.3312 q -66.2905,0 -66.2905,-50.8741 0,-49.3325 66.2905,-49.3325 h 172.6637 q 38.541,0 50.8741,13.8747 13.8748,12.3332 13.8748,50.8742 v 47.7908 q 106.3732,-120.2479 258.9955,-120.2479 44.7076,0 75.5404,10.7915 32.3744,10.7914 46.2492,27.7495 13.8747,16.958 18.4997,32.3744 6.1665,13.8748 6.1665,27.7495 0,30.8328 -20.0413,50.8742 -20.0413,18.4996 -47.7908,18.4996 -12.3332,0 -26.2079,-4.6249 -12.3331,-4.6249 -26.2079,-20.0413 -13.8748,-16.958 -15.4164,-43.1659 -121.7896,0 -195.7883,84.7902 -73.9987,83.2485 -73.9987,203.4965 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1541.64px;font-family:PLTypewriter9;-inkscape-font-specification:'PLTypewriter9, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke:#ffffff;stroke-width:39.6875;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path912" /><path
d="m 5523.0809,2056.3588 q 0,141.8309 -94.04,242.0375 -94.0401,98.6649 -225.0795,98.6649 -131.0394,0 -225.0794,-98.6649 -94.0401,-100.2066 -94.0401,-242.0375 0,-143.3725 94.0401,-243.5791 94.04,-100.2066 225.0794,-100.2066 131.0394,0 225.0795,100.2066 94.04,100.2066 94.04,243.5791 z m -464.0337,166.4971 q 60.124,73.9987 144.9142,73.9987 84.7902,0 144.9142,-73.9987 60.1239,-73.9987 60.1239,-177.2886 0,-100.2066 -61.6656,-166.4971 -60.1239,-66.2905 -143.3725,-66.2905 -81.7069,0 -143.3725,66.2905 -61.6656,66.2905 -61.6656,166.4971 0,103.2899 60.1239,177.2886 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1541.64px;font-family:PLTypewriter9;-inkscape-font-specification:'PLTypewriter9, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke:#ffffff;stroke-width:39.6875;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path914" /><path
d="m 6272.3173,1939.1941 v 349.9523 h 67.8321 q 64.7489,0 64.7489,50.8741 0,49.3325 -64.7489,49.3325 h -231.246 q -66.2905,0 -66.2905,-50.8741 0,-49.3325 66.2905,-49.3325 h 49.3325 v -343.7857 q 0,-69.3738 -21.5829,-98.665 -20.0414,-29.2911 -75.5404,-29.2911 -69.3738,0 -131.0394,52.4157 -61.6656,50.8742 -61.6656,152.6224 v 266.7037 h 67.8322 q 64.7488,0 64.7488,50.8741 0,49.3325 -64.7488,49.3325 h -249.7457 q -64.7489,0 -64.7489,-50.8741 0,-49.3325 64.7489,-49.3325 h 67.8321 v -464.0336 h -67.8321 q -64.7489,0 -64.7489,-50.8741 0,-49.3325 64.7489,-49.3325 h 117.1646 q 30.8328,0 44.7076,9.2498 15.4164,9.2499 16.958,21.583 3.0833,12.3331 3.0833,38.541 89.4151,-77.082 201.9548,-77.082 201.9549,0 201.9549,221.9961 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1541.64px;font-family:PLTypewriter9;-inkscape-font-specification:'PLTypewriter9, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke:#ffffff;stroke-width:39.6875;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path916" /><path
d="m 6876.6395,1468.9939 q 23.1246,23.1246 23.1246,55.4991 0,32.3744 -23.1246,55.499 -23.1246,23.1246 -55.499,23.1246 -32.3745,0 -55.4991,-23.1246 -23.1246,-23.1246 -23.1246,-55.499 0,-32.3745 23.1246,-55.4991 23.1246,-23.1246 55.4991,-23.1246 32.3744,0 55.499,23.1246 z m -265.1621,255.9123 h 223.5378 q 38.541,0 50.8742,13.8747 13.8747,12.3332 13.8747,50.8742 v 499.4913 h 161.8722 q 66.2905,0 66.2905,50.8741 0,49.3325 -66.2905,49.3325 h -464.0336 q -64.7489,0 -64.7489,-50.8741 0,-49.3325 64.7489,-49.3325 h 188.0801 v -464.0336 h -174.2054 q -66.2905,0 -66.2905,-50.8741 0,-49.3325 66.2905,-49.3325 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1541.64px;font-family:PLTypewriter9;-inkscape-font-specification:'PLTypewriter9, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke:#ffffff;stroke-width:39.6875;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path918" /><path
d="m 7946.537,2221.3143 q 0,9.2498 -6.1665,27.7495 -6.1666,16.958 -26.2079,44.7075 -18.4997,26.2079 -46.2492,49.3325 -27.7495,21.583 -78.6237,38.541 -49.3324,15.4164 -110.998,15.4164 -141.8309,0 -242.0375,-98.6649 -98.665,-100.2066 -98.665,-242.0375 0,-55.4991 20.0413,-110.9981 20.0414,-57.0407 58.5824,-110.9981 40.0826,-53.9574 114.0813,-87.8735 73.9987,-33.916 168.0388,-33.916 32.3744,0 52.4157,1.5416 21.583,0 58.5824,6.1666 36.9993,6.1665 58.5823,16.958 23.1246,10.7915 41.6243,35.4577 18.4996,23.1246 18.4996,55.4991 0,30.8328 -21.5829,52.4157 -20.0413,20.0413 -50.8741,20.0413 -23.1246,0 -46.2492,-15.4164 -21.583,-16.958 -24.6663,-52.4157 -1.5416,-10.7915 -6.1665,-13.8748 -4.625,-3.0833 -27.7496,-4.6249 l -20.0413,-1.5416 q -18.4997,0 -33.9161,0 -69.3738,0 -121.7895,26.2078 -50.8741,26.2079 -75.5404,67.8322 -24.6662,40.0826 -36.9993,78.6236 -10.7915,36.9994 -10.7915,70.9155 0,100.2066 69.3738,171.122 69.3738,69.3738 168.0387,69.3738 36.9994,0 64.7489,-9.2498 29.2912,-9.2499 44.7076,-26.2079 16.958,-18.4997 21.5829,-27.7495 6.1666,-9.2499 13.8748,-24.6663 13.8748,-33.916 55.499,-33.916 57.0407,0 57.0407,46.2492 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1541.64px;font-family:PLTypewriter9;-inkscape-font-specification:'PLTypewriter9, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke:#ffffff;stroke-width:39.6875;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path920" /><path
d="m 8698.8567,1777.3219 v 100.2066 q 0,20.0414 -1.5416,30.8328 -1.5417,10.7915 -15.4164,23.1246 -13.8748,10.7915 -40.0827,10.7915 -53.9574,0 -57.0407,-43.1659 -1.5416,-16.958 -4.6249,-27.7495 -3.0833,-12.3331 -16.958,-27.7495 -12.3331,-15.4164 -44.7076,-23.1246 -30.8328,-7.7082 -80.1653,-7.7082 -97.1233,0 -143.3725,24.6662 -46.2492,24.6662 -46.2492,58.5823 0,60.124 166.4971,83.2486 114.0814,18.4997 157.2473,30.8328 43.1659,10.7915 87.8735,38.541 84.7902,52.4157 84.7902,146.4558 0,27.7495 -10.7915,58.5823 -10.7915,29.2912 -38.541,64.7489 -27.7495,33.9161 -90.9567,57.0407 -63.2073,21.5829 -152.6224,21.5829 -120.2479,0 -197.3299,-53.9574 -15.4164,53.9574 -57.0407,53.9574 -49.3325,0 -49.3325,-64.7489 v -140.2892 q 0,-21.583 1.5417,-32.3744 1.5416,-10.7915 15.4164,-21.583 13.8747,-12.3331 40.0826,-12.3331 29.2912,0 40.0826,10.7915 10.7915,9.2498 20.0414,36.9993 41.6242,123.3312 186.5384,123.3312 101.7482,0 146.4558,-29.2911 46.2492,-30.8328 46.2492,-72.4571 0,-78.6237 -161.8722,-103.2899 -126.4145,-20.0413 -172.6637,-30.8328 -44.7075,-10.7915 -81.7069,-33.9161 -80.1653,-53.9574 -80.1653,-131.0394 0,-16.958 3.0833,-35.4577 4.6249,-20.0413 21.583,-47.7908 18.4996,-27.7496 47.7908,-47.7909 29.2912,-21.5829 86.3318,-36.9993 57.0407,-15.4164 134.1227,-15.4164 101.7483,0 160.3306,29.2911 12.3331,-29.2911 47.7908,-29.2911 49.3325,0 49.3325,64.7488 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1541.64px;font-family:PLTypewriter9;-inkscape-font-specification:'PLTypewriter9, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke:#ffffff;stroke-width:39.6875;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path922" /></g></svg>

After

Width:  |  Height:  |  Size: 23 KiB

@ -0,0 +1,75 @@
{
"board": {
"active_layer": 0,
"active_layer_preset": "",
"auto_track_width": true,
"hidden_nets": [],
"high_contrast_mode": 0,
"net_color_mode": 1,
"opacity": {
"pads": 1.0,
"tracks": 1.0,
"vias": 1.0,
"zones": 0.6
},
"ratsnest_display_mode": 0,
"selection_filter": {
"dimensions": true,
"footprints": true,
"graphics": true,
"keepouts": true,
"lockedItems": true,
"otherItems": true,
"pads": true,
"text": true,
"tracks": true,
"vias": true,
"zones": true
},
"visible_items": [
0,
1,
2,
3,
4,
5,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
32,
33,
34,
35,
36
],
"visible_layers": "fffffff_ffffffff",
"zone_display_mode": 0
},
"meta": {
"filename": "packetmodem_nano2_rev2.kicad_prl",
"version": 3
},
"project": {
"files": []
}
}

@ -0,0 +1,361 @@
{
"board": {
"design_settings": {
"defaults": {
"board_outline_line_width": 0.05,
"copper_line_width": 0.2,
"copper_text_italic": false,
"copper_text_size_h": 1.5,
"copper_text_size_v": 1.5,
"copper_text_thickness": 0.3,
"copper_text_upright": true,
"courtyard_line_width": 0.05,
"other_line_width": 0.15,
"other_text_italic": false,
"other_text_size_h": 1.0,
"other_text_size_v": 1.0,
"other_text_thickness": 0.15,
"other_text_upright": true,
"silk_line_width": 0.12,
"silk_text_italic": false,
"silk_text_size_h": 1.0,
"silk_text_size_v": 1.0,
"silk_text_thickness": 0.15,
"silk_text_upright": true
},
"diff_pair_dimensions": [
{
"gap": 0.25,
"via_gap": 0.25,
"width": 0.2
}
],
"drc_exclusions": [],
"rule_severitieslegacy_courtyards_overlap": true,
"rule_severitieslegacy_no_courtyard_defined": false,
"rules": {
"allow_blind_buried_vias": false,
"allow_microvias": false,
"min_hole_to_hole": 0.25,
"min_microvia_diameter": 0.2,
"min_microvia_drill": 0.09999999999999999,
"min_through_hole_diameter": 0.3,
"min_track_width": 0.2,
"min_via_diameter": 0.4,
"solder_mask_clearance": 0.051,
"solder_mask_min_width": 0.25,
"solder_paste_clearance": 0.0,
"solder_paste_margin_ratio": 0.0
},
"track_widths": [
0.25,
0.7,
1.5
],
"via_dimensions": [
{
"diameter": 0.8,
"drill": 0.4
},
{
"diameter": 2.4,
"drill": 0.8
}
]
},
"layer_presets": []
},
"boards": [],
"cvpcb": {
"equivalence_files": []
},
"erc": {
"erc_exclusions": [],
"meta": {
"version": 0
},
"pin_map": [
[
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
2,
0,
1,
0,
0,
1,
0,
2,
2,
2,
2
],
[
0,
0,
0,
0,
0,
0,
1,
0,
1,
0,
1,
2
],
[
0,
1,
0,
0,
0,
0,
1,
1,
2,
1,
1,
2
],
[
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
2
],
[
1,
1,
1,
1,
1,
0,
1,
1,
1,
1,
1,
2
],
[
0,
0,
0,
1,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
2,
1,
2,
0,
0,
1,
0,
2,
2,
2,
2
],
[
0,
2,
0,
1,
0,
0,
1,
0,
2,
0,
0,
2
],
[
0,
2,
1,
1,
0,
0,
1,
0,
2,
0,
0,
2
],
[
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2
]
],
"rule_severities": {
"bus_definition_conflict": "error",
"bus_entry_needed": "error",
"bus_label_syntax": "error",
"bus_to_bus_conflict": "error",
"bus_to_net_conflict": "error",
"different_unit_footprint": "error",
"different_unit_net": "error",
"duplicate_reference": "error",
"duplicate_sheet_names": "error",
"extra_units": "error",
"global_label_dangling": "warning",
"hier_label_mismatch": "error",
"label_dangling": "error",
"lib_symbol_issues": "warning",
"multiple_net_names": "warning",
"net_not_bus_member": "warning",
"no_connect_connected": "warning",
"no_connect_dangling": "warning",
"pin_not_connected": "error",
"pin_not_driven": "error",
"pin_to_pin": "warning",
"power_pin_not_driven": "error",
"similar_labels": "warning",
"unannotated": "error",
"unit_value_mismatch": "error",
"unresolved_variable": "error",
"wire_dangling": "error"
}
},
"libraries": {
"pinned_footprint_libs": [],
"pinned_symbol_libs": []
},
"meta": {
"filename": "packetmodem_nano2_rev2.kicad_pro",
"version": 1
},
"net_settings": {
"classes": [
{
"bus_width": 12.0,
"clearance": 0.2,
"diff_pair_gap": 0.25,
"diff_pair_via_gap": 0.25,
"diff_pair_width": 0.2,
"line_style": 0,
"microvia_diameter": 0.3,
"microvia_drill": 0.1,
"name": "Default",
"pcb_color": "rgba(0, 0, 0, 0.000)",
"schematic_color": "rgba(0, 0, 0, 0.000)",
"track_width": 0.25,
"via_diameter": 0.8,
"via_drill": 0.4,
"wire_width": 6.0
}
],
"meta": {
"version": 2
},
"net_colors": null
},
"pcbnew": {
"last_paths": {
"gencad": "",
"idf": "",
"netlist": "packetmodem_nano2_rev2.net",
"specctra_dsn": "",
"step": "",
"vrml": ""
},
"page_layout_descr_file": ""
},
"schematic": {
"annotate_start_num": 0,
"drawing": {
"default_line_thickness": 6.0,
"default_text_size": 50.0,
"field_names": [],
"intersheets_ref_own_page": false,
"intersheets_ref_prefix": "",
"intersheets_ref_short": false,
"intersheets_ref_show": false,
"intersheets_ref_suffix": "",
"junction_size_choice": 3,
"label_size_ratio": 0.25,
"pin_symbol_size": 0.0,
"text_offset_ratio": 0.08
},
"legacy_lib_dir": "",
"legacy_lib_list": [],
"meta": {
"version": 1
},
"net_format_name": "",
"ngspice": {
"fix_include_paths": true,
"fix_passive_vals": false,
"meta": {
"version": 0
},
"model_mode": 0,
"workbook_filename": ""
},
"page_layout_descr_file": "",
"plot_directory": "",
"spice_adjust_passive_values": false,
"spice_external_command": "spice \"%I\"",
"subpart_first_id": 65,
"subpart_id_separator": 0
},
"sheets": [],
"text_variables": {}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 534 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 384 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

@ -0,0 +1,482 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
<head>
<meta charset="utf-8" />
<meta name="generator" content="pandoc" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
<meta name="author" content="M.T. Konstapel" />
<meta name="dcterms.date" content="2024-02-14" />
<title>APRS digipeater installation guide</title>
<link rel="stylesheet" href="./css/mvp.css" />
<style type="text/css">
:root {
--width-content: 1080px;
}
nav {
justify-content: space-around;
}
</style>
</head>
<body>
<header id="title-block-header">
<nav id="TOC">
<ul>
<li>
<a href="#">Index</a>
<ul>
<li><a
href="#installation-guide-pe1rxf-aprs-digipeater-and-weather-station"
id="toc-installation-guide-pe1rxf-aprs-digipeater-and-weather-station">Installation
guide PE1RXF APRS digipeater and weather station</a></li>
<li><a href="#preparing-the-sd-card"
id="toc-preparing-the-sd-card">Preparing the SD
card</a></li>
<li><a href="#before-the-first-boot"
id="toc-before-the-first-boot">Before the first
boot</a></li>
<li><a href="#the-pi-is-booted-for-the-first-time"
id="toc-the-pi-is-booted-for-the-first-time">The Pi is
booted for the first time</a></li>
<li><a href="#from-a-vanilla-pi-to-an-aprs-digipeater"
id="toc-from-a-vanilla-pi-to-an-aprs-digipeater">From a
vanilla Pi to an APRS digipeater</a></li>
<li><a href="#backup-sd-card" id="toc-backup-sd-card">Backup
SD card!</a></li>
</ul>
</li>
<li>
<a href="https://git.meezenest.nl/marcel/aprs_digipeater">Git repo</a>
</li>
<li>
<a href="https://meezenest.nl/mees/aprs_digipeater.html">Back</a>
</li>
</ul>
<a href="https://www.meezenest.nl/mees/"><img alt="Logo" src="./images/mees_logo.svg" height="70"></a>
</nav>
<h1 class="title">APRS digipeater installation guide</h1>
<p class="subtitle">not for the faint of heart</p>
<p class="author">M.T. Konstapel</p>
<p class="date">2024-02-14</p>
</header>
<main>
<article>
<p><b>Abstract </b><p>This project is a collection of former (and some
new) projects connected together to make an APRS digipeater, which
doubles as an APRS weather station, with PE1RXF telemetry server
capabilities.</p></p>
<h1
id="installation-guide-pe1rxf-aprs-digipeater-and-weather-station">Installation
guide PE1RXF APRS digipeater and weather station</h1>
<p>This guide assumes you are using the LoRa hat for the Raspberry Pi
Zero from Mees Electronics.</p>
<h1 id="preparing-the-sd-card">Preparing the SD card</h1>
<p>Download the latest 32 bit version of Raspberry OS. Do not use the 64
bit version. It will probably work, but some software I use might not
work on 64 bit.</p>
<pre><code>$ unxz image_name.img.xz
$ sudo dd if=image_name.img of=/dev/name_of_block_device bs=4M conv=fsync status=progress</code></pre>
<h1 id="before-the-first-boot">Before the first boot</h1>
<h3 id="mount-the-boot-partition-on-a-computer.">Mount the boot
partition on a computer.</h3>
<h3 id="create-a-file-called-userconf-in-boot">Create a file called
“userconf” in /boot</h3>
<pre><code>$ nano userconf</code></pre>
<p>This file should only have one line of text, with
username:encrypted-password – that is, your preferred username, followed
by a colon, and then an encrypted representation of the password you
wish to use.</p>
<p>The simplest approach to generate the encrypted password is to use
OpenSSL on a Raspberry Pi that is already running — Activate a terminal
window and type: echo ‘frambozentaart’ | openssl passwd -6 -stdin This
will generate what appears to be a random string of characters, but is
really an encrypted version of the provided password.</p>
<p>This is the line that should go in userconf.txt:</p>
<pre><code>taart:$6$wOOBx/uscFupsHDn$PSjutVwKxZyGa9.11NP/wpy4Wtn4qA0Xx3AY5KvuzmxOm7En5l2/O33yNWISmWxTlWHzLuVaPnJO0ccYVdDNu0</code></pre>
<p>This defines user: ‘taart’ with password ‘frambozentaart’</p>
<h3 id="create-an-empty-file-called-ssh-in-boot">Create an empty file
called “ssh” in /boot</h3>
<pre><code>$ touch ssh</code></pre>
<h3 id="create-a-file-called-wpa_supplicant.conf-in-boot">Create a file
called “wpa_supplicant.conf” in /boot</h3>
<pre><code>$ nano wpa_supplicant.conf</code></pre>
<p>Add the following text:</p>
<pre><code>country=nl
update_config=1
ctrl_interface=/var/run/wpa_supplicant
network={
scan_ssid=1
ssid=&quot;Your WiFi Name&quot;
psk=&quot;Your WiFi Password&quot;
}</code></pre>
<h3 id="activate-auto-power-off-button">Activate Auto power off
button</h3>
<pre><code>$ nano config.txt</code></pre>
<p>Add the following text:</p>
<pre><code>dtoverlay=gpio-poweroff,gpiopin=21,active_low=&quot;y&quot;
dtoverlay=gpio-shutdown,gpio_pin=16</code></pre>
<p>GPIO21 goes high when RPi is booting and stays high until after
succesfully halting the processor with “sudo halt” or shutdown via
external button. When GPIO16 goes low (external button pressed), RPi
goes into shutdown.</p>
<h3
id="insert-the-sd-card-in-the-raspberry-pi-and-press-the-power-button">Insert
the SD card in the Raspberry Pi and press the power button</h3>
<p>During the first boot, the Pi will reboot once. Because of the
external power button, this will not work: the Pi will shutdown. Power
up the Pi by pressing the external power button again.</p>
<h1 id="the-pi-is-booted-for-the-first-time">The Pi is booted for the
first time</h1>
<p>Search for the ip address of the Raspberry Pi (for exammple by
logging into your router) and ssh into the Pi (user: taart, password:
frambozentaart)</p>
<h3 id="create-new-user">Create new user</h3>
<pre><code>$ sudo adduser user_name</code></pre>
<p>Add the new user to all the groups of the default user (taart)</p>
<pre><code>$ sudo nano /etc/group</code></pre>
<p>Replace taart by user_name ,taart (for example adm:x:4:taart becomes
adm_x:username,taart)</p>
<p>Add user to sudo group</p>
<pre><code>$ sudo usermod -aG sudo user_name</code></pre>
<p>Reboot the system and log in as new user.</p>
<p>Test user’s sudo permissions by executing a random command as sudo
(for example: sudo ls)</p>
<p>Remove default user taart</p>
<pre><code>$ sudo deluser -remove-home taart</code></pre>
<p>Disable auto-login.</p>
<pre><code>$ sudo raspi-config</code></pre>
<p>Set system-options / S5 Boot/Auto login / B1 Console</p>
<h3 id="login-with-ssh-without-password">Login with ssh without
password</h3>
<p>Create key on local machine</p>
<pre><code>$ ssh-keygen -t ed25519 -f ~/.ssh/aprs-weather-server -C &quot;marcel aprs-weather-server-server&quot;</code></pre>
<p>Copy the key to the Raspberry Pi</p>
<pre><code>$ ssh-copy-id -i ~/.ssh/aprs-weather-server.pub marcel@server_ip_address</code></pre>
<p>Log in on the Raspberry Pi without password</p>
<pre><code>$ ssh -o &quot;IdentitiesOnly=yes&quot; -i .ssh/aprs-weather-server &lt;IP-adres&gt;&gt;</code></pre>
<p>Optional: on the local machine edit .ssh/config and add the
server/key combination. Now you can log in with just “ssh
&lt;server-name”</p>
<h3 id="housekeeping">Housekeeping</h3>
<p>Change login screen via motd (message of the day).</p>
<pre><code>$ nano /etc/motd</code></pre>
<p>Change hostname.</p>
<pre><code>$ sudo nano /etc/hostname
$ sudo nano /etc/hosts</code></pre>
<p>Setting the locale</p>
<pre><code>$ sudo raspi-config</code></pre>
<p>Edit Localisation options / change locale (en_US.UTF-8 UTF-8) And set
time zone</p>
<p>For years now, Perl give Locale warnings. Fix it:</p>
<pre><code>$ sudo nano /etc/default/locale</code></pre>
<p>add:</p>
<pre><code>LC_ALL=en_US.UTF-8
LANGUAGE=en_US.UTF-8</code></pre>
<p>Update software</p>
<pre><code>$ sudo apt-get update
$ sudo apt-get upgrade</code></pre>
<h3 id="install-firewall">Install firewall</h3>
<pre><code>$ sudo apt install ufw
$ sudo ufw allow ssh
$ sudo ufw enable
$ sudo ufw status</code></pre>
<h1 id="from-a-vanilla-pi-to-an-aprs-digipeater">From a vanilla Pi to an
APRS digipeater</h1>
<h3 id="enable-i2c-rtc">Enable I2C RTC</h3>
<pre><code>$ sudo rapi-config</code></pre>
<p>enable i2c</p>
<pre><code>$ sudo reboot
$ sudo apt-get install i2c-tools
$ sudo i2cdetect -y 1</code></pre>
<p>#68 is RTC</p>
<pre><code>$ sudo nano /boot/firmware/config.txt</code></pre>
<p>Add dtoverlay=i2c-rtc,ds1307</p>
<pre><code>$ sudo reboot
$ sudo i2cdetect -y 1</code></pre>
<p>If UU appears instead of 68 then we have successfully loaded in the
Kernel driver for our RTC circuit.</p>
<p>Disable fake hardware clock:</p>
<pre><code>$ sudo apt-get -y remove fake-hwclock
$ sudo update-rc.d -f fake-hwclock remove
$ sudo systemctl disable fake-hwclock
$ sudo nano /lib/udev/hwclock-set</code></pre>
<p>Find</p>
<pre><code>if [ -e /run/systemd/system ] ; then
exit 0
fi</code></pre>
<p>Replace with:</p>
<pre><code>#if [ -e /run/systemd/system ] ; then
# exit 0
#fi</code></pre>
<p>Also comment out the two lines</p>
<pre><code>/sbin/hwclock --rtc=$dev --systz --badyear</code></pre>
<p>and</p>
<pre><code>/sbin/hwclock --rtc=$dev --systz</code></pre>
<p>Read RTC:</p>
<pre><code>$ sudo hwclock -r</code></pre>
<p>Set RTC from system time:</p>
<pre><code>$ sudo hwclock -w</code></pre>
<h3 id="ax.25-support">AX.25 support</h3>
<pre><code>$ sudo apt-get install libax25 ax25-apps ax25-tools
$ sudo nano /etc/ax25/axports</code></pre>
<p>add:</p>
<pre><code>ax0 PE1RXF-1 9600 255 2 144.800 MHz APRS (1200 bps)
ax1 PE1RXF-3 9600 255 2 433.775 MHz APRS (LORA)</code></pre>
<h3 id="aprx-software">APRX software</h3>
<pre><code>$ sudo apt-get install aprx
$ sudo systemctl enable aprx
$ sudo nano /etc/aprs.conf:</code></pre>
<p>Add the following (may be different on your machine)</p>
<pre><code>mycall PE1RXF-1
&lt;aprsis&gt;
passcode 19123
server euro.aprs2.net 14580
&lt;/aprsis&gt;
&lt;logging&gt;
pidfile /var/run/aprx.pid
rflog /var/log/aprx/aprx-rf.log
aprxlog /var/log/aprx/aprx.log
&lt;/logging&gt;
&lt;interface&gt;
ax25-device $mycall
tx-ok true # transmitter enable defaults to false
telem-to-is false # set to &#39;false&#39; to disable
&lt;/interface&gt;
#Secondary interface (internal LoRa radio)
&lt;interface&gt;
callsign PE1RXF-3
ax25-device PE1RXF-3
tx-ok true
telem-to-is false # set to &#39;false&#39; to disable
&lt;/interface&gt;
&lt;beacon&gt;
beaconmode aprsis
cycle-size 20m
beacon srccall PE1RXF-1 symbol &quot;R&amp;&quot; lat &quot;5302.78N&quot; lon &quot;00707.91E&quot; comment &quot;APRS RX iGATE 144.800MHz https://meezenest.nl/pe1rxf&quot;
&lt;/beacon&gt;
&lt;beacon&gt;
beaconmode aprsis
cycle-size 20m
beacon srccall PE1RXF-3 symbol &quot;L&amp;&quot; lat &quot;5302.78N&quot; lon &quot;00707.91E&quot; comment &quot;LoRa APRS RX iGATE 433.775MHz https://meezenest.nl/pe1rxf&quot;
&lt;/beacon&gt;
#&lt;beacon&gt;
# beaconmode radio
# cycle-size 30m
# beacon interface PE1RXF-3 symbol &quot;L&amp;&quot; lat &quot;5302.78N&quot; lon &quot;00707.91E&quot; comment &quot;LoRa APRS RX iGATE 433.775MHz https://meezenest.nl/pe1rxf&quot;
#&lt;/beacon&gt;
&lt;digipeater&gt;
transmitter $mycall
&lt;source&gt;
source $mycall
relay-type directonly
viscous-delay 5
# Forward enkel PE1RXF* (bij wet verboden om als relais voor derden te fungeren)
filter b/PE1RXF*
&lt;/source&gt;
&lt;source&gt;
source PE1RXF-3
relay-type directonly
viscous-delay 5
filter b/PE1RXF*
&lt;/source&gt;
&lt;/digipeater&gt;
# LoRa digipeater
&lt;digipeater&gt;
transmitter PE1RXF-3
&lt;source&gt;
source $mycall
relay-type directonly
viscous-delay 5
filter b/PE1RXF*
&lt;/source&gt;
&lt;source&gt;
source PE1RXF-3
relay-type directonly
viscous-delay 5
filter b/PE1RXF*
&lt;/source&gt;
&lt;/digipeater&gt;</code></pre>
<h3 id="some-commands-must-be-called-as-sudo">Some commands must be
called as sudo</h3>
<p>but we don’t want to enter the password all the time. Especcially at
boot time!</p>
<pre><code>$ sudo visudo</code></pre>
<p>Add:</p>
<pre><code>marcel ALL = (root) NOPASSWD: /usr/sbin/kissattach
marcel ALL = (root) NOPASSWD: /usr/sbin/kissparms
marcel ALL = (root) NOPASSWD: /usr/bin/socat
marcel ALL = (root) NOPASSWD: /usr/local/bin/tncattach</code></pre>
<h3 id="bd-packet-modem">1200bd packet modem</h3>
<pre><code>$ mkdir ham
$ cd ham
$ nano ~/ham/start_packetmodem_nano2.sh</code></pre>
<p>Add (make sure USB port is correct):</p>
<pre><code>#!/bin/bash
echo &quot;Starting packet modem nano 2&quot;
# Packet modem uses a CS340 chip, which does not have a serial number. If other USB devices
# with a CS340 chip are pluged in the software cannot distinquish between the various devices.
# But the modem is always connected to the same physical USB port. Use this port number
# instead of /dev/USBx.
serial_port=$(readlink -f /dev/serial/by-path/platform-3f980000.usb-usb-0:1.4:1.0-port0)
# Set serial port in RAW mode. Otherwise some charcters may be lost to the modem.
/usr/bin/stty -F $serial_port raw
sleep 1
sudo /usr/sbin/kissattach $serial_port ax0
sleep 1
sudo /usr/sbin/kissparms -p ax0 -t 500 -s 200 -r 32 -l 100 -f n</code></pre>
<p>Make file executable:</p>
<pre><code>$ chmod u+x ./start_packetmodem_nano2.sh</code></pre>
<h3 id="lora-aprs-modem">LoRa APRS modem</h3>
<pre><code>$ sudo apt-get install git
$ sudo raspi-config</code></pre>
<p>Enable SPI</p>
<pre><code>$ sudo apt-get install socat</code></pre>
<p>clone LoRa driver:</p>
<pre><code>$ cd ham
$ git clone https://git.meezenest.nl/marcel/RPi-LoRa-KISS-TNC.git</code></pre>
<p>In start_all.sh the line with socat probably says ax2, change to
ax1</p>
<h3 id="weather-station">Weather station</h3>
<pre><code>$ get the weather_station software, which is still under development (will be published on https://git.meezenest.nl/)
$ sudo apt install python3-pip</code></pre>
<p>Install pythonax25, which can be found at
~/ham/weather_station/python-ax25:</p>
<pre><code>$ cd ~/ham/weather_station/python-ax25
$ sudo ./install.sh</code></pre>
<p>Install other libraries:</p>
<pre><code>$ pip3 install minimalmodbus --break-system-packages
$ pip3 install retrying --break-system-packages
$ pip3 install pyaml --break-system-packages</code></pre>
<p>Add /home/marcel/.local/bin to path:</p>
<pre><code>$ nano .bashrc
add:
export PATH=/home/marcel/.local/bin:$PATH</code></pre>
<h3 id="rnode">Rnode</h3>
<pre><code>$ pip3 install rns --break-system-packages</code></pre>
<p>If the Rnode modem firmware is not yet installed on the ESP32 board
do:</p>
<pre><code>$ rnodeconf /dev/ttyACM0 --autoinstall</code></pre>
<p>Install tncattach:</p>
<pre><code>$ cd ~/ham
$ git clone https://github.com/markqvist/tncattach.git
$ cd tncattach
$ make
$ sudo make install
$ mkdir ~/ham/rnode_hamnet
$ nano ~/ham/rnode_hamnet/start_rnode.sh and add:</code></pre>
<p>Add:</p>
<pre><code>#!/bin/bash
# Set the Rnode in TNC mode on 434.25 MHz BW 500kHz Spreading Factor 7 Code Rate 4:5 Power 17dBm
# Ideally, this command should only be executed once.
/home/marcel/.local/bin/rnodeconf /dev/ttyACM0 -T --freq 434250000 --bw 500000 --txp 17 --sf 7 --cr 5
# Send station identification every 10 minutes
# mtu: 496 (PtP), 482 (ethernet) or 478 (ethernet with VLAN)
sudo /usr/local/bin/tncattach /dev/ttyACM0 115200 -d -e --mtu 482 --noipv6 --ipv4 192.168.44.2/24 --id PE1RXF -t 600</code></pre>
<p>Make executable:</p>
<pre><code>$ chmod u+x ./start_rnode.sh</code></pre>
<h3 id="routing">Routing</h3>
<p>To use this adapter for internet access change the default
gateway:</p>
<pre><code>$ sudo route add default gw 192.168.44.1 metric 30</code></pre>
<p>This gives the new route priority, because the already defined
default route has a metric of 100</p>
<p>Change metrics by removing the route and adding it again. The
exammple makes the old gateway the one with the higest priority:</p>
<pre><code>$ sudo route del default gw 192.168.44.1 metric 30
$ sudo route add default gw 192.168.44.1 metric 200</code></pre>
<p>chech with:</p>
<pre><code>$ ip route</code></pre>
<h3
id="and-also-on-the-server-site-enable-forwarding-and-nat-not-on-the-aprs-digipeater">And
also, on the server site, enable forwarding and nat (NOT ON THE APRS
DIGIPEATER!!!)</h3>
<pre><code>$ sudo echo &quot;1&quot; &gt; /proc/sys/net/ipv4/ip_forward
$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
$ sudo iptables -A FORWARD -i eth0 -o tnc0 -m state --state RELATED,ESTABLISHED -j ACCEPT
$ sudo iptables -A FORWARD -i tnc0 -o eth0 -j ACCEPT</code></pre>
<p>NOTE: make these changes permanant….</p>
<pre><code>$ sudo nano /etc/sysctl.conf</code></pre>
<p>uncomment: net.ipv4.ip_forward=1</p>
<p>Maybe needed:</p>
<pre><code># Add the following statement somewhere at the beginning
# of /etc/dhcpcd.conf to prevent dhcpcd from changing MTU
denyinterfaces tnc0</code></pre>
<h3 id="start-script">Start script</h3>
<pre><code>$ nano ~/ham/start_aprs_server.sh</code></pre>
<p>Add:</p>
<pre><code>#!/bin/bash
echo &quot;Starting AX.25 interfaces&quot;
# initializing 1200bd packet modem
/home/marcel/ham/start_packetmodem_nano2.sh
# initializing LoRa modem
/home/marcel/ham/RPi-LoRa-KISS-TNC/start_all.sh
# initializing RNode network over LoRa
echo &quot;Starting LoRa network interface&quot;
/home/marcel/ham/rnode_hamnet/start_rnode.sh
# Start weather station software
echo &quot;Starting weather station&quot;
/home/marcel/ham/weather_station/start_weater_station.sh</code></pre>
<p>And make executable</p>
<pre><code>$ chmod u+x ./start_aprs_server.sh</code></pre>
<p>Add to crontab:</p>
<pre><code>$ crontab -e</code></pre>
<p>Add:</p>
<pre><code># Start APRS server at boot time (for some reason a 60 second wait is necessary)
@reboot sleep 60 &amp;&amp; /home/marcel/ham/start_aprs_server.sh</code></pre>
<p>TODO:</p>
<p>network route over RNode if ethernet is down</p>
<p>Webinterface for sending and receiving messages over APRS (forward to
e-mail?)</p>
<h1 id="backup-sd-card">Backup SD card!</h1>
<p>I use the script pishrink.sh to make an image.</p>
<hr>
</article>
</main>
<footer>
<p>&copy;
2024-02-14
M.T. Konstapel
<a href="https://meezenest.nl/mees/">https://meezenest.nl/mees/</a>
</p><p>This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike 4.0 International License</a>.
</p>
</footer>
</body>
</html>

@ -0,0 +1,541 @@
---
title: APRS digipeater installation guide
subtitle: not for the faint of heart
author: M.T. Konstapel
date: 2024-02-14
website: https://meezenest.nl/mees/
page_back: https://meezenest.nl/mees/aprs_digipeater.html
logo: ./images/mees_logo.svg
git_repo: https://git.meezenest.nl/marcel/aprs_digipeater
numbersections: true
# Formatting:
geometry: "a4paper, left=2.0cm, right=2.0cm, top=1.9cm, bottom=2.54cm"
abstract: >
This project is a collection of former (and some new) projects connected together to make an APRS digipeater, which doubles as an APRS weather station, with PE1RXF telemetry server capabilities.
---
# Installation guide PE1RXF APRS digipeater and weather station
This guide assumes you are using the LoRa hat for the Raspberry Pi Zero from Mees Electronics.
# Preparing the SD card
Download the latest 32 bit version of Raspberry OS. Do not use the 64 bit version. It will probably work, but some software I use might not work on 64 bit.
$ unxz image_name.img.xz
$ sudo dd if=image_name.img of=/dev/name_of_block_device bs=4M conv=fsync status=progress
# Before the first boot
### Mount the boot partition on a computer.
### Create a file called "userconf" in /boot
$ nano userconf
This file should only have one line of text, with username:encrypted-password – that is, your preferred username, followed by a colon, and then an encrypted representation of the password you wish to use.
The simplest approach to generate the encrypted password is to use OpenSSL on a Raspberry Pi that is already running — Activate a terminal window and type:
echo 'frambozentaart' | openssl passwd -6 -stdin
This will generate what appears to be a random string of characters, but is really an encrypted version of the provided password.
This is the line that should go in userconf.txt:
taart:$6$wOOBx/uscFupsHDn$PSjutVwKxZyGa9.11NP/wpy4Wtn4qA0Xx3AY5KvuzmxOm7En5l2/O33yNWISmWxTlWHzLuVaPnJO0ccYVdDNu0
This defines user: 'taart' with password 'frambozentaart'
### Create an empty file called "ssh" in /boot
$ touch ssh
### Create a file called "wpa_supplicant.conf" in /boot
$ nano wpa_supplicant.conf
Add the following text:
country=nl
update_config=1
ctrl_interface=/var/run/wpa_supplicant
network={
scan_ssid=1
ssid="Your WiFi Name"
psk="Your WiFi Password"
}
### Activate Auto power off button
$ nano config.txt
Add the following text:
dtoverlay=gpio-poweroff,gpiopin=21,active_low="y"
dtoverlay=gpio-shutdown,gpio_pin=16
GPIO21 goes high when RPi is booting and stays high until after succesfully halting the processor with "sudo halt" or shutdown via external button.
When GPIO16 goes low (external button pressed), RPi goes into shutdown.
### Insert the SD card in the Raspberry Pi and press the power button
During the first boot, the Pi will reboot once. Because of the external power button, this will not work: the Pi will shutdown. Power up the Pi by pressing the external power button again.
# The Pi is booted for the first time
Search for the ip address of the Raspberry Pi (for exammple by logging into your router) and ssh into the Pi (user: taart, password: frambozentaart)
### Create new user
$ sudo adduser user_name
Add the new user to all the groups of the default user (taart)
$ sudo nano /etc/group
Replace taart by user_name ,taart (for example adm:x:4:taart becomes adm_x:username,taart)
Add user to sudo group
$ sudo usermod -aG sudo user_name
Reboot the system and log in as new user.
Test user's sudo permissions by executing a random command as sudo (for example: sudo ls)
Remove default user taart
$ sudo deluser -remove-home taart
Disable auto-login.
$ sudo raspi-config
Set system-options / S5 Boot/Auto login / B1 Console
### Login with ssh without password
Create key on local machine
$ ssh-keygen -t ed25519 -f ~/.ssh/aprs-weather-server -C "marcel aprs-weather-server-server"
Copy the key to the Raspberry Pi
$ ssh-copy-id -i ~/.ssh/aprs-weather-server.pub marcel@server_ip_address
Log in on the Raspberry Pi without password
$ ssh -o "IdentitiesOnly=yes" -i .ssh/aprs-weather-server <IP-adres>>
Optional: on the local machine edit .ssh/config and add the server/key combination. Now you can log in with just "ssh <server-name"
### Housekeeping
Change login screen via motd (message of the day).
$ nano /etc/motd
Change hostname.
$ sudo nano /etc/hostname
$ sudo nano /etc/hosts
Setting the locale
$ sudo raspi-config
Edit Localisation options / change locale (en_US.UTF-8 UTF-8)
And set time zone
For years now, Perl give Locale warnings. Fix it:
$ sudo nano /etc/default/locale
add:
LC_ALL=en_US.UTF-8
LANGUAGE=en_US.UTF-8
Update software
$ sudo apt-get update
$ sudo apt-get upgrade
### Install firewall
$ sudo apt install ufw
$ sudo ufw allow ssh
$ sudo ufw enable
$ sudo ufw status
# From a vanilla Pi to an APRS digipeater
### Enable I2C RTC
$ sudo rapi-config
enable i2c
$ sudo reboot
$ sudo apt-get install i2c-tools
$ sudo i2cdetect -y 1
#68 is RTC
$ sudo nano /boot/firmware/config.txt
Add dtoverlay=i2c-rtc,ds1307
$ sudo reboot
$ sudo i2cdetect -y 1
If UU appears instead of 68 then we have successfully loaded in the Kernel driver for our RTC circuit.
Disable fake hardware clock:
$ sudo apt-get -y remove fake-hwclock
$ sudo update-rc.d -f fake-hwclock remove
$ sudo systemctl disable fake-hwclock
$ sudo nano /lib/udev/hwclock-set
Find
if [ -e /run/systemd/system ] ; then
exit 0
fi
Replace with:
#if [ -e /run/systemd/system ] ; then
# exit 0
#fi
Also comment out the two lines
/sbin/hwclock --rtc=$dev --systz --badyear
and
/sbin/hwclock --rtc=$dev --systz
Read RTC:
$ sudo hwclock -r
Set RTC from system time:
$ sudo hwclock -w
### AX.25 support
$ sudo apt-get install libax25 ax25-apps ax25-tools
$ sudo nano /etc/ax25/axports
add:
ax0 PE1RXF-1 9600 255 2 144.800 MHz APRS (1200 bps)
ax1 PE1RXF-3 9600 255 2 433.775 MHz APRS (LORA)
### APRX software
$ sudo apt-get install aprx
$ sudo systemctl enable aprx
$ sudo nano /etc/aprs.conf:
Add the following (may be different on your machine)
mycall PE1RXF-1
<aprsis>
passcode 19123
server euro.aprs2.net 14580
</aprsis>
<logging>
pidfile /var/run/aprx.pid
rflog /var/log/aprx/aprx-rf.log
aprxlog /var/log/aprx/aprx.log
</logging>
<interface>
ax25-device $mycall
tx-ok true # transmitter enable defaults to false
telem-to-is false # set to 'false' to disable
</interface>
#Secondary interface (internal LoRa radio)
<interface>
callsign PE1RXF-3
ax25-device PE1RXF-3
tx-ok true
telem-to-is false # set to 'false' to disable
</interface>
<beacon>
beaconmode aprsis
cycle-size 20m
beacon srccall PE1RXF-1 symbol "R&" lat "5302.78N" lon "00707.91E" comment "APRS RX iGATE 144.800MHz https://meezenest.nl/pe1rxf"
</beacon>
<beacon>
beaconmode aprsis
cycle-size 20m
beacon srccall PE1RXF-3 symbol "L&" lat "5302.78N" lon "00707.91E" comment "LoRa APRS RX iGATE 433.775MHz https://meezenest.nl/pe1rxf"
</beacon>
#<beacon>
# beaconmode radio
# cycle-size 30m
# beacon interface PE1RXF-3 symbol "L&" lat "5302.78N" lon "00707.91E" comment "LoRa APRS RX iGATE 433.775MHz https://meezenest.nl/pe1rxf"
#</beacon>
<digipeater>
transmitter $mycall
<source>
source $mycall
relay-type directonly
viscous-delay 5
# Forward enkel PE1RXF* (bij wet verboden om als relais voor derden te fungeren)
filter b/PE1RXF*
</source>
<source>
source PE1RXF-3
relay-type directonly
viscous-delay 5
filter b/PE1RXF*
</source>
</digipeater>
# LoRa digipeater
<digipeater>
transmitter PE1RXF-3
<source>
source $mycall
relay-type directonly
viscous-delay 5
filter b/PE1RXF*
</source>
<source>
source PE1RXF-3
relay-type directonly
viscous-delay 5
filter b/PE1RXF*
</source>
</digipeater>
### Some commands must be called as sudo
but we don't want to enter the password all the time. Especcially at boot time!
$ sudo visudo
Add:
marcel ALL = (root) NOPASSWD: /usr/sbin/kissattach
marcel ALL = (root) NOPASSWD: /usr/sbin/kissparms
marcel ALL = (root) NOPASSWD: /usr/bin/socat
marcel ALL = (root) NOPASSWD: /usr/local/bin/tncattach
### 1200bd packet modem
$ mkdir ham
$ cd ham
$ nano ~/ham/start_packetmodem_nano2.sh
Add (make sure USB port is correct):
#!/bin/bash
echo "Starting packet modem nano 2"
# Packet modem uses a CS340 chip, which does not have a serial number. If other USB devices
# with a CS340 chip are pluged in the software cannot distinquish between the various devices.
# But the modem is always connected to the same physical USB port. Use this port number
# instead of /dev/USBx.
serial_port=$(readlink -f /dev/serial/by-path/platform-3f980000.usb-usb-0:1.4:1.0-port0)
# Set serial port in RAW mode. Otherwise some charcters may be lost to the modem.
/usr/bin/stty -F $serial_port raw
sleep 1
sudo /usr/sbin/kissattach $serial_port ax0
sleep 1
sudo /usr/sbin/kissparms -p ax0 -t 500 -s 200 -r 32 -l 100 -f n
Make file executable:
$ chmod u+x ./start_packetmodem_nano2.sh
### LoRa APRS modem
$ sudo apt-get install git
$ sudo raspi-config
Enable SPI
$ sudo apt-get install socat
clone LoRa driver:
$ cd ham
$ git clone https://git.meezenest.nl/marcel/RPi-LoRa-KISS-TNC.git
In start_all.sh the line with socat probably says ax2, change to ax1
### Weather station
$ get the weather_station software, which is still under development (will be published on https://git.meezenest.nl/)
$ sudo apt install python3-pip
Install pythonax25, which can be found at ~/ham/weather_station/python-ax25:
$ cd ~/ham/weather_station/python-ax25
$ sudo ./install.sh
Install other libraries:
$ pip3 install minimalmodbus --break-system-packages
$ pip3 install retrying --break-system-packages
$ pip3 install pyaml --break-system-packages
Add /home/marcel/.local/bin to path:
$ nano .bashrc
add:
export PATH=/home/marcel/.local/bin:$PATH
### Rnode
$ pip3 install rns --break-system-packages
If the Rnode modem firmware is not yet installed on the ESP32 board do:
$ rnodeconf /dev/ttyACM0 --autoinstall
Install tncattach:
$ cd ~/ham
$ git clone https://github.com/markqvist/tncattach.git
$ cd tncattach
$ make
$ sudo make install
$ mkdir ~/ham/rnode_hamnet
$ nano ~/ham/rnode_hamnet/start_rnode.sh and add:
Add:
#!/bin/bash
# Set the Rnode in TNC mode on 434.25 MHz BW 500kHz Spreading Factor 7 Code Rate 4:5 Power 17dBm
# Ideally, this command should only be executed once.
/home/marcel/.local/bin/rnodeconf /dev/ttyACM0 -T --freq 434250000 --bw 500000 --txp 17 --sf 7 --cr 5
# Send station identification every 10 minutes
# mtu: 496 (PtP), 482 (ethernet) or 478 (ethernet with VLAN)
sudo /usr/local/bin/tncattach /dev/ttyACM0 115200 -d -e --mtu 482 --noipv6 --ipv4 192.168.44.2/24 --id PE1RXF -t 600
Make executable:
$ chmod u+x ./start_rnode.sh
### Routing
To use this adapter for internet access change the default gateway:
$ sudo route add default gw 192.168.44.1 metric 30
This gives the new route priority, because the already defined default route has a metric of 100
Change metrics by removing the route and adding it again. The exammple makes the old gateway the one with the higest priority:
$ sudo route del default gw 192.168.44.1 metric 30
$ sudo route add default gw 192.168.44.1 metric 200
chech with:
$ ip route
### And also, on the server site, enable forwarding and nat (NOT ON THE APRS DIGIPEATER!!!)
$ sudo echo "1" > /proc/sys/net/ipv4/ip_forward
$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
$ sudo iptables -A FORWARD -i eth0 -o tnc0 -m state --state RELATED,ESTABLISHED -j ACCEPT
$ sudo iptables -A FORWARD -i tnc0 -o eth0 -j ACCEPT
NOTE: make these changes permanant....
$ sudo nano /etc/sysctl.conf
uncomment: net.ipv4.ip_forward=1
Maybe needed:
# Add the following statement somewhere at the beginning
# of /etc/dhcpcd.conf to prevent dhcpcd from changing MTU
denyinterfaces tnc0
### Start script
$ nano ~/ham/start_aprs_server.sh
Add:
#!/bin/bash
echo "Starting AX.25 interfaces"
# initializing 1200bd packet modem
/home/marcel/ham/start_packetmodem_nano2.sh
# initializing LoRa modem
/home/marcel/ham/RPi-LoRa-KISS-TNC/start_all.sh
# initializing RNode network over LoRa
echo "Starting LoRa network interface"
/home/marcel/ham/rnode_hamnet/start_rnode.sh
# Start weather station software
echo "Starting weather station"
/home/marcel/ham/weather_station/start_weater_station.sh
And make executable
$ chmod u+x ./start_aprs_server.sh
Add to crontab:
$ crontab -e
Add:
# Start APRS server at boot time (for some reason a 60 second wait is necessary)
@reboot sleep 60 && /home/marcel/ham/start_aprs_server.sh
TODO:
network route over RNode if ethernet is down
Webinterface for sending and receiving messages over APRS (forward to e-mail?)
# Backup SD card!
I use the script pishrink.sh to make an image.

@ -0,0 +1,16 @@
% Override default figure placement To be within the flow of the text rather
% than on it's own page.
\usepackage{float}
\usepackage{graphicx}
\makeatletter
\def\fps@figure{H}
\makeatother
% Scale all large images to 50% of twext width
\makeatletter
\setkeys{Gin}{width=\ifdim\Gin@nat@width>\linewidth
0.5\linewidth
\else
\Gin@nat@width
\fi}
\makeatother

@ -0,0 +1,120 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="$lang$" xml:lang="$lang$"$if(dir)$ dir="$dir$"$endif$>
<head>
<meta charset="utf-8" />
<meta name="generator" content="pandoc" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
$for(author-meta)$
<meta name="author" content="$author-meta$" />
$endfor$
$if(date-meta)$
<meta name="dcterms.date" content="$date-meta$" />
$endif$
$if(keywords)$
<meta name="keywords" content="$for(keywords)$$keywords$$sep$, $endfor$" />
$endif$
<title>$if(title-prefix)$$title-prefix$ – $endif$$pagetitle$</title>
$if(highlighting-css)$
<style type="text/css">
$highlighting-css$
</style>
$endif$
$for(css)$
<link rel="stylesheet" href="$css$" />
$endfor$
<style type="text/css">
:root {
--width-content: 1080px;
}
nav {
justify-content: space-around;
}
$if(quotes)$
q { quotes: "“" "”" "‘" "’"; }
$endif$
</style>
$if(math)$
$math$
$endif$
$for(header-includes)$
$header-includes$
$endfor$
</head>
<body>
$for(include-before)$
$include-before$
$endfor$
$if(title)$
<header id="title-block-header">
<nav id="$idprefix$TOC">
<ul>
$if(toc)$
<li>
<a href="#">Index</a>
$table-of-contents$
</li>
$endif$
$if(pdf_version)$
<li>
<a href="$pdf_version$">PDF version</a>
</li>
$endif$
$if(git_repo)$
<li>
<a href="$git_repo$">Git repo</a>
</li>
$endif$
$if(website)$
<li>
<a href="$page_back$">Back</a>
</li>
$endif$
</ul>
<a href="https://www.meezenest.nl/mees/"><img alt="Logo" src="$logo$" height="70"></a>
</nav>
<h1 class="title">$title$</h1>
$if(subtitle)$
<p class="subtitle">$subtitle$</p>
$endif$
$for(author)$
<p class="author">$author$</p>
$endfor$
$if(date)$
<p class="date">$date$</p>
$endif$
$if(pdf_version)$
<p><a href="$pdf_version$"><i>PDF version</i></a></p>
$endif$
</header>
$endif$
<main>
<article>
$if(abstract)$
<p><b>Abstract </b>$abstract$</p>
$endif$
$body$
$for(include-after)$
$include-after$
$endfor$
<hr>
</article>
</main>
<footer>
<p>&copy;
$if(date)$
$date$
$endif$
$for(author)$
$author$
$endfor$
$if(website)$
<a href="$website$">$website$</a>
$endif$
</p><p>This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike 4.0 International License</a>.
</p>
</footer>
</body>
</html>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -0,0 +1,6 @@
# Modification LM2596 module
* Lift pin 5 of LM2596 from PCB and solder a wire to it.
* Solder other side of this wire to the pad on the PCB
![Modification](modification_LM2596.jpg)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -0,0 +1,425 @@
EESchema-LIBRARY Version 2.4
#encoding utf-8
#
# Connector_Conn_01x05_Male
#
DEF Connector_Conn_01x05_Male J 0 40 Y N 1 F N
F0 "J" 0 300 50 H V C CNN
F1 "Connector_Conn_01x05_Male" 0 -300 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
Connector*:*_1x??_*
$ENDFPLIST
DRAW
S 34 -195 0 -205 1 1 6 F
S 34 -95 0 -105 1 1 6 F
S 34 5 0 -5 1 1 6 F
S 34 105 0 95 1 1 6 F
S 34 205 0 195 1 1 6 F
P 2 1 1 6 50 -200 34 -200 N
P 2 1 1 6 50 -100 34 -100 N
P 2 1 1 6 50 0 34 0 N
P 2 1 1 6 50 100 34 100 N
P 2 1 1 6 50 200 34 200 N
X Pin_1 1 200 200 150 L 50 50 1 1 P
X Pin_2 2 200 100 150 L 50 50 1 1 P
X Pin_3 3 200 0 150 L 50 50 1 1 P
X Pin_4 4 200 -100 150 L 50 50 1 1 P
X Pin_5 5 200 -200 150 L 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Device_CP_Small
#
DEF Device_CP_Small C 0 10 N N 1 F N
F0 "C" 10 70 50 H V L CNN
F1 "Device_CP_Small" 10 -80 50 H V L CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
CP_*
$ENDFPLIST
DRAW
S -60 -12 60 -27 0 1 0 F
S -60 27 60 12 0 1 0 N
P 2 0 1 0 -50 60 -30 60 N
P 2 0 1 0 -40 50 -40 70 N
X ~ 1 0 100 73 D 50 50 1 1 P
X ~ 2 0 -100 73 U 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Device_C_Small
#
DEF Device_C_Small C 0 10 N N 1 F N
F0 "C" 10 70 50 H V L CNN
F1 "Device_C_Small" 10 -80 50 H V L CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
C_*
$ENDFPLIST
DRAW
P 2 0 1 13 -60 -20 60 -20 N
P 2 0 1 12 -60 20 60 20 N
X ~ 1 0 100 80 D 50 50 1 1 P
X ~ 2 0 -100 80 U 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Device_D_Small_ALT
#
DEF Device_D_Small_ALT D 0 10 N N 1 F N
F0 "D" -50 80 50 H V L CNN
F1 "Device_D_Small_ALT" -150 -80 50 H V L CNN
F2 "" 0 0 50 V I C CNN
F3 "" 0 0 50 V I C CNN
$FPLIST
TO-???*
*_Diode_*
*SingleDiode*
D_*
$ENDFPLIST
DRAW
P 2 0 1 0 -30 -40 -30 40 N
P 2 0 1 0 -30 0 30 0 N
P 4 0 1 0 30 -40 -30 0 30 40 30 -40 F
X K 1 -100 0 70 R 50 50 1 1 P
X A 2 100 0 70 L 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Device_LED_Dual_ACA
#
DEF Device_LED_Dual_ACA D 0 0 Y N 1 F N
F0 "D" 0 225 50 H V C CNN
F1 "Device_LED_Dual_ACA" 0 -250 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
LED*
LED_SMD:*
LED_THT:*
$ENDFPLIST
DRAW
C -100 0 11 0 1 0 F
C 0 0 180 0 1 10 f
P 2 0 1 0 -180 0 -100 0 N
P 2 0 1 8 -50 -50 -50 -150 N
P 2 0 1 8 -50 50 -50 150 N
P 2 0 1 0 150 -100 75 -100 N
P 2 0 1 0 150 100 75 100 N
P 4 0 1 8 50 -150 50 -50 -50 -100 50 -150 N
P 4 0 1 8 50 50 50 150 -50 100 50 50 N
P 4 0 1 0 80 100 -100 100 -100 -100 80 -100 N
P 5 0 1 0 80 200 140 260 110 260 140 260 140 230 N
P 5 0 1 0 130 160 190 220 160 220 190 220 190 190 N
X A1 1 300 100 150 L 50 50 1 1 I
X K 2 -300 0 120 R 50 50 1 1 I
X A2 3 300 -100 150 L 50 50 1 1 I
ENDDRAW
ENDDEF
#
# Device_R_Small
#
DEF Device_R_Small R 0 10 N N 1 F N
F0 "R" 30 20 50 H V L CNN
F1 "Device_R_Small" 30 -40 50 H V L CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
R_*
$ENDFPLIST
DRAW
S -30 70 30 -70 0 1 8 N
X ~ 1 0 100 30 D 50 50 1 1 P
X ~ 2 0 -100 30 U 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Graphic_Logo_Open_Hardware_Small
#
DEF Graphic_Logo_Open_Hardware_Small #LOGO 0 40 Y Y 1 F N
F0 "#LOGO" 0 275 50 H I C CNN
F1 "Graphic_Logo_Open_Hardware_Small" 0 -225 50 H I C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
DRAW
P 277 0 1 0 132 -171 130 -170 125 -167 118 -162 109 -156 100 -150 93 -146 88 -142 86 -141 85 -142 81 -144 75 -147 71 -149 66 -151 63 -151 63 -151 61 -147 58 -139 53 -130 49 -119 44 -107 38 -95 34 -83 29 -72 26 -64 24 -58 23 -55 23 -55 26 -52 31 -49 41 -40 51 -27 57 -13 60 3 58 18 52 32 42 45 30 54 16 60 0 62 -15 61 -29 55 -42 45 -48 39 -55 26 -60 12 -60 9 -59 -7 -55 -21 -47 -34 -36 -45 -34 -46 -29 -50 -25 -53 -23 -55 -42 -102 -45 -110 -51 -123 -55 -134 -59 -143 -62 -149 -63 -151 -63 -151 -65 -151 -68 -150 -75 -147 -79 -145 -84 -142 -87 -141 -89 -142 -93 -145 -100 -150 -109 -156 -117 -161 -124 -166 -130 -170 -132 -171 -133 -171 -135 -170 -139 -166 -146 -160 -155 -151 -156 -150 -164 -142 -170 -136 -174 -131 -175 -129 -175 -129 -174 -127 -170 -121 -166 -114 -160 -105 -144 -82 -153 -61 -155 -54 -159 -46 -161 -41 -162 -38 -165 -37 -170 -36 -179 -34 -189 -32 -199 -31 -207 -29 -214 -28 -217 -27 -217 -27 -218 -25 -218 -22 -218 -17 -219 -9 -219 3 -219 5 -218 16 -218 25 -218 30 -218 33 -218 33 -215 33 -209 35 -200 36 -190 38 -189 39 -179 41 -170 42 -164 44 -161 45 -161 45 -159 49 -156 56 -152 64 -149 72 -146 79 -144 85 -143 87 -143 87 -145 90 -148 95 -153 102 -160 111 -160 112 -166 121 -171 128 -174 133 -175 136 -175 136 -173 138 -169 143 -162 150 -155 158 -152 160 -144 169 -138 174 -134 177 -132 178 -132 178 -130 176 -124 172 -117 167 -108 161 -107 161 -98 155 -91 150 -86 146 -84 145 -83 145 -80 146 -73 148 -66 151 -58 155 -50 158 -45 160 -42 162 -42 162 -41 165 -40 171 -38 180 -36 191 -35 193 -33 203 -32 212 -31 218 -30 220 -28 221 -23 221 -16 221 -6 221 3 221 13 221 21 221 27 220 29 220 29 220 30 217 32 210 33 201 36 190 36 188 38 178 40 169 41 163 42 161 42 161 47 159 54 156 62 152 82 144 107 161 109 163 118 169 125 174 130 177 133 178 133 178 135 176 140 171 147 165 154 157 160 151 167 144 171 140 174 137 174 135 174 134 173 131 169 126 164 118 158 110 153 102 148 94 144 88 143 85 143 84 145 79 148 72 152 63 160 44 173 41 181 40 192 38 202 36 218 33 219 -26 216 -27 214 -27 208 -29 199 -30 189 -32 181 -34 172 -36 166 -37 163 -37 162 -38 160 -42 157 -49 154 -57 150 -65 147 -73 145 -79 144 -82 145 -84 149 -89 153 -97 159 -105 165 -114 170 -121 173 -126 175 -129 174 -131 171 -135 164 -141 155 -151 153 -152 145 -160 139 -166 134 -170 132 -171 F
ENDDRAW
ENDDEF
#
# Mechanical_MountingHole
#
DEF Mechanical_MountingHole H 0 40 Y Y 1 F N
F0 "H" 0 200 50 H V C CNN
F1 "Mechanical_MountingHole" 0 125 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
MountingHole*
$ENDFPLIST
DRAW
C 0 0 50 0 1 50 N
ENDDRAW
ENDDEF
#
# Switch_SW_Push
#
DEF Switch_SW_Push SW 0 40 N N 1 F N
F0 "SW" 50 100 50 H V L CNN
F1 "Switch_SW_Push" 0 -60 50 H V C CNN
F2 "" 0 200 50 H I C CNN
F3 "" 0 200 50 H I C CNN
DRAW
C -80 0 20 0 1 0 N
C 80 0 20 0 1 0 N
P 2 0 1 0 0 50 0 120 N
P 2 0 1 0 100 50 -100 50 N
X 1 1 -200 0 100 R 50 50 0 1 P
X 2 2 200 0 100 L 50 50 0 1 P
ENDDRAW
ENDDEF
#
# Timer_NE555
#
DEF Timer_NE555 U 0 20 Y Y 1 F N
F0 "U" -400 350 50 H V L CNN
F1 "Timer_NE555" 100 350 50 H V L CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
ALIAS ICM7555 LMC555xM LMC555xMM LMC555xN MC1455 TLC555CD TLC555CP TLC555CPS NA555 NE555 SE555 SA555
$FPLIST
SOIC*3.9x4.9mm*P1.27mm*
DIP*W7.62mm*
TSSOP*3x3mm*P0.65mm*
$ENDFPLIST
DRAW
S -350 -300 350 300 0 1 10 f
S -350 -300 350 300 0 1 10 f
X GND 1 0 -400 100 U 50 50 0 0 W
X VCC 8 0 400 100 D 50 50 0 0 W
X TR 2 -500 200 150 R 50 50 1 1 I
X Q 3 500 200 150 L 50 50 1 1 O
X R 4 -500 -200 150 R 50 50 1 1 I I
X CV 5 -500 0 150 R 50 50 1 1 I
X THR 6 500 -200 150 L 50 50 1 1 I
X DIS 7 500 0 150 L 50 50 1 1 I
ENDDRAW
ENDDEF
#
# Transistor_BJT_BC547
#
DEF Transistor_BJT_BC547 Q 0 0 Y N 1 F N
F0 "Q" 200 75 50 H V L CNN
F1 "Transistor_BJT_BC547" 200 0 50 H V L CNN
F2 "Package_TO_SOT_THT:TO-92_Inline" 200 -75 50 H I L CIN
F3 "" 0 0 50 H I L CNN
ALIAS BC546 BC548 BC549 BC550 BC337 BC338
$FPLIST
TO?92*
$ENDFPLIST
DRAW
C 50 0 111 0 1 10 N
P 2 0 1 0 0 0 25 0 N
P 2 0 1 0 25 25 100 100 N
P 3 0 1 0 25 -25 100 -100 100 -100 N
P 3 0 1 20 25 75 25 -75 25 -75 N
P 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F
X C 1 100 200 100 D 50 50 1 1 P
X B 2 -200 0 200 R 50 50 1 1 I
X E 3 100 -200 100 U 50 50 1 1 P
ENDDRAW
ENDDEF
#
# mtk_power_supply_DCDC_LM2596
#
DEF mtk_power_supply_DCDC_LM2596 U 0 20 Y Y 1 F N
F0 "U" 0 450 50 H V C CNN
F1 "mtk_power_supply_DCDC_LM2596" 0 350 50 H V C CNN
F2 "Converter_DCDC:Converter_DCDC_XP_POWER-ISU02_SMD" 0 -350 50 H I C CIN
F3 "" 0 -450 50 H I C CNN
$FPLIST
*XP?POWER*ISU02*SMD*
$ENDFPLIST
DRAW
S -400 300 400 -300 0 1 10 f
P 2 0 1 0 0 -200 0 -250 N
P 2 0 1 0 0 -100 0 -150 N
P 2 0 1 0 0 0 0 -50 N
P 2 0 1 0 0 100 0 50 N
P 2 0 1 0 0 200 0 150 N
P 2 0 1 0 0 300 0 250 N
X +VIN 1 -500 200 100 R 50 50 1 1 W
X -VIN 2 -500 -200 100 R 50 50 1 1 W
X -VOUT 3 500 -200 100 L 50 50 1 1 w
X +VOUT 4 500 200 100 L 50 50 1 1 w
X ~ON~/OFF 5 -500 0 100 R 50 50 1 1 I
ENDDRAW
ENDDEF
#
# mtk_processor_Raspberry_Pi_for_lora_module
#
DEF mtk_processor_Raspberry_Pi_for_lora_module J 0 40 Y Y 1 F N
F0 "J" -700 1250 50 H V L BNN
F1 "mtk_processor_Raspberry_Pi_for_lora_module" 400 -1250 50 H V L TNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
PinHeader*2x20*P2.54mm*Vertical*
PinSocket*2x20*P2.54mm*Vertical*
$ENDFPLIST
DRAW
S -700 1200 700 -1200 0 1 10 f
S -665 -690 -700 -710 1 1 0 N
S -665 -590 -700 -610 1 1 0 N
S -665 -490 -700 -510 1 1 0 N
S -665 -390 -700 -410 1 1 0 N
S -665 -290 -700 -310 1 1 0 N
S -665 -190 -700 -210 1 1 0 N
S -665 10 -700 -10 1 1 0 N
S -665 110 -700 90 1 1 0 N
S -665 210 -700 190 1 1 0 N
S -665 410 -700 390 1 1 0 N
S -665 510 -700 490 1 1 0 N
S -665 610 -700 590 1 1 0 N
S -665 810 -700 790 1 1 0 N
S -665 910 -700 890 1 1 0 N
S -410 -1165 -390 -1200 1 1 0 N
S -310 -1165 -290 -1200 1 1 0 N
S -210 -1165 -190 -1200 1 1 0 N
S -210 1200 -190 1165 1 1 0 N
S -110 -1165 -90 -1200 1 1 0 N
S -110 1200 -90 1165 1 1 0 N
S -10 -1165 10 -1200 1 1 0 N
S 90 -1165 110 -1200 1 1 0 N
S 90 1200 110 1165 1 1 0 N
S 190 -1165 210 -1200 1 1 0 N
S 190 1200 210 1165 1 1 0 N
S 290 -1165 310 -1200 1 1 0 N
S 700 -790 665 -810 1 1 0 N
S 700 -690 665 -710 1 1 0 N
S 700 -490 665 -510 1 1 0 N
S 700 -390 665 -410 1 1 0 N
S 700 -290 665 -310 1 1 0 N
S 700 -190 665 -210 1 1 0 N
S 700 -90 665 -110 1 1 0 N
S 700 110 665 90 1 1 0 N
S 700 210 665 190 1 1 0 N
S 700 310 665 290 1 1 0 N
S 700 510 665 490 1 1 0 N
S 700 610 665 590 1 1 0 N
S 700 810 665 790 1 1 0 N
S 700 910 665 890 1 1 0 N
X 3V3 1 100 1300 100 D 50 50 1 1 W
X GND 14 -200 -1300 100 U 50 50 1 1 W
X MOSI0/GPIO10 19 800 -400 100 L 50 50 1 1 B
X 5V 2 -200 1300 100 D 50 50 1 1 W
X GND 20 -100 -1300 100 U 50 50 1 1 W
X MISO0/GPIO9 21 800 -300 100 L 50 50 1 1 B
X SCLK0/GPIO11 23 800 -500 100 L 50 50 1 1 B
X ~CE0~/GPIO8 24 800 -200 100 L 50 50 1 1 B
X GND 25 0 -1300 100 U 50 50 1 1 W
X GCLK1/GPIO5 29 800 200 100 L 50 50 1 1 B
X SDA/GPIO2 3 800 600 100 L 50 50 1 1 B
X GND 30 100 -1300 100 U 50 50 1 1 W
X GCLK2/GPIO6 31 800 100 100 L 50 50 1 1 B
X GND 34 200 -1300 100 U 50 50 1 1 W
X GPIO16 36 -800 600 100 R 50 50 1 1 B
X GND 39 300 -1300 100 U 50 50 1 1 W
X 5V 4 -100 1300 100 D 50 50 1 1 W
X GPIO21/SCLK1 40 -800 0 100 R 50 50 1 1 B
X SCL/GPIO3 5 800 500 100 L 50 50 1 1 B
X GND 6 -400 -1300 100 U 50 50 1 1 W
ENDDRAW
ENDDEF
#
# mtk_rf_Ra-02
#
DEF mtk_rf_Ra-02 U 0 40 Y Y 1 F N
F0 "U" -150 150 50 H V C CNN
F1 "mtk_rf_Ra-02" -50 -850 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
DRAW
S -200 100 500 -800 0 1 0 f
X GND 1 -400 0 200 R 50 50 1 1 P
X DIO4 10 700 -600 200 L 50 50 1 1 B
X DIO5 11 700 -500 200 L 50 50 1 1 B
X SCK 12 700 -400 200 L 50 50 1 1 B
X MISO 13 700 -300 200 L 50 50 1 1 B
X MOSI 14 700 -200 200 L 50 50 1 1 B
X NSS 15 700 -100 200 L 50 50 1 1 B
X GND 16 700 0 200 L 50 50 1 1 P
X GND 2 -400 -100 200 R 50 50 1 1 P
X 3V3 3 -400 -200 200 R 50 50 1 1 W
X RST 4 -400 -300 200 R 50 50 1 1 I
X DIO0 5 -400 -400 200 R 50 50 1 1 B
X DIO1 6 -400 -500 200 R 50 50 1 1 B
X DIO2 7 -400 -600 200 R 50 50 1 1 B
X DIO3 8 -400 -700 200 R 50 50 1 1 B
X GND 9 700 -700 200 L 50 50 1 1 P
ENDDRAW
ENDDEF
#
# power_+12V
#
DEF power_+12V #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -150 50 H I C CNN
F1 "power_+12V" 0 140 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
DRAW
P 2 0 1 0 -30 50 0 100 N
P 2 0 1 0 0 0 0 100 N
P 2 0 1 0 0 100 30 50 N
X +12V 1 0 0 0 U 50 50 1 1 W N
ENDDRAW
ENDDEF
#
# power_+3V3
#
DEF power_+3V3 #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -150 50 H I C CNN
F1 "power_+3V3" 0 140 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
ALIAS +3.3V
DRAW
P 2 0 1 0 -30 50 0 100 N
P 2 0 1 0 0 0 0 100 N
P 2 0 1 0 0 100 30 50 N
X +3V3 1 0 0 0 U 50 50 1 1 W N
ENDDRAW
ENDDEF
#
# power_+5V
#
DEF power_+5V #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -150 50 H I C CNN
F1 "power_+5V" 0 140 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
DRAW
P 2 0 1 0 -30 50 0 100 N
P 2 0 1 0 0 0 0 100 N
P 2 0 1 0 0 100 30 50 N
X +5V 1 0 0 0 U 50 50 1 1 W N
ENDDRAW
ENDDEF
#
# power_GND
#
DEF power_GND #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -250 50 H I C CNN
F1 "power_GND" 0 -150 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
DRAW
P 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N
X GND 1 0 0 0 D 50 50 1 1 W N
ENDDRAW
ENDDEF
#
#End Library

@ -0,0 +1,78 @@
{
"Header":
{
"GenerationSoftware":
{
"Vendor": "KiCad",
"Application": "Pcbnew",
"Version": "5.1.8-5.1.8"
},
"CreationDate": "2022-01-20T13:52:36+01:00"
},
"GeneralSpecs":
{
"ProjectId":
{
"Name": "winlink_server",
"GUID": "77696e6c-696e-46b5-9f73-65727665722e",
"Revision": "rev?"
},
"Size":
{
"X": 0.000,
"Y": 0.000
},
"LayerNumber": 2,
"BoardThickness": 1.600
},
"DesignRules":
[
{
"Layers": "Outer",
"PadToPad": 0.200,
"PadToTrack": 0.200,
"TrackToTrack": 0.200,
"MinLineWidth": 0.250,
"TrackToRegion": 0.508,
"RegionToRegion": 0.508
}
],
"FilesAttributes":
[
{
"Path": "winlink_server-F_Cu.gbr",
"FileFunction": "Copper,L1,Top",
"FilePolarity": "Positive"
},
{
"Path": "winlink_server-B_Cu.gbr",
"FileFunction": "Copper,L2,Bot",
"FilePolarity": "Positive"
},
{
"Path": "winlink_server-F_SilkS.gbr",
"FileFunction": "Legend,Top",
"FilePolarity": "Positive"
}
],
"MaterialStackup":
[
{
"Type": "Legend",
"Notes": "Layer F.SilkS"
},
{
"Type": "Copper",
"Notes": "Layer F.Cu"
},
{
"Type": "Dielectric",
"Material": "FR4",
"Notes": "Layers L1/L2"
},
{
"Type": "Copper",
"Notes": "Layer B.Cu"
}
]
}

@ -0,0 +1,17 @@
Reference, Quantity, Value, Footprint, Datasheet, Manufacturer, Ordering #
C1 C2 ,2,"100n","Capacitor_THT:C_Disc_D7.5mm_W2.5mm_P5.00mm","~","QPL","100n/50V"
C3 ,1,"100U","Capacitor_THT:CP_Radial_D5.0mm_P2.50mm","~","QPL","100U/15V"
D1 D2 D3 D4 D5 D7 ,6,"1N4148","Diode_THT:D_A-405_P7.62mm_Horizontal","~","QPL","1N4148"
D6 ,1,"Dual LED","Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical","~","QPL","LED dual color 3 mm"
H1 H2 H3 H4 ,4,"M3","MountingHole:MountingHole_3.2mm_M3_DIN965_Pad","~","Not a placeable part","-"
J1 ,1,"Raspberry_Pi_for_lora_module","mtk_processor:Raspberry_Pi_Zero_for_lora_module","https://www.raspberrypi.org/documentation/hardware/raspberrypi/schematics/rpi_SCH_3bplus_1p0_reduced.pdf"
J2 ,1,"IIC","Connector_PinHeader_2.54mm:PinHeader_1x05_P2.54mm_Vertical","~","QPL","2.54mm header 5 pin"
Q1 Q2 Q3 ,3,"BC547C","Package_TO_SOT_THT:TO-92_Wide","http://www.fairchildsemi.com/ds/BC/BC547.pdf","QPL","BC547C"
R1 ,1,"470k","Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal","~","QPL","470k 1% 0.25W"
R2 R3 R4 R5 R7 R8 ,6,"10k","Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal","~","QPL","10k 1% 0.25W"
R6 ,1,"3k3","Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal","~","QPL","3k3 1% 0.25W"
R9 ,1,"100k","Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal","~","QPL","100k 1% 0.25W"
SW1 ,1,"POWER_ON","Connector_PinSocket_2.54mm:PinSocket_1x02_P2.54mm_Vertical","~","QPL","2.54mm header 2 pin"
U1 ,1,"Ra-02","mtk_rf:RA-02","","Thinker","Ra-02"
U2 ,1,"NE555","Package_DIP:DIP-8_W7.62mm_LongPads","http://www.ti.com/lit/ds/symlink/ne555.pdf","QPL","NE555"
U3 ,1,"DCDC_LM2596","mtk_power_supply:LM2596","","QPL","LM2596 module"
unable to load file from base commit

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -0,0 +1,698 @@
(export (version D)
(design
(source /home/marcel/Documenten/electronische_projecten/winlink_server/winlink-server-KiCad/winlink_server.sch)
(date "do 20 jan 2022 14:51:51 CET")
(tool "Eeschema 5.1.8-5.1.8")
(sheet (number 1) (name /) (tstamps /)
(title_block
(title "LORA APRS shield")
(company "M. Konstapel")
(rev 1)
(date 2022-01-20)
(source winlink_server.sch)
(comment (number 1) (value https://meezenest.nl/mees))
(comment (number 2) (value ""))
(comment (number 3) (value ""))
(comment (number 4) (value "")))))
(components
(comp (ref U1)
(value Ra-02)
(footprint mtk_rf:RA-02)
(fields
(field (name Manufacturer) Thinker)
(field (name "Ordering #") Ra-02))
(libsource (lib mtk_rf) (part Ra-02) (description ""))
(sheetpath (names /) (tstamps /))
(tstamp 61E5E459))
(comp (ref U2)
(value NE555)
(footprint Package_DIP:DIP-8_W7.62mm_LongPads)
(datasheet http://www.ti.com/lit/ds/symlink/ne555.pdf)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") NE555))
(libsource (lib Timer) (part NE555) (description "Precision Timers, DIP-8/SOIC-8"))
(sheetpath (names /) (tstamps /))
(tstamp 61E60C77))
(comp (ref C2)
(value 100n)
(footprint Capacitor_THT:C_Disc_D7.5mm_W2.5mm_P5.00mm)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") 100n/50V))
(libsource (lib Device) (part C_Small) (description "Unpolarized capacitor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 61E64022))
(comp (ref C3)
(value 100U)
(footprint Capacitor_THT:CP_Radial_D5.0mm_P2.50mm)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") 100U/15V))
(libsource (lib Device) (part CP_Small) (description "Polarized capacitor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 61E647F7))
(comp (ref R1)
(value 470k)
(footprint Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "470k 1% 0.25W"))
(libsource (lib Device) (part R_Small) (description "Resistor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 61E6532C))
(comp (ref U3)
(value DCDC_LM2596)
(footprint mtk_power_supply:LM2596)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "LM2596 module"))
(libsource (lib mtk_power_supply) (part DCDC_LM2596) (description ""))
(sheetpath (names /) (tstamps /))
(tstamp 61E6B9FF))
(comp (ref R2)
(value 10k)
(footprint Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "10k 1% 0.25W"))
(libsource (lib Device) (part R_Small) (description "Resistor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 61E738A4))
(comp (ref D4)
(value 1N4148)
(footprint Diode_THT:D_A-405_P7.62mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") 1N4148))
(libsource (lib Device) (part D_Small_ALT) (description "Diode, small symbol, filled shape"))
(sheetpath (names /) (tstamps /))
(tstamp 61E748F5))
(comp (ref D5)
(value 1N4148)
(footprint Diode_THT:D_A-405_P7.62mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") 1N4148))
(libsource (lib Device) (part D_Small_ALT) (description "Diode, small symbol, filled shape"))
(sheetpath (names /) (tstamps /))
(tstamp 61E7510A))
(comp (ref D3)
(value 1N4148)
(footprint Diode_THT:D_A-405_P7.62mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") 1N4148))
(libsource (lib Device) (part D_Small_ALT) (description "Diode, small symbol, filled shape"))
(sheetpath (names /) (tstamps /))
(tstamp 61E752C9))
(comp (ref R9)
(value 100k)
(footprint Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "100k 1% 0.25W"))
(libsource (lib Device) (part R_Small) (description "Resistor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 61E78C2C))
(comp (ref R8)
(value 10k)
(footprint Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "10k 1% 0.25W"))
(libsource (lib Device) (part R_Small) (description "Resistor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 61E7939A))
(comp (ref Q3)
(value BC547C)
(footprint Package_TO_SOT_THT:TO-92_Wide)
(datasheet http://www.fairchildsemi.com/ds/BC/BC547.pdf)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") BC547C))
(libsource (lib Transistor_BJT) (part BC547) (description "0.1A Ic, 45V Vce, Small Signal NPN Transistor, TO-92"))
(sheetpath (names /) (tstamps /))
(tstamp 61E8E32B))
(comp (ref D7)
(value 1N4148)
(footprint Diode_THT:D_A-405_P7.62mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") 1N4148))
(libsource (lib Device) (part D_Small_ALT) (description "Diode, small symbol, filled shape"))
(sheetpath (names /) (tstamps /))
(tstamp 61E8F395))
(comp (ref SW1)
(value POWER_ON)
(footprint Connector_PinSocket_2.54mm:PinSocket_1x02_P2.54mm_Vertical)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "2.54mm header 2 pin"))
(libsource (lib Switch) (part SW_Push) (description "Push button switch, generic, two pins"))
(sheetpath (names /) (tstamps /))
(tstamp 61E786D8))
(comp (ref D6)
(value "Dual LED")
(footprint Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "LED dual color 3 mm"))
(libsource (lib Device) (part LED_Dual_ACA) (description "Dual LED, common cathode on pin 2"))
(sheetpath (names /) (tstamps /))
(tstamp 61EA59A8))
(comp (ref R7)
(value 10k)
(footprint Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "10k 1% 0.25W"))
(libsource (lib Device) (part R_Small) (description "Resistor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 61EB5A7D))
(comp (ref R6)
(value 3k3)
(footprint Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "3k3 1% 0.25W"))
(libsource (lib Device) (part R_Small) (description "Resistor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 61EBD1AF))
(comp (ref R3)
(value 10k)
(footprint Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "10k 1% 0.25W"))
(libsource (lib Device) (part R_Small) (description "Resistor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 61ED8E9E))
(comp (ref Q1)
(value BC547C)
(footprint Package_TO_SOT_THT:TO-92_Wide)
(datasheet http://www.fairchildsemi.com/ds/BC/BC547.pdf)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") BC547C))
(libsource (lib Transistor_BJT) (part BC547) (description "0.1A Ic, 45V Vce, Small Signal NPN Transistor, TO-92"))
(sheetpath (names /) (tstamps /))
(tstamp 61E725D2))
(comp (ref C1)
(value 100n)
(footprint Capacitor_THT:C_Disc_D7.5mm_W2.5mm_P5.00mm)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") 100n/50V))
(libsource (lib Device) (part C_Small) (description "Unpolarized capacitor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 61F5371B))
(comp (ref D1)
(value 1N4148)
(footprint Diode_THT:D_A-405_P7.62mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") 1N4148))
(libsource (lib Device) (part D_Small_ALT) (description "Diode, small symbol, filled shape"))
(sheetpath (names /) (tstamps /))
(tstamp 61E95571))
(comp (ref J2)
(value IIC)
(footprint Connector_PinHeader_2.54mm:PinHeader_1x05_P2.54mm_Vertical)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "2.54mm header 5 pin"))
(libsource (lib Connector) (part Conn_01x05_Male) (description "Generic connector, single row, 01x05, script generated (kicad-library-utils/schlib/autogen/connector/)"))
(sheetpath (names /) (tstamps /))
(tstamp 61ED9E42))
(comp (ref R4)
(value 10k)
(footprint Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "10k 1% 0.25W"))
(libsource (lib Device) (part R_Small) (description "Resistor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 61EEB42A))
(comp (ref R5)
(value 10k)
(footprint Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "10k 1% 0.25W"))
(libsource (lib Device) (part R_Small) (description "Resistor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 61EEB432))
(comp (ref Q2)
(value BC547C)
(footprint Package_TO_SOT_THT:TO-92_Wide)
(datasheet http://www.fairchildsemi.com/ds/BC/BC547.pdf)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") BC547C))
(libsource (lib Transistor_BJT) (part BC547) (description "0.1A Ic, 45V Vce, Small Signal NPN Transistor, TO-92"))
(sheetpath (names /) (tstamps /))
(tstamp 61EEB43B))
(comp (ref D2)
(value 1N4148)
(footprint Diode_THT:D_A-405_P7.62mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") 1N4148))
(libsource (lib Device) (part D_Small_ALT) (description "Diode, small symbol, filled shape"))
(sheetpath (names /) (tstamps /))
(tstamp 61F1769B))
(comp (ref H1)
(value M3)
(footprint MountingHole:MountingHole_3.2mm_M3_DIN965_Pad)
(datasheet ~)
(fields
(field (name Manufacturer) "Not a placeable part")
(field (name "Ordering #") -))
(libsource (lib Mechanical) (part MountingHole) (description "Mounting Hole without connection"))
(sheetpath (names /) (tstamps /))
(tstamp 6200BDDD))
(comp (ref H2)
(value M3)
(footprint MountingHole:MountingHole_3.2mm_M3_DIN965_Pad)
(datasheet ~)
(fields
(field (name Manufacturer) "Not a placeable part")
(field (name "Ordering #") -))
(libsource (lib Mechanical) (part MountingHole) (description "Mounting Hole without connection"))
(sheetpath (names /) (tstamps /))
(tstamp 6200C56C))
(comp (ref H3)
(value M3)
(footprint MountingHole:MountingHole_3.2mm_M3_DIN965_Pad)
(datasheet ~)
(fields
(field (name Manufacturer) "Not a placeable part")
(field (name "Ordering #") -))
(libsource (lib Mechanical) (part MountingHole) (description "Mounting Hole without connection"))
(sheetpath (names /) (tstamps /))
(tstamp 6200C756))
(comp (ref H4)
(value M3)
(footprint MountingHole:MountingHole_3.2mm_M3_DIN965_Pad)
(datasheet ~)
(fields
(field (name Manufacturer) "Not a placeable part")
(field (name "Ordering #") -))
(libsource (lib Mechanical) (part MountingHole) (description "Mounting Hole without connection"))
(sheetpath (names /) (tstamps /))
(tstamp 6200C9C8))
(comp (ref J1)
(value Raspberry_Pi_for_lora_module)
(footprint mtk_processor:Raspberry_Pi_Zero_for_lora_module)
(datasheet https://www.raspberrypi.org/documentation/hardware/raspberrypi/schematics/rpi_SCH_3bplus_1p0_reduced.pdf)
(libsource (lib mtk_processor) (part Raspberry_Pi_for_lora_module) (description "expansion header for Raspberry Pi 2 & 3"))
(sheetpath (names /) (tstamps /))
(tstamp 620B745B)))
(libparts
(libpart (lib Connector) (part Conn_01x05_Male)
(description "Generic connector, single row, 01x05, script generated (kicad-library-utils/schlib/autogen/connector/)")
(docs ~)
(footprints
(fp Connector*:*_1x??_*))
(fields
(field (name Reference) J)
(field (name Value) Conn_01x05_Male))
(pins
(pin (num 1) (name Pin_1) (type passive))
(pin (num 2) (name Pin_2) (type passive))
(pin (num 3) (name Pin_3) (type passive))
(pin (num 4) (name Pin_4) (type passive))
(pin (num 5) (name Pin_5) (type passive))))
(libpart (lib Device) (part CP_Small)
(description "Polarized capacitor, small symbol")
(docs ~)
(footprints
(fp CP_*))
(fields
(field (name Reference) C)
(field (name Value) CP_Small))
(pins
(pin (num 1) (name ~) (type passive))
(pin (num 2) (name ~) (type passive))))
(libpart (lib Device) (part C_Small)
(description "Unpolarized capacitor, small symbol")
(docs ~)
(footprints
(fp C_*))
(fields
(field (name Reference) C)
(field (name Value) C_Small))
(pins
(pin (num 1) (name ~) (type passive))
(pin (num 2) (name ~) (type passive))))
(libpart (lib Device) (part D_Small_ALT)
(description "Diode, small symbol, filled shape")
(docs ~)
(footprints
(fp TO-???*)
(fp *_Diode_*)
(fp *SingleDiode*)
(fp D_*))
(fields
(field (name Reference) D)
(field (name Value) D_Small_ALT))
(pins
(pin (num 1) (name K) (type passive))
(pin (num 2) (name A) (type passive))))
(libpart (lib Device) (part LED_Dual_ACA)
(description "Dual LED, common cathode on pin 2")
(docs ~)
(footprints
(fp LED*)
(fp LED_SMD:*)
(fp LED_THT:*))
(fields
(field (name Reference) D)
(field (name Value) LED_Dual_ACA))
(pins
(pin (num 1) (name A1) (type input))
(pin (num 2) (name K) (type input))
(pin (num 3) (name A2) (type input))))
(libpart (lib Device) (part R_Small)
(description "Resistor, small symbol")
(docs ~)
(footprints
(fp R_*))
(fields
(field (name Reference) R)
(field (name Value) R_Small))
(pins
(pin (num 1) (name ~) (type passive))
(pin (num 2) (name ~) (type passive))))
(libpart (lib Mechanical) (part MountingHole)
(description "Mounting Hole without connection")
(docs ~)
(footprints
(fp MountingHole*))
(fields
(field (name Reference) H)
(field (name Value) MountingHole)))
(libpart (lib Switch) (part SW_Push)
(description "Push button switch, generic, two pins")
(docs ~)
(fields
(field (name Reference) SW)
(field (name Value) SW_Push))
(pins
(pin (num 1) (name 1) (type passive))
(pin (num 2) (name 2) (type passive))))
(libpart (lib Timer) (part LM555)
(aliases
(alias ICM7555)
(alias LMC555xM)
(alias LMC555xMM)
(alias LMC555xN)
(alias MC1455)
(alias TLC555CD)
(alias TLC555CP)
(alias TLC555CPS)
(alias NA555)
(alias NE555)
(alias SE555)
(alias SA555))
(description "Timer, DIP-8/SOIC-8/SSOP-8")
(docs http://www.ti.com/lit/ds/symlink/lm555.pdf)
(footprints
(fp SOIC*3.9x4.9mm*P1.27mm*)
(fp DIP*W7.62mm*)
(fp TSSOP*3x3mm*P0.65mm*))
(fields
(field (name Reference) U)
(field (name Value) LM555))
(pins
(pin (num 1) (name GND) (type power_in))
(pin (num 2) (name TR) (type input))
(pin (num 3) (name Q) (type output))
(pin (num 4) (name R) (type input))
(pin (num 5) (name CV) (type input))
(pin (num 6) (name THR) (type input))
(pin (num 7) (name DIS) (type input))
(pin (num 8) (name VCC) (type power_in))))
(libpart (lib Transistor_BJT) (part BC547)
(aliases
(alias BC546)
(alias BC548)
(alias BC549)
(alias BC550)
(alias BC337)
(alias BC338))
(description "0.1A Ic, 45V Vce, Small Signal NPN Transistor, TO-92")
(docs http://www.fairchildsemi.com/ds/BC/BC547.pdf)
(footprints
(fp TO?92*))
(fields
(field (name Reference) Q)
(field (name Value) BC547)
(field (name Footprint) Package_TO_SOT_THT:TO-92_Inline))
(pins
(pin (num 1) (name C) (type passive))
(pin (num 2) (name B) (type input))
(pin (num 3) (name E) (type passive))))
(libpart (lib mtk_power_supply) (part DCDC_LM2596)
(footprints
(fp *XP?POWER*ISU02*SMD*))
(fields
(field (name Reference) U)
(field (name Value) DCDC_LM2596)
(field (name Footprint) Converter_DCDC:Converter_DCDC_XP_POWER-ISU02_SMD))
(pins
(pin (num 1) (name +VIN) (type power_in))
(pin (num 2) (name -VIN) (type power_in))
(pin (num 3) (name -VOUT) (type power_out))
(pin (num 4) (name +VOUT) (type power_out))
(pin (num 5) (name ~ON~/OFF) (type input))))
(libpart (lib mtk_processor) (part Raspberry_Pi_for_lora_module)
(description "expansion header for Raspberry Pi 2 & 3")
(docs https://www.raspberrypi.org/documentation/hardware/raspberrypi/schematics/rpi_SCH_3bplus_1p0_reduced.pdf)
(footprints
(fp PinHeader*2x20*P2.54mm*Vertical*)
(fp PinSocket*2x20*P2.54mm*Vertical*))
(fields
(field (name Reference) J)
(field (name Value) Raspberry_Pi_for_lora_module))
(pins
(pin (num 1) (name 3V3) (type power_in))
(pin (num 2) (name 5V) (type power_in))
(pin (num 3) (name SDA/GPIO2) (type BiDi))
(pin (num 4) (name 5V) (type power_in))
(pin (num 5) (name SCL/GPIO3) (type BiDi))
(pin (num 6) (name GND) (type power_in))
(pin (num 14) (name GND) (type power_in))
(pin (num 19) (name MOSI0/GPIO10) (type BiDi))
(pin (num 20) (name GND) (type power_in))
(pin (num 21) (name MISO0/GPIO9) (type BiDi))
(pin (num 23) (name SCLK0/GPIO11) (type BiDi))
(pin (num 24) (name ~CE0~/GPIO8) (type BiDi))
(pin (num 25) (name GND) (type power_in))
(pin (num 29) (name GCLK1/GPIO5) (type BiDi))
(pin (num 30) (name GND) (type power_in))
(pin (num 31) (name GCLK2/GPIO6) (type BiDi))
(pin (num 34) (name GND) (type power_in))
(pin (num 36) (name GPIO16) (type BiDi))
(pin (num 39) (name GND) (type power_in))
(pin (num 40) (name GPIO21/SCLK1) (type BiDi))))
(libpart (lib mtk_rf) (part Ra-02)
(fields
(field (name Reference) U)
(field (name Value) Ra-02))
(pins
(pin (num 1) (name GND) (type passive))
(pin (num 2) (name GND) (type passive))
(pin (num 3) (name 3V3) (type power_in))
(pin (num 4) (name RST) (type input))
(pin (num 5) (name DIO0) (type BiDi))
(pin (num 6) (name DIO1) (type BiDi))
(pin (num 7) (name DIO2) (type BiDi))
(pin (num 8) (name DIO3) (type BiDi))
(pin (num 9) (name GND) (type passive))
(pin (num 10) (name DIO4) (type BiDi))
(pin (num 11) (name DIO5) (type BiDi))
(pin (num 12) (name SCK) (type BiDi))
(pin (num 13) (name MISO) (type BiDi))
(pin (num 14) (name MOSI) (type BiDi))
(pin (num 15) (name NSS) (type BiDi))
(pin (num 16) (name GND) (type passive)))))
(libraries
(library (logical Connector)
(uri /usr/share/kicad/library/Connector.lib))
(library (logical Device)
(uri /home/marcel/kicad_sources/kicad-symbols-master/Device.lib))
(library (logical Mechanical)
(uri /usr/share/kicad/library/Mechanical.lib))
(library (logical Switch)
(uri /usr/share/kicad/library/Switch.lib))
(library (logical Timer)
(uri /home/marcel/kicad_sources/kicad-symbols-master/Timer.lib))
(library (logical Transistor_BJT)
(uri /home/marcel/kicad_sources/kicad-symbols-master/Transistor_BJT.lib))
(library (logical mtk_power_supply)
(uri /home/marcel/Documenten/electronische_projecten/KiCad_libraries/mtk_power_supply.lib))
(library (logical mtk_processor)
(uri /home/marcel/Documenten/electronische_projecten/KiCad_libraries/mtk_processor.lib))
(library (logical mtk_rf)
(uri /home/marcel/Documenten/electronische_projecten/KiCad_libraries/mtk_rf.lib)))
(nets
(net (code 1) (name MOSI)
(node (ref U1) (pin 14))
(node (ref J1) (pin 19)))
(net (code 2) (name LORA_RST)
(node (ref J1) (pin 31))
(node (ref U1) (pin 4)))
(net (code 3) (name SCK)
(node (ref J1) (pin 23))
(node (ref U1) (pin 12)))
(net (code 4) (name NSS)
(node (ref J1) (pin 24))
(node (ref U1) (pin 15)))
(net (code 5) (name MISO)
(node (ref U1) (pin 13))
(node (ref J1) (pin 21)))
(net (code 6) (name +3V3)
(node (ref U1) (pin 3))
(node (ref J2) (pin 1))
(node (ref J1) (pin 1))
(node (ref C1) (pin 1)))
(net (code 7) (name GND)
(node (ref J2) (pin 5))
(node (ref R5) (pin 2))
(node (ref Q2) (pin 3))
(node (ref J1) (pin 20))
(node (ref J1) (pin 25))
(node (ref J1) (pin 34))
(node (ref J1) (pin 39))
(node (ref J1) (pin 6))
(node (ref J1) (pin 30))
(node (ref Q3) (pin 3))
(node (ref U1) (pin 1))
(node (ref D6) (pin 2))
(node (ref R3) (pin 2))
(node (ref U2) (pin 1))
(node (ref U3) (pin 2))
(node (ref D7) (pin 2))
(node (ref U3) (pin 3))
(node (ref U1) (pin 9))
(node (ref U1) (pin 2))
(node (ref U1) (pin 16))
(node (ref C3) (pin 2))
(node (ref C2) (pin 2))
(node (ref Q1) (pin 3))
(node (ref J1) (pin 14))
(node (ref C1) (pin 2)))
(net (code 8) (name DIO0)
(node (ref J1) (pin 29))
(node (ref U1) (pin 5)))
(net (code 9) (name +5V)
(node (ref U3) (pin 4))
(node (ref U2) (pin 4))
(node (ref U2) (pin 8))
(node (ref R6) (pin 1))
(node (ref J1) (pin 2))
(node (ref D1) (pin 1))
(node (ref J1) (pin 4))
(node (ref C2) (pin 1))
(node (ref R1) (pin 1)))
(net (code 10) (name POWER_ON_SWITCH)
(node (ref D3) (pin 2))
(node (ref D2) (pin 2))
(node (ref R8) (pin 1)))
(net (code 11) (name "Net-(D2-Pad1)")
(node (ref R4) (pin 2))
(node (ref D2) (pin 1)))
(net (code 12) (name "Net-(D6-Pad1)")
(node (ref R6) (pin 2))
(node (ref D6) (pin 1))
(node (ref Q2) (pin 1)))
(net (code 13) (name POWER_OFF)
(node (ref J1) (pin 36))
(node (ref Q3) (pin 1)))
(net (code 14) (name SCL)
(node (ref J2) (pin 3))
(node (ref J1) (pin 5)))
(net (code 15) (name SDA)
(node (ref J1) (pin 3))
(node (ref J2) (pin 2)))
(net (code 16) (name "Net-(Q2-Pad2)")
(node (ref R4) (pin 1))
(node (ref R5) (pin 1))
(node (ref Q2) (pin 2)))
(net (code 17) (name "Net-(J2-Pad4)")
(node (ref J2) (pin 4)))
(net (code 18) (name "Net-(Q1-Pad2)")
(node (ref R2) (pin 1))
(node (ref R3) (pin 1))
(node (ref Q1) (pin 2)))
(net (code 19) (name "Net-(D6-Pad3)")
(node (ref U3) (pin 5))
(node (ref D6) (pin 3))
(node (ref Q1) (pin 1))
(node (ref R7) (pin 2)))
(net (code 20) (name +12V)
(node (ref R7) (pin 1))
(node (ref U3) (pin 1))
(node (ref SW1) (pin 1)))
(net (code 21) (name "Net-(R8-Pad2)")
(node (ref SW1) (pin 2))
(node (ref R8) (pin 2))
(node (ref R9) (pin 2)))
(net (code 22) (name "Net-(D3-Pad1)")
(node (ref D3) (pin 1))
(node (ref D5) (pin 1))
(node (ref D4) (pin 1))
(node (ref R2) (pin 2)))
(net (code 23) (name POWER_ON_DELAY)
(node (ref D5) (pin 2))
(node (ref U2) (pin 3)))
(net (code 24) (name "Net-(C3-Pad1)")
(node (ref U2) (pin 2))
(node (ref D1) (pin 2))
(node (ref R1) (pin 2))
(node (ref C3) (pin 1)))
(net (code 25) (name "Net-(U1-Pad8)")
(node (ref U1) (pin 8)))
(net (code 26) (name "Net-(U1-Pad7)")
(node (ref U1) (pin 7)))
(net (code 27) (name "Net-(U1-Pad6)")
(node (ref U1) (pin 6)))
(net (code 28) (name "Net-(U1-Pad11)")
(node (ref U1) (pin 11)))
(net (code 29) (name "Net-(U1-Pad10)")
(node (ref U1) (pin 10)))
(net (code 30) (name "Net-(U2-Pad5)")
(node (ref U2) (pin 5))
(node (ref U2) (pin 6)))
(net (code 31) (name POWER_ON_RPI)
(node (ref D4) (pin 2))
(node (ref J1) (pin 40)))
(net (code 32) (name "Net-(U2-Pad7)")
(node (ref U2) (pin 7)))
(net (code 33) (name "Net-(D7-Pad1)")
(node (ref R9) (pin 1))
(node (ref D7) (pin 1))
(node (ref Q3) (pin 2)))))

@ -0,0 +1,252 @@
update=do 20 jan 2022 12:11:04 CET
version=1
last_client=kicad
[general]
version=1
RootSch=
BoardNm=
[cvpcb]
version=1
NetIExt=net
[eeschema]
version=1
LibDir=
[eeschema/libraries]
[schematic_editor]
version=1
PageLayoutDescrFile=
PlotDirectoryName=
SubpartIdSeparator=0
SubpartFirstId=65
NetFmtName=Pcbnew
SpiceAjustPassiveValues=0
LabSize=50
ERC_TestSimilarLabels=1
[pcbnew]
version=1
PageLayoutDescrFile=
LastNetListRead=winlink_server.net
CopperLayerCount=2
BoardThickness=1.6
AllowMicroVias=0
AllowBlindVias=0
RequireCourtyardDefinitions=0
ProhibitOverlappingCourtyards=1
MinTrackWidth=0.2
MinViaDiameter=0.4
MinViaDrill=0.3
MinMicroViaDiameter=0.2
MinMicroViaDrill=0.09999999999999999
MinHoleToHole=0.25
TrackWidth1=0.25
TrackWidth2=0.8
TrackWidth3=1.5
ViaDiameter1=0.8
ViaDrill1=0.4
ViaDiameter2=2
ViaDrill2=0.8
dPairWidth1=0.2
dPairGap1=0.25
dPairViaGap1=0.25
SilkLineWidth=0.12
SilkTextSizeV=1
SilkTextSizeH=1
SilkTextSizeThickness=0.15
SilkTextItalic=0
SilkTextUpright=1
CopperLineWidth=0.2
CopperTextSizeV=1.5
CopperTextSizeH=1.5
CopperTextThickness=0.3
CopperTextItalic=0
CopperTextUpright=1
EdgeCutLineWidth=0.05
CourtyardLineWidth=0.05
OthersLineWidth=0.15
OthersTextSizeV=1
OthersTextSizeH=1
OthersTextSizeThickness=0.15
OthersTextItalic=0
OthersTextUpright=1
SolderMaskClearance=0
SolderMaskMinWidth=0
SolderPasteClearance=0
SolderPasteRatio=-0
[pcbnew/Layer.F.Cu]
Name=F.Cu
Type=0
Enabled=1
[pcbnew/Layer.In1.Cu]
Name=In1.Cu
Type=0
Enabled=0
[pcbnew/Layer.In2.Cu]
Name=In2.Cu
Type=0
Enabled=0
[pcbnew/Layer.In3.Cu]
Name=In3.Cu
Type=0
Enabled=0
[pcbnew/Layer.In4.Cu]
Name=In4.Cu
Type=0
Enabled=0
[pcbnew/Layer.In5.Cu]
Name=In5.Cu
Type=0
Enabled=0
[pcbnew/Layer.In6.Cu]
Name=In6.Cu
Type=0
Enabled=0
[pcbnew/Layer.In7.Cu]
Name=In7.Cu
Type=0
Enabled=0
[pcbnew/Layer.In8.Cu]
Name=In8.Cu
Type=0
Enabled=0
[pcbnew/Layer.In9.Cu]
Name=In9.Cu
Type=0
Enabled=0
[pcbnew/Layer.In10.Cu]
Name=In10.Cu
Type=0
Enabled=0
[pcbnew/Layer.In11.Cu]
Name=In11.Cu
Type=0
Enabled=0
[pcbnew/Layer.In12.Cu]
Name=In12.Cu
Type=0
Enabled=0
[pcbnew/Layer.In13.Cu]
Name=In13.Cu
Type=0
Enabled=0
[pcbnew/Layer.In14.Cu]
Name=In14.Cu
Type=0
Enabled=0
[pcbnew/Layer.In15.Cu]
Name=In15.Cu
Type=0
Enabled=0
[pcbnew/Layer.In16.Cu]
Name=In16.Cu
Type=0
Enabled=0
[pcbnew/Layer.In17.Cu]
Name=In17.Cu
Type=0
Enabled=0
[pcbnew/Layer.In18.Cu]
Name=In18.Cu
Type=0
Enabled=0
[pcbnew/Layer.In19.Cu]
Name=In19.Cu
Type=0
Enabled=0
[pcbnew/Layer.In20.Cu]
Name=In20.Cu
Type=0
Enabled=0
[pcbnew/Layer.In21.Cu]
Name=In21.Cu
Type=0
Enabled=0
[pcbnew/Layer.In22.Cu]
Name=In22.Cu
Type=0
Enabled=0
[pcbnew/Layer.In23.Cu]
Name=In23.Cu
Type=0
Enabled=0
[pcbnew/Layer.In24.Cu]
Name=In24.Cu
Type=0
Enabled=0
[pcbnew/Layer.In25.Cu]
Name=In25.Cu
Type=0
Enabled=0
[pcbnew/Layer.In26.Cu]
Name=In26.Cu
Type=0
Enabled=0
[pcbnew/Layer.In27.Cu]
Name=In27.Cu
Type=0
Enabled=0
[pcbnew/Layer.In28.Cu]
Name=In28.Cu
Type=0
Enabled=0
[pcbnew/Layer.In29.Cu]
Name=In29.Cu
Type=0
Enabled=0
[pcbnew/Layer.In30.Cu]
Name=In30.Cu
Type=0
Enabled=0
[pcbnew/Layer.B.Cu]
Name=B.Cu
Type=0
Enabled=1
[pcbnew/Layer.B.Adhes]
Enabled=1
[pcbnew/Layer.F.Adhes]
Enabled=1
[pcbnew/Layer.B.Paste]
Enabled=1
[pcbnew/Layer.F.Paste]
Enabled=1
[pcbnew/Layer.B.SilkS]
Enabled=1
[pcbnew/Layer.F.SilkS]
Enabled=1
[pcbnew/Layer.B.Mask]
Enabled=1
[pcbnew/Layer.F.Mask]
Enabled=1
[pcbnew/Layer.Dwgs.User]
Enabled=1
[pcbnew/Layer.Cmts.User]
Enabled=1
[pcbnew/Layer.Eco1.User]
Enabled=1
[pcbnew/Layer.Eco2.User]
Enabled=1
[pcbnew/Layer.Edge.Cuts]
Enabled=1
[pcbnew/Layer.Margin]
Enabled=1
[pcbnew/Layer.B.CrtYd]
Enabled=1
[pcbnew/Layer.F.CrtYd]
Enabled=1
[pcbnew/Layer.B.Fab]
Enabled=1
[pcbnew/Layer.F.Fab]
Enabled=1
[pcbnew/Layer.Rescue]
Enabled=0
[pcbnew/Netclasses]
[pcbnew/Netclasses/Default]
Name=Default
Clearance=0.2
TrackWidth=0.25
ViaDiameter=0.8
ViaDrill=0.4
uViaDiameter=0.3
uViaDrill=0.1
dPairWidth=0.2
dPairGap=0.25
dPairViaGap=0.25

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -0,0 +1,863 @@
<?xml version="1.0" encoding="UTF-8"?>
<export version="D">
<design>
<source>/home/marcel/Documenten/electronische_projecten/winlink_server/RPi_LoRa_shield-KiCad/RPi_LoRa_shield.sch</source>
<date>ma 24 jan 2022 14:09:44 CET</date>
<tool>Eeschema 5.1.8-5.1.8</tool>
<sheet number="1" name="/" tstamps="/">
<title_block>
<title>LORA APRS shield</title>
<company>M. Konstapel</company>
<rev>1</rev>
<date>2022-01-20</date>
<source>RPi_LoRa_shield.sch</source>
<comment number="1" value="https://meezenest.nl/mees"/>
<comment number="2" value=""/>
<comment number="3" value=""/>
<comment number="4" value=""/>
</title_block>
</sheet>
</design>
<components>
<comp ref="U1">
<value>Ra-02</value>
<footprint>mtk_rf:RA-02</footprint>
<fields>
<field name="Manufacturer">Thinker</field>
<field name="Ordering #">Ra-02</field>
</fields>
<libsource lib="mtk_rf" part="Ra-02" description=""/>
<sheetpath names="/" tstamps="/"/>
<tstamp>61E5E459</tstamp>
</comp>
<comp ref="U2">
<value>NE555</value>
<footprint>Package_DIP:DIP-8_W7.62mm_LongPads</footprint>
<datasheet>http://www.ti.com/lit/ds/symlink/ne555.pdf</datasheet>
<fields>
<field name="Manufacturer">QPL</field>
<field name="Ordering #">NE555</field>
</fields>
<libsource lib="Timer" part="NE555" description="Precision Timers, DIP-8/SOIC-8"/>
<sheetpath names="/" tstamps="/"/>
<tstamp>61E60C77</tstamp>
</comp>
<comp ref="C2">
<value>100n</value>
<footprint>Capacitor_THT:C_Disc_D7.5mm_W2.5mm_P5.00mm</footprint>
<datasheet>~</datasheet>
<fields>
<field name="Manufacturer">QPL</field>
<field name="Ordering #">100n/50V</field>
</fields>
<libsource lib="Device" part="C_Small" description="Unpolarized capacitor, small symbol"/>
<sheetpath names="/" tstamps="/"/>
<tstamp>61E64022</tstamp>
</comp>
<comp ref="C3">
<value>100U</value>
<footprint>Capacitor_THT:CP_Radial_D5.0mm_P2.50mm</footprint>
<datasheet>~</datasheet>
<fields>
<field name="Manufacturer">QPL</field>
<field name="Ordering #">100U/15V</field>
</fields>
<libsource lib="Device" part="CP_Small" description="Polarized capacitor, small symbol"/>
<sheetpath names="/" tstamps="/"/>
<tstamp>61E647F7</tstamp>
</comp>
<comp ref="R1">
<value>470k</value>
<footprint>Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal</footprint>
<datasheet>~</datasheet>
<fields>
<field name="Manufacturer">QPL</field>
<field name="Ordering #">470k 1% 0.25W</field>
</fields>
<libsource lib="Device" part="R_Small" description="Resistor, small symbol"/>
<sheetpath names="/" tstamps="/"/>
<tstamp>61E6532C</tstamp>
</comp>
<comp ref="U3">
<value>DCDC_LM2596</value>
<footprint>mtk_power_supply:LM2596</footprint>
<fields>
<field name="Manufacturer">QPL</field>
<field name="Ordering #">LM2596 module</field>
</fields>
<libsource lib="mtk_power_supply" part="DCDC_LM2596" description=""/>
<sheetpath names="/" tstamps="/"/>
<tstamp>61E6B9FF</tstamp>
</comp>
<comp ref="R2">
<value>10k</value>
<footprint>Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal</footprint>
<datasheet>~</datasheet>
<fields>
<field name="Manufacturer">QPL</field>
<field name="Ordering #">10k 1% 0.25W</field>
</fields>
<libsource lib="Device" part="R_Small" description="Resistor, small symbol"/>
<sheetpath names="/" tstamps="/"/>
<tstamp>61E738A4</tstamp>
</comp>
<comp ref="D4">
<value>1N4148</value>
<footprint>Diode_THT:D_A-405_P7.62mm_Horizontal</footprint>
<datasheet>~</datasheet>
<fields>
<field name="Manufacturer">QPL</field>
<field name="Ordering #">1N4148</field>
</fields>
<libsource lib="Device" part="D_Small_ALT" description="Diode, small symbol, filled shape"/>
<sheetpath names="/" tstamps="/"/>
<tstamp>61E748F5</tstamp>
</comp>
<comp ref="D5">
<value>1N4148</value>
<footprint>Diode_THT:D_A-405_P7.62mm_Horizontal</footprint>
<datasheet>~</datasheet>
<fields>
<field name="Manufacturer">QPL</field>
<field name="Ordering #">1N4148</field>
</fields>
<libsource lib="Device" part="D_Small_ALT" description="Diode, small symbol, filled shape"/>
<sheetpath names="/" tstamps="/"/>
<tstamp>61E7510A</tstamp>
</comp>
<comp ref="D3">
<value>1N4148</value>
<footprint>Diode_THT:D_A-405_P7.62mm_Horizontal</footprint>
<datasheet>~</datasheet>
<fields>
<field name="Manufacturer">QPL</field>
<field name="Ordering #">1N4148</field>
</fields>
<libsource lib="Device" part="D_Small_ALT" description="Diode, small symbol, filled shape"/>
<sheetpath names="/" tstamps="/"/>
<tstamp>61E752C9</tstamp>
</comp>
<comp ref="R9">
<value>100k</value>
<footprint>Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal</footprint>
<datasheet>~</datasheet>
<fields>
<field name="Manufacturer">QPL</field>
<field name="Ordering #">100k 1% 0.25W</field>
</fields>
<libsource lib="Device" part="R_Small" description="Resistor, small symbol"/>
<sheetpath names="/" tstamps="/"/>
<tstamp>61E78C2C</tstamp>
</comp>
<comp ref="R8">
<value>10k</value>
<footprint>Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal</footprint>
<datasheet>~</datasheet>
<fields>
<field name="Manufacturer">QPL</field>
<field name="Ordering #">10k 1% 0.25W</field>
</fields>
<libsource lib="Device" part="R_Small" description="Resistor, small symbol"/>
<sheetpath names="/" tstamps="/"/>
<tstamp>61E7939A</tstamp>
</comp>
<comp ref="Q3">
<value>BC547C</value>
<footprint>Package_TO_SOT_THT:TO-92_Wide</footprint>
<datasheet>http://www.fairchildsemi.com/ds/BC/BC547.pdf</datasheet>
<fields>
<field name="Manufacturer">QPL</field>
<field name="Ordering #">BC547C</field>
</fields>
<libsource lib="Transistor_BJT" part="BC547" description="0.1A Ic, 45V Vce, Small Signal NPN Transistor, TO-92"/>
<sheetpath names="/" tstamps="/"/>
<tstamp>61E8E32B</tstamp>
</comp>
<comp ref="D7">
<value>1N4148</value>
<footprint>Diode_THT:D_A-405_P7.62mm_Horizontal</footprint>
<datasheet>~</datasheet>
<fields>
<field name="Manufacturer">QPL</field>
<field name="Ordering #">1N4148</field>
</fields>
<libsource lib="Device" part="D_Small_ALT" description="Diode, small symbol, filled shape"/>
<sheetpath names="/" tstamps="/"/>
<tstamp>61E8F395</tstamp>
</comp>
<comp ref="SW1">
<value>POWER_ON</value>
<footprint>Connector_PinSocket_2.54mm:PinSocket_1x02_P2.54mm_Vertical</footprint>
<datasheet>~</datasheet>
<fields>
<field name="Manufacturer">QPL</field>
<field name="Ordering #">2.54mm header 2 pin</field>
</fields>
<libsource lib="Switch" part="SW_Push" description="Push button switch, generic, two pins"/>
<sheetpath names="/" tstamps="/"/>
<tstamp>61E786D8</tstamp>
</comp>
<comp ref="D6">
<value>Dual LED</value>
<footprint>Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical</footprint>
<datasheet>~</datasheet>
<fields>
<field name="Manufacturer">QPL</field>
<field name="Ordering #">LED dual color 3 mm</field>
</fields>
<libsource lib="Device" part="LED_Dual_ACA" description="Dual LED, common cathode on pin 2"/>
<sheetpath names="/" tstamps="/"/>
<tstamp>61EA59A8</tstamp>
</comp>
<comp ref="R7">
<value>10k</value>
<footprint>Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal</footprint>
<datasheet>~</datasheet>
<fields>
<field name="Manufacturer">QPL</field>
<field name="Ordering #">10k 1% 0.25W</field>
</fields>
<libsource lib="Device" part="R_Small" description="Resistor, small symbol"/>
<sheetpath names="/" tstamps="/"/>
<tstamp>61EB5A7D</tstamp>
</comp>
<comp ref="R6">
<value>3k3</value>
<footprint>Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal</footprint>
<datasheet>~</datasheet>
<fields>
<field name="Manufacturer">QPL</field>
<field name="Ordering #">3k3 1% 0.25W</field>
</fields>
<libsource lib="Device" part="R_Small" description="Resistor, small symbol"/>
<sheetpath names="/" tstamps="/"/>
<tstamp>61EBD1AF</tstamp>
</comp>
<comp ref="R3">
<value>10k</value>
<footprint>Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal</footprint>
<datasheet>~</datasheet>
<fields>
<field name="Manufacturer">QPL</field>
<field name="Ordering #">10k 1% 0.25W</field>
</fields>
<libsource lib="Device" part="R_Small" description="Resistor, small symbol"/>
<sheetpath names="/" tstamps="/"/>
<tstamp>61ED8E9E</tstamp>
</comp>
<comp ref="Q1">
<value>BC547C</value>
<footprint>Package_TO_SOT_THT:TO-92_Wide</footprint>
<datasheet>http://www.fairchildsemi.com/ds/BC/BC547.pdf</datasheet>
<fields>
<field name="Manufacturer">QPL</field>
<field name="Ordering #">BC547C</field>
</fields>
<libsource lib="Transistor_BJT" part="BC547" description="0.1A Ic, 45V Vce, Small Signal NPN Transistor, TO-92"/>
<sheetpath names="/" tstamps="/"/>
<tstamp>61E725D2</tstamp>
</comp>
<comp ref="C1">
<value>100n</value>
<footprint>Capacitor_THT:C_Disc_D7.5mm_W2.5mm_P5.00mm</footprint>
<datasheet>~</datasheet>
<fields>
<field name="Manufacturer">QPL</field>
<field name="Ordering #">100n/50V</field>
</fields>
<libsource lib="Device" part="C_Small" description="Unpolarized capacitor, small symbol"/>
<sheetpath names="/" tstamps="/"/>
<tstamp>61F5371B</tstamp>
</comp>
<comp ref="D1">
<value>1N4148</value>
<footprint>Diode_THT:D_A-405_P7.62mm_Horizontal</footprint>
<datasheet>~</datasheet>
<fields>
<field name="Manufacturer">QPL</field>
<field name="Ordering #">1N4148</field>
</fields>
<libsource lib="Device" part="D_Small_ALT" description="Diode, small symbol, filled shape"/>
<sheetpath names="/" tstamps="/"/>
<tstamp>61E95571</tstamp>
</comp>
<comp ref="J2">
<value>IIC</value>
<footprint>Connector_PinHeader_2.54mm:PinHeader_1x05_P2.54mm_Vertical</footprint>
<datasheet>~</datasheet>
<fields>
<field name="Manufacturer">QPL</field>
<field name="Ordering #">2.54mm header 5 pin</field>
</fields>
<libsource lib="Connector" part="Conn_01x05_Male" description="Generic connector, single row, 01x05, script generated (kicad-library-utils/schlib/autogen/connector/)"/>
<sheetpath names="/" tstamps="/"/>
<tstamp>61ED9E42</tstamp>
</comp>
<comp ref="R4">
<value>10k</value>
<footprint>Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal</footprint>
<datasheet>~</datasheet>
<fields>
<field name="Manufacturer">QPL</field>
<field name="Ordering #">10k 1% 0.25W</field>
</fields>
<libsource lib="Device" part="R_Small" description="Resistor, small symbol"/>
<sheetpath names="/" tstamps="/"/>
<tstamp>61EEB42A</tstamp>
</comp>
<comp ref="R5">
<value>10k</value>
<footprint>Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal</footprint>
<datasheet>~</datasheet>
<fields>
<field name="Manufacturer">QPL</field>
<field name="Ordering #">10k 1% 0.25W</field>
</fields>
<libsource lib="Device" part="R_Small" description="Resistor, small symbol"/>
<sheetpath names="/" tstamps="/"/>
<tstamp>61EEB432</tstamp>
</comp>
<comp ref="Q2">
<value>BC547C</value>
<footprint>Package_TO_SOT_THT:TO-92_Wide</footprint>
<datasheet>http://www.fairchildsemi.com/ds/BC/BC547.pdf</datasheet>
<fields>
<field name="Manufacturer">QPL</field>
<field name="Ordering #">BC547C</field>
</fields>
<libsource lib="Transistor_BJT" part="BC547" description="0.1A Ic, 45V Vce, Small Signal NPN Transistor, TO-92"/>
<sheetpath names="/" tstamps="/"/>
<tstamp>61EEB43B</tstamp>
</comp>
<comp ref="D2">
<value>1N4148</value>
<footprint>Diode_THT:D_A-405_P7.62mm_Horizontal</footprint>
<datasheet>~</datasheet>
<fields>
<field name="Manufacturer">QPL</field>
<field name="Ordering #">1N4148</field>
</fields>
<libsource lib="Device" part="D_Small_ALT" description="Diode, small symbol, filled shape"/>
<sheetpath names="/" tstamps="/"/>
<tstamp>61F1769B</tstamp>
</comp>
<comp ref="H1">
<value>M3</value>
<footprint>MountingHole:MountingHole_3.2mm_M3_DIN965_Pad</footprint>
<datasheet>~</datasheet>
<fields>
<field name="Manufacturer">Not a placeable part</field>
<field name="Ordering #">-</field>
</fields>
<libsource lib="Mechanical" part="MountingHole" description="Mounting Hole without connection"/>
<sheetpath names="/" tstamps="/"/>
<tstamp>6200BDDD</tstamp>
</comp>
<comp ref="H2">
<value>M3</value>
<footprint>MountingHole:MountingHole_3.2mm_M3_DIN965_Pad</footprint>
<datasheet>~</datasheet>
<fields>
<field name="Manufacturer">Not a placeable part</field>
<field name="Ordering #">-</field>
</fields>
<libsource lib="Mechanical" part="MountingHole" description="Mounting Hole without connection"/>
<sheetpath names="/" tstamps="/"/>
<tstamp>6200C56C</tstamp>
</comp>
<comp ref="H3">
<value>M3</value>
<footprint>MountingHole:MountingHole_3.2mm_M3_DIN965_Pad</footprint>
<datasheet>~</datasheet>
<fields>
<field name="Manufacturer">Not a placeable part</field>
<field name="Ordering #">-</field>
</fields>
<libsource lib="Mechanical" part="MountingHole" description="Mounting Hole without connection"/>
<sheetpath names="/" tstamps="/"/>
<tstamp>6200C756</tstamp>
</comp>
<comp ref="H4">
<value>M3</value>
<footprint>MountingHole:MountingHole_3.2mm_M3_DIN965_Pad</footprint>
<datasheet>~</datasheet>
<fields>
<field name="Manufacturer">Not a placeable part</field>
<field name="Ordering #">-</field>
</fields>
<libsource lib="Mechanical" part="MountingHole" description="Mounting Hole without connection"/>
<sheetpath names="/" tstamps="/"/>
<tstamp>6200C9C8</tstamp>
</comp>
<comp ref="J1">
<value>Raspberry_Pi_for_lora_module</value>
<footprint>mtk_processor:Raspberry_Pi_Zero_for_lora_module</footprint>
<datasheet>https://www.raspberrypi.org/documentation/hardware/raspberrypi/schematics/rpi_SCH_3bplus_1p0_reduced.pdf</datasheet>
<libsource lib="mtk_processor" part="Raspberry_Pi_for_lora_module" description="expansion header for Raspberry Pi 2 &amp; 3"/>
<sheetpath names="/" tstamps="/"/>
<tstamp>620B745B</tstamp>
</comp>
</components>
<libparts>
<libpart lib="Connector" part="Conn_01x05_Male">
<description>Generic connector, single row, 01x05, script generated (kicad-library-utils/schlib/autogen/connector/)</description>
<docs>~</docs>
<footprints>
<fp>Connector*:*_1x??_*</fp>
</footprints>
<fields>
<field name="Reference">J</field>
<field name="Value">Conn_01x05_Male</field>
</fields>
<pins>
<pin num="1" name="Pin_1" type="passive"/>
<pin num="2" name="Pin_2" type="passive"/>
<pin num="3" name="Pin_3" type="passive"/>
<pin num="4" name="Pin_4" type="passive"/>
<pin num="5" name="Pin_5" type="passive"/>
</pins>
</libpart>
<libpart lib="Device" part="CP_Small">
<description>Polarized capacitor, small symbol</description>
<docs>~</docs>
<footprints>
<fp>CP_*</fp>
</footprints>
<fields>
<field name="Reference">C</field>
<field name="Value">CP_Small</field>
</fields>
<pins>
<pin num="1" name="~" type="passive"/>
<pin num="2" name="~" type="passive"/>
</pins>
</libpart>
<libpart lib="Device" part="C_Small">
<description>Unpolarized capacitor, small symbol</description>
<docs>~</docs>
<footprints>
<fp>C_*</fp>
</footprints>
<fields>
<field name="Reference">C</field>
<field name="Value">C_Small</field>
</fields>
<pins>
<pin num="1" name="~" type="passive"/>
<pin num="2" name="~" type="passive"/>
</pins>
</libpart>
<libpart lib="Device" part="D_Small_ALT">
<description>Diode, small symbol, filled shape</description>
<docs>~</docs>
<footprints>
<fp>TO-???*</fp>
<fp>*_Diode_*</fp>
<fp>*SingleDiode*</fp>
<fp>D_*</fp>
</footprints>
<fields>
<field name="Reference">D</field>
<field name="Value">D_Small_ALT</field>
</fields>
<pins>
<pin num="1" name="K" type="passive"/>
<pin num="2" name="A" type="passive"/>
</pins>
</libpart>
<libpart lib="Device" part="LED_Dual_ACA">
<description>Dual LED, common cathode on pin 2</description>
<docs>~</docs>
<footprints>
<fp>LED*</fp>
<fp>LED_SMD:*</fp>
<fp>LED_THT:*</fp>
</footprints>
<fields>
<field name="Reference">D</field>
<field name="Value">LED_Dual_ACA</field>
</fields>
<pins>
<pin num="1" name="A1" type="input"/>
<pin num="2" name="K" type="input"/>
<pin num="3" name="A2" type="input"/>
</pins>
</libpart>
<libpart lib="Device" part="R_Small">
<description>Resistor, small symbol</description>
<docs>~</docs>
<footprints>
<fp>R_*</fp>
</footprints>
<fields>
<field name="Reference">R</field>
<field name="Value">R_Small</field>
</fields>
<pins>
<pin num="1" name="~" type="passive"/>
<pin num="2" name="~" type="passive"/>
</pins>
</libpart>
<libpart lib="Mechanical" part="MountingHole">
<description>Mounting Hole without connection</description>
<docs>~</docs>
<footprints>
<fp>MountingHole*</fp>
</footprints>
<fields>
<field name="Reference">H</field>
<field name="Value">MountingHole</field>
</fields>
</libpart>
<libpart lib="Switch" part="SW_Push">
<description>Push button switch, generic, two pins</description>
<docs>~</docs>
<fields>
<field name="Reference">SW</field>
<field name="Value">SW_Push</field>
</fields>
<pins>
<pin num="1" name="1" type="passive"/>
<pin num="2" name="2" type="passive"/>
</pins>
</libpart>
<libpart lib="Timer" part="LM555">
<aliases>
<alias>ICM7555</alias>
<alias>LMC555xM</alias>
<alias>LMC555xMM</alias>
<alias>LMC555xN</alias>
<alias>MC1455</alias>
<alias>TLC555CD</alias>
<alias>TLC555CP</alias>
<alias>TLC555CPS</alias>
<alias>NA555</alias>
<alias>NE555</alias>
<alias>SE555</alias>
<alias>SA555</alias>
</aliases>
<description>Timer, DIP-8/SOIC-8/SSOP-8</description>
<docs>http://www.ti.com/lit/ds/symlink/lm555.pdf</docs>
<footprints>
<fp>SOIC*3.9x4.9mm*P1.27mm*</fp>
<fp>DIP*W7.62mm*</fp>
<fp>TSSOP*3x3mm*P0.65mm*</fp>
</footprints>
<fields>
<field name="Reference">U</field>
<field name="Value">LM555</field>
</fields>
<pins>
<pin num="1" name="GND" type="power_in"/>
<pin num="2" name="TR" type="input"/>
<pin num="3" name="Q" type="output"/>
<pin num="4" name="R" type="input"/>
<pin num="5" name="CV" type="input"/>
<pin num="6" name="THR" type="input"/>
<pin num="7" name="DIS" type="input"/>
<pin num="8" name="VCC" type="power_in"/>
</pins>
</libpart>
<libpart lib="Transistor_BJT" part="BC547">
<aliases>
<alias>BC546</alias>
<alias>BC548</alias>
<alias>BC549</alias>
<alias>BC550</alias>
<alias>BC337</alias>
<alias>BC338</alias>
</aliases>
<description>0.1A Ic, 45V Vce, Small Signal NPN Transistor, TO-92</description>
<docs>http://www.fairchildsemi.com/ds/BC/BC547.pdf</docs>
<footprints>
<fp>TO?92*</fp>
</footprints>
<fields>
<field name="Reference">Q</field>
<field name="Value">BC547</field>
<field name="Footprint">Package_TO_SOT_THT:TO-92_Inline</field>
</fields>
<pins>
<pin num="1" name="C" type="passive"/>
<pin num="2" name="B" type="input"/>
<pin num="3" name="E" type="passive"/>
</pins>
</libpart>
<libpart lib="mtk_power_supply" part="DCDC_LM2596">
<footprints>
<fp>*XP?POWER*ISU02*SMD*</fp>
</footprints>
<fields>
<field name="Reference">U</field>
<field name="Value">DCDC_LM2596</field>
<field name="Footprint">Converter_DCDC:Converter_DCDC_XP_POWER-ISU02_SMD</field>
</fields>
<pins>
<pin num="1" name="+VIN" type="power_in"/>
<pin num="2" name="-VIN" type="power_in"/>
<pin num="3" name="-VOUT" type="power_out"/>
<pin num="4" name="+VOUT" type="power_out"/>
<pin num="5" name="~ON~/OFF" type="input"/>
</pins>
</libpart>
<libpart lib="mtk_processor" part="Raspberry_Pi_for_lora_module">
<description>expansion header for Raspberry Pi 2 &amp; 3</description>
<docs>https://www.raspberrypi.org/documentation/hardware/raspberrypi/schematics/rpi_SCH_3bplus_1p0_reduced.pdf</docs>
<footprints>
<fp>PinHeader*2x20*P2.54mm*Vertical*</fp>
<fp>PinSocket*2x20*P2.54mm*Vertical*</fp>
</footprints>
<fields>
<field name="Reference">J</field>
<field name="Value">Raspberry_Pi_for_lora_module</field>
</fields>
<pins>
<pin num="1" name="3V3" type="power_in"/>
<pin num="2" name="5V" type="power_in"/>
<pin num="3" name="SDA/GPIO2" type="BiDi"/>
<pin num="4" name="5V" type="power_in"/>
<pin num="5" name="SCL/GPIO3" type="BiDi"/>
<pin num="6" name="GND" type="power_in"/>
<pin num="14" name="GND" type="power_in"/>
<pin num="19" name="MOSI0/GPIO10" type="BiDi"/>
<pin num="20" name="GND" type="power_in"/>
<pin num="21" name="MISO0/GPIO9" type="BiDi"/>
<pin num="23" name="SCLK0/GPIO11" type="BiDi"/>
<pin num="24" name="~CE0~/GPIO8" type="BiDi"/>
<pin num="25" name="GND" type="power_in"/>
<pin num="29" name="GCLK1/GPIO5" type="BiDi"/>
<pin num="30" name="GND" type="power_in"/>
<pin num="31" name="GCLK2/GPIO6" type="BiDi"/>
<pin num="34" name="GND" type="power_in"/>
<pin num="36" name="GPIO16" type="BiDi"/>
<pin num="39" name="GND" type="power_in"/>
<pin num="40" name="GPIO21/SCLK1" type="BiDi"/>
</pins>
</libpart>
<libpart lib="mtk_rf" part="Ra-02">
<fields>
<field name="Reference">U</field>
<field name="Value">Ra-02</field>
</fields>
<pins>
<pin num="1" name="GND" type="passive"/>
<pin num="2" name="GND" type="passive"/>
<pin num="3" name="3V3" type="power_in"/>
<pin num="4" name="RST" type="input"/>
<pin num="5" name="DIO0" type="BiDi"/>
<pin num="6" name="DIO1" type="BiDi"/>
<pin num="7" name="DIO2" type="BiDi"/>
<pin num="8" name="DIO3" type="BiDi"/>
<pin num="9" name="GND" type="passive"/>
<pin num="10" name="DIO4" type="BiDi"/>
<pin num="11" name="DIO5" type="BiDi"/>
<pin num="12" name="SCK" type="BiDi"/>
<pin num="13" name="MISO" type="BiDi"/>
<pin num="14" name="MOSI" type="BiDi"/>
<pin num="15" name="NSS" type="BiDi"/>
<pin num="16" name="GND" type="passive"/>
</pins>
</libpart>
</libparts>
<libraries>
<library logical="Connector">
<uri>/usr/share/kicad/library/Connector.lib</uri>
</library>
<library logical="Device">
<uri>/home/marcel/kicad_sources/kicad-symbols-master/Device.lib</uri>
</library>
<library logical="Mechanical">
<uri>/usr/share/kicad/library/Mechanical.lib</uri>
</library>
<library logical="Switch">
<uri>/usr/share/kicad/library/Switch.lib</uri>
</library>
<library logical="Timer">
<uri>/home/marcel/kicad_sources/kicad-symbols-master/Timer.lib</uri>
</library>
<library logical="Transistor_BJT">
<uri>/home/marcel/kicad_sources/kicad-symbols-master/Transistor_BJT.lib</uri>
</library>
<library logical="mtk_power_supply">
<uri>/home/marcel/Documenten/electronische_projecten/KiCad_libraries/mtk_power_supply.lib</uri>
</library>
<library logical="mtk_processor">
<uri>/home/marcel/Documenten/electronische_projecten/KiCad_libraries/mtk_processor.lib</uri>
</library>
<library logical="mtk_rf">
<uri>/home/marcel/Documenten/electronische_projecten/KiCad_libraries/mtk_rf.lib</uri>
</library>
</libraries>
<nets>
<net code="1" name="MOSI">
<node ref="U1" pin="14"/>
<node ref="J1" pin="19"/>
</net>
<net code="2" name="LORA_RST">
<node ref="J1" pin="31"/>
<node ref="U1" pin="4"/>
</net>
<net code="3" name="SCK">
<node ref="J1" pin="23"/>
<node ref="U1" pin="12"/>
</net>
<net code="4" name="NSS">
<node ref="J1" pin="24"/>
<node ref="U1" pin="15"/>
</net>
<net code="5" name="MISO">
<node ref="U1" pin="13"/>
<node ref="J1" pin="21"/>
</net>
<net code="6" name="+3V3">
<node ref="U1" pin="3"/>
<node ref="J2" pin="1"/>
<node ref="J1" pin="1"/>
<node ref="C1" pin="1"/>
</net>
<net code="7" name="GND">
<node ref="J2" pin="5"/>
<node ref="R5" pin="2"/>
<node ref="Q2" pin="3"/>
<node ref="J1" pin="20"/>
<node ref="J1" pin="25"/>
<node ref="J1" pin="34"/>
<node ref="J1" pin="39"/>
<node ref="J1" pin="6"/>
<node ref="J1" pin="30"/>
<node ref="Q3" pin="3"/>
<node ref="U1" pin="1"/>
<node ref="D6" pin="2"/>
<node ref="R3" pin="2"/>
<node ref="U2" pin="1"/>
<node ref="U3" pin="2"/>
<node ref="D7" pin="2"/>
<node ref="U3" pin="3"/>
<node ref="U1" pin="9"/>
<node ref="U1" pin="2"/>
<node ref="U1" pin="16"/>
<node ref="C3" pin="2"/>
<node ref="C2" pin="2"/>
<node ref="Q1" pin="3"/>
<node ref="J1" pin="14"/>
<node ref="C1" pin="2"/>
</net>
<net code="8" name="DIO0">
<node ref="J1" pin="29"/>
<node ref="U1" pin="5"/>
</net>
<net code="9" name="+5V">
<node ref="U3" pin="4"/>
<node ref="U2" pin="4"/>
<node ref="U2" pin="8"/>
<node ref="R6" pin="1"/>
<node ref="J1" pin="2"/>
<node ref="D1" pin="1"/>
<node ref="J1" pin="4"/>
<node ref="C2" pin="1"/>
<node ref="R1" pin="1"/>
</net>
<net code="10" name="POWER_ON_SWITCH">
<node ref="D3" pin="2"/>
<node ref="D2" pin="2"/>
<node ref="R8" pin="1"/>
</net>
<net code="11" name="Net-(D2-Pad1)">
<node ref="R4" pin="2"/>
<node ref="D2" pin="1"/>
</net>
<net code="12" name="Net-(D6-Pad1)">
<node ref="R6" pin="2"/>
<node ref="D6" pin="1"/>
<node ref="Q2" pin="1"/>
</net>
<net code="13" name="POWER_OFF">
<node ref="J1" pin="36"/>
<node ref="Q3" pin="1"/>
</net>
<net code="14" name="SCL">
<node ref="J2" pin="3"/>
<node ref="J1" pin="5"/>
</net>
<net code="15" name="SDA">
<node ref="J1" pin="3"/>
<node ref="J2" pin="2"/>
</net>
<net code="16" name="Net-(Q2-Pad2)">
<node ref="R4" pin="1"/>
<node ref="R5" pin="1"/>
<node ref="Q2" pin="2"/>
</net>
<net code="17" name="Net-(J2-Pad4)">
<node ref="J2" pin="4"/>
</net>
<net code="18" name="Net-(Q1-Pad2)">
<node ref="R2" pin="1"/>
<node ref="R3" pin="1"/>
<node ref="Q1" pin="2"/>
</net>
<net code="19" name="Net-(D6-Pad3)">
<node ref="U3" pin="5"/>
<node ref="D6" pin="3"/>
<node ref="Q1" pin="1"/>
<node ref="R7" pin="2"/>
</net>
<net code="20" name="+12V">
<node ref="R7" pin="1"/>
<node ref="U3" pin="1"/>
<node ref="SW1" pin="1"/>
</net>
<net code="21" name="Net-(R8-Pad2)">
<node ref="SW1" pin="2"/>
<node ref="R8" pin="2"/>
<node ref="R9" pin="2"/>
</net>
<net code="22" name="Net-(D3-Pad1)">
<node ref="D3" pin="1"/>
<node ref="D5" pin="1"/>
<node ref="D4" pin="1"/>
<node ref="R2" pin="2"/>
</net>
<net code="23" name="POWER_ON_DELAY">
<node ref="D5" pin="2"/>
<node ref="U2" pin="3"/>
</net>
<net code="24" name="Net-(C3-Pad1)">
<node ref="U2" pin="2"/>
<node ref="D1" pin="2"/>
<node ref="R1" pin="2"/>
<node ref="C3" pin="1"/>
</net>
<net code="25" name="Net-(U1-Pad8)">
<node ref="U1" pin="8"/>
</net>
<net code="26" name="Net-(U1-Pad7)">
<node ref="U1" pin="7"/>
</net>
<net code="27" name="Net-(U1-Pad6)">
<node ref="U1" pin="6"/>
</net>
<net code="28" name="Net-(U1-Pad11)">
<node ref="U1" pin="11"/>
</net>
<net code="29" name="Net-(U1-Pad10)">
<node ref="U1" pin="10"/>
</net>
<net code="30" name="Net-(U2-Pad5)">
<node ref="U2" pin="5"/>
<node ref="U2" pin="6"/>
</net>
<net code="31" name="POWER_ON_RPI">
<node ref="D4" pin="2"/>
<node ref="J1" pin="40"/>
</net>
<net code="32" name="Net-(U2-Pad7)">
<node ref="U2" pin="7"/>
</net>
<net code="33" name="Net-(D7-Pad1)">
<node ref="R9" pin="1"/>
<node ref="D7" pin="1"/>
<node ref="Q3" pin="2"/>
</net>
</nets>
</export>

Binary file not shown.

After

Width:  |  Height:  |  Size: 509 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 518 KiB

@ -0,0 +1,675 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
{one line to give the program's name and a brief idea of what it does.}
Copyright (C) {year} {name of author}
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
{project} Copyright (C) {year} {fullname}
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

@ -0,0 +1,378 @@
# AVR Sample makefile written by Eric B. Weddington, Jörg Wunsch, et al.
# Modified (bringing often-changed options to the top) by Elliot Williams
# make all = Make software and program
# make clean = Clean out built project files.
# make program = Download the hex file to the device, using avrdude. Please
# customize the avrdude settings below first!
# Microcontroller Type
#MCU = atmega1284p
#MCU = atmega644p
MCU = atmega328p
# Target file name (without extension).
TARGET = images/MicroModemGP
# Programming hardware: type avrdude -c ?
# to get a full listing.
AVRDUDE_PROGRAMMER = arduino
AVRDUDE_PORT = /dev/usb # not really needed for usb
#AVRDUDE_PORT = /dev/parport0 # linux
# AVRDUDE_PORT = lpt1 # windows
############# Don't need to change below here for most purposes (Elliot)
# Optimization level, can be [0, 1, 2, 3, s]. 0 turns off optimization.
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
OPT = s
# Output format. (can be srec, ihex, binary)
FORMAT = ihex
# List C source files here. (C dependencies are automatically generated.)
#SRC = $(TARGET).c
SRC = main.c hardware/Serial.c hardware/AFSK.c util/CRC-CCIT.c protocol/LLP.c protocol/KISS.c
# If there is more than one source file, append them above, or modify and
# uncomment the following:
#SRC += foo.c bar.c
# You can also wrap lines by appending a backslash to the end of the line:
#SRC += baz.c \
#xyzzy.c
# List Assembler source files here.
# Make them always end in a capital .S. Files ending in a lowercase .s
# will not be considered source files but generated files (assembler
# output from the compiler), and will be deleted upon "make clean"!
# Even though the DOS/Win* filesystem matches both .s and .S the same,
# it will preserve the spelling of the filenames, and gcc itself does
# care about how the name is spelled on its command-line.
ASRC =
# List any extra directories to look for include files here.
# Each directory must be seperated by a space.
EXTRAINCDIRS =
# Optional compiler flags.
# -g: generate debugging information (for GDB, or for COFF conversion)
# -O*: optimization level
# -f...: tuning, see gcc manual and avr-libc documentation
# -Wall...: warning level
# -Wa,...: tell GCC to pass this to the assembler.
# -ahlms: create assembler listing
CFLAGS = -g -O$(OPT) \
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \
-Wall -Wstrict-prototypes \
-Wa,-adhlns=$(<:.c=.lst) \
$(patsubst %,-I%,$(EXTRAINCDIRS))
# Set a "language standard" compiler flag.
# Unremark just one line below to set the language standard to use.
# gnu99 = C99 + GNU extensions. See GCC manual for more information.
#CFLAGS += -std=c89
#CFLAGS += -std=gnu89
#CFLAGS += -std=c99
CFLAGS += -std=gnu99
# Optional assembler flags.
# -Wa,...: tell GCC to pass this to the assembler.
# -ahlms: create listing
# -gstabs: have the assembler create line number information; note that
# for use in COFF files, additional information about filenames
# and function names needs to be present in the assembler source
# files -- see avr-libc docs [FIXME: not yet described there]
ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
# Optional linker flags.
# -Wl,...: tell GCC to pass this to linker.
# -Map: create map file
# --cref: add cross reference to map file
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
# Additional libraries
# Minimalistic printf version
#LDFLAGS += -Wl,-u,vfprintf -lprintf_min
# Floating point printf version (requires -lm below)
#LDFLAGS += -Wl,-u,vfprintf -lprintf_flt
# -lm = math library
LDFLAGS += -lm
# Programming support using avrdude. Settings and variables.
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
# Uncomment the following if you want avrdude's erase cycle counter.
# Note that this counter needs to be initialized first using -Yn,
# see avrdude manual.
#AVRDUDE_ERASE += -y
# Uncomment the following if you do /not/ wish a verification to be
# performed after programming the device.
#AVRDUDE_FLAGS += -V
# Increase verbosity level. Please use this when submitting bug
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
# to submit bug reports.
#AVRDUDE_FLAGS += -v -v
#Run while cable attached or don't
AVRDUDE_FLAGS += -E reset #keep chip disabled while cable attached
#AVRDUDE_FLAGS += -E noreset
#AVRDUDE_WRITE_FLASH = -U lfuse:w:0x04:m #run with 8 Mhz clock
#AVRDUDE_WRITE_FLASH = -U lfuse:w:0x21:m #run with 1 Mhz clock #default clock mode
#AVRDUDE_WRITE_FLASH = -U lfuse:w:0x01:m #run with 1 Mhz clock no start up time
# ---------------------------------------------------------------------------
# Define programs and commands.
SHELL = sh
CC = avr-gcc
OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump
SIZE = avr-size
# Programming support using avrdude.
AVRDUDE = avrdude
REMOVE = rm -f
COPY = cp
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
ELFSIZE = $(SIZE) --mcu=$(MCU) -C $(TARGET).elf
# Define Messages
# English
MSG_ERRORS_NONE = Firmware compiled successfully!
MSG_BEGIN = Starting build...
MSG_END = -------- Done --------
MSG_SIZE_BEFORE = Size before:
MSG_SIZE_AFTER = Size after:
MSG_COFF = Converting to AVR COFF:
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
MSG_FLASH = Creating load file for Flash:
MSG_EEPROM = Creating load file for EEPROM:
MSG_EXTENDED_LISTING = Creating Extended Listing:
MSG_SYMBOL_TABLE = Creating Symbol Table:
MSG_LINKING = Linking:
MSG_COMPILING = Compiling:
MSG_ASSEMBLING = Assembling:
MSG_CLEANING = Cleaning project:
# Define all object files.
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o)
# Define all listing files.
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst)
# Combine all necessary flags and optional flags.
# Add target processor to flags.
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS)
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
# Default target: make program!
#all: begin gccversion sizebefore $(TARGET).elf $(TARGET).hex $(TARGET).eep \
# $(TARGET).lss $(TARGET).sym sizeafter finished end
all: begin $(TARGET).elf $(TARGET).hex $(TARGET).eep \
$(TARGET).lss $(TARGET).sym cleanup sizeafter finished
# $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
# Eye candy.
# AVR Studio 3.x does not check make's exit code but relies on
# the following magic strings to be generated by the compile job.
begin:
@echo
@echo $(MSG_BEGIN)
finished:
@echo $(MSG_ERRORS_NONE)
end:
@echo $(MSG_END)
@echo
# Display size of file.
sizebefore:
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi
sizeafter:
@if [ -f $(TARGET).elf ]; then echo; $(ELFSIZE); echo; fi
# Display compiler version information.
gccversion :
@$(CC) --version
# Convert ELF to COFF for use in debugging / simulating in
# AVR Studio or VMLAB.
COFFCONVERT=$(OBJCOPY) --debugging \
--change-section-address .data-0x800000 \
--change-section-address .bss-0x800000 \
--change-section-address .noinit-0x800000 \
--change-section-address .eeprom-0x810000
coff: $(TARGET).elf
# @echo
# @echo $(MSG_COFF) $(TARGET).cof
@$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
extcoff: $(TARGET).elf
# @echo
# @echo $(MSG_EXTENDED_COFF) $(TARGET).cof
@$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
# Program the device.
program: $(TARGET).hex $(TARGET).eep
@$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
# Create final output files (.hex, .eep) from ELF output file.
%.hex: %.elf
# @echo
# @echo $(MSG_FLASH) $@
@$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
%.eep: %.elf
# @echo
# @echo $(MSG_EEPROM) $@
# @echo Not generating any EEPROM images
@-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O $(FORMAT) $< $@
# Create extended listing file from ELF output file.
%.lss: %.elf
# @echo
# @echo $(MSG_EXTENDED_LISTING) $@
@$(OBJDUMP) -h -S $< > $@
# Create a symbol table from ELF output file.
%.sym: %.elf
# @echo
# @echo $(MSG_SYMBOL_TABLE) $@
@avr-nm -n $< > $@
# Link: create ELF output file from object files.
.SECONDARY : $(TARGET).elf
.PRECIOUS : $(OBJ)
%.elf: $(OBJ)
@echo $(MSG_LINKING) $@
@$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS)
# Compile: create object files from C source files.
%.o : %.c
@echo $(MSG_COMPILING) $<
@$(CC) -c $(ALL_CFLAGS) $< -o $@
# Compile: create assembler files from C source files.
%.s : %.c
@$(CC) -S $(ALL_CFLAGS) $< -o $@
# Assemble: create object files from assembler source files.
%.o : %.S
@echo
@echo $(MSG_ASSEMBLING) $<
@$(CC) -c $(ALL_ASFLAGS) $< -o $@
# Target: clean project.
clean: clean_list finished
clean_list :
@echo
@echo $(MSG_CLEANING)
$(REMOVE) $(TARGET).hex
$(REMOVE) $(TARGET).eep
$(REMOVE) $(TARGET).obj
$(REMOVE) $(TARGET).cof
$(REMOVE) $(TARGET).elf
$(REMOVE) $(TARGET).map
$(REMOVE) $(TARGET).obj
$(REMOVE) $(TARGET).a90
$(REMOVE) $(TARGET).sym
$(REMOVE) $(TARGET).lnk
$(REMOVE) $(TARGET).lss
$(REMOVE) $(OBJ)
$(REMOVE) $(LST)
$(REMOVE) $(SRC:.c=.s)
$(REMOVE) $(SRC:.c=.d)
$(REMOVE) *~
cleanup:
@$(REMOVE) $(SRC:.c=.s)
@$(REMOVE) $(SRC:.c=.d)
@$(REMOVE) $(LST)
# Automatically generate C source code dependencies.
# (Code originally taken from the GNU make user manual and modified
# (See README.txt Credits).)
#
# Note that this will work with sh (bash) and sed that is shipped with WinAVR
# (see the SHELL variable defined above).
# This may not work with other shells or other seds.
#
%.d: %.c
@set -e; $(CC) -MM $(ALL_CFLAGS) $< \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > $@; \
[ -s $@ ] || rm -f $@
# Remove the '-' if you want to see the dependency files generated.
-include $(SRC:.c=.d)
# Listing of phony targets.
.PHONY : all begin finish end sizebefore sizeafter gccversion coff extcoff \
clean clean_list program

@ -0,0 +1,39 @@
MicroModemGP
==========
MicroModemGP is a general purpose firmware for [MicroModem](http://unsigned.io/micromodem).
It supports both KISS mode serial connections, and direct serial connection without framing for easy communication with anything with a serial port.
You can buy a complete modem from [my shop](http://unsigned.io/shop), or you can build one yourself pretty easily. Take a look at the documentation in the [MicroModem](https://github.com/markqvist/MicroModem) repository for information and getting started guides!
## Some features
- Easily send and receive packets over mostly any radio
- Full modulation and demodulation in software
- Flexibility in how received packets are output over serial connection
- Can run with open squelch
- Supports KISS mode for use with programs on a host computer
- 12,8 Hamming-code forward error correction and 12-byte interleaving
- CRC checksum on packets ensure data integrity
- Supports packets with up to 564 bytes of data
## Serial connection settings
By default, the modem uses __9600 baud, 8N1__ serial. The baudrate can be modified in the "device.h" file.
## KISS mode or direct serial framing
You can configure whether to use KISS serial framing or direct serial framing in the "config.h" file.
When the modem is running in KISS mode, there's really not much more to it than connecting the modem to a computer, opening whatever program you want to use with it, and off you go.
You can also configure the modem in direct serial framing mode. If using direct serial framing, the firmware uses time-sensitive input, which means that it will buffer serial data as it comes in, and when it has received no data for a few milliseconds, it will start sending whatever it has received.
If you're manually typing things to the modem from a terminal, you should therefore set your serial terminal program to not send data for every keystroke, but only on new-line, or pressing send or whatever. You can also compile the firmware for KISS mode serial connection, if you have a host program using KISS. If you are using MicroModemGP with [Reticulum](https://github.com/markqvist/Reticulum), use KISS.
## Other notes
The project has been implemented in your normal C with makefile style, and uses AVR Libc. The firmware is compatible with Arduino-based products, although it was not written in the Arduino IDE.
Visit [my site](http://unsigned.io) for questions, comments and other details.

@ -0,0 +1,9 @@
#ifndef CONFIG_H
#define CONFIG_H
// Choose whether to use KISS or direct
// framing for serial data
#define SERIAL_FRAMING SERIAL_FRAMING_KISS
//#define SERIAL_FRAMING SERIAL_FRAMING_DIRECT
#endif

@ -0,0 +1,40 @@
#include "util/constants.h"
#ifndef DEVICE_CONFIGURATION
#define DEVICE_CONFIGURATION
// CPU settings
#define TARGET_CPU m328p
#define F_CPU 16000000
#define FREQUENCY_CORRECTION 0
// ADC settings
#define OPEN_SQUELCH true
#define ADC_REFERENCE REF_3V3
// OR
//#define ADC_REFERENCE REF_5V
// Sampling & timer setup
#define CONFIG_AFSK_DAC_SAMPLERATE 9600
// Don't change this! Change it in
// config.h instead. This is going away
// soon, and only an intermediary thing.
#define SERIAL_PROTOCOL PROTOCOL_KISS
// Serial settings
#define BAUD 9600
#define SERIAL_DEBUG false
#define TX_MAXWAIT 5UL
// Port settings
#if TARGET_CPU == m328p
#define DAC_PORT PORTD
#define DAC_DDR DDRD
#define LED_PORT PORTB
#define LED_DDR DDRB
#define ADC_PORT PORTC
#define ADC_DDR DDRC
#endif
#endif

@ -0,0 +1,2 @@
#!/bin/bash
avrdude -p $2 -c arduino -P /dev/tty$1 -b 115200 -F -U flash:w:images/MicroModemGP.hex

@ -0,0 +1,546 @@
#include <string.h>
#include "AFSK.h"
#include "util/time.h"
extern volatile ticks_t _clock;
extern unsigned long custom_preamble;
extern unsigned long custom_tail;
bool hw_afsk_dac_isr = false;
bool hw_5v_ref = false;
Afsk *AFSK_modem;
// Forward declerations
int afsk_getchar(FILE *strem);
int afsk_putchar(char c, FILE *stream);
void AFSK_hw_refDetect(void) {
// This is manual for now
#if ADC_REFERENCE == REF_5V
hw_5v_ref = true;
#else
hw_5v_ref = false;
#endif
}
void AFSK_hw_init(void) {
// Set up ADC
AFSK_hw_refDetect();
TCCR1A = 0;
TCCR1B = _BV(CS10) | _BV(WGM13) | _BV(WGM12);
ICR1 = (((CPU_FREQ+FREQUENCY_CORRECTION)) / 9600) - 1;
if (hw_5v_ref) {
ADMUX = _BV(REFS0) | 0;
} else {
ADMUX = 0;
}
ADC_DDR &= ~_BV(0);
ADC_PORT &= ~_BV(0);
DIDR0 |= _BV(0);
ADCSRB = _BV(ADTS2) |
_BV(ADTS1) |
_BV(ADTS0);
ADCSRA = _BV(ADEN) |
_BV(ADSC) |
_BV(ADATE)|
_BV(ADIE) |
_BV(ADPS2);
AFSK_DAC_INIT();
LED_TX_INIT();
LED_RX_INIT();
}
void AFSK_init(Afsk *afsk) {
// Allocate modem struct memory
memset(afsk, 0, sizeof(*afsk));
AFSK_modem = afsk;
// Set phase increment
afsk->phaseInc = MARK_INC;
afsk->silentSamples = 0;
// Initialise FIFO buffers
fifo_init(&afsk->delayFifo, (uint8_t *)afsk->delayBuf, sizeof(afsk->delayBuf));
fifo_init(&afsk->rxFifo, afsk->rxBuf, sizeof(afsk->rxBuf));
fifo_init(&afsk->txFifo, afsk->txBuf, sizeof(afsk->txBuf));
// Fill delay FIFO with zeroes
for (int i = 0; i<SAMPLESPERBIT / 2; i++) {
fifo_push(&afsk->delayFifo, 0);
}
AFSK_hw_init();
// Set up streams
FILE afsk_fd = FDEV_SETUP_STREAM(afsk_putchar, afsk_getchar, _FDEV_SETUP_RW);
afsk->fd = afsk_fd;
}
static void AFSK_txStart(Afsk *afsk) {
if (!afsk->sending) {
afsk->phaseInc = MARK_INC;
afsk->phaseAcc = 0;
afsk->bitstuffCount = 0;
afsk->sending = true;
afsk->sending_data = true;
LED_TX_ON();
afsk->preambleLength = DIV_ROUND(custom_preamble * BITRATE, 8000);
AFSK_DAC_IRQ_START();
}
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
afsk->tailLength = DIV_ROUND(custom_tail * BITRATE, 8000);
}
}
int afsk_putchar(char c, FILE *stream) {
AFSK_txStart(AFSK_modem);
while(fifo_isfull_locked(&AFSK_modem->txFifo)) { /* Wait */ }
fifo_push_locked(&AFSK_modem->txFifo, c);
return 1;
}
int afsk_getchar(FILE *stream) {
if (fifo_isempty_locked(&AFSK_modem->rxFifo)) {
return EOF;
} else {
return fifo_pop_locked(&AFSK_modem->rxFifo);
}
}
void AFSK_transmit(char *buffer, size_t size) {
fifo_flush(&AFSK_modem->txFifo);
int i = 0;
while (size--) {
afsk_putchar(buffer[i++], NULL);
}
}
uint8_t AFSK_dac_isr(Afsk *afsk) {
if (afsk->sampleIndex == 0) {
if (afsk->txBit == 0) {
if (fifo_isempty(&afsk->txFifo) && afsk->tailLength == 0) {
AFSK_DAC_IRQ_STOP();
afsk->sending = false;
afsk->sending_data = false;
LED_TX_OFF();
return 0;
} else {
if (!afsk->bitStuff) afsk->bitstuffCount = 0;
afsk->bitStuff = true;
if (afsk->preambleLength == 0) {
if (fifo_isempty(&afsk->txFifo)) {
afsk->sending_data = false;
afsk->tailLength--;
afsk->currentOutputByte = HDLC_FLAG;
} else {
afsk->currentOutputByte = fifo_pop(&afsk->txFifo);
}
} else {
afsk->preambleLength--;
afsk->currentOutputByte = HDLC_FLAG;
}
if (afsk->currentOutputByte == LLP_ESC) {
if (fifo_isempty(&afsk->txFifo)) {
AFSK_DAC_IRQ_STOP();
afsk->sending = false;
LED_TX_OFF();
return 0;
} else {
afsk->currentOutputByte = fifo_pop(&afsk->txFifo);
}
} else if (afsk->currentOutputByte == HDLC_FLAG || afsk->currentOutputByte == HDLC_RESET) {
afsk->bitStuff = false;
}
}
afsk->txBit = 0x01;
}
if (afsk->bitStuff && afsk->bitstuffCount >= BIT_STUFF_LEN) {
afsk->bitstuffCount = 0;
afsk->phaseInc = SWITCH_TONE(afsk->phaseInc);
} else {
if (afsk->currentOutputByte & afsk->txBit) {
afsk->bitstuffCount++;
} else {
afsk->bitstuffCount = 0;
afsk->phaseInc = SWITCH_TONE(afsk->phaseInc);
}
afsk->txBit <<= 1;
}
afsk->sampleIndex = SAMPLESPERBIT;
}
afsk->phaseAcc += afsk->phaseInc;
afsk->phaseAcc %= SIN_LEN;
afsk->sampleIndex--;
return sinSample(afsk->phaseAcc);
}
static bool hdlcParse(Hdlc *hdlc, bool bit, FIFOBuffer *fifo) {
// Initialise a return value. We start with the
// assumption that all is going to end well :)
bool ret = true;
// Bitshift our byte of demodulated bits to
// the left by one bit, to make room for the
// next incoming bit
hdlc->demodulatedBits <<= 1;
// And then put the newest bit from the
// demodulator into the byte.
hdlc->demodulatedBits |= bit ? 1 : 0;
// Now we'll look at the last 8 received bits, and
// check if we have received a HDLC flag (01111110)
if (hdlc->demodulatedBits == HDLC_FLAG) {
// If we have, check that our output buffer is
// not full.
if (!fifo_isfull(fifo)) {
// If it isn't, we'll push the HDLC_FLAG into
// the buffer and indicate that we are now
// receiving data. For bling we also turn
// on the RX LED.
fifo_push(fifo, HDLC_FLAG);
hdlc->receiving = true;
if (hdlc->dcd_count < DCD_MIN_COUNT) {
hdlc->dcd = false;
hdlc->dcd_count++;
} else {
hdlc->dcd = true;
}
#if OPEN_SQUELCH == false
LED_RX_ON();
#endif
} else {
// If the buffer is full, we have a problem
// and abort by setting the return value to
// false and stopping the here.
ret = false;
hdlc->receiving = false;
hdlc->dcd = false;
hdlc->dcd_count = 0;
}
// Everytime we receive a HDLC_FLAG, we reset the
// storage for our current incoming byte and bit
// position in that byte. This effectively
// synchronises our parsing to the start and end
// of the received bytes.
hdlc->currentByte = 0;
hdlc->bitIndex = 0;
return ret;
}
// Check if we have received a RESET flag (01111111)
// In this comparison we also detect when no transmission
// (or silence) is taking place, and the demodulator
// returns an endless stream of zeroes. Due to the NRZ-S
// coding, the actual bits send to this function will
// be an endless stream of ones, which this AND operation
// will also detect.
if ((hdlc->demodulatedBits & HDLC_RESET) == HDLC_RESET) {
// If we have, something probably went wrong at the
// transmitting end, and we abort the reception.
hdlc->receiving = false;
hdlc->dcd = false;
hdlc->dcd_count = 0;
return ret;
}
// Check the DCD status and set RX LED appropriately
if (hdlc->dcd) {
LED_RX_ON();
} else {
LED_RX_OFF();
}
// If we have not yet seen a HDLC_FLAG indicating that
// a transmission is actually taking place, don't bother
// with anything.
if (!hdlc->receiving) {
hdlc->dcd = false;
hdlc->dcd_count = 0;
return ret;
}
// First check if what we are seeing is a stuffed bit.
// Since the different HDLC control characters like
// HDLC_FLAG, HDLC_RESET and such could also occur in
// a normal data stream, we employ a method known as
// "bit stuffing". All control characters have more than
// 5 ones in a row, so if the transmitting party detects
// this sequence in the _data_ to be transmitted, it inserts
// a zero to avoid the receiving party interpreting it as
// a control character. Therefore, if we detect such a
// "stuffed bit", we simply ignore it and wait for the
// next bit to come in.
//
// We do the detection by applying an AND bit-mask to the
// stream of demodulated bits. This mask is 00111111 (0x3f)
// if the result of the operation is 00111110 (0x3e), we
// have detected a stuffed bit.
if ((hdlc->demodulatedBits & 0x3f) == 0x3e)
return ret;
// If we have an actual 1 bit, push this to the current byte
// If it's a zero, we don't need to do anything, since the
// bit is initialized to zero when we bitshifted earlier.
if (hdlc->demodulatedBits & 0x01)
hdlc->currentByte |= 0x80;
// Increment the bitIndex and check if we have a complete byte
if (++hdlc->bitIndex >= 8) {
// If we have a HDLC control character, put a AX.25 escape
// in the received data. We know we need to do this,
// because at this point we must have already seen a HDLC
// flag, meaning that this control character is the result
// of a bitstuffed byte that is equal to said control
// character, but is actually part of the data stream.
// By inserting the escape character, we tell the protocol
// layer that this is not an actual control character, but
// data.
if ((hdlc->currentByte == HDLC_FLAG ||
hdlc->currentByte == HDLC_RESET ||
hdlc->currentByte == LLP_ESC)) {
// We also need to check that our received data buffer
// is not full before putting more data in
if (!fifo_isfull(fifo)) {
fifo_push(fifo, LLP_ESC);
} else {
// If it is, abort and return false
hdlc->receiving = false;
hdlc->dcd = false;
hdlc->dcd_count = 0;
LED_RX_OFF();
ret = false;
}
}
// Push the actual byte to the received data FIFO,
// if it isn't full.
if (!fifo_isfull(fifo)) {
fifo_push(fifo, hdlc->currentByte);
} else {
// If it is, well, you know by now!
hdlc->receiving = false;
hdlc->dcd = false;
hdlc->dcd_count = 0;
LED_RX_OFF();
ret = false;
}
// Wipe received byte and reset bit index to 0
hdlc->currentByte = 0;
hdlc->bitIndex = 0;
} else {
// We don't have a full byte yet, bitshift the byte
// to make room for the next bit
hdlc->currentByte >>= 1;
}
return ret;
}
void AFSK_adc_isr(Afsk *afsk, int8_t currentSample) {
// To determine the received frequency, and thereby
// the bit of the sample, we multiply the sample by
// a sample delayed by (samples per bit / 2).
// We then lowpass-filter the samples with a
// Chebyshev filter. The lowpass filtering serves
// to "smooth out" the variations in the samples.
afsk->iirX[0] = afsk->iirX[1];
#if FILTER_CUTOFF == 600
afsk->iirX[1] = ((int8_t)fifo_pop(&afsk->delayFifo) * currentSample) >> 2;
// The above is a simplification of:
// afsk->iirX[1] = ((int8_t)fifo_pop(&afsk->delayFifo) * currentSample) / 3.558147322;
#elif FILTER_CUTOFF == 800
afsk->iirX[1] = ((int8_t)fifo_pop(&afsk->delayFifo) * currentSample) >> 2;
// The above is a simplification of:
// afsk->iirX[1] = ((int8_t)fifo_pop(&afsk->delayFifo) * currentSample) / 2.899043379;
#elif FILTER_CUTOFF == 1200
afsk->iirX[1] = ((int8_t)fifo_pop(&afsk->delayFifo) * currentSample) >> 1;
// The above is a simplification of:
// afsk->iirX[1] = ((int8_t)fifo_pop(&afsk->delayFifo) * currentSample) / 2.228465666;
#elif FILTER_CUTOFF == 1600
afsk->iirX[1] = ((int8_t)fifo_pop(&afsk->delayFifo) * currentSample) >> 1;
// The above is a simplification of:
// afsk->iirX[1] = ((int8_t)fifo_pop(&afsk->delayFifo) * currentSample) / 1.881349100;
#else
#error Unsupported filter cutoff!
#endif
afsk->iirY[0] = afsk->iirY[1];
#if FILTER_CUTOFF == 600
afsk->iirY[1] = afsk->iirX[0] + afsk->iirX[1] + (afsk->iirY[0] >> 1);
// The above is a simplification of a first-order 600Hz chebyshev filter:
// afsk->iirY[1] = afsk->iirX[0] + afsk->iirX[1] + (afsk->iirY[0] * 0.4379097269);
#elif FILTER_CUTOFF == 800
afsk->iirY[1] = afsk->iirX[0] + afsk->iirX[1] + (afsk->iirY[0] / 3);
// The above is a simplification of a first-order 800Hz chebyshev filter:
// afsk->iirY[1] = afsk->iirX[0] + afsk->iirX[1] + (afsk->iirY[0] * 0.3101172565);
#elif FILTER_CUTOFF == 1200
afsk->iirY[1] = afsk->iirX[0] + afsk->iirX[1] + (afsk->iirY[0] / 10);
// The above is a simplification of a first-order 1200Hz chebyshev filter:
// afsk->iirY[1] = afsk->iirX[0] + afsk->iirX[1] + (afsk->iirY[0] * 0.1025215106);
#elif FILTER_CUTOFF == 1600
afsk->iirY[1] = afsk->iirX[0] + afsk->iirX[1] + -1*(afsk->iirY[0] / 17);
// The above is a simplification of a first-order 1600Hz chebyshev filter:
// afsk->iirY[1] = afsk->iirX[0] + afsk->iirX[1] + (afsk->iirY[0] * -0.0630669239);
#else
#error Unsupported filter cutoff!
#endif
// We put the sampled bit in a delay-line:
// First we bitshift everything 1 left
afsk->sampledBits <<= 1;
// And then add the sampled bit to our delay line
afsk->sampledBits |= (afsk->iirY[1] > 0) ? 0 : 1;
// Put the current raw sample in the delay FIFO
fifo_push(&afsk->delayFifo, currentSample);
// We need to check whether there is a signal transition.
// If there is, we can recalibrate the phase of our
// sampler to stay in sync with the transmitter. A bit of
// explanation is required to understand how this works.
// Since we have PHASE_MAX/PHASE_BITS = 8 samples per bit,
// we employ a phase counter (currentPhase), that increments
// by PHASE_BITS everytime a sample is captured. When this
// counter reaches PHASE_MAX, it wraps around by modulus
// PHASE_MAX. We then look at the last three samples we
// captured and determine if the bit was a one or a zero.
//
// This gives us a "window" looking into the stream of
// samples coming from the ADC. Sort of like this:
//
// Past Future
// 0000000011111111000000001111111100000000
// |________|
// ||
// Window
//
// Every time we detect a signal transition, we adjust
// where this window is positioned a little. How much we
// adjust it is defined by PHASE_INC. If our current phase
// phase counter value is less than half of PHASE_MAX (ie,
// the window size) when a signal transition is detected,
// add PHASE_INC to our phase counter, effectively moving
// the window a little bit backward (to the left in the
// illustration), inversely, if the phase counter is greater
// than half of PHASE_MAX, we move it forward a little.
// This way, our "window" is constantly seeking to position
// it's center at the bit transitions. Thus, we synchronise
// our timing to the transmitter, even if it's timing is
// a little off compared to our own.
if (SIGNAL_TRANSITIONED(afsk->sampledBits)) {
if (afsk->currentPhase < PHASE_THRESHOLD) {
afsk->currentPhase += PHASE_INC;
} else {
afsk->currentPhase -= PHASE_INC;
}
afsk->silentSamples = 0;
} else {
afsk->silentSamples++;
}
// We increment our phase counter
afsk->currentPhase += PHASE_BITS;
// Check if we have reached the end of
// our sampling window.
if (afsk->currentPhase >= PHASE_MAX) {
// If we have, wrap around our phase
// counter by modulus
afsk->currentPhase %= PHASE_MAX;
// Bitshift to make room for the next
// bit in our stream of demodulated bits
afsk->actualBits <<= 1;
// We determine the actual bit value by reading
// the last 3 sampled bits. If there is two or
// more 1's, we will assume that the transmitter
// sent us a one, otherwise we assume a zero
uint8_t bits = afsk->sampledBits & 0x07;
if (bits == 0x07 || // 111
bits == 0x06 || // 110
bits == 0x05 || // 101
bits == 0x03 // 011
) {
afsk->actualBits |= 1;
}
//// Alternative using five bits ////////////////
// uint8_t bits = afsk->sampledBits & 0x0f;
// uint8_t c = 0;
// c += bits & BV(1);
// c += bits & BV(2);
// c += bits & BV(3);
// c += bits & BV(4);
// c += bits & BV(5);
// if (c >= 3) afsk->actualBits |= 1;
/////////////////////////////////////////////////
// Now we can pass the actual bit to the HDLC parser.
// We are using NRZ-S coding, so if 2 consecutive bits
// have the same value, we have a 1, otherwise a 0.
// We use the TRANSITION_FOUND function to determine this.
//
// This is smart in combination with bit stuffing,
// since it ensures a transmitter will never send more
// than five consecutive 1's. When sending consecutive
// ones, the signal stays at the same level, and if
// this happens for longer periods of time, we would
// not be able to synchronize our phase to the transmitter
// and would start experiencing "bit slip".
//
// By combining bit-stuffing with NRZ-S coding, we ensure
// that the signal will regularly make transitions
// that we can use to synchronize our phase.
//
// We also check the return of the Link Control parser
// to check if an error occured.
if (!hdlcParse(&afsk->hdlc, !TRANSITION_FOUND(afsk->actualBits), &afsk->rxFifo)) {
afsk->status |= 1;
if (fifo_isfull(&afsk->rxFifo)) {
fifo_flush(&afsk->rxFifo);
afsk->status = 0;
}
}
}
if (afsk->silentSamples > DCD_TIMEOUT_SAMPLES) {
afsk->silentSamples = 0;
afsk->hdlc.dcd = false;
LED_RX_OFF();
}
}
ISR(ADC_vect) {
TIFR1 = _BV(ICF1);
AFSK_adc_isr(AFSK_modem, ((int16_t)((ADC) >> 2) - 128));
if (hw_afsk_dac_isr) {
DAC_PORT = (AFSK_dac_isr(AFSK_modem) & 0xF0) | _BV(3);
} else {
DAC_PORT = 128;
}
++_clock;
}

@ -0,0 +1,162 @@
#ifndef AFSK_H
#define AFSK_H
#include "device.h"
#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include <avr/pgmspace.h>
#include "util/FIFO.h"
#include "util/time.h"
#include "protocol/HDLC.h"
#define SIN_LEN 512
static const uint8_t sin_table[] PROGMEM =
{
128, 129, 131, 132, 134, 135, 137, 138, 140, 142, 143, 145, 146, 148, 149, 151,
152, 154, 155, 157, 158, 160, 162, 163, 165, 166, 167, 169, 170, 172, 173, 175,
176, 178, 179, 181, 182, 183, 185, 186, 188, 189, 190, 192, 193, 194, 196, 197,
198, 200, 201, 202, 203, 205, 206, 207, 208, 210, 211, 212, 213, 214, 215, 217,
218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
234, 234, 235, 236, 237, 238, 238, 239, 240, 241, 241, 242, 243, 243, 244, 245,
245, 246, 246, 247, 248, 248, 249, 249, 250, 250, 250, 251, 251, 252, 252, 252,
253, 253, 253, 253, 254, 254, 254, 254, 254, 255, 255, 255, 255, 255, 255, 255,
};
inline static uint8_t sinSample(uint16_t i) {
uint16_t newI = i % (SIN_LEN/2);
newI = (newI >= (SIN_LEN/4)) ? (SIN_LEN/2 - newI -1) : newI;
uint8_t sine = pgm_read_byte(&sin_table[newI]);
return (i >= (SIN_LEN/2)) ? (255 - sine) : sine;
}
#define SWITCH_TONE(inc) (((inc) == MARK_INC) ? SPACE_INC : MARK_INC)
#define BITS_DIFFER(bits1, bits2) (((bits1)^(bits2)) & 0x01)
#define DUAL_XOR(bits1, bits2) ((((bits1)^(bits2)) & 0x03) == 0x03)
#define SIGNAL_TRANSITIONED(bits) DUAL_XOR((bits), (bits) >> 2)
#define TRANSITION_FOUND(bits) BITS_DIFFER((bits), (bits) >> 1)
#define CPU_FREQ F_CPU
#define CONFIG_AFSK_RX_BUFLEN 64
#define CONFIG_AFSK_TX_BUFLEN 64
#define CONFIG_AFSK_RXTIMEOUT 0
#define CONFIG_AFSK_PREAMBLE_LEN 350UL
#define CONFIG_AFSK_TRAILER_LEN 50UL
#define BIT_STUFF_LEN 5
#define SAMPLERATE 9600
#define BITRATE 1200
#define SAMPLESPERBIT (SAMPLERATE / BITRATE)
#define PHASE_INC 1 // Nudge by an eigth of a sample each adjustment
#define DCD_MIN_COUNT 6
#define DCD_TIMEOUT_SAMPLES 96
#if BITRATE == 960
#define FILTER_CUTOFF 600
#define MARK_FREQ 960
#define SPACE_FREQ 1600
#define PHASE_BITS 10 // How much to increment phase counter each sample
#elif BITRATE == 1200
#define FILTER_CUTOFF 600
#define MARK_FREQ 1200
#define SPACE_FREQ 2200
#define PHASE_BITS 8
#elif BITRATE == 1600
#define FILTER_CUTOFF 800
#define MARK_FREQ 1600
#define SPACE_FREQ 2600
#define PHASE_BITS 8
#else
#error Unsupported bitrate!
#endif
#define PHASE_MAX (SAMPLESPERBIT * PHASE_BITS) // Resolution of our phase counter = 64
#define PHASE_THRESHOLD (PHASE_MAX / 2) // Target transition point of our phase window
typedef struct Hdlc
{
uint8_t demodulatedBits;
uint8_t bitIndex;
uint8_t currentByte;
bool receiving;
bool dcd;
uint8_t dcd_count;
} Hdlc;
typedef struct Afsk
{
// Stream access to modem
FILE fd;
// General values
Hdlc hdlc; // We need a link control structure
uint16_t preambleLength; // Length of sync preamble
uint16_t tailLength; // Length of transmission tail
// Modulation values
uint8_t sampleIndex; // Current sample index for outgoing bit
uint8_t currentOutputByte; // Current byte to be modulated
uint8_t txBit; // Mask of current modulated bit
bool bitStuff; // Whether bitstuffing is allowed
uint8_t bitstuffCount; // Counter for bit-stuffing
uint16_t phaseAcc; // Phase accumulator
uint16_t phaseInc; // Phase increment per sample
uint8_t silentSamples; // How many samples were completely silent
FIFOBuffer txFifo; // FIFO for transmit data
uint8_t txBuf[CONFIG_AFSK_TX_BUFLEN]; // Actual data storage for said FIFO
volatile bool sending; // Set when modem is sending
volatile bool sending_data; // Set when modem is sending data
// Demodulation values
FIFOBuffer delayFifo; // Delayed FIFO for frequency discrimination
int8_t delayBuf[SAMPLESPERBIT / 2 + 1]; // Actual data storage for said FIFO
FIFOBuffer rxFifo; // FIFO for received data
uint8_t rxBuf[CONFIG_AFSK_RX_BUFLEN]; // Actual data storage for said FIFO
int16_t iirX[2]; // IIR Filter X cells
int16_t iirY[2]; // IIR Filter Y cells
uint8_t sampledBits; // Bits sampled by the demodulator (at ADC speed)
int8_t currentPhase; // Current phase of the demodulator
uint8_t actualBits; // Actual found bits at correct bitrate
volatile int status; // Status of the modem, 0 means OK
} Afsk;
#define DIV_ROUND(dividend, divisor) (((dividend) + (divisor) / 2) / (divisor))
#define MARK_INC (uint16_t)(DIV_ROUND(SIN_LEN * (uint32_t)MARK_FREQ, CONFIG_AFSK_DAC_SAMPLERATE))
#define SPACE_INC (uint16_t)(DIV_ROUND(SIN_LEN * (uint32_t)SPACE_FREQ, CONFIG_AFSK_DAC_SAMPLERATE))
#define AFSK_DAC_IRQ_START() do { extern bool hw_afsk_dac_isr; hw_afsk_dac_isr = true; } while (0)
#define AFSK_DAC_IRQ_STOP() do { extern bool hw_afsk_dac_isr; hw_afsk_dac_isr = false; } while (0)
#define AFSK_DAC_INIT() do { DAC_DDR |= 0xF8; } while (0)
// Here's some macros for controlling the RX/TX LEDs
// THE _INIT() functions writes to the DDRB register
// to configure the pins as output pins, and the _ON()
// and _OFF() functions writes to the PORT registers
// to turn the pins on or off.
#define LED_TX_INIT() do { LED_DDR |= _BV(1); } while (0)
#define LED_TX_ON() do { LED_PORT |= _BV(1); } while (0)
#define LED_TX_OFF() do { LED_PORT &= ~_BV(1); } while (0)
#define LED_RX_INIT() do { LED_DDR |= _BV(2); } while (0)
#define LED_RX_ON() do { LED_PORT |= _BV(2); } while (0)
#define LED_RX_OFF() do { LED_PORT &= ~_BV(2); } while (0)
void AFSK_init(Afsk *afsk);
void AFSK_transmit(char *buffer, size_t size);
void AFSK_poll(Afsk *afsk);
#endif

@ -0,0 +1,49 @@
#include "Serial.h"
#include <util/setbaud.h>
#include <stdio.h>
#include <string.h>
void serial_init(Serial *serial) {
memset(serial, 0, sizeof(*serial));
UBRR0H = UBRRH_VALUE;
UBRR0L = UBRRL_VALUE;
#if USE_2X
UCSR0A |= _BV(U2X0);
#else
UCSR0A &= ~(_BV(U2X0));
#endif
// Set to 8-bit data, enable RX and TX
UCSR0C = _BV(UCSZ01) | _BV(UCSZ00);
UCSR0B = _BV(RXEN0) | _BV(TXEN0);
FILE uart0_fd = FDEV_SETUP_STREAM(uart0_putchar, uart0_getchar, _FDEV_SETUP_RW);
//FILE uart0_fd = FDEV_SETUP_STREAM(uart0_putchar, NULL, _FDEV_SETUP_WRITE);
serial->uart0 = uart0_fd;
}
bool serial_available(uint8_t index) {
if (index == 0) {
if (UCSR0A & _BV(RXC0)) return true;
}
return false;
}
int uart0_putchar(char c, FILE *stream) {
loop_until_bit_is_set(UCSR0A, UDRE0);
UDR0 = c;
return 1;
}
int uart0_getchar(FILE *stream) {
loop_until_bit_is_set(UCSR0A, RXC0);
return UDR0;
}
char uart0_getchar_nowait(void) {
if (!(UCSR0A & _BV(RXC0))) return EOF;
return UDR0;
}

@ -0,0 +1,20 @@
#ifndef SERIAL_H
#define SERIAL_H
#include "device.h"
#include <stdio.h>
#include <stdbool.h>
#include <avr/io.h>
typedef struct Serial {
FILE uart0;
} Serial;
void serial_init(Serial *serial);
bool serial_available(uint8_t index);
int uart0_putchar(char c, FILE *stream);
int uart0_getchar(FILE *stream);
char uart0_getchar_nowait(void);
#endif

@ -0,0 +1,58 @@
#include <stdbool.h>
#include <string.h>
#include <avr/io.h>
#include "device.h"
#include "config.h"
#include "util/FIFO.h"
#include "util/time.h"
#include "hardware/AFSK.h"
#include "hardware/Serial.h"
#include "protocol/AX25.h"
#include "protocol/LLP.h"
#include "protocol/KISS.h"
Serial serial;
Afsk modem;
LLPAddress localAdress;
LLPCtx llp;
static void llp_callback(struct LLPCtx *ctx) {
kiss_messageCallback(ctx);
}
void init(void) {
sei();
AFSK_init(&modem);
memset(&localAdress, 0, sizeof(localAdress));
localAdress.network = LLP_ADDR_BROADCAST;
localAdress.host = LLP_ADDR_BROADCAST;
llp_init(&llp, &localAdress, &modem.fd, llp_callback);
serial_init(&serial);
stdout = &serial.uart0;
stdin = &serial.uart0;
kiss_init(&llp, &modem, &serial);
}
int main (void) {
init();
while (true) {
llp_poll(&llp);
if (serial_available(0)) {
char sbyte = uart0_getchar_nowait();
kiss_serialCallback(sbyte);
}
#if SERIAL_FRAMING == SERIAL_FRAMING_DIRECT
kiss_checkTimeout(false);
#endif
}
return(0);
}

@ -0,0 +1,669 @@
:100000000C9474010C9491010C9491010C94910145
:100010000C9491010C9491010C9491010C94910118
:100020000C9491010C9491010C9491010C94910108
:100030000C9491010C9491010C9491010C949101F8
:100040000C9491010C9491010C9491010C949101E8
:100050000C9491010C94FC060C9491010C94910168
:100060000C9491010C949101808183848687898A04
:100070008C8E8F9192949597989A9B9D9EA0A2A307
:10008000A5A6A7A9AAACADAFB0B2B3B5B6B7B9BA79
:10009000BCBDBEC0C1C2C4C5C6C8C9CACBCDCECF07
:1000A000D0D2D3D4D5D6D7D9DADBDCDDDEDFE0E1C0
:1000B000E2E3E4E5E6E7E8E9EAEAEBECEDEEEEEFB1
:1000C000F0F1F1F2F3F3F4F5F5F6F6F7F8F8F9F9E3
:1000D000FAFAFAFBFBFCFCFCFDFDFDFDFEFEFEFE5C
:1000E000FEFFFFFFFFFFFFFF0000891112239B327D
:1000F0002446AD573665BF74488CC19D5AAFD3BEF8
:100100006CCAE5DB7EE9F7F88110080193331A2207
:10011000A5562C47B7753E64C99C408DDBBF52AED7
:10012000EDDA64CBFFF976E802218B3010029913E7
:100130002667AF763444BD554AADC3BC588ED19FB7
:100140006EEBE7FA7CC8F5D983310A2091121803C7
:10015000A7772E66B5543C45CBBD42ACD99E508F97
:10016000EFFB66EAFDD874C904428D5316619F7097
:100170002004A9153227BB364CCEC5DF5EEDD7FC77
:100180006888E1997AABF3BA85520C4397711E6087
:10019000A1142805B3373A26CDDE44CFDFFD56EC57
:1001A000E9986089FBBB72AA06638F7214409D5167
:1001B0002225AB343006B9174EEFC7FE5CCCD5DD37
:1001C0006AA9E3B8788AF19B87730E6295501C4147
:1001D000A3352A24B1163807CFFF46EEDDDC54CD17
:1001E000EBB962A8F99A708B088481951AA793B627
:1001F0002CC2A5D33EE1B7F04008C919522BDB3A17
:10020000644EED5F766DFF7C899400859BB712A6E6
:10021000ADD224C3BFF136E0C1184809D33B5A2AF6
:10022000E55E6C4FF77D7E6C0AA583B418869197C6
:100230002EE3A7F23CC0B5D14229CB38500AD91BD6
:10024000666FEF7E744CFD5D8BB502A499961087A6
:10025000AFF326E2BDD034C1C3394A28D11A580BB6
:10026000E77F6E6EF55C7C4D0CC685D71EE597F476
:100270002880A1913AA3B3B2444ACD5B5669DF7896
:10028000600CE91D722FFB3E8DD604C79FF516E466
:10029000A9902081BBB332A2C55A4C4BD7795E6876
:1002A000E11C680DF33F7A2E0EE787F61CC495D546
:1002B0002AA1A3B03882B193466BCF7A5448DD5956
:1002C000622DEB3C700EF91F8FF706E69DD414C526
:1002D000ABB122A0B9923083C77B4E6AD5585C4936
:1002E000E33D6A2CF11E780F11241FBECFEFD8E03A
:1002F000DEBFCDBF11E0A0E0B1E0EAE9F9E202C063
:1003000005900D92A231B107D9F716E0A2E1B1E054
:1003100001C01D92A43BB107E1F70E945B130C944E
:10032000CB140C9400000C944C12789488EB95E05C
:100330000E941803E8E9F6E08FEF9FEF9183808336
:100340009383828323E931E048EB55E0BF018AE4DF
:1003500093E00E94EE078AE896E00E94CF01EEEA61
:10036000F6E08AE896E09383828391838083AC01F0
:1003700068EB75E08AE493E00C943F129091C00022
:1003800095FFFCCF8093C60081E090E008958091B6
:10039000C00087FFFCCF8091C60090E00895CF9306
:1003A000DF93CDB7DEB72E970FB6F894DEBF0FBE42
:1003B000CDBFDC018EE0FD01982F11929A95E9F7EF
:1003C0001092C50097E69093C400E0ECF0E09081B5
:1003D0009D7F908396E09093C20098E19093C10036
:1003E0009E012F5F3F4FF90111928A95E9F783E053
:1003F0008C838EEB91E09A87898787EC91E09C87CC
:100400008B879EE0F90101900D929A95E1F72E9667
:100410000FB6F894DEBF0FBECDBFDF91CF91089528
:10042000811106C08091C000881F8827881F089509
:1004300080E008958091C00087FF03C08091C600CE
:1004400008958FEF08950F931F93CF93DF93182F85
:10045000C0919C06D0919D06FE01E659FF4F808118
:10046000811126C080E490E098A38F8F1E8E1D8E90
:100470001C8E01E0008331960083299A20910901A6
:1004800030910A0140910B0150910C01A0EBB4E0B6
:100490000E946E136056704F8F4F9F4F20E43FE1D4
:1004A00040E050E00E94A1133D8B2C8B0093130180
:1004B0000FB7F89420910501309106014091070192
:1004C00050910801A0EBB4E00E946E136056704F8B
:1004D0008F4F9F4F20E43FE140E050E00E94A11386
:1004E0003F8B2E8B0FBFE0919C06F0919D064FB77E
:1004F000F89426A137A182A193A12817390739F4CE
:1005000020A531A584A195A12817390779F060A508
:1005100071A526A137A12150310991E080E0621731
:10052000730709F090E0292F382F02C021E030E056
:100530004FBF232BC1F6E0919C06F0919D062FB78B
:10054000F894A0A5B1A51C9340A551A584A195A19F
:100550004817590719F482A193A103C080A591A55A
:10056000019691A780A72FBF81E090E0DF91CF9106
:100570001F910F910895E0919C06F0919D064FB751
:10058000F894E758FF4F24813581868197814FBFCA
:1005900028173907E9F0E0919C06F0919D069FB776
:1005A000F894E758FF4FA481B58122813381A217C7
:1005B000B30719F42081318105C0A481B5819D0163
:1005C0002F5F3F4F358324838C919FBF90E0089528
:1005D0008FEF9FEF0895109212010895109212016B
:1005E0001092800089E18093810081E896E09093E9
:1005F00087008093860080911201882321F080E497
:1006000080937C0002C010927C00389840988091C2
:100610007E00816080937E0087E080937B008CEE7B
:1006200080937A008AB1886F8AB9219A229A0895B4
:100630000F931F93CF93DF93CDB7DEB72E970FB6EF
:10064000F894DEBF0FBECDBF8C018EECD8011D9299
:100650008A95E9F710939D0600939C0680E490E04C
:10066000F80190A3878F11A2C8018C589F4FE459BD
:10067000FF4F918380839783868395838483049639
:10068000938382830996D801A758BF4F11969C93F4
:100690008E9317969C938E93169715969C938E9394
:1006A0001497CF9613969C938E931297865991091F
:1006B000D80193969C938E93929799969C938E9340
:1006C000989797969C938E939697CF9695969C9392
:1006D0008E93949784E090E0A681B7811C92468126
:1006E0005781228133814217530719F420813181C8
:1006F00004C0268137812F5F3F4F378326830197C0
:1007000059F70E94EE028EE0FE013196DF01982F2C
:100710001D929A95E9F793E09C8323E232E03A87B1
:1007200029872BEB32E03C872B87D80101900D9273
:100730008A95E1F72E960FB6F894DEBF0FBECDBFB7
:10074000DF91CF911F910F9108950F931F93CF9336
:10075000DF93E0919C06F0919D0620A531A537A37B
:1007600026A3EC018C01060F171FC017D10731F02B
:1007700060E070E089910E942302F7CFDF91CF9172
:100780001F910F910895DC0158968C915897811113
:10079000F8C05A968C915A978111AEC096964D9199
:1007A0005C91979798962D913C9199974217530792
:1007B00079F456962D913C915797232B49F410923A
:1007C0001301FD01E659FF4F1082A559BF4F68C0C4
:1007D0005B969C915B97911103C05C961C925C9711
:1007E00091E05B969C935B9754962D913C91559725
:1007F00021153105B9F596964D915C91979798968C
:100800002D913C9199974217530779F4FD01E559D1
:10081000FF4F108256962D913C91579721503109E8
:1008200057963C932E93569723C09696ED91FC9144
:10083000979794962D913C919597E217F30729F499
:1008400092962D913C91939707C09696ED91FC91CD
:1008500097979F012F5F3F4F97963C932E939697C4
:10086000908107C02150310955963C932E9354979F
:100870009EE759969C93599759969C9159979B310D
:1008800089F596964D915C91979798962D913C910C
:1008900099974217530739F410921301A659BF4F85
:1008A0001C92299808959696ED91FC9197979496AD
:1008B0008D919C919597E817F90729F492968D915F
:1008C0009C91939706C09696ED91FC919797CF01D6
:1008D000019697969C938E939697808159968C93C8
:1008E000599706C09E57923018F45B961C925B97FE
:1008F00081E05A968C935A975B968C915B975F96A2
:100900002D913C9190978823A9F05C968C915C97EF
:10091000853080F05C961C925C972034310519F08C
:1009200080E490E002C085E790E090969C938E93DF
:100930005F9723C05A968C915A9759969C915997D4
:10094000982341F05C969C915C979F5F5C969C938A
:100950005C970FC05C961C925C972034310519F0AF
:1009600020E430E002C025E730E090963C932E93DF
:100970005F97880F5A968C935A9788E058968C9375
:1009800058975F96ED91FC9190975D968D919C9113
:100990005E97E80FF91F9F0131705E963C932E938E
:1009A0005D9758968C915897815058968C93FF2755
:1009B000E038F10530F08FEF90E0AC014E1B5F0B9B
:1009C000FA01E859FF4F84912F3F310511F008F0EB
:1009D00080950895EF92FF920F931F93CF93DF932B
:1009E000FC018C010D531F4FD8014D915C91119763
:1009F000129711965C934E93A555B10914968D915B
:100A00009C91159712962D913C91139782179307FD
:100A100021F42D913C91119707C014968D919C91D2
:100A200015979C012F5F3F4F15963C932E9314977B
:100A3000EC012881260290011124C9019595879522
:100A400095958795E801998388837F01D7ECED0E12
:100A5000F11CE701288139818F010B531F4FE801F9
:100A600039832883840F951F35952795820F931F0F
:100A7000E70199838883AF0147535F4F21E0181640
:100A800019060CF420E0EA018881880F822B888304
:100A900016968D919C911797EC01688316962D916F
:100AA0003C91179712968D919C91139728173907AF
:100AB00021F48D919C91119705C016968D919C9172
:100AC0001797019617969C938E931697DA018C913F
:100AD000982F9695969589278370DF01A653BF4F6F
:100AE000833049F48C91803214F48F5F01C08150BF
:100AF0008C9311A203C081A18F5F81A38C91885F29
:100B0000803414F48C936BC18F738C93DF01A553E5
:100B1000BF4F8C91880F8C93EA01988197702BEFCF
:100B2000290F233010F0933011F481608C938C9155
:100B3000982F96958927809581709685990F892B96
:100B400086878E3709F052C0DF01A758BF4F149631
:100B50002D913C9115978D919C91119728173907EC
:100B600059F416962D913C91179712968D919C9160
:100B7000139728173907B1F116962D913C911797C5
:100B800014968D919C91159701972817390751F16B
:100B90001696CD91DC9117978EE7888316962D9146
:100BA0003C91179712968D919C91139728173907AE
:100BB00021F48D919C91119705C016968D919C9171
:100BC0001797019617969C938E93169791E0918BA9
:100BD0008389863020F4128A8F5F838B01C0928BC9
:100BE00081E0BFC0118A128A138ABAC08F778F370B
:100BF00011F4118A09C08289882311F02A9A01C050
:100C00002A988189811103C0128A138AE8C08685D7
:100C1000982F9F739E3309F4E2C080FF03C0808940
:100C20008068808B97859F5F97878089983008F4CC
:100C30009DC0DF01A758BF4F92E8980F923018F07F
:100C40008B3109F046C014962D913C9115978D91EA
:100C50009C9111972817390759F416962D913C91BC
:100C6000179712968D919C9113972817390759F170
:100C700016962D913C91179714968D919C911597EE
:100C8000019728173907F9F01696CD91DC9117973F
:100C90008BE1888316962D913C91179712968D9132
:100CA0009C9113972817390721F48D919C911197E6
:100CB00005C016968D919C911797019617969C9357
:100CC0008E93169706C0118A128A138A2A9880E09A
:100CD00001C081E014964D915C9115972D913C9146
:100CE00011974217530759F416964D915C91179737
:100CF00012962D913C9113974217530769F116965E
:100D00004D915C91179714962D913C911597215018
:100D100031094217530701F190891696CD91DC9164
:100D20001797988316964D915C91179712962D916F
:100D30003C9113974217530721F42D913C91119741
:100D400006C016962D913C9117972F5F3F4F17962F
:100D50003C932E93169705C0118A128A138A2A98FB
:100D600080E0108A1786882321F039C08695808B11
:100D700036C0EF01C453DF4F888199818160998328
:100D80008883DF01A758BF4F14962D913C9115978A
:100D90008D919C9111972817390759F416962D912A
:100DA0003C91179712968D919C91139728173907AC
:100DB00061F016962D913C91179714968D919C9108
:100DC000159701972817390751F416968D919C9124
:100DD000179715969C938E9314971982188281A168
:100DE000813618F011A2128A2A98DF91CF911F91B3
:100DF0000F91FF90EF9008951F920F920FB60F92F0
:100E000011242F933F934F935F936F937F938F930F
:100E10009F93AF93BF93EF93FF9380E286BB609164
:100E2000780070917900769567957695679560580A
:100E300080919C0690919D060E94EA048091130186
:100E4000882349F080919C0690919D060E94C303DF
:100E5000807F886001C080E88BB980918606909180
:100E60008706A0918806B09189060196A11DB11D43
:100E70008093860690938706A0938806B093890690
:100E8000FF91EF91BF91AF919F918F917F916F9162
:100E90005F914F913F912F910F900FBE0F901F9038
:100EA00018950F931F93CF938C01C62F82E8860F5E
:100EB000823010F06B3139F4F801608171818BE17F
:100EC00090E00E946C14F801608171818C2F90E099
:100ED000CF911F910F910C946C140F931F93CF938C
:100EE000DF938C010F5A1D4FD8012D913C91119722
:100EF000232B39F1EC01498550E01D972D913C9150
:100F000011972C503109241B350B11963C932E93CD
:100F1000FC016D917C9111979F01281B390B2617BD
:100F2000370738F49F01240F351FE9012A852193E3
:100F3000F0CFD801ED91FC91DF91CF911F910F91EE
:100F40000994DF91CF911F910F910895AF92BF92B5
:100F5000CF92DF92EF92FF920F931F93CF93DF9385
:100F60005B016A017C0126EBE21A2DEFF20A2FEFFA
:100F70003FEFF70131832083EC01C05CDD4F6881D6
:100F800079818EE790E00E946C148501CA0CDB1C0D
:100F90000C151D0539F0F80161918F01CE010E94F9
:100FA0005107F6CFF701608111816095CE010E9453
:100FB0005107612F6095CE010E94510768817981A8
:100FC0008EE790E0DF91CF911F910F91FF90EF900E
:100FD000DF90CF90BF90AF900C946C14CF93DF93C1
:100FE000EEE6F2E0DC01EF011D922197E9F7FC014A
:100FF000E05CFD4F518340837196318320833F979E
:101000007183608338962FEF3FEF318320833297CF
:1010100031832083EEE9F6E031832083338322831A
:10102000DF91CF9108952F923F924F925F926F92EE
:101030007F928F929F92AF92BF92CF92DF92EF9268
:10104000FF920F931F93CF93DF93CDB7DEB728970F
:101050000FB6F894DEBF0FBECDBF982F917083FB03
:10106000442440F8512C81FBAA24A0F8B12C920111
:101070002A253B253A83298384FB332730F93B8398
:101080001C8286FB662460F8712C82FB002700F925
:1010900010E085FB882480F8912C8078A82FB0E0A0
:1010A0001D01220C232C221C3308862F817063FB28
:1010B000222720F930E061FB442740F950E0422725
:1010C000532764FBEE27E0F9F0E066FBEE24E0F83E
:1010D000F12C62FBCC24C0F8D12C65FB772770F98A
:1010E0007D831E82607870E0660F672F661F770B26
:1010F000DF01AE25BF25B887AF83ED81FE81AE2726
:10110000BF27A627B7275A01AC24BD246A257B2513
:101110006295660F660F607CA62EF0E8AF9FA01860
:101120001124AB81BC81A625B7256A2F6170692780
:1011300079817170562F57276A2D650FA980BA8063
:10114000A026B126A22474E0A79E600D1124A82534
:10115000B925A225B325E8E0AE9F600D1124EF81EB
:10116000E170E82741704E27F0E14F9F600D112498
:101170004D815E814C255D25417084272E253F25BC
:101180002170282730E2239F600D1124082519259E
:101190000170802F8927A30144255525942F917034
:1011A0008927880F860F28960FB6F894DEBF0FBEEA
:1011B000CDBFDF91CF911F910F91FF90EF90DF9006
:1011C000CF90BF90AF909F908F907F906F905F90E7
:1011D0004F903F902F9008952F923F924F925F92A1
:1011E0006F927F928F929F92AF92BF92CF92DF9237
:1011F000EF92FF920F931F93CF93DF9300D000D015
:10120000CDB7DEB79C01DC01AB5ABD4F9C91F90113
:10121000E90FF11DEA5AFD4F60839F5F9C939C305C
:1012200009F088C34901C901805C9D4F9C838B8371
:101230001196BA83A9839C91892F881F8827881FBC
:101240008795882787955901B9EAAB1ABDEFBB0A84
:10125000F5014081942F991F9927991F682FF0E479
:101260009F9F600D1124690120EAC21A2DEFD20A56
:10127000D6019C91892F881F8827881F860F7401AB
:10128000B7EAEB1ABDEFFB0AF7014081942F991FD3
:101290009927991FF0E29F9F800D11248401065A1F
:1012A0001D4FD8014C91942F991F9927991FB0E198
:1012B0009B9F800D11243401E4EA6E1AEDEF7E0A43
:1012C000D3014C91942F991F9927991FB8E09B9FA8
:1012D000800D11242401E3EA4E1AEDEF5E0AD201DB
:1012E0009C91692F661F6627661F660F660F680F41
:1012F0001401B1EA2B1ABDEF3B0AF1018081982F4E
:10130000991F9927991F990F690F8B819C810E94C2
:101310005107A981BA819C9181E096FF80E0879571
:1013200088278795F501408191E046FF90E0682F7E
:10133000F0E49F9F600D1124D6019C9181E096FFFF
:1013400080E0860FF701408191E046FF90E0F0E2F7
:101350009F9F800D1124D8014C9191E046FF90E0B1
:10136000B0E19B9F800D1124F301408191E046FF85
:1013700090E0F8E09F9F800D1124D2019C9161E0E4
:1013800096FF60E0660F660F680FF101808191E0C3
:1013900086FF90E0990F690F8B819C810E94510715
:1013A000A981BA819C9181E095FF80E0879588278B
:1013B0008795F501408191E045FF90E0682FF0E4CA
:1013C0009F9F600D1124D6019C9181E095FF80E0E4
:1013D000860FF701408191E045FF90E0F0E29F9F8A
:1013E000800D1124D8014C9191E045FF90E0B0E1CF
:1013F0009B9F800D1124F301408191E045FF90E017
:10140000F8E09F9F800D1124D2019C9161E095FF2F
:1014100060E0660F660F680FF101808191E085FF43
:1014200090E0990F690F8B819C810E945107A981DF
:10143000BA819C9181E094FF80E087958827879509
:10144000F501408191E044FF90E0682FF0E49F9F18
:10145000600D1124D6019C9181E094FF80E0860FFD
:10146000F701408191E044FF90E0F0E29F9F800D02
:101470001124D8014C9191E044FF90E0B0E19B9F92
:10148000800D1124F301408191E044FF90E0F8E0E9
:101490009F9F800D1124D2019C9161E094FF60E038
:1014A000660F660F680FF101808191E084FF90E084
:1014B000990F690F8B819C810E945107C4018A5A40
:1014C0009D4F9A838983DC019C9181E093FF80E0AA
:1014D0008795882787955401B9EAAB1ABDEFBB0AF7
:1014E000F501408191E043FF90E0682FF0E49F9F79
:1014F000600D1124640120EAC21A2DEFD20AD60130
:101500009C9181E093FF80E0860F7401B7EAEB1AAB
:10151000BDEFFB0AF701408191E043FF90E0F0E26C
:101520009F9F800D11248401065A1D4FD8014C91B4
:1015300091E043FF90E0B0E19B9F800D11243401C6
:10154000E4EA6E1AEDEF7E0AD3014C9191E043FF7D
:1015500090E0B8E09B9F800D11242401E3EA4E1A2D
:10156000EDEF5E0AD2019C9161E093FF60E0660FAF
:10157000660F680F1401B1EA2B1ABDEF3B0AF101A7
:10158000808191E083FF90E0990F690F8B819C81AE
:101590000E945107A981BA819C9181E092FF80E06D
:1015A000879588278795F501408191E042FF90E07B
:1015B000682FF0E49F9F600D1124D6019C9181E07B
:1015C00092FF80E0860FF701408191E042FF90E0BA
:1015D000F0E29F9F800D1124D8014C9191E042FFD1
:1015E00090E0B0E19B9F800D1124F301408191E0D8
:1015F00042FF90E0F8E09F9F800D1124D2019C9162
:1016000061E092FF60E0660F660F680FF101808174
:1016100091E082FF90E0990F690F8B819C810E947D
:101620005107A981BA819C9181E091FF80E0879563
:1016300088278795F501408191E041FF90E0682F70
:10164000F0E49F9F600D1124D6019C9181E091FFF1
:1016500080E0860FF701408191E041FF90E0F0E2E9
:101660009F9F800D1124D8014C9191E041FF90E0A3
:10167000B0E19B9F800D1124F301408191E041FF77
:1016800090E0F8E09F9F800D1124D2019C9161E0D1
:1016900091FF60E0660F660F680FF101808191E0B5
:1016A00081FF90E0990F690F8B819C810E94510707
:1016B000A981BA819C91F501808181708295880F02
:1016C000880F807CF0E89F9F80191124D6019C919F
:1016D0009170890FF70190819170F0E29F9F800DCA
:1016E0001124D8019C919170B0E19B9F800D112431
:1016F000F30190819170F8E09F9F800D1124D20139
:101700006C916170660F660F680FF10190819170A6
:10171000990F690F8B819C810E9451075401F8EA4F
:10172000AF1AFDEFBF0AD5016C916401B5EACB1A7F
:10173000BDEFDB0AF60170817401F2EAEF1AFDEFEA
:10174000FF0AD7019C9184010F591D4FF801408178
:10175000862F881F8827881F87958827879551E0BF
:1017600063FF50E0682FF0E45F9F600D112481E07B
:1017700043FF80E0860F572F551F5527551F20E246
:10178000529F800D112451E073FF50E0A0E15A9F59
:10179000800D1124592F551F5527551FB8E05B9F09
:1017A000800D112461E093FF60E0660F660F680F03
:1017B000942F991F9927991F990F690F8B819C81ED
:1017C0000E945107F5016081D6017C91F70190815B
:1017D000D8014C9181E066FF80E087958827879546
:1017E00051E062FF50E0682FB0E45B9F600D112470
:1017F00081E042FF80E0860F51E076FF50E0E0E2BA
:101800005E9F800D112451E072FF50E0F0E15F9F78
:10181000800D112451E096FF50E028E0529F800D8A
:10182000112461E092FF60E0660F660F680F91E09F
:1018300046FF90E0990F690F8B819C810E945107B0
:10184000D5016C91F6017081D7019C91F80140811E
:1018500081E065FF80E087958827879551E061FFEB
:1018600050E0682FF0E45F9F600D112481E041FF9C
:1018700080E0860F51E075FF50E020E2529F800D1E
:10188000112451E071FF50E0A0E15A9F800D112416
:1018900051E095FF50E0B8E05B9F800D112461E0BE
:1018A00091FF60E0660F660F680F91E045FF90E0E2
:1018B000990F690F8B819C810E945107D501EC9192
:1018C000D6017C91D7015C91D8014C919E2F9170EB
:1018D000872F81708295807FB0E49B9F800D1124BB
:1018E000642F6170860F952F9170990F990F890F52
:1018F00091E0E4FF90E0E0E89E9F8019112491E0E0
:1019000074FF90E0F0E29F9F800D112491E054FF5E
:1019100090E028E0929F800D112461E044FF60E098
:10192000660F680F8B819C810E945107F401EB5A6E
:10193000FD4F10820F900F900F900F90DF91CF917D
:101940001F910F91FF90EF90DF90CF90BF90AF90DD
:101950009F908F907F906F905F904F903F902F90CF
:1019600008951F93CF93DF93EC01162F0E94EC088C
:10197000DE01A65BBD4F2D913C911197F901E12746
:10198000FF27EE0FFF1FE851FF4F85919491232F02
:101990003327282739272D933C93809115018823DD
:1019A00049F0612F809114010E941308682FCE0125
:1019B0000E94EC08109314019091150181E0892791
:1019C00080931501DF91CF911F9108950F931F937D
:1019D000CF93DF93EC018B01FB0161810E94B10C7D
:1019E000F8016081CE010E94B10CF8016381CE0143
:1019F0000E94B10CF8016281CE01DF91CF911F915D
:101A00000F910C94B10C6F927F928F929F92AF9234
:101A1000BF92CF92DF92EF92FF920F931F93CF93DB
:101A2000DF93CDB7DEB72A970FB6F894DEBF0FBEAF
:101A3000CDBF8C013A016901FC01EB5AFD4F1082C8
:101A40005C0186EBA81A8DEFB80A8FEF9FEFF501C6
:101A500091838083CE0101967C018AE0F701119287
:101A60008A95E9F7F801EE5BFD4F0190F081E02DDA
:101A7000808191819A838983828193819C838B83E6
:101A8000FB01808191819E838D83828193819887E0
:101A90008F838CE0820F877011F41A8603C098E060
:101AA000981B9A874801F0EC8F1AFDEF9F0AF4010A
:101AB000608171818EE790E00E946C14B701C801CB
:101AC0000E94E60CBE016B5F7F4FC8010E94E60CCE
:101AD0006985C8010E94B10C6A85C8010E94B10CD9
:101AE0008A859FEF980F9A87882311F060E0F5CFE1
:101AF0007301C60CD71CEC14FD0439F0F701619199
:101B00007F01C8010E94B10CF6CFF5016081F18020
:101B10006095C8010E94B10C6F2D6095C8010E94AC
:101B2000B10CF401608171818EE790E00E946C1429
:101B30002A960FB6F894DEBF0FBECDBFDF91CF91CE
:101B40001F910F91FF90EF90DF90CF90BF90AF90DB
:101B50009F908F907F906F9008959A01AB016EE9EE
:101B600076E00C94030D6F927F928F929F92AF92CA
:101B7000BF92CF92DF92EF92FF920F931F93CF937A
:101B8000DF938C010E591D4FF801B080EC01CD5947
:101B9000DD4F5881DC01AC59BD4FDC903C01FBE9C5
:101BA0006F1AFDEF7F0AF30170819C012A593D4FA6
:101BB000F90160812F5F3F4FF90140812F5F3F4F57
:101BC000F90130817C01F7E9EF1AFDEFFF0AF70117
:101BD00020817C01F6E9EF1AFDEFFF0AF701C080D2
:101BE0007C01F5E9EF1AFDEFFF0AF701A0807C0107
:101BF000F4E9EF1AFDEFFF0AF70190807C01F3E9A9
:101C0000EF1AFDEFFF0AF701F080EB2CEE1CEE243B
:101C1000EE1CE794EE24E794852E881C8824881C0B
:101C2000F0E48F9EE00C11248E2CE22EEE1CEE24AC
:101C3000EE1CE80C8D2C881C8824881CE0E28E9E0B
:101C4000E00C1124872E881C8824881CF0E18F9ECC
:101C5000E00C1124862E881C8824881CE8E08E9EC7
:101C6000E00C1124842E881C8824881C880C880C85
:101C7000E80C832E881C8824881C880CE80CF8014A
:101C8000E08211E0B6FE10E017951127179501E0EC
:101C900056FF00E0F0E40F9F100D1124012F11E01A
:101CA00026FF10E0100F01E0D6FE00E0E0E20E9FFC
:101CB000100D112401E076FF00E0F0E10F9F100D00
:101CC000112401E066FF00E0E8E00E9F100D1124F2
:101CD00001E046FF00E0000F000F100F01E036FFAB
:101CE00000E0000F100F1883CC2DCC1FCC27CC1F89
:101CF000C795CC27C795DA2DDD1FDD27DD1FF0E462
:101D0000DF9FC00D1124DC2FC1E0F6FEC0E0CD0F37
:101D1000D92DDD1FDD27DD1FE0E2DE9FC00D112480
:101D2000DF2DDD1FDD27DD1FF0E1DF9FC00D11245A
:101D3000D1E0C6FED0E0E8E0DE9FC00D1124D1E086
:101D4000A6FED0E0DD0FDD0FCD0FD1E096FED0E096
:101D5000DD0FCD0FCC93A1E0B5FEA0E0A795AA279B
:101D6000A795B1E055FFB0E0F0E4BF9FA00D1124AE
:101D7000BA2FA1E025FFA0E0AB0FB1E0D5FEB0E0A7
:101D8000C0E2BC9FA00D1124B1E075FFB0E0E0E11E
:101D9000BE9FA00D1124B1E065FFB0E0F8E0BF9F49
:101DA000A00D1124B1E045FFB0E0BB0FBB0FAB0F9E
:101DB000B1E035FFB0E0BB0FAB0FF301A083FC0136
:101DC000EA59FD4FA1E0B4FEA0E0A795AA27A79588
:101DD000B1E054FFB0E0C0E4BC9FA00D1124BA2FC5
:101DE000A1E024FFA0E0AB0FB1E0D4FEB0E0C0E280
:101DF000BC9FA00D1124B1E074FFB0E0C0E1BC9F16
:101E0000A00D1124B1E064FFB0E0C8E0BC9FA00DBC
:101E10001124B1E044FFB0E0BB0FBB0FAB0FB1E04A
:101E200034FFB0E0BB0FAB0FA083FC01E959FD4FBD
:101E3000A1E0C5FEA0E0A795AA27A795B1E0A5FE61
:101E4000B0E0C0E4BC9FA00D1124BA2FA1E0F4FEC5
:101E5000A0E0AB0FB1E095FEB0E0C0E2BC9FA00DEA
:101E60001124B1E0F5FEB0E0C0E1BC9FA00D11244B
:101E7000B1E0C4FEB0E0C8E0BC9FA00D1124B1E009
:101E8000A4FEB0E0BB0FBB0FAB0FB1E094FEB0E01F
:101E9000BB0FAB0FA083FC01E859FD4FA1E0B3FEDF
:101EA000A0E0A795AA27A795B1E053FFB0E0C0E452
:101EB000BC9FA00D1124BA2FA1E023FFA0E0AB0F1F
:101EC000B1E0D3FEB0E0C0E2BC9FA00D1124B1E0B0
:101ED00073FFB0E0C0E1BC9FA00D1124B1E063FF2F
:101EE000B0E0C8E0BC9FA00D1124B1E043FFB0E01A
:101EF000BB0FBB0FAB0FB1E033FFB0E0BB0FAB0FBD
:101F0000A083FC01E759FD4FA1E0B2FEA0E0A79538
:101F1000AA27A795B1E052FFB0E0C0E4BC9FA00D96
:101F20001124BA2FA1E022FFA0E0AB0FB1E0D2FE56
:101F3000B0E0C0E2BC9FA00D1124B1E072FFB0E0A0
:101F4000C0E1BC9FA00D1124B1E062FFB0E0C8E089
:101F5000BC9FA00D1124B1E042FFB0E0BB0FBB0F4E
:101F6000AB0FB1E032FFB0E0BB0FAB0FA083FC01C1
:101F7000E659FD4FA1E0C3FEA0E0A795AA27A795CB
:101F8000B1E0A3FEB0E0C0E4BC9FA00D1124BA2FC5
:101F9000A1E0F2FEA0E0AB0FB1E093FEB0E0C0E242
:101FA000BC9FA00D1124B1E0F3FEB0E0C0E1BC9FE6
:101FB000A00D1124B1E0C2FEB0E0C8E0BC9FA00DAE
:101FC0001124B1E0A2FEB0E0BB0FBB0FAB0FB1E03C
:101FD00092FEB0E0BB0FAB0FA083FC01E559FD4FB3
:101FE000A1E0B1FEA0E0A795AA27A795B1E051FF17
:101FF000B0E0C0E4BC9FA00D1124BA2FA1E021FFE6
:10200000A0E0AB0FB1E0D1FEB0E0C0E2BC9FA00DFC
:102010001124B1E071FFB0E0C0E1BC9FA00D11241C
:10202000B1E061FFB0E0C8E0BC9FA00D1124B1E0B9
:1020300041FFB0E0BB0FBB0FAB0FB1E031FFB0E031
:10204000BB0FAB0FA083FC01E459FD4F51705295BB
:10205000550F550F507CA0E8BA9E501911242170DD
:10206000250F5D2D5170C0E25C9F200D1124717011
:1020700050E1759F200D11246170A8E06A9F200D2A
:1020800011244170440F440F240F3170330F230F7C
:10209000208331968C2D81709A2D9170990F990F14
:1020A000C8E08C9F900D11248F2D8170980F292DE1
:1020B0002170220F920F81E0C1FE80E020E8829F14
:1020C0009019112481E0A1FE80E050E4859F900DDD
:1020D000112481E091FE80E0A0E28A9F900D1124FE
:1020E00081E0F1FE80E0C0E18C9F900D112490838F
:1020F000DF91CF911F910F91FF90EF90DF90CF90E4
:10210000BF90AF909F908F907F906F9008952F9287
:102110003F924F925F926F927F928F929F92AF9277
:10212000BF92CF92DF92EF92FF920F931F93CF93C4
:10213000DF93CDB7DEB72B970FB6F894DEBF0FBE97
:10214000CDBF8C014C012DEA821A2DEF920A5C0161
:102150003CEAA31A3DEFB30A7C014CEBE41A4DEFC5
:10216000F40A9C01235B3D4F3C832B831C0133E924
:10217000231A3DEF330A9C01245B3D4F38872F83A0
:10218000F801E05CFD4F808191810E942E149C013A
:10219000019609F45BC1D4014C91442309F4F2C0C7
:1021A0002B31310529F4F5018081882309F4EAC037
:1021B000F801EA5BFD4F80819181019691838083D4
:1021C0006CE070E00E947913892B09F0DBC02B31A1
:1021D000310529F0C9018E579109029710F4D501F4
:1021E0001C92F70180819181F801EE59FD4F8D56C7
:1021F0009240DF01A80FB91F4C914193E215F305FE
:10220000C1F7D1012C93C8010E94B30DF7014080A2
:102210005180F3E04F1A5108D7014D925C9268014A
:10222000BCE9CB1ABDEFDB0A612C712C9801285B4D
:102230003D4F3E832D83F6013297208131963081C8
:10224000D6019C91632F822F29873A879B870E9412
:102250001308EF81F88580839B85892729853A8536
:10226000882309F451C0982F9F70998382958F70AD
:102270008A83FE01319680E090E041915FEF540F38
:102280005230E8F14430D9F14830C9F1433009F413
:10229000DBC0453041F0463059F0473071F050E036
:1022A000493089F002C052E013C04A3071F002C0D8
:1022B00054E00EC04B3059F002C058E009C04C3019
:1022C00009F4BDC005C050E103C050E201C050E4B4
:1022D0008130910509F0AFC025274423A9F0AB81D7
:1022E000BC814D915D916D917C9113974F5F5F4FD4
:1022F0006F4F7F4F4D935D936D937C931397019731
:1023000019F081E090E0B9CFED81FE8140815181EB
:10231000FA01E227FF27EE0FFF1FE851FF4F6591FB
:102320007491852F992786279727FC01E327FF279C
:10233000EE0FFF1FE851FF4F45915491892F9927C8
:1023400084279527AD81BE818D939C93C30163E063
:1023500070E00E948D13660F771F640D751D600F6E
:10236000711FFB013897208331963083B3E06B0EE9
:10237000711CE3E0CE0ED11CFCE06F16710409F075
:102380005ACFFECED5018C9181113BC02E3731053D
:1023900059F5F701808191819801285B3D4F6901D2
:1023A0000C9750F0D9018D919C91883B904F21F46E
:1023B0002A9AC8010E946D0781E0F40180838FEFA3
:1023C0009FEFD6018D939C93F70111821082F80143
:1023D000EA5BFD4F11821082AB81BC811D921D9280
:1023E0001D921C921397CCCE2F37310519F4F401AE
:1023F0001082C6CE2B31310521F481E0D5018C93BA
:10240000BFCE4423A1F0F701808191818034F2E0B6
:102410009F0758F4AC014F5F5F4FD7014D935C931A
:10242000F801E80FF91F208302C0F4011082D501E2
:102430001C92A6CE50E83527411151CF60CF813094
:102440009105C1F720584BCF51E042CF2B960FB6E4
:10245000F894DEBF0FBECDBFDF91CF911F910F91DA
:10246000FF90EF90DF90CF90BF90AF909F908F90B4
:102470007F906F905F904F903F902F900895909332
:10248000A3068093A20650938B0640938A0670930E
:10249000A6066093A5060895EF92FF920F931F93EF
:1024A000CF93DF93EC018C017C018CEBE81A8DEF6C
:1024B000F80AF7018081918198012C1B3D0B2817A8
:1024C000390758F4F80181918F0160918A06709163
:1024D0008B0690E00E946C14ECCFDF91CF911F919E
:1024E0000F91FF90EF9008954F925F926F927F92BD
:1024F0008F929F92AF92BF92EF92FF920F931F9392
:10250000CF93DF93EC018B017A01E091A506F09166
:10251000A6068189811145C00E941E149091000178
:10252000891798F4A701B801CE01DF91CF911F91CF
:102530000F91FF90EF90BF90AF909F908F907F9002
:102540006F905F904F900C94AD0D8FB7F894809082
:10255000860690908706A0908806B09089068FBF67
:102560002091010130910201409103015091040139
:10257000AAE0B0E00E946E132FB7F8944090860650
:102580005090870660908806709089062FBF481883
:1025900059086A087B08461657066806790664F3E8
:1025A000B4CFE091A506F091A6068189882309F4AD
:1025B000ACCF8091A2069091A3060E948710E09173
:1025C000A506F091A606E453FF4F80819181892BE7
:1025D00041F311821082DF91CF911F910F91FF90F3
:1025E000EF90BF90AF909F908F907F906F905F9093
:1025F0004F9008954091AC065091AD0666E171E0B0
:102600008091A2069091A3060E9474121092A706D0
:102610001092AD061092AC06089581110C94FA1236
:102620008091A7068823D9F02FB7F8948091860669
:1026300090918706A0918806B09189062FBF40919E
:10264000A8065091A9066091AA067091AB06841B5A
:10265000950BA60BB70BC397A105B105FCF6089522
:102660009FB7F8944091860650918706609188063E
:10267000709189069FBF4093A8065093A906609366
:10268000AA067093AB0691E09093A7062091AC0642
:102690003091AD06A9014F5F5F4F5093AD06409357
:1026A000AC06F901EA5EFE4F80834433524010F0DD
:1026B0000C94FA1208950E9495018AE493E00E9416
:1026C000871080E00E941002882321F00E941A02E5
:1026D0000E94301380E00E940D13EFCF0E94C313BD
:1026E000A59F900DB49F900DA49F800D911D112466
:1026F0000895AA1BBB1B51E107C0AA1FBB1FA61749
:10270000B70710F0A61BB70B881F991F5A95A9F79A
:1027100080959095BC01CD01089597FB072E16F486
:10272000009407D077FD09D00E94791307FC05D0EB
:102730003EF4909581959F4F0895709561957F4FD8
:102740000895A1E21A2EAA1BBB1BFD010DC0AA1FF2
:10275000BB1FEE1FFF1FA217B307E407F50720F00A
:10276000A21BB30BE40BF50B661F771F881F991F85
:102770001A9469F760957095809590959B01AC01CE
:10278000BD01CF010895A29FB001B39FC001A39FD7
:10279000700D811D1124911DB29F700D811D11249A
:1027A000911D08958F929F92AF92BF92CF92DF9228
:1027B000EF92FF92CF93DF93EC01688179818A8158
:1027C0009B81611571058105910521F464E279ED24
:1027D0008BE597E02DE133EF41E050E00E94AC142F
:1027E00049015A019B01AC01A7EAB1E40E946E13B2
:1027F0006B017C01ACEEB4EFA50194010E94A7141B
:10280000DC01CB018C0D9D1DAE1DBF1DB7FF03C0AC
:102810000197A109B04888839983AA83BB839F77D6
:10282000DF91CF91FF90EF90DF90CF90BF90AF906E
:102830009F908F9008950E94D21308958EE091E0AA
:102840000E94D2130895A0E0B0E080930E0190930F
:102850000F01A0931001B09311010895CF93DF935E
:10286000EC012B8120FF33C026FF0AC02F7B2B8376
:102870008E819F8101969F838E838A8190E029C0FB
:1028800022FF0FC0E881F9818081992787FD90950B
:10289000009719F420622B831AC03196F983E883DC
:1028A0000EC0EA85FB85099597FF09C02B8101962B
:1028B00011F080E201C080E1822B8B8308C02E8161
:1028C0003F812F5F3F4F3F832E83992702C08FEFB9
:1028D0009FEFDF91CF9108950F931F93CF93DF93D5
:1028E000FB01238121FD03C08FEF9FEF28C022FF52
:1028F00016C046815781248135814217530744F41D
:10290000A081B1819D012F5F3F4F318320838C9344
:10291000268137812F5F3F4F3783268310C0EB011D
:10292000092F182F0084F185E02D0995892BE1F6F8
:102930008E819F8101969F838E83812F902FDF91BF
:10294000CF911F910F910895B7FF0C946E130E94C1
:102950006E13821B930B0895052E97FB1EF40094B3
:102960000E94C31457FD07D00E94A11307FC03D097
:102970004EF40C94C31450954095309521953F4FDB
:102980004F4F5F4F089590958095709561957F4F5B
:0A2990008F4F9F4F0895F894FFCF7A
:10299A00FFC8000000320000005E010000FE0100D6
:0229AA0000002B
:00000001FF

@ -0,0 +1,688 @@
:100000000C9474010C9491010C9491010C94910145
:100010000C9491010C9491010C9491010C94910118
:100020000C9491010C9491010C9491010C94910108
:100030000C9491010C9491010C9491010C949101F8
:100040000C9491010C9491010C9491010C949101E8
:100050000C9491010C94FC060C9491010C94910168
:100060000C9491010C949101808183848687898A04
:100070008C8E8F9192949597989A9B9D9EA0A2A307
:10008000A5A6A7A9AAACADAFB0B2B3B5B6B7B9BA79
:10009000BCBDBEC0C1C2C4C5C6C8C9CACBCDCECF07
:1000A000D0D2D3D4D5D6D7D9DADBDCDDDEDFE0E1C0
:1000B000E2E3E4E5E6E7E8E9EAEAEBECEDEEEEEFB1
:1000C000F0F1F1F2F3F3F4F5F5F6F6F7F8F8F9F9E3
:1000D000FAFAFAFBFBFCFCFCFDFDFDFDFEFEFEFE5C
:1000E000FEFFFFFFFFFFFFFF0000891112239B327D
:1000F0002446AD573665BF74488CC19D5AAFD3BEF8
:100100006CCAE5DB7EE9F7F88110080193331A2207
:10011000A5562C47B7753E64C99C408DDBBF52AED7
:10012000EDDA64CBFFF976E802218B3010029913E7
:100130002667AF763444BD554AADC3BC588ED19FB7
:100140006EEBE7FA7CC8F5D983310A2091121803C7
:10015000A7772E66B5543C45CBBD42ACD99E508F97
:10016000EFFB66EAFDD874C904428D5316619F7097
:100170002004A9153227BB364CCEC5DF5EEDD7FC77
:100180006888E1997AABF3BA85520C4397711E6087
:10019000A1142805B3373A26CDDE44CFDFFD56EC57
:1001A000E9986089FBBB72AA06638F7214409D5167
:1001B0002225AB343006B9174EEFC7FE5CCCD5DD37
:1001C0006AA9E3B8788AF19B87730E6295501C4147
:1001D000A3352A24B1163807CFFF46EEDDDC54CD17
:1001E000EBB962A8F99A708B088481951AA793B627
:1001F0002CC2A5D33EE1B7F04008C919522BDB3A17
:10020000644EED5F766DFF7C899400859BB712A6E6
:10021000ADD224C3BFF136E0C1184809D33B5A2AF6
:10022000E55E6C4FF77D7E6C0AA583B418869197C6
:100230002EE3A7F23CC0B5D14229CB38500AD91BD6
:10024000666FEF7E744CFD5D8BB502A499961087A6
:10025000AFF326E2BDD034C1C3394A28D11A580BB6
:10026000E77F6E6EF55C7C4D0CC685D71EE597F476
:100270002880A1913AA3B3B2444ACD5B5669DF7896
:10028000600CE91D722FFB3E8DD604C79FF516E466
:10029000A9902081BBB332A2C55A4C4BD7795E6876
:1002A000E11C680DF33F7A2E0EE787F61CC495D546
:1002B0002AA1A3B03882B193466BCF7A5448DD5956
:1002C000622DEB3C700EF91F8FF706E69DD414C526
:1002D000ABB122A0B9923083C77B4E6AD5585C4936
:1002E000E33D6A2CF11E780F11241FBECFEFD8E03A
:1002F000DEBFCDBF11E0A0E0B1E0E4ECFAE202C065
:1003000005900D92A231B107D9F716E0A2E1B1E054
:1003100001C01D92A43BB107E1F70E94F3130C94B6
:1003200060150C9400000C944C12789488EB95E0C6
:100330000E941803E8E9F6E08FEF9FEF9183808336
:100340009383828323E931E048EB55E0BF018AE4DF
:1003500093E00E94EE078AE896E00E94CF01EEEA61
:10036000F6E08AE896E09383828391838083AC01F0
:1003700068EB75E08AE493E00C943F129091C00022
:1003800095FFFCCF8093C60081E090E008958091B6
:10039000C00087FFFCCF8091C60090E00895CF9306
:1003A000DF93CDB7DEB72E970FB6F894DEBF0FBE42
:1003B000CDBFDC018EE0FD01982F11929A95E9F7EF
:1003C0001092C50097E69093C400E0ECF0E09081B5
:1003D0009D7F908396E09093C20098E19093C10036
:1003E0009E012F5F3F4FF90111928A95E9F783E053
:1003F0008C838EEB91E09A87898787EC91E09C87CC
:100400008B879EE0F90101900D929A95E1F72E9667
:100410000FB6F894DEBF0FBECDBFDF91CF91089528
:10042000811106C08091C000881F8827881F089509
:1004300080E008958091C00087FF03C08091C600CE
:1004400008958FEF08950F931F93CF93DF93182F85
:10045000C0919C06D0919D06FE01E659FF4F808118
:10046000811126C080E490E098A38F8F1E8E1D8E90
:100470001C8E01E0008331960083299A20910901A6
:1004800030910A0140910B0150910C01A0EBB4E0B6
:100490000E9412146056704F8F4F9F4F20E43FE12F
:1004A00040E050E00E9445143D8B2C8B00931301DB
:1004B0000FB7F89420910501309106014091070192
:1004C00050910801A0EBB4E00E9412146056704FE6
:1004D0008F4F9F4F20E43FE140E050E00E944514E1
:1004E0003F8B2E8B0FBFE0919C06F0919D064FB77E
:1004F000F89426A137A182A193A12817390739F4CE
:1005000020A531A584A195A12817390779F060A508
:1005100071A526A137A12150310991E080E0621731
:10052000730709F090E0292F382F02C021E030E056
:100530004FBF232BC1F6E0919C06F0919D062FB78B
:10054000F894A0A5B1A51C9340A551A584A195A19F
:100550004817590719F482A193A103C080A591A55A
:10056000019691A780A72FBF81E090E0DF91CF9106
:100570001F910F910895E0919C06F0919D064FB751
:10058000F894E758FF4F24813581868197814FBFCA
:1005900028173907E9F0E0919C06F0919D069FB776
:1005A000F894E758FF4FA481B58122813381A217C7
:1005B000B30719F42081318105C0A481B5819D0163
:1005C0002F5F3F4F358324838C919FBF90E0089528
:1005D0008FEF9FEF0895109212010895109212016B
:1005E0001092800089E18093810081E896E09093E9
:1005F00087008093860080911201882321F080E497
:1006000080937C0002C010927C00389840988091C2
:100610007E00816080937E0087E080937B008CEE7B
:1006200080937A008AB1886F8AB9219A229A0895B4
:100630000F931F93CF93DF93CDB7DEB72E970FB6EF
:10064000F894DEBF0FBECDBF8C018EECD8011D9299
:100650008A95E9F710939D0600939C0680E490E04C
:10066000F80190A3878F11A2C8018C589F4FE459BD
:10067000FF4F918380839783868395838483049639
:10068000938382830996D801A758BF4F11969C93F4
:100690008E9317969C938E93169715969C938E9394
:1006A0001497CF9613969C938E931297865991091F
:1006B000D80193969C938E93929799969C938E9340
:1006C000989797969C938E939697CF9695969C9392
:1006D0008E93949784E090E0A681B7811C92468126
:1006E0005781228133814217530719F420813181C8
:1006F00004C0268137812F5F3F4F378326830197C0
:1007000059F70E94EE028EE0FE013196DF01982F2C
:100710001D929A95E9F793E09C8323E232E03A87B1
:1007200029872BEB32E03C872B87D80101900D9273
:100730008A95E1F72E960FB6F894DEBF0FBECDBFB7
:10074000DF91CF911F910F9108950F931F93CF9336
:10075000DF93E0919C06F0919D0620A531A537A37B
:1007600026A3EC018C01060F171FC017D10731F02B
:1007700060E070E089910E942302F7CFDF91CF9172
:100780001F910F910895DC0158968C915897811113
:10079000F8C05A968C915A978111AEC096964D9199
:1007A0005C91979798962D913C9199974217530792
:1007B00079F456962D913C915797232B49F410923A
:1007C0001301FD01E659FF4F1082A559BF4F68C0C4
:1007D0005B969C915B97911103C05C961C925C9711
:1007E00091E05B969C935B9754962D913C91559725
:1007F00021153105B9F596964D915C91979798968C
:100800002D913C9199974217530779F4FD01E559D1
:10081000FF4F108256962D913C91579721503109E8
:1008200057963C932E93569723C09696ED91FC9144
:10083000979794962D913C919597E217F30729F499
:1008400092962D913C91939707C09696ED91FC91CD
:1008500097979F012F5F3F4F97963C932E939697C4
:10086000908107C02150310955963C932E9354979F
:100870009EE759969C93599759969C9159979B310D
:1008800089F596964D915C91979798962D913C910C
:1008900099974217530739F410921301A659BF4F85
:1008A0001C92299808959696ED91FC9197979496AD
:1008B0008D919C919597E817F90729F492968D915F
:1008C0009C91939706C09696ED91FC919797CF01D6
:1008D000019697969C938E939697808159968C93C8
:1008E000599706C09E57923018F45B961C925B97FE
:1008F00081E05A968C935A975B968C915B975F96A2
:100900002D913C9190978823A9F05C968C915C97EF
:10091000853080F05C961C925C972034310519F08C
:1009200080E490E002C085E790E090969C938E93DF
:100930005F9723C05A968C915A9759969C915997D4
:10094000982341F05C969C915C979F5F5C969C938A
:100950005C970FC05C961C925C972034310519F0AF
:1009600020E430E002C025E730E090963C932E93DF
:100970005F97880F5A968C935A9788E058968C9375
:1009800058975F96ED91FC9190975D968D919C9113
:100990005E97E80FF91F9F0131705E963C932E938E
:1009A0005D9758968C915897815058968C93FF2755
:1009B000E038F10530F08FEF90E0AC014E1B5F0B9B
:1009C000FA01E859FF4F84912F3F310511F008F0EB
:1009D00080950895EF92FF920F931F93CF93DF932B
:1009E000FC018C010D531F4FD8014D915C91119763
:1009F000129711965C934E93A555B10914968D915B
:100A00009C91159712962D913C91139782179307FD
:100A100021F42D913C91119707C014968D919C91D2
:100A200015979C012F5F3F4F15963C932E9314977B
:100A3000EC012881260290011124C9019595879522
:100A400095958795E801998388837F01D7ECED0E12
:100A5000F11CE701288139818F010B531F4FE801F9
:100A600039832883840F951F35952795820F931F0F
:100A7000E70199838883AF0147535F4F21E0181640
:100A800019060CF420E0EA018881880F822B888304
:100A900016968D919C911797EC01688316962D916F
:100AA0003C91179712968D919C91139728173907AF
:100AB00021F48D919C91119705C016968D919C9172
:100AC0001797019617969C938E931697DA018C913F
:100AD000982F9695969589278370DF01A653BF4F6F
:100AE000833049F48C91803214F48F5F01C08150BF
:100AF0008C9311A203C081A18F5F81A38C91885F29
:100B0000803414F48C936BC18F738C93DF01A553E5
:100B1000BF4F8C91880F8C93EA01988197702BEFCF
:100B2000290F233010F0933011F481608C938C9155
:100B3000982F96958927809581709685990F892B96
:100B400086878E3709F052C0DF01A758BF4F149631
:100B50002D913C9115978D919C91119728173907EC
:100B600059F416962D913C91179712968D919C9160
:100B7000139728173907B1F116962D913C911797C5
:100B800014968D919C91159701972817390751F16B
:100B90001696CD91DC9117978EE7888316962D9146
:100BA0003C91179712968D919C91139728173907AE
:100BB00021F48D919C91119705C016968D919C9171
:100BC0001797019617969C938E93169791E0918BA9
:100BD0008389863020F4128A8F5F838B01C0928BC9
:100BE00081E0BFC0118A128A138ABAC08F778F370B
:100BF00011F4118A09C08289882311F02A9A01C050
:100C00002A988189811103C0128A138AE8C08685D7
:100C1000982F9F739E3309F4E2C080FF03C0808940
:100C20008068808B97859F5F97878089983008F4CC
:100C30009DC0DF01A758BF4F92E8980F923018F07F
:100C40008B3109F046C014962D913C9115978D91EA
:100C50009C9111972817390759F416962D913C91BC
:100C6000179712968D919C9113972817390759F170
:100C700016962D913C91179714968D919C911597EE
:100C8000019728173907F9F01696CD91DC9117973F
:100C90008BE1888316962D913C91179712968D9132
:100CA0009C9113972817390721F48D919C911197E6
:100CB00005C016968D919C911797019617969C9357
:100CC0008E93169706C0118A128A138A2A9880E09A
:100CD00001C081E014964D915C9115972D913C9146
:100CE00011974217530759F416964D915C91179737
:100CF00012962D913C9113974217530769F116965E
:100D00004D915C91179714962D913C911597215018
:100D100031094217530701F190891696CD91DC9164
:100D20001797988316964D915C91179712962D916F
:100D30003C9113974217530721F42D913C91119741
:100D400006C016962D913C9117972F5F3F4F17962F
:100D50003C932E93169705C0118A128A138A2A98FB
:100D600080E0108A1786882321F039C08695808B11
:100D700036C0EF01C453DF4F888199818160998328
:100D80008883DF01A758BF4F14962D913C9115978A
:100D90008D919C9111972817390759F416962D912A
:100DA0003C91179712968D919C91139728173907AC
:100DB00061F016962D913C91179714968D919C9108
:100DC000159701972817390751F416968D919C9124
:100DD000179715969C938E9314971982188281A168
:100DE000813618F011A2128A2A98DF91CF911F91B3
:100DF0000F91FF90EF9008951F920F920FB60F92F0
:100E000011242F933F934F935F936F937F938F930F
:100E10009F93AF93BF93EF93FF9380E286BB609164
:100E2000780070917900769567957695679560580A
:100E300080919C0690919D060E94EA048091130186
:100E4000882349F080919C0690919D060E94C303DF
:100E5000807F886001C080E88BB980918606909180
:100E60008706A0918806B09189060196A11DB11D43
:100E70008093860690938706A0938806B093890690
:100E8000FF91EF91BF91AF919F918F917F916F9162
:100E90005F914F913F912F910F900FBE0F901F9038
:100EA00018950F931F93CF938C01C62F82E8860F5E
:100EB000823010F06B3139F4F801608171818BE17F
:100EC00090E00E940115F801608171818C2F90E003
:100ED000CF911F910F910C9401150F931F93CF93F6
:100EE000DF938C010F5A1D4FD8012D913C91119722
:100EF000232B39F1EC01498550E01D972D913C9150
:100F000011972C503109241B350B11963C932E93CD
:100F1000FC016D917C9111979F01281B390B2617BD
:100F2000370738F49F01240F351FE9012A852193E3
:100F3000F0CFD801ED91FC91DF91CF911F910F91EE
:100F40000994DF91CF911F910F910895AF92BF92B5
:100F5000CF92DF92EF92FF920F931F93CF93DF9385
:100F60005B016A017C0126EBE21A2DEFF20A2FEFFA
:100F70003FEFF70131832083EC01C05CDD4F6881D6
:100F800079818EE790E00E9401158501CA0CDB1C77
:100F90000C151D0539F0F80161918F01CE010E94F9
:100FA0005107F6CFF701608111816095CE010E9453
:100FB0005107612F6095CE010E94510768817981A8
:100FC0008EE790E0DF91CF911F910F91FF90EF900E
:100FD000DF90CF90BF90AF900C940115CF93DF932B
:100FE000EEE6F2E0DC01EF011D922197E9F7FC014A
:100FF000E05CFD4F518340837196318320833F979E
:101000007183608338962FEF3FEF318320833297CF
:1010100031832083EEE9F6E031832083338322831A
:10102000DF91CF9108952F923F924F925F926F92EE
:101030007F928F929F92AF92BF92CF92DF92EF9268
:10104000FF920F931F93CF93DF93CDB7DEB728970F
:101050000FB6F894DEBF0FBECDBF982F917083FB03
:10106000442440F8512C81FBAA24A0F8B12C920111
:101070002A253B253A83298384FB332730F93B8398
:101080001C8286FB662460F8712C82FB002700F925
:1010900010E085FB882480F8912C8078A82FB0E0A0
:1010A0001D01220C232C221C3308862F817063FB28
:1010B000222720F930E061FB442740F950E0422725
:1010C000532764FBEE27E0F9F0E066FBEE24E0F83E
:1010D000F12C62FBCC24C0F8D12C65FB772770F98A
:1010E0007D831E82607870E0660F672F661F770B26
:1010F000DF01AE25BF25B887AF83ED81FE81AE2726
:10110000BF27A627B7275A01AC24BD246A257B2513
:101110006295660F660F607CA62EF0E8AF9FA01860
:101120001124AB81BC81A625B7256A2F6170692780
:1011300079817170562F57276A2D650FA980BA8063
:10114000A026B126A22474E0A79E600D1124A82534
:10115000B925A225B325E8E0AE9F600D1124EF81EB
:10116000E170E82741704E27F0E14F9F600D112498
:101170004D815E814C255D25417084272E253F25BC
:101180002170282730E2239F600D1124082519259E
:101190000170802F8927A30144255525942F917034
:1011A0008927880F860F28960FB6F894DEBF0FBEEA
:1011B000CDBFDF91CF911F910F91FF90EF90DF9006
:1011C000CF90BF90AF909F908F907F906F905F90E7
:1011D0004F903F902F9008952F923F924F925F92A1
:1011E0006F927F928F929F92AF92BF92CF92DF9237
:1011F000EF92FF920F931F93CF93DF9300D000D015
:10120000CDB7DEB79C01DC01AB5ABD4F9C91F90113
:10121000E90FF11DEA5AFD4F60839F5F9C939C305C
:1012200009F088C34901C901805C9D4F9C838B8371
:101230001196BA83A9839C91892F881F8827881FBC
:101240008795882787955901B9EAAB1ABDEFBB0A84
:10125000F5014081942F991F9927991F682FF0E479
:101260009F9F600D1124690120EAC21A2DEFD20A56
:10127000D6019C91892F881F8827881F860F7401AB
:10128000B7EAEB1ABDEFFB0AF7014081942F991FD3
:101290009927991FF0E29F9F800D11248401065A1F
:1012A0001D4FD8014C91942F991F9927991FB0E198
:1012B0009B9F800D11243401E4EA6E1AEDEF7E0A43
:1012C000D3014C91942F991F9927991FB8E09B9FA8
:1012D000800D11242401E3EA4E1AEDEF5E0AD201DB
:1012E0009C91692F661F6627661F660F660F680F41
:1012F0001401B1EA2B1ABDEF3B0AF1018081982F4E
:10130000991F9927991F990F690F8B819C810E94C2
:101310005107A981BA819C9181E096FF80E0879571
:1013200088278795F501408191E046FF90E0682F7E
:10133000F0E49F9F600D1124D6019C9181E096FFFF
:1013400080E0860FF701408191E046FF90E0F0E2F7
:101350009F9F800D1124D8014C9191E046FF90E0B1
:10136000B0E19B9F800D1124F301408191E046FF85
:1013700090E0F8E09F9F800D1124D2019C9161E0E4
:1013800096FF60E0660F660F680FF101808191E0C3
:1013900086FF90E0990F690F8B819C810E94510715
:1013A000A981BA819C9181E095FF80E0879588278B
:1013B0008795F501408191E045FF90E0682FF0E4CA
:1013C0009F9F600D1124D6019C9181E095FF80E0E4
:1013D000860FF701408191E045FF90E0F0E29F9F8A
:1013E000800D1124D8014C9191E045FF90E0B0E1CF
:1013F0009B9F800D1124F301408191E045FF90E017
:10140000F8E09F9F800D1124D2019C9161E095FF2F
:1014100060E0660F660F680FF101808191E085FF43
:1014200090E0990F690F8B819C810E945107A981DF
:10143000BA819C9181E094FF80E087958827879509
:10144000F501408191E044FF90E0682FF0E49F9F18
:10145000600D1124D6019C9181E094FF80E0860FFD
:10146000F701408191E044FF90E0F0E29F9F800D02
:101470001124D8014C9191E044FF90E0B0E19B9F92
:10148000800D1124F301408191E044FF90E0F8E0E9
:101490009F9F800D1124D2019C9161E094FF60E038
:1014A000660F660F680FF101808191E084FF90E084
:1014B000990F690F8B819C810E945107C4018A5A40
:1014C0009D4F9A838983DC019C9181E093FF80E0AA
:1014D0008795882787955401B9EAAB1ABDEFBB0AF7
:1014E000F501408191E043FF90E0682FF0E49F9F79
:1014F000600D1124640120EAC21A2DEFD20AD60130
:101500009C9181E093FF80E0860F7401B7EAEB1AAB
:10151000BDEFFB0AF701408191E043FF90E0F0E26C
:101520009F9F800D11248401065A1D4FD8014C91B4
:1015300091E043FF90E0B0E19B9F800D11243401C6
:10154000E4EA6E1AEDEF7E0AD3014C9191E043FF7D
:1015500090E0B8E09B9F800D11242401E3EA4E1A2D
:10156000EDEF5E0AD2019C9161E093FF60E0660FAF
:10157000660F680F1401B1EA2B1ABDEF3B0AF101A7
:10158000808191E083FF90E0990F690F8B819C81AE
:101590000E945107A981BA819C9181E092FF80E06D
:1015A000879588278795F501408191E042FF90E07B
:1015B000682FF0E49F9F600D1124D6019C9181E07B
:1015C00092FF80E0860FF701408191E042FF90E0BA
:1015D000F0E29F9F800D1124D8014C9191E042FFD1
:1015E00090E0B0E19B9F800D1124F301408191E0D8
:1015F00042FF90E0F8E09F9F800D1124D2019C9162
:1016000061E092FF60E0660F660F680FF101808174
:1016100091E082FF90E0990F690F8B819C810E947D
:101620005107A981BA819C9181E091FF80E0879563
:1016300088278795F501408191E041FF90E0682F70
:10164000F0E49F9F600D1124D6019C9181E091FFF1
:1016500080E0860FF701408191E041FF90E0F0E2E9
:101660009F9F800D1124D8014C9191E041FF90E0A3
:10167000B0E19B9F800D1124F301408191E041FF77
:1016800090E0F8E09F9F800D1124D2019C9161E0D1
:1016900091FF60E0660F660F680FF101808191E0B5
:1016A00081FF90E0990F690F8B819C810E94510707
:1016B000A981BA819C91F501808181708295880F02
:1016C000880F807CF0E89F9F80191124D6019C919F
:1016D0009170890FF70190819170F0E29F9F800DCA
:1016E0001124D8019C919170B0E19B9F800D112431
:1016F000F30190819170F8E09F9F800D1124D20139
:101700006C916170660F660F680FF10190819170A6
:10171000990F690F8B819C810E9451075401F8EA4F
:10172000AF1AFDEFBF0AD5016C916401B5EACB1A7F
:10173000BDEFDB0AF60170817401F2EAEF1AFDEFEA
:10174000FF0AD7019C9184010F591D4FF801408178
:10175000862F881F8827881F87958827879551E0BF
:1017600063FF50E0682FF0E45F9F600D112481E07B
:1017700043FF80E0860F572F551F5527551F20E246
:10178000529F800D112451E073FF50E0A0E15A9F59
:10179000800D1124592F551F5527551FB8E05B9F09
:1017A000800D112461E093FF60E0660F660F680F03
:1017B000942F991F9927991F990F690F8B819C81ED
:1017C0000E945107F5016081D6017C91F70190815B
:1017D000D8014C9181E066FF80E087958827879546
:1017E00051E062FF50E0682FB0E45B9F600D112470
:1017F00081E042FF80E0860F51E076FF50E0E0E2BA
:101800005E9F800D112451E072FF50E0F0E15F9F78
:10181000800D112451E096FF50E028E0529F800D8A
:10182000112461E092FF60E0660F660F680F91E09F
:1018300046FF90E0990F690F8B819C810E945107B0
:10184000D5016C91F6017081D7019C91F80140811E
:1018500081E065FF80E087958827879551E061FFEB
:1018600050E0682FF0E45F9F600D112481E041FF9C
:1018700080E0860F51E075FF50E020E2529F800D1E
:10188000112451E071FF50E0A0E15A9F800D112416
:1018900051E095FF50E0B8E05B9F800D112461E0BE
:1018A00091FF60E0660F660F680F91E045FF90E0E2
:1018B000990F690F8B819C810E945107D501EC9192
:1018C000D6017C91D7015C91D8014C919E2F9170EB
:1018D000872F81708295807FB0E49B9F800D1124BB
:1018E000642F6170860F952F9170990F990F890F52
:1018F00091E0E4FF90E0E0E89E9F8019112491E0E0
:1019000074FF90E0F0E29F9F800D112491E054FF5E
:1019100090E028E0929F800D112461E044FF60E098
:10192000660F680F8B819C810E945107F401EB5A6E
:10193000FD4F10820F900F900F900F90DF91CF917D
:101940001F910F91FF90EF90DF90CF90BF90AF90DD
:101950009F908F907F906F905F904F903F902F90CF
:1019600008951F93CF93DF93EC01162F0E94EC088C
:10197000DE01A65BBD4F2D913C911197F901E12746
:10198000FF27EE0FFF1FE851FF4F85919491232F02
:101990003327282739272D933C93809115018823DD
:1019A00049F0612F809114010E941308682FCE0125
:1019B0000E94EC08109314019091150181E0892791
:1019C00080931501DF91CF911F9108950F931F937D
:1019D000CF93DF93EC018B01FB0161810E94B10C7D
:1019E000F8016081CE010E94B10CF8016381CE0143
:1019F0000E94B10CF8016281CE01DF91CF911F915D
:101A00000F910C94B10C6F927F928F929F92AF9234
:101A1000BF92CF92DF92EF92FF920F931F93CF93DB
:101A2000DF93CDB7DEB72A970FB6F894DEBF0FBEAF
:101A3000CDBF8C013A016901FC01EB5AFD4F1082C8
:101A40005C0186EBA81A8DEFB80A8FEF9FEFF501C6
:101A500091838083CE0101967C018AE0F701119287
:101A60008A95E9F7F801EE5BFD4F0190F081E02DDA
:101A7000808191819A838983828193819C838B83E6
:101A8000FB01808191819E838D83828193819887E0
:101A90008F838CE0820F877011F41A8603C098E060
:101AA000981B9A874801F0EC8F1AFDEF9F0AF4010A
:101AB000608171818EE790E00E940115B701C80135
:101AC0000E94E60CBE016B5F7F4FC8010E94E60CCE
:101AD0006985C8010E94B10C6A85C8010E94B10CD9
:101AE0008A859FEF980F9A87882311F060E0F5CFE1
:101AF0007301C60CD71CEC14FD0439F0F701619199
:101B00007F01C8010E94B10CF6CFF5016081F18020
:101B10006095C8010E94B10C6F2D6095C8010E94AC
:101B2000B10CF401608171818EE790E00E94011593
:101B30002A960FB6F894DEBF0FBECDBFDF91CF91CE
:101B40001F910F91FF90EF90DF90CF90BF90AF90DB
:101B50009F908F907F906F9008959A01AB016EE9EE
:101B600076E00C94030D6F927F928F929F92AF92CA
:101B7000BF92CF92DF92EF92FF920F931F93CF937A
:101B8000DF938C010E591D4FF801B080EC01CD5947
:101B9000DD4F5881DC01AC59BD4FDC903C01FBE9C5
:101BA0006F1AFDEF7F0AF30170819C012A593D4FA6
:101BB000F90160812F5F3F4FF90140812F5F3F4F57
:101BC000F90130817C01F7E9EF1AFDEFFF0AF70117
:101BD00020817C01F6E9EF1AFDEFFF0AF701C080D2
:101BE0007C01F5E9EF1AFDEFFF0AF701A0807C0107
:101BF000F4E9EF1AFDEFFF0AF70190807C01F3E9A9
:101C0000EF1AFDEFFF0AF701F080EB2CEE1CEE243B
:101C1000EE1CE794EE24E794852E881C8824881C0B
:101C2000F0E48F9EE00C11248E2CE22EEE1CEE24AC
:101C3000EE1CE80C8D2C881C8824881CE0E28E9E0B
:101C4000E00C1124872E881C8824881CF0E18F9ECC
:101C5000E00C1124862E881C8824881CE8E08E9EC7
:101C6000E00C1124842E881C8824881C880C880C85
:101C7000E80C832E881C8824881C880CE80CF8014A
:101C8000E08211E0B6FE10E017951127179501E0EC
:101C900056FF00E0F0E40F9F100D1124012F11E01A
:101CA00026FF10E0100F01E0D6FE00E0E0E20E9FFC
:101CB000100D112401E076FF00E0F0E10F9F100D00
:101CC000112401E066FF00E0E8E00E9F100D1124F2
:101CD00001E046FF00E0000F000F100F01E036FFAB
:101CE00000E0000F100F1883CC2DCC1FCC27CC1F89
:101CF000C795CC27C795DA2DDD1FDD27DD1FF0E462
:101D0000DF9FC00D1124DC2FC1E0F6FEC0E0CD0F37
:101D1000D92DDD1FDD27DD1FE0E2DE9FC00D112480
:101D2000DF2DDD1FDD27DD1FF0E1DF9FC00D11245A
:101D3000D1E0C6FED0E0E8E0DE9FC00D1124D1E086
:101D4000A6FED0E0DD0FDD0FCD0FD1E096FED0E096
:101D5000DD0FCD0FCC93A1E0B5FEA0E0A795AA279B
:101D6000A795B1E055FFB0E0F0E4BF9FA00D1124AE
:101D7000BA2FA1E025FFA0E0AB0FB1E0D5FEB0E0A7
:101D8000C0E2BC9FA00D1124B1E075FFB0E0E0E11E
:101D9000BE9FA00D1124B1E065FFB0E0F8E0BF9F49
:101DA000A00D1124B1E045FFB0E0BB0FBB0FAB0F9E
:101DB000B1E035FFB0E0BB0FAB0FF301A083FC0136
:101DC000EA59FD4FA1E0B4FEA0E0A795AA27A79588
:101DD000B1E054FFB0E0C0E4BC9FA00D1124BA2FC5
:101DE000A1E024FFA0E0AB0FB1E0D4FEB0E0C0E280
:101DF000BC9FA00D1124B1E074FFB0E0C0E1BC9F16
:101E0000A00D1124B1E064FFB0E0C8E0BC9FA00DBC
:101E10001124B1E044FFB0E0BB0FBB0FAB0FB1E04A
:101E200034FFB0E0BB0FAB0FA083FC01E959FD4FBD
:101E3000A1E0C5FEA0E0A795AA27A795B1E0A5FE61
:101E4000B0E0C0E4BC9FA00D1124BA2FA1E0F4FEC5
:101E5000A0E0AB0FB1E095FEB0E0C0E2BC9FA00DEA
:101E60001124B1E0F5FEB0E0C0E1BC9FA00D11244B
:101E7000B1E0C4FEB0E0C8E0BC9FA00D1124B1E009
:101E8000A4FEB0E0BB0FBB0FAB0FB1E094FEB0E01F
:101E9000BB0FAB0FA083FC01E859FD4FA1E0B3FEDF
:101EA000A0E0A795AA27A795B1E053FFB0E0C0E452
:101EB000BC9FA00D1124BA2FA1E023FFA0E0AB0F1F
:101EC000B1E0D3FEB0E0C0E2BC9FA00D1124B1E0B0
:101ED00073FFB0E0C0E1BC9FA00D1124B1E063FF2F
:101EE000B0E0C8E0BC9FA00D1124B1E043FFB0E01A
:101EF000BB0FBB0FAB0FB1E033FFB0E0BB0FAB0FBD
:101F0000A083FC01E759FD4FA1E0B2FEA0E0A79538
:101F1000AA27A795B1E052FFB0E0C0E4BC9FA00D96
:101F20001124BA2FA1E022FFA0E0AB0FB1E0D2FE56
:101F3000B0E0C0E2BC9FA00D1124B1E072FFB0E0A0
:101F4000C0E1BC9FA00D1124B1E062FFB0E0C8E089
:101F5000BC9FA00D1124B1E042FFB0E0BB0FBB0F4E
:101F6000AB0FB1E032FFB0E0BB0FAB0FA083FC01C1
:101F7000E659FD4FA1E0C3FEA0E0A795AA27A795CB
:101F8000B1E0A3FEB0E0C0E4BC9FA00D1124BA2FC5
:101F9000A1E0F2FEA0E0AB0FB1E093FEB0E0C0E242
:101FA000BC9FA00D1124B1E0F3FEB0E0C0E1BC9FE6
:101FB000A00D1124B1E0C2FEB0E0C8E0BC9FA00DAE
:101FC0001124B1E0A2FEB0E0BB0FBB0FAB0FB1E03C
:101FD00092FEB0E0BB0FAB0FA083FC01E559FD4FB3
:101FE000A1E0B1FEA0E0A795AA27A795B1E051FF17
:101FF000B0E0C0E4BC9FA00D1124BA2FA1E021FFE6
:10200000A0E0AB0FB1E0D1FEB0E0C0E2BC9FA00DFC
:102010001124B1E071FFB0E0C0E1BC9FA00D11241C
:10202000B1E061FFB0E0C8E0BC9FA00D1124B1E0B9
:1020300041FFB0E0BB0FBB0FAB0FB1E031FFB0E031
:10204000BB0FAB0FA083FC01E459FD4F51705295BB
:10205000550F550F507CA0E8BA9E501911242170DD
:10206000250F5D2D5170C0E25C9F200D1124717011
:1020700050E1759F200D11246170A8E06A9F200D2A
:1020800011244170440F440F240F3170330F230F7C
:10209000208331968C2D81709A2D9170990F990F14
:1020A000C8E08C9F900D11248F2D8170980F292DE1
:1020B0002170220F920F81E0C1FE80E020E8829F14
:1020C0009019112481E0A1FE80E050E4859F900DDD
:1020D000112481E091FE80E0A0E28A9F900D1124FE
:1020E00081E0F1FE80E0C0E18C9F900D112490838F
:1020F000DF91CF911F910F91FF90EF90DF90CF90E4
:10210000BF90AF909F908F907F906F9008952F9287
:102110003F924F925F926F927F928F929F92AF9277
:10212000BF92CF92DF92EF92FF920F931F93CF93C4
:10213000DF93CDB7DEB72B970FB6F894DEBF0FBE97
:10214000CDBF8C014C012DEA821A2DEF920A5C0161
:102150003CEAA31A3DEFB30A7C014CEBE41A4DEFC5
:10216000F40A9C01235B3D4F3C832B831C0133E924
:10217000231A3DEF330A9C01245B3D4F38872F83A0
:10218000F801E05CFD4F808191810E94C3149C01A5
:10219000019609F45BC1D4014C91442309F4F2C0C7
:1021A0002B31310529F4F5018081882309F4EAC037
:1021B000F801EA5BFD4F80819181019691838083D4
:1021C0006CE070E00E941D14892B09F0DBC02B31FC
:1021D000310529F0C9018E579109029710F4D501F4
:1021E0001C92F70180819181F801EE59FD4F8D56C7
:1021F0009240DF01A80FB91F4C914193E215F305FE
:10220000C1F7D1012C93C8010E94B30DF7014080A2
:102210005180F3E04F1A5108D7014D925C9268014A
:10222000BCE9CB1ABDEFDB0A612C712C9801285B4D
:102230003D4F3E832D83F6013297208131963081C8
:10224000D6019C91632F822F29873A879B870E9412
:102250001308EF81F88580839B85892729853A8536
:10226000882309F451C0982F9F70998382958F70AD
:102270008A83FE01319680E090E041915FEF540F38
:102280005230E8F14430D9F14830C9F1433009F413
:10229000DBC0453041F0463059F0473071F050E036
:1022A000493089F002C052E013C04A3071F002C0D8
:1022B00054E00EC04B3059F002C058E009C04C3019
:1022C00009F4BDC005C050E103C050E201C050E4B4
:1022D0008130910509F0AFC025274423A9F0AB81D7
:1022E000BC814D915D916D917C9113974F5F5F4FD4
:1022F0006F4F7F4F4D935D936D937C931397019731
:1023000019F081E090E0B9CFED81FE8140815181EB
:10231000FA01E227FF27EE0FFF1FE851FF4F6591FB
:102320007491852F992786279727FC01E327FF279C
:10233000EE0FFF1FE851FF4F45915491892F9927C8
:1023400084279527AD81BE818D939C93C30163E063
:1023500070E00E943114660F771F640D751D600FC9
:10236000711FFB013897208331963083B3E06B0EE9
:10237000711CE3E0CE0ED11CFCE06F16710409F075
:102380005ACFFECED5018C9181113BC02E3731053D
:1023900059F5F701808191819801285B3D4F6901D2
:1023A0000C9750F0D9018D919C91883B904F21F46E
:1023B0002A9AC8010E946D0781E0F40180838FEFA3
:1023C0009FEFD6018D939C93F70111821082F80143
:1023D000EA5BFD4F11821082AB81BC811D921D9280
:1023E0001D921C921397CCCE2F37310519F4F401AE
:1023F0001082C6CE2B31310521F481E0D5018C93BA
:10240000BFCE4423A1F0F701808191818034F2E0B6
:102410009F0758F4AC014F5F5F4FD7014D935C931A
:10242000F801E80FF91F208302C0F4011082D501E2
:102430001C92A6CE50E83527411151CF60CF813094
:102440009105C1F720584BCF51E042CF2B960FB6E4
:10245000F894DEBF0FBECDBFDF91CF911F910F91DA
:10246000FF90EF90DF90CF90BF90AF909F908F90B4
:102470007F906F905F904F903F902F900895909332
:10248000A3068093A20650938B0640938A0670930E
:10249000A6066093A5060895EF92FF920F931F93EF
:1024A000CF93DF93EC0160918A0670918B0680ECEC
:1024B00090E00E94011560918A0670918B0680E081
:1024C00090E00E9401158E017E018CEBE81A8DEFE1
:1024D000F80AF7018081918160918A0670918B06DC
:1024E00098012C1B3D0B2817390708F5F80181913D
:1024F0008F01803C59F48BED90E00E9401156091B2
:102500008A0670918B068CED90E00EC08B3D59F4DD
:102510008BED90E00E94011560918A0670918B0608
:102520008DED90E001C090E00E940115D2CF80ECCB
:1025300090E0DF91CF911F910F91FF90EF900C945D
:1025400001154F925F926F927F928F929F92AF92FE
:10255000BF92EF92FF920F931F93CF93DF93EC0103
:102560008B017A01E091A506F091A606818981117F
:1025700045C00E94B31490910001891798F4A701F7
:10258000B801CE01DF91CF911F910F91FF90EF9095
:10259000BF90AF909F908F907F906F905F904F9083
:1025A0000C94AD0D8FB7F8948090860690908706B6
:1025B000A0908806B09089068FBF209101013091CC
:1025C00002014091030150910401AAE0B0E00E9491
:1025D00012142FB7F89440908606509087066090AA
:1025E0008806709089062FBF481859086A087B082A
:1025F000461657066806790664F3B4CFE091A5063F
:10260000F091A6068189882309F4ACCF8091A206B7
:102610009091A3060E948710E091A506F091A6066E
:10262000E453FF4F80819181892B41F31182108205
:10263000DF91CF911F910F91FF90EF90BF90AF90DE
:102640009F908F907F906F905F904F900895882318
:1026500099F04091AC065091AD0666E171E0809131
:10266000A2069091A3060E94A1121092A7061092B2
:10267000AD061092AC0608958091A7068823D9F084
:102680002FB7F8948091860690918706A0918806CE
:10269000B09189062FBF4091A8065091A90660917C
:1026A000AA067091AB06841B950BA60BB70BC397BC
:1026B000A105B10574F608959091A7069923A1F09C
:1026C000803C01F580910D01811111C01092A70687
:1026D0004091AC065091AD0666E171E08091A20692
:1026E0009091A3060C94A112803C09F07BC081E07C
:1026F0008093A7068EEF80930D011092AD06109285
:10270000AC0608952091AC063091AD06243392E0DA
:10271000390708F067C090910D012115310531F49A
:102720009E3F21F48F7080930D01089591111FC079
:102730008B3D21F481E08093A40608959091A40636
:10274000992349F08C3D21F08D3D19F48BED01C0AA
:1027500080EC1092A406A9014F5F5F4F5093AD0625
:102760004093AC06F901EA5EFE4F808308959130F4
:1027700079F4282F30E0AAE0B0E00E9403146093BF
:10278000090170930A0180930B0190930C01089545
:10279000943089F42AE0829FC0011124AA2797FD72
:1027A000A095BA2F8093050190930601A09307018D
:1027B000B09308010895933089F42AE0829FC00104
:1027C0001124AA2797FDA095BA2F80930101909319
:1027D0000201A0930301B09304010895923011F413
:1027E0008093000108950E9495018AE493E00E947D
:1027F000871080E00E9410028823B9F30E941A0219
:102800000E945C13F2CFA29FB001B39FC001A39FAF
:10281000700D811D1124911DB29F700D811D112419
:10282000911D08950E940314A59F900DB49F900DD3
:10283000A49F800D911D11240895AA1BBB1B51E17B
:1028400007C0AA1FBB1FA617B70710F0A61BB70B20
:10285000881F991F5A95A9F780959095BC01CD01C5
:10286000089597FB072E16F4009407D077FD09D042
:102870000E941D1407FC05D03EF4909581959F4F52
:102880000895709561957F4F0895A1E21A2EAA1BB5
:10289000BB1BFD010DC0AA1FBB1FEE1FFF1FA21710
:1028A000B307E407F50720F0A21BB30BE40BF50B0D
:1028B000661F771F881F991F1A9469F76095709596
:1028C000809590959B01AC01BD01CF0108958F9239
:1028D0009F92AF92BF92CF92DF92EF92FF92CF93EF
:1028E000DF93EC01688179818A819B816115710593
:1028F0008105910521F464E279ED8BE597E02DE106
:1029000033EF41E050E00E94411549015A019B011B
:10291000AC01A7EAB1E40E9412146B017C01ACEE99
:10292000B4EFA50194010E943C15DC01CB018C0D94
:102930009D1DAE1DBF1DB7FF03C00197A109B04883
:1029400088839983AA83BB839F77DF91CF91FF9080
:10295000EF90DF90CF90BF90AF909F908F900895B1
:102960000E94671408958EE091E00E946714089514
:10297000A0E0B0E080930E0190930F01A0931001AE
:10298000B09311010895CF93DF93EC012B8120FFC9
:1029900033C026FF0AC02F7B2B838E819F81019637
:1029A0009F838E838A8190E029C022FF0FC0E88137
:1029B000F9818081992787FD9095009719F420620D
:1029C0002B831AC03196F983E8830EC0EA85FB8514
:1029D000099597FF09C02B81019611F080E201C093
:1029E00080E1822B8B8308C02E813F812F5F3F4F78
:1029F0003F832E83992702C08FEF9FEFDF91CF9106
:102A000008950F931F93CF93DF93FB01238121FD43
:102A100003C08FEF9FEF28C022FF16C04681578169
:102A2000248135814217530744F4A081B1819D016F
:102A30002F5F3F4F318320838C93268137812F5F17
:102A40003F4F3783268310C0EB01092F182F0084D6
:102A5000F185E02D0995892BE1F68E819F81019604
:102A60009F838E83812F902FDF91CF911F910F91A4
:102A70000895B7FF0C9412140E941214821B930B3A
:102A80000895052E97FB1EF400940E94581557FDDB
:102A900007D00E94451407FC03D04EF40C9458153F
:102AA00050954095309521953F4F4F4F5F4F08957A
:102AB00090958095709561957F4F8F4F9F4F0895AA
:042AC000F894FFCFB8
:102AC400FFC8000000320000005E010000FE0100AB
:022AD400000000
:00000001FF

@ -0,0 +1,88 @@
// Based on work by Francesco Sacchi
#include <string.h>
#include <ctype.h>
#include "AX25.h"
#include "protocol/HDLC.h"
#include "util/CRC-CCIT.h"
#include "../hardware/AFSK.h"
#define countof(a) sizeof(a)/sizeof(a[0])
#define MIN(a,b) ({ typeof(a) _a = (a); typeof(b) _b = (b); ((typeof(_a))((_a < _b) ? _a : _b)); })
#define DECODE_CALL(buf, addr) for (unsigned i = 0; i < sizeof((addr)); i++) { char c = (*(buf)++ >> 1); (addr)[i] = (c == ' ') ? '\x0' : c; }
#define AX25_SET_REPEATED(msg, idx, val) do { if (val) { (msg)->rpt_flags |= _BV(idx); } else { (msg)->rpt_flags &= ~_BV(idx) ; } } while(0)
void ax25_init(AX25Ctx *ctx, FILE *channel, ax25_callback_t hook) {
memset(ctx, 0, sizeof(*ctx));
ctx->ch = channel;
ctx->hook = hook;
ctx->crc_in = ctx->crc_out = CRC_CCIT_INIT_VAL;
}
static void ax25_decode(AX25Ctx *ctx) {
#if SERIAL_PROTOCOL == PROTOCOL_KISS
if (ctx->hook) ctx->hook(ctx);
#endif
}
void ax25_poll(AX25Ctx *ctx) {
int c;
while ((c = fgetc(ctx->ch)) != EOF) {
if (!ctx->escape && c == HDLC_FLAG) {
if (ctx->frame_len >= AX25_MIN_FRAME_LEN) {
if (ctx->crc_in == AX25_CRC_CORRECT) {
#if OPEN_SQUELCH == true
LED_RX_ON();
#endif
ax25_decode(ctx);
}
}
ctx->sync = true;
ctx->crc_in = CRC_CCIT_INIT_VAL;
ctx->frame_len = 0;
continue;
}
if (!ctx->escape && c == HDLC_RESET) {
ctx->sync = false;
continue;
}
if (!ctx->escape && c == AX25_ESC) {
ctx->escape = true;
continue;
}
if (ctx->sync) {
if (ctx->frame_len < AX25_MAX_FRAME_LEN) {
ctx->buf[ctx->frame_len++] = c;
ctx->crc_in = update_crc_ccit(c, ctx->crc_in);
} else {
ctx->sync = false;
}
}
ctx->escape = false;
}
}
static void ax25_putchar(AX25Ctx *ctx, uint8_t c)
{
if (c == HDLC_FLAG || c == HDLC_RESET || c == AX25_ESC) fputc(AX25_ESC, ctx->ch);
ctx->crc_out = update_crc_ccit(c, ctx->crc_out);
fputc(c, ctx->ch);
}
void ax25_sendRaw(AX25Ctx *ctx, void *_buf, size_t len) {
ctx->crc_out = CRC_CCIT_INIT_VAL;
fputc(HDLC_FLAG, ctx->ch);
const uint8_t *buf = (const uint8_t *)_buf;
while (len--) ax25_putchar(ctx, *buf++);
uint8_t crcl = (ctx->crc_out & 0xff) ^ 0xff;
uint8_t crch = (ctx->crc_out >> 8) ^ 0xff;
ax25_putchar(ctx, crcl);
ax25_putchar(ctx, crch);
fputc(HDLC_FLAG, ctx->ch);
}

@ -0,0 +1,40 @@
#ifndef PROTOCOL_AX25_H
#define PROTOCOL_AX25_H
#include <stdio.h>
#include <stdbool.h>
#include "device.h"
#define AX25_MIN_FRAME_LEN 18
#ifndef CUSTOM_FRAME_SIZE
#define AX25_MAX_FRAME_LEN 620
#else
#define AX25_MAX_FRAME_LEN CUSTOM_FRAME_SIZE
#endif
#define AX25_CRC_CORRECT 0xF0B8
#define AX25_CTRL_UI 0x03
#define AX25_PID_NOLAYER3 0xF0
struct AX25Ctx; // Forward declarations
struct AX25Msg;
typedef void (*ax25_callback_t)(struct AX25Ctx *ctx);
typedef struct AX25Ctx {
uint8_t buf[AX25_MAX_FRAME_LEN];
FILE *ch;
size_t frame_len;
uint16_t crc_in;
uint16_t crc_out;
ax25_callback_t hook;
bool sync;
bool escape;
} AX25Ctx;
void ax25_poll(AX25Ctx *ctx);
void ax25_sendRaw(AX25Ctx *ctx, void *_buf, size_t len);
void ax25_init(AX25Ctx *ctx, FILE *channel, ax25_callback_t hook);
#endif

@ -0,0 +1,8 @@
#ifndef PROTOCOL_HDLC_H
#define PROTOCOL_HDLC_H
#define HDLC_FLAG 0x7E
#define HDLC_RESET 0x7F
#define LLP_ESC 0x1B
#endif

@ -0,0 +1,159 @@
#include <stdlib.h>
#include <string.h>
#include "device.h"
#include "KISS.h"
static uint8_t serialBuffer[LLP_MAX_DATA_SIZE]; // Buffer for holding incoming serial data
LLPCtx *llpCtx;
Afsk *channel;
Serial *serial;
size_t frame_len;
bool IN_FRAME;
bool ESCAPE;
bool FLOWCONTROL;
uint8_t command = CMD_UNKNOWN;
unsigned long custom_preamble = CONFIG_AFSK_PREAMBLE_LEN;
unsigned long custom_tail = CONFIG_AFSK_TRAILER_LEN;
unsigned long slotTime = 200;
uint8_t p = 255;
ticks_t timeout_ticks;
void kiss_init(LLPCtx *ctx, Afsk *afsk, Serial *ser) {
llpCtx = ctx;
serial = ser;
channel = afsk;
FLOWCONTROL = false;
}
void kiss_messageCallback(LLPCtx *ctx) {
#if (SERIAL_FRAMING == SERIAL_FRAMING_DIRECT)
for (unsigned i = 0; i < ctx->frame_len; i++) {
uint8_t b = ctx->buf[i];
fputc(b, &serial->uart0);
}
#else
fputc(FEND, &serial->uart0);
fputc(0x00, &serial->uart0);
for (unsigned i = 0; i < ctx->frame_len; i++) {
uint8_t b = ctx->buf[i];
if (b == FEND) {
fputc(FESC, &serial->uart0);
fputc(TFEND, &serial->uart0);
} else if (b == FESC) {
fputc(FESC, &serial->uart0);
fputc(TFESC, &serial->uart0);
} else {
fputc(b, &serial->uart0);
}
}
fputc(FEND, &serial->uart0);
#endif
}
void kiss_csma(LLPCtx *ctx, uint8_t *buf, size_t len) {
bool sent = false;
while (!sent) {
//puts("Waiting in CSMA");
if(!channel->hdlc.receiving) {
uint8_t tp = rand() & 0xFF;
if (tp < p) {
//llp_sendRaw(ctx, buf, len);
llp_broadcast(ctx, buf, len);
sent = true;
} else {
ticks_t start = timer_clock();
long slot_ticks = ms_to_ticks(slotTime);
while (timer_clock() - start < slot_ticks) {
cpu_relax();
}
}
} else {
while (!sent && channel->hdlc.receiving) {
// Continously poll the modem for data
// while waiting, so we don't overrun
// receive buffers
llp_poll(llpCtx);
if (channel->status != 0) {
// If an overflow or other error
// occurs, we'll back off and drop
// this packet silently.
channel->status = 0;
sent = true;
}
}
}
}
if (FLOWCONTROL) {
while (!ctx->ready_for_data) { /* Wait */ }
fputc(FEND, &serial->uart0);
fputc(CMD_READY, &serial->uart0);
fputc(0x01, &serial->uart0);
fputc(FEND, &serial->uart0);
}
}
void kiss_checkTimeout(bool force) {
if (force || (IN_FRAME && timer_clock() - timeout_ticks > ms_to_ticks(TX_MAXWAIT))) {
kiss_csma(llpCtx, serialBuffer, frame_len);
IN_FRAME = false;
frame_len = 0;
}
}
void kiss_serialCallback(uint8_t sbyte) {
#if SERIAL_FRAMING == SERIAL_FRAMING_DIRECT
timeout_ticks = timer_clock();
IN_FRAME = true;
serialBuffer[frame_len++] = sbyte;
if (frame_len >= LLP_MAX_DATA_SIZE) kiss_checkTimeout(true);
#else
if (IN_FRAME && sbyte == FEND && command == CMD_DATA) {
IN_FRAME = false;
kiss_csma(llpCtx, serialBuffer, frame_len);
} else if (sbyte == FEND) {
IN_FRAME = true;
command = CMD_UNKNOWN;
frame_len = 0;
} else if (IN_FRAME && frame_len < LLP_MAX_DATA_SIZE) {
// Have a look at the command byte first
if (frame_len == 0 && command == CMD_UNKNOWN) {
// MicroModem supports only one HDLC port, so we
// strip off the port nibble of the command byte
sbyte = sbyte & 0x0F;
command = sbyte;
} else if (command == CMD_DATA) {
if (sbyte == FESC) {
ESCAPE = true;
} else {
if (ESCAPE) {
if (sbyte == TFEND) sbyte = FEND;
if (sbyte == TFESC) sbyte = FESC;
ESCAPE = false;
}
serialBuffer[frame_len++] = sbyte;
}
} else if (command == CMD_TXDELAY) {
custom_preamble = sbyte * 10UL;
} else if (command == CMD_TXTAIL) {
custom_tail = sbyte * 10;
} else if (command == CMD_SLOTTIME) {
slotTime = sbyte * 10;
} else if (command == CMD_P) {
p = sbyte;
} else if (command == CMD_READY) {
if (sbyte == 0x00) {
FLOWCONTROL = false;
} else {
FLOWCONTROL = true;
}
}
}
#endif
}

@ -0,0 +1,32 @@
#ifndef _PROTOCOL_KISS
#define _PROTOCOL_KISS 0x02
#include "../hardware/AFSK.h"
#include "../hardware/Serial.h"
#include "../util/time.h"
#include "LLP.h"
#include "config.h"
#define FEND 0xC0
#define FESC 0xDB
#define TFEND 0xDC
#define TFESC 0xDD
#define CMD_UNKNOWN 0xFE
#define CMD_DATA 0x00
#define CMD_TXDELAY 0x01
#define CMD_P 0x02
#define CMD_SLOTTIME 0x03
#define CMD_TXTAIL 0x04
#define CMD_FULLDUPLEX 0x05
#define CMD_SETHARDWARE 0x06
#define CMD_READY 0x0F
#define CMD_RETURN 0xFF
void kiss_init(LLPCtx *ctx, Afsk *afsk, Serial *ser);
void kiss_csma(LLPCtx *ctx, uint8_t *buf, size_t len);
void kiss_messageCallback(LLPCtx *ctx);
void kiss_serialCallback(uint8_t sbyte);
void kiss_checkTimeout(bool force);
#endif

@ -0,0 +1,696 @@
#include <string.h>
#include <ctype.h>
#include "LLP.h"
#include "protocol/HDLC.h"
#include "util/CRC-CCIT.h"
#include "../hardware/AFSK.h"
#define DISABLE_INTERLEAVE false
#define PASSALL false
#define STRIP_HEADERS true
// The GET_BIT macro is used in the interleaver
// and deinterleaver to access single bits of a
// byte.
inline bool GET_BIT(uint8_t byte, int n) { return (byte & (1 << (8-n))) == (1 << (8-n)); }
// We need an indicator to tell us whether we
// should send a parity byte. This happens
// whenever two normal bytes of data has been
// sent. We also keep the last sent byte in
// memory because we need it to calculate the
// parity byte.
static bool sendParityBlock = false;
static uint8_t lastByte = 0x00;
LLPAddress broadcast_address;
void llp_decode(LLPCtx *ctx) {
if (ctx->hook) {
size_t length = ctx->frame_len;
uint8_t *buffer = (uint8_t*)&ctx->buf;
size_t padding = buffer[LLP_HEADER_SIZE-1];
size_t address_size = 2*sizeof(LLPAddress);
#if STRIP_HEADERS
uint8_t strip_headers = 1;
#else
uint8_t strip_headers = 0;
#endif
size_t subtraction = (address_size + (LLP_HEADER_SIZE - address_size))*strip_headers + padding;
ctx->frame_len = length - subtraction - LLP_CHECKSUM_SIZE;
for (int i = 0; i < ctx->frame_len; i++) {
#if STRIP_HEADERS
buffer[i] = buffer[i+subtraction];
#else
if ( i >= LLP_HEADER_SIZE ) {
buffer[i] = buffer[i+padding];
} else {
buffer[i] = buffer[i];
}
#endif
}
ctx->hook(ctx);
}
}
void llp_poll(LLPCtx *ctx) {
int c;
#if DISABLE_INTERLEAVE
while ((c = fgetc(ctx->ch)) != EOF) {
if (!ctx->escape && c == HDLC_FLAG) {
if (ctx->frame_len >= LLP_MIN_FRAME_LENGTH) {
if (PASSALL || ctx->crc_in == LLP_CRC_CORRECT) {
#if OPEN_SQUELCH == true
LED_RX_ON();
#endif
llp_decode(ctx);
}
}
ctx->sync = true;
ctx->crc_in = CRC_CCIT_INIT_VAL;
ctx->frame_len = 0;
continue;
}
if (!ctx->escape && c == HDLC_RESET) {
ctx->sync = false;
continue;
}
if (!ctx->escape && c == LLP_ESC) {
ctx->escape = true;
continue;
}
if (ctx->sync) {
if (ctx->frame_len < LLP_MAX_FRAME_LENGTH) {
ctx->buf[ctx->frame_len++] = c;
ctx->crc_in = update_crc_ccit(c, ctx->crc_in);
} else {
ctx->sync = false;
}
}
ctx->escape = false;
}
#else
while ((c = fgetc(ctx->ch)) != EOF) {
/////////////////////////////////////////////
// Start of forward error correction block //
/////////////////////////////////////////////
if ((ctx->sync && (c != LLP_ESC )) || (ctx->sync && (ctx->escape && (c == LLP_ESC || c == HDLC_FLAG || c == HDLC_RESET)))) {
// We have a byte, increment our read counter
ctx->readLength++;
// Check if we have read 12 bytes. If we
// have, we should now have a block of two
// data bytes and a parity byte. This block
if (ctx->readLength % LLP_INTERLEAVE_SIZE == 0) {
// If the last character in the block
// looks like a control character, we
// need to set the escape indicator to
// false, since the next byte will be
// read immediately after the FEC
// routine, and thus, the normal reading
// code will not reset the indicator.
if (c == LLP_ESC || c == HDLC_FLAG || c == HDLC_RESET) ctx->escape = false;
// The block is interleaved, so we will
// first put the received bytes in the
// deinterleaving buffer
for (int i = 1; i < LLP_INTERLEAVE_SIZE; i++) {
ctx->interleaveIn[i-1] = ctx->buf[ctx->frame_len-(LLP_INTERLEAVE_SIZE-i)];
}
ctx->interleaveIn[LLP_INTERLEAVE_SIZE-1] = c;
// We then deinterleave the block
llpDeinterleave(ctx);
// Adjust the packet length, since we will get
// parity bytes in the data buffer with block
// sizes larger than 3
ctx->frame_len -= LLP_INTERLEAVE_SIZE/3 - 1;
// For each 3-byte block in the deinterleaved
// bytes, we apply forward error correction
for (int i = 0; i < LLP_INTERLEAVE_SIZE; i+=3) {
// We now calculate a parity byte on the
// received data.
// Deinterleaved data bytes
uint8_t a = ctx->interleaveIn[i];
uint8_t b = ctx->interleaveIn[i+1];
// Deinterleaved parity byte
uint8_t p = ctx->interleaveIn[i+2];
ctx->calculatedParity = llpParityBlock(a, b);
// By XORing the calculated parity byte
// with the received parity byte, we get
// what is called the "syndrome". This
// number will tell us if we had any
// errors during transmission, and if so
// where they are. Using Hamming code, we
// can only detect single bit errors in a
// byte though, which is why we interleave
// the data, since most errors will usually
// occur in bursts of more than one bit.
// With 2 data byte interleaving we can
// correct 2 consecutive bit errors.
uint8_t syndrome = ctx->calculatedParity ^ p;
if (syndrome == 0x00) {
// If the syndrome equals 0, we either
// don't have any errors, or the error
// is unrecoverable, so we don't do
// anything
} else {
// If the syndrome is not equal to 0,
// there is a problem, and we will try
// to correct it. We first need to split
// the syndrome byte up into the two
// actual syndrome numbers, one for
// each data byte.
uint8_t syndromes[2];
syndromes[0] = syndrome & 0x0f;
syndromes[1] = (syndrome & 0xf0) >> 4;
// Then we look at each syndrome number
// to determine what bit in the data
// bytes to correct.
for (int i = 0; i < 2; i++) {
uint8_t s = syndromes[i];
uint8_t correction = 0x00;
if (s == 1 || s == 2 || s == 4 || s == 8) {
// This signifies an error in the
// parity block, so we actually
// don't need any correction
continue;
}
// The following determines what
// bit to correct according to
// the syndrome value.
if (s == 3) correction = 0x01;
if (s == 5) correction = 0x02;
if (s == 6) correction = 0x04;
if (s == 7) correction = 0x08;
if (s == 9) correction = 0x10;
if (s == 10) correction = 0x20;
if (s == 11) correction = 0x40;
if (s == 12) correction = 0x80;
// And finally we apply the correction
if (i == 1) a ^= correction;
if (i == 0) b ^= correction;
// This is just for testing purposes.
// Nice to know when corrections were
// actually made.
if (s != 0) ctx->correctionsMade += 1;
}
}
// We now update the checksum of the packet
// with the deinterleaved and possibly
// corrected bytes.
ctx->crc_in = update_crc_ccit(a, ctx->crc_in);
ctx->crc_in = update_crc_ccit(b, ctx->crc_in);
ctx->buf[ctx->frame_len-(LLP_DATA_BLOCK_SIZE)+((i/3)*2)] = a;
ctx->buf[ctx->frame_len-(LLP_DATA_BLOCK_SIZE-1)+((i/3)*2)] = b;
}
continue;
}
}
/////////////////////////////////////////////
// End of forward error correction block //
/////////////////////////////////////////////
if (!ctx->escape && c == HDLC_FLAG) {
if (ctx->frame_len >= LLP_MIN_FRAME_LENGTH) {
if (PASSALL || ctx->crc_in == LLP_CRC_CORRECT) {
#if OPEN_SQUELCH == true
LED_RX_ON();
#endif
llp_decode(ctx);
}
}
ctx->sync = true;
ctx->crc_in = CRC_CCIT_INIT_VAL;
ctx->frame_len = 0;
ctx->readLength = 0;
ctx->correctionsMade = 0;
continue;
}
if (!ctx->escape && c == HDLC_RESET) {
ctx->sync = false;
continue;
}
if (!ctx->escape && c == LLP_ESC) {
ctx->escape = true;
continue;
}
if (ctx->sync) {
if (ctx->frame_len < LLP_MAX_FRAME_LENGTH) {
ctx->buf[ctx->frame_len++] = c;
} else {
ctx->sync = false;
}
}
ctx->escape = false;
}
#endif
}
static void llp_putchar(LLPCtx *ctx, uint8_t c) {
if (c == HDLC_FLAG || c == HDLC_RESET || c == LLP_ESC) fputc(LLP_ESC, ctx->ch);
fputc(c, ctx->ch);
}
static void llp_sendchar(LLPCtx *ctx, uint8_t c) {
llpInterleave(ctx, c);
ctx->crc_out = update_crc_ccit(c, ctx->crc_out);
if (sendParityBlock) {
uint8_t p = llpParityBlock(lastByte, c);
llpInterleave(ctx, p);
}
lastByte = c;
sendParityBlock ^= true;
}
void llp_sendaddress(LLPCtx *ctx, LLPAddress *address) {
llp_sendchar(ctx, address->network >> 8);
llp_sendchar(ctx, address->network & 0xff);
llp_sendchar(ctx, address->host >> 8);
llp_sendchar(ctx, address->host & 0xff);
}
void llp_broadcast(LLPCtx *ctx, const void *_buf, size_t len) {
llp_send(ctx, &broadcast_address, _buf, len);
}
void llp_send(LLPCtx *ctx, LLPAddress *dst, const void *_buf, size_t len) {
ctx->ready_for_data = false;
ctx->interleaveCounter = 0;
ctx->crc_out = CRC_CCIT_INIT_VAL;
uint8_t *buffer = (uint8_t*)_buf;
LLPHeader header;
memset(&header, 0, sizeof(header));
LLPAddress *localAddress = ctx->address;
header.src.network = localAddress->network;
header.src.host = localAddress->host;
header.dst.network = dst->network;
header.dst.host = dst->host;
header.flags = 0x00;
header.padding = (len + LLP_HEADER_SIZE + LLP_CRC_SIZE) % LLP_DATA_BLOCK_SIZE;
if (header.padding != 0) {
header.padding = LLP_DATA_BLOCK_SIZE - header.padding;
}
// Transmit the HDLC_FLAG to signify start of TX
fputc(HDLC_FLAG, ctx->ch);
// Transmit source & destination addresses
llp_sendaddress(ctx, &header.src);
llp_sendaddress(ctx, &header.dst);
// Transmit header flags & padding count
llp_sendchar(ctx, header.flags);
llp_sendchar(ctx, header.padding);
// Transmit padding
while (header.padding--) {
llp_sendchar(ctx, 0x00);
}
// Transmit payload
while (len--) {
llp_sendchar(ctx, *buffer++);
}
// Send CRC checksum
uint8_t crcl = (ctx->crc_out & 0xff) ^ 0xff;
uint8_t crch = (ctx->crc_out >> 8) ^ 0xff;
llp_sendchar(ctx, crcl);
llp_sendchar(ctx, crch);
// And transmit a HDLC_FLAG to signify
// end of the transmission.
fputc(HDLC_FLAG, ctx->ch);
ctx->ready_for_data = true;
}
void llp_sendRaw(LLPCtx *ctx, const void *_buf, size_t len) {
ctx->ready_for_data = false;
ctx->crc_out = CRC_CCIT_INIT_VAL;
fputc(HDLC_FLAG, ctx->ch);
const uint8_t *buf = (const uint8_t *)_buf;
while (len--) llp_putchar(ctx, *buf++);
uint8_t crcl = (ctx->crc_out & 0xff) ^ 0xff;
uint8_t crch = (ctx->crc_out >> 8) ^ 0xff;
llp_putchar(ctx, crcl);
llp_putchar(ctx, crch);
fputc(HDLC_FLAG, ctx->ch);
ctx->ready_for_data = true;
}
void llp_init(LLPCtx *ctx, LLPAddress *address, FILE *channel, llp_callback_t hook) {
memset(ctx, 0, sizeof(*ctx));
ctx->ch = channel;
ctx->hook = hook;
ctx->address = address;
ctx->crc_in = ctx->crc_out = CRC_CCIT_INIT_VAL;
ctx->ready_for_data = true;
memset(&broadcast_address, 0, sizeof(broadcast_address));
broadcast_address.network = LLP_ADDR_BROADCAST;
broadcast_address.host = LLP_ADDR_BROADCAST;
}
// This function calculates and returns a parity
// byte for two input bytes. The parity byte is
// used for correcting errors in the transmission.
// The error correction algorithm is a standard
// (12,8) Hamming code.
inline bool BIT(uint8_t byte, int n) { return ((byte & _BV(n-1))>>(n-1)); }
uint8_t llpParityBlock(uint8_t first, uint8_t other) {
uint8_t parity = 0x00;
parity = ((BIT(first, 1) ^ BIT(first, 2) ^ BIT(first, 4) ^ BIT(first, 5) ^ BIT(first, 7))) +
((BIT(first, 1) ^ BIT(first, 3) ^ BIT(first, 4) ^ BIT(first, 6) ^ BIT(first, 7))<<1) +
((BIT(first, 2) ^ BIT(first, 3) ^ BIT(first, 4) ^ BIT(first, 8))<<2) +
((BIT(first, 5) ^ BIT(first, 6) ^ BIT(first, 7) ^ BIT(first, 8))<<3) +
((BIT(other, 1) ^ BIT(other, 2) ^ BIT(other, 4) ^ BIT(other, 5) ^ BIT(other, 7))<<4) +
((BIT(other, 1) ^ BIT(other, 3) ^ BIT(other, 4) ^ BIT(other, 6) ^ BIT(other, 7))<<5) +
((BIT(other, 2) ^ BIT(other, 3) ^ BIT(other, 4) ^ BIT(other, 8))<<6) +
((BIT(other, 5) ^ BIT(other, 6) ^ BIT(other, 7) ^ BIT(other, 8))<<7);
return parity;
}
// Following is the functions responsible
// for interleaving and deinterleaving
// blocks of data. The interleaving table
// for 3-byte interleaving is also included.
// The table for 12-byte is much simpler,
// and should be inferable from looking
// at the function.
///////////////////////////////
// Interleave-table (3-byte) //
///////////////////////////////
//
// Non-interleaved:
// aaaaaaaa bbbbbbbb cccccccc
// 12345678 12345678 12345678
// M L
// S S
// B B
//
// Interleaved:
// abcabcab cabcabca bcabcabc
// 11144477 22255578 63336688
//
///////////////////////////////
void llpInterleave(LLPCtx *ctx, uint8_t byte) {
ctx->interleaveOut[ctx->interleaveCounter] = byte;
ctx->interleaveCounter++;
if (!DISABLE_INTERLEAVE) {
if (ctx->interleaveCounter == LLP_INTERLEAVE_SIZE) {
// We have the bytes we need for interleaving
// in the buffer and are ready to interleave them.
uint8_t a = (GET_BIT(ctx->interleaveOut[0], 1) << 7) +
(GET_BIT(ctx->interleaveOut[1], 1) << 6) +
(GET_BIT(ctx->interleaveOut[3], 1) << 5) +
(GET_BIT(ctx->interleaveOut[4], 1) << 4) +
(GET_BIT(ctx->interleaveOut[6], 1) << 3) +
(GET_BIT(ctx->interleaveOut[7], 1) << 2) +
(GET_BIT(ctx->interleaveOut[9], 1) << 1) +
(GET_BIT(ctx->interleaveOut[10],1));
llp_putchar(ctx, a);
uint8_t b = (GET_BIT(ctx->interleaveOut[0], 2) << 7) +
(GET_BIT(ctx->interleaveOut[1], 2) << 6) +
(GET_BIT(ctx->interleaveOut[3], 2) << 5) +
(GET_BIT(ctx->interleaveOut[4], 2) << 4) +
(GET_BIT(ctx->interleaveOut[6], 2) << 3) +
(GET_BIT(ctx->interleaveOut[7], 2) << 2) +
(GET_BIT(ctx->interleaveOut[9], 2) << 1) +
(GET_BIT(ctx->interleaveOut[10],2));
llp_putchar(ctx, b);
uint8_t c = (GET_BIT(ctx->interleaveOut[0], 3) << 7) +
(GET_BIT(ctx->interleaveOut[1], 3) << 6) +
(GET_BIT(ctx->interleaveOut[3], 3) << 5) +
(GET_BIT(ctx->interleaveOut[4], 3) << 4) +
(GET_BIT(ctx->interleaveOut[6], 3) << 3) +
(GET_BIT(ctx->interleaveOut[7], 3) << 2) +
(GET_BIT(ctx->interleaveOut[9], 3) << 1) +
(GET_BIT(ctx->interleaveOut[10],3));
llp_putchar(ctx, c);
uint8_t d = (GET_BIT(ctx->interleaveOut[0], 4) << 7) +
(GET_BIT(ctx->interleaveOut[1], 4) << 6) +
(GET_BIT(ctx->interleaveOut[3], 4) << 5) +
(GET_BIT(ctx->interleaveOut[4], 4) << 4) +
(GET_BIT(ctx->interleaveOut[6], 4) << 3) +
(GET_BIT(ctx->interleaveOut[7], 4) << 2) +
(GET_BIT(ctx->interleaveOut[9], 4) << 1) +
(GET_BIT(ctx->interleaveOut[10],4));
llp_putchar(ctx, d);
uint8_t e = (GET_BIT(ctx->interleaveOut[0], 5) << 7) +
(GET_BIT(ctx->interleaveOut[1], 5) << 6) +
(GET_BIT(ctx->interleaveOut[3], 5) << 5) +
(GET_BIT(ctx->interleaveOut[4], 5) << 4) +
(GET_BIT(ctx->interleaveOut[6], 5) << 3) +
(GET_BIT(ctx->interleaveOut[7], 5) << 2) +
(GET_BIT(ctx->interleaveOut[9], 5) << 1) +
(GET_BIT(ctx->interleaveOut[10],5));
llp_putchar(ctx, e);
uint8_t f = (GET_BIT(ctx->interleaveOut[0], 6) << 7) +
(GET_BIT(ctx->interleaveOut[1], 6) << 6) +
(GET_BIT(ctx->interleaveOut[3], 6) << 5) +
(GET_BIT(ctx->interleaveOut[4], 6) << 4) +
(GET_BIT(ctx->interleaveOut[6], 6) << 3) +
(GET_BIT(ctx->interleaveOut[7], 6) << 2) +
(GET_BIT(ctx->interleaveOut[9], 6) << 1) +
(GET_BIT(ctx->interleaveOut[10],6));
llp_putchar(ctx, f);
uint8_t g = (GET_BIT(ctx->interleaveOut[0], 7) << 7) +
(GET_BIT(ctx->interleaveOut[1], 7) << 6) +
(GET_BIT(ctx->interleaveOut[3], 7) << 5) +
(GET_BIT(ctx->interleaveOut[4], 7) << 4) +
(GET_BIT(ctx->interleaveOut[6], 7) << 3) +
(GET_BIT(ctx->interleaveOut[7], 7) << 2) +
(GET_BIT(ctx->interleaveOut[9], 7) << 1) +
(GET_BIT(ctx->interleaveOut[10],7));
llp_putchar(ctx, g);
uint8_t h = (GET_BIT(ctx->interleaveOut[0], 8) << 7) +
(GET_BIT(ctx->interleaveOut[1], 8) << 6) +
(GET_BIT(ctx->interleaveOut[3], 8) << 5) +
(GET_BIT(ctx->interleaveOut[4], 8) << 4) +
(GET_BIT(ctx->interleaveOut[6], 8) << 3) +
(GET_BIT(ctx->interleaveOut[7], 8) << 2) +
(GET_BIT(ctx->interleaveOut[9], 8) << 1) +
(GET_BIT(ctx->interleaveOut[10],8));
llp_putchar(ctx, h);
uint8_t p = (GET_BIT(ctx->interleaveOut[2], 1) << 7) +
(GET_BIT(ctx->interleaveOut[2], 5) << 6) +
(GET_BIT(ctx->interleaveOut[5], 1) << 5) +
(GET_BIT(ctx->interleaveOut[5], 5) << 4) +
(GET_BIT(ctx->interleaveOut[8], 1) << 3) +
(GET_BIT(ctx->interleaveOut[8], 5) << 2) +
(GET_BIT(ctx->interleaveOut[11],1) << 1) +
(GET_BIT(ctx->interleaveOut[11],5));
llp_putchar(ctx, p);
uint8_t q = (GET_BIT(ctx->interleaveOut[2], 2) << 7) +
(GET_BIT(ctx->interleaveOut[2], 6) << 6) +
(GET_BIT(ctx->interleaveOut[5], 2) << 5) +
(GET_BIT(ctx->interleaveOut[5], 6) << 4) +
(GET_BIT(ctx->interleaveOut[8], 2) << 3) +
(GET_BIT(ctx->interleaveOut[8], 6) << 2) +
(GET_BIT(ctx->interleaveOut[11],2) << 1) +
(GET_BIT(ctx->interleaveOut[11],6));
llp_putchar(ctx, q);
uint8_t s = (GET_BIT(ctx->interleaveOut[2], 3) << 7) +
(GET_BIT(ctx->interleaveOut[2], 7) << 6) +
(GET_BIT(ctx->interleaveOut[5], 3) << 5) +
(GET_BIT(ctx->interleaveOut[5], 7) << 4) +
(GET_BIT(ctx->interleaveOut[8], 3) << 3) +
(GET_BIT(ctx->interleaveOut[8], 7) << 2) +
(GET_BIT(ctx->interleaveOut[11],3) << 1) +
(GET_BIT(ctx->interleaveOut[11],7));
llp_putchar(ctx, s);
uint8_t t = (GET_BIT(ctx->interleaveOut[2], 4) << 7) +
(GET_BIT(ctx->interleaveOut[2], 8) << 6) +
(GET_BIT(ctx->interleaveOut[5], 4) << 5) +
(GET_BIT(ctx->interleaveOut[5], 8) << 4) +
(GET_BIT(ctx->interleaveOut[8], 4) << 3) +
(GET_BIT(ctx->interleaveOut[8], 8) << 2) +
(GET_BIT(ctx->interleaveOut[11],4) << 1) +
(GET_BIT(ctx->interleaveOut[11],8));
llp_putchar(ctx, t);
ctx->interleaveCounter = 0;
}
} else {
if (ctx->interleaveCounter == LLP_INTERLEAVE_SIZE) {
for (int i = 0; i < LLP_INTERLEAVE_SIZE; i++) {
llp_putchar(ctx, ctx->interleaveOut[i]);
}
ctx->interleaveCounter = 0;
}
}
}
void llpDeinterleave(LLPCtx *ctx) {
uint8_t a = (GET_BIT(ctx->interleaveIn[0], 1) << 7) +
(GET_BIT(ctx->interleaveIn[1], 1) << 6) +
(GET_BIT(ctx->interleaveIn[2], 1) << 5) +
(GET_BIT(ctx->interleaveIn[3], 1) << 4) +
(GET_BIT(ctx->interleaveIn[4], 1) << 3) +
(GET_BIT(ctx->interleaveIn[5], 1) << 2) +
(GET_BIT(ctx->interleaveIn[6], 1) << 1) +
(GET_BIT(ctx->interleaveIn[7], 1));
uint8_t b = (GET_BIT(ctx->interleaveIn[0], 2) << 7) +
(GET_BIT(ctx->interleaveIn[1], 2) << 6) +
(GET_BIT(ctx->interleaveIn[2], 2) << 5) +
(GET_BIT(ctx->interleaveIn[3], 2) << 4) +
(GET_BIT(ctx->interleaveIn[4], 2) << 3) +
(GET_BIT(ctx->interleaveIn[5], 2) << 2) +
(GET_BIT(ctx->interleaveIn[6], 2) << 1) +
(GET_BIT(ctx->interleaveIn[7], 2));
uint8_t p = (GET_BIT(ctx->interleaveIn[8], 1) << 7) +
(GET_BIT(ctx->interleaveIn[9], 1) << 6) +
(GET_BIT(ctx->interleaveIn[10],1) << 5) +
(GET_BIT(ctx->interleaveIn[11],1) << 4) +
(GET_BIT(ctx->interleaveIn[8], 2) << 3) +
(GET_BIT(ctx->interleaveIn[9], 2) << 2) +
(GET_BIT(ctx->interleaveIn[10],2) << 1) +
(GET_BIT(ctx->interleaveIn[11],2));
uint8_t c = (GET_BIT(ctx->interleaveIn[0], 3) << 7) +
(GET_BIT(ctx->interleaveIn[1], 3) << 6) +
(GET_BIT(ctx->interleaveIn[2], 3) << 5) +
(GET_BIT(ctx->interleaveIn[3], 3) << 4) +
(GET_BIT(ctx->interleaveIn[4], 3) << 3) +
(GET_BIT(ctx->interleaveIn[5], 3) << 2) +
(GET_BIT(ctx->interleaveIn[6], 3) << 1) +
(GET_BIT(ctx->interleaveIn[7], 3));
uint8_t d = (GET_BIT(ctx->interleaveIn[0], 4) << 7) +
(GET_BIT(ctx->interleaveIn[1], 4) << 6) +
(GET_BIT(ctx->interleaveIn[2], 4) << 5) +
(GET_BIT(ctx->interleaveIn[3], 4) << 4) +
(GET_BIT(ctx->interleaveIn[4], 4) << 3) +
(GET_BIT(ctx->interleaveIn[5], 4) << 2) +
(GET_BIT(ctx->interleaveIn[6], 4) << 1) +
(GET_BIT(ctx->interleaveIn[7], 4));
uint8_t q = (GET_BIT(ctx->interleaveIn[8], 3) << 7) +
(GET_BIT(ctx->interleaveIn[9], 3) << 6) +
(GET_BIT(ctx->interleaveIn[10],3) << 5) +
(GET_BIT(ctx->interleaveIn[11],3) << 4) +
(GET_BIT(ctx->interleaveIn[8], 4) << 3) +
(GET_BIT(ctx->interleaveIn[9], 4) << 2) +
(GET_BIT(ctx->interleaveIn[10],4) << 1) +
(GET_BIT(ctx->interleaveIn[11],4));
uint8_t e = (GET_BIT(ctx->interleaveIn[0], 5) << 7) +
(GET_BIT(ctx->interleaveIn[1], 5) << 6) +
(GET_BIT(ctx->interleaveIn[2], 5) << 5) +
(GET_BIT(ctx->interleaveIn[3], 5) << 4) +
(GET_BIT(ctx->interleaveIn[4], 5) << 3) +
(GET_BIT(ctx->interleaveIn[5], 5) << 2) +
(GET_BIT(ctx->interleaveIn[6], 5) << 1) +
(GET_BIT(ctx->interleaveIn[7], 5));
uint8_t f = (GET_BIT(ctx->interleaveIn[0], 6) << 7) +
(GET_BIT(ctx->interleaveIn[1], 6) << 6) +
(GET_BIT(ctx->interleaveIn[2], 6) << 5) +
(GET_BIT(ctx->interleaveIn[3], 6) << 4) +
(GET_BIT(ctx->interleaveIn[4], 6) << 3) +
(GET_BIT(ctx->interleaveIn[5], 6) << 2) +
(GET_BIT(ctx->interleaveIn[6], 6) << 1) +
(GET_BIT(ctx->interleaveIn[7], 6));
uint8_t s = (GET_BIT(ctx->interleaveIn[8], 5) << 7) +
(GET_BIT(ctx->interleaveIn[9], 5) << 6) +
(GET_BIT(ctx->interleaveIn[10],5) << 5) +
(GET_BIT(ctx->interleaveIn[11],5) << 4) +
(GET_BIT(ctx->interleaveIn[8], 6) << 3) +
(GET_BIT(ctx->interleaveIn[9], 6) << 2) +
(GET_BIT(ctx->interleaveIn[10],6) << 1) +
(GET_BIT(ctx->interleaveIn[11],6));
uint8_t g = (GET_BIT(ctx->interleaveIn[0], 7) << 7) +
(GET_BIT(ctx->interleaveIn[1], 7) << 6) +
(GET_BIT(ctx->interleaveIn[2], 7) << 5) +
(GET_BIT(ctx->interleaveIn[3], 7) << 4) +
(GET_BIT(ctx->interleaveIn[4], 7) << 3) +
(GET_BIT(ctx->interleaveIn[5], 7) << 2) +
(GET_BIT(ctx->interleaveIn[6], 7) << 1) +
(GET_BIT(ctx->interleaveIn[7], 7));
uint8_t h = (GET_BIT(ctx->interleaveIn[0], 8) << 7) +
(GET_BIT(ctx->interleaveIn[1], 8) << 6) +
(GET_BIT(ctx->interleaveIn[2], 8) << 5) +
(GET_BIT(ctx->interleaveIn[3], 8) << 4) +
(GET_BIT(ctx->interleaveIn[4], 8) << 3) +
(GET_BIT(ctx->interleaveIn[5], 8) << 2) +
(GET_BIT(ctx->interleaveIn[6], 8) << 1) +
(GET_BIT(ctx->interleaveIn[7], 8));
uint8_t t = (GET_BIT(ctx->interleaveIn[8], 7) << 7) +
(GET_BIT(ctx->interleaveIn[9], 7) << 6) +
(GET_BIT(ctx->interleaveIn[10],7) << 5) +
(GET_BIT(ctx->interleaveIn[11],7) << 4) +
(GET_BIT(ctx->interleaveIn[8], 8) << 3) +
(GET_BIT(ctx->interleaveIn[9], 8) << 2) +
(GET_BIT(ctx->interleaveIn[10],8) << 1) +
(GET_BIT(ctx->interleaveIn[11],8));
ctx->interleaveIn[0] = a;
ctx->interleaveIn[1] = b;
ctx->interleaveIn[2] = p;
ctx->interleaveIn[3] = c;
ctx->interleaveIn[4] = d;
ctx->interleaveIn[5] = q;
ctx->interleaveIn[6] = e;
ctx->interleaveIn[7] = f;
ctx->interleaveIn[8] = s;
ctx->interleaveIn[9] = g;
ctx->interleaveIn[10] = h;
ctx->interleaveIn[11] = t;
}

@ -0,0 +1,72 @@
#ifndef PROTOCOL_LLP_H
#define PROTOCOL_LLP_H
#include <stdio.h>
#include <stdbool.h>
#include "device.h"
#define LLP_ADDR_BROADCAST 0xFFFF
#define LLP_INTERLEAVE_SIZE 12
#define LLP_MIN_FRAME_LENGTH LLP_INTERLEAVE_SIZE
#define LLP_MAX_FRAME_LENGTH 48 * LLP_INTERLEAVE_SIZE
#define LLP_HEADER_SIZE 10
#define LLP_CHECKSUM_SIZE 2
#define LLP_MAX_DATA_SIZE LLP_MAX_FRAME_LENGTH - LLP_HEADER_SIZE - LLP_CHECKSUM_SIZE
#define LLP_DATA_BLOCK_SIZE ((LLP_INTERLEAVE_SIZE/3)*2)
#define LLP_CRC_SIZE 2
#define LLP_CRC_CORRECT 0xF0B8
struct LLPCtx; // Forward declarations
typedef void (*llp_callback_t)(struct LLPCtx *ctx);
typedef struct LLPAddress {
uint16_t network;
uint16_t host;
} LLPAddress;
typedef struct LLPHeader {
LLPAddress src;
LLPAddress dst;
uint8_t flags;
uint8_t padding;
} LLPHeader;
typedef struct LLPMsg {
LLPHeader header;
const uint8_t *data;
size_t len;
} LLPMsg;
typedef struct LLPCtx {
uint8_t buf[LLP_MAX_FRAME_LENGTH];
FILE *ch;
LLPAddress *address;
size_t frame_len;
size_t readLength;
uint16_t crc_in;
uint16_t crc_out;
uint8_t calculatedParity;
long correctionsMade;
llp_callback_t hook;
bool sync;
bool escape;
bool ready_for_data;
uint8_t interleaveCounter; // Keeps track of when we have received an entire interleaved block
uint8_t interleaveOut[LLP_INTERLEAVE_SIZE]; // A buffer for interleaving bytes before they are sent
uint8_t interleaveIn[LLP_INTERLEAVE_SIZE]; // A buffer for storing interleaved bytes before they are deinterleaved
} LLPCtx;
void llp_broadcast(LLPCtx *ctx, const void *_buf, size_t len);
void llp_send(LLPCtx *ctx, LLPAddress *dst, const void *_buf, size_t len);
void llp_sendRaw(LLPCtx *ctx, const void *_buf, size_t len);
void llp_poll(LLPCtx *ctx);
void llp_init(LLPCtx *ctx, LLPAddress *address, FILE *channel, llp_callback_t hook);
void llpInterleave(LLPCtx *ctx, uint8_t byte);
void llpDeinterleave(LLPCtx *ctx);
uint8_t llpParityBlock(uint8_t first, uint8_t other);
#endif

@ -0,0 +1,36 @@
#include "CRC-CCIT.h"
const uint16_t crc_ccit_table[256] PROGMEM = {
0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78,
};

@ -0,0 +1,18 @@
// CRC-CCIT Implementation based on work by Francesco Sacchi
#ifndef CRC_CCIT_H
#define CRC_CCIT_H
#include <stdint.h>
#include <avr/pgmspace.h>
#define CRC_CCIT_INIT_VAL ((uint16_t)0xFFFF)
extern const uint16_t crc_ccit_table[256];
inline uint16_t update_crc_ccit(uint8_t c, uint16_t prev_crc) {
return (prev_crc >> 8) ^ pgm_read_word(&crc_ccit_table[(prev_crc ^ c) & 0xff]);
}
#endif

@ -0,0 +1,85 @@
#ifndef UTIL_FIFO_H
#define UTIL_FIFO_H
#include <stddef.h>
#include <util/atomic.h>
typedef struct FIFOBuffer
{
unsigned char *begin;
unsigned char *end;
unsigned char * volatile head;
unsigned char * volatile tail;
} FIFOBuffer;
inline bool fifo_isempty(const FIFOBuffer *f) {
return f->head == f->tail;
}
inline bool fifo_isfull(const FIFOBuffer *f) {
return ((f->head == f->begin) && (f->tail == f->end)) || (f->tail == f->head - 1);
}
inline void fifo_push(FIFOBuffer *f, unsigned char c) {
*(f->tail) = c;
if (f->tail == f->end) {
f->tail = f->begin;
} else {
f->tail++;
}
}
inline unsigned char fifo_pop(FIFOBuffer *f) {
if(f->head == f->end) {
f->head = f->begin;
return *(f->end);
} else {
return *(f->head++);
}
}
inline void fifo_flush(FIFOBuffer *f) {
f->head = f->tail;
}
inline bool fifo_isempty_locked(const FIFOBuffer *f) {
bool result;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
result = fifo_isempty(f);
}
return result;
}
inline bool fifo_isfull_locked(const FIFOBuffer *f) {
bool result;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
result = fifo_isfull(f);
}
return result;
}
inline void fifo_push_locked(FIFOBuffer *f, unsigned char c) {
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
fifo_push(f, c);
}
}
inline unsigned char fifo_pop_locked(FIFOBuffer *f) {
unsigned char c;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
c = fifo_pop(f);
}
return c;
}
inline void fifo_init(FIFOBuffer *f, unsigned char *buffer, size_t size) {
f->head = f->tail = f->begin = buffer;
f->end = buffer + size -1;
}
inline size_t fifo_len(FIFOBuffer *f) {
return f->end - f->begin;
}
#endif

@ -0,0 +1,12 @@
#define PROTOCOL_KISS 0x01
#define PROTOCOL_SIMPLE_SERIAL 0x02
#define m328p 0x01
#define m1284p 0x02
#define m644p 0x03
#define REF_3V3 0x01
#define REF_5V 0x02
#define SERIAL_FRAMING_KISS 0x01
#define SERIAL_FRAMING_DIRECT 0x02

@ -0,0 +1,43 @@
#ifndef UTIL_TIME_H
#define UTIL_TIME_H
#include <util/atomic.h>
#include "device.h"
#define DIV_ROUND(dividend, divisor) (((dividend) + (divisor) / 2) / (divisor))
#define CLOCK_TICKS_PER_SEC CONFIG_AFSK_DAC_SAMPLERATE
typedef int32_t ticks_t;
typedef int32_t mtime_t;
volatile ticks_t _clock;
inline ticks_t timer_clock(void) {
ticks_t result;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
result = _clock;
}
return result;
}
inline ticks_t ms_to_ticks(mtime_t ms) {
return ms * DIV_ROUND(CLOCK_TICKS_PER_SEC, 1000);
}
inline void cpu_relax(void) {
// Do nothing!
}
inline void delay_ms(unsigned long ms) {
ticks_t start = timer_clock();
unsigned long n_ticks = ms_to_ticks(ms);
while (timer_clock() - start < n_ticks) {
cpu_relax();
}
}
#endif

@ -0,0 +1,71 @@
# 1200bps AFSK / Bell 202 modem
This modem is intended for use as a universal KISS tnc for packet Winlink or APRS. Other uses are, of course, possible. It is build around an Atmel ATmega328P, clocked at 16MHz. The ATmega328P must be programmed with the Arduino bootloader and is programmable via the Arduino IDE. A CH340 serial to USB converter is used as an interface to the outside world. It is also possible to use an Arduino nano instead.
In order to program the ATmega328P in-circuit, a small modification made to the CH340 board is needed. See photo.
![CH340 modification](./images/ISP-modification.jpg "CH340 modification")
This design is based on the MicroModem from markqvist (https://unsigned.io/).
## Use cases
- Digipeater with APRX
- Winlink RMS (packet)
- APRS station with YACC or Xastir
# Author
Copyright 2022 M.T. Konstapel (PE1RXF)
https://www.meezenest.nl/mees-elektronica
# Features
- Uses universal KISS protocol.
- USB powered.
- Can be configured for normal PTT (open emitter) or combined PTT/MIC (for some hand helds).
- Open source hardware and software.
- Should work on any OS (but only tested on Linux)
# Adjustment
Adjust VR2 to get about 100 mV signal on pin 23 (PC0) of ATmega328P. Adjust VR1 according to the input sensitivity of the used transmitter.
# Flexible firmware support
The modem also works with the other firmware from unsigned.io. It can be programmed for different applications:
- APRS KISS (also used for TCP/IP over AX.25) (microaprs-3v-kiss-latest.hex) - used in this project
- APRS SimpleSerial (microaprs-3v-ss-latest.hex)
- MicroModemGP KISS (MicroModemGP-kiss.hex)
- MicroModem Direct Serial (MicroModemGP-direct.hex)
Program the ATmega328P with the following command:
avrdude -p m328p -c arduino -P /dev/ttyUSB0 -b 115200 -U flash:w:microaprs-3v-kiss-latest.hex
For me this command failed because it couldn't find the avrdude.conf file. I had to specify the full paths:
~/arduino-1.8.10/hardware/tools/avr/bin/avrdude -p m328p -c arduino -C ~/arduino-1.8.10/hardware/tools/avr/etc/avrdude.conf -P /dev/ttyACM0 -b 115200 -U flash:w:~/Documenten/electronische_projecten/packetmodem_nano2/MicroModemGP/precompiled/microaprs-3v-kiss-latest.hex
# How to use on Linux
## Install AX.25 support
sudo apt-get install libax25 ax25-apps ax25-tools
sudo nano /etc/ax25/axports
than add line:
ax0 NOCALL 9600 255 2 Packet modem nano2
## Attach KISS interface to AX.25
sudo /usr/sbin/kissattach /dev/ttyUSB0 ax0
sudo /usr/sbin/kissparms -p ax0 -t 500 -s 200 -r 32 -l 100 -f n
## Configure Pat
pat configure
than add AX.25 port 'ax0' to the 'ax25' section, subsection 'port'

Binary file not shown.

After

Width:  |  Height:  |  Size: 478 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 384 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 534 KiB

@ -0,0 +1,378 @@
:100000000C9474010C9491010C9491010C94910145
:100010000C9491010C9491010C9491010C94910118
:100020000C9491010C9491010C9491010C94910108
:100030000C9491010C9491010C9491010C949101F8
:100040000C9491010C9491010C9491010C949101E8
:100050000C9491010C94F4060C9491010C94910170
:100060000C9491010C949101808183848687898A04
:100070008C8E8F9192949597989A9B9D9EA0A2A307
:10008000A5A6A7A9AAACADAFB0B2B3B5B6B7B9BA79
:10009000BCBDBEC0C1C2C4C5C6C8C9CACBCDCECF07
:1000A000D0D2D3D4D5D6D7D9DADBDCDDDEDFE0E1C0
:1000B000E2E3E4E5E6E7E8E9EAEAEBECEDEEEEEFB1
:1000C000F0F1F1F2F3F3F4F5F5F6F6F7F8F8F9F9E3
:1000D000FAFAFAFBFBFCFCFCFDFDFDFDFEFEFEFE5C
:1000E000FEFFFFFFFFFFFFFF0000891112239B327D
:1000F0002446AD573665BF74488CC19D5AAFD3BEF8
:100100006CCAE5DB7EE9F7F88110080193331A2207
:10011000A5562C47B7753E64C99C408DDBBF52AED7
:10012000EDDA64CBFFF976E802218B3010029913E7
:100130002667AF763444BD554AADC3BC588ED19FB7
:100140006EEBE7FA7CC8F5D983310A2091121803C7
:10015000A7772E66B5543C45CBBD42ACD99E508F97
:10016000EFFB66EAFDD874C904428D5316619F7097
:100170002004A9153227BB364CCEC5DF5EEDD7FC77
:100180006888E1997AABF3BA85520C4397711E6087
:10019000A1142805B3373A26CDDE44CFDFFD56EC57
:1001A000E9986089FBBB72AA06638F7214409D5167
:1001B0002225AB343006B9174EEFC7FE5CCCD5DD37
:1001C0006AA9E3B8788AF19B87730E6295501C4147
:1001D000A3352A24B1163807CFFF46EEDDDC54CD17
:1001E000EBB962A8F99A708B088481951AA793B627
:1001F0002CC2A5D33EE1B7F04008C919522BDB3A17
:10020000644EED5F766DFF7C899400859BB712A6E6
:10021000ADD224C3BFF136E0C1184809D33B5A2AF6
:10022000E55E6C4FF77D7E6C0AA583B418869197C6
:100230002EE3A7F23CC0B5D14229CB38500AD91BD6
:10024000666FEF7E744CFD5D8BB502A499961087A6
:10025000AFF326E2BDD034C1C3394A28D11A580BB6
:10026000E77F6E6EF55C7C4D0CC685D71EE597F476
:100270002880A1913AA3B3B2444ACD5B5669DF7896
:10028000600CE91D722FFB3E8DD604C79FF516E466
:10029000A9902081BBB332A2C55A4C4BD7795E6876
:1002A000E11C680DF33F7A2E0EE787F61CC495D546
:1002B0002AA1A3B03882B193466BCF7A5448DD5956
:1002C000622DEB3C700EF91F8FF706E69DD414C526
:1002D000ABB122A0B9923083C77B4E6AD5585C4936
:1002E000E33D6A2CF11E780F11241FBECFEFD8E03A
:1002F000DEBFCDBF11E0A0E0B1E0EAE6F7E102C069
:1003000005900D92A231B107D9F718E0A2E1B1E052
:1003100001C01D92A434B107E1F70E946E0A0C944B
:10032000B30B0C9400000C94C40878948CE294E015
:100330000E94100323E931E04CE254E0BA018CE062
:1003400095E00E948D078EEF94E00E94C701EEE3D6
:10035000F8E08EEF94E09383828391838083AC01F5
:100360006CE274E08CE095E00C94B5089091C000CC
:1003700095FFFCCF8093C60081E090E008958091C6
:10038000C00087FFFCCF8091C60090E00895CF9316
:10039000DF93CDB7DEB72E970FB6F894DEBF0FBE52
:1003A000CDBFDC018EE0FD01982F11929A95E9F7FF
:1003B0001092C50097E69093C400E0ECF0E09081C5
:1003C0009D7F908396E09093C20098E19093C10046
:1003D0009E012F5F3F4FF90111928A95E9F783E063
:1003E0008C8386EB91E09A8789878FEB91E09C87DD
:1003F0008B879EE0F90101900D929A95E1F72E9678
:100400000FB6F894DEBF0FBECDBFDF91CF91089538
:10041000811106C08091C000881F8827881F089519
:1004200080E008958091C00087FF03C08091C600DE
:1004300008958FEF08950F931F93CF93DF93182F95
:10044000C0913308D0913408FE01E659FF4F8081F6
:10045000811126C080E490E098A38F8F1E8E1D8EA0
:100460001C8E01E0008331960083299A20910901B6
:1004700030910A0140910B0150910C01A0EBB4E0C6
:100480000E948D0A6056704F8F4F9F4F20E43FE1CE
:1004900040E050E00E94980A3D8B2C8B00931301A2
:1004A0000FB7F894209105013091060140910701A2
:1004B00050910801A0EBB4E00E948D0A6056704F85
:1004C0008F4F9F4F20E43FE140E050E00E94980AA8
:1004D0003F8B2E8B0FBFE0913308F09134084FB75C
:1004E000F89426A137A182A193A12817390739F4DE
:1004F00020A531A584A195A12817390779F060A519
:1005000071A526A137A12150310991E080E0621741
:10051000730709F090E0292F382F02C021E030E066
:100520004FBF232BC1F6E0913308F09134082FB769
:10053000F894A0A5B1A51C9340A551A584A195A1AF
:100540004817590719F482A193A103C080A591A56A
:10055000019691A780A72FBF81E090E0DF91CF9116
:100560001F910F910895E0913308F09134084FB72F
:10057000F894E758FF4F24813581868197814FBFDA
:1005800028173907E9F0E0913308F09134089FB754
:10059000F894E758FF4FA481B58122813381A217D7
:1005A000B30719F42081318105C0A481B5819D0173
:1005B0002F5F3F4F358324838C919FBF90E0089538
:1005C0008FEF9FEF0895109212010895109212017B
:1005D0001092800089E18093810081E896E09093F9
:1005E00087008093860080911201882321F080E4A7
:1005F00080937C0002C010927C00389840988091D3
:100600007E00816080937E0087E080937B008CEE8B
:1006100080937A008AB1886F8AB9219A229A0895C4
:100620000F931F93CF93DF93CDB7DEB72E970FB6FF
:10063000F894DEBF0FBECDBF8C018EECD8011D92A9
:100640008A95E9F7109334080093330880E490E02A
:10065000F80190A3878F11A2C8018C589F4FE459CD
:10066000FF4F918380839783868395838483049649
:10067000938382830996D801A758BF4F11969C9304
:100680008E9317969C938E93169715969C938E93A4
:100690001497CF9613969C938E931297865991092F
:1006A000D80193969C938E93929799969C938E9350
:1006B000989797969C938E939697CF9695969C93A2
:1006C0008E93949784E090E0A681B7811C92468136
:1006D0005781228133814217530719F420813181D8
:1006E00004C0268137812F5F3F4F378326830197D0
:1006F00059F70E94E6028EE0FE013196DF01982F45
:100700001D929A95E9F793E09C832BE132E03A87BA
:10071000298723EB32E03C872B87D80101900D928B
:100720008A95E1F72E960FB6F894DEBF0FBECDBFC7
:10073000DF91CF911F910F9108950F931F93CF9346
:10074000DF93E0913308F091340820A531A537A359
:1007500026A3EC018C01060F171FC017D10731F03B
:1007600060E070E089910E941B02F7CFDF91CF918A
:100770001F910F910895DC0158968C915897811123
:10078000F8C05A968C915A978111AEC096964D91A9
:100790005C91979798962D913C91999742175307A2
:1007A00079F456962D913C915797232B49F410924A
:1007B0001301FD01E659FF4F1082A559BF4F68C0D4
:1007C0005B969C915B97911103C05C961C925C9721
:1007D00091E05B969C935B9754962D913C91559735
:1007E00021153105B9F596964D915C91979798969C
:1007F0002D913C9199974217530779F4FD01E559E2
:10080000FF4F108256962D913C91579721503109F8
:1008100057963C932E93569723C09696ED91FC9154
:10082000979794962D913C919597E217F30729F4A9
:1008300092962D913C91939707C09696ED91FC91DD
:1008400097979F012F5F3F4F97963C932E939697D4
:10085000908107C02150310955963C932E935497AF
:100860009EE759969C93599759969C9159979B311D
:1008700089F596964D915C91979798962D913C911C
:1008800099974217530739F410921301A659BF4F95
:100890001C92299808959696ED91FC9197979496BD
:1008A0008D919C919597E817F90729F492968D916F
:1008B0009C91939706C09696ED91FC919797CF01E6
:1008C000019697969C938E939697808159968C93D8
:1008D000599706C09E57923018F45B961C925B970E
:1008E00081E05A968C935A975B968C915B975F96B2
:1008F0002D913C9190978823A9F05C968C915C9700
:10090000853080F05C961C925C972034310519F09C
:1009100080E490E002C085E790E090969C938E93EF
:100920005F9723C05A968C915A9759969C915997E4
:10093000982341F05C969C915C979F5F5C969C939A
:100940005C970FC05C961C925C972034310519F0BF
:1009500020E430E002C025E730E090963C932E93EF
:100960005F97880F5A968C935A9788E058968C9385
:1009700058975F96ED91FC9190975D968D919C9123
:100980005E97E80FF91F9F0131705E963C932E939E
:100990005D9758968C915897815058968C93FF2765
:1009A000E038F10530F08FEF90E0AC014E1B5F0BAB
:1009B000FA01E859FF4F84912F3F310511F008F0FB
:1009C00080950895EF92FF920F931F93CF93DF933B
:1009D000FC018C010D531F4FD8014D915C91119773
:1009E000129711965C934E93A555B10914968D916B
:1009F0009C91159712962D913C911397821793070E
:100A000021F42D913C91119707C014968D919C91E2
:100A100015979C012F5F3F4F15963C932E9314978B
:100A2000EC012881260290011124C9019595879532
:100A300095958795E801998388837F01D7ECED0E22
:100A4000F11CE701288139818F010B531F4FE80109
:100A500039832883840F951F35952795820F931F1F
:100A6000E70199838883AF0147535F4F21E0181650
:100A700019060CF420E0EA018881880F822B888314
:100A800016968D919C911797EC01688316962D917F
:100A90003C91179712968D919C91139728173907BF
:100AA00021F48D919C91119705C016968D919C9182
:100AB0001797019617969C938E931697DA018C914F
:100AC000982F9695969589278370DF01A653BF4F7F
:100AD000833049F48C91803214F48F5F01C08150CF
:100AE0008C9311A203C081A18F5F81A38C91885F39
:100AF000803414F48C936BC18F738C93DF01A553F6
:100B0000BF4F8C91880F8C93EA01988197702BEFDF
:100B1000290F233010F0933011F481608C938C9165
:100B2000982F96958927809581709685990F892BA6
:100B300086878E3709F052C0DF01A758BF4F149641
:100B40002D913C9115978D919C91119728173907FC
:100B500059F416962D913C91179712968D919C9170
:100B6000139728173907B1F116962D913C911797D5
:100B700014968D919C91159701972817390751F17B
:100B80001696CD91DC9117978EE7888316962D9156
:100B90003C91179712968D919C91139728173907BE
:100BA00021F48D919C91119705C016968D919C9181
:100BB0001797019617969C938E93169791E0918BB9
:100BC0008389863020F4128A8F5F838B01C0928BD9
:100BD00081E0BFC0118A128A138ABAC08F778F371B
:100BE00011F4118A09C08289882311F02A9A01C060
:100BF0002A988189811103C0128A138AE8C08685E8
:100C0000982F9F739E3309F4E2C080FF03C0808950
:100C10008068808B97859F5F97878089983008F4DC
:100C20009DC0DF01A758BF4F92E8980F923018F08F
:100C30008B3109F046C014962D913C9115978D91FA
:100C40009C9111972817390759F416962D913C91CC
:100C5000179712968D919C9113972817390759F180
:100C600016962D913C91179714968D919C911597FE
:100C7000019728173907F9F01696CD91DC9117974F
:100C80008BE1888316962D913C91179712968D9142
:100C90009C9113972817390721F48D919C911197F6
:100CA00005C016968D919C911797019617969C9367
:100CB0008E93169706C0118A128A138A2A9880E0AA
:100CC00001C081E014964D915C9115972D913C9156
:100CD00011974217530759F416964D915C91179747
:100CE00012962D913C9113974217530769F116966E
:100CF0004D915C91179714962D913C911597215029
:100D000031094217530701F190891696CD91DC9174
:100D10001797988316964D915C91179712962D917F
:100D20003C9113974217530721F42D913C91119751
:100D300006C016962D913C9117972F5F3F4F17963F
:100D40003C932E93169705C0118A128A138A2A980B
:100D500080E0108A1786882321F039C08695808B21
:100D600036C0EF01C453DF4F888199818160998338
:100D70008883DF01A758BF4F14962D913C9115979A
:100D80008D919C9111972817390759F416962D913A
:100D90003C91179712968D919C91139728173907BC
:100DA00061F016962D913C91179714968D919C9118
:100DB000159701972817390751F416968D919C9134
:100DC000179715969C938E9314971982188281A178
:100DD000813618F011A2128A2A98DF91CF911F91C3
:100DE0000F91FF90EF9008951F920F920FB60F9200
:100DF00011242F933F934F935F936F937F938F9320
:100E00009F93AF93BF93EF93FF9380E286BB609174
:100E1000780070917900769567957695679560581A
:100E200080913308909134080E94E204809113016C
:100E3000882349F080913308909134080E94BB03C5
:100E4000807F886001C080E88BB98091FA0490911E
:100E5000FB04A091FC04B091FD040196A11DB11DFD
:100E60008093FA049093FB04A093FC04B093FD04D8
:100E7000FF91EF91BF91AF919F918F917F916F9172
:100E80005F914F913F912F910F900FBE0F901F9048
:100E90001895CF92DF92EF92FF920F931F93CF930B
:100EA000DF931F92CDB7DEB77C01262F82E8860F35
:100EB0008701065E1C4F823010F06B3149F4F80157
:100EC000608171818BE190E029830E94540B29811C
:100ED000D701A05EBC4F3C9111964C911197822F87
:100EE00090E0FC01E327EE0FFF1FE851FF4F259133
:100EF0003491C42ED12C2C253D252D933C93F80103
:100F0000608171810F90DF91CF911F910F91FF90C0
:100F1000EF90DF90CF900C94540BCF93DF93E7E2E8
:100F2000F3E0DC01EF011D922197E9F7FC01E65E99
:100F3000FC4F518340833297718360833A963183AB
:100F4000208332972FEF3FEF318320833297318315
:100F50002083389681E08083DF91CF9108953F927E
:100F60004F925F926F927F928F929F92AF92BF92B9
:100F7000CF92DF92EF92FF920F931F93CF93DF9365
:100F80002C013C0126EE621A2CEF720A6C014BED2B
:100F9000C41A4CEFD40AEC01CC5DDC4F8C01045E2A
:100FA0001C4F7C0182EEE81A8CEFF80A332433944C
:100FB000AA24AA94BA2C4201AEED8A1AACEF9A0A7E
:100FC000F301808191810E94160B8F3FFFEF9F07F5
:100FD00009F459C0F6012081211129C08E379105ED
:100FE000D9F4D8018D919C91429770F0F7018081DE
:100FF0009181883B904F41F42A9AD401ED91FC9164
:10100000309711F0C20109953882F701B182A082B0
:10101000D8011D921C92D4CF8F37910511F41882FC
:10102000CFCF8B31910519F4F6013082C9CF2881D9
:10103000222331F1D8012D913C912831B3E03B07B7
:10104000F0F4A9014F5F5F4FF80151834083F20133
:10105000E20FF31F8083D7012D913C91F901E8271E
:10106000FF27EE0FFF1FE851FF4F85919491232F2B
:10107000332782279327F7019183808301C0188249
:10108000D6011C929DCFDF91CF911F910F91FF90C0
:10109000EF90DF90CF90BF90AF909F908F907F9018
:1010A0006F905F904F903F9008956F927F928F92D4
:1010B0009F92AF92BF92CF92DF92EF92FF920F93E7
:1010C0001F93CF93DF93EC013B014A017C018AED32
:1010D000E81A8CEFF80AF70110825E01F0EEAF1A01
:1010E000FCEFBF0A8FEF9FEFF501918380836E01C4
:1010F000F6EECF1AFCEFDF0AF601608171818EE710
:1011000090E00E94540B8301860C971C081519056A
:1011100039F0F80161918F01CE010E944907F6CFA5
:10112000F501608111816095CE010E944907612F10
:101130006095CE010E944907F601608171818EE7BA
:1011400090E00E94540B81E0F7018083DF91CF9102
:101150001F910F91FF90EF90DF90CF90BF90AF90D5
:101160009F908F907F906F90089590933808809310
:1011700037085093FF044093FE0470933A0860933D
:101180003908109236080895EF92FF920F931F933B
:10119000CF93DF93EC016091FE047091FF0480EC2B
:1011A00090E00E94540B6091FE047091FF0480E077
:1011B00090E00E94540B8E017E0184EEE81A8CEFC1
:1011C000F80AF70120813181225031096091FE0433
:1011D0007091FF04C8018C1B9D0B8217930708F5C3
:1011E000F80181918F01803C59F48BED90E00E94D1
:1011F000540B6091FE047091FF048CED90E00EC0E2
:101200008B3D59F48BED90E00E94540B6091FE04ED
:101210007091FF048DED90E001C090E00E94540BAE
:10122000D0CF80EC90E0DF91CF911F910F91FF9094
:10123000EF900C94540B4F925F926F927F928F922B
:101240009F92AF92BF92EF92FF920F931F93CF9313
:10125000DF93EC018B017A01E0913908F0913A08B3
:101260008289811138C00E94060B90910001891774
:1012700030F4A701B801CE010E94550846C08FB7CF
:10128000F8948090FA049090FB04A090FC04B09035
:10129000FD048FBF209101013091020140910301B3
:1012A00050910401AAE0B0E00E948D0A2FB7F89493
:1012B0004090FA045090FB046090FC047090FD0490
:1012C0002FBF481859086A087B0846165706680653
:1012D000790664F3C1CFE0913908F0913A08818929
:1012E000882309F4B9CF80913708909138080E947B
:1012F000AF07E0913908F0913A08E453FF4F80813D
:101300009181892B41F311821082809136088823C4
:10131000A1F1CA5DDC4F8881811101C0FFCF6091CE
:10132000FE047091FF0480EC90E00E94540B6091E9
:10133000FE047091FF048FE090E00E94540B6091D6
:10134000FE047091FF0481E090E00E94540B6091D4
:10135000FE047091FF0480EC90E0DF91CF911F912B
:101360000F91FF90EF90BF90AF909F908F907F90E4
:101370006F905F904F900C94540BDF91CF911F9121
:101380000F91FF90EF90BF90AF909F908F907F90C4
:101390006F905F904F90089590913B089923A1F032
:1013A000803C01F580910D01811111C010923B0824
:1013B00040913C0850913D0864E171E0809137080C
:1013C000909138080C941B09803C09F086C081E09C
:1013D00080933B088EEF80930D0110923D08109290
:1013E0003C08089520913C0830913D08283193E055
:1013F000390708F072C090910D012115310531F4C3
:101400009E3F21F48F7080930D01089591111FC0AC
:101410008B3D21F481E08093350808959091350843
:10142000992349F08C3D21F08D3D19F48BED01C0DD
:1014300080EC10923508A9014F5F5F4F50933D0833
:1014400040933C08F901EC5EFE4F80830895913093
:1014500079F4282F30E0AAE0B0E00E947E0A609381
:10146000090170930A0180930B0190930C01089578
:10147000943089F42AE0829FC0011124AA2797FDA5
:10148000A095BA2F8093050190930601A0930701C0
:10149000B09308010895933089F42AE0829FC00137
:1014A0001124AA2797FDA095BA2F8093010190934C
:1014B0000201A0930301B09304010895923019F43E
:1014C0008093000108959F3041F4811103C0109270
:1014D0003608089581E08093360808950E949501AA
:1014E0008CE095E00E94AF0780E00E94080288230C
:1014F000B9F30E9412020E94CC09F2CFA29FB00160
:10150000B39FC001A39F700D811D1124911DB29F37
:10151000700D811D1124911D08950E947E0AA59FC2
:10152000900DB49F900DA49F800D911D11240895DE
:10153000A1E21A2EAA1BBB1BFD010DC0AA1FBB1FD7
:10154000EE1FFF1FA217B307E407F50720F0A21B49
:10155000B30BE40BF50B661F771F881F991F1A94B6
:1015600069F760957095809590959B01AC01BD01E0
:10157000CF0108958F929F92AF92BF92CF92DF9248
:10158000EF92FF92CF93DF93EC01688179818A819A
:101590009B81611571058105910521F464E279ED66
:1015A0008BE597E02DE133EF41E050E00E94940B92
:1015B00049015A019B01AC01A7EAB1E40E948D0ADE
:1015C0006B017C01ACEEB4EFA50194010E948F0B7E
:1015D000DC01CB018C0D9D1DAE1DBF1DB7FF03C0EF
:1015E0000197A109B04888839983AA83BB839F7719
:1015F000DF91CF91FF90EF90DF90CF90BF90AF90B1
:101600009F908F9008950E94BA0A08958EE091E00D
:101610000E94BA0A0895A0E0B0E080930E01909372
:101620000F01A0931001B09311010895CF93DF93A0
:10163000EC012B8120FF33C026FF0AC02F7B2B83B8
:101640008E819F8101969F838E838A8190E029C03D
:1016500022FF0FC0E881F9818081992787FD90954D
:10166000009719F420622B831AC03196F983E8831E
:101670000EC0EA85FB85099597FF09C02B8101966D
:1016800011F080E201C080E1822B8B8308C02E81A3
:101690003F812F5F3F4F3F832E83992702C08FEFFB
:1016A0009FEFDF91CF9108950F931F93CF93DF9317
:1016B000FB01238121FD03C08FEF9FEF28C022FF94
:1016C00016C046815781248135814217530744F45F
:1016D000A081B1819D012F5F3F4F318320838C9387
:1016E000268137812F5F3F4F3783268310C0EB0160
:1016F000092F182F0084F185E02D0995892BE1F63B
:101700008E819F8101969F838E83812F902FDF9101
:10171000CF911F910F910895B7FF0C948D0A0E94ED
:101720008D0A821B930B0895052E97FB1EF40094DF
:101730000E94AB0B57FD07D00E94980A07FC03D00C
:101740004EF40C94AB0B50954095309521953F4F3E
:101750004F4F5F4F089590958095709561957F4F9D
:0A1760008F4F9F4F0895F894FFCFBC
:10176A003FC8000000320000005E010000FE0100D8
:02177A0000006D
:00000001FF

@ -0,0 +1,89 @@
[BOM_OPTIONS]
; General BoM options here
; If 'ignore_dnf' option is set to 1, rows that are not to be fitted on the PCB will not be written to the BoM file
ignore_dnf = 1
; If 'use_alt' option is set to 1, grouped references will be printed in the alternate compressed style eg: R1-R7,R18
use_alt = 0
; If 'alt_wrap' option is set to and integer N, the references field will wrap after N entries are printed
alt_wrap = 0
; If 'number_rows' option is set to 1, each row in the BoM will be prepended with an incrementing row number
number_rows = 1
; If 'group_connectors' option is set to 1, connectors with the same footprints will be grouped together, independent of the name of the connector
group_connectors = 1
; If 'test_regex' option is set to 1, each component group will be tested against a number of regular-expressions (specified, per column, below). If any matches are found, the row is ignored in the output file
test_regex = 1
; If 'merge_blank_fields' option is set to 1, component groups with blank fields will be merged into the most compatible group, where possible
merge_blank_fields = 1
; If '{opt}' option is set to 1, the schematic version number will be appended to the filename.
include_version_number = 1
; Field name used to determine if a particular part is to be fitted
fit_field = Config
; Make a backup of the bom before generating the new one, using the following template
make_backup = %O.tmp
; Default number of boards to produce if none given on CLI with -n
number_boards = 1
; Default PCB variant if none given on CLI with -r
board_variant = default
[IGNORE_COLUMNS]
; Any column heading that appears here will be excluded from the Generated BoM
; Titles are case-insensitive
Part Lib
Footprint Lib
[COLUMN_ORDER]
; Columns will apear in the order they are listed here
; Titles are case-insensitive
Description
Part
Part Lib
References
Value
Footprint
Footprint Lib
Quantity Per PCB
Build Quantity
Datasheet
[GROUP_FIELDS]
; List of fields used for sorting individual components into groups
; Components which match (comparing *all* fields) will be grouped together
; Field names are case-insensitive
Part
Part Lib
Value
Footprint
Footprint Lib
[COMPONENT_ALIASES]
; A series of values which are considered to be equivalent for the part name
; Each line represents a tab-separated list of equivalent component name values
; e.g. 'c c_small cap' will ensure the equivalent capacitor symbols can be grouped together
; Aliases are case-insensitive
c c_small cap capacitor
r r_small res resistor
sw switch
l l_small inductor
zener zenersmall
d diode d_small
[REGEX_INCLUDE]
; A series of regular expressions used to include parts in the BoM
; If there are any regex defined here, only components that match against ANY of them will be included in the BOM
; Column names are case-insensitive
; Format is: "ColumName Regex" (tab-separated)
[REGEX_EXCLUDE]
; A series of regular expressions used to exclude parts from the BoM
; If a component matches ANY of these, it will be excluded from the BoM
; Column names are case-insensitive
; Format is: "ColumName Regex" (tab-separated)
References ^TP[0-9]*
References ^FID
Part mount.*hole
Part solder.*bridge
Part test.*point
Footprint test.*point
Footprint mount.*hole
Footprint fiducial

File diff suppressed because it is too large Load Diff

@ -0,0 +1,437 @@
EESchema-LIBRARY Version 2.4
#encoding utf-8
#
# Connector_Conn_01x02_Male
#
DEF Connector_Conn_01x02_Male J 0 40 Y N 1 F N
F0 "J" 0 100 50 H V C CNN
F1 "Connector_Conn_01x02_Male" 0 -200 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
Connector*:*_1x??_*
$ENDFPLIST
DRAW
S 34 -95 0 -105 1 1 6 F
S 34 5 0 -5 1 1 6 F
P 2 1 1 6 50 -100 34 -100 N
P 2 1 1 6 50 0 34 0 N
X Pin_1 1 200 0 150 L 50 50 1 1 P
X Pin_2 2 200 -100 150 L 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Connector_Conn_01x05_Male
#
DEF Connector_Conn_01x05_Male J 0 40 Y N 1 F N
F0 "J" 0 300 50 H V C CNN
F1 "Connector_Conn_01x05_Male" 0 -300 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
Connector*:*_1x??_*
$ENDFPLIST
DRAW
S 34 -195 0 -205 1 1 6 F
S 34 -95 0 -105 1 1 6 F
S 34 5 0 -5 1 1 6 F
S 34 105 0 95 1 1 6 F
S 34 205 0 195 1 1 6 F
P 2 1 1 6 50 -200 34 -200 N
P 2 1 1 6 50 -100 34 -100 N
P 2 1 1 6 50 0 34 0 N
P 2 1 1 6 50 100 34 100 N
P 2 1 1 6 50 200 34 200 N
X Pin_1 1 200 200 150 L 50 50 1 1 P
X Pin_2 2 200 100 150 L 50 50 1 1 P
X Pin_3 3 200 0 150 L 50 50 1 1 P
X Pin_4 4 200 -100 150 L 50 50 1 1 P
X Pin_5 5 200 -200 150 L 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Connector_USB_B
#
DEF Connector_USB_B J 0 40 Y Y 1 F N
F0 "J" -200 450 50 H V L CNN
F1 "Connector_USB_B" -200 350 50 H V L CNN
F2 "" 150 -50 50 H I C CNN
F3 "" 150 -50 50 H I C CNN
$FPLIST
USB*
$ENDFPLIST
DRAW
C -150 85 25 0 1 10 F
C -25 135 15 0 1 10 F
S -200 -300 200 300 0 1 10 f
S -150 220 -100 180 0 1 0 F
S -5 -300 5 -270 0 1 0 N
S 10 50 -20 20 0 1 10 F
S 200 -105 170 -95 0 1 0 N
S 200 -5 170 5 0 1 0 N
S 200 195 170 205 0 1 0 N
P 2 0 1 10 -75 85 25 85 N
P 4 0 1 10 -125 85 -100 85 -50 135 -25 135 N
P 4 0 1 10 -100 85 -75 85 -50 35 0 35 N
P 4 0 1 10 25 110 25 60 75 85 25 110 F
P 7 0 1 0 -160 170 -90 170 -90 225 -105 240 -145 240 -160 225 -160 170 N
X VBUS 1 300 200 100 L 50 50 1 1 w
X D- 2 300 -100 100 L 50 50 1 1 B
X D+ 3 300 0 100 L 50 50 1 1 B
X GND 4 0 -400 100 U 50 50 1 1 w
X Shield 5 -100 -400 100 U 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Device_CP_Small
#
DEF Device_CP_Small C 0 10 N N 1 F N
F0 "C" 10 70 50 H V L CNN
F1 "Device_CP_Small" 10 -80 50 H V L CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
CP_*
$ENDFPLIST
DRAW
S -60 -12 60 -27 0 1 0 F
S -60 27 60 12 0 1 0 N
P 2 0 1 0 -50 60 -30 60 N
P 2 0 1 0 -40 50 -40 70 N
X ~ 1 0 100 73 D 50 50 1 1 P
X ~ 2 0 -100 73 U 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Device_C_Small
#
DEF Device_C_Small C 0 10 N N 1 F N
F0 "C" 10 70 50 H V L CNN
F1 "Device_C_Small" 10 -80 50 H V L CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
C_*
$ENDFPLIST
DRAW
P 2 0 1 13 -60 -20 60 -20 N
P 2 0 1 12 -60 20 60 20 N
X ~ 1 0 100 80 D 50 50 1 1 P
X ~ 2 0 -100 80 U 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Device_Crystal_Small
#
DEF Device_Crystal_Small Y 0 40 N N 1 F N
F0 "Y" 0 100 50 H V C CNN
F1 "Device_Crystal_Small" 0 -100 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
Crystal*
$ENDFPLIST
DRAW
S -30 -60 30 60 0 1 0 N
P 2 0 1 15 -50 -30 -50 30 N
P 2 0 1 15 50 -30 50 30 N
X 1 1 -100 0 50 R 50 50 1 1 P
X 2 2 100 0 50 L 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Device_D_Small_ALT
#
DEF Device_D_Small_ALT D 0 10 N N 1 F N
F0 "D" -50 80 50 H V L CNN
F1 "Device_D_Small_ALT" -150 -80 50 H V L CNN
F2 "" 0 0 50 V I C CNN
F3 "" 0 0 50 V I C CNN
$FPLIST
TO-???*
*_Diode_*
*SingleDiode*
D_*
$ENDFPLIST
DRAW
P 2 0 1 0 -30 -40 -30 40 N
P 2 0 1 0 -30 0 30 0 N
P 4 0 1 0 30 -40 -30 0 30 40 30 -40 F
X K 1 -100 0 70 R 50 50 1 1 P
X A 2 100 0 70 L 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Device_LED_Small_ALT
#
DEF Device_LED_Small_ALT D 0 10 N N 1 F N
F0 "D" -50 125 50 H V L CNN
F1 "Device_LED_Small_ALT" -175 -100 50 H V L CNN
F2 "" 0 0 50 V I C CNN
F3 "" 0 0 50 V I C CNN
$FPLIST
LED*
LED_SMD:*
LED_THT:*
$ENDFPLIST
DRAW
P 2 0 1 0 -30 -40 -30 40 N
P 2 0 1 0 40 0 -30 0 N
P 4 0 1 0 30 -40 -30 0 30 40 30 -40 F
P 5 0 1 0 0 30 -20 50 -10 50 -20 50 -20 40 N
P 5 0 1 0 20 50 0 70 10 70 0 70 0 60 N
X K 1 -100 0 70 R 50 50 1 1 P
X A 2 100 0 70 L 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Device_R_POT_Small
#
DEF Device_R_POT_Small RV 0 40 Y N 1 F N
F0 "RV" -175 0 50 V V C CNN
F1 "Device_R_POT_Small" -100 0 50 V V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
Potentiometer*
$ENDFPLIST
DRAW
S 30 71 -30 -71 0 1 10 N
P 6 0 1 0 35 0 25 0 65 15 65 -15 25 0 35 0 F
X 1 1 0 100 25 D 25 25 1 1 P
X 2 2 100 0 39 L 25 25 1 1 P
X 3 3 0 -100 25 U 25 25 1 1 P
ENDDRAW
ENDDEF
#
# Device_R_Small
#
DEF Device_R_Small R 0 10 N N 1 F N
F0 "R" 30 20 50 H V L CNN
F1 "Device_R_Small" 30 -40 50 H V L CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
R_*
$ENDFPLIST
DRAW
S -30 70 30 -70 0 1 8 N
X ~ 1 0 100 30 D 50 50 1 1 P
X ~ 2 0 -100 30 U 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Graphic_Logo_Open_Hardware_Small
#
DEF Graphic_Logo_Open_Hardware_Small #LOGO 0 40 Y Y 1 F N
F0 "#LOGO" 0 275 50 H I C CNN
F1 "Graphic_Logo_Open_Hardware_Small" 0 -225 50 H I C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
DRAW
P 277 0 1 0 132 -171 130 -170 125 -167 118 -162 109 -156 100 -150 93 -146 88 -142 86 -141 85 -142 81 -144 75 -147 71 -149 66 -151 63 -151 63 -151 61 -147 58 -139 53 -130 49 -119 44 -107 38 -95 34 -83 29 -72 26 -64 24 -58 23 -55 23 -55 26 -52 31 -49 41 -40 51 -27 57 -13 60 3 58 18 52 32 42 45 30 54 16 60 0 62 -15 61 -29 55 -42 45 -48 39 -55 26 -60 12 -60 9 -59 -7 -55 -21 -47 -34 -36 -45 -34 -46 -29 -50 -25 -53 -23 -55 -42 -102 -45 -110 -51 -123 -55 -134 -59 -143 -62 -149 -63 -151 -63 -151 -65 -151 -68 -150 -75 -147 -79 -145 -84 -142 -87 -141 -89 -142 -93 -145 -100 -150 -109 -156 -117 -161 -124 -166 -130 -170 -132 -171 -133 -171 -135 -170 -139 -166 -146 -160 -155 -151 -156 -150 -164 -142 -170 -136 -174 -131 -175 -129 -175 -129 -174 -127 -170 -121 -166 -114 -160 -105 -144 -82 -153 -61 -155 -54 -159 -46 -161 -41 -162 -38 -165 -37 -170 -36 -179 -34 -189 -32 -199 -31 -207 -29 -214 -28 -217 -27 -217 -27 -218 -25 -218 -22 -218 -17 -219 -9 -219 3 -219 5 -218 16 -218 25 -218 30 -218 33 -218 33 -215 33 -209 35 -200 36 -190 38 -189 39 -179 41 -170 42 -164 44 -161 45 -161 45 -159 49 -156 56 -152 64 -149 72 -146 79 -144 85 -143 87 -143 87 -145 90 -148 95 -153 102 -160 111 -160 112 -166 121 -171 128 -174 133 -175 136 -175 136 -173 138 -169 143 -162 150 -155 158 -152 160 -144 169 -138 174 -134 177 -132 178 -132 178 -130 176 -124 172 -117 167 -108 161 -107 161 -98 155 -91 150 -86 146 -84 145 -83 145 -80 146 -73 148 -66 151 -58 155 -50 158 -45 160 -42 162 -42 162 -41 165 -40 171 -38 180 -36 191 -35 193 -33 203 -32 212 -31 218 -30 220 -28 221 -23 221 -16 221 -6 221 3 221 13 221 21 221 27 220 29 220 29 220 30 217 32 210 33 201 36 190 36 188 38 178 40 169 41 163 42 161 42 161 47 159 54 156 62 152 82 144 107 161 109 163 118 169 125 174 130 177 133 178 133 178 135 176 140 171 147 165 154 157 160 151 167 144 171 140 174 137 174 135 174 134 173 131 169 126 164 118 158 110 153 102 148 94 144 88 143 85 143 84 145 79 148 72 152 63 160 44 173 41 181 40 192 38 202 36 218 33 219 -26 216 -27 214 -27 208 -29 199 -30 189 -32 181 -34 172 -36 166 -37 163 -37 162 -38 160 -42 157 -49 154 -57 150 -65 147 -73 145 -79 144 -82 145 -84 149 -89 153 -97 159 -105 165 -114 170 -121 173 -126 175 -129 174 -131 171 -135 164 -141 155 -151 153 -152 145 -160 139 -166 134 -170 132 -171 F
ENDDRAW
ENDDEF
#
# Isolator_CNY17-1
#
DEF Isolator_CNY17-1 U 0 40 Y Y 1 F N
F0 "U" -200 200 50 H V L CNN
F1 "Isolator_CNY17-1" 0 200 50 H V L CNN
F2 "" 0 0 50 H I L CNN
F3 "" 0 0 50 H I L CNN
ALIAS CNY17-2 CNY17-3 CNY17-4
$FPLIST
DIP*W7.62mm*
DIP*W10.16mm*
SMDIP*W9.53mm*
$ENDFPLIST
DRAW
S -200 150 200 -150 0 1 10 f
P 2 0 1 10 -125 -25 -75 -25 N
P 2 0 1 0 115 -55 160 -100 N
P 2 0 1 0 115 -50 75 -50 N
P 2 0 1 0 115 -45 160 0 N
P 2 0 1 0 160 -100 200 -100 N
P 2 0 1 0 200 0 160 0 N
P 3 0 1 0 -200 100 -100 100 -100 -30 N
P 3 0 1 0 -100 -25 -100 -100 -200 -100 N
P 3 0 1 0 75 -50 75 100 200 100 N
P 3 0 1 14 115 -10 115 -90 115 -90 N
P 4 0 1 10 -100 -25 -125 25 -75 25 -100 -25 N
P 4 0 1 0 155 -95 145 -75 135 -85 155 -95 N
P 5 0 1 0 -25 -20 25 -20 10 -25 10 -15 25 -20 N
P 5 0 1 0 -25 20 25 20 10 15 10 25 25 20 N
X ~ 1 -300 100 100 R 50 50 1 1 P
X ~ 2 -300 -100 100 R 50 50 1 1 P
X NC 3 -200 0 100 R 50 50 1 1 N N
X ~ 4 300 -100 100 L 50 50 1 1 P
X ~ 5 300 0 100 L 50 50 1 1 P
X ~ 6 300 100 100 L 50 50 1 1 P
ENDDRAW
ENDDEF
#
# MCU_Microchip_ATmega_ATmega328P-PU
#
DEF MCU_Microchip_ATmega_ATmega328P-PU U 0 20 Y Y 1 F N
F0 "U" -500 1450 50 H V L BNN
F1 "MCU_Microchip_ATmega_ATmega328P-PU" 100 -1450 50 H V L TNN
F2 "Package_DIP:DIP-28_W7.62mm" 0 0 50 H I C CIN
F3 "" 0 0 50 H I C CNN
ALIAS ATmega48P-20PU ATmega48A-PU ATmega48PA-PU ATmega88PV-10PU ATmega88P-20PU ATmega88A-PU ATmega88PA-PU ATmega168PV-10PU ATmega168P-20PU ATmega168A-PU ATmega168PA-PU ATmega328-PU ATmega328P-PU
$FPLIST
DIP*W7.62mm*
$ENDFPLIST
DRAW
S -500 -1400 500 1400 0 1 10 f
X ~RESET~/PC6 1 600 -300 100 L 50 50 1 1 T
X XTAL2/PB7 10 600 500 100 L 50 50 1 1 T
X PD5 11 600 -1000 100 L 50 50 1 1 T
X PD6 12 600 -1100 100 L 50 50 1 1 T
X PD7 13 600 -1200 100 L 50 50 1 1 T
X PB0 14 600 1200 100 L 50 50 1 1 T
X PB1 15 600 1100 100 L 50 50 1 1 T
X PB2 16 600 1000 100 L 50 50 1 1 T
X PB3 17 600 900 100 L 50 50 1 1 T
X PB4 18 600 800 100 L 50 50 1 1 T
X PB5 19 600 700 100 L 50 50 1 1 T
X PD0 2 600 -500 100 L 50 50 1 1 T
X AVCC 20 100 1500 100 D 50 50 1 1 W
X AREF 21 -600 1200 100 R 50 50 1 1 P
X GND 22 -50 -1500 100 U 50 50 1 1 P
X PC0 23 600 300 100 L 50 50 1 1 T
X PC1 24 600 200 100 L 50 50 1 1 T
X PC2 25 600 100 100 L 50 50 1 1 T
X PC3 26 600 0 100 L 50 50 1 1 T
X PC4 27 600 -100 100 L 50 50 1 1 T
X PC5 28 600 -200 100 L 50 50 1 1 T
X PD1 3 600 -600 100 L 50 50 1 1 T
X PD2 4 600 -700 100 L 50 50 1 1 T
X PD3 5 600 -800 100 L 50 50 1 1 T
X PD4 6 600 -900 100 L 50 50 1 1 T
X VCC 7 0 1500 100 D 50 50 1 1 W
X GND 8 50 -1500 100 U 50 50 1 1 W
X XTAL1/PB6 9 600 600 100 L 50 50 1 1 T
ENDDRAW
ENDDEF
#
# Mechanical_MountingHole
#
DEF Mechanical_MountingHole H 0 40 Y Y 1 F N
F0 "H" 0 200 50 H V C CNN
F1 "Mechanical_MountingHole" 0 125 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
MountingHole*
$ENDFPLIST
DRAW
C 0 0 50 0 1 50 N
ENDDRAW
ENDDEF
#
# Transistor_FET_2N7000
#
DEF Transistor_FET_2N7000 Q 0 0 Y N 1 F N
F0 "Q" 200 75 50 H V L CNN
F1 "Transistor_FET_2N7000" 200 0 50 H V L CNN
F2 "Package_TO_SOT_THT:TO-92_Inline" 200 -75 50 H I L CIN
F3 "" 0 0 50 H I L CNN
ALIAS TP0610L VP0610L
$FPLIST
TO?92*
$ENDFPLIST
DRAW
C 65 0 111 0 1 10 N
C 100 -70 11 0 1 0 F
C 100 70 11 0 1 0 F
P 2 0 1 0 -100 0 10 0 N
P 2 0 1 0 30 -70 100 -70 N
P 2 0 1 10 30 -50 30 -90 N
P 2 0 1 0 30 0 100 0 N
P 2 0 1 10 30 20 30 -20 N
P 2 0 1 0 30 70 100 70 N
P 2 0 1 10 30 90 30 50 N
P 2 0 1 0 100 -70 100 -100 N
P 2 0 1 0 100 -70 100 0 N
P 2 0 1 0 100 100 100 70 N
P 3 0 1 10 10 75 10 -75 10 -75 N
P 4 0 1 0 40 0 80 15 80 -15 40 0 F
P 4 0 1 0 100 -70 130 -70 130 70 100 70 N
P 4 0 1 0 110 20 115 15 145 15 150 10 N
P 4 0 1 0 130 15 115 -10 145 -10 130 15 N
X S 1 100 -200 100 U 50 50 1 1 P
X G 2 -200 0 100 R 50 50 1 1 I
X D 3 100 200 100 D 50 50 1 1 P
ENDDRAW
ENDDEF
#
# mtk_processor_CH340_module
#
DEF mtk_processor_CH340_module U 0 40 Y Y 1 F N
F0 "U" 50 150 50 H V C CNN
F1 "mtk_processor_CH340_module" 350 -850 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
DRAW
T 900 600 -350 50 0 0 0 USB Normal 0 C C
S 0 100 850 -800 0 1 0 f
X 5V 1 -200 0 200 R 50 50 1 1 w
X GND 10 1050 -500 200 L 50 50 1 1 P
X DTR 11 -200 -700 200 R 50 50 1 1 O
X VCC 2 -200 -100 200 R 50 50 1 1 W
X 3V3 3 -200 -200 200 R 50 50 1 1 w
X TxD 4 -200 -300 200 R 50 50 1 1 O
X RxD 5 -200 -400 200 R 50 50 1 1 I
X GND 6 -200 -500 200 R 50 50 1 1 P
X 5V 7 1050 -200 200 L 50 50 1 1 w
X D- 8 1050 -300 200 L 50 50 1 1 B
X D+ 9 1050 -400 200 L 50 50 1 1 B
ENDDRAW
ENDDEF
#
# power_+3.3V
#
DEF power_+3.3V #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -150 50 H I C CNN
F1 "power_+3.3V" 0 140 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
ALIAS +3.3V
DRAW
P 2 0 1 0 -30 50 0 100 N
P 2 0 1 0 0 0 0 100 N
P 2 0 1 0 0 100 30 50 N
X +3V3 1 0 0 0 U 50 50 1 1 W N
ENDDRAW
ENDDEF
#
# power_+5V
#
DEF power_+5V #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -150 50 H I C CNN
F1 "power_+5V" 0 140 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
DRAW
P 2 0 1 0 -30 50 0 100 N
P 2 0 1 0 0 0 0 100 N
P 2 0 1 0 0 100 30 50 N
X +5V 1 0 0 0 U 50 50 1 1 W N
ENDDRAW
ENDDEF
#
# power_GND
#
DEF power_GND #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -250 50 H I C CNN
F1 "power_GND" 0 -150 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
DRAW
P 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N
X GND 1 0 0 0 D 50 50 1 1 W N
ENDDRAW
ENDDEF
#
#End Library

@ -0,0 +1,3 @@
EESchema-DOCLIB Version 2.0
#
#End Doc Library

@ -0,0 +1,28 @@
EESchema-LIBRARY Version 2.4
#encoding utf-8
#
# CH340_module-mtk_processor
#
DEF CH340_module-mtk_processor U 0 40 Y Y 1 F N
F0 "U" 50 150 50 H V C CNN
F1 "CH340_module-mtk_processor" 350 -850 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
DRAW
T 900 600 -350 50 0 0 0 USB Normal 0 C C
S 0 100 850 -800 0 1 0 f
X 5V 1 -200 0 200 R 50 50 1 1 w
X GND 10 1050 -500 200 L 50 50 1 1 P
X DTR 11 -200 -700 200 R 50 50 1 1 O
X VCC 2 -200 -100 200 R 50 50 1 1 W
X 3V3 3 -200 -200 200 R 50 50 1 1 w
X TxD 4 -200 -300 200 R 50 50 1 1 O
X RxD 5 -200 -400 200 R 50 50 1 1 I
X GND 6 -200 -500 200 R 50 50 1 1 P
X 5V 7 1050 -200 200 L 50 50 1 1 w
X D- 8 1050 -300 200 L 50 50 1 1 B
X D+ 9 1050 -400 200 L 50 50 1 1 B
ENDDRAW
ENDDEF
#
#End Library

@ -0,0 +1,909 @@
(export (version D)
(design
(source /home/marcel/Documenten/electronische_projecten/packetmodem_nano2/packetmodem_nano2/packetmodem_nano2.sch)
(date "za 15 jan 2022 16:07:16 CET")
(tool "Eeschema 5.1.8-5.1.8")
(sheet (number 1) (name /) (tstamps /)
(title_block
(title "Packet modem Nano 2")
(company "M. Konstapel")
(rev 1)
(date 2022-01-14)
(source packetmodem_nano2.sch)
(comment (number 1) (value https://meezenest.nl/mees))
(comment (number 2) (value ""))
(comment (number 3) (value ""))
(comment (number 4) (value "")))))
(components
(comp (ref R6)
(value 100k)
(footprint Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "100k 1% 0.25W"))
(libsource (lib Device) (part R_Small) (description "Resistor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 5ED94444))
(comp (ref R7)
(value 100k)
(footprint Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "100k 1% 0.25W"))
(libsource (lib Device) (part R_Small) (description "Resistor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 5ED95C85))
(comp (ref C8)
(value 1U)
(footprint Capacitor_THT:C_Disc_D7.5mm_W5.0mm_P5.00mm)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "1U 50V 5mm pitch"))
(libsource (lib Device) (part C_Small) (description "Unpolarized capacitor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 5ED95EF8))
(comp (ref RV2)
(value 47k)
(footprint Potentiometer_THT:Potentiometer_ACP_CA9-V10_Vertical)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "47k potentiometer"))
(libsource (lib Device) (part R_POT_Small) (description Potentiometer))
(sheetpath (names /) (tstamps /))
(tstamp 5EDE914D))
(comp (ref R1)
(value 8k2)
(footprint Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "8k2 1% 0.25W"))
(libsource (lib Device) (part R_Small) (description "Resistor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 5EDF6457))
(comp (ref R2)
(value 3k9)
(footprint Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "3k9 1% 0.25W"))
(libsource (lib Device) (part R_Small) (description "Resistor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 5EDF7C48))
(comp (ref R3)
(value 2k2)
(footprint Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "2k2 1% 0.25W"))
(libsource (lib Device) (part R_Small) (description "Resistor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 5EDF800B))
(comp (ref R4)
(value 1k)
(footprint Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "1k 1% 0.25W"))
(libsource (lib Device) (part R_Small) (description "Resistor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 5EDF8401))
(comp (ref R5)
(value 270R)
(footprint Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "270R 1% 0.25W"))
(libsource (lib Device) (part R_Small) (description "Resistor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 5EE0149B))
(comp (ref C5)
(value 100n)
(footprint Capacitor_THT:C_Disc_D7.5mm_W2.5mm_P5.00mm)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "100nF 50V 5mm pitch"))
(libsource (lib Device) (part C_Small) (description "Unpolarized capacitor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 5EE018C3))
(comp (ref C6)
(value 10U/25V)
(footprint Capacitor_THT:CP_Radial_D6.3mm_P2.50mm)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "10U 25V 2.5mm pitch"))
(libsource (lib Device) (part CP_Small) (description "Polarized capacitor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 5EE0BED7))
(comp (ref RV1)
(value 47k)
(footprint Potentiometer_THT:Potentiometer_ACP_CA9-V10_Vertical)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "47k potentiometer"))
(libsource (lib Device) (part R_POT_Small) (description Potentiometer))
(sheetpath (names /) (tstamps /))
(tstamp 5EE12706))
(comp (ref Q1)
(value 2N7000)
(footprint Package_TO_SOT_THT:TO-92_Wide)
(datasheet https://www.fairchildsemi.com/datasheets/2N/2N7000.pdf)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") 2N7000))
(libsource (lib Transistor_FET) (part 2N7000) (description "0.2A Id, 200V Vds, N-Channel MOSFET, 2.6V Logic Level, TO-92"))
(sheetpath (names /) (tstamps /))
(tstamp 5EE19961))
(comp (ref R10)
(value 2M2)
(footprint Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "2M2 1% 0.25W"))
(libsource (lib Device) (part R_Small) (description "Resistor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 5EE1F8E9))
(comp (ref R9)
(value 1k)
(footprint Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "1k 1% 0.25W"))
(libsource (lib Device) (part R_Small) (description "Resistor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 5EE200CE))
(comp (ref C9)
(value 10U/25V)
(footprint Capacitor_THT:CP_Radial_D6.3mm_P2.50mm)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "10U 25V 2.5mm pitch"))
(libsource (lib Device) (part CP_Small) (description "Polarized capacitor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 5EE206EA))
(comp (ref D1)
(value 1N4148)
(footprint Diode_THT:D_DO-34_SOD68_P7.62mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") 1N4148))
(libsource (lib Device) (part D_Small_ALT) (description "Diode, small symbol, filled shape"))
(sheetpath (names /) (tstamps /))
(tstamp 5EE238EB))
(comp (ref U3)
(value CNX36)
(footprint Package_DIP:DIP-6_W7.62mm_Socket_LongPads)
(datasheet http://www.vishay.com/docs/83606/cny17.pdf)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") CNX36))
(libsource (lib Isolator) (part CNY17-1) (description "DC Optocoupler Base Connected, Vce 70V, CTR 40-80%, Viso 5000V (RMS), DIP6"))
(sheetpath (names /) (tstamps /))
(tstamp 5EE408E0))
(comp (ref R8)
(value 270R)
(footprint Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "270R 1% 0.25W"))
(libsource (lib Device) (part R_Small) (description "Resistor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 5EE454CE))
(comp (ref R14)
(value 1k)
(footprint Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "1k 1% 0.25W"))
(libsource (lib Device) (part R_Small) (description "Resistor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 5EE6CBC1))
(comp (ref R15)
(value 1k)
(footprint Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "1k 1% 0.25W"))
(libsource (lib Device) (part R_Small) (description "Resistor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 5EE6DAC9))
(comp (ref R13)
(value 1k)
(footprint Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "1k 1% 0.25W"))
(libsource (lib Device) (part R_Small) (description "Resistor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 5EE784C7))
(comp (ref D2)
(value POWER)
(footprint LED_THT:LED_D3.0mm)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "Green 3mm"))
(libsource (lib Device) (part LED_Small_ALT) (description "Light emitting diode, small symbol, filled shape"))
(sheetpath (names /) (tstamps /))
(tstamp 5EE7C5FC))
(comp (ref D3)
(value RX)
(footprint LED_THT:LED_D3.0mm)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "Yellow 3mm"))
(libsource (lib Device) (part LED_Small_ALT) (description "Light emitting diode, small symbol, filled shape"))
(sheetpath (names /) (tstamps /))
(tstamp 5EE7D047))
(comp (ref D4)
(value TX)
(footprint LED_THT:LED_D3.0mm)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "Red 3mm"))
(libsource (lib Device) (part LED_Small_ALT) (description "Light emitting diode, small symbol, filled shape"))
(sheetpath (names /) (tstamps /))
(tstamp 5EE7D27E))
(comp (ref J1)
(value "To TRX")
(footprint Connector_PinHeader_2.54mm:PinHeader_1x05_P2.54mm_Vertical)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "Header 5 pin 2.54mm pitch"))
(libsource (lib Connector) (part Conn_01x05_Male) (description "Generic connector, single row, 01x05, script generated (kicad-library-utils/schlib/autogen/connector/)"))
(sheetpath (names /) (tstamps /))
(tstamp 5EE9C3C1))
(comp (ref H1)
(value MountingHole)
(footprint MountingHole:MountingHole_3.2mm_M3_DIN965_Pad)
(datasheet ~)
(fields
(field (name Manufacturer) "Not a placable part"))
(libsource (lib Mechanical) (part MountingHole) (description "Mounting Hole without connection"))
(sheetpath (names /) (tstamps /))
(tstamp 5EEC5467))
(comp (ref H2)
(value MountingHole)
(footprint MountingHole:MountingHole_3.2mm_M3_DIN965_Pad)
(datasheet ~)
(fields
(field (name Manufacturer) "Not a placable part"))
(libsource (lib Mechanical) (part MountingHole) (description "Mounting Hole without connection"))
(sheetpath (names /) (tstamps /))
(tstamp 5EEC60D6))
(comp (ref H3)
(value MountingHole)
(footprint MountingHole:MountingHole_3.2mm_M3_DIN965_Pad)
(datasheet ~)
(fields
(field (name Manufacturer) "Not a placable part"))
(libsource (lib Mechanical) (part MountingHole) (description "Mounting Hole without connection"))
(sheetpath (names /) (tstamps /))
(tstamp 5EEC63E4))
(comp (ref H4)
(value MountingHole)
(footprint MountingHole:MountingHole_3.2mm_M3_DIN965_Pad)
(datasheet ~)
(fields
(field (name Manufacturer) "Not a placable part"))
(libsource (lib Mechanical) (part MountingHole) (description "Mounting Hole without connection"))
(sheetpath (names /) (tstamps /))
(tstamp 5EEC6769))
(comp (ref LOGO1)
(value Logo_Open_Hardware_Small)
(footprint Symbol:OSHW-Symbol_6.7x6mm_Copper)
(datasheet ~)
(fields
(field (name Manufacturer) "Not a placable part"))
(libsource (lib Graphic) (part Logo_Open_Hardware_Small) (description "Open Hardware logo, small"))
(sheetpath (names /) (tstamps /))
(tstamp 5EF89C9B))
(comp (ref C7)
(value 10U/25V)
(footprint Capacitor_THT:CP_Radial_D6.3mm_P2.50mm)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "10U 25V 2.5mm pitch"))
(libsource (lib Device) (part CP_Small) (description "Polarized capacitor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 5EFB355B))
(comp (ref J4)
(value mode)
(footprint Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "Header 2 pin 2.54mm pitch"))
(libsource (lib Connector) (part Conn_01x02_Male) (description "Generic connector, single row, 01x02, script generated (kicad-library-utils/schlib/autogen/connector/)"))
(sheetpath (names /) (tstamps /))
(tstamp 5EFB4B99))
(comp (ref R16)
(value 2k2)
(footprint Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "2k2 1% 0.25W"))
(libsource (lib Device) (part R_Small) (description "Resistor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 5EFB7203))
(comp (ref U1)
(value ATmega328P-PU)
(footprint Package_DIP:DIP-28_W7.62mm_LongPads)
(datasheet http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega328_P%20AVR%20MCU%20with%20picoPower%20Technology%20Data%20Sheet%2040001984A.pdf)
(fields
(field (name Manufacturer) Microchip)
(field (name "Ordering #") ATmega328P-PU))
(libsource (lib MCU_Microchip_ATmega) (part ATmega328P-PU) (description "20MHz, 32kB Flash, 2kB SRAM, 1kB EEPROM, DIP-28"))
(sheetpath (names /) (tstamps /))
(tstamp 61EE274C))
(comp (ref Y1)
(value 16MHz)
(footprint Crystal:Crystal_HC49-U_Vertical)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "16MHz crystal"))
(libsource (lib Device) (part Crystal_Small) (description "Two pin crystal, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 61EE649F))
(comp (ref C3)
(value 22p)
(footprint Capacitor_THT:C_Disc_D5.0mm_W2.5mm_P2.50mm)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "22pF 50V 5mm pitch"))
(libsource (lib Device) (part C_Small) (description "Unpolarized capacitor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 61EEF7AE))
(comp (ref C4)
(value 22p)
(footprint Capacitor_THT:C_Disc_D5.0mm_W2.5mm_P2.50mm)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "22pF 50V 5mm pitch"))
(libsource (lib Device) (part C_Small) (description "Unpolarized capacitor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 61EEFE15))
(comp (ref U2)
(value CH340_module)
(footprint mtk_processor:CH340_module)
(fields
(field (name Manufacturer) Otronic.nl)
(field (name "Ordering #") 9365193326391))
(libsource (lib mtk_processor) (part CH340_module) (description ""))
(sheetpath (names /) (tstamps /))
(tstamp 620479BB))
(comp (ref C2)
(value 10U/25V)
(footprint Capacitor_THT:CP_Radial_D6.3mm_P2.50mm)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "10U 25V 2.5mm pitch"))
(libsource (lib Device) (part CP_Small) (description "Polarized capacitor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 62077B7A))
(comp (ref C1)
(value 100n)
(footprint Capacitor_THT:C_Disc_D7.5mm_W2.5mm_P5.00mm)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "100nF 50V 5mm pitch"))
(libsource (lib Device) (part C_Small) (description "Unpolarized capacitor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 6207924D))
(comp (ref R11)
(value 10k)
(footprint Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "10k 1% 0.25W"))
(libsource (lib Device) (part R_Small) (description "Resistor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 6207E258))
(comp (ref C10)
(value 100n)
(footprint Capacitor_THT:C_Disc_D7.5mm_W2.5mm_P5.00mm)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "100nF 50V 5mm pitch"))
(libsource (lib Device) (part C_Small) (description "Unpolarized capacitor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 6207EA82))
(comp (ref J2)
(value USB_B)
(footprint Connector_USB:USB_B_OST_USB-B1HSxx_Horizontal)
(datasheet " ~")
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "USB B connector"))
(libsource (lib Connector) (part USB_B) (description "USB Type B connector"))
(sheetpath (names /) (tstamps /))
(tstamp 62204B4B))
(comp (ref C12)
(value 10U/25V)
(footprint Capacitor_THT:CP_Radial_D6.3mm_P2.50mm)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "10U 25V 2.5mm pitch"))
(libsource (lib Device) (part CP_Small) (description "Polarized capacitor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 61E97180))
(comp (ref C11)
(value 100n)
(footprint Capacitor_THT:C_Disc_D7.5mm_W2.5mm_P5.00mm)
(datasheet ~)
(fields
(field (name Manufacturer) QPL)
(field (name "Ordering #") "100nF 50V 5mm pitch"))
(libsource (lib Device) (part C_Small) (description "Unpolarized capacitor, small symbol"))
(sheetpath (names /) (tstamps /))
(tstamp 61E97932)))
(libparts
(libpart (lib Connector) (part Conn_01x02_Male)
(description "Generic connector, single row, 01x02, script generated (kicad-library-utils/schlib/autogen/connector/)")
(docs ~)
(footprints
(fp Connector*:*_1x??_*))
(fields
(field (name Reference) J)
(field (name Value) Conn_01x02_Male))
(pins
(pin (num 1) (name Pin_1) (type passive))
(pin (num 2) (name Pin_2) (type passive))))
(libpart (lib Connector) (part Conn_01x05_Male)
(description "Generic connector, single row, 01x05, script generated (kicad-library-utils/schlib/autogen/connector/)")
(docs ~)
(footprints
(fp Connector*:*_1x??_*))
(fields
(field (name Reference) J)
(field (name Value) Conn_01x05_Male))
(pins
(pin (num 1) (name Pin_1) (type passive))
(pin (num 2) (name Pin_2) (type passive))
(pin (num 3) (name Pin_3) (type passive))
(pin (num 4) (name Pin_4) (type passive))
(pin (num 5) (name Pin_5) (type passive))))
(libpart (lib Connector) (part USB_B)
(description "USB Type B connector")
(docs " ~")
(footprints
(fp USB*))
(fields
(field (name Reference) J)
(field (name Value) USB_B))
(pins
(pin (num 1) (name VBUS) (type power_out))
(pin (num 2) (name D-) (type BiDi))
(pin (num 3) (name D+) (type BiDi))
(pin (num 4) (name GND) (type power_out))
(pin (num 5) (name Shield) (type passive))))
(libpart (lib Device) (part CP_Small)
(description "Polarized capacitor, small symbol")
(docs ~)
(footprints
(fp CP_*))
(fields
(field (name Reference) C)
(field (name Value) CP_Small))
(pins
(pin (num 1) (name ~) (type passive))
(pin (num 2) (name ~) (type passive))))
(libpart (lib Device) (part C_Small)
(description "Unpolarized capacitor, small symbol")
(docs ~)
(footprints
(fp C_*))
(fields
(field (name Reference) C)
(field (name Value) C_Small))
(pins
(pin (num 1) (name ~) (type passive))
(pin (num 2) (name ~) (type passive))))
(libpart (lib Device) (part Crystal_Small)
(description "Two pin crystal, small symbol")
(docs ~)
(footprints
(fp Crystal*))
(fields
(field (name Reference) Y)
(field (name Value) Crystal_Small))
(pins
(pin (num 1) (name 1) (type passive))
(pin (num 2) (name 2) (type passive))))
(libpart (lib Device) (part D_Small_ALT)
(description "Diode, small symbol, filled shape")
(docs ~)
(footprints
(fp TO-???*)
(fp *_Diode_*)
(fp *SingleDiode*)
(fp D_*))
(fields
(field (name Reference) D)
(field (name Value) D_Small_ALT))
(pins
(pin (num 1) (name K) (type passive))
(pin (num 2) (name A) (type passive))))
(libpart (lib Device) (part LED_Small_ALT)
(description "Light emitting diode, small symbol, filled shape")
(docs ~)
(footprints
(fp LED*)
(fp LED_SMD:*)
(fp LED_THT:*))
(fields
(field (name Reference) D)
(field (name Value) LED_Small_ALT))
(pins
(pin (num 1) (name K) (type passive))
(pin (num 2) (name A) (type passive))))
(libpart (lib Device) (part R_POT_Small)
(description Potentiometer)
(docs ~)
(footprints
(fp Potentiometer*))
(fields
(field (name Reference) RV)
(field (name Value) R_POT_Small))
(pins
(pin (num 1) (name 1) (type passive))
(pin (num 2) (name 2) (type passive))
(pin (num 3) (name 3) (type passive))))
(libpart (lib Device) (part R_Small)
(description "Resistor, small symbol")
(docs ~)
(footprints
(fp R_*))
(fields
(field (name Reference) R)
(field (name Value) R_Small))
(pins
(pin (num 1) (name ~) (type passive))
(pin (num 2) (name ~) (type passive))))
(libpart (lib Graphic) (part Logo_Open_Hardware_Small)
(description "Open Hardware logo, small")
(docs ~)
(fields
(field (name Reference) "#LOGO")
(field (name Value) Logo_Open_Hardware_Small)))
(libpart (lib Isolator) (part CNY17-1)
(aliases
(alias CNY17-2)
(alias CNY17-3)
(alias CNY17-4))
(description "DC Optocoupler Base Connected, Vce 70V, CTR 40-80%, Viso 5000V (RMS), DIP6")
(docs http://www.vishay.com/docs/83606/cny17.pdf)
(footprints
(fp DIP*W7.62mm*)
(fp DIP*W10.16mm*)
(fp SMDIP*W9.53mm*))
(fields
(field (name Reference) U)
(field (name Value) CNY17-1))
(pins
(pin (num 1) (name ~) (type passive))
(pin (num 2) (name ~) (type passive))
(pin (num 3) (name NC) (type NotConnected))
(pin (num 4) (name ~) (type passive))
(pin (num 5) (name ~) (type passive))
(pin (num 6) (name ~) (type passive))))
(libpart (lib MCU_Microchip_ATmega) (part ATmega48PV-10PU)
(aliases
(alias ATmega48P-20PU)
(alias ATmega48A-PU)
(alias ATmega48PA-PU)
(alias ATmega88PV-10PU)
(alias ATmega88P-20PU)
(alias ATmega88A-PU)
(alias ATmega88PA-PU)
(alias ATmega168PV-10PU)
(alias ATmega168P-20PU)
(alias ATmega168A-PU)
(alias ATmega168PA-PU)
(alias ATmega328-PU)
(alias ATmega328P-PU))
(description "10MHz, 4kB Flash, 512B SRAM, 256B EEPROM, DIP-28")
(docs http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-8025-8-bit-AVR-Microcontroller-ATmega48P-88P-168P_Datasheet.pdf)
(footprints
(fp DIP*W7.62mm*))
(fields
(field (name Reference) U)
(field (name Value) ATmega48PV-10PU)
(field (name Footprint) Package_DIP:DIP-28_W7.62mm))
(pins
(pin (num 1) (name ~RESET~/PC6) (type 3state))
(pin (num 2) (name PD0) (type 3state))
(pin (num 3) (name PD1) (type 3state))
(pin (num 4) (name PD2) (type 3state))
(pin (num 5) (name PD3) (type 3state))
(pin (num 6) (name PD4) (type 3state))
(pin (num 7) (name VCC) (type power_in))
(pin (num 8) (name GND) (type power_in))
(pin (num 9) (name XTAL1/PB6) (type 3state))
(pin (num 10) (name XTAL2/PB7) (type 3state))
(pin (num 11) (name PD5) (type 3state))
(pin (num 12) (name PD6) (type 3state))
(pin (num 13) (name PD7) (type 3state))
(pin (num 14) (name PB0) (type 3state))
(pin (num 15) (name PB1) (type 3state))
(pin (num 16) (name PB2) (type 3state))
(pin (num 17) (name PB3) (type 3state))
(pin (num 18) (name PB4) (type 3state))
(pin (num 19) (name PB5) (type 3state))
(pin (num 20) (name AVCC) (type power_in))
(pin (num 21) (name AREF) (type passive))
(pin (num 22) (name GND) (type passive))
(pin (num 23) (name PC0) (type 3state))
(pin (num 24) (name PC1) (type 3state))
(pin (num 25) (name PC2) (type 3state))
(pin (num 26) (name PC3) (type 3state))
(pin (num 27) (name PC4) (type 3state))
(pin (num 28) (name PC5) (type 3state))))
(libpart (lib Mechanical) (part MountingHole)
(description "Mounting Hole without connection")
(docs ~)
(footprints
(fp MountingHole*))
(fields
(field (name Reference) H)
(field (name Value) MountingHole)))
(libpart (lib Transistor_FET) (part 2N7000)
(aliases
(alias TP0610L)
(alias VP0610L))
(description "0.2A Id, 200V Vds, N-Channel MOSFET, 2.6V Logic Level, TO-92")
(docs https://www.fairchildsemi.com/datasheets/2N/2N7000.pdf)
(footprints
(fp TO?92*))
(fields
(field (name Reference) Q)
(field (name Value) 2N7000)
(field (name Footprint) Package_TO_SOT_THT:TO-92_Inline))
(pins
(pin (num 1) (name S) (type passive))
(pin (num 2) (name G) (type input))
(pin (num 3) (name D) (type passive))))
(libpart (lib mtk_processor) (part CH340_module)
(fields
(field (name Reference) U)
(field (name Value) CH340_module))
(pins
(pin (num 1) (name 5V) (type power_out))
(pin (num 2) (name VCC) (type power_in))
(pin (num 3) (name 3V3) (type power_out))
(pin (num 4) (name TxD) (type output))
(pin (num 5) (name RxD) (type input))
(pin (num 6) (name GND) (type passive))
(pin (num 7) (name 5V) (type power_out))
(pin (num 8) (name D-) (type BiDi))
(pin (num 9) (name D+) (type BiDi))
(pin (num 10) (name GND) (type passive))
(pin (num 11) (name DTR) (type output)))))
(libraries
(library (logical Connector)
(uri /usr/share/kicad/library/Connector.lib))
(library (logical Device)
(uri /home/marcel/kicad_sources/kicad-symbols-master/Device.lib))
(library (logical Graphic)
(uri /usr/share/kicad/library/Graphic.lib))
(library (logical Isolator)
(uri /home/marcel/kicad_sources/kicad-symbols-master/Isolator.lib))
(library (logical MCU_Microchip_ATmega)
(uri /home/marcel/kicad_sources/kicad-symbols-master/MCU_Microchip_ATmega.lib))
(library (logical Mechanical)
(uri /usr/share/kicad/library/Mechanical.lib))
(library (logical Transistor_FET)
(uri /home/marcel/kicad_sources/kicad-symbols-master/Transistor_FET.lib))
(library (logical mtk_processor)
(uri /home/marcel/Documenten/electronische_projecten/KiCad_libraries/mtk_processor.lib)))
(nets
(net (code 1) (name TxD)
(node (ref U1) (pin 2))
(node (ref U2) (pin 4)))
(net (code 2) (name RxD)
(node (ref U1) (pin 3))
(node (ref U2) (pin 5)))
(net (code 3) (name "Net-(U2-Pad1)")
(node (ref U2) (pin 2))
(node (ref U2) (pin 1)))
(net (code 4) (name "Net-(C7-Pad1)")
(node (ref J4) (pin 2))
(node (ref J1) (pin 1))
(node (ref C7) (pin 1)))
(net (code 5) (name "Net-(J1-Pad5)")
(node (ref RV2) (pin 1))
(node (ref J1) (pin 5)))
(net (code 6) (name "Net-(J4-Pad1)")
(node (ref R16) (pin 1))
(node (ref J4) (pin 1)))
(net (code 7) (name "Net-(C10-Pad1)")
(node (ref C10) (pin 1))
(node (ref U2) (pin 11)))
(net (code 8) (name "Net-(C3-Pad2)")
(node (ref C3) (pin 2))
(node (ref Y1) (pin 1))
(node (ref U1) (pin 9)))
(net (code 9) (name "Net-(C4-Pad2)")
(node (ref C4) (pin 2))
(node (ref Y1) (pin 2))
(node (ref U1) (pin 10)))
(net (code 10) (name GND)
(node (ref U3) (pin 4))
(node (ref RV2) (pin 3))
(node (ref Q1) (pin 1))
(node (ref RV1) (pin 3))
(node (ref D1) (pin 2))
(node (ref R10) (pin 2))
(node (ref R5) (pin 2))
(node (ref C5) (pin 2))
(node (ref R7) (pin 2))
(node (ref U1) (pin 22))
(node (ref J1) (pin 2))
(node (ref U2) (pin 6))
(node (ref D4) (pin 1))
(node (ref D3) (pin 1))
(node (ref D2) (pin 1))
(node (ref U1) (pin 8))
(node (ref C3) (pin 1))
(node (ref C4) (pin 1))
(node (ref U2) (pin 10))
(node (ref C2) (pin 2))
(node (ref C1) (pin 2))
(node (ref J2) (pin 4))
(node (ref J2) (pin 5))
(node (ref C12) (pin 2))
(node (ref C11) (pin 2)))
(net (code 11) (name "Net-(J1-Pad3)")
(node (ref U3) (pin 5))
(node (ref J1) (pin 3))
(node (ref R16) (pin 2)))
(net (code 12) (name PTT)
(node (ref U1) (pin 5))
(node (ref R9) (pin 2)))
(net (code 13) (name RESET)
(node (ref U1) (pin 1))
(node (ref R11) (pin 1))
(node (ref C10) (pin 2)))
(net (code 14) (name +3V3)
(node (ref U2) (pin 3))
(node (ref R6) (pin 1))
(node (ref U1) (pin 21))
(node (ref C11) (pin 1))
(node (ref C12) (pin 1)))
(net (code 15) (name "Net-(J2-Pad3)")
(node (ref U2) (pin 8))
(node (ref J2) (pin 3)))
(net (code 16) (name "Net-(J2-Pad2)")
(node (ref U2) (pin 9))
(node (ref J2) (pin 2)))
(net (code 17) (name +5V)
(node (ref U1) (pin 20))
(node (ref R13) (pin 2))
(node (ref R8) (pin 1))
(node (ref U2) (pin 7))
(node (ref R11) (pin 2))
(node (ref C1) (pin 1))
(node (ref C2) (pin 1))
(node (ref U1) (pin 7))
(node (ref J2) (pin 1)))
(net (code 18) (name ANALOG_OUT)
(node (ref C6) (pin 2))
(node (ref RV1) (pin 1)))
(net (code 19) (name "Net-(Q1-Pad3)")
(node (ref Q1) (pin 3))
(node (ref U3) (pin 2)))
(net (code 20) (name "Net-(C7-Pad2)")
(node (ref RV1) (pin 2))
(node (ref C7) (pin 2)))
(net (code 21) (name "Net-(C9-Pad1)")
(node (ref C9) (pin 1))
(node (ref R9) (pin 1)))
(net (code 22) (name "Net-(C9-Pad2)")
(node (ref Q1) (pin 2))
(node (ref R10) (pin 1))
(node (ref D1) (pin 1))
(node (ref C9) (pin 2)))
(net (code 23) (name "Net-(C8-Pad2)")
(node (ref C8) (pin 2))
(node (ref RV2) (pin 2)))
(net (code 24) (name "Net-(C5-Pad1)")
(node (ref R1) (pin 1))
(node (ref R4) (pin 1))
(node (ref R3) (pin 1))
(node (ref R2) (pin 1))
(node (ref C5) (pin 1))
(node (ref C6) (pin 1))
(node (ref R5) (pin 1)))
(net (code 25) (name ANALOG_IN)
(node (ref U1) (pin 23))
(node (ref R6) (pin 2))
(node (ref R7) (pin 1))
(node (ref C8) (pin 1)))
(net (code 26) (name "Net-(R1-Pad2)")
(node (ref R1) (pin 2))
(node (ref U1) (pin 6)))
(net (code 27) (name "Net-(R8-Pad2)")
(node (ref R8) (pin 2))
(node (ref U3) (pin 1)))
(net (code 28) (name "Net-(R2-Pad2)")
(node (ref U1) (pin 11))
(node (ref R2) (pin 2)))
(net (code 29) (name "Net-(R3-Pad2)")
(node (ref U1) (pin 12))
(node (ref R3) (pin 2)))
(net (code 30) (name "Net-(R4-Pad2)")
(node (ref U1) (pin 13))
(node (ref R4) (pin 2)))
(net (code 31) (name "Net-(J1-Pad4)")
(node (ref J1) (pin 4)))
(net (code 32) (name "Net-(U1-Pad4)")
(node (ref U1) (pin 4)))
(net (code 33) (name "Net-(U1-Pad28)")
(node (ref U1) (pin 28)))
(net (code 34) (name "Net-(U1-Pad27)")
(node (ref U1) (pin 27)))
(net (code 35) (name "Net-(U1-Pad26)")
(node (ref U1) (pin 26)))
(net (code 36) (name "Net-(U1-Pad25)")
(node (ref U1) (pin 25)))
(net (code 37) (name "Net-(U1-Pad24)")
(node (ref U1) (pin 24)))
(net (code 38) (name "Net-(U1-Pad19)")
(node (ref U1) (pin 19)))
(net (code 39) (name "Net-(U1-Pad18)")
(node (ref U1) (pin 18)))
(net (code 40) (name "Net-(U1-Pad17)")
(node (ref U1) (pin 17)))
(net (code 41) (name "Net-(U1-Pad14)")
(node (ref U1) (pin 14)))
(net (code 42) (name "Net-(D3-Pad2)")
(node (ref R14) (pin 1))
(node (ref D3) (pin 2)))
(net (code 43) (name "Net-(D2-Pad2)")
(node (ref D2) (pin 2))
(node (ref R13) (pin 1)))
(net (code 44) (name TX_LED)
(node (ref R15) (pin 2))
(node (ref U1) (pin 15)))
(net (code 45) (name RX_LED)
(node (ref R14) (pin 2))
(node (ref U1) (pin 16)))
(net (code 46) (name "Net-(D4-Pad2)")
(node (ref D4) (pin 2))
(node (ref R15) (pin 1)))
(net (code 47) (name "Net-(U3-Pad6)")
(node (ref U3) (pin 6)))
(net (code 48) (name "Net-(U3-Pad3)")
(node (ref U3) (pin 3)))))

@ -0,0 +1,252 @@
update=za 15 jan 2022 14:22:00 CET
version=1
last_client=kicad
[general]
version=1
RootSch=
BoardNm=
[cvpcb]
version=1
NetIExt=net
[eeschema]
version=1
LibDir=
[eeschema/libraries]
[schematic_editor]
version=1
PageLayoutDescrFile=
PlotDirectoryName=/home/marcel/Documenten/electronische_projecten/aprs_server/PE1RXF-APRS-server/packetmodem_nano/
SubpartIdSeparator=0
SubpartFirstId=65
NetFmtName=Pcbnew
SpiceAjustPassiveValues=0
LabSize=50
ERC_TestSimilarLabels=1
[pcbnew]
version=1
PageLayoutDescrFile=
LastNetListRead=packetmodem_nano2.net
CopperLayerCount=2
BoardThickness=1.6
AllowMicroVias=0
AllowBlindVias=0
RequireCourtyardDefinitions=0
ProhibitOverlappingCourtyards=1
MinTrackWidth=0.2
MinViaDiameter=0.4
MinViaDrill=0.3
MinMicroViaDiameter=0.2
MinMicroViaDrill=0.09999999999999999
MinHoleToHole=0.25
TrackWidth1=0.25
TrackWidth2=0.7
TrackWidth3=1.5
ViaDiameter1=0.8
ViaDrill1=0.4
ViaDiameter2=2.4
ViaDrill2=0.8
dPairWidth1=0.2
dPairGap1=0.25
dPairViaGap1=0.25
SilkLineWidth=0.12
SilkTextSizeV=1
SilkTextSizeH=1
SilkTextSizeThickness=0.15
SilkTextItalic=0
SilkTextUpright=1
CopperLineWidth=0.2
CopperTextSizeV=1.5
CopperTextSizeH=1.5
CopperTextThickness=0.3
CopperTextItalic=0
CopperTextUpright=1
EdgeCutLineWidth=0.05
CourtyardLineWidth=0.05
OthersLineWidth=0.15
OthersTextSizeV=1
OthersTextSizeH=1
OthersTextSizeThickness=0.15
OthersTextItalic=0
OthersTextUpright=1
SolderMaskClearance=0.051
SolderMaskMinWidth=0.25
SolderPasteClearance=0
SolderPasteRatio=0
[pcbnew/Layer.F.Cu]
Name=F.Cu
Type=0
Enabled=1
[pcbnew/Layer.In1.Cu]
Name=In1.Cu
Type=0
Enabled=0
[pcbnew/Layer.In2.Cu]
Name=In2.Cu
Type=0
Enabled=0
[pcbnew/Layer.In3.Cu]
Name=In3.Cu
Type=0
Enabled=0
[pcbnew/Layer.In4.Cu]
Name=In4.Cu
Type=0
Enabled=0
[pcbnew/Layer.In5.Cu]
Name=In5.Cu
Type=0
Enabled=0
[pcbnew/Layer.In6.Cu]
Name=In6.Cu
Type=0
Enabled=0
[pcbnew/Layer.In7.Cu]
Name=In7.Cu
Type=0
Enabled=0
[pcbnew/Layer.In8.Cu]
Name=In8.Cu
Type=0
Enabled=0
[pcbnew/Layer.In9.Cu]
Name=In9.Cu
Type=0
Enabled=0
[pcbnew/Layer.In10.Cu]
Name=In10.Cu
Type=0
Enabled=0
[pcbnew/Layer.In11.Cu]
Name=In11.Cu
Type=0
Enabled=0
[pcbnew/Layer.In12.Cu]
Name=In12.Cu
Type=0
Enabled=0
[pcbnew/Layer.In13.Cu]
Name=In13.Cu
Type=0
Enabled=0
[pcbnew/Layer.In14.Cu]
Name=In14.Cu
Type=0
Enabled=0
[pcbnew/Layer.In15.Cu]
Name=In15.Cu
Type=0
Enabled=0
[pcbnew/Layer.In16.Cu]
Name=In16.Cu
Type=0
Enabled=0
[pcbnew/Layer.In17.Cu]
Name=In17.Cu
Type=0
Enabled=0
[pcbnew/Layer.In18.Cu]
Name=In18.Cu
Type=0
Enabled=0
[pcbnew/Layer.In19.Cu]
Name=In19.Cu
Type=0
Enabled=0
[pcbnew/Layer.In20.Cu]
Name=In20.Cu
Type=0
Enabled=0
[pcbnew/Layer.In21.Cu]
Name=In21.Cu
Type=0
Enabled=0
[pcbnew/Layer.In22.Cu]
Name=In22.Cu
Type=0
Enabled=0
[pcbnew/Layer.In23.Cu]
Name=In23.Cu
Type=0
Enabled=0
[pcbnew/Layer.In24.Cu]
Name=In24.Cu
Type=0
Enabled=0
[pcbnew/Layer.In25.Cu]
Name=In25.Cu
Type=0
Enabled=0
[pcbnew/Layer.In26.Cu]
Name=In26.Cu
Type=0
Enabled=0
[pcbnew/Layer.In27.Cu]
Name=In27.Cu
Type=0
Enabled=0
[pcbnew/Layer.In28.Cu]
Name=In28.Cu
Type=0
Enabled=0
[pcbnew/Layer.In29.Cu]
Name=In29.Cu
Type=0
Enabled=0
[pcbnew/Layer.In30.Cu]
Name=In30.Cu
Type=0
Enabled=0
[pcbnew/Layer.B.Cu]
Name=B.Cu
Type=0
Enabled=1
[pcbnew/Layer.B.Adhes]
Enabled=1
[pcbnew/Layer.F.Adhes]
Enabled=1
[pcbnew/Layer.B.Paste]
Enabled=1
[pcbnew/Layer.F.Paste]
Enabled=1
[pcbnew/Layer.B.SilkS]
Enabled=1
[pcbnew/Layer.F.SilkS]
Enabled=1
[pcbnew/Layer.B.Mask]
Enabled=1
[pcbnew/Layer.F.Mask]
Enabled=1
[pcbnew/Layer.Dwgs.User]
Enabled=1
[pcbnew/Layer.Cmts.User]
Enabled=1
[pcbnew/Layer.Eco1.User]
Enabled=1
[pcbnew/Layer.Eco2.User]
Enabled=1
[pcbnew/Layer.Edge.Cuts]
Enabled=1
[pcbnew/Layer.Margin]
Enabled=1
[pcbnew/Layer.B.CrtYd]
Enabled=1
[pcbnew/Layer.F.CrtYd]
Enabled=1
[pcbnew/Layer.B.Fab]
Enabled=1
[pcbnew/Layer.F.Fab]
Enabled=1
[pcbnew/Layer.Rescue]
Enabled=0
[pcbnew/Netclasses]
[pcbnew/Netclasses/Default]
Name=Default
Clearance=0.2
TrackWidth=0.25
ViaDiameter=0.8
ViaDrill=0.4
uViaDiameter=0.3
uViaDrill=0.1
dPairWidth=0.2
dPairGap=0.25
dPairViaGap=0.25

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save