PageSourceSearch

https://eequalspi.com/

html eequalspi.com collected 2026-10-08 02:31:45 UTC 169,981 bytes, 1,473 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en-US" class="no-js">
3<head>
4	<meta charset="UTF-8">
5	<meta name="viewport" content="width=device-width, initial-scale=1">
6	<link rel="profile" href="http://gmpg.org/xfn/11">
7		
7<script>(function(html){html.className = html.className.replace(/\bno-js\b/,'js')})(document.documentElement);</script>
7
8<title>e ≈ π &#8211; Electronics, Hacking, Stupid Ideas</title>
9<meta name='robots' content='max-image-preview:large' />
10<link rel='dns-prefetch' href='//fonts.googleapis.com' />
11<link href='https://fonts.gstatic.com' crossorigin rel='preconnect' />
12<link rel="alternate" type="application/rss+xml" title="e ≈ π &raquo; Feed" href="https://eequalspi.com/index.php/feed/" />
13<link rel="alternate" type="application/rss+xml" title="e ≈ π &raquo; Comments Feed" href="https://eequalspi.com/index.php/comments/feed/" />
14<style id="wp-img-auto-sizes-contain-inline-css">
15img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px}
16/*# sourceURL=wp-img-auto-sizes-contain-inline-css */
17</style>
18<link rel='stylesheet' id='embedpress-css-css' href='https://eequalspi.com/wp-content/plugins/embedpress/assets/css/embedpress.css?ver=1787385922' media='all' />
19<link rel='stylesheet' id='embedpress-blocks-style-css' href='https://eequalspi.com/wp-content/plugins/embedpress/assets/css/blocks.build.css?ver=1787385922' media='all' />
20<style id="wp-emoji-styles-inline-css">
21
22	img.wp-smiley, img.emoji {
23		display: inline !important;
24		border: none !important;
25		box-shadow: none !important;
26		height: 1em !important;
27		width: 1em !important;
28		margin: 0 0.07em !important;
29		vertical-align: -0.1em !important;
30		background: none !important;
31		padding: 0 !important;
32	}
33/*# sourceURL=wp-emoji-styles-inline-css */
34</style>
35<style id="wp-block-library-inline-css">
36:root{--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color);--wp-editor-canvas-background:#ddd;--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,160.5;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-element-button{cursor:pointer}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:root{--wp--preset--font-size--normal:16px;
36--wp--preset--font-size--huge:42px}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}:root .has-text-align-center{text-align:center}:root .has-text-align-left{text-align:left}:root .has-text-align-right{text-align:right}.has-fit-text{white-space:nowrap!important}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{word-wrap:normal!important;border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.screen-reader-text:focus{background-color:#ddd;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style*=border-color]){border-style:solid}html :where([style*=border-top-color]){border-top-style:solid}html :where([style*=border-right-color]){border-right-style:solid}html :where([style*=border-bottom-color]){border-bottom-style:solid}html :where([style*=border-left-color]){border-left-style:solid}html :where([style*=border-width]){border-style:solid}html :where([style*=border-top-width]){border-top-style:solid}html :where([style*=border-right-width]){border-right-style:solid}html :where([style*=border-bottom-width]){border-bottom-style:solid}html :where([style*=border-left-width]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}}
37
38/*# sourceURL=/wp-includes/css/dist/block-library/common.min.css */
39</style>
40<style id="wp-block-heading-inline-css">
41h1:where(.wp-block-heading).has-background,h2:where(.wp-block-heading).has-background,h3:where(.wp-block-heading).has-background,h4:where(.wp-block-heading).has-background,h5:where(.wp-block-heading).has-background,h6:where(.wp-block-heading).has-background{padding:1.25em 2.375em}h1.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h1.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h2.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h2.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h3.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h3.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h4.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h4.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h5.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h5.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h6.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h6.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]){rotate:180deg}
42/*# sourceURL=https://eequalspi.com/wp-includes/blocks/heading/style.min.css */
43</style>
44<style id="wp-block-image-inline-css">
45.wp-block-image>a,.wp-block-image>figure>a{display:inline-block}.wp-block-image img{box-sizing:border-box;height:auto;max-width:100%;vertical-align:bottom}@media not (prefers-reduced-motion){.wp-block-image img.hide{visibility:hidden}.wp-block-image img.show{animation:show-content-image .4s}}.wp-block-image[style*=border-radius] img,.wp-block-image[style*=border-radius]>a{border-radius:inherit}.wp-block-image.has-custom-border img{box-sizing:border-box}.wp-block-image.aligncenter{text-align:center}.wp-block-image.alignfull>a,.wp-block-image.alignwide>a{width:100%}.wp-block-image.alignfull img,.wp-block-image.alignwide img{height:auto;width:100%}.wp-block-image .aligncenter,.wp-block-image .alignleft,.wp-block-image .alignright,.wp-block-image.aligncenter,.wp-block-image.alignleft,.wp-block-image.alignright{display:table}.wp-block-image .aligncenter>figcaption,.wp-block-image .alignleft>figcaption,.wp-block-image .alignright>figcaption,.wp-block-image.aligncenter>figcaption,.wp-block-image.alignleft>figcaption,.wp-block-image.alignright>figcaption{caption-side:bottom;display:table-caption}.wp-block-image .alignleft{float:left;margin:.5em 1em .5em 0}.wp-block-image .alignright{float:right;margin:.5em 0 .5em 1em}.wp-block-image .aligncenter{margin-left:auto;margin-right:auto}.wp-block-image :where(figcaption){margin-bottom:1em;margin-top:.5em}.wp-block-image.is-style-circle-mask img{border-radius:9999px}@supports ((-webkit-mask-image:none) or (mask-image:none)) or (-webkit-mask-image:none){.wp-block-image.is-style-circle-mask img{border-radius:0;-webkit-mask-image:url('data:image/svg+xml;utf8,<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"/></svg>');mask-image:url('data:image/svg+xml;utf8,<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"/></svg>');mask-mode:alpha;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}}:root :where(.wp-block-image.is-style-rounded img,.wp-block-image .is-style-rounded img){border-radius:9999px}.wp-block-image figure{margin:0}.wp-lightbox-container{display:flex;flex-direction:column;position:relative}.wp-lightbox-container img{cursor:zoom-in}.wp-lightbox-container img:hover+button{opacity:1}.wp-lightbox-container button{align-items:center;backdrop-filter:blur(16px) saturate(180%);background-color:#5a5a5a40;border:none;border-radius:4px;cursor:zoom-in;display:flex;height:20px;justify-content:center;opacity:0;padding:0;position:absolute;right:16px;text-align:center;top:16px;width:20px;z-index:100}@media not (prefers-reduced-motion){.wp-lightbox-container button{transition:opacity .2s ease}}.wp-lightbox-container button:focus-visible{outline:3px auto #5a5a5a40;outline:3px auto -webkit-focus-ring-color;outline-offset:3px}.wp-lightbox-container button:hover{cursor:pointer;opacity:1}.wp-lightbox-container button:focus{opacity:1}.wp-lightbox-container button:focus,.wp-lightbox-container button:hover,.wp-lightbox-container button:not(:hover):not(:active):not(.has-background){background-color:#5a5a5a40;border:none}.wp-lightbox-overlay{box-sizing:border-box;
45cursor:zoom-out;height:100vh;left:0;overflow:hidden;position:fixed;top:0;visibility:hidden;width:100%;z-index:100000}.wp-lightbox-overlay .wp-lightbox-close-button{align-items:center;cursor:pointer;display:flex;font-family:inherit;gap:8px;justify-content:center;line-height:1;min-height:40px;min-width:40px;padding:0 4px;position:absolute;right:calc(env(safe-area-inset-right) + 16px);top:calc(env(safe-area-inset-top) + 16px);z-index:5000000}.wp-lightbox-overlay .wp-lightbox-close-button:focus,.wp-lightbox-overlay .wp-lightbox-close-button:hover,.wp-lightbox-overlay .wp-lightbox-close-button:not(:hover):not(:active):not(.has-background){background:none;border:none}.wp-lightbox-overlay .wp-lightbox-close-button:has(.wp-lightbox-close-text:not([hidden])) .wp-lightbox-close-icon svg{height:1em;width:1em}.wp-lightbox-overlay .wp-lightbox-close-icon svg{display:block}.wp-lightbox-overlay .wp-lightbox-navigation-button-next,.wp-lightbox-overlay .wp-lightbox-navigation-button-prev{align-items:center;bottom:16px;cursor:pointer;display:flex;font-family:inherit;gap:4px;justify-content:center;line-height:1;min-height:40px;min-width:40px;padding:0 8px;position:absolute;z-index:2000002}.wp-lightbox-overlay .wp-lightbox-navigation-button-next[hidden],.wp-lightbox-overlay .wp-lightbox-navigation-button-prev[hidden]{display:none}@media (min-width:960px){.wp-lightbox-overlay .wp-lightbox-navigation-button-next,.wp-lightbox-overlay .wp-lightbox-navigation-button-prev{bottom:50%;transform:translateY(-50%)}}.wp-lightbox-overlay .wp-lightbox-navigation-button-next:focus,.wp-lightbox-overlay .wp-lightbox-navigation-button-next:hover,.wp-lightbox-overlay .wp-lightbox-navigation-button-next:not(:hover):not(:active):not(.has-background),.wp-lightbox-overlay .wp-lightbox-navigation-button-prev:focus,.wp-lightbox-overlay .wp-lightbox-navigation-button-prev:hover,.wp-lightbox-overlay .wp-lightbox-navigation-button-prev:not(:hover):not(:active):not(.has-background){background:none;border:none;padding:0 8px}.wp-lightbox-overlay .wp-lightbox-navigation-button-next:has(.wp-lightbox-navigation-text:not([hidden])) .wp-lightbox-navigation-icon svg,.wp-lightbox-overlay .wp-lightbox-navigation-button-prev:has(.wp-lightbox-navigation-text:not([hidden])) .wp-lightbox-navigation-icon svg{display:block;height:1.5em;width:1.5em}.wp-lightbox-overlay .wp-lightbox-navigation-button-prev{left:calc(env(safe-area-inset-left) + 16px)}.wp-lightbox-overlay .wp-lightbox-navigation-button-next{right:calc(env(safe-area-inset-right) + 16px)}.wp-lightbox-overlay .wp-lightbox-navigation-icon svg{vertical-align:middle}.wp-lightbox-overlay .lightbox-image-container{height:var(--wp--lightbox-container-height);left:50%;overflow:hidden;position:absolute;top:50%;transform:translate(-50%,-50%);transform-origin:top left;width:var(--wp--lightbox-container-width);z-index:2000001}.wp-lightbox-overlay .wp-block-image{align-items:center;box-sizing:border-box;display:flex;height:100%;justify-content:center;margin:0;position:relative;transform-origin:0 0;width:100%;z-index:3000000}.wp-lightbox-overlay .wp-block-image img{height:var(--wp--lightbox-image-height);min-height:var(--wp--lightbox-image-height);min-width:var(--wp--lightbox-image-width);width:var(--wp--lightbox-image-width)}.wp-lightbox-overlay .wp-block-image figcaption{display:none}.wp-lightbox-overlay button{background:none;border:none}.wp-lightbox-overlay .scrim{background-color:#fff;height:100%;opacity:.9;position:absolute;width:100%;z-index:2000000}.wp-lightbox-overlay.active{visibility:visible}@media not (prefers-reduced-motion){.wp-lightbox-overlay.active{animation:turn-on-visibility .25s both}.wp-lightbox-overlay.active img{animation:turn-on-visibility .35s both}.wp-lightbox-overlay.show-closing-animation:not(.active){animation:turn-off-visibility .35s both}.wp-lightbox-overlay.show-closing-animation:not(.active) img{animation:turn-off-visibility .25s both}.wp-lightbox-overlay.zoom.active{animation:none;opacity:1;visibility:visible}.wp-lightbox-overlay.zoom.active .lightbox-image-container{animation:lightbox-zoom-in .4s}.wp-lightbox-overlay.zoom.active .lightbox-image-container img{animation:none}.wp-lightbox-overlay.zoom.active .scrim{animation:turn-on-visibility .4s forwards}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active){animation:none}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .lightbox-image-container{animation:lightbox-zoom-out .4s}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .lightbox-image-container img{animation:none}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .scrim{animation:turn-off-visibility .4s forwards}}
45@keyframes show-content-image{0%{visibility:hidden}99%{visibility:hidden}to{visibility:visible}}@keyframes turn-on-visibility{0%{opacity:0}to{opacity:1}}@keyframes turn-off-visibility{0%{opacity:1;visibility:visible}99%{opacity:0;visibility:visible}to{opacity:0;visibility:hidden}}@keyframes lightbox-zoom-in{0%{transform:translate(calc((-100vw + var(--wp--lightbox-scrollbar-width))/2 + var(--wp--lightbox-initial-left-position)),calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale))}to{transform:translate(-50%,-50%) scale(1)}}@keyframes lightbox-zoom-out{0%{transform:translate(-50%,-50%) scale(1);visibility:visible}99%{visibility:visible}to{transform:translate(calc((-100vw + var(--wp--lightbox-scrollbar-width))/2 + var(--wp--lightbox-initial-left-position)),calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale));visibility:hidden}}
46/*# sourceURL=https://eequalspi.com/wp-includes/blocks/image/style.min.css */
47</style>
48<style id="wp-block-list-inline-css">
49ol,ul{box-sizing:border-box}:root :where(.wp-block-list.has-background){padding:1.25em 2.375em}
50/*# sourceURL=https://eequalspi.com/wp-includes/blocks/list/style.min.css */
51</style>
52<style id="wp-block-paragraph-inline-css">
53.is-small-text{font-size:.875em}.is-regular-text{font-size:1em}.is-large-text{font-size:2.25em}.is-larger-text{font-size:3em}.has-drop-cap:not(:focus):first-letter{float:left;font-size:8.4em;font-style:normal;font-weight:100;line-height:.68;margin:.05em .1em 0 0;text-transform:uppercase}body.rtl .has-drop-cap:not(:focus):first-letter{float:none;margin-left:.1em}p.has-drop-cap.has-background{overflow:hidden}:root :where(p.has-background){padding:1.25em 2.375em}:where(p.has-text-color:not(.has-link-color)) a{color:inherit}p.has-text-align-left[style*="writing-mode:vertical-lr"],p.has-text-align-right[style*="writing-mode:vertical-rl"]{rotate:180deg}
54/*# sourceURL=https://eequalspi.com/wp-includes/blocks/paragraph/style.min.css */
55</style>
56<style id="wp-block-video-inline-css">
57.wp-block-video{box-sizing:border-box}.wp-block-video video{height:auto;vertical-align:middle;width:100%}@supports (position:sticky){.wp-block-video [poster]{object-fit:cover}}.wp-block-video.aligncenter{text-align:center}.wp-block-video :where(figcaption){margin-bottom:1em;margin-top:.5em}
58/*# sourceURL=https://eequalspi.com/wp-includes/blocks/video/style.min.css */
59</style>
60<style id="wp-block-code-inline-css">
61.wp-block-code{box-sizing:border-box}.wp-block-code code{direction:ltr;display:block;font-family:inherit;overflow-wrap:break-word;text-align:initial;white-space:pre-wrap}
62/*# sourceURL=https://eequalspi.com/wp-includes/blocks/code/style.min.css */
63</style>
64<style id="wp-block-embed-inline-css">
65.wp-block-embed.alignleft,.wp-block-embed.alignright,.wp-block[data-align=left]>[data-type="core/embed"],.wp-block[data-align=right]>[data-type="core/embed"]{max-width:360px;width:100%}.wp-block-embed.alignleft .wp-block-embed__wrapper,.wp-block-embed.alignright .wp-block-embed__wrapper,.wp-block[data-align=left]>[data-type="core/embed"] .wp-block-embed__wrapper,.wp-block[data-align=right]>[data-type="core/embed"] .wp-block-embed__wrapper{min-width:280px}.wp-block-cover .wp-block-embed{min-height:240px;min-width:320px}.wp-block-group.is-layout-flex .wp-block-embed{flex:1 1 0%;min-width:0}.wp-block-embed{overflow-wrap:break-word}.wp-block-embed :where(figcaption){margin-bottom:1em;margin-top:.5em}.wp-block-embed iframe{max-width:100%}.wp-block-embed__wrapper{position:relative}.wp-embed-responsive .wp-has-aspect-ratio .wp-block-embed__wrapper:before{content:"";display:block;padding-top:50%}.wp-embed-responsive .wp-has-aspect-ratio iframe{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%}.wp-embed-responsive .wp-embed-aspect-21-9 .wp-block-embed__wrapper:before{padding-top:42.85%}.wp-embed-responsive .wp-embed-aspect-18-9 .wp-block-embed__wrapper:before{padding-top:50%}.wp-embed-responsive .wp-embed-aspect-16-9 .wp-block-embed__wrapper:before{padding-top:56.25%}.wp-embed-responsive .wp-embed-aspect-4-3 .wp-block-embed__wrapper:before{padding-top:75%}.wp-embed-responsive .wp-embed-aspect-1-1 .wp-block-embed__wrapper:before{padding-top:100%}.wp-embed-responsive .wp-embed-aspect-9-16 .wp-block-embed__wrapper:before{padding-top:177.77%}.wp-embed-responsive .wp-embed-aspect-1-2 .wp-block-embed__wrapper:before{padding-top:200%}
66/*# sourceURL=https://eequalspi.com/wp-includes/blocks/embed/style.min.css */
67</style>
68<style id="wp-block-group-inline-css">
69.wp-block-group{box-sizing:border-box}:where(.wp-block-group.wp-block-group-is-layout-constrained){position:relative}
70/*# sourceURL=https://eequalspi.com/wp-includes/blocks/group/style.min.css */
71</style>
72<style id="wp-block-preformatted-inline-css">
73.wp-block-preformatted{box-sizing:border-box;white-space:pre-wrap}:where(.wp-block-preformatted.has-background){padding:1.25em 2.375em}
74/*# sourceURL=https://eequalspi.com/wp-includes/blocks/preformatted/style.min.css */
75</style>
76
77<style id="classic-theme-styles-inline-css">
78/*! This file is auto-generated */
79.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
80/*# sourceURL=/wp-includes/css/classic-themes.min.css */
81</style>
82
83<style id="global-styles-inline-css">
84:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #fff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--color--dark-gray: #1a1a1a;--wp--preset--color--medium-gray: #686868;--wp--preset--color--light-gray: #e5e5e5;--wp--preset--color--blue-gray: #4d545c;--wp--preset--color--bright-blue: #007acc;--wp--preset--color--light-blue: #9adffd;--wp--preset--color--dark-brown: #402b30;--wp--preset--color--medium-brown: #774e24;--wp--preset--color--dark-red: #640c1f;--wp--preset--color--bright-red: #ff675f;--wp--preset--color--yellow: #ffef8e;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,0) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);
84--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}:where(body) { margin: 0; }:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;letter-spacing: inherit;line-height: inherit;padding-top: calc(0.667em + 2px);padding-right: calc(1.333em + 2px);padding-bottom: calc(0.667em + 2px);padding-left: calc(1.333em + 2px);text-decoration: none;text-transform: inherit;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-dark-gray-color{color: var(--wp--preset--color--dark-gray) !important;}.has-medium-gray-color{color: var(--wp--preset--color--medium-gray) !important;}.has-light-gray-color{color: var(--wp--preset--color--light-gray) !important;}.has-blue-gray-color{color: var(--wp--preset--color--blue-gray) !important;}.has-bright-blue-color{color: var(--wp--preset--color--bright-blue) !important;}.has-light-blue-color{color: var(--wp--preset--color--light-blue) !important;}.has-dark-brown-color{color: var(--wp--preset--color--dark-brown) !important;}.has-medium-brown-color{color: var(--wp--preset--color--medium-brown) !important;}.has-dark-red-color{color: var(--wp--preset--color--dark-red) !important;}.has-bright-red-color{color: var(--wp--preset--color--bright-red) !important;}.has-yellow-color{color: var(--wp--preset--color--yellow) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-dark-gray-background-color{background-color: var(--wp--preset--color--dark-gray) !important;}.has-medium-gray-background-color{background-color: var(--wp--preset--color--medium-gray) !important;}.has-light-gray-background-color{background-color: var(--wp--preset--color--light-gray) !important;}.has-blue-gray-background-color{background-color: var(--wp--preset--color--blue-gray) !important;}.has-bright-blue-background-color{background-color: var(--wp--preset--color--bright-blue) !important;}.has-light-blue-background-color{background-color: var(--wp--preset--color--light-blue) !important;}.has-dark-brown-background-color{background-color: var(--wp--preset--color--dark-brown) !important;}.has-medium-brown-background-color{background-color: var(--wp--preset--color--medium-brown) !important;}.has-dark-red-background-color{background-color: var(--wp--preset--color--dark-red) !important;}.has-bright-red-background-color{background-color: var(--wp--preset--color--bright-red) !important;}.has-yellow-background-color{background-color: var(--wp--preset--color--yellow) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-dark-gray-border-color{border-color: var(--wp--preset--color--dark-gray) !important;}.has-medium-gray-border-color{border-color: var(--wp--preset--color--medium-gray) !important;}.has-light-gray-border-color{border-color: var(--wp--preset--color--light-gray) !important;}.has-blue-gray-border-color{border-color: var(--wp--preset--color--blue-gray) !important;}.has-bright-blue-border-color{border-color: var(--wp--preset--color--bright-blue) !important;}.has-light-blue-border-color{border-color: var(--wp--preset--color--light-blue) !important;}.has-dark-brown-border-color{border-color: var(--wp--preset--color--dark-brown) !important;}.has-medium-brown-border-color{border-color: var(--wp--preset--color--medium-brown) !important;}.has-dark-red-border-color{border-color: var(--wp--preset--color--dark-red) !important;}.has-bright-red-border-color{border-color: var(--wp--preset--color--bright-red) !important;}.has-yellow-border-color{border-color: var(--wp--preset--color--yellow) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}
84.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
85/*# sourceURL=global-styles-inline-css */
86</style>
87
88<link rel='stylesheet' id='twentysixteen-fonts-css' href='https://fonts.googleapis.com/css?family=Merriweather%3A400%2C700%2C900%2C400italic%2C700italic%2C900italic%7CMontserrat%3A400%2C700%7CInconsolata%3A400&#038;subset=latin%2Clatin-ext&#038;display=fallback' media='all' />
89<link rel='stylesheet' id='genericons-css' href='https://eequalspi.com/wp-content/themes/twentysixteen/genericons/genericons.css?ver=3.4.1' media='all' />
90<link rel='stylesheet' id='twentysixteen-style-css' href='https://eequalspi.com/wp-content/themes/twentysixteen/style.css?ver=20190507' media='all' />
91<link rel='stylesheet' id='twentysixteen-block-style-css' href='https://eequalspi.com/wp-content/themes/twentysixteen/css/blocks.css?ver=20190102' media='all' />
92<link rel='stylesheet' id='tablepress-default-css' href='https://eequalspi.com/wp-content/plugins/tablepress/css/build/default.css?ver=3.2.5' media='all' />
93<link rel='stylesheet' id='enlighterjs-css' href='https://eequalspi.com/wp-content/plugins/enlighter/cache/enlighterjs.min.css?ver=qEzdOqn73jM2BYW' media='all' />
94<script id="jquery-core-js" src="https://eequalspi.com/wp-includes/js/jquery/jquery.min.js?ver=3.7.1"></script>
vendor: 1 bytes, line 94
94
95<script id="jquery-migrate-js" src="https://eequalspi.com/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.4.1"></script>
vendor: 1 bytes, line 95
95
96<script id="image_zoooom-js" src="https://eequalspi.com/wp-content/plugins/wp-image-zoooom/assets/js/jquery.image_zoom.min.js?ver=1.51"></script>
vendor: 1 bytes, line 96
96
97<script id="image_zoooom-init-js-extra">
98var IZ = {"with_woocommerce":"0","exchange_thumbnails":"1","woo_categories":"0","enable_mobile":"","options":[],"woo_slider":"0"};
99//# sourceURL=image_zoooom-init-js-extra
100</script>
vendor: 1 bytes, line 100
100
101<script id="image_zoooom-init-js" src="https://eequalspi.com/wp-content/plugins/wp-image-zoooom/assets/js/image_zoom-init.js?ver=1.51"></script>
101
102<link rel="https://api.w.org/" href="https://eequalspi.com/index.php/wp-json/" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://eequalspi.com/xmlrpc.php?rsd" />
103<meta name="generator" content="WordPress 7.0.7" />
104<style>.recentcomments a{display:inline !important;padding:0 !important;margin:0 !important;}</style><style>img.zoooom,.zoooom img{padding:0!important;}</style><link rel="icon" href="https://eequalspi.com/wp-content/uploads/2017/02/cropped-eequalspi_header-32x32.png" sizes="32x32" />
105<link rel="icon" href="https://eequalspi.com/wp-content/uploads/2017/02/cropped-eequalspi_header-192x192.png" sizes="192x192" />
106<link rel="apple-touch-icon" href="https://eequalspi.com/wp-content/uploads/2017/02/cropped-eequalspi_header-180x180.png" />
107<meta name="msapplication-TileImage" content="https://eequalspi.com/wp-content/uploads/2017/02/cropped-eequalspi_header-270x270.png" />
108<link rel='stylesheet' id='mediaelement-css' href='https://eequalspi.com/wp-includes/js/mediaelement/mediaelementplayer-legacy.min.css?ver=4.2.17' media='all' />
109<link rel='stylesheet' id='wp-mediaelement-css' href='https://eequalspi.com/wp-includes/js/mediaelement/wp-mediaelement.min.css?ver=7.0.7' media='all' />
110
111</head>
112
113<body class="home blog wp-embed-responsive wp-theme-twentysixteen hfeed">
114<div id="page" class="site">
115	<div class="site-inner">
116		<a class="skip-link screen-reader-text" href="#content">Skip to content</a>
117
118		<header id="masthead" class="site-header" role="banner">
119			<div class="site-header-main">
120				<div class="site-branding">
121					
122											<h1 class="site-title"><a href="https://eequalspi.com/" rel="home">e ≈ π</a></h1>
123											<p class="site-description">Electronics, Hacking, Stupid Ideas</p>
124									</div><!-- .site-branding -->
125
126							</div><!-- .site-header-main -->
127
128											<div class="header-image">
129					<a href="https://eequalspi.com/" rel="home">
130						<img src="https://eequalspi.com/wp-content/uploads/2017/02/cropped-2013-05-02-21.46.07.jpg" srcset="https://eequalspi.com/wp-content/uploads/2017/02/cropped-2013-05-02-21.46.07-300x70.jpg 300w, https://eequalspi.com/wp-content/uploads/2017/02/cropped-2013-05-02-21.46.07-768x179.jpg 768w, https://eequalspi.com/wp-content/uploads/2017/02/cropped-2013-05-02-21.46.07-1024x239.jpg 1024w, https://eequalspi.com/wp-content/uploads/2017/02/cropped-2013-05-02-21.46.07.jpg 1200w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 81vw, (max-width: 1362px) 88vw, 1200px" width="1200" height="280" alt="e ≈ π">
131					</a>
132				</div><!-- .header-image -->
133					</header><!-- .site-header -->
134
135		<div id="content" class="site-content">
136
137	<div id="primary" class="content-area">
138		<main id="main" class="site-main" role="main">
139
140		
141			
142			
143<article id="post-347" class="post-347 post type-post status-publish format-standard hentry category-uncategorized">
144	<header class="entry-header">
145		
146		<h2 class="entry-title"><a href="https://eequalspi.com/index.php/2022/07/14/pyle-pp444/" rel="bookmark">Pyle PP444</a></h2>	</header><!-- .entry-header -->
147
148	
149	
150	<div class="entry-content">
151		
152<p class="wp-block-paragraph">A few weeks ago, I was looking to hook my turntable up to a new receiver. Previously, it had been hooked up to a 70&#8217;s classic, the <a href="https://classicreceivers.com/kenwood-kr-2090">Kenwood KR-2090</a>. As much as the linked review rags on it, this receiver has served me really well, and it&#8217;s built in phono preamp sounded really nice to my ear.</p>
153
154
155
156<p class="wp-block-paragraph">My new receiver is a 90&#8217;s era, low end Sony unit. Being from the 90&#8217;s, it lacks any phono preamp. As such, I needed to get a discrete unit. I don&#8217;t consider myself an audiophile, so after reading the customer reviews, I decided to go with a cheapo model, the <a href="https://www.amazon.com/gp/product/B004HJ1TTQ/">Pyle PP444</a> (don&#8217;t worry, I stripped the affiliate links, so I don&#8217;t get a commission or anything). At first listen, I was happy that it &#8216;worked&#8217; &#8212; the gain was about right and it sounded vaguely OK. The more I listened to records, the more it sounded &#8216;off&#8217; to me, however. I&#8217;m not an audiophile, however, and I can&#8217;t claim to have a golden ear (I have a tin one, really).</p>
157
158
159
160<p class="wp-block-paragraph">Anyway, this was an excuse to see if I was right, and better yet, an excuse to use my <a href="https://www.thinksrs.com/products/sr780.html">SR780</a>. </p>
161
162
163
164<figure class="wp-block-image size-large is-resized"><img fetchpriority="high" decoding="async" src="http://eequalspi.com/w
164p-content/uploads/2022/07/Image_20220713_104219-1024x768.jpeg" alt="" class="wp-image-348" width="532" height="398" srcset="https://eequalspi.com/wp-content/uploads/2022/07/Image_20220713_104219-1024x768.jpeg 1024w, https://eequalspi.com/wp-content/uploads/2022/07/Image_20220713_104219-300x225.jpeg 300w, https://eequalspi.com/wp-content/uploads/2022/07/Image_20220713_104219-768x576.jpeg 768w, https://eequalspi.com/wp-content/uploads/2022/07/Image_20220713_104219-1536x1152.jpeg 1536w, https://eequalspi.com/wp-content/uploads/2022/07/Image_20220713_104219-2048x1536.jpeg 2048w, https://eequalspi.com/wp-content/uploads/2022/07/Image_20220713_104219-1200x900.jpeg 1200w, http://eequalspi.com/wp-content/uploads/2022/07/Image_20220713_104219-scaled.jpeg 2560w" sizes="(max-width: 532px) 85vw, 532px" /></figure>
165
166
167
168<p class="wp-block-paragraph">I decided to do a comparison. Using a 10mV input signal and a 20Hz to 20kHz log-spaced sweep, I generated the responses for both the Kenwood and the Pyle PP444 (seen below, compared to the reference RIAA equalization curve). I&#8217;ve normalized all three responses to 0dB at 20Hz to simplify comparison.</p>
169
170
171
172<figure class="wp-block-image size-large is-style-zoooom"><img decoding="async" width="1024" height="305" src="http://eequalspi.com/wp-content/uploads/2022/07/Response_Curves_Simplified-1024x305.png" alt="" class="wp-image-349" srcset="https://eequalspi.com/wp-content/uploads/2022/07/Response_Curves_Simplified-1024x305.png 1024w, https://eequalspi.com/wp-content/uploads/2022/07/Response_Curves_Simplified-300x89.png 300w, https://eequalspi.com/wp-content/uploads/2022/07/Response_Curves_Simplified-768x229.png 768w, https://eequalspi.com/wp-content/uploads/2022/07/Response_Curves_Simplified-1536x458.png 1536w, https://eequalspi.com/wp-content/uploads/2022/07/Response_Curves_Simplified-2048x610.png 2048w, https://eequalspi.com/wp-content/uploads/2022/07/Response_Curves_Simplified-1200x358.png 1200w, http://eequalspi.com/wp-content/uploads/2022/07/Response_Curves_Simplified.png 2154w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></figure>
173
174
175
176<p class="wp-block-paragraph">Sure enough, the Kenwood (blue line) perfectly follows the official RIAA curve (yellow line), while the Pyle (orange line) rolls off way more slowly. Even at 1kHz, the Pyle is about 12dB louder relative to 20Hz deep bass than it should be. No wonder things sound tinny!</p>
177
178
179
180<p class="wp-block-paragraph">I guess the summary is that I shouldn&#8217;t have expected much from a $13.20 (at press time) preamp, but nonetheless, I feel like I don&#8217;t have a good way to be sure if I&#8217;m getting one that actually delivers the response I want at any pricepoint.</p>
181
182
183
184<p class="wp-block-paragraph">I guess the summary is, if you care about sound quality, avoid the PP444. If you just want something that will &#8216;work&#8217;, I guess it&#8217;s fine.</p>
185	</div><!-- .entry-content -->
186
187	<footer class="entry-footer">
188		<span class="byline"><span class="author vcard"><img alt='' src='https://secure.gravatar.com/avatar/e9a139e10fb91ac23ce9e30dc5c5f06e0ebeed3ce543b00735e0a3ad11f638f8?s=49&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e9a139e10fb91ac23ce9e30dc5c5f06e0ebeed3ce543b00735e0a3ad11f638f8?s=98&#038;d=mm&#038;r=g 2x' class='avatar avatar-49 photo' height='49' width='49' decoding='async'/><span class="screen-reader-text">Author </span> <a class="url fn n" href="https://eequalspi.com/index.php/author/thejbw/">thejbw</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://eequalspi.com/index.php/2022/07/14/pyle-pp444/" rel="bookmark"><time class="entry-date published" datetime="2022-07-14T21:43:17-07:00">July 14, 2022</time><time class="updated" datetime="2022-07-14T21:48:37-07:00">July 14, 2022</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://eequalspi.com/index.php/category/uncategorized/" rel="category tag">Uncategorized</a></span>			</footer><!-- .entry-footer -->
189</article><!-- #post-347 -->
190
191<article id="post-342" class="post-342 post type-post status-publish format-standard hentry category-uncategorized">
192	<header class="entry-header">
193		
194		<h2 class="entry-title"><a href="https://eequalspi.com/index.php/2021/03/13/pivideomusic/" rel="bookmark">PiVideoMusic</a></h2>	</header><!-- .entry-header -->
195
196	
197	
198	<div class="entry-content">
199		
200<figure class="wp-block-image size-large"><img decoding="async" src="https://i.imgur.com/Stqb5ZV.png" alt=""/><figcaption>Still shot</figcaption></figure>
201
202
203
204<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
205<div style="width: 640px;" class="wp-video"><video class="wp-video-shortcode" id="video-342-1" width="640" height="360" preload="metadata" controls="controls"><source type="video/mp4" src="https://i.imgur.com/NZDQjBa.mp4?_=1" /><a href="https://i.imgur.com/NZDQjBa.mp4">https://i.imgur.com/NZDQjBa.mp4</a></video></div>
206</div><figcaption>Silent clip of the PVM in action. Youtube linked below.</figcaption></figure>
207
208
209
210<p class="wp-block-paragraph">Years and years ago, I heard about the AtariVideoMusic. A short lived music visualization device created by Atari in the late 70&#8217;s. It would hook up to your home hi-fi and living room TV and show off the music. <a href="https://www.youtube.com/watch?v=wle0eqBwtL8">Techmoan did a good introduction to it here</a>, but imagine a very primitive version of <a href="https://en.wikipedia.org/wiki/MilkDrop">MilkDrop</a>.</p>
211
212
213
214<p class="wp-block-paragraph">Anyway, since before the time Techmoan did his review, I have been thinking about creating my own, modern-retro take on the idea. Music visualizers seem to have dropped off the face of the earth in the last few years, but I&#8217;ve always loved them.</p>
215
216
217
218<p class="wp-block-paragraph">Anyway, long story short, a couple of years ago I started making my own. I realized that the Raspberry Pi was the perfect tool for the job. It could easily do all the music visualization I wanted it to, and be built into the stereo component style box with an integrated, tiny, CRT that I envisioned at the time. Fate would have it that my old academic advisor had a tiny portable color television that he gave to me, gratis, and in the course of developing the code, I decided that the TV itself was perfect, so I just put the Raspberry Pi out of sight behind the TV and called 
218it a day.</p>
219
220
221
222<h2 class="wp-block-heading">Video Tour</h2>
223
224
225
226<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
227<iframe loading="lazy" title="PiVideoMusic" width="840" height="473" src="https://www.youtube.com/embed/Tn089Cl4c8I?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
228</div></figure>
229
230
231
232<h2 class="wp-block-heading">Software</h2>
233
234
235
236<p class="wp-block-paragraph">The software is all written in python, and can be <a href="https://github.com/wespo/RaspberryVideoMusic">found here</a>.</p>
237
238
239
240<p class="wp-block-paragraph">There are two files, <code>RaspberryVideoMusicSupervisor.py</code> and <code>RaspberryVideoMusic.py</code>. The former simply makes sure the latter is running as a process. It allows me to automatically recover from the occasional crash and I have set up my Pi to simply launch that script on boot.</p>
241
242
243
244<p class="wp-block-paragraph"><code>RaspberryVideoMusic.py</code> is the main script. It relies on Pygame and Pyaudio. The basic loop is simple. Pyaudio captures audio frames and raises a flag when there&#8217;s new data. </p>
245
246
247
248<p class="wp-block-paragraph">There are some basic data &#8216;services&#8217; available at all times, updated when new data is available. These include things like the audio frame, an FFT of the audio, and a detected signal envelope.</p>
249
250
251
252<p class="wp-block-paragraph">The main loop updates the Pygame display when new data is available. Every few seconds it randomly selects a different foreground and background visualization as well as randomly selected color schemes for each.</p>
253
254
255
256<h2 class="wp-block-heading">
256Hardware</h2>
257
258
259
260<p class="wp-block-paragraph">The hardware is extremely simple. The display is a portable color CRT TV with a composite input. The audio input is a cheap USB sound card. The only trick is that the Raspberry Pi composite output tends to inject audible display noise into the audio. I fixed that by adding a USB isolator between the Pi and the USB sound card.</p>
261
262
263
264<p class="wp-block-paragraph">Additionally, because the sound card input is a mono mic input, it shorts the left and right channels together, creating a mono signal. That&#8217;s fine for the visualizer (it could pretty easily be hacked to handle stereo input), but it means that there should be a headphone amp between your signal source and the mic input to prevent the Pi from distorting your sound and making it mono.</p>
265	</div><!-- .entry-content -->
266
267	<footer class="entry-footer">
268		<span class="byline"><span class="author vcard"><img alt='' src='https://secure.gravatar.com/avatar/e9a139e10fb91ac23ce9e30dc5c5f06e0ebeed3ce543b00735e0a3ad11f638f8?s=49&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e9a139e10fb91ac23ce9e30dc5c5f06e0ebeed3ce543b00735e0a3ad11f638f8?s=98&#038;d=mm&#038;r=g 2x' class='avatar avatar-49 photo' height='49' width='49' loading='lazy' decoding='async'/><span class="screen-reader-text">Author </span> <a class="url fn n" href="https://eequalspi.com/index.php/author/thejbw/">thejbw</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://eequalspi.com/index.php/2021/03/13/pivideomusic/" rel="bookmark"><time class="entry-date published updated" datetime="2021-03-13T18:19:36-08:00">March 13, 2021</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://eequalspi.com/index.php/category/uncategorized/" rel="category tag">Uncategorized</a></span>			</footer><!-- .entry-footer -->
269</article><!-- #post-342 -->
270
271<article id="post-333" class="post-333 post type-post status-publish format-standard hentry category-uncategorized">
272	<header class="entry-header">
273		
274		<h2 class="entry-title"><a href="https://eequalspi.com/index.php/2020/07/26/classic-led-displays/" rel="bookmark">Classic LED Displays</a></h2>	</header><!-- .entry-header -->
275
276	
277	
278	<div class="entry-content">
279		
280<figure class="wp-block-image"><img decoding="async" src="https://i.imgur.com/uS4sAbL.jpg" alt=""/><figcaption>Four LED Displays that we&#8217;re about to tour.</figcaption></figure>
281
282
283
284<p class="wp-block-paragraph">Recently on the electronics subreddits, there was a series of posts by people showing off their collections of unique old display modules. I realized that I had quite a few sitting in boxes. Unlike a lot of the posts on Reddit, I am also able to power them on to show off the goods. Enjoy!</p>
285
286
287
288<figure class="wp-block-embed-imgur wp-block-embed is-type-rich is-provider-imgur"><div class="wp-block-embed__wrapper">
289<blockquote class="imgur-embed-pub" lang="en" data-id="a/xiJaOSs"><a href="https://imgur.com/a/xiJaOSs">My Interesting LED Displays</a></blockquote>
289<script async src="//s.imgur.com/min/embed.js" charset="utf-8"></script>
289
290</div></figure>
291	</div><!-- .entry-content -->
292
293	<footer class="entry-footer">
294		<span class="byline"><span class="author vcard"><img alt='' src='https://secure.gravatar.com/avatar/e9a139e10fb91ac23ce9e30dc5c5f06e0ebeed3ce543b00735e0a3ad11f638f8?s=49&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e9a139e10fb91ac23ce9e30dc5c5f06e0ebeed3ce543b00735e0a3ad11f638f8?s=98&#038;d=mm&#038;r=g 2x' class='avatar avatar-49 photo' height='49' width='49' loading='lazy' decoding='async'/><span class="screen-reader-text">Author </span> <a class="url fn n" href="https://eequalspi.com/index.php/author/thejbw/">thejbw</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://eequalspi.com/index.php/2020/07/26/classic-led-displays/" rel="bookmark"><time class="entry-date published updated" datetime="2020-07-26T17:00:21-07:00">July 26, 2020</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://eequalspi.com/index.php/category/uncategorized/" rel="category tag">Uncategorized</a></span>			</footer><!-- .entry-footer -->
295</article><!-- #post-333 -->
296
297<article id="post-308" class="post-308 post type-post status-publish format-standard hentry category-clocks category-code category-nixie category-python category-uncategorized category-uniac tag-nixie tag-python tag-raspberrypi tag-raspotify tag-spotify tag-spotipy tag-uniac">
298	<header class="entry-header">
299		
300		<h2 class="entry-title"><a href="https://eequalspi.com/index.php/2020/05/30/making-a-raspberry-pi-boombox-aka-uniac-software-in-detail/" rel="bookmark">Making a Raspberry Pi Boombox (AKA UNIAC Software In Detail)</a></h2>	</header><!-- .entry-header -->
301
302	
303	
304	<div class="entry-content">
305		
306<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="439" src="http://eequalspi.com/wp-content/uploads/2020/04/image-1-1024x439.png" alt="" class="wp-image-282" srcset="https://eequalspi.com/wp-content/uploads/2020/04/image-1-1024x439.png 1024w, https://eequalspi.com/wp-content/uploads/2020/04/image-1-300x128.png 300w, https://eequalspi.com/wp-content/uploads/2020/04/image-1-768x329.png 768w, https://eequalspi.com/wp-content/uploads/2020/04/image-1-1536x658.png 1536w, https://eequalspi.com/wp-content/uploads/2020/04/image-1-2048x877.png 2048w, https://eequalspi.com/wp-content/uploads/2020/04/image-1-1200x514.png 1200w, http://eequalspi.com/wp-content/uploads/2020/04/image-1.png 3302w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></figure>
307
308
309
310<h2 class="wp-block-heading">Introduction</h2>
311
312
313
314<p class="wp-block-paragraph">Most of you who see this post will have seen the <a href="http://eequalspi.com/index.php/2020/04/04/uniac-the-ultimate-nixie-internet-alarm-clock/">original UNIAC post </a>before this, and hopefully some will have seen the <a href="http://eequalspi.com/index.php/2020/05/16/uniac-hardware-in-detail/">post detailing the hardware</a>. For those who haven&#8217;t, UNIAC is a Raspberry Pi based Spotify playing boombox that is controlled with buttons on the front and displays status using Nixie tubes. This post will cover the software used to make UNIAC work &#8212; both tools developed by others and the software I wrote myself.</p>
315
316
317
318<p class="wp-block-paragraph"><strong>While I am writing this from the perspective of documenting UNIAC, the software could be pretty easily recycled to work with any display and buttons, you&#8217;d just have to rewrite the display and button event functions to support your hardware.</strong></p>
319
320
321
322<p class="wp-block-paragraph">Also note that I did a <a href="http://eequalspi.com/index.php/2020/04/18/refactoring-the-uniac-playback-code/">major ripup of the UNIAC software</a> after the original post, so this version does not use Mopidy, MPD, or Mopidy-Spotify. And if any of you have used those tools before, you&#8217;ll understand that&#8217;s a good thing.</p>
323
324
325
326<p class="wp-block-paragraph">I will start with a disclaimer however: I am an electrical engineer, not a software engineer, so this design will probably make softw
326are guys sick to their stomach. Sorry in advance&#8230;</p>
327
328
329
330<h2 class="wp-block-heading">Third Party Software</h2>
331
332
333
334<p class="wp-block-paragraph">The first thing to understand about the architecture used in UNIAC is that control and playback of music are two separate processes. <a href="https://github.com/dtcooper/raspotify">Raspotify</a> is a software package that connects to Spotify and makes your RPi act as a Spotify endpoint. Essentially a dedicated speaker. There are a couple of similar packages that can give you a Spotify client on a RPi, but Raspotify has a trivial installation process:</p>
335
336
337
338<pre class="wp-block-code"><code>curl -sL https://dtcooper.github.io/raspotify/install.sh | sh</code></pre>
339
340
341
342<p class="wp-block-paragraph">The second part, <a href="https://spotipy.readthedocs.io/en/2.12.0/">Spotipy</a>, is a Python library that you give permissions on your (paid) Spotify account. It allows you to see current playback status, and control playback on your Spotify devices (computers, speakers, etc). By combining these two, you can have a full Spotify instance running on your device with programmable control.</p>
343
344
345
346<p class="wp-block-paragraph">The two pieces are connected by the UNIAC Python script. UNIAC sets up a spotipy connection and then controls what device the playback occurs on. Since the name of the UNIAC Raspotify instance is constant, it simply has to tell Spotify to playback there, and music will play on the UNIAC hardware. This has the added benefit that I can &#8216;cast&#8217; whatever I&#8217;m currently listening to over to UNIAC and it will just continue to play.</p>
347
348
349
350<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/wp-content/uploads/2020/05/image-10-1024x393.png" alt="" class="wp-image-329" width="622" height="238" srcset="https://eequalspi.com/wp-content/uploads/2020/05/image-10-1024x393.png 1024w, https://eequalspi.com/wp-content/uploads/2020/05/image-10-300x115.png 300w, https://eequalspi.com/wp-content/uploads/2020/05/image-10-768x294.png 768w, https://eequalspi.com/wp-content/uploads/2020/05/image-10-1536x589.png 1536w, https://eequalspi.com/wp-content/uploads/2020/05/image-10-2048x785.png 2048w, https://eequalspi.com/wp-content/uploads/2020/05/image-10-1200x460.png 1200w, http://eequalspi.com/wp-content/uploads/2020/05/image-10.png 2345w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px" /><figcaption>UNIAC / Spotify control.</figcaption></figure>
351
352
353
354<p class="wp-block-paragraph">The last piece worth mentioning is <a href="http://espeak.sourceforge.net/">eSpeak</a>, a relatively primitive speech synthesizer that takes strings from the command line and announces them. This lends UNIAC its characteristic robot voice when announcing settings information and playlist names.</p>
355
356
357
358<h2 class="wp-block-heading">
358Hardware Libraries</h2>
359
360
361
362<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/wp-content/uploads/2020/05/image-11-1024x677.png" alt="" class="wp-image-330" width="360" height="237" srcset="https://eequalspi.com/wp-content/uploads/2020/05/image-11-1024x677.png 1024w, https://eequalspi.com/wp-content/uploads/2020/05/image-11-300x198.png 300w, https://eequalspi.com/wp-content/uploads/2020/05/image-11-768x508.png 768w, https://eequalspi.com/wp-content/uploads/2020/05/image-11-1200x794.png 1200w, https://eequalspi.com/wp-content/uploads/2020/05/image-11.png 1240w" sizes="auto, (max-width: 360px) 85vw, 360px" /><figcaption>Path between the controls, the Display, and UNIAC.</figcaption></figure></div>
363
364
365
366<p class="wp-block-paragraph">The hardware interfaces are pretty straightforward, mostly. The buttons are controlled by an i2c GPIO expander, and Adafruit has the <a href="https://learn.adafruit.com/mcp230xx-gpio-expander-on-the-raspberry-pi/using-the-library">MCP230XX library</a> to support it. For other GPIO, I use <a href="https://pypi.org/project/RPi.GPIO/">RPi.GPIO</a>.</p>
367
368
369
370<p class="wp-block-paragraph">The last, and most unique library is the NixieDisplay library. It is a <a href="https://github.com/wespo/NixieDisplay">custom library that I developed</a> to communicate with my Teensy 3.2 based multiplexing, crossfading Nixie display. In the first prototype, I used Taylor Edge SmartNixie modules instead of my custom display, so <a href="https://github.com/wespo/SmartNixie">I also wrote a library supporting them</a> on the RPi, though I&#8217;m not using it on the finished version.</p>
371
372
373
374<p class="wp-block-paragraph">These libraries are pretty straightforward. You print numbers to the tubes to display and forget about it.</p>
375
376
377
378<p class="wp-block-paragraph">The VU-Meter only has an audio input, so it doesn&#8217;t have any software control and doesn&#8217;t appear on any of these block diagrams.</p>
379
380
381
382<h2 class="wp-block-heading">UNIAC Software Architecture</h2>
383
384
385
386<p class="wp-block-paragraph"><a href="https://github.com/wespo/UNIAC">The UNIAC software</a> is essentially an interrupt driven button handler. There is a master &#8216;Menu&#8217; class in <a href="https://github.com/wespo/UNIAC/blob/master/Menu.py">Menu.py</a> to which arbitrary &#8216;Modes&#8217; are attached. An attached mode must provide a function handler for each physical button as well as a display update handler (and a few other helper functions).</p>
387
388
389
390<p class="wp-block-paragraph">When a button is pressed, the Menu object calls the current Mode&#8217;s handler for that button.</p>
391
392
393
394<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/wp-content/uploads/2020/05/image-4.png" alt="" class="wp-image-318" width="222" height="152" srcset="https://eequalspi.com/wp-content/uploads/2020/05/image-4.png 812w, https://eequalspi.com/wp-content/uploads/2020/05/image-4-300x206.png 300w, https://eequalspi.com/wp-content/uploads/2020/05/image-4-768x528.png 768w" sizes="auto, (max-width: 222px) 85vw, 222px" /><figcaption>Button Press Event</figcaption></figure></div>
395
396
397
398<p class="wp-block-paragraph">The <a href="https://github.com/wespo/UNIAC/blob/master/UNIAC.py">UNIAC.py</a> script creates a Menu instance and attaches the modes defined in that script. The modes (currently) are: clock, track time, date, alarm clock, change playlist, and options. </p>
399
400
401
402<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/wp-content/uploads/2020/05/image-5-1024x366.png" alt="" class="wp-image-319" width="411" height="146" srcset="https://eequalspi.com/wp-content/uploads/2020/05/image-5-1024x366.png 1024w, https://eequalspi.com/wp-content/uploads/2020/05/image-5-300x107.png 300w, https://eequalspi.com/wp-content/uploads/2020/05/image-5-768x275.png 768w, https://eequalspi.com/wp-content/uploads/2020/05/image-5-1200x429.png 1200w, https://eequalspi.com/w
402p-content/uploads/2020/05/image-5.png 1494w" sizes="auto, (max-width: 411px) 85vw, 411px" /><figcaption>Modes attached to Menu in UNIAC.py</figcaption></figure></div>
403
404
405
406<p class="wp-block-paragraph">For instance, when the &#8216;Plus&#8217; button is pressed in the track time mode, the menu object will use Spotipy to progress to the next track, but when &#8216;Plus&#8217; is pressed in the alarm mode, it will advance the alarm time by one.</p>
407
408
409
410<p class="wp-block-paragraph">The &#8216;Mode&#8217; button is a special case that does not call an attached handler function but instead changes the selected mode in the Menu object.</p>
411
412
413
414<p class="wp-block-paragraph">The Menu object also requires that each mode have a display update handler. This handler is called by the master UNIAC.py script in an infinte loop to update the display every 100 ms.</p>
415
416
417
418<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/wp-content/uploads/2020/05/image-3.png" alt="" class="wp-image-317" width="296" height="62" srcset="https://eequalspi.com/wp-content/uploads/2020/05/image-3.png 818w, https://eequalspi.com/wp-content/uploads/2020/05/image-3-300x64.png 300w, https://eequalspi.com/wp-content/uploads/2020/05/image-3-768x163.png 768w" sizes="auto, (max-width: 296px) 85vw, 296px" /><figcaption>Display Updater</figcaption></figure></div>
419
420
421
422<p class="wp-block-paragraph">This code was actually based off of another (unfinished) project of mine which used two buttons and a character LCD. By changing the displayUpdate function and the button handlers, this script could be used for virtually any menu interface with multiple &#8216;pages&#8217;.</p>
423
424
425
426<h2 class="wp-block-heading">Interfacing with Spotipy</h2>
427
428
429
430<p class="wp-block-paragraph">As discussed in the preceeding section, UNIAC is controlled through a series of button handlers. To interface with Spotipy, most of the modes used in UNIAC inherit from the mpdGeneral class.</p>
431
432
433
434<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/wp-content/uploads/2020/05/image-6-1024x507.png" alt="" class="wp-image-320" width="402" height="198" srcset="https://eequalspi.com/wp-content/uploads/2020/05/image-6-1024x507.png 1024w, https://eequalspi.com/wp-content/uploads/2020/05/image-6-300x148.png 300w, https://eequalspi.com/wp-content/uploads/2020/05/image-6-768x380.png 768w, https://eequalspi.com/wp-content/uploads/2020/05/image-6.png 1184w" sizes="auto, (max-width: 402px) 85vw, 402px" /><figcaption>mpdGeneral class definition</figcaption></figure></div>
435
436
437
438<p class="wp-block-paragraph">This class has a few static variables and references the globally available spotipyLogin.sp object, which is an instance of the bare Spotipy API created by the spotipyLogin.py script. It includes things like track status, play, pause, loading a defined playlist from URI, listing available playlists, et cetera.</p>
439
440
441
442<p class="wp-block-paragraph">The UNIACConfig class allows settings like alarm time, current playlist, and settings to be pickled to a config file and loaded on restart. The other classes (including the option menu mode) use this class to handle i/o to the settings file, &#8216;UNIAC.conf&#8217;.</p>
443
444
445
446<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/wp-content/uploads/2020/05/image-7-1024x977.png" alt="" class="wp-image-321" width="349" height="332" srcset="https://eequalspi.com/wp-content/uploads/2020/05/image-7-1024x977.png 1024w, https://eequalspi.com/wp-content/uploads/2020/05/image-7-300x286.png 300w, https://eequalspi.com/wp-content/uploads/2020/05/image-7-768x733.png 768w, https://eequalspi.com/wp-content/uploads/2020/05/image-7.png 1130w" sizes="auto, (max-width: 349px) 85vw, 349px" /><figcaption>UNIACConfig class.</figcaption></figure></div>
447
448
449
450<p class="wp-block-paragraph">The remainder of the classes are more or less straightforward implementations of their self explanatory modes and hook the various parts and pieces together.</p>
451
452
453
454<p class="wp-block-paragraph">The last piece of secret sauce, <strong>which is not on git,</strong> because it is in m gitignore is spotipyLogin.py, a simple script which holds my Spotify login credentials and makes a logged in Spotipy object available.</p>
455
456
457
458<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/w
458p-content/uploads/2020/05/image-8-1024x900.png" alt="" class="wp-image-322" width="468" height="411" srcset="https://eequalspi.com/wp-content/uploads/2020/05/image-8-1024x900.png 1024w, https://eequalspi.com/wp-content/uploads/2020/05/image-8-300x264.png 300w, https://eequalspi.com/wp-content/uploads/2020/05/image-8-768x675.png 768w, https://eequalspi.com/wp-content/uploads/2020/05/image-8-1536x1351.png 1536w, https://eequalspi.com/wp-content/uploads/2020/05/image-8-2048x1801.png 2048w, https://eequalspi.com/wp-content/uploads/2020/05/image-8-1200x1055.png 1200w, http://eequalspi.com/wp-content/uploads/2020/05/image-8.png 2104w" sizes="auto, (max-width: 468px) 85vw, 468px" /><figcaption>The redacted version of spotipyLogin.py</figcaption></figure>
459
460
461
462<h2 class="wp-block-heading">UNIAC Supervisor</h2>
463
464
465
466<p class="wp-block-paragraph">Finally, there is a UNIAC supervisor script. This is an independent Python process which checks if the UNIAC script is running and if not launches it. It also checks that only one instance of the script is running, and if a second copy has started somehow, kills all but the first process. It&#8217;s not strictly necessary, but is a nice-to-have feature. I ran without it for years, with only occasional failures.</p>
467
468
469
470<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/wp-content/uploads/2020/05/image-9-1024x376.png" alt="" class="wp-image-323" width="506" height="185" srcset="https://eequalspi.com/wp-content/uploads/2020/05/image-9-1024x376.png 1024w, https://eequalspi.com/wp-content/uploads/2020/05/image-9-300x110.png 300w, https://eequalspi.com/wp-content/uploads/2020/05/image-9-768x282.png 768w, https://eequalspi.com/wp-content/uploads/2020/05/image-9-1536x564.png 1536w, https://eequalspi.com/wp-content/uploads/2020/05/image-9-2048x752.png 2048w, https://eequalspi.com/wp-content/uploads/2020/05/image-9-1200x440.png 1200w, http://eequalspi.com/wp-content/uploads/2020/05/image-9.png 2708w" sizes="auto, (max-width: 506px) 85vw, 506px" /><figcaption>UNIAC supervisor script.</figcaption></figure></div>
471
472
473
474<h2 class="wp-block-heading">Conclusion</h2>
475
476
477
478<p class="wp-block-paragraph">The UNIAC software is a combination of several bits and pieces of code which allows a button driven paged menu system to control the Spotify web API and stream music for plaback locally on the RPi, as if it were a commercial product. The interface is ideally suited to a &#8216;Nixie Boombox&#8217; but could be used with any oddball display you wanted with a little modification.</p>
479
480
481
482<p class="wp-block-paragraph">Thanks for reading.</p>
483	</div><!-- .entry-content -->
484
485	<footer class="entry-footer">
486		<span class="byline"><span class="author vcard"><img alt='' src='https://secure.gravatar.com/avatar/e9a139e10fb91ac23ce9e30dc5c5f06e0ebeed3ce543b00735e0a3ad11f638f8?s=49&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e9a139e10fb91ac23ce9e30dc5c5f06e0ebeed3ce543b00735e0a3ad11f638f8?s=98&#038;d=mm&#038;r=g 2x' class='avatar avatar-49 photo' height='49' width='49' loading='lazy' decoding='async'/><span class="screen-reader-text">Author </span> <a class="url fn n" href="https://eequalspi.com/index.php/author/thejbw/">thejbw</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://eequalspi.com/index.php/2020/05/30/making-a-raspberry-pi-boombox-aka-uniac-software-in-detail/" rel="bookmark"><time class="entry-date published updated" datetime="2020-05-30T15:47:37-07:00">May 30, 2020</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://eequalspi.com/index.php/category/clocks/" rel="category tag">Clocks</a>, <a href="https://eequalspi.com/index.php/category/code/" rel="category tag">Code</a>, <a href="https://eequalspi.com/index.php/category/nixie/" rel="category tag">Nixie</a>, <a href="https://eequalspi.com/index.php/category/python/" rel="category tag">Python</a>, <a href="https://eequalspi.com/index.php/category/uncategorized/" rel="category tag">Uncategorized</a>, <a href="https://eequalspi.com/index.php/category/uniac/" rel="category tag">UNIAC</a></span><span class="tags-links"><span class="screen-reader-text">Tags </span><a href="https://eequalspi.com/index.php/tag/nixie/" rel="tag">Nixie</a>, <a href="https://eequalspi.com/index.php/tag/python/" rel="tag">Python</a>, <a href="https://eequalspi.com/index.php/tag/raspberrypi/" rel="tag">RaspberryPi</a>, <a href="https://eequalspi.com/index.php/tag/raspotify/" rel="tag">Raspotify</a>, <a href="https://eequalspi.com/index.php/tag/spotify/" rel="tag">Spotify</a>, <a href="https://eequalspi.com/index.php/tag/spotipy/" rel="tag">Spotipy</a>, <a href="https://eequalspi.com/index.php/tag/uniac/" rel="tag">UNIAC</a></span>			</footer><!-- .entry-footer -->
487</article><!-- #post-308 -->
488
489<article id="post-288" class="post-288 post type-post status-publish format-standard hentry category-clocks category-nixie category-uncategorized category-uniac tag-nixie tag-raspberrypi tag-rpi tag-spotify tag-uniac">
490	<header class="entry-header">
491		
492		<h2 class="entry-title"><a href="https://eequalspi.com/index.php/2020/05/16/uniac-hardware-in-detail/" rel="bookmark">UNIAC Hardware In Detail</a></h2>	</header><!-- .entry-header -->
493
494	
495	
496	<div class="entry-content">
497		
498<p class="wp-block-paragraph">After sharing my last post on Reddit and Hackaday, I&#8217;ve gotten lots of kind feedback &#8212; and I deeply, deeply appreciate it all. More than anything else, it makes me regret not sharing this project with you sooner.</p>
499
500
501
502<p class="wp-block-paragraph">That said, the biggest ask has been for a detailed build guide. Unfortuantely, I didn&#8217;t document the build process in enough detail to write up a step by step guide, and I 
502just don&#8217;t have the energy to build an entire new copy right now.</p>
503
504
505
506<p class="wp-block-paragraph">What I <em>can</em> do, however, is share discuss the design choices I made and share the build files. This post will focus on the hardware design of UNIAC, and I will follow it with a post detailing the software in greater detail.</p>
507
508
509
510<h2 class="wp-block-heading">Schematics</h2>
511
512
513
514<p class="wp-block-paragraph">The schematic capture and layout was done in Eagle, and broken out into pages. It&#8217;s not perfect, by any means, but it&#8217;s clean enough.</p>
515
516
517
518<p class="wp-block-paragraph">Anyway, let&#8217;s go through the sections.</p>
519
520
521
522<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/wp-content/uploads/2020/04/FoxitReader_2020-04-28_21-55-16-1024x459.png" alt="" class="wp-image-290" width="624" height="279" srcset="https://eequalspi.com/wp-content/uploads/2020/04/FoxitReader_2020-04-28_21-55-16-1024x459.png 1024w, https://eequalspi.com/wp-content/uploads/2020/04/FoxitReader_2020-04-28_21-55-16-300x134.png 300w, https://eequalspi.com/wp-content/uploads/2020/04/FoxitReader_2020-04-28_21-55-16-768x344.png 768w, https://eequalspi.com/wp-content/uploads/2020/04/FoxitReader_2020-04-28_21-55-16-1536x688.png 1536w, https://eequalspi.com/wp-content/uploads/2020/04/FoxitReader_2020-04-28_21-55-16-2048x917.png 2048w, https://eequalspi.com/wp-content/uploads/2020/04/FoxitReader_2020-04-28_21-55-16-1200x538.png 1200w, http://eequalspi.com/wp-content/uploads/2020/04/FoxitReader_2020-04-28_21-55-16.png 2547w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px" /><figcaption>Raspberry Pi, Buttons, Sound Card, Amplifier</figcaption></figure>
523
524
525
526<p class="wp-block-paragraph">This section has:</p>
527
528
529
530<p class="wp-block-paragraph">The Raspberry Pi itself &#8212; note that the footprint says &#8220;Raspberry Pi Model B+&#8221;, but is actually sized for the Pi Zero W. I recycled an existing symbol because the header pinout is the same across both versions of the Pi, and simply forgot to rename it in Eagle. It also specifies a 7805 5V regulator to power the Pi off the input 12V bus. In practice I used a <a href="https://www.digikey.com/product-detail/en/murata-power-solutions-inc/7805SRH-C/811-2644-ND/3438627">drop in switch mode replacement</a> for the 7805 from Murata.</p>
531
532
533
534<p class="wp-block-paragraph">The button interfaces &#8212; supports two options to connect buttons. The first one, Buttons A, is for directly connecting to the motherboard. I used this option in the first two prototypes and decided to keep the option open here in case the button breakout board had problems, since I had the board space. The button connections here include a provision for +12V  to illuminate the buttons, a shared switched ground line to control button illumination, resistors to pull up the buttons and caps for debounce.</p>
535
536
537
538<p class="wp-block-paragraph">Buttons B is a header for the button board, shown later. It breaks out the I2C bus connected to the RPI as well as a 3.3V rail for powering an offboard IC and a 12V rail for powering button illumination. Finally it has an interrupt pin so that the Pi can detect when the button board needs to be polled.</p>
539
540
541
542<p class="wp-block-paragraph">Finally it has footprints for <a href="https://www.amazon.com/gp/product/B07Q9K5MT8">I2S DAC (sound card)</a> and <a href="https://www.adafruit.com/product/1752">Adafruit class-D amplifier</a>. Not too much to see there. </p>
543
544
545
546<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/wp-content/uploads/2020/04/FoxitReader_2020-04-28_21-44-03-1024x495.png" alt="" class="wp-image-293" width="625" height="302" srcset="https://eequalspi.com/wp-content/uploads/2020/04/FoxitReader_2020-04-28_21-44-03-1024x495.png 1024w, https://eequalspi.com/wp-content/uploads/2020/04/FoxitReader_2020-04-28_21-44-03-300x145.png 300w, https://eequalspi.com/wp-content/uploads/2020/04/FoxitReader_2020-04-28_21-44-03-768x371.png 768w, https://eequalspi.com/w
546p-content/uploads/2020/04/FoxitReader_2020-04-28_21-44-03-1536x743.png 1536w, https://eequalspi.com/wp-content/uploads/2020/04/FoxitReader_2020-04-28_21-44-03-2048x990.png 2048w, https://eequalspi.com/wp-content/uploads/2020/04/FoxitReader_2020-04-28_21-44-03-1200x580.png 1200w, http://eequalspi.com/wp-content/uploads/2020/04/FoxitReader_2020-04-28_21-44-03.png 2453w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px" /><figcaption>VU-meter section</figcaption></figure>
547
548
549
550<p class="wp-block-paragraph">The next page of the schematic is a direct copy of my <a href="http://eequalspi.com/index.php/category/in-13-vumeter/">IN-13 VU Meter circuit</a>. I won&#8217;t go into a full description of the theory, but it uses a quad rail to rail op-amp to save parts (I usually populate with an LMC660), and MPSA42 high voltage small signal transistors to drive the IN-13s. There is also an ATTINY85 micro <a href="https://github.com/wespo/Nixie_VU_Meter_R02">running this code</a> to make it act as a log converter. This saves parts and board area vs an analog implementation as well as allowing the VU meter to go to sleep if there&#8217;s been no audio for a couple of minutes.</p>
551
552
553
554<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/wp-content/uploads/2020/04/eagle_2020-04-28_22-45-48-1024x375.png" alt="" class="wp-image-294" width="627" height="229" srcset="https://eequalspi.com/wp-content/uploads/2020/04/eagle_2020-04-28_22-45-48-1024x375.png 1024w, https://eequalspi.com/wp-content/uploads/2020/04/eagle_2020-04-28_22-45-48-300x110.png 300w, https://eequalspi.com/wp-content/uploads/2020/04/eagle_2020-04-28_22-45-48-768x281.png 768w, https://eequalspi.com/wp-content/uploads/2020/04/eagle_2020-04-28_22-45-48-1536x562.png 1536w, https://eequalspi.com/wp-content/uploads/2020/04/eagle_2020-04-28_22-45-48-2048x749.png 2048w, https://eequalspi.com/wp-content/uploads/2020/04/eagle_2020-04-28_22-45-48-1200x439.png 1200w, http://eequalspi.com/wp-content/uploads/2020/04/eagle_2020-04-28_22-45-48.png 3195w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px" /><figcaption>Nixie display section</figcaption></figure>
555
556
557
558<p class="wp-block-paragraph">The third page of the schematic covers the Nixie display. This design was inspired by Dave Jones&#8217; (of EEVBlog) <a href="https://www.youtube.com/watch?v=7uogKucrPks">Nixie tube driver design</a>, which attempts to save transistors by using multi transistor ICs.  Ultimately, I&#8217;m not very happy with that part of the design as there seems to be enough leakage that minor ghosting is visible on the tubes. I&#8217;ll definitely revisit it for my next Nixie project. </p>
559
560
561
562<p class="wp-block-paragraph">The controller for the display is a Teensy 3.2 which accepts commands to display values on the Nixies and INS-1 neon lamps via I2C and supports crossfading between digits.</p>
563
564
565
566<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/wp-content/uploads/2020/04/eagle_2020-04-28_21-59-47-1024x496.png" alt="" class="wp-image-292" width="632" height="306" srcset="https://eequalspi.com/wp-content/uploads/2020/04/eagle_2020-04-28_21-59-47-1024x496.png 1024w, https://eequalspi.com/wp-content/uploads/2020/04/eagle_2020-04-28_21-59-47-300x145.png 300w, https://eequalspi.com/wp-content/uploads/2020/04/eagle_2020-04-28_21-59-47-768x372.png 768w, https://eequalspi.com/wp-content/uploads/2020/04/eagle_2020-04-28_21-59-47-1536x744.png 1536w, https://eequalspi.com/wp-content/uploads/2020/04/eagle_2020-04-28_21-59-47-2048x992.png 2048w, https://eequalspi.com/wp-content/uploads/2020/04/eagle_2020-04-28_21-59-47-1200x581.png 1200w, http://eequalspi.com/wp-content/uploads/2020/04/eagle_2020-04-28_21-59-47.png 2480w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px" /><figcaption>Button breakout board</figcaption></figure>
567
568
569
570<p class="wp-block-paragraph">Finally, The button board uses an <a href="https://www.adafruit.com/product/593">I2C GPIO expander IC</a> to provide the same functionality as the individual button headers shown earlier, but without having nearly as many wires. The downside is that it requires an extra IC to do the job, and once the buttons are in the case, they&#8217;re soldered to the PCB and are pretty much stuck for good.</p>
571
572
573
574<h2 class="wp-block-heading">Layouts</h2>
575
576
577
578<p class="wp-block-paragraph">The UNIAC mainboard layout is pretty compact. There&#8217;s not too much to talk about. Most of the size was defined by the need to have the Nixies at the top, bargraph tubes in the middle, and buttons at the bottom. Except for the routing around the Nixies themselves, there were no space constrained areas. I did choose to put the Teensy and RPi near the edges, so that their USB ports were practically accessible, however.</p>
579
580
581
582<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/w
582p-content/uploads/2020/05/image-1-1024x625.png" alt="" class="wp-image-302" width="482" height="293" srcset="https://eequalspi.com/wp-content/uploads/2020/05/image-1-1024x625.png 1024w, https://eequalspi.com/wp-content/uploads/2020/05/image-1-300x183.png 300w, https://eequalspi.com/wp-content/uploads/2020/05/image-1-768x469.png 768w, https://eequalspi.com/wp-content/uploads/2020/05/image-1-1536x938.png 1536w, https://eequalspi.com/wp-content/uploads/2020/05/image-1-2048x1250.png 2048w, https://eequalspi.com/wp-content/uploads/2020/05/image-1-1200x733.png 1200w, http://eequalspi.com/wp-content/uploads/2020/05/image-1.png 2850w" sizes="auto, (max-width: 482px) 85vw, 482px" /><figcaption>UNIAC Mainboard.</figcaption></figure>
583
584
585
586<p class="wp-block-paragraph">I went to great lengths to calculate minimum creepage distances and trace widths, which I used as design rules to ensure the Nixie display would be safe while being as small as I could make it. When routing my HV traces, I assumed 200 V DC and used a <a href="http://www.creepage.com/">calculator like this one</a>. I ended up using approximately 16mil or 0.4mm as my minimum trace clearance.</p>
587
588
589
590<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/wp-content/uploads/2020/05/image-1024x986.png" alt="" class="wp-image-301" width="529" height="508" srcset="https://eequalspi.com/wp-content/uploads/2020/05/image-1024x986.png 1024w, https://eequalspi.com/wp-content/uploads/2020/05/image-300x289.png 300w, http://eequalspi.com/wp-content/uploads/2020/05/image.png 1034w" sizes="auto, (max-width: 529px) 85vw, 529px" /><figcaption>Closeup of the HV nets for the Nixies.</figcaption></figure>
591
592
593
594<p class="wp-block-paragraph">For trace width, I used <a href="https://www.4pcb.com/trace-width-calculator.html">4PCB&#8217;s calculator</a>, and found that even 600 mA would only cause a 10˚C rise for a 6 mil (0.15 mm) wide trace, way more than any of my HV traces were going to carry.vI also chose to keep the ground plane far away from the HV areas for added safety. Given that the Nixies are multiplexed and connect to ground only at a few points, it made sense and decluttered the design.</p>
595
596
597
598<p class="wp-block-paragraph">Finally, we go to the &#8216;Button Board&#8217;. The front panel control buttons are mounted to the front of the case and then soldered to this PCB. It&#8217;s a fairly simple design, but it has a couple of notches to clear the standoffs that mount the mainboard and speakers to the case.</p>
599
600
601
602<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/wp-content/uploads/2020/05/image-2-1024x154.png" alt="" class="wp-image-303" width="457" height="69" srcset="https://eequalspi.com/wp-content/uploads/2020/05/image-2-1024x154.png 1024w, https://eequalspi.com/wp-content/uploads/2020/05/image-2-300x45.png 300w, https://eequalspi.com/wp-content/uploads/2020/05/image-2-768x115.png 768w, https://eequalspi.com/wp-content/uploads/2020/05/image-2-1536x231.png 1536w, https://eequalspi.com/wp-content/uploads/2020/05/image-2-2048x308.png 2048w, https://eequalspi.com/wp-content/uploads/2020/05/image-2-1200x180.png 1200w, http://eequalspi.com/wp-content/uploads/2020/05/image-2.png 3182w" sizes="auto, (max-width: 457px) 85vw, 457px" /><figcaption>Button board.</figcaption></figure>
603
604
605
606<p class="wp-block-paragraph">The biggest pain about this board was getting it fabricated. The buttons have wide pins that need to be fabricated as small slots. This is because the pins are so wide and closely spaced that large enough circular holes actually <em>overlap </em>each other. </p>
607
608
609
610<p class="wp-block-paragraph">It took three tries to get the boards fabricated. I had to make sure that the slots were on the correct layer in the footprint and had to specifically reach out to the PCB vendor in advance to ask them to send checkplots to confirm that the board would get fabbed correctly. </p>
611
612
613
614<p class="wp-block-paragraph">The first order was from AllPCB without asking in advance and they simply milled the small circular holes instead of slots. The second time, they promised that they would send me checkplots, but just fabbed the board without doing so. They also ignored my customer complaint.</p>
615
616
617
618<p class="wp-block-paragraph">It was at that point that I switched to PCBWay, who provided checkplots as requested, but they actually had the slots correct on the first try, resulting in great boards. My only regret is that their matte black soldermask is slightly shinier than AllPCB&#8217;s so the boards don&#8217;t <em>quite</em> match the mainboard.</p>
619
620
621
622<p class="wp-block-paragraph"><a href="http://eequalspi.com/attachments/UNIAC%20Boards.zip">The Eagle files for the switch board and main board can be found here.</a></p>
623
624
625
626<h2 class="wp-block-heading">BOM</h2>
627
628
629
630<p class="wp-block-paragraph">The bill of materials, that is, the list of all the components used, is fairly long. It lists all the components that go on the main board, as well as the button board, and all of the off board components that I could think of. Since it&#8217;s a big, ugly table, I&#8217;m just going to attach it as a csv. The major parts themselves are detailed in the <a href="http://eequalspi.com/index.php/2020/04/04/uniac-the-ultimate-nixie-internet-alarm-clock/?preview_id=219&amp;preview_nonce=04a20b4cb6&amp;preview=true">first UNIAC post</a>.</p>
631
632
633
634<p class="wp-block-paragraph"><a href="http://eequalspi.com/attachments/BOM.xlsx">Anyway, the full BOM can be found here.</a></p>
635
636
637
638<h2 class="wp-block-heading">Enclosure</h2>
639
640
641
642<p class="wp-block-paragraph">Making the enclosure was a blast. My workflow is terrible and costs me several pieces of plastic on each new design I come up with, to be honest. I design the acrylic pieces as 2D Inkscape images and handle the &#8216;3D Modeling&#8217; in my head. It&#8217;s even lower rent than DaveCAD!</p>
643
644
645
646<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/w
646p-content/uploads/2020/05/Enclosure_Reference_Front.png" alt="" class="wp-image-305" width="499" height="325" srcset="https://eequalspi.com/wp-content/uploads/2020/05/Enclosure_Reference_Front.png 853w, https://eequalspi.com/wp-content/uploads/2020/05/Enclosure_Reference_Front-300x196.png 300w, https://eequalspi.com/wp-content/uploads/2020/05/Enclosure_Reference_Front-768x501.png 768w" sizes="auto, (max-width: 499px) 85vw, 499px" /><figcaption>Front Panel. Bent along the red horizontal lines which are not visible in finished enclosure.</figcaption></figure>
647
648
649
650<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/wp-content/uploads/2020/05/Enclosure_Reference_Back.png" alt="" class="wp-image-306" width="504" height="127" srcset="https://eequalspi.com/wp-content/uploads/2020/05/Enclosure_Reference_Back.png 1020w, https://eequalspi.com/wp-content/uploads/2020/05/Enclosure_Reference_Back-300x76.png 300w, https://eequalspi.com/wp-content/uploads/2020/05/Enclosure_Reference_Back-768x194.png 768w" sizes="auto, (max-width: 504px) 85vw, 504px" /><figcaption>Rear Panel. Bent along (Faint) dotted red vertical lines, which are not visible in the final enclosure.</figcaption></figure>
651
652
653
654<p class="wp-block-paragraph"><a href="http://eequalspi.com/attachments/Nixie%20Clock%20Enclosure%20R7.svg">A raw, laser-cut friendly Inkscape SVG file can be found here</a>, with the front and back on various layers.</p>
655
656
657
658<h2 class="wp-block-heading">Conclusion</h2>
659
660
661
662<p class="wp-block-paragraph">Well folks, that&#8217;
662s the hardware in a nutshell. The software will be another post.</p>
663	</div><!-- .entry-content -->
664
665	<footer class="entry-footer">
666		<span class="byline"><span class="author vcard"><img alt='' src='https://secure.gravatar.com/avatar/e9a139e10fb91ac23ce9e30dc5c5f06e0ebeed3ce543b00735e0a3ad11f638f8?s=49&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e9a139e10fb91ac23ce9e30dc5c5f06e0ebeed3ce543b00735e0a3ad11f638f8?s=98&#038;d=mm&#038;r=g 2x' class='avatar avatar-49 photo' height='49' width='49' loading='lazy' decoding='async'/><span class="screen-reader-text">Author </span> <a class="url fn n" href="https://eequalspi.com/index.php/author/thejbw/">thejbw</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://eequalspi.com/index.php/2020/05/16/uniac-hardware-in-detail/" rel="bookmark"><time class="entry-date published" datetime="2020-05-16T15:16:39-07:00">May 16, 2020</time><time class="updated" datetime="2020-05-16T15:37:11-07:00">May 16, 2020</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://eequalspi.com/index.php/category/clocks/" rel="category tag">Clocks</a>, <a href="https://eequalspi.com/index.php/category/nixie/" rel="category tag">Nixie</a>, <a href="https://eequalspi.com/index.php/category/uncategorized/" rel="category tag">Uncategorized</a>, <a href="https://eequalspi.com/index.php/category/uniac/" rel="category tag">UNIAC</a></span><span class="tags-links"><span class="screen-reader-text">Tags </span><a href="https://eequalspi.com/index.php/tag/nixie/" rel="tag">Nixie</a>, <a href="https://eequalspi.com/index.php/tag/raspberrypi/" rel="tag">RaspberryPi</a>, <a href="https://eequalspi.com/index.php/tag/rpi/" rel="tag">RPi</a>, <a href="https://eequalspi.com/index.php/tag/spotify/" rel="tag">Spotify</a>, <a href="https://eequalspi.com/index.php/tag/uniac/" rel="tag">UNIAC</a></span><span class="comments-link"><a href="https://eequalspi.com/index.php/2020/05/16/uniac-hardware-in-detail/#comments">2 Comments<span class="screen-reader-text"> on UNIAC Hardware In Detail</span></a></span>			</footer><!-- .entry-footer -->
667</article><!-- #post-288 -->
668
669<article id="post-277" class="post-277 post type-post status-publish format-standard hentry category-code tag-python tag-raspberrypi tag-raspotify tag-spotify tag-spotipy tag-uniac">
670	<header class="entry-header">
671		
672		<h2 class="entry-title"><a href="https://eequalspi.com/index.php/2020/04/18/refactoring-the-uniac-playback-code/" rel="bookmark">Refactoring The UNIAC Playback Code</a></h2>	</header><!-- .entry-header -->
673
674	
675	
676	<div class="entry-content">
677		
678<p class="wp-block-paragraph">One of the most problematic parts of the UNIAC project has been the music playback software. The original software used the Mopidy music player for command line playback. Mopidy-spotify provided Spotify connectivity to the software. The mpd python library then allowed me to control playback programmatically. </p>
679
680
681
682<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/wp-content/uploads/2020/04/image-1024x453.png" alt="" class="wp-image-281" width="531" height="234" srcset="https://eequalspi.com/wp-content/uploads/2020/04/image-1024x453.png 1024w, https://eequalspi.com/wp-content/uploads/2020/04/image-300x133.png 300w, https://eequalspi.com/wp-content/uploads/2020/04/image-768x339.png 768w, https://eequalspi.com/wp-content/uploads/2020/04/image-1536x679.png 1536w, https://eequalspi.com/wp-content/uploads/2020/04/image-2048x905.png 2048w, https://eequalspi.com/wp-content/uploads/2020/04/image-1200x530.png 1200w, http://eequalspi.com/wp-content/uploads/2020/04/image.png 3326w" sizes="auto, (max-width: 531px) 85vw, 531px" /><figcaption>Old Mopidy + MPD based flow</figcaption></figure>
683
684
685
686<p class="wp-block-paragraph">This had several problems.</p>
687
688
689
690<ol class="wp-block-list"><li>Mopidy-spotify is partially broken. Spotify themselves no longer support this interface, and haven&#8217;t since 2016. To get it working at all requires a hacked fork of Mopidy-spotify which might break forever at any time.</li><li>Response between Python and Mopidy can be really laggy and requires a continuous ping (every 30 seconds) to keep the connection alive.</li><li>Loading a new playlist in Mopidy requires significant caching and can have tens of seconds of lag, making the whole system unreasonably slow.</li></ol>
691
692
693
694<p class="wp-block-paragraph">
694This was all a legacy of the fact that I had designed the software for UNIAC in 2015 and the Mopidy workflow was the only one I could find for getting Spotify playback on a Raspberry Pi. In early 2020, after hearing about Spotifyd from <a href="https://www.dinofizzotti.com/blog/2020-02-05-diskplayer-using-3.5-floppy-disks-to-play-albums-on-spotify/">the Diskplayer project</a>, I was awoken to more modern alternatives.</p>
695
696
697
698<p class="wp-block-paragraph">After some rework, I ripped out Mopidy and mpd, and replaced it with <a href="https://github.com/dtcooper/raspotify">raspotify</a> as a player and <a href="https://spotipy.readthedocs.io/en/2.11.1/">Spotipy</a> to interface with Spotify.</p>
699
700
701
702<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/wp-content/uploads/2020/04/image-1-1024x439.png" alt="" class="wp-image-282" width="521" height="223" srcset="https://eequalspi.com/wp-content/uploads/2020/04/image-1-1024x439.png 1024w, https://eequalspi.com/wp-content/uploads/2020/04/image-1-300x128.png 300w, https://eequalspi.com/wp-content/uploads/2020/04/image-1-768x329.png 768w, https://eequalspi.com/wp-content/uploads/2020/04/image-1-1536x658.png 1536w, https://eequalspi.com/wp-content/uploads/2020/04/image-1-2048x877.png 2048w, https://eequalspi.com/wp-content/uploads/2020/04/image-1-1200x514.png 1200w, http://eequalspi.com/wp-content/uploads/2020/04/image-1.png 3302w" sizes="auto, (max-width: 521px) 85vw, 521px" /><figcaption>New Raspotify + Spotipy based flow</figcaption></figure>
703
704
705
706<p class="wp-block-paragraph">This has several advantages.</p>
707
708
709
710<ol class="wp-block-list"><li>The control API that Spotipy uses is actively supported by Spotify</li><li>Raspotify makes the Pi show up as a Spotify speaker, meaning active playback can be bounced between devices.</li><li>Spotipy is controlling my Spotify state, not Mopidy, so it can actually control playback of other devices that are actively playing music.</li><li>By the same token, pausing and unpausing on other clients (phone, laptop, etc.) works seamlessly.</li><li>Music is streamed, not buffered. This means that loading a new playlist is as instant as it is on the desktop client.</li></ol>
711
712
713
714<p class="wp-block-paragraph">All in all, this means that the switch resulted in a much more pleasant user experience. On top of that, the system is generally more stable than it was before.</p>
715
716
717
718<p class="wp-block-paragraph">Plus, setting up Raspotify was orders of magnitude less difficult than Mopidy. Raspotify managed to work automagically after apt-get installing it and setting it up as a service. This was unlike Mopidy, which took forever to point at the right sound card and get working. </p>
719
720
721
722<p class="wp-block-paragraph">There were some hiccups in figuring out how to connect to Spotify with Spotifyd, but the biggest tricks were:</p>
723
724
725
726<ol class="wp-block-list"><li>Learning that the credential saving path should be a full filename, not a path to a directory.</li><li>Realizing that the redirect URI could be &#8220;http://localhost&#8221;. To make that work, all you have to do is run the login script from the command line on your Pi and then copy the URL it feeds you to a browser on a desktop machine. Once you accept the terms, all you have to do is copy the &#8216;broken&#8217; URL that it takes you to back into your Pi command line and hit enter. Things should work from there.</li></ol>
727
728
729
730<p class="wp-block-paragraph">If you&#8217;re looking to build a Raspberry Pi / Spotify player, avoid MPD and go for a Spotipy / Raspotify combo!</p>
731
732
733
734<p class="wp-block-paragraph"><a href="https://github.com/wespo/UNIAC/tree/spotifyd">The revised code can be found here.</a></p>
735	</div><!-- .entry-content -->
736
737	<footer class="entry-footer">
738		<span class="byline"><span class="author vcard"><img alt='' src='https://secure.gravatar.com/avatar/e9a139e10fb91ac23ce9e30dc5c5f06e0ebeed3ce543b00735e0a3ad11f638f8?s=49&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e9a139e10fb91ac23ce9e30dc5c5f06e0ebeed3ce543b00735e0a3ad11f638f8?s=98&#038;d=mm&#038;r=g 2x' class='avatar avatar-49 photo' height='49' width='49' loading='lazy' decoding='async'/><span class="screen-reader-text">Author </span> <a class="url fn n" href="https://eequalspi.com/index.php/author/thejbw/">thejbw</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://eequalspi.com/index.php/2020/04/18/refactoring-the-uniac-playback-code/" rel="bookmark"><time class="entry-date published" datetime="2020-04-18T16:39:24-07:00">April 18, 2020</time><time class="updated" datetime="2020-04-18T16:44:45-07:00">April 18, 2020</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://eequalspi.com/index.php/category/code/" rel="category tag">
738Code</a></span><span class="tags-links"><span class="screen-reader-text">Tags </span><a href="https://eequalspi.com/index.php/tag/python/" rel="tag">Python</a>, <a href="https://eequalspi.com/index.php/tag/raspberrypi/" rel="tag">RaspberryPi</a>, <a href="https://eequalspi.com/index.php/tag/raspotify/" rel="tag">Raspotify</a>, <a href="https://eequalspi.com/index.php/tag/spotify/" rel="tag">Spotify</a>, <a href="https://eequalspi.com/index.php/tag/spotipy/" rel="tag">Spotipy</a>, <a href="https://eequalspi.com/index.php/tag/uniac/" rel="tag">UNIAC</a></span>			</footer><!-- .entry-footer -->
739</article><!-- #post-277 -->
740
741<article id="post-273" class="post-273 post type-post status-publish format-standard hentry category-code tag-python tag-spotify tag-spotipy">
742	<header class="entry-header">
743		
744		<h2 class="entry-title"><a href="https://eequalspi.com/index.php/2020/04/11/spotipyd-configuration/" rel="bookmark">Spotipy-configuration</a></h2>	</header><!-- .entry-header -->
745
746	
747	
748	<div class="entry-content">
749		
750<p class="wp-block-paragraph">If you are trying to set up <a href="https://spotipy.readthedocs.io/en/2.11.1/">Spotipy</a>, like me, and you want to cache your credentials but are getting the following error, </p>
751
752
753
754<pre class="wp-block-preformatted">warning:couldn't write token cache to /home/pi/spotipy_credentials</pre>
755
756
757
758<p class="wp-block-paragraph">and have to auth on every run, it&#8217;s likely because in your call to</p>
759
760
761
762<pre class="wp-block-preformatted">spotipy.Spotify(client_credentials_manager=SpotifyOAuth(...)</pre>
763
764
765
766<p class="wp-block-paragraph">you specified cache_path as something like:</p>
767
768
769
770<pre class="wp-block-preformatted">cache_path='/home/pi/spotipy_credentials/'</pre>
771
772
773
774<p class="wp-block-paragraph">Because, naturally, that&#8217;s a path. In fact, cache_path is a full file path (i.e. it contains a writable filename). I did this instead:</p>
775
776
777
778<pre class="wp-block-preformatted">cache_path='/home/pi/spotipy_credentials/.cache-' + username,</pre>
779
780
781
782<p class="wp-block-paragraph">where username was a variable I wrote. As far as I know, you could just write make the filename &#8216;credentials.txt&#8217; if you wanted&#8230;</p>
783
784
785
786<p class="wp-block-paragraph">Anyway, hope that helps someone else.</p>
787	</div><!-- .entry-content -->
788
789	<footer class="entry-footer">
790		<span class="byline"><span class="author vcard"><img alt='' src='https://secure.gravatar.com/avatar/e9a139e10fb91ac23ce9e30dc5c5f06e0ebeed3ce543b00735e0a3ad11f638f8?s=49&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e9a139e10fb91ac23ce9e30dc5c5f06e0ebeed3ce543b00735e0a3ad11f638f8?s=98&#038;d=mm&#038;r=g 2x' class='avatar avatar-49 photo' height='49' width='49' loading='lazy' decoding='async'/><span class="screen-reader-text">Author </span> <a class="url fn n" href="https://eequalspi.com/index.php/author/thejbw/">thejbw</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://eequalspi.com/index.php/2020/04/11/spotipyd-configuration/" rel="bookmark"><time class="entry-date published" datetime="2020-04-11T17:05:50-07:00">April 11, 2020</time><time class="updated" datetime="2020-04-18T13:46:52-07:00">April 18, 2020</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://eequalspi.com/index.php/category/code/" rel="category tag">Code</a></span><span class="tags-links"><span class="screen-reader-text">Tags </span><a href="https://eequalspi.com/index.php/tag/python/" rel="tag">Python</a>, <a href="https://eequalspi.com/index.php/tag/spotify/" rel="tag">Spotify</a>, <a href="https://eequalspi.com/index.php/tag/spotipy/" rel="tag">Spotipy</a></span>			</footer><!-- .entry-footer -->
791</article><!-- #post-273 -->
792
793<article id="post-219" class="post-219 post type-post status-publish format-standard hentry category-clocks category-nixie category-uniac tag-nixie tag-python tag-spotify tag-uniac">
794	<header class="entry-header">
795		
796		<h2 class="entry-title"><a href="https://eequalspi.com/index.php/2020/04/04/uniac-the-ultimate-nixie-internet-alarm-clock/" rel="bookmark">UNIAC: The Ultimate Nixie Internet Alarm Clock.</a></h2>	</header><!-- .entry-header -->
797
798	
799	
800	<div class="entry-content">
801		
802<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="640" height="479" src="http://eequalspi.com/w
802p-content/uploads/2020/01/IMG_5816.gif" alt="" class="wp-image-234"/><figcaption>UNIAC. The non-portable 2015 UNIAC prototype is lurking in the background&#8230;waiting.</figcaption></figure>
803
804
805
806<h2 class="wp-block-heading">Introduction</h2>
807
808
809
810<p class="wp-block-paragraph">What is UNIAC? It is the <strong>U</strong>ltimate <strong>N</strong>ixie <strong>I</strong>nternet <strong>A</strong>larm <strong>C</strong>lock. <br>It&#8217;s a Nixie alarm clock / boombox.</p>
811
812
813
814<ul class="wp-block-list"><li>It uses a Raspberry Pi to stream music from Spotify. </li><li>It has integral IN-13 VU meters to visualize the music. </li><li>It&#8217;s got a robot voice to relay information that the Nixies cannot. </li><li>It&#8217;s got clickety light-up buttons on the front. </li><li>It&#8217;s got a translucent clamshell case made of smoked acrylic.</li></ul>
815
816
817
818<p class="wp-block-paragraph">It&#8217;s a piece of the future that never was. In short, it&#8217;s <em>cool</em>. </p>
819
820
821
822<h2 class="wp-block-heading">Motivation and Background</h2>
823
824
825
826<div class="wp-block-image"><figure class="alignright size-large is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/wp-content/uploads/2020/01/IMG_0403.jpg" alt="" class="wp-image-217" width="248" height="186" srcset="https://eequalspi.com/wp-content/uploads/2020/01/IMG_0403.jpg 800w, https://eequalspi.com/wp-content/uploads/2020/01/IMG_0403-300x225.jpg 300w, https://eequalspi.com/wp-content/uploads/2020/01/IMG_0403-768x576.jpg 768w" sizes="auto, (max-width: 248px) 85vw, 248px" /><figcaption>My First Nixie Display</figcaption></figure></div>
827
828
829
830<p class="wp-block-paragraph">I built my first Nixie Clock in 2006, which worked, but I was never satisfied with the design. I soon began fantasizing about what my dream Nixie clock would look like. It would replace my dusty old RadioShack alarm clock. </p>
831
832
833
834<p class="wp-block-paragraph">Unfortunately, life got in the way. The project got shelved, and grad school came along, but  the idea hung in the back of my mind. By 2015, the technology landscape had changed and my hands on electronics skills had grown. I had new options, and came up with a new plan using a RaspberryPi. The ultimate Nixie clock would have:</p>
835
836
837
838<div class="wp-block-image"><figure class="alignright is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/wp-content/uploads/2019/07/Screen-Shot-2019-07-09-at-10.29.47-PM.png" alt="" class="wp-image-172" width="267" height="142" srcset="https://eequalspi.com/wp-content/uploads/2019/07/Screen-Shot-2019-07-09-at-10.29.47-PM.png 876w, https://eequalspi.com/wp-content/uploads/2019/07/Screen-Shot-2019-07-09-at-10.29.47-PM-300x159.png 300w, https://eequalspi.com/wp-content/uploads/2019/07/Screen-Shot-2019-07-09-at-10.29.47-PM-768x407.png 768w" sizes="auto, (max-width: 267px) 85vw, 267px" /><figcaption>The cheap LED alarm clock that motivated me.</figcaption></figure></div>
839
840
841
842<ul class="wp-block-list"><li>Clock</li><li>Alarm</li><li>Calendar</li><li>Spotify as the music/alarm source</li></ul>
843
844
845
846<p class="wp-block-paragraph">To tackle this relatively complex project, I decided to break it into parts. After tackling each subsystem individually, I had a reliable, tested circuit and was able then to integrate them into a unified system.</p>
847
848
849
850<h2 class="wp-block-heading">Two Builds</h2>
851
852
853
854<p class="wp-block-paragraph">The first version was built in late 2015. It was a cube of laser cut acrylic sheets with the various subsystems mounted to an internal backplane with standoffs. The internal structure was built from square 3/8&#8243; dowels which held the sides together. This version has served well on my electronics bench since it was put together, but it always bothered me that it was extremely cumbersome to open up and service. Additionally, the acrylic backplane was just inelegant.</p>
855
856
857
858<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
859<figure class="wp-block-image is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/w
859p-content/uploads/2020/03/IMG_1337-1024x575.jpg" alt="" class="wp-image-247" width="565" height="317" srcset="https://eequalspi.com/wp-content/uploads/2020/03/IMG_1337-1024x575.jpg 1024w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_1337-300x169.jpg 300w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_1337-768x432.jpg 768w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_1337-1536x863.jpg 1536w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_1337-2048x1151.jpg 2048w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_1337-1200x674.jpg 1200w, http://eequalspi.com/wp-content/uploads/2020/03/IMG_1337-scaled.jpg 2560w" sizes="auto, (max-width: 565px) 85vw, 565px" /><figcaption>UNIAC 2015: Front view</figcaption></figure>
860
861
862
863<figure class="wp-block-image is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/wp-content/uploads/2020/03/IMG_1339-1024x575.jpg" alt="" class="wp-image-248" width="564" height="317" srcset="https://eequalspi.com/wp-content/uploads/2020/03/IMG_1339-1024x575.jpg 1024w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_1339-300x169.jpg 300w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_1339-768x432.jpg 768w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_1339-1536x863.jpg 1536w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_1339-2048x1151.jpg 2048w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_1339-1200x674.jpg 1200w, http://eequalspi.com/wp-content/uploads/2020/03/IMG_1339-scaled.jpg 2560w" sizes="auto, (max-width: 564px) 85vw, 564px" /><figcaption>UNIAC 2015: Rear view. I never got around to fabricating the back panel.</figcaption></figure>
864
865
866
867<figure class="wp-block-image is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/wp-content/uploads/2020/03/IMG_1342-1024x575.jpg" alt="" class="wp-image-250" width="558" height="313" srcset="https://eequalspi.com/wp-content/uploads/2020/03/IMG_1342-1024x575.jpg 1024w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_1342-300x169.jpg 300w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_1342-768x432.jpg 768w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_1342-1536x863.jpg 1536w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_1342-2048x1151.jpg 2048w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_1342-1200x674.jpg 1200w, http://eequalspi.com/wp-content/uploads/2020/03/IMG_1342-scaled.jpg 2560w" sizes="auto, (max-width: 558px) 85vw, 558px" /><figcaption>UNIAC 2015: Top view with the lid off. Inside can be seen the backplane and the rails it slides into.</figcaption></figure>
868</div></div>
869
870
871
872<p class="wp-block-paragraph">In 2019, with this in mind I decided I could do better. I integrated all of the components (except the front panel buttons and speakers) onto a motherboard. With a single board, I decided on a boombox form factor. This version isn&#8217;t really a good fit for a bedside alarm clock, but it is extremely satisfying.</p>
873
874
875
876<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/wp-content/uploads/2020/03/IMG_5285-1024x768.png" alt="" class="wp-image-252" width="597" height="448" srcset="https://eequalspi.com/wp-content/uploads/2020/03/IMG_5285-1024x768.png 1024w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_5285-300x225.png 300w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_5285-768x576.png 768w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_5285-1200x900.png 1200w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_5285.png 1280w" sizes="auto, (max-width: 597px) 85vw, 597px" /><figcaption>UNIAC 2019, in the boombox style clamshell case.</figcaption></figure>
877
878
879
880<p class="wp-block-paragraph">To enable this, I built an acrylic bending jig, and designed a clamshell case to hold it all. The case was made from two pieces of laser cut acrylic. The back panel is solid black to keep ambient light out. The front is smoked grey and hides the electronics but lets the Nixie goodness shine through. </p>
881
882
883
884<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/w
884p-content/uploads/2020/03/IMG_5038-768x1024.png" alt="" class="wp-image-254" width="594" height="792" srcset="https://eequalspi.com/wp-content/uploads/2020/03/IMG_5038-768x1024.png 768w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_5038-225x300.png 225w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_5038-1152x1536.png 1152w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_5038-1536x2048.png 1536w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_5038-1200x1600.png 1200w, http://eequalspi.com/wp-content/uploads/2020/03/IMG_5038.png 3024w" sizes="auto, (max-width: 594px) 85vw, 594px" /><figcaption>Acrylic bender on the bench with a piece of test plastic (and the rev of UNIAC 2019 mobo in the background).</figcaption></figure>
885
886
887
888<p class="wp-block-paragraph">Getting the acrylic bent at the right spot took a few tries &#8212; the first test (using cheaper clear plastic) put the bend too close to the button cutouts. This caused the holes to deform and become teardrop shaped. I still think the clear case has a cool 90&#8217;s feel to it, but that doesn&#8217;t fit my general design tastes, so I stuck with the plan to go to a smoked front panel.</p>
889
890
891
892<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/wp-content/uploads/2020/03/IMG_5040-1024x768.png" alt="" class="wp-image-255" width="598" height="449" srcset="https://eequalspi.com/wp-content/uploads/2020/03/IMG_5040-1024x768.png 1024w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_5040-300x225.png 300w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_5040-768x576.png 768w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_5040-1536x1152.png 1536w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_5040-2048x1536.png 2048w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_5040-1200x900.png 1200w, http://eequalspi.com/wp-content/uploads/2020/03/IMG_5040.png 4032w" sizes="auto, (max-width: 598px) 85vw, 598px" /><figcaption>UNIAC 2019: First test enclosure.</figcaption></figure>
893
894
895
896<p class="wp-block-paragraph">After a couple of revisions, the final two piece enclosure came together nicely. I was worried that lifting the unit by the handle would cause the acrylic to flex, but it&#8217;s actually reasonably sturdy. I might consider some additional brackets to more firmly attack the front to the back in the future. For now, I think mounting the two haves together through motherboard standoffs is sufficient.</p>
897
898
899
900<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/wp-content/uploads/2020/03/IMG_5287-1024x768.png" alt="" class="wp-image-253" width="599" height="449" srcset="https://eequalspi.com/wp-content/uploads/2020/03/IMG_5287-1024x768.png 1024w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_5287-300x225.png 300w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_5287-768x576.png 768w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_5287-1200x900.png 1200w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_5287.png 1280w" sizes="auto, (max-width: 599px) 85vw, 599px" /><figcaption><br>UNIAC 2019 showing the clamshell case open, with the motherboard and button board.</figcaption></figure>
901
902
903
904<h2 class="wp-block-heading">The VU-Meter</h2>
905
906
907
908<div class="wp-block-image"><figure class="alignright size-large is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/wp-content/uploads/2017/02/vumeter1.png" alt="" class="wp-image-18" width="355" height="125" srcset="https://eequalspi.com/wp-content/uploads/2017/02/vumeter1.png 898w, https://eequalspi.com/wp-content/uploads/2017/02/vumeter1-300x106.png 300w, https://eequalspi.com/wp-content/uploads/2017/02/vumeter1-768x270.png 768w" sizes="auto, (max-width: 355px) 85vw, 355px" /><figcaption>The IN-13 Vu-Meter as a standalone module.</figcaption></figure></div>
909
910
911
912<p class="wp-block-paragraph">When audio is playing from UNIAC, it really needed to show some &#8220;activity&#8221; &#8212; something like an oscilloscope would work, but in keeping with the Nixie theme, I decided to use the IN-13 bargraph tubes to display the sound levels on the left and right channels. No digital trickery here, the module takes analog line-level audio as a passthrough and displays the amplitude level of the audio channels on its IN-13 bargraph tubes. I&#8217;ve seen lots of mono IN-13 VU-meters, and I&#8217;ve seen a few standalone modules, but I&#8217;
912ve never seen them combined with normal Nixies before. </p>
913
914
915
916<p class="wp-block-paragraph">While I originally designed the VU-meter module intending to use it as a drop in component in UNIAC, the circuit has seen more service hours as a standalone module in my hi-fi (it&#8217;s been in near-constant use since late 2015). Nonetheless, it looks great in its intended role as a component of UNIAC.</p>
917
918
919
920<p class="wp-block-paragraph">I described the design of this component in detail <a href="http://eequalspi.com/index.php/2017/02/13/in-13-stereo-vu-meter/">in a series of previous posts</a>, which includes some theory, design decisions, and schematics. </p>
921
922
923
924<h2 class="wp-block-heading">The Nixie Display</h2>
925
926
927
928<p class="wp-block-paragraph">Because UNIAC is a media player, it needed a general purpose addressable Nixie display, not just a Nixie clock module. This part of the project was actually the first I began to tackle, back in 2009. I had nearly finished a display module using an 8051 and written in assembly, but stopped work when I went back to school. With cross-fading and all sorts of neat features, it was more or less what I wanted, but it had minor ghosting issues that I was unwilling to tolerate. Therefore, version one (2015) used <a href="https://www.shop-tes.com/smartnixie/display-module/">Smart Nixie modules from Taylor Edge</a>  with a modified backplane. </p>
929
930
931
932<div class="wp-block-image"><figure class="alignright size-large is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/wp-content/uploads/2020/03/low-res-Apple-Devices-SD.gif" alt="" class="wp-image-261" width="229" height="134"/><figcaption>Nixie display using a Teensy 3.2 developed for another project.</figcaption></figure></div>
933
934
935
936<p class="wp-block-paragraph">For the final version (2019), I based the design off a four tube Nixie display module using a Teensy 3.2 I had built for another project. When I finish that project, I will describe it in detail in a post. Until then, you can see the prototype at the right. The chief advantages to this design are a reduction in cost versus six Smart Nixie sockets, and the ability to integrate it onto the new motherboard without using risers. The UNIAC version of the display supports six tubes and uses IN12As, but is otherwise broadly the same design. </p>
937
938
939
940<p class="wp-block-paragraph">Input is via USB serial, TTL serial or i2c inputs and supports both dimming and crossfading.</p>
941
942
943
944<p class="wp-block-paragraph">Admittedly, multiplexing by 6x instead of 4x leads to a slightly dimmer display than the previous Smart Nixie approach, but it&#8217;s good enough. If there&#8217;s a future build, I&#8217;ll likely split it up into two banks of three tubes to increase the brightness (at the cost of board area and complexity).</p>
945
946
947
948<h2 class="wp-block-heading">The Motherboard</h2>
949
950
951
952<p class="wp-block-paragraph">With the Nixie display circuit and the vu-meter circuit validated, it was time to build a full system. </p>
953
954
955
956<p class="wp-block-paragraph">Version 1, built in 2015 prototype was a &#8216;wired together modules&#8217; build. Using a laser cut backplane, the various modules were mounted to both sides with standoffs. The backplane then slotted into a cube made with an internal wooden frame covered with laser cut panels. This design worked well, but the rats nest of wires made it an absolute nightmare to open up and work on. </p>
957
958
959
960<p class="wp-block-paragraph">For the final version, I decided I had to replace the backplane board with a PCB. The new motherboard would have an integrated copy of the Nixie display and vu-meter circuitry. A footprint The Raspberry Pi, audio DAC, and amplifier would be on board as well. It would take 12V in, and the only off board connections would be the speakers and to the front panel buttons. Because all my peripherals used serial interfaces, the actual board design was actually pretty sparse, and most of the work was in routing the traces for the Nixie display in a way that maintained sufficient creepage.</p>
961
962
963
964<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/w
964p-content/uploads/2020/03/IMG_5286-1024x768.png" alt="" class="wp-image-257" width="599" height="449" srcset="https://eequalspi.com/wp-content/uploads/2020/03/IMG_5286-1024x768.png 1024w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_5286-300x225.png 300w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_5286-768x576.png 768w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_5286-1200x900.png 1200w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_5286.png 1280w" sizes="auto, (max-width: 599px) 85vw, 599px" /><figcaption>UNIAC 2019 motherboard front view.</figcaption></figure>
965
966
967
968<p class="wp-block-paragraph">Taking a look at the front side of the motherboard (above), it&#8217;s primarily the cosmetic components. We see the six IN-12A tubes, eight INS-1 neon bulbs, two IN-13 tubes. Also of note are the unpopulated pads along the bottom for connecting the buttons directly to the RaspberryPi, which are unused in this build in favor of the i2c button board (described in the next section).</p>
969
970
971
972<h2 class="wp-block-heading">A Tour of the Motherboard</h2>
973
974
975
976<p class="wp-block-paragraph">On the back side of the board, we can see a ton of components. </p>
977
978
979
980<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="http://eequalspi.com/wp-content/uploads/2020/03/IMG_5289-1024x768.png" alt="" class="wp-image-256" width="599" height="449" srcset="https://eequalspi.com/wp-content/uploads/2020/03/IMG_5289-1024x768.png 1024w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_5289-300x225.png 300w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_5289-768x576.png 768w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_5289-1200x900.png 1200w, https://eequalspi.com/wp-content/uploads/2020/03/IMG_5289.png 1280w" sizes="auto, (max-width: 599px) 85vw, 599px" /><figcaption>UNIAC 2019: Motherboard back view.</figcaption></figure>
981
982
983
984<p class="wp-block-paragraph">Next, in green with a raspberry symbol, is the main CPU, a RaspberryPi Zero W (hereafter RPi), which is the core of the system.</p>
985
986
987
988<p class="wp-block-paragraph">To the right of that is a rainbow ribbon cable going off to the button board.</p>
989
990
991
992<p class="wp-block-paragraph">Next, at the right is a TES-1364H boost module. This provides HV for the IN-13s. It is twinned with another -1364 at the top right, which provides HV for the numbers. I chose to keep the two supplies separate not because I was sure I was out of current, but because the two sets of tubes call for different striking voltages, and I didn&#8217;t feel like adjusting the values of the two display circuits to compensate. In a future revision, I&#8217;ll absolutely address that.</p>
993
994
995
996<p class="wp-block-paragraph">The group of components just right of center are the components for the IN-13 display, which are described in more detail in the IN-13 VUMeter posts, but the two DIP ICs are a quad op-amp and an ATTINY85. </p>
997
998
999
1000<p class="wp-block-paragraph">The two tiny green three-pin boards are <a href="https://power.murata.com/pub/data/power/oki-78sr.pdf">Mu-rata OKI-78SR</a> modules. These are more efficient drop in replacements for the classic LM7805. </p>
1001
1002
1003
1004<p class="wp-block-paragraph">Directly above the RPi is a purple board. <a href="http://eequalspi.com/index.php/2019/08/25/mopidy-and-multiple-audio-streams-from-the-command-line-on-raspberry-pi/">This is the i2s sound card using the PCM5102A ic</a>.</p>
1005
1006
1007
1008<p class="wp-block-paragraph">Connected to the sound card is a blue <a href="https://www.adafruit.com/product/1752">Adafruit class-d amplifier board</a> at the bottom left.  It  was chosen because it is relatively low-noise, has a mute pin,  and can use an external pot for volume control &#8212; here you can see the  wire for the pot running off to the knob on the side of the rear panel.</p>
1009
1010
1011
1012<p class="wp-block-paragraph">Finally at the top left is a <a href="https://www.pjrc.com/teensy/index.html">Teensy 3.2</a>, the CPU for the Nixie display module. This is gross overkill to drive a display, but it was convenient to code up quickly, and I was able to set it up as an i2c slave, simplifying communication with the RPi.</p>
1013
1014
1015
1016<h2 class="wp-block-heading">The Button Board</h2>
1017
1018
1019
1020<div class="wp-block-image"><figure class="alignright is-resized"><img loading="lazy" decoding="async" src="https://i.ebayimg.com/images/g/2KsAAOSwjwpc1GDi/s-l1600.jpg" alt="https://i.ebayimg.com/images/g/2KsAAOSwjwpc1GDi/s-l1600.jpg" width="240" height="159"/><figcaption>Clicky momentary 12V buttons, sourced from eBay</figcaption></figure></div>
1021
1022
1023
1024<p class="wp-block-paragraph">For the control panel interface I chose some clicky 12V illuminated momentary buttons that were intended for industrial applications. Very satisfying. They were about $1.30 per each, so not cheap, however. Given that the buttons are the main user interface, having something that satisfies the retro vibe satisfactorily was worth it.</p>
1025
1026
1027
1028<p class="wp-block-paragraph">The 2015 version used a single GPIO pin on the raspberry pi for each button, and used a single GPIO (through a FET, obviously) to 
1028switch the lighting on them all on together. This, again, led to a tedious amount of manual wiring, so I designed a button board using a MCP23017 GPIO expander to connect to the buttons. The board itself is very simple, although I had the first boards manufactured by AllPCB, and they failed to route the slots, despite saying they&#8217;d confirm the slots with checkplots in an email discussion beforehand. This triggered my switch to PCBWay who correctly provided checkplots and produced the right board. I have been using them since, and who have treated me well &#8212; no they aren&#8217;t sponsoring me, I&#8217;m just pissed off enough at AllPCB to mention it, since they ignored my customer complaint that I filed after the fact.</p>
1029
1030
1031
1032<h2 class="wp-block-heading">The Battery Problem</h2>
1033
1034
1035
1036<p class="wp-block-paragraph">Okay, it&#8217;s time for full disclosure, I&#8217;ve been calling this project portable, but throughout the build process I treated a battery as &#8220;something I would figure out later&#8221; &#8212; It turns out the BMSs are no joke, and there wasn&#8217;t much out there that would suit my needs. The fundamental problem is that there&#8217;s a large burst of current on power up, despite the fact that the overall system only draws a few hundred mA when fully up and running. I tried a few low cost boost converters and they all browned out before the system booted. As I wanted to share the portable UNIAC with my friends at PAX 2019, I ended up punting last minute and <a href="https://www.amazon.com/gp/product/B00ME3ZH7C/">taping a 12V battery pack from Amazon</a> to the back of the unit.</p>
1037
1038
1039
1040<h2 class="wp-block-heading">Music Playback</h2>
1041
1042
1043
1044<p class="wp-block-paragraph">To play music, I am using the command line media player Mopidy and its Spotify plugin, Mopidy-Spotify. This requires a premium Spotify account to work, and is brittle. The API Mopidy-Spotify uses is not supported anymore. I&#8217;ve found that the repo fails to load my playlists unless I use the fork mentioned in <a href="https://github.com/BlackLight/mopidy-spotify/tree/fix/incompatible_playlists">this thread</a>. </p>
1045
1046
1047
1048<p class="wp-block-paragraph">Getting the audio itself to work was also a massive pain, as the various Linux audio subsystems like to fight as is, and the I2S audio card I was using made things more difficult. I could go into more detail here, but I think it merits its own post&#8230;</p>
1049
1050
1051
1052<p class="wp-block-paragraph"><a href="http://eequalspi.com/index.php/2019/08/25/mopidy-and-multiple-audio-streams-from-the-command-line-on-raspberry-pi/">So I wrote a full post about it!</a></p>
1053
1054
1055
1056<h2 class="wp-block-heading">Display Library</h2>
1057
1058
1059
1060<p class="wp-block-paragraph">For the first version of the UNIAC with TES SmartNixie modules, I whipped up a quick python library to interface with them. It might come in handy for someone else, so I have <a href="https://github.com/wespo/SmartNixie">published it here</a>.</p>
1061
1062
1063
1064<p class="wp-block-paragraph">For the final version, I was using my own i2c display module, so I wrote a (nearly) drop-in replacement library for the SmartNixie library, so I could minimally modify the main UNIAC application to support the new display. It is <a href="https://github.com/wespo/NixieDisplay">published here</a>.</p>
1065
1066
1067
1068<p class="wp-block-paragraph">It supports some fun features like dimming, cross-fading, blanking, and blinking.</p>
1069
1070
1071
1072<h2 class="wp-block-heading">The UNIAC Application</h2>
1073
1074
1075
1076<p class="wp-block-paragraph">The main UNIAC application is a python script. The main loop probes the interface buttons and then calls a python god object, which maintains various states, drives the displays and voice, and sends audio commands to Mopidy. There&#8217;s a lot to this application, but that&#8217;s an entire post in and of itself. Until I get around to a full writeup for it, you can find it <a href="https://github.com/wespo/UNIAC">published here.</a></p>
1077
1078
1079
1080<h2 class="wp-block-heading">Conclusion</h2>
1081
1082
1083
1084<p class="wp-block-paragraph">At the end of the project, UNIAC is probably the most satisfying hobby project I have yet made. Due to the brittle nature of the Mopidy-spotify, my next task is to move the Spotify interface to spotifyd, which I discovered due to reading <a href="https://www.dinofizzotti.com/blog/2020-02-05-diskplayer-using-3.5-floppy-disks-to-play-albums-on-spotify/">Dino Fizotti&#8217;s excellent Diskplayer writeup.</a> The other glaringly obvious improvement is adding a proper, internal battery system.</p>
1085
1086
1087
1088<p class="wp-block-paragraph">Longer term, I&#8217;d like to try to integrate it with a voice assistant to really supercharge interface, but that is more software work than I&#8217;m willing to take on in the immediate future.</p>
1089
1090
1091
1092<p class="wp-block-paragraph">The sad irony however, is that I&#8217;ve spent so long listening to the crappy buzzer of my Radio Shack alarm clock that I actually don&#8217;t want to give it up now. I&#8217;m conditioned to wake up to it quickly, and it takes up little space on my nightstand. Oh well. Maybe the next project will be a UNIAC Mini with an alarm buzzer feature.</p>
1093
1094
1095
1096<p class="wp-block-paragraph">I know this has been a long post. Thanks for sticking with me! </p>
1097
1098
1099
1100<p class="wp-block-paragraph">o/</p>
1101	</div><!-- .entry-content -->
1102
1103	<footer class="entry-footer">
1104		<span class="byline"><span class="author vcard"><img alt='' src='https://secure.gravatar.com/avatar/e9a139e10fb91ac23ce9e30dc5c5f06e0ebeed3ce543b00735e0a3ad11f638f8?s=49&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e9a139e10fb91ac23ce9e30dc5c5f06e0ebeed3ce543b00735e0a3ad11f638f8?s=98&#038;d=mm&#038;r=g 2x' class='avatar avatar-49 photo' height='49' width='49' loading='lazy' decoding='async'/><span class="screen-reader-text">Author </span> <a class="url fn n" href="https://eequalspi.com/index.php/author/thejbw/">thejbw</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://eequalspi.com/index.php/2020/04/04/uniac-the-ultimate-nixie-internet-alarm-clock/" rel="bookmark"><time class="entry-date published" datetime="2020-04-04T17:47:30-07:00">April 4, 2020</time><time class="updated" datetime="2020-04-18T13:48:35-07:00">April 18, 2020</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://eequalspi.com/index.php/category/clocks/" rel="category tag">Clocks</a>, <a href="https://eequalspi.com/index.php/category/nixie/" rel="category tag">Nixie</a>, <a href="https://eequalspi.com/index.php/category/uniac/" rel="category tag">UNIAC</a></span><span class="tags-links"><span class="screen-reader-text">Tags </span><a href="https://eequalspi.com/index.php/tag/nixie/" rel="tag">Nixie</a>, <a href="https://eequalspi.com/index.php/tag/python/" rel="tag">Python</a>, <a href="https://eequalspi.com/index.php/tag/spotify/" rel="tag">Spotify</a>, <a href="https://eequalspi.com/index.php/tag/uniac/" rel="tag">UNIAC</a></span><span class="comments-link"><a href="https://eequalspi.com/index.php/2020/04/04/uniac-the-ultimate-nixie-internet-alarm-clock/#comments">5 Comments<span class="screen-reader-text"> on UNIAC: The Ultimate Nixie Internet Alarm Clock.</span></a></span>			</footer><!-- .entry-footer -->
1105</article><!-- #post-219 -->
1106
1107<article id="post-171" class="post-171 post type-post status-publish format-standard hentry category-uncategorized">
1108	<header class="entry-header">
1109		
1110		<h2 class="entry-title"><a href="https://eequalspi.com/index.php/2020/01/01/displaying-mw-with-nixies/" rel="bookmark">Displaying MW with Nixies</a></h2>	</header><!-- .entry-header -->
1111
1112	
1113	
1114	<div class="entry-content">
1115		
1116<p class="wp-block-paragraph">My fascination with <a href="https://en.wikipedia.org/wiki/Nixie_tube">Nixie tubes</a> began around 2006. These beautiful retro tubes make amazing displays and have been made into hundreds of well documented clocks. At that time I bought a handful of tubes and got permission to build a Nixie clock as project for a senior level undergrad EE lab course. I actually built it as two separate boards, a serially addressed Nixie display and a serial output clock module. </p>
1117
1118
1119
1120<p class="wp-block-paragraph">Both the display and the clock were built around an AT89C4051 microcontroller, with direct drive using one <a href="https://tubehobby.com/show_det.php?det=34">K155ID1</a> per chip. The high voltage supply was a switch mode module from <a href="https://www.ledsales.com.au/index.php?main_page=product_info&amp;cPath=197_199&amp;products_id=652&amp;zenid=2jj8c25680l798b77uhaeo2920">LEDSales</a> (I have since moved on and all my more recent projects use the <a href="https://www.tayloredge.com/storefront/SmartNixie/DataSheets/Datasheet_1363-1364.pdf">Taylor Edge 1364</a>). The tubes themselves were Burroughs <a href="http://www.oddmix.com/tubes/b5750.html">B5750s</a>, which I got on pre-made break out cards with edge connectors, two tubes to a card.</p>
1121
1122
1123
1124<p class="wp-block-paragraph">The clock module also used an AT89C4051. The very simple timekeeping circuit took an AC input through a voltage divider and zener clamp and counted pulses. This is actually a surprisingly stable way of keeping time, as at least in the US, electric utilities will actually slow down or speed up frequency slightly overnight to make up for irregularities during the day. This means that while line frequency clocks are worse than cheap quartz clocks hour to hour, they are actually generally more accurate month-to-month.</p>
1125
1126
1127<p><br>
1128<!--StartFragment--></p>
1129
1130
1131<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="841" src="http://eequalspi.com/w
1131p-content/uploads/2020/01/EHiFqD7-1024x841.png" alt="" class="wp-image-224" srcset="https://eequalspi.com/wp-content/uploads/2020/01/EHiFqD7-1024x841.png 1024w, https://eequalspi.com/wp-content/uploads/2020/01/EHiFqD7-300x246.png 300w, https://eequalspi.com/wp-content/uploads/2020/01/EHiFqD7-768x631.png 768w, https://eequalspi.com/wp-content/uploads/2020/01/EHiFqD7-1200x986.png 1200w, https://eequalspi.com/wp-content/uploads/2020/01/EHiFqD7.png 1248w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /><figcaption>Clock PCB Schematic</figcaption></figure>
1132
1133
1134
1135<p class="wp-block-paragraph">For the display board, I didn&#8217;t have a saved copy of the routed PCB, and as it was one of the first boards I ever laid out, it wouldn&#8217;t have been good anyway, so I just re-downloaded PCB123 (again, I was a &#8216;young player&#8217; as Dave Jones would say) and ran the autorouter to give you the just of the board. Each 40-pin header drove a dual Nixie card (god, the inefficiency!)</p>
1136
1137
1138
1139<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="624" src="http://eequalspi.com/wp-content/uploads/2020/01/s9Uf6kO-1024x624.png" alt="" class="wp-image-225" srcset="https://eequalspi.com/wp-content/uploads/2020/01/s9Uf6kO-1024x624.png 1024w, https://eequalspi.com/wp-content/uploads/2020/01/s9Uf6kO-300x183.png 300w, https://eequalspi.com/wp-content/uploads/2020/01/s9Uf6kO-768x468.png 768w, https://eequalspi.com/wp-content/uploads/2020/01/s9Uf6kO.png 1118w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /><figcaption>Nixie display board, takes serial input via DB-9 and displays the data on six nixies and 8 NE2 neons. </figcaption></figure>
1140
1141
1142
1143<p class="wp-block-paragraph">I was never really happy with the clock design, from a user perspective, so it got put away pretty quickly. The display module, on the other hand was really satisfying. It ended up at my first full time job. Because I worked at the local power company, and had access to real-time <a href="https://en.wikipedia.org/wiki/SCADA">SCADA</a> data for the grid, it was used to display the power consumption of the city we were in (in MW).</p>
1144
1145
1146
1147<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="800" height="600" src="http://eequalspi.com/wp-content/uploads/2020/01/IMG_0403.jpg" alt="" class="wp-image-217" srcset="https://eequalspi.com/wp-content/uploads/2020/01/IMG_0403.jpg 800w, https://eequalspi.com/wp-content/uploads/2020/01/IMG_0403-300x225.jpg 300w, https://eequalspi.com/wp-content/uploads/2020/01/IMG_0403-768x576.jpg 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px" /><figcaption>My first ever Nixie display, showing 1294.87 MW of power consumption.</figcaption></figure>
1148
1149
1150
1151<p class="wp-block-paragraph">The code ran in Python and used a command line utility to extract the various datapoints, which it then drove to the display, updating every five seconds or so. The final version would rotate between showing power consumption for two cities that we served, and the temperature (˚F) in each of those places.</p>
1152
1153
1154
1155<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="800" height="556" src="http://eequalspi.com/wp-content/uploads/2020/01/IMG_0401.jpg" alt="" class="wp-image-222" srcset="https://eequalspi.com/wp-content/uploads/2020/01/IMG_0401.jpg 800w, https://eequalspi.com/wp-content/uploads/2020/01/IMG_0401-300x209.jpg 300w, https://eequalspi.com/wp-content/uploads/2020/01/IMG_0401-768x534.jpg 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px" /><figcaption>Temperature in degrees Farenheit.</figcaption></figure>
1156
1157
1158
1159<p class="wp-block-paragraph">It definitely got a few looks over the years that I had it running, and I still have the display in a box somewhere, but I&#8217;ve moved on career wise, so I don&#8217;t have the cool data to display in real time anymore.</p>
1160
1161
1162
1163<p class="wp-block-paragraph">Oh well, not much of a story, but I thought I might as well document it and share.</p>
1164	</div><!-- .entry-content -->
1165
1166	<footer class="entry-footer">
1167		<span class="byline"><span class="author vcard"><img alt='' src='https://secure.gravatar.com/avatar/e9a139e10fb91ac23ce9e30dc5c5f06e0ebeed3ce543b00735e0a3ad11f638f8?s=49&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e9a139e10fb91ac23ce9e30dc5c5f06e0ebeed3ce543b00735e0a3ad11f638f8?s=98&#038;d=mm&#038;r=g 2x' class='avatar avatar-49 photo' height='49' width='49' loading='lazy' decoding='async'/><span class="screen-reader-text">Author </span> <a class="url fn n" href="https://eequalspi.com/index.php/author/thejbw/">thejbw</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://eequalspi.com/index.php/2020/01/01/displaying-mw-with-nixies/" rel="bookmark"><time class="entry-date published" datetime="2020-01-01T20:17:51-08:00">January 1, 2020</time><time class="updated" datetime="2020-01-01T20:18:44-08:00">January 1, 2020</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://eequalspi.com/index.php/category/uncategorized/" rel="category tag">Uncategorized</a></span>			</footer><!-- .entry-footer -->
1168</article><!-- #post-171 -->
1169
1170<article id="post-203" class="post-203 post type-post status-publish format-standard hentry category-holiday category-low-power">
1171	<header class="entry-header">
1172		
1173		<h2 class="entry-title"><a href="https://eequalspi.com/index.php/2019/12/30/christmas-ornaments-2019/" rel="bookmark">
1173Christmas Ornaments 2019</a></h2>	</header><!-- .entry-header -->
1174
1175	
1176	
1177	<div class="entry-content">
1178		
1179<figure class="wp-block-video"><video controls src="http://eequalspi.com/wp-content/uploads/2019/12/7eOpldF.mp4"></video><figcaption>The Las Vegas Christmas Ornament</figcaption></figure>
1180
1181
1182
1183<h2 class="wp-block-heading">Background</h2>
1184
1185
1186
1187<p class="wp-block-paragraph">Every year I like to do some sort of artistic project as a gift. Historically they have been unique one-offs that I have yet to post here. This year however, I decided to do something a little more traditional &#8212; a Christmas ornament. I figured I could &#8216;mass produce&#8217; them, and give one to everyone relevant, including sending them along with my annual holiday cards.</p>
1188
1189
1190
1191<p class="wp-block-paragraph">Given that I hail from Vegas, I decided that the way to go was to do a Christmas version of the famous <a href="https://en.wikipedia.org/wiki/Welcome_to_Fabulous_Las_Vegas_sign">&#8216;Welcome to Fabulous Las Vegas Nevada&#8217;</a> sign.</p>
1192
1193
1194
1195<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="946" height="720" src="http://eequalspi.com/wp-content/uploads/2019/12/946px-Welcome_to_Fabulous_Las_Vegas.jpg" alt="" class="wp-image-205" srcset="https://eequalspi.com/wp-content/uploads/2019/12/946px-Welcome_to_Fabulous_Las_Vegas.jpg 946w, https://eequalspi.com/wp-content/uploads/2019/12/946px-Welcome_to_Fabulous_Las_Vegas-300x228.jpg 300w, https://eequalspi.com/wp-content/uploads/2019/12/946px-Welcome_to_Fabulous_Las_Vegas-768x585.jpg 768w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /><figcaption>Image Credit: <a href="https://en.wikipedia.org/wiki/Welcome_to_Fabulous_Las_Vegas_sign#/media/File:Welcome_to_Fabulous_Las_Vegas.jpg">Wikipedia</a></figcaption></figure></div>
1196
1197
1198
1199<h2 class="wp-block-heading">Circuit Design</h2>
1200
1201
1202
1203<p class="wp-block-paragraph">The first challenge was coming up with a circuit. My primary requirement was that it should be able to last a whole season on a single coin cell (CR2032). Obviously, even with high efficiency LEDs, that would be nigh impossible, and giving up and going to 2AAs would have made the board too heavy to realistically hang on a tree.</p>
1204
1205
1206
1207<p class="wp-block-paragraph">I therefore decided that it would start to blink when triggered by a human somehow and would then shut off after a few seconds. I briefly considered using a <a href="https://learn.adafruit.com/pir-passive-infrared-proximity-motion-sensor/overview">passive infrared (PIR) motion sensor</a>, which would have been affordable from the usual Chinese suspects on ebay, and would have met my power requirements (they can be incredibly low power in standby) but they also are rather bulky compared to size and weight requirements of an  ornament. </p>
1208
1209
1210
1211<p class="wp-block-paragraph">The second (and obvious fallback option) would be a simple <a href="https://www.google.com/search?q=tactile+switch&amp;client=firefox-b-1-d&amp;sxsrf=ACYBGNQnINCEOLCeF1kIBAzsZJIX618pjg:1577321061364&amp;source=lnms&amp;tbm=isch&amp;sa=X&amp;ved=2ahUKEwigtLzsitLmAhVSMH0KHUIyDTAQ_AUoAnoECBAQBA&amp;biw=1680&amp;bih=953&amp;dpr=2">tactile switch</a>. This has several advantages:</p>
1212
1213
1214
1215<ul class="wp-block-list"><li>Cheap</li><li>Easy to implement</li><li>Low parts count</li></ul>
1216
1217
1218
1219<p class="wp-block-paragraph">Unfortunately, it has one fundamental flaw: To activate it requires a non-trivial amount of force. Not exactly a problem for most devices, but for an ornament dangling from a tree, it wouldn&#8217;t do, to require the user to grab and hold it (possibly with two hands) to make it do something. This left one more option: Touch switch.</p>
1220
1221
1222
1223<p class="wp-block-paragraph">The design is extremely simple &#8212; since I can afford to expose bare copper (well, tinned), I can float the base of a transistor to act as a switch when a touch to the exposed metal pulls the input to VCC </p>
1224
1225
1226
1227<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="617" src="http://eequalspi.com/w
1227p-content/uploads/2019/12/Screen-Shot-2019-12-30-at-5.37.25-PM-1024x617.png" alt="" class="wp-image-207" srcset="https://eequalspi.com/wp-content/uploads/2019/12/Screen-Shot-2019-12-30-at-5.37.25-PM-1024x617.png 1024w, https://eequalspi.com/wp-content/uploads/2019/12/Screen-Shot-2019-12-30-at-5.37.25-PM-300x181.png 300w, https://eequalspi.com/wp-content/uploads/2019/12/Screen-Shot-2019-12-30-at-5.37.25-PM-768x463.png 768w, https://eequalspi.com/wp-content/uploads/2019/12/Screen-Shot-2019-12-30-at-5.37.25-PM-1536x926.png 1536w, https://eequalspi.com/wp-content/uploads/2019/12/Screen-Shot-2019-12-30-at-5.37.25-PM-1200x723.png 1200w, https://eequalspi.com/wp-content/uploads/2019/12/Screen-Shot-2019-12-30-at-5.37.25-PM.png 1550w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /><figcaption>Darlington touch switch. Touch output is taken from the low side of the 3.3MΩ pull up.</figcaption></figure></div>
1228
1229
1230
1231<p class="wp-block-paragraph">For the metal plates, I designed a pair on interdigitated polygons, as below, with one side pulled to VCC and the other connected to the base of the transistor.</p>
1232
1233
1234
1235<div class="wp-block-image"><figure class="aligncenter"><img decoding="async" src="https://i.imgur.com/w7kiH1P.png" alt="https://i.imgur.com/w7kiH1P.png"/><figcaption>Touch area physical layout.</figcaption></figure></div>
1236
1237
1238
1239<p class="wp-block-paragraph">Note that this design would not work with even the thinnest of gloves, is prone to corrosion, and might not even work for someone with extremely dry skin. BUT, it is cheap, simple, and extremely low power – wasting less than 1 µA quiescent current.</p>
1240
1241
1242
1243<p class="wp-block-paragraph">For the main circuit, I started out with an all analog design. The touch switch would have triggered a mono-stable oscillator, which turned on a bi-stable block, which in turn would drive the LEDs through a buffer transistor. There were several problems with this approach however.</p>
1244
1245
1246
1247<ul class="wp-block-list"><li>A jellybean 556 cannot run down to 2V (the dropout voltage for my single lithium cell) reliably.</li><li>More sophisticated timer ICs are similarly priced (or more expensive) than a microcontroller.</li><li>The standby current would at least as high as what I could achieve with a microcontroller in deep sleep.</li></ul>
1248
1249
1250
1251<p class="wp-block-paragraph">Since I already had the tool chain set up to develop with the ATTINY85 microcontroller, I chose it – if I had more time to develop, I would likely have spun up the ATTINY10 (and indeed, I grabbed a handful of them) since they&#8217;re so low cost.</p>
1252
1253
1254
1255<p class="wp-block-paragraph"> I chose run the ATTINY on its internal 1MHz oscillator, for absolute minimum power consumption. I also chose a <a href="https://www.digikey.com/product-detail/en/microchip-technology/ATTINY85V-10SH/ATTINY85V-10SH-ND/2238296">variant</a> which could run down to 1.8V, which would let me run my single CR2032 pretty much dry.</p>
1256
1257
1258
1259<p class="wp-block-paragraph">The final design, shown below was criminally simple. I tested it on a breadboard while I developed code and was able to drop it onto the PCB with (essentially) no changes.</p>
1260
1261
1262
1263<div class="wp-block-image"><figure class="aligncenter"><img decoding="async" src="https://i.imgur.com/MVX2LAk.png" alt="https://i.imgur.com/MVX2LAk.png"/><figcaption>The resulting design. Twelve red LEDs, ten green LEDs, a micro and a pair of NPNs. The battery holder makes an appearance at top left.</figcaption></figure></div>
1264
1265
1266
1267<p class="wp-block-paragraph">I decided I was going for so low parts count that I even chose to omit the decoupling cap on the micro – I figured since it was the only active component, I could get away with saving the penny.</p>
1268
1269
1270
1271<p class="wp-block-paragraph">The biggest omission, however, was using only a single current limiting resistor for each color of LEDs. This is obviously bad practice and you should never, ever do this (TM), but given that my power supply is a high ESR lithium battery and the LEDs were grouped from a single batch on each board, I decided to take the risk. The reason for this is simple, it saved me 22 resistors and realistically, needing to find a way to handle a double sided load in the hobby reflow oven (or more realistically, soldering down by hand 4x as many components as I already was planning to, per board).</p>
1272
1273
1274
1275<h2 class="wp-block-heading">Code</h2>
1276
1277
1278
1279<p class="wp-block-paragraph">Writing code for the ATTINY85 is almost criminally easy given that it is supported by the Arduino environment. Programming can be done with my trusty <a href="https://www.sparkfun.com/products/11801">Sparkfun TinyAVR programmer</a>, which I used with an <a href="https://www.ebay.com/itm/SOIC8-SOP8-Flash-Chip-IC-Test-Clips-Socket-Adpter-BIOS-24-25-93-Programmer-MS/383036575885">SOIC adapter clip</a> to program the SOIC parts I used in-circuit.</p>
1280
1281
1282
1283<p class="wp-block-paragraph">The underlying code is, unsurprisingly simple, but I am pleased with the design. After boot, the system goes to deep sleep (SLEEP_MODE_PWR_DOWN) until awoken by an external GPIO interrupt. When triggered, turns on one phase of the LEDs (e.g. red), goes back to sleep, after setting the watchdog timer, which awakens it a half-ish second later. On wake, it toggles to the alternate LED phase (to green or back to red), and repeats until the requisite number of cycles has been completed. Then it goes back to deep sleep.</p>
1284
1285
1286
1287<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="347" src="http://eequalspi.com/w
1287p-content/uploads/2019/12/Code-Block-Diagram-1024x347.png" alt="" class="wp-image-210" srcset="https://eequalspi.com/wp-content/uploads/2019/12/Code-Block-Diagram-1024x347.png 1024w, https://eequalspi.com/wp-content/uploads/2019/12/Code-Block-Diagram-300x102.png 300w, https://eequalspi.com/wp-content/uploads/2019/12/Code-Block-Diagram-768x261.png 768w, https://eequalspi.com/wp-content/uploads/2019/12/Code-Block-Diagram-1536x521.png 1536w, https://eequalspi.com/wp-content/uploads/2019/12/Code-Block-Diagram-1200x407.png 1200w, https://eequalspi.com/wp-content/uploads/2019/12/Code-Block-Diagram.png 1804w" sizes="auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /><figcaption>Block diagram of LED Flasher code</figcaption></figure>
1288
1289
1290
1291<p class="wp-block-paragraph">The code can be found on GitHub <a href="https://github.com/wespo/ATTINY85_Ornament">here</a>.</p>
1292
1293
1294
1295<h2 class="wp-block-heading">Layout</h2>
1296
1297
1298
1299<p class="wp-block-paragraph">The layout is fairly straightforward. I laid out the board outline and silkscreen in inkscape, and then following various tutorials imported the outline and silkscreen into Eagle. Sizing the two correctly was a guess-and check experience. I didn&#8217;t take comprehensive notes on my import process, so unless someone asks for it, or I do it again next year, I&#8217;ll leave the details out of this post.</p>
1300
1301
1302
1303<p class="wp-block-paragraph">I am somewhat proud of removing all but a handful of visible vias and one trace on top of the board by hiding most of the vias underneath the LEDs.</p>
1304
1305
1306
1307<div class="wp-block-image"><figure class="aligncenter is-resized"><img loading="lazy" decoding="async" src="https://i.imgur.com/AbbmUH5.png" alt="https://i.imgur.com/AbbmUH5.png" width="600" height="537"/><figcaption>Final layout</figcaption></figure></div>
1308
1309
1310
1311<h2 class="wp-block-heading">Conclusion</h2>
1312
1313
1314
1315<p class="wp-block-paragraph">I did take some measurements, and the device draws about 5mA while blinking and about 2µA when off (Not that much worse than the self discharge rate of the CR2032), so I&#8217;d call the design a roaring success. It certainly was a hit at the holidays! </p>
1316
1317
1318
1319<p class="wp-block-paragraph">This was a fun, quick and dirty Christmas ornament project and I will be revisiting it in the future. Expect a 2020 Christmas project post.</p>
1320	</div><!-- .entry-content -->
1321
1322	<footer class="entry-footer">
1323		<span class="byline"><span class="author vcard"><img alt='' src='https://secure.gravatar.com/avatar/e9a139e10fb91ac23ce9e30dc5c5f06e0ebeed3ce543b00735e0a3ad11f638f8?s=49&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/e9a139e10fb91ac23ce9e30dc5c5f06e0ebeed3ce543b00735e0a3ad11f638f8?s=98&#038;d=mm&#038;r=g 2x' class='avatar avatar-49 photo' height='49' width='49' loading='lazy' decoding='async'/><span class="screen-reader-text">Author </span> <a class="url fn n" href="https://eequalspi.com/index.php/author/thejbw/">thejbw</a></span></span><span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://eequalspi.com/index.php/2019/12/30/christmas-ornaments-2019/" rel="bookmark"><time class="entry-date published" datetime="2019-12-30T20:37:15-08:00">December 30, 2019</time><time class="updated" datetime="2020-01-01T15:06:27-08:00">January 1, 2020</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://eequalspi.com/index.php/category/holiday/" rel="category tag">Holiday</a>, <a href="https://eequalspi.com/index.php/category/low-power/" rel="category tag">Low Power</a></span>			</footer><!-- .entry-footer -->
1324</article><!-- #post-203 -->
1325
1326	<nav class="navigation pagination" aria-label="Posts pagination">
1327		<h2 class="screen-reader-text">Posts pagination</h2>
1328		<div class="nav-links"><span aria-current="page" class="page-numbers current"><span class="meta-nav screen-reader-text">Page </span>1</span>
1329<a class="page-numbers" href="https://eequalspi.com/index.php/page/2/"><span class="meta-nav screen-reader-text">Page </span>2</a>
1330<a class="page-numbers" href="https://eequalspi.com/index.php/page/3/"><span class="meta-nav screen-reader-text">Page </span>3</a>
1331<a class="next page-numbers" href="https://eequalspi.com/index.php/page/2/">Next page</a></div>
1332	</nav>
1333		</main><!-- .site-main -->
1334	</div><!-- .content-area -->
1335
1336
1337	<aside id="secondary" class="sidebar widget-area" role="complementary">
1338		<section id="search-2" class="widget widget_search">
1339<form role="search" method="get" class="search-form" action="https://eequalspi.com/">
1340	<label>
1341		<span class="screen-reader-text">Search for:</span>
1342		<input type="search" class="search-field" placeholder="Search &hellip;" value="" name="s" />
1343	</label>
1344	<button type="submit" class="search-submit"><span class="screen-reader-text">Search</span></button>
1345</form>
1346</section>
1347		<section id="recent-posts-2" class="widget widget_recent_entries">
1348		<h2 class="widget-title">Recent Posts</h2>
1349		<ul>
1350											<li>
1351					<a href="https://eequalspi.com/index.php/2022/07/14/pyle-pp444/">Pyle PP444</a>
1352									</li>
1353											<li>
1354					<a href="https://eequalspi.com/index.php/2021/03/13/pivideomusic/">PiVideoMusic</a>
1355									</li>
1356											<li>
1357					<a href="https://eequalspi.com/index.php/2020/07/26/classic-led-displays/">Classic LED Displays</a>
1358									</li>
1359											<li>
1360					<a href="https://eequalspi.com/index.php/2020/05/30/making-a-raspberry-pi-boombox-aka-uniac-software-in-detail/">Making a Raspberry Pi Boombox (AKA UNIAC Software In Detail)</a>
1361									</li>
1362											<li>
1363					<a href="https://eequalspi.com/index.php/2020/05/16/uniac-hardware-in-detail/">UNIAC Hardware In Detail</a>
1364									</li>
1365					</ul>
1366
1367		</section><section id="recent-comments-2" class="widget widget_recent_comments"><h2 class="widget-title">Recent Comments</h2><ul id="recentcomments"><li class="recentcomments"><span class="comment-author-link">EEQUALSPI</span> on <a href="https://eequalspi.com/index.php/2020/05/16/uniac-hardware-in-detail/#comment-20">UNIAC Hardware In Detail</a></li><li class="recentcomments"><span class="comment-author-link"><a href="https://gramhum.com/v/gabixmay" class="url" rel="ugc external nofollow">g a b r i e l l a</a></span> on <a href="https://eequalspi.com/index.php/2020/05/16/uniac-hardware-in-detail/#comment-19">UNIAC Hardware In Detail</a></li><li class="recentcomments"><span class="comment-author-link">Tariq Khan</span> on <a href="https://eequalspi.com/index.php/2020/04/04/uniac-the-ultimate-nixie-internet-alarm-clock/#comment-15">UNIAC: The Ultimate Nixie Internet Alarm Clock.</a></li><li class="recentcomments"><span class="comment-author-link">Luca</span> on <a href="https://eequalspi.com/index.php/2020/04/04/uniac-the-ultimate-nixie-internet-alarm-clock/#comment-14">UNIAC: The Ultimate Nixie Internet Alarm Clock.</a></li><li class="recentcomments"><span class="comment-author-link">diego</span> on <a href="https://eequalspi.com/index.php/2020/04/04/uniac-the-ultimate-nixie-internet-alarm-clock/#comment-13">UNIAC: The Ultimate Nixie Internet Alarm Clock.</a></li></ul></section><section id="archives-2" class="widget widget_archive"><h2 class="widget-title">Archives</h2>
1368			<ul>
1369					<li><a href='https://eequalspi.com/index.php/2022/07/'>July 2022</a></li>
1370	<li><a href='https://eequalspi.com/index.php/2021/03/'>March 2021</a></li>
1371	<li><a href='https://eequalspi.com/index.php/2020/07/'>July 2020</a></li>
1372	<li><a href='https://eequalspi.com/index.php/2020/05/'>May 2020</a></li>
1373	<li><a href='https://eequalspi.com/index.php/2020/04/'>April 2020</a></li>
1374	<li><a href='https://eequalspi.com/index.php/2020/01/'>January 2020</a></li>
1375	<li><a href='https://eequalspi.com/index.php/2019/12/'>December 2019</a></li>
1376	<li><a href='https://eequalspi.com/index.php/2019/08/'>August 2019</a></li>
1377	<li><a href='https://eequalspi.com/index.php/2019/07/'>July 2019</a></li>
1378	<li><a href='https://eequalspi.com/index.php/2019/04/'>April 2019</a></li>
1379	<li><a href='https://eequalspi.com/index.php/2017/08/'>August 2017</a></li>
1380	<li><a href='https://eequalspi.com/index.php/2017/02/'>February 2017</a></li>
1381			</ul>
1382
1383			</section><section id="categories-2" class="widget widget_categories"><h2 class="widget-title">Categories</h2>
1384			<ul>
1385					<li class="cat-item cat-item-7"><a href="https://eequalspi.com/index.php/category/biomedical/">Biomedical</a>
1386</li>
1387	<li class="cat-item cat-item-6"><a href="https://eequalspi.com/index.php/category/clocks/">Clocks</a>
1388</li>
1389	<li class="cat-item cat-item-30"><a href="https://eequalspi.com/index.php/category/code/">Code</a>
1390</li>
1391	<li class="cat-item cat-item-2"><a href="https://eequalspi.com/index.php/category/general/">General</a>
1392</li>
1393	<li class="cat-item cat-item-23"><a href="https://eequalspi.com/index.php/category/holiday/">Holiday</a>
1394</li>
1395	<li class="cat-item cat-item-4"><a href="https://eequalspi.com/index.php/category/in-13-vumeter/">IN-13 VuMeter</a>
1396</li>
1397	<li class="cat-item cat-item-24"><a href="https://eequalspi.com/index.php/category/low-power/">Low Power</a>
1398</li>
1399	<li class="cat-item cat-item-3"><a href="https://eequalspi.com/index.php/category/nixie/">Nixie</a>
1400</li>
1401	<li class="cat-item cat-item-33"><a href="https://eequalspi.com/index.php/category/python/">Python</a>
1402</li>
1403	<li class="cat-item cat-item-5"><a href="https://eequalspi.com/index.php/category/tools/">Tools</a>
1404</li>
1405	<li class="cat-item cat-item-1"><a href="https://eequalspi.com/index.php/category/uncategorized/">Uncategorized</a>
1406</li>
1407	<li class="cat-item cat-item-32"><a href="https://eequalspi.com/index.php/category/uniac/">UNIAC</a>
1408</li>
1409	<li class="cat-item cat-item-9"><a href="https://eequalspi.com/index.php/category/vfd/">VFD</a>
1410</li>
1411			</ul>
1412
1413			</section><section id="meta-2" class="widget widget_meta"><h2 class="widget-title">Meta</h2>
1414		<ul>
1415						<li>
1415<a href="https://eequalspi.com/wp-login.php">Log in</a></li>
1416			<li><a href="https://eequalspi.com/index.php/feed/">Entries feed</a></li>
1417			<li><a href="https://eequalspi.com/index.php/comments/feed/">Comments feed</a></li>
1418
1419			<li><a href="https://wordpress.org/">WordPress.org</a></li>
1420		</ul>
1421
1422		</section>	</aside><!-- .sidebar .widget-area -->
1423
1424		</div><!-- .site-content -->
1425
1426		<footer id="colophon" class="site-footer" role="contentinfo">
1427			
1428			
1429			<div class="site-info">
1430								<span class="site-title"><a href="https://eequalspi.com/" rel="home">e ≈ π</a></span>
1431								<a href="https://wordpress.org/" class="imprint">
1432					Proudly powered by WordPress				</a>
1433			</div><!-- .site-info -->
1434		</footer><!-- .site-footer -->
1435	</div><!-- .site-inner -->
1436</div><!-- .site -->
1437
1438<script type="speculationrules">
1439{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/twentysixteen/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
1440</script>
vendor: 1 bytes, line 1440
1440
1441<script id="twentysixteen-skip-link-focus-fix-js" src="https://eequalspi.com/wp-content/themes/twentysixteen/js/skip-link-focus-fix.js?ver=20170530"></script>
vendor: 1 bytes, line 1441
1441
1442<script id="twentysixteen-script-js-extra">
1443var screenReaderText = {"expand":"expand child menu","collapse":"collapse child menu"};
1444//# sourceURL=twentysixteen-script-js-extra
1445</script>
vendor: 1 bytes, line 1445
1445
1446<script id="twentysixteen-script-js" src="https://eequalspi.com/wp-content/themes/twentysixteen/js/functions.js?ver=20181217"></script>
vendor: 1 bytes, line 1446
1446
1447<script id="enlighterjs-js" src="https://eequalspi.com/wp-content/plugins/enlighter/cache/enlighterjs.min.js?ver=qEzdOqn73jM2BYW"></script>
vendor: 1 bytes, line 1447
1447
1448<script id="enlighterjs-js-after">
1449!function(e,n){if("undefined"!=typeof EnlighterJS){var o={"selectors":{"block":"pre.EnlighterJSRAW","inline":"code.EnlighterJSRAW"},"options":{"indent":4,"ampersandCleanup":true,"linehover":true,"rawcodeDbclick":false,"textOverflow":"break","linenumbers":true,"theme":"enlighter","language":"enlighter","retainCssClasses":false,"collapse":false,"toolbarOuter":"","toolbarTop":"{BTN_RAW}{BTN_COPY}{BTN_WINDOW}{BTN_WEBSITE}","toolbarBottom":""}};(e.EnlighterJSINIT=function(){EnlighterJS.init(o.selectors.block,o.selectors.inline,o.options)})()}else{(n&&(n.error||n.log)||function(){})("Error: EnlighterJS resources not loaded yet!")}}(window,console);
1450//# sourceURL=enlighterjs-js-after
1451</script>
vendor: 1 bytes, line 1451
1451
1452<script id="mediaelement-core-js-before">
1453var mejsL10n = {"language":"en","strings":{"mejs.download-file":"Download File","mejs.install-flash":"You are using a browser that does not have Flash player enabled or installed. Please turn on your Flash player plugin or download the latest version from https://get.adobe.com/flashplayer/","mejs.fullscreen":"Fullscreen","mejs.play":"Play","mejs.pause":"Pause","mejs.time-slider":"Time Slider","mejs.time-help-text":"Use Left/Right Arrow keys to advance one second, Up/Down arrows to advance ten seconds.","mejs.live-broadcast":"Live Broadcast","mejs.volume-help-text":"Use Up/Down Arrow keys to increase or decrease volume.","mejs.unmute":"Unmute","mejs.mute":"Mute","mejs.volume-slider":"Volume Slider","mejs.video-player":"Video Player","mejs.audio-player":"Audio Player","mejs.captions-subtitles":"Captions/Subtitles","mejs.captions-chapters":"Chapters","mejs.none":"None","mejs.afrikaans":"Afrikaans","mejs.albanian":"Albanian","mejs.arabic":"Arabic","mejs.belarusian":"Belarusian","mejs.bulgarian":"Bulgarian","mejs.catalan":"Catalan","mejs.chinese":"Chinese","mejs.chinese-simplified":"Chinese (Simplified)","mejs.chinese-traditional":"Chinese (Traditional)","mejs.croatian":"Croatian","mejs.czech":"Czech","mejs.danish":"Danish","mejs.dutch":"Dutch","mejs.english":"English","mejs.estonian":"Estonian","mejs.filipino":"Filipino","mejs.finnish":"Finnish","mejs.french":"French","mejs.galician":"Galician","mejs.german":"German","mejs.greek":"Greek","mejs.haitian-creole":"Haitian Creole","mejs.hebrew":"Hebrew","mejs.hindi":"Hindi","mejs.hungarian":"Hungarian","mejs.icelandic":"Icelandic","mejs.indonesian":"Indonesian","mejs.irish":"Irish","mejs.italian":"Italian","mejs.japanese":"Japanese","mejs.korean":"Korean","mejs.latvian":"Latvian","mejs.lithuanian":"Lithuanian","mejs.macedonian":"Macedonian","mejs.malay":"Malay","mejs.maltese":"Maltese","mejs.norwegian":"Norwegian","mejs.persian":"Persian","mejs.polish":"Polish","mejs.portuguese":"Portuguese","mejs.romanian":"Romanian","mejs.russian":"Russian","mejs.serbian":"Serbian","mejs.slovak":"Slovak","mejs.slovenian":"Slovenian","mejs.spanish":"Spanish","mejs.swahili":"Swahili","mejs.swedish":"Swedish","mejs.tagalog":"Tagalog","mejs.thai":"Thai","mejs.turkish":"Turkish","mejs.ukrainian":"Ukrainian","mejs.vietnamese":"Vietnamese","mejs.welsh":"Welsh","mejs.yiddish":"Yiddish"}};
1454//# sourceURL=mediaelement-core-js-before
1455</script>
vendor: 1 bytes, line 1455
1455
1456<script id="mediaelement-core-js" src="https://eequalspi.com/wp-includes/js/mediaelement/mediaelement-and-player.min.js?ver=4.2.17"></script>
vendor: 1 bytes, line 1456
1456
1457<script id="mediaelement-migrate-js" src="https://eequalspi.com/wp-includes/js/mediaelement/mediaelement-migrate.min.js?ver=7.0.7"></script>
vendor: 1 bytes, line 1457
1457
1458<script id="mediaelement-js-extra">
1459var _wpmejsSettings = {"pluginPath":"/wp-includes/js/mediaelement/","classPrefix":"mejs-","stretching":"responsive","audioShortcodeLibrary":"mediaelement","videoShortcodeLibrary":"mediaelement"};
1460//# sourceURL=mediaelement-js-extra
1461</script>
vendor: 1 bytes, line 1461
1461
1462<script id="wp-mediaelement-js" src="https://eequalspi.com/wp-includes/js/mediaelement/wp-mediaelement.min.js?ver=7.0.7"></script>
vendor: 1 bytes, line 1462
1462
1463<script id="mediaelement-vimeo-js" src="https://eequalspi.com/wp-includes/js/mediaelement/renderers/vimeo.min.js?ver=4.2.17"></script>
vendor: 1 bytes, line 1463
1463
1464<script id="wp-emoji-settings" type="application/json">
1465{"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://eequalspi.com/wp-includes/js/wp-emoji-release.min.js?ver=7.0.7"}}
1466</script>
vendor: 1 bytes, line 1466
1466
1467<script type="module">
1468/*! This file is auto-generated */
1469var e="script#wp-emoji-settings",t=document.querySelector(e);if(!(t instanceof HTMLScriptElement))throw new Error("Element missing: "+e);const r=JSON.parse(t.text),s=(window._wpemojiSettings=r,"wpEmojiSettingsSupports"),o=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(s,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const r=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===r[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,r){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!r(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,r){let a;const s=(a="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),o=(s.textBaseline="top",s.font="600 32px Arial",{});return e.forEach(e=>{o[e]=t(s,e,n,r)}),o}function a(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}r.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(s));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(o),u.toString(),c.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"});const a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=e=>{i(n=e.data),a.terminate(),t(n)})}catch(e){}i(n=f(o,u,c,p))}t(n)}).then(e=>{for(const n in e)r.supports[n]=e[n],r.supports.everything=r.supports.everything&&r.supports[n],"flag"!==n&&(r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&r.supports[n]);var t;r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&!r.supports.flag,r.supports.everything||((t=r.source||{}).concatemoji?a(t.concatemoji):t.wpemoji&&t.twemoji&&(a(t.twemoji),a(t.wpemoji)))});
1470//# sourceURL=https://eequalspi.com/wp-includes/js/wp-emoji-loader.min.js
1471</script>
1471
1472</body>
1473</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.