...
 
Commits (2)
......@@ -16,6 +16,29 @@ $ jekyll serve
Open a web browser to `localhost:8000` to access the site.
## Scripts
Some shell scripts are included to ease graphics changes. These require a POSIX
compatible `sh` and graphics utilities.
### fixgif
The `fixgif` script is used to ensure a gif is optimized as well as looped
forever. Many older found gifs do not loop indefindefinitely and some have
a weird format that trips viewer implementations up. This utility requires
[Gifsicle](https://www.lcdf.org/gifsicle/) to be installed.
```shell
$ ./fixgif static/bullet.gif
```
### vid2gif
The `vid2gif` script is used to convert a video into an animated gif. This
utility requires [FFmpeg](https://ffmpeg.org/) to be installed.
```shell
$ ./vid2gif input.mp4 output.gif
```
## Licensing
Thematic markup, stylesheets, and scripts in this repository are licensed under
the 2-clause BSD license, see `LICENSE` for details. Page content is excluded
......
......@@ -5,6 +5,7 @@ exclude:
- README.md
- LICENSE
- project.geany
- fixgif
sass:
style: compressed
......@@ -18,3 +19,6 @@ collections:
projects:
output: true
permalink: /projects/:categories/:title:output_ext
scraps:
output: true
permalink: /scraps/:title:output_ext
......@@ -8,6 +8,9 @@ internal:
- title: Projects
icon: projects.gif
url: /projects/
- title: Scraps
icon: scraps.gif
url: /scraps/
external:
- title: GitLab
......
......@@ -6,6 +6,6 @@
{%- endcomment -%}
{% assign _format = "%B %-d, %Y at %l:%M %p" %}
{% assign _format = "%B %-d, %Y at %l:%M %p %Z" %}
<time datetime="{{ include.date | date_to_xmlschema }}">{{ include.date | date: _format }}</time>
{%- comment -%}
An image preview that links to the full view
Parameters:
include.filename: filename of the image in the page's asset dir
include.alt: img alt attribute
include.pixelated: set to true to disable antialiasing
include.nolink: set to true to disable hyperlink
{%- endcomment -%}
{%- capture _image_url -%}
{% include asset_url.fn filename=include.filename %}
{%- endcapture -%}
<div class="image">
{%- unless include.nolink -%}
<a href="{{ _image_url }}">
{%- endunless -%}
<img class="image-image {% if include.pixelated %}image-image-pixelated{% endif %}"
src="{{ _image_url }}" alt="{{ include.alt | escape }}" />
{%- unless include.nolink -%}
</a>
{%- endunless -%}
</div>
{%- comment -%}
An embedded video from a streaming service
Parameters:
include.service: one of [youtube]
include.id: ID of video on streaming service
include.aspect: one of [16:9, 4:3]
{%- endcomment -%}
<div class="video video-{{ include.aspect | replace: ":", "-" }}">
{%- if include.service == "youtube" -%}
<iframe class="video-iframe"
src="//www.youtube.com/embed/{{ include.id }}"
allowfullscreen="" ></iframe>
{%- endif -%}
</div>
......@@ -12,15 +12,15 @@ tape and replayed to the computer.
Triangle:
![Triangle waveform test]({% include asset_url.fn filename="triangle.jpg" %})
{% include image.html filename="triangle.jpg" alt="Triangle waveform test" %}
Sawtooth:
![Sawtooth waveform test]({% include asset_url.fn filename="sawtooth.jpg" %})
{% include image.html filename="sawtooth.jpg" alt="Sawtooth waveform test" %}
Half-period Sine:
![Half-period sine waveform test]({% include asset_url.fn filename="half-sine.jpg" %})
{% include image.html filename="half-sine.jpg" alt="Half-period sine waveform test" %}
I noticed the deck changed the test waveforms with regards to DC offset. The
way I'm encoding information generates a waveform that "rides" one side of the
......
......@@ -76,7 +76,7 @@ bits. The test bit stream was assembled to include the longest runs of like
bits possible using the table above. The test stream was CTRL 1, CTRL 2, 9, 7,
C, 4, CTRL1 (101010010101011001100011110100001110001101101010):
![Balanced code waveform test]({% include asset_url.fn filename="balanced-code.jpg" %})
{% include image.html filename="balanced-code.jpg" alt="Balanced code waveform test" %}
The recovered waveform drifted a small amount in repeated runs of bits, but
does not drift very far. The silent spot in the middle of the above screenshot
......
......@@ -10,7 +10,7 @@ bit more and tested out some waveforms with intentionally-introduced cusps.
The idea was to encode bits as a modified sine wave (or similar) and introduce
a cusp in the direction of the encoded bit.
![Sketch of cusp waveform]({% include asset_url.fn filename="cusp-sketch.jpg" %})
{% include image.html filename="cusp-sketch.jpg" alt="Sketch of cusp waveform" %}
I chose to use x^n as the function for generating the cusp-encoded data. The
generator script was modified to encode a string of bits as individual pulses
......@@ -21,19 +21,19 @@ data rates, but are rounded off at higher ones.
x^2 at 300 bits/sec:
![x^2 waveform at 300 bits/sec]({% include asset_url.fn filename="x2-300bps.jpg" %})
{% include image.html filename="x2-300bps.jpg" alt="x^2 waveform at 300 bits/sec" %}
x^4 at 300 bits/sec:
![x^4 waveform at 300 bits/sec]({% include asset_url.fn filename="x4-300bps.jpg" %})
{% include image.html filename="x4-300bps.jpg" alt="x^4 waveform at 300 bits/sec" %}
x^2 at 4800 bits/sec:
![x^2 waveform at 4800 bits/sec]({% include asset_url.fn filename="x2-4800bps.jpg" %})
{% include image.html filename="x2-4800bps.jpg" alt="x^2 waveform at 4800 bits/sec" %}
x^4 at 4800 bits/sec:
![x^4 waveform at 4800 bits/sec]({% include asset_url.fn filename="x4-4800bps.jpg" %})
{% include image.html filename="x4-4800bps.jpg" alt="x^4 waveform at 4800 bits/sec" %}
I am a bit disappointed that these tests didn't work out as well as I hoped. I
did notice that at higher frequencies (higher data rates) the issue of the
......
......@@ -46,7 +46,7 @@ might be possible.
I also noticed all of the systems treat tape as a 2-state medium. I see tape
as a ternary medium:
![Sketch of ternary representation on tape]({% include asset_url.fn filename="ternary.png" %})
{% include image.html filename="ternary.png" alt="Sketch of ternary representation on tape" %}
Given that tape has three states, a
[bipolar return to zero line coding](https://en.wikipedia.org/wiki/Return-to-zero#Bi-polar_Return-to-Zero_.28Bi-polar_RZ.29)
......@@ -54,7 +54,7 @@ can be used. Each bit can be encoded using a `+` or `-` pulse that returns to
zero. This type of signal is entirely self-clocked, and uses a single pulse to
store a bit.
![Sketch of RTZ code pulses]({% include asset_url.fn filename="rtz-code.png" %})
{% include image.html filename="rtz-code.png" alt="Sketch of RTZ code pulses" %}
This type of coding has a disadvantage: not all tape equipment will have the
same phase. Recording and playback equipment may not have a matching phase
......
......@@ -19,19 +19,20 @@ of the square wave.
300 bits/sec:
![300 bits/sec test]({% include asset_url.fn filename="300bps.jpg" %})
{% include image.html filename="300bps.jpg" alt="300 bits/sec test" %}
1200 bits/sec:
![1200 bits/sec test]({% include asset_url.fn filename="1200bps.jpg" %})
{% include image.html filename="1200bps.jpg" alt="1200 bits/sec test" %}
2400 bits/sec:
![2400 bits/sec test]({% include asset_url.fn filename="2400bps.jpg" %})
{% include image.html filename="2400bps.jpg" alt="2400 bits/sec test" %}
4800 bits/sec:
![4800 bits/sec test]({% include asset_url.fn filename="4800bps.jpg" %})
{% include image.html filename="4800bps.jpg" alt="4800 bits/sec test" %}
In higher bit-rate tests distortion is less of an issue, but weirdness still
exists. My next experiments will be with pulse-shaping. I think finding a
......
......@@ -10,7 +10,7 @@ job at preserving the general shape of the waveform. The only major
distortions that appeared were at zero-crossings near bit changes and during
long runs of 1s or 0s.
![Recording artifact caused by waveform cusps]({% include asset_url.fn filename="cusp-artifact.jpg" %})
{% include image.html filename="cusp-artifact.jpg" alt="Recording artifact caused by waveform cusps" %}
I simplified the x^2 waveform to a triangle wave to avoid slope changes near
zero when bit flips occur. I tested this waveform with the speeds I have tried
......@@ -20,19 +20,19 @@ of repeating bits.
300 bits/sec:
![Triangle waveform at 300 bits/sec]({% include asset_url.fn filename="300bps.jpg" %})
{% include image.html filename="300bps.jpg" alt="Triangle waveform at 300 bits/sec" %}
1200 bits/sec:
![Triangle waveform at 1200 bits/sec]({% include asset_url.fn filename="1200bps.jpg" %})
{% include image.html filename="1200bps.jpg" alt="Triangle waveform at 1200 bits/sec" %}
2400 bits/sec:
![Triangle waveform at 2400 bits/sec]({% include asset_url.fn filename="2400bps.jpg" %})
{% include image.html filename="2400bps.jpg" alt="Triangle waveform at 2400 bits/sec" %}
4800 bits/sec:
![Triangle waveform at 4800 bits/sec]({% include asset_url.fn filename="4800bps.jpg" %})
{% include image.html filename="4800bps.jpg" alt="Triangle waveform at 4800 bits/sec" %}
At higher bit rates the DC centering seems to occur less, but is still an
issue for long runs of the same bit. I decided to tests at 9600 bits/sec to
......@@ -40,7 +40,7 @@ see if even higher speeds would help more:
9600 bits/sec:
![Triangle waveform at 9600 bits/sec]({% include asset_url.fn filename="9600bps.jpg" %})
{% include image.html filename="9600bps.jpg" alt="Triangle waveform at 9600 bits/sec" %}
It appears that a simple triangle pulse shape might be a feasible start to
high data rate tape storage. Because of the DC centering issues I'll be
......
......@@ -12,7 +12,7 @@ and version screens. Configurable values are node number, reboot duration, and
call duration. The following is a screenshot of the output of the `help`
command in [Minicom](https://en.wikipedia.org/wiki/Minicom):
![Command line interface screenshot]({% include asset_url.fn filename="cli.png" %})
{% include image.html filename="cli.png" alt="Command line interface screenshot" %}
Initially this was useless because a power cycle knocked out all settings as
they were stored in RAM. To fix this I added code to save the configuration to
......
......@@ -12,7 +12,7 @@ attached the output of an
directly to the input of the DTMF module. I hit a couple snags along the way,
but nothing came up that wasn't too easy to fix.
![Test breadboard with radio attached]({% include asset_url.fn filename="breadboard-radio.jpg" %})
{% include image.html filename="breadboard-radio.jpg" alt="Test breadboard with radio attached" %}
The radio I attached to the node prototype is one I snagged on Amazon for
about $15 (I bought a
......@@ -29,7 +29,7 @@ and the schematic of the module from a
[product page](https://www.openimpulse.com/blog/products-page/product-category/mt8870-dtmf-audio-decoder-module/)
I found.
![Kenwood headset compatability schematic]({% include asset_url.fn filename="headset-schematic.png" %})
{% include image.html filename="headset-schematic.png" alt="Kenwood headset compatability schematic" %}
The radio uses the tip of the audio connector for audio while the module uses
the ring. It is simple to modify the module to make the two compatible: the
......@@ -38,7 +38,7 @@ instead of the sleeve. The module I received uses a connector with exposed
contacts. I used a pair of diagonal cutters to remove the middle contact then
bridged the tip and sleeve pads on the underside of the board with solder.
![Module modifications]({% include asset_url.fn filename="module-mods.jpg" %})
{% include image.html filename="module-mods.jpg" alt="Module modifications" %}
After this modification the DTMF module started receiving audio. I entered a
few test commands on the keypad of the MD-380 at close range and all worked
......
......@@ -24,7 +24,7 @@ pins and installing them on the bottom of the boards so I can easily use the
modules on breadboard and perfboard. To the left is a module as it is
assembled, to the right is a module that I modified.
![DTMF module modification]({% include asset_url.fn filename="module-mod.jpg" %})
{% include image.html filename="module-mod.jpg" alt="DTMF module modification" %}
I was curious about what all the extra interface circuitry was on the module,
so I looked up
......@@ -37,7 +37,7 @@ It turns out the MT8870D can be configured for a wide variety of use cases
that can affect the timing of DTMF digits. The module utilizes an example
circuit exactly as it appears in the datasheet.
![DTMF module schematic]({% include asset_url.fn filename="module-schematic.png" %})
{% include image.html filename="module-schematic.png" alt="DTMF module schematic" %}
The table at the end of the datasheet indicates that the example configuration
should accept 40ms mark and space durations and reject any durations that are
......
......@@ -33,7 +33,7 @@ This secret can be entered into the serial interface of a node as a base 32 or
hexadecimal string. The following is a screenshot of a dummy code being
entered into the serial interface:
![Screenshot of auth secret command in CLI]({% include asset_url.fn filename="secret-command.png" %})
{% include image.html filename="secret-command.png" alt="Screenshot of auth secret command in CLI" %}
I ended up implementing all of the HOTP algorithms (SHA1, HMAC, base 32, and
hex) from scratch to meet the memory requirements of the ATmega328. This added
......
......@@ -14,7 +14,7 @@ driver for the
that I added to control small AC loads. This driver is dead simple; it
abstracts the inverted logic of the module to make higher level code simpler.
![Relays connected to breadboard circuit]({% include asset_url.fn filename="breadboard-relays.jpg" %})
{% include image.html filename="breadboard-relays.jpg" alt="Relays connected to breadboard circuit" %}
The biggest feature I added was command processing. The current firmware is
capable of fully controlling the relay module via the DTMF command protocol
......
......@@ -6,8 +6,7 @@ categories: [tape-artchive, logs]
---
I just finished splicing together a video demonstration of an artchive.
<iframe allowfullscreen="" frameborder="0" height="281"
src="//www.youtube.com/embed/aFI95TEXlQ4" width="500"></iframe>
{% include video.html service="youtube" id="aFI95TEXlQ4" aspect="16:9" %}
In the video I play a demo tape into an adapter attached to an Android tablet
and a laptop (offscreen). On the tablet I decoded SSTV signals with
......@@ -19,7 +18,7 @@ beginning of the video using my smartphone attached to a tripod with some
After I gathered all the source material I spliced it together using
[Kdenlive](https://kdenlive.org/).
![Playback equipment setup]({% include asset_url.fn filename="playback-setup.jpg" %})
{% include image.html filename="playback-setup.jpg" alt="Playback equipment setup" %}
The audio on the tape I played in the demonstration was generated by [this
make script](https://gitlab.com/unixispower/tape-artchive). The repository
......@@ -27,7 +26,7 @@ contains instructions on how to make a custom artchive and contains the source
material used to create the one shown in the video. I'll be sending this
demo tape to my friend along with the tape I am currently working on for him.
![Artchive tape in case]({% include asset_url.fn filename="artchive-in-case.jpg" %})
{% include image.html filename="artchive-in-case.jpg" alt="Artchive tape in case" %}
I've amassed a bit of equipment and parts from this project, which should make
future tape endeavors a bit easier. I would like to explore more uses for the
......
......@@ -9,7 +9,7 @@ recording the cassettes, but I have made a little more software. I just
finished creating a printable in-browser j-card template. Here is the template
printed on orange card-stock:
![J-card front view]({% include asset_url.fn filename="jcard-front.jpg" %})
{% include image.html filename="jcard-front.jpg" alt="J-card front view" %}
I initially created the template for standard cassette boxes that have a 1"
back panel. After printing a test page I realized my Memorex cassette cases
......@@ -17,7 +17,7 @@ have a back panel that isn't quite 1" tall. I added an option to the template
to shorten the back panel to 0.6" to support these cases. Here is the short
card back in a Memorex case:
![J-card back view]({% include asset_url.fn filename="jcard-back.jpg" %})
{% include image.html filename="jcard-back.jpg" alt="J-card back view" %}
I'm happy with this test print, and will use this template to create the
packaging for the final tape. Feel free to use this template in your own
......
......@@ -8,7 +8,7 @@ Today I received the package of assorted tape drive belts in the mail. None of
the belts in the package were a direct fit for either set of pulleys so I
trimmed the next largest sizes and spliced them with super glue.
![Assortment of square replacement belts]({% include asset_url.fn filename="assorted-belts.jpg" %})
{% include image.html filename="assorted-belts.jpg" alt="Assortment of square replacement belts" %}
The trimmed belts seemed to fit well, but there was still a very noticeable
fast flutter present in playback. I searched for more causes of flutter and
......@@ -23,7 +23,7 @@ the plastic parts. I took apart enough of the mechanism to remove all the
plastic pieces then cleaned them with alcohol. I got too heavy handed with one
of the plastic gears and broke it during cleaning.
![Cracked plastic gear]({% include asset_url.fn filename="cracked-gear.jpg" %})
{% include image.html filename="cracked-gear.jpg" alt="Cracked plastic gear" %}
I made an attempt to glue the gear together with superglue, but I did so
carelessly and ended up misaligning the pieces. I put the deck back together
......
......@@ -57,7 +57,7 @@ calculated. R1 is the resistor across ring and sleeve; R2 is the resistor from
line-in to the selector switch. R1 can be fixed at 2kΩ for convenience making
R2 about 200kΩ. Below is a schematic of the complete adapter circuit.
![Adapter circuit schematic]({% include asset_url.fn filename="adapter-schematic.jpg" %})
{% include image.html filename="adapter-schematic.jpg" alt="Adapter circuit schematic" %}
Once I acquire a couple of 3.5mm connectors and a switch I will be able to
build and test this adapter out.
......
......@@ -13,26 +13,26 @@ similar in appearance; notably the
[TC-FX110](https://www.hifiengine.com/manual_library/sony/tc-fx110.shtml). The
exploded view of the cassette mechanism looked like the one in the TC-FX160:
![Cassette mechanism exploded view]({% include asset_url.fn filename="mechanism-exploded.png" %})
{% include image.html filename="mechanism-exploded.png" alt="Cassette mechanism exploded view" %}
I goofed by guessing the belt placement in the previous log. The exploded view
shows the correct placement of the belts and also shows part numbers for
the belts (3-390-855-01, 3-390-816-01). I googled around a bit for
replacements, but decided to try out a different rubber band approach.
![Rubber band split using a razor blade]({% include asset_url.fn filename="band-split.jpg" %})
{% include image.html filename="band-split.jpg" alt="Rubber band split using a razor blade" %}
I split a large folder band into two almost square strips that looked about
the same size as the original. I wrapped the band around each set of pulleys
and cut the two belts from it. I joined these belts at the edges with
superglue and marked each with a different color to mark where they went.
![Rubber band belts ready to install]({% include asset_url.fn filename="band-belts.jpg" %})
{% include image.html filename="band-belts.jpg" alt="Rubber band belts ready to install" %}
I installed the bands according to the exploded view. The belts were much
easier to install this time around.
![Rubber band belts installed]({% include asset_url.fn filename="bands-installed.jpg" %})
{% include image.html filename="bands-installed.jpg" alt="Rubber band belts installed" %}
The new "belts" made the problem _worse_. Flutter was now very obvious on
the tape I tested with. Not all was bad, though; fast-forward was no longer
......@@ -42,25 +42,24 @@ of the rubber bands causes the flywheel to fluctuate in speed.
I tried replacing the rubber bands with thread tied onto the pulleys. This
looked promising with no tape in, but the tread slipped under load.
![Thread belts installed]({% include asset_url.fn filename="thread-installed.jpg" %})
{% include image.html filename="thread-installed.jpg" alt="Thread belts installed" %}
Not wanting to give up I went to Wal-Mart to look for potential belt
materials. I found a product called "Princess Elastic Cord".
![Package of elastic cord]({% include asset_url.fn filename="elastic-cord.jpg" %})
{% include image.html filename="elastic-cord.jpg" alt="Package of elastic cord" %}
This is a cord made of a rubber-like material, but seems less elastic than
rubber bands. I used the rubber band belts as a guide to cut belts from the
elastic cord.
![Rubber band belts next to elastic belts]({% include asset_url.fn filename="bands-vs-elastic.jpg" %})
{% include image.html filename="bands-vs-elastic.jpg" alt="Rubber band belts next to elastic belts" %}
I installed the belts and played the test tape. The flutter was very reduced
-- but still there. The belt driving the capstan was a little loose, so I
removed a couple centimeters and tried again.
![Elastic belts installed]({% include asset_url.fn filename="elastic-installed.jpg" %})
<img class="lazy" data-src="https://cdn.hackaday.io/images/6129401507341834618.jpg"/>
{% include image.html filename="elastic-installed.jpg" alt="Elastic belts installed" %}
<del>This was it! The test tape had very little audible flutter compared to
other playthroughs (I don't have golden ears, YMMV). I'm curious to see how
......
......@@ -10,19 +10,19 @@ free. Almost all of the blank tapes are Memorex DBS 90 with the excepion being
2 TDK D90. Both types of tape are "Type I" meaning they utilize iron oxide as
the ferromagnetic material.
![Blank tapes]({% include asset_url.fn filename="blank-tapes.jpg" %})
{% include image.html filename="blank-tapes.jpg" alt="Blank tapes" %}
I cleared out all of the tapes the shop had since they were priced at $0.50
each. The employee that sold me the tapes threw in a free recorder that was
destined for the landfill.
![Panasonic tape player top view]({% include asset_url.fn filename="panasonic-top.jpg" %})
{% include image.html filename="panasonic-top.jpg" alt="Panasonic tape player top view" %}
The recorder is a Panasonic model SG-P100. Since the record function is
intended for microphone use I'm going to assume this is a mono recorder. This
unit also contains an AM and FM stereo as well as a phono amplifier.
![Panasonic tape player bottom view]({% include asset_url.fn filename="panasonic-bottom.jpg" %})
{% include image.html filename="panasonic-bottom.jpg" alt="Panasonic tape player bottom view" %}
I'll have to make a line-to-mic level adapter for cassette recorder since it
has a microphone port instead of a line-in. The adapter for the recorder
......
......@@ -8,7 +8,7 @@ I managed to pick up a few critical parts while out shopping today. I found a
3.5mm TRRS auxiliary cable and a small mint tin to act as an enclosure for the
cassette-to-phone adapter.
![Mint tin box and audio cable]({% include asset_url.fn filename="cable-and-box.jpg" %})
{% include image.html filename="cable-and-box.jpg" alt="Mint tin box and audio cable" %}
The original purpose of the adapter was just to adjust the signal out of the
tape player to the level of a smartphone microphone input. I dislike the
......@@ -17,7 +17,7 @@ channel for music or commentary. I came up with a design that allows the left
tape channel to be used for SSTV signals and the right tape channel to drive a
pair of headphones.
![Adapter schematic]({% include asset_url.fn filename="adapter-schematic.png" %})
{% include image.html filename="adapter-schematic.png" alt="Adapter schematic" %}
This adapter tricks a smartphone into detecting a connected microphone by
placing aresistance across the second ring and sleeve of the TRRS connector. A
......@@ -33,7 +33,7 @@ bridged the second ring and sleeve of the TRRS connector going to the tape
player because I needed it to behave like a TRS connector and didn't know
which contact the tape player's headphone jack would connect to.
![Adapter breadboard prototype]({% include asset_url.fn filename="adapter-breadboard.jpg" %})
{% include image.html filename="adapter-breadboard.jpg" alt="Adapter breadboard prototype" %}
I tested this adapter and found it to work with my Honor 5x Android phone as
well as an iPhone 5S. After testing, I put assembled the circuit on a small
......@@ -41,12 +41,12 @@ piece of proto-board and placed it in the metal mint tin. The wires are
secured with zip-ties that are epoxied to the inside of the tin. This provides
no strain relief, but does secure the wires from being moved.
![PCB in mint tin]({% include asset_url.fn filename="adapter-pcb.jpg" %})
{% include image.html filename="adapter-pcb.jpg" alt="PCB in mint tin" %}
I also added added a small screw to keep the lid from accidentally being
opened. Here is the adapter ready for labels.
![Finished adapter]({% include asset_url.fn filename="adapter-finished.jpg" %})
{% include image.html filename="adapter-finished.jpg" alt="Finished adapter" %}
I'm still waiting on belts for the Sony tape deck to arrive. Once I have those
I'll be able to run some format tests. While I wait I'm going to work on
......
......@@ -32,7 +32,7 @@ audio through my laptop's speakers to air-gap the slideshow to Robot36 on my
phone. The quality is pretty poor because of the air-gap, but the slideshow
progressed as expected. Below is one of the images captured from the playback.
![Airgap SSTV test]({% include asset_url.fn filename="airgap-test.png" %})
{% include image.html filename="airgap-test.png" alt="Airgap SSTV test" %}
The [makefile and sample slides](https://gitlab.com/unixispower/tape-artchive)
are published on GitHub for anyone who is interested to see the solution or
......
......@@ -11,7 +11,7 @@ finishing up the make script and put together some
publish my friend's art, so I prepared a tour of the planets of our solar
system.
!["Solar System" tape artchive cover]({% include asset_url.fn filename="solar-system-cover.png" %})
{% include image.html filename="solar-system-cover.png" alt="\"Solar System\" tape artchive cover" %}
I sourced images from the [NASA Images](https://archive.org/details/nasa)
collection on the Internet Archive. I also sourced facts about planets from
......@@ -27,14 +27,14 @@ side the tape made a scraping noise in its shell and slowed playback just
enough to affect picture quality. I trimmed the length of the tape to 10
minutes to reduce the drag of the tape in the shell.
![Trimmed cassette tape]({% include asset_url.fn filename="trimmed-tape.jpg" %})
{% include image.html filename="trimmed-tape.jpg" alt="Trimmed cassette tape" %}
Since testing I also found the speed adjustment pot on the Walkman. I used the
test tape as a calibration tool to set the Walkman's playback speed. You can
see in the captured image where colors are separated pre-adjustment, and where
the colors align post-adjustment.
![Adjustment test]({% include asset_url.fn filename="adjustment-test.png" %})
{% include image.html filename="adjustment-test.png" alt="Adjustment test" %}
After adjusting the Walkman's speed the higher resolution modes looked a lot
better. I am still going to use the Robot 36 mode because it is resilient to
......
......@@ -9,7 +9,7 @@ this log, but that isn't true. This log will be focused on the Sony
TC-FX160 stereo cassette deck that I picked up at a thrift shop
today.
![Sony tape deck front view]({% include asset_url.fn filename="sony-front.jpg" %})
{% include image.html filename="sony-front.jpg" alt="Sony tape deck front view" %}
This deck appears newer than the Panasonic deck from my previous logs. The
Sony deck is a single-purpose device where the Panasonic was a radio, phono
......@@ -20,14 +20,14 @@ As I expected from a thrift shop find, the Sony deck didn't work. I tried
playing a tape, but nothing in the player moved. I did hear a motor start when
I pressed play, so I took the unit apart to look at the belts.
![Tape mechanism without belts installed]({% include asset_url.fn filename="sony-no-belts.jpg" %})
{% include image.html filename="sony-no-belts.jpg" alt="Tape mechanism without belts installed" %}
At first it looked like the belts were broken, but when I tried to remove them
I got a surprise; they had gone so soft the texture was like uncured silicone.
The belts disintegrated as I tried to remove it from the pulleys. I had to
scrape for a little while to get most of the goop cleaned out.
![Animation of belt disentegrating]({% include asset_url.fn filename="belt-goo.gif" %})
{% include image.html filename="belt-goo.gif" alt="Animation of belt disentegrating" %}
I googled around a bit and found that rubber bands or string can be used as
replacement belts. I didn't know how to install the bands as belts on this
......@@ -35,7 +35,7 @@ particular model because the old belts were completely gone. I couldn't find a
service manual for this model, so I had to use the remnants of the old belts
as a guide to place the rubber bands.
![Tape mechanism with rubber band belts]({% include asset_url.fn filename="sony-band-belts.jpg" %})
{% include image.html filename="sony-band-belts.jpg" alt="Tape mechanism with rubber band belts" %}
This seemed to work. The Sony deck will now play and rewind, but will not fast
forward. I think this is because the rubber band attaching the top pulley to
......@@ -46,8 +46,7 @@ I decided to run the same test as I did on the Panasonic to approximate the
frequency response of the Sony deck. The following is a screenshot of audacity
showing the spectrograms of a 20kHz to 20Hz sweeps on the decks.
![Comparison of Panasonic and Sony deck sweeps]({% include asset_url.fn filename="sweep-comparison.jpg" %})
<img class="lazy" data-src="https://cdn.hackaday.io/images/2942541507259095355.jpg"/>
{% include image.html filename="sweep-comparison.jpg" alt="Comparison of Panasonic and Sony deck sweeps" %}
The Sony responds to higher frequencies than the Panasonic. The Sony also
sounds better and has much less noise. I'll be using the Sony deck to record
......
......@@ -16,7 +16,7 @@ meter, while the USB sound card illuminates the +3dB LED at a little over half
volume. These are rough measurements because I made them while gently
"massaging" the AUX button so I could get a glimpse of the max peak levels.
![Sabrent USB sound card]({% include asset_url.fn filename="usb-sound-card.jpg" %})
{% include image.html filename="usb-sound-card.jpg" alt="Sabrent USB sound card" %}
The scratchy button was surprisingly easy to fix. The buttons didn't look easy
to access or disassemble, so I tried a less direct method of cleaning. I
......@@ -26,7 +26,7 @@ that a thin layer of oxidation built up on the switch contacts over years of
non-use. Depressing the switch quickly may have scratched some of that
oxidation off, resulting in a better connection.
![Panasonic VU meter]({% include asset_url.fn filename="panasonic-vu-meter.jpg" %})
{% include image.html filename="panasonic-vu-meter.jpg" alt="Panasonic VU meter" %}
Since I hope to use this recorder for other projects I tested its response to
the full recording range from 20Hz to 20kHz. I'm curious about the frequency
......@@ -45,7 +45,7 @@ NR setting was set to "out" for recording and playback so the waveform being
recorded on the tape would not be modified. Below is a screenshot of the
played and recorded sweep spectrograms in Audacity:
![Panasonic deck sweep]({% include asset_url.fn filename="panasonic-sweep.jpg" %})
{% include image.html filename="panasonic-sweep.jpg" alt="Panasonic deck sweep" %}
Bandwidth of SSTV signals is pretty narrow and frequencies used fall within
1200Hz-2300Hz (see
......
......@@ -18,26 +18,26 @@ cord is packaged. The cord is wrapped around a cardboard back which causes
visible bends every few inches. The belts made with the cord take an oval
shape instead of a perfectly round one.
![Deformed elastic belts]({% include asset_url.fn filename="deformed-belts.jpg" %})
{% include image.html filename="deformed-belts.jpg" alt="Deformed elastic belts" %}
These bends could cause the speed of the motor to slightly change when they
are flattened around a pulley causing a small frequency deviation. To try and
fix this I straightened a length of cord and made another set of belts.
![Deformed elastic cord]({% include asset_url.fn filename="deformed-elastic.jpg" %})
{% include image.html filename="deformed-elastic.jpg" alt="Deformed elastic cord" %}
To straighten the cord I placed it in a bath of boiling water for about 30
seconds then removed and stretched it. I repeated this process 5 times until I
had a fairly straight cord.
![Boiled elastic cord]({% include asset_url.fn filename="boiled-elastic.jpg" %})
{% include image.html filename="boiled-elastic.jpg" alt="Boiled elastic cord" %}
I cut and measured the belts from the previous log since they appeared to be
around right size. The capstan belt measured 143mm, and the fast-forward belt
measured 176mm. I made new belts from the straightened cord. You can see how
the new belts (pink) look much more round than the old belts (blue).
![Deformed and boiled elastic cord]({% include asset_url.fn filename="deformed-vs-boiled.jpg" %})
{% include image.html filename="deformed-vs-boiled.jpg" alt="Deformed and boiled elastic cord" %}
I ran another testing using
[Bach's Fugue in G Minor](https://www.youtube.com/watch?v=ddbxFi3-UO4). To my
......@@ -51,7 +51,7 @@ ranged from very slow flutter with looser belts, to a fast flutter with tight
belts. The flutter never completely left, and got worse as I tried smaller and
smaller belts.
![Pile of unsucessful elastic cord belts]({% include asset_url.fn filename="elastic-failures.jpg" %})
{% include image.html filename="elastic-failures.jpg" alt="Pile of unsucessful elastic cord belts" %}
It seems that the elastic cord wan't as good as I thought it was in the
previous log. I'm giving up on making belts for now to focus on other parts of
......
......@@ -10,7 +10,7 @@ This is a double tape deck that is capable of duplication. I found it at a
local business that sells antiques and oddities for 20$. I brought it home,
cleaned the heads, lubed it up, and ran a test.
![Front view of Technics tape deck]({% include asset_url.fn filename="technics-front.jpg" %})
{% include image.html filename="technics-front.jpg" alt="Front view of Technics tape deck" %}
I recorded the same fugue I used for other tests onto a tape. I tested the
playback in the same deck and my Walkman and couldn't hear any wow or flutter.
......@@ -18,7 +18,7 @@ The deck is newer (1988-89) and seems to be in excellent condition. The belts
don't seem to be cracking, and the tape heads don't show the wear that some of
the other decks did.
![Tape heads in Technics deck]({% include asset_url.fn filename="technics-heads.jpg" %})
{% include image.html filename="technics-heads.jpg" alt="Tape heads in Technics deck" %}
Since the audio test and various other tapes sounded great I decided to
continue testing and look at the performance of different SSTV modes. I
......@@ -34,12 +34,12 @@ the mode variants to the "normal" resolutions of 320x240 and
To compare performance of modes I ran a simple test:
1. Encode the test image with QSSTV or pySSTV using each mode
2. Join the encoded images into a single track
3. Record the track to tape using a tape deck
4. Play the tape using the test device (see below) into a phone running the
app "Robot36"
5. Compare the decoded images by visual inspection
1. Encode the test image with QSSTV or pySSTV using each mode
2. Join the encoded images into a single track
3. Record the track to tape using a tape deck
4. Play the tape using the test device (see below) into a phone running the
app "Robot36"
5. Compare the decoded images by visual inspection
I repeated step 4 for with a Technics RS-T230 and a Walkman WM-FX10. I tested
with a Walkman because my friend will be using a portable cassette player to
......@@ -50,7 +50,7 @@ I still found it useful for identifying tape artifacts. I have compiled the
output images into a single image to make visual comparison easier (view at
full size).
![Format test results]({% include asset_url.fn filename="test-results.jpg" %})
{% include image.html filename="test-results.jpg" alt="Format test results" %}
This test revealed several software bugs. All images were generated using
QSSTV except Martin M1 and Robot 36 which were generated by pySSTV. The
......@@ -59,7 +59,7 @@ of the image and Robot 36 seems to have timing or synchronization issues.
PySSTV's implementation of Robot 36 also has a bug and causes color
information to be sent incorrectly.
![Format test software bugs]({% include asset_url.fn filename="test-bugs.jpg" %})
{% include image.html filename="test-bugs.jpg" alt="Format test software bugs" %}
At first I was surprised by the results of the test. I was anticipating the PD
modes would look best due to the
......
......@@ -9,14 +9,14 @@ likely have to build a line to mic adapter to use the Panasonic tape recorder
with an external input. I am happy to say I was wrong; the Panasonic tape deck
has an auxiliary input.
![Panasonic tape deck front view]({% include asset_url.fn filename="panasonic-front.jpg" %})
{% include image.html filename="panasonic-front.jpg" alt="Panasonic tape deck front view" %}
At first I didn't realize the recorder had an external input. I began the hard
way by taking the device apart and trying to understand the circuitry. After a
long while of tracing leads with a flashlight and marker I decided it would be
faster to understand the functionality of the device by experimenting with it.
![Panasonic tape deck circuit board]({% include asset_url.fn filename="panasonic-inside.jpg" %})
{% include image.html filename="panasonic-inside.jpg" alt="Panasonic tape deck circuit board" %}
I first connected a small speaker to the back of the deck, popped a fresh
cassette in, then switched on the radio and pressed record. To my
......@@ -26,14 +26,14 @@ with the tape mechanism to see if it would budge. On a whim I nudged the
flywheel on the back of the tape compartment (see green arrow below) which
caused the assembly to "click" and start moving as it should.
![Panasonic tape deck flywheel]({% include asset_url.fn filename="panasonic-flywheel.jpg" %})
{% include image.html filename="panasonic-flywheel.jpg" alt="Panasonic tape deck flywheel" %}
I started audacity on my laptop and played one of the recordings generated by
the makefile mentioned in the previous log. To my delight the deck not only
played the auxiliary input through the small speaker, but also recorded it to
tape.
![Temporary recording setup]({% include asset_url.fn filename="recording-setup.jpg" %})
{% include image.html filename="recording-setup.jpg" alt="Temporary recording setup" %}
The joy of having a working recorder was negated by the almost non-responsive
VU meter on the front of the deck. I tested the playback of the tape on my
......
......@@ -10,18 +10,18 @@ car and drove it home to my apartment. The label inside has the part number
42-390; a nice radio for its time in 1942. The wooden cabinet shows a lot of
water damage and aging so it's a perfect donor for a Fallout themed project.
![Philco 42-390]({% include asset_url.fn filename="philco-42-390.jpg" %})
{% include image.html filename="philco-42-390.jpg" alt="Philco 42-390" %}
The original circuitry was trashed, so I decided to start from the ground up
and only recycle the cabinet. I removed the circuitry, faceplate, and speaker
from the cabinet eaving only the wood and some mounting bolts behind.
![Back of gutted radio]({% include asset_url.fn filename="radio-gutted-back.jpg" %})
{% include image.html filename="radio-gutted-back.jpg" alt="Back of gutted radio" %}
I think the radio may have served as a part donor at some point as all the
tubes and many of the components have been removed.
![Radio circuitry]({% include asset_url.fn filename="radio-circuitry.jpg" %})
{% include image.html filename="radio-circuitry.jpg" alt="Radio circuitry" %}
I recruited my friend Kai to help and we managed to procure an air compressor
from a kind stranger in town (small communities rock). After blowing 74 years
......@@ -29,11 +29,11 @@ of dust, spiderwebs, and dead bugs out with the compressor I wiped the
remaining dirt out with a dry cloth. After all of this cleaning I glued the
loose bits of wood and veneer down and threw a coat of furniture polish on.
![Front of gutted radio]({% include asset_url.fn filename="radio-gutted-front.jpg" %})
{% include image.html filename="radio-gutted-front.jpg" alt="Front of gutted radio" %}
My scrap computer pile yielded a display that fits perfectly into the hole
left by the removed radio unit. The donor unit is a Carry-I computer. I can
find little information about this particular model, so I may have to perform
some exploratory surgery to determine how to drive the display.
![Carry-I computer monitor]({% include asset_url.fn filename="carry-monitor.jpg" %})
{% include image.html filename="carry-monitor.jpg" alt="Carry-I computer monitor" %}
......@@ -9,31 +9,31 @@ have decided not to use the MDA monitor and instead use a small RCA color
TV/monitor. This is an easy decision since the monitor will accept the Pi's
composite output without the need for an adapter.
![RCA TV front view]({% include asset_url.fn filename="rca-front.jpg" %})
{% include image.html filename="rca-front.jpg" alt="RCA TV front view" %}
I have never seen a color tube this small before. There is a speaker grille
and a control panel mounted on the side of the unit.
![RCA TV side view]({% include asset_url.fn filename="rca-side.jpg" %})
{% include image.html filename="rca-side.jpg" alt="RCA TV side view" %}
On the back there are inputs for audio and video. I will only be using the
video input as the radio cabinet already contains speakers.
![RCA TV back view]({% include asset_url.fn filename="rca-back.jpg" %})
{% include image.html filename="rca-back.jpg" alt="RCA TV back view" %}
The TV is powered by a 12V DC adapter or by a "D" cell battery sled.
![RCA TV bottom view]({% include asset_url.fn filename="rca-bottom.jpg" %})
{% include image.html filename="rca-bottom.jpg" alt="RCA TV bottom view" %}
The TV is too big to fit in the radio with the casing installed. The casing
was a bit dificult to remove, but I managed to get past the outer shell that
with a couple pairs of vice grips.
![RCA TV exploded]({% include asset_url.fn filename="rca-exploded.jpg" %})
{% include image.html filename="rca-exploded.jpg" alt="RCA TV exploded" %}
Inside the casing there was the following label:
![High voltage warning label]({% include asset_url.fn filename="hv-warning.jpg" %})
{% include image.html filename="hv-warning.jpg" alt="High voltage warning label" %}
I should probably find a good way to shield the tube and board once I get it
installed in the cabinet. Hopefully something lightweight like aluminum or
......
......@@ -10,30 +10,30 @@ diagnostic program to discover the graphics hardware, but that isn't an
option. I can't power on the computer because I lost the power supply brick at
some point in the last couple years (oops).
![Carry-I front view]({% include asset_url.fn filename="carry-front.jpg" %})
{% include image.html filename="carry-front.jpg" alt="Carry-I front view" %}
The computer is very small, only occupying a footprint the length and width of
the monitor. It seems like the model would have made a good candidate for a
POS or cataloging computer.
![Carry-I side view]({% include asset_url.fn filename="carry-side.jpg" %})
{% include image.html filename="carry-side.jpg" alt="Carry-I side view" %}
The 9 pin video connector is on the right side near the power connector. The
label "display" isn't very descriptive; time to go inside.
![IO ports]({% include asset_url.fn filename="io-ports.jpg" %})
{% include image.html filename="io-ports.jpg" alt="IO ports" %}
Two screws hold the outer casing to an inner frame. The outer casing slides
off the rear of the computer after the screws are removed. Inside there are
two 3.5" bays. The left bay holds a 40-pin ATA device; the right holds a
34-pin floppy device.
![Drive bays]({% include asset_url.fn filename="drive-bays.jpg" %})
{% include image.html filename="drive-bays.jpg" alt="Drive bays" %}
Four screws fix the inner chassis to the motherboard. The inner frame slides
off of the front of the board after the screws are removed.
![Motherboard]({% include asset_url.fn filename="motherboard.jpg" %})
{% include image.html filename="motherboard.jpg" alt="Motherboard" %}
I looked at the area of the board near the video port for ICs that appeared to
be connected to the port. After coming up empty on a few searches I found a
......@@ -44,7 +44,7 @@ The part seems to be a combination
[Hercules](https://en.wikipedia.org/wiki/Hercules_Graphics_Card)
video driver and parallel port driver.
![Video IC]({% include asset_url.fn filename="video-ic.jpg" %})
{% include image.html filename="video-ic.jpg" alt="Video IC" %}
One mystery solved, but more questions emerge. It looks like I'll be looking
for a way to drive a monochrome display from the Raspberry Pi.
......@@ -9,12 +9,12 @@ time to mount new speakers in the radio cabinet. I picked up some 1/4" plywood
to act as a adapter to fit the two new speakers into the hole left by the old
one.
![Plywood board for speakers]({% include asset_url.fn filename="speaker-board.jpg" %})
{% include image.html filename="speaker-board.jpg" alt="Plywood board for speakers" %}
I used the old speaker as a guide to mark where mounting holes needed to be
drilled.
![Old speaker traced on plywood board]({% include asset_url.fn filename="speaker-measurement.jpg" %})
{% include image.html filename="speaker-measurement.jpg" alt="Old speaker traced on plywood board" %}
I then drilled mounting holes to match the oval ones on the old speaker. These
greatly eased mounting the plywood in the cabinet because the existing posts
......@@ -27,63 +27,63 @@ the old speaker was mounted on -- not the hole left by the old speaker. This
also compensated for the misalignment of the mounting holes on the plywood (I
should have tried harder to align the old speaker before tracing it).
![Board test-fitted in cabinet]({% include asset_url.fn filename="board-fit.jpg" %})
{% include image.html filename="board-fit.jpg" alt="Board test-fitted in cabinet" %}
The car speakers came with mounting brackets that made great guides for
cutting holes in the plywood.
![Speaker brackets on speaker board]({% include asset_url.fn filename="speaker-brackets.jpg" %})
{% include image.html filename="speaker-brackets.jpg" alt="Speaker brackets on speaker board" %}
I used a bandsaw to cut holes to mount the new speakers. These holes were
slightly larger than the ones in the plastic brackets
![Holes cut out for speakers]({% include asset_url.fn filename="speaker-holes.jpg" %})
{% include image.html filename="speaker-holes.jpg" alt="Holes cut out for speakers" %}
Here are the speakers mounted in the plywood adapter. I used screws from a
recent microwave oven tear-down to secure them in place.
![Front of mounted speakers]({% include asset_url.fn filename="speakers-mounted-front.jpg" %})
{% include image.html filename="speakers-mounted-front.jpg" alt="Front of mounted speakers" %}
I picked up some rubber washers to install between the plywood and wood of the
cabinet to prevent vibration noise.
![Rubber washers]({% include asset_url.fn filename="rubber-washers.jpg" %})
{% include image.html filename="rubber-washers.jpg" alt="Rubber washers" %}
I re-used the original nuts with some new washers to secure the plywood on the
posts in the cabinet.
![Back of mounted speakers]({% include asset_url.fn filename="speakers-mounted-back.jpg" %})
{% include image.html filename="speakers-mounted-back.jpg" alt="Back of mounted speakers" %}
Admittedly this isn't the first hack at making an adapter for these speakers.
Two previous incarnations had various flaws that prevented them from being
used. I used the top (attempted) adapter as scrap wood to mount the AC power
inlet in the cabinet.
![Failed attempt at making a speaker board]({% include asset_url.fn filename="bad-board-attempt.jpg" %})
{% include image.html filename="bad-board-attempt.jpg" alt="Failed attempt at making a speaker board" %}
I cut a small piece off of this scrap to hold the AC inlet. I used a bandsaw
to cut the hole in the middle.
![AC inlet parts]({% include asset_url.fn filename="ac-inlet-parts.jpg" %})
{% include image.html filename="ac-inlet-parts.jpg" alt="AC inlet parts" %}
I sourced two more screws from the microwave oven pile and used them to secure
the inlet in place.
![AC inlet front view]({% include asset_url.fn filename="ac-inlet-front.jpg" %})
{% include image.html filename="ac-inlet-front.jpg" alt="AC inlet front view" %}
I soldered on wire leads to the inlet and covered the exposed bits with
heat-shrink tubing.
![AC inlet back view]({% include asset_url.fn filename="ac-inlet-back.jpg" %})
{% include image.html filename="ac-inlet-back.jpg" alt="AC inlet back view" %}
Two screws hold the inlet assembly to the shelf in the cabinet that previously
held the radio circuitry.
![AC inlet mounted in cabinet]({% include asset_url.fn filename="ac-inlet-mounted.jpg" %})
{% include image.html filename="ac-inlet-mounted.jpg" alt="AC inlet mounted in cabinet" %}
Here's what the cabinet looks like after the new parts were installed.
![Speaker board mounted in cabinet]({% include asset_url.fn filename="board-mounted.jpg" %})
{% include image.html filename="board-mounted.jpg" alt="Speaker board mounted in cabinet" %}
A big thanks to my friend Kai who was nice enough to let me take up space in
his workshop and use his collection of power tools.
......@@ -15,11 +15,11 @@ driver. A DROK TPA 3116 amplifier (far right) will recieve input from a
Raspberry Pi and drive the new speakers. Also pictured is wire that came with
the new drivers and a 3.5mm audio jumper.
![Audio parts]({% include asset_url.fn filename="audio-parts.jpg" %})
{% include image.html filename="audio-parts.jpg" alt="Audio parts" %}
A DMiotech 24V DC power supply (top right) will accept mains power and provide
power to the audio amplifier and Icstation DC to DC 5V USB buck converter
(bottom right) that will power the Raspberry Pi. Also pictured is an AC power
cable, an AC socket, A USB micro B cable, and some terminal strips
![Power parts]({% include asset_url.fn filename="power-parts.jpg" %})
{% include image.html filename="power-parts.jpg" alt="Power parts" %}
......@@ -16,34 +16,34 @@ and I turned it off when it started flickering because I feared it would be
damaged if left on any longer. What little picture that was on the screen was
out of focus and almost entirely white.
![RCA TV power-on test]({% include asset_url.fn filename="rca-test.jpg" %})
{% include image.html filename="rca-test.jpg" alt="RCA TV power-on test" %}
I decided to put the RCA aside and try out a different display that I had
handy: a Coby CX-TV1. The Coby is a small combination TV/radio that operates
on 12V DC. Like the RCA TV the Coby has a video input, but unlike it the
display is black and white.
![Coby TV front view]({% include asset_url.fn filename="coby-front.jpg" %})
{% include image.html filename="coby-front.jpg" alt="Coby TV front view" %}
I found the Coby TV for about $8 while thrifting. I'm happy I didn't have
plans to use battery power because the compartment was left with batteries in
it for quite some time.
![Coby TV battery compartment]({% include asset_url.fn filename="coby-compartment.jpg" %})
{% include image.html filename="coby-compartment.jpg" alt="Coby TV battery compartment" %}
Every battery was heavily damaged by rust.
![Coby TV battery rust]({% include asset_url.fn filename="coby-batteries.jpg" %})
{% include image.html filename="coby-batteries.jpg" alt="Coby TV battery rust" %}
The contacts were completely destroyed.
![Coby TV battery contacts]({% include asset_url.fn filename="coby-contacts.jpg" %})
{% include image.html filename="coby-contacts.jpg" alt="Coby TV battery contacts" %}
Before dismantling the display I did a test to see if it was operational. To
my delight the TV powered on, started relatively quickly, and showed sharp
details in static.
![Coby TV power-on test]({% include asset_url.fn filename="coby-test.jpg" %})
{% include image.html filename="coby-test.jpg" alt="Coby TV power-on test" %}
The back of the Coby TV has a 3.5mm jack labeled "video in". I plugged a TS
pigtail into this jack and a TRRS pigtail into the Pi's AV jack and proceeded
......@@ -51,19 +51,19 @@ to poke around. My initial guess of tip=video, sleeve=ground yielded a bouncy
and bright picture on the tube. I played with the sync and brightness controls
on the back until everything looked fairly clean.
![Linux terminal on Coby TV]({% include asset_url.fn filename="coby-terminal.jpg" %})
{% include image.html filename="coby-terminal.jpg" alt="Linux terminal on Coby TV" %}
I packaged up the video cable by soldering the video wires and installing
shrink tubing on each wire. I sliced a scrap cable sleeve and zip tied it to
the sleeves of the joined cables for strain relief.
![Video Cable]({% include asset_url.fn filename="video-cable.jpg" %})
{% include image.html filename="video-cable.jpg" alt="Video Cable" %}
After verifying the screen was good to use I did a test fit in the cabinet.
The entire TV fit without an issue, but the angle of the tube didn't match the
angle of the panel removed from the cabinet.
![Original Coby TV fit]({% include asset_url.fn filename="coby-vanilla-fit.jpg" %})
{% include image.html filename="coby-vanilla-fit.jpg" alt="Original Coby TV fit" %}
I looked at the TV for a long bit contemplating whether I should tear it apart
like I did with the RCA. I decided to keep the TV in tact so that it would be
......@@ -71,19 +71,19 @@ safer to work around and be more shielded to the environment. I did want to
change the angle of the screen so I took a hacksaw to the battery compartment
to adjust the TV's sitting angle.
![Modified Coby TV]({% include asset_url.fn filename="coby-hacked-up.jpg" %})
{% include image.html filename="coby-hacked-up.jpg" alt="Modified Coby TV" %}
The change isn't extreme, but it's enough to make the screen feel much more
natural. The hacksaw cuts weren't perfectly aligned on both sides, but this
was easily fixed with some 40 grit sand paper.
![Coby TV before and after modification]({% include asset_url.fn filename="coby-before-after.jpg" %})
{% include image.html filename="coby-before-after.jpg" alt="Coby TV before and after modification" %}
I also removed a small bit of wood from the bottom of the opening in the
cabinet. This made it possible to push the TV against the opening in the
cabinet without interference from any of the front-panel controls.
![Modified Coby TV fit]({% include asset_url.fn filename="coby-hacked-fit.jpg" %})
{% include image.html filename="coby-hacked-fit.jpg" alt="Modified Coby TV fit" %}
I think this new display will better help me achieve the retro-futuristic feel
I want in this jukebox. I was excited for the color capability of the RCA TV,
......
......@@ -6,7 +6,7 @@ $text-color: #7cffff;
$link-color: #a466ff;
$code-color: #00ff7f;
$border-color: #9999ff;
$nav-colors: #e6ff3f, #ffa93f, #ff6161, #df3fff, #7478ff, #3fe6ff;
$nav-colors: #e6ff3f, #ffa93f, #ff6161, #df3fff, #7478ff, #3fe6ff, #3dff70;
// fonts
$heading-font-sizes: 2em, 1.5em, 1.17em, 1em, 0.83em, 0.75em;
......
......@@ -87,6 +87,7 @@ hr {
table {
table-layout: fixed;
border-collapse: collapse;
margin: $medium-gap auto;
}
th {
font-weight: bold;
......
@import "icon_preview.scss";
@import "excerpt_preview.scss";
@import "image.scss";
@import "video.scss";
.image {
text-align: center;
margin: $medium-gap 0;
&-image {
max-width: 100%;
@include antialiased;
// include style modifiers
&-pixelated { @include pixelated; }
}
}
.video {
position: relative;
background:green;
// aspect ratio modifiers (padding-bottom = height / width * 100)
&-16-9 { padding-bottom: 56.25%; }
&-4-3 { padding-bottom: 75%; }
&-iframe {
position: absolute;
display: block;
width: 100%;
height: 100%;
border: 0;
}
}
......@@ -44,14 +44,4 @@
&-prev-link { margin-right: $medium-gap; }
&-next { text-align: right;}
&-next-link { margin-left: $medium-gap; }
// rendered markdown
&-content {
p img {
max-width: 100%;
//max-width: $media-width;
@include antialiased;
}
}
}
---
layout: document
title: Android Boot Animations from GIFs
date: 2020-04-07 23:27:00 +0000
---
A simple [shell script](https://gitlab.com/unixispower/gif2bootanim) that
converts GIF files into `bootanimation.zip` files that are compatible with
Android. I wrote this to convert GIFs from [GifCities](https://gifcities.org/)
into boot animations for my phone.
The script takes an animated gif like the following:
{% include image.html filename="input.gif"
alt="Animated GIF input image" pixelated=true %}
And converts it into a boot animation for an Android device:
{% include image.html filename="phone.gif"
alt="Phone showing the generated boot animation" %}
You can find the script and instructions on how to use it in its
[Git repo](https://gitlab.com/unixispower/gif2bootanim).
---
layout: document
title: WLN KD-C1 Teardown
date: 2018-01-11 02:44:00 +0000
---
I tried to find a teardown of the KD-C1 before I purchased it. I managed to
find a [Russian video](https://www.youtube.com/watch?v=zIZWfzFL2QY) of a
partial teardown, but this video stops short of removing the PCB from the
plastic case (for good reason as seen below). I decided to go deep and
completely disassemble the radio as far as I could.
{% include image.html filename="wln-kdc1.jpg" alt="WLN KD-C1 radio" %}
The belt clip and battery cover were easy to remove without tools. Below the
battery cover there were 6 Torx screws holding the plastic halves of the radio
together. One screw was hiding under the battery compartment label.
{% include image.html filename="clip-battery-removed.jpg"
alt="Radio with belt clip and battery removed" %}
Once the screws were removed the two plastic halves separated easily.
{% include image.html filename="back-removed.jpg"
alt="Radio with back half removed exposing PCB" %}
This is the point where the teardown I found stopped. The radio charges via
USB or in a charge cradle that connects to the PCB via metal contacts on the
bottom of the plastic case. These metal contacts are soldered directly onto
the PCB making removal from the case impossible without desoldering or cutting
them.
{% include image.html filename="contact-closeup.jpg"
alt="Battery charging contacts soldered to PCB" %}
I decided to take the risk of melting the case and used a ColdHeat portable
soldering iron and solder sucker to detach the tabs. After using the solder
sucker I was able to push the tabs through the holes they were installed in. I
melted the case just a bit, but it shouldn't be too obvious once the tabs are
replaced.
{% include image.html filename="contact-removed.jpg"
alt="Radio with battery contact removed" %}
The antenna and speaker wires were also soldered to the PCB and needed to be
desoldered before the board was removed. I wasn't able to completely remove
the antenna from the plastic case because it seems to be molded or glued into
the plastic. To work around this I tucked the antenna under the board once I
desoldered it.
{% include image.html filename="antenna-tucked.jpg"
alt="Antenna desoldered and tucked under PCB" %}
After the tabs, speaker, and antenna were disconnected the only remaining
restraint was a nut hidden below the volume/power knob. I removed the knob by
pulling it off the potentiometer. I was able to loosen the nut by wedging a
flat head screwdriver in one of the grooves and pushing to cause the nut to
spin counter-clockwise
{% include image.html filename="pot-nut.jpg"
alt="Nut attaching potentiometer to case" %}
Once all impeding connections were been broken I (finally) removed the PCB
from the case. I used a screwdriver to lift the right side of the board and
pulled it out by the lower right corner. This step was a little tricky and
took some patience.
{% include image.html filename="pcb-lifted.jpg"
alt="PCB pried away from casing using a screwdriver" %}
I took some photos of the board once I got it out. I tried to get clear shots
of all the ICs and traces in case someone finds them useful.
{% include image.html filename="pcb-back.jpg" alt="Back view of PCB" %}
Here is a shot of the side of "font" of the PCB that is hidden by the case.
{% include image.html filename="pcb-front.jpg" alt="Front view of PCB" %}
There are several 8-pin packages on the front of the board. One IC is labelled
with the model number of the radio "KD-C1", the other is labelled "HK24C08".
{% include image.html filename="pcb-front-bottom.jpg"
alt="Bottom of the front of the PCB" %}
This one is labelled "M4871".
{% include image.html filename="pcb-front-top.jpg"
alt="Top of the front of the PCB" %}
There is also what looks to be a custom microcontroller "TA3767P" and a radio
transceiver IC "AT1846S" on the back of the board. I had to remove a metal
shield to get access to the transceiver IC.
{% include image.html filename="pcb-back-bottom.jpg"
alt="Bottom of the back of the PCB" %}
I didn't come up with much searching for the AT1846S. I found a
[general description](https://img.ozdisan.com/ETicaret_Dosya/500549_6108302.pdf)
posted by a supplier, but I couldn't find a datasheet. The general description
states the IC is portable FM radio transceiver that works in the ranges
134MHz-174MHz, 200MHz-260MHz, and 400MHz-520MHz. At first glance this IC looks
similar to the
[RDA1846](https://github.com/phishman/RDA1846/tree/master/Datasheets) (aside
from the "S" suffix) that is in the Baofeng UV-3R radios. The layout of the
AT1846S on the PCB is similar to the pinout of the RDA1846 from its datasheet
meaning the two might be pin-compatible.
This has been a promising teardown. I am pleased to find out that the radio's
transceiver IC might officially support 1.25m frequencies. Now I just need
access to a spectrum analyzer and some radio testing equipment so I can get my
hand dirty with modifications.
#!/bin/sh
# Fix animated gifs designed for old browsers like Netscape
# Usage: fixgif file...
gifsicle --verbose --batch \
--no-comments --colors=256 --loopcount --optimize=3 \
"[email protected]"
......@@ -6,6 +6,5 @@ flair: in-progress
This site is always under construction, but I have yet to finish the homepage.
Check out the other content while I think of what to put here :)
<div style="text-align: center;">
<img style="max-width: 100%" src="{{ site.baseurl }}/static/construction.gif" alt="Under construction" />
</div>
{% include image.html filename="construction.gif"
alt="Under construction" nolink=true pixelated=true %}
......@@ -4,6 +4,6 @@ title: Personal Projects
item_collection: projects
item_template: icon_preview.html
---
I like to hack around on electronics and software to meet immediate "needs" as
I like to make electronics and write software to meet immediate "needs" as
well as to have some fun (okay, mostly for fun). Here are some of the projects
I have made:
---
layout: collection
title: Scraps
item_collection: scraps
item_template: icon_preview.html
---
Sometimes I like to take stuff apart to explore and maybe make some
modifications while I'm inside. Sometimes I need a quick, hacky script for an
experiment or other fun. This page collects the smaller endeavors that aren't
involved enough to be projects but are still worth posting:
static/bullet.gif

1.55 KB | W: | H:

static/bullet.gif

1.55 KB | W: | H:

static/bullet.gif
static/bullet.gif
static/bullet.gif
static/bullet.gif
  • 2-up
  • Swipe
  • Onion skin
static/complete.gif

3.42 KB | W: | H:

static/complete.gif

3.41 KB | W: | H:

static/complete.gif
static/complete.gif
static/complete.gif
static/complete.gif
  • 2-up
  • Swipe
  • Onion skin
static/dead.gif

9.26 KB | W: | H:

static/dead.gif

9.26 KB | W: | H:

static/dead.gif
static/dead.gif
static/dead.gif
static/dead.gif
  • 2-up
  • Swipe
  • Onion skin
static/divider-2.gif

1.43 KB | W: | H:

static/divider-2.gif

1.43 KB | W: | H:

static/divider-2.gif
static/divider-2.gif
static/divider-2.gif
static/divider-2.gif
  • 2-up
  • Swipe
  • Onion skin
static/email.gif

2.39 KB | W: | H:

static/email.gif

2.39 KB | W: | H:

static/email.gif
static/email.gif
static/email.gif
static/email.gif
  • 2-up
  • Swipe
  • Onion skin
static/gitlab.gif

6.66 KB | W: | H:

static/gitlab.gif

6.66 KB | W: | H:

static/gitlab.gif
static/gitlab.gif
static/gitlab.gif
static/gitlab.gif
  • 2-up
  • Swipe
  • Onion skin
static/home.gif

606 Bytes | W: | H:

static/home.gif

606 Bytes | W: | H:

static/home.gif
static/home.gif
static/home.gif
static/home.gif
  • 2-up
  • Swipe
  • Onion skin
static/next.gif

1.02 KB | W: | H:

static/next.gif

1.02 KB | W: | H:

static/next.gif
static/next.gif
static/next.gif
static/next.gif
  • 2-up
  • Swipe
  • Onion skin
static/posts.gif

2.06 KB | W: | H:

static/posts.gif

2.06 KB | W: | H:

static/posts.gif
static/posts.gif
static/posts.gif
static/posts.gif
  • 2-up
  • Swipe
  • Onion skin
static/prev.gif

1.02 KB | W: | H:

static/prev.gif

1.02 KB | W: | H:

static/prev.gif
static/prev.gif
static/prev.gif
static/prev.gif
  • 2-up
  • Swipe
  • Onion skin
static/projects.gif

1.82 KB | W: | H:

static/projects.gif

1.82 KB | W: | H:

static/projects.gif
static/projects.gif
static/projects.gif
static/projects.gif
  • 2-up
  • Swipe
  • Onion skin