{"id":47,"date":"2026-08-19T09:54:21","date_gmt":"2026-08-19T09:54:21","guid":{"rendered":"https:\/\/noisyvolt.com\/?p=47"},"modified":"2026-08-19T09:54:21","modified_gmt":"2026-08-19T09:54:21","slug":"pisces-hardware-list","status":"publish","type":"post","link":"https:\/\/noisyvolt.com\/?p=47","title":{"rendered":"Pisces Hardware List"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">for the controls and displays so not including the rPi and Audio card<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"730\" height=\"321\" src=\"https:\/\/noisyvolt.com\/wp-content\/uploads\/2026\/08\/image-1.png\" alt=\"\" class=\"wp-image-48\" srcset=\"https:\/\/noisyvolt.com\/wp-content\/uploads\/2026\/08\/image-1.png 730w, https:\/\/noisyvolt.com\/wp-content\/uploads\/2026\/08\/image-1-300x132.png 300w\" sizes=\"auto, (max-width: 730px) 100vw, 730px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">pin map:<\/p>\n\n\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>PiSynth GPIO Pin Map<\/title>\n  <style>\n    *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n\n    :root {\n      --bg:      #ffffff;\n      --bg2:     #f5f5f3;\n      --text:    #1a1a1a;\n      --text2:   #666664;\n      --border:  rgba(0,0,0,0.1);\n      --purple:  #eeedfe;\n      --purple-b:#afa9ec;\n      --purple-t:#26215c;\n      --teal:    #e1f5ee;\n      --teal-b:  #5dcaa5;\n      --teal-t:  #04342c;\n      --amber:   #faeeda;\n      --amber-b: #ef9f27;\n      --amber-t: #412402;\n      --blue:    #e6f1fb;\n      --blue-b:  #85b7eb;\n      --blue-t:  #042c53;\n      --gray:    #f1efe8;\n      --gray-b:  #b4b2a9;\n      --gray-t:  #2c2c2a;\n    }\n\n    @media (prefers-color-scheme: dark) {\n      :root {\n        --bg:      #1c1c1e;\n        --bg2:     #2c2c2e;\n        --text:    #f2f2f7;\n        --text2:   #8e8e93;\n        --border:  rgba(255,255,255,0.1);\n        --purple:  #26215c;\n        --purple-b:#afa9ec;\n        --purple-t:#eeedfe;\n        --teal:    #04342c;\n        --teal-b:  #5dcaa5;\n        --teal-t:  #e1f5ee;\n        --amber:   #412402;\n        --amber-b: #ef9f27;\n        --amber-t: #faeeda;\n        --blue:    #042c53;\n        --blue-b:  #85b7eb;\n        --blue-t:  #e6f1fb;\n        --gray:    #2c2c2a;\n        --gray-b:  #b4b2a9;\n        --gray-t:  #f1efe8;\n      }\n    }\n\n    body {\n      font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n      background: var(--bg);\n      color: var(--text);\n      padding: 2rem 1.5rem;\n      max-width: 900px;\n      margin: 0 auto;\n    }\n\n    h1 {\n      font-size: 20px;\n      font-weight: 500;\n      margin-bottom: 4px;\n    }\n\n    .subtitle {\n      font-size: 13px;\n      color: var(--text2);\n      margin-bottom: 1.5rem;\n    }\n\n    table {\n      width: 100%;\n      border-collapse: collapse;\n      font-size: 13px;\n    }\n\n    thead th {\n      text-align: left;\n      font-size: 11px;\n      font-weight: 500;\n      text-transform: uppercase;\n      letter-spacing: 0.06em;\n      color: var(--text2);\n      padding: 8px 12px;\n      border-bottom: 1px solid var(--border);\n    }\n\n    tbody td {\n      padding: 8px 12px;\n      border-bottom: 0.5px solid var(--border);\n      vertical-align: middle;\n    }\n\n    .section-row td {\n      padding: 6px 12px;\n      font-size: 11px;\n      font-weight: 500;\n      text-transform: uppercase;\n      letter-spacing: 0.06em;\n    }\n\n    .section-reserved td { background: var(--gray);   color: var(--gray-t);   border-left: 3px solid var(--gray-b); }\n    .section-selector td { background: var(--purple); color: var(--purple-t); border-left: 3px solid var(--purple-b); }\n    .section-params td   { background: var(--teal);   color: var(--teal-t);   border-left: 3px solid var(--teal-b); }\n    .section-misc td     { background: var(--amber);  color: var(--amber-t);  border-left: 3px solid var(--amber-b); }\n\n    .row-reserved { border-left: 3px solid var(--gray-b); }\n    .row-selector { border-left: 3px solid var(--purple-b); }\n    .row-params   { border-left: 3px solid var(--teal-b); }\n    .row-misc     { border-left: 3px solid var(--amber-b); }\n\n    code {\n      font-family: 'Courier New', monospace;\n      font-size: 12px;\n      background: var(--bg2);\n      padding: 1px 5px;\n      border-radius: 4px;\n    }\n\n    .pin-num {\n      font-family: 'Courier New', monospace;\n      font-size: 12px;\n      font-weight: 500;\n    }\n\n    .note {\n      color: var(--text2);\n      font-size: 12px;\n    }\n\n    .footer {\n      margin-top: 2rem;\n      padding: 1rem;\n      background: var(--bg2);\n      border-radius: 8px;\n      font-size: 12px;\n      color: var(--text2);\n      line-height: 1.6;\n    }\n\n    .footer strong { color: var(--text); }\n  <\/style>\n<\/head>\n<body>\n\n  <h1>PiSynth GPIO pin map<\/h1>\n  <p class=\"subtitle\">Raspberry Pi 3B \u00b7 40-pin header \u00b7 all hardware controls<\/p>\n\n  <table>\n    <thead>\n      <tr>\n        <th>GPIO<\/th>\n        <th>Pin #<\/th>\n        <th>Control<\/th>\n        <th>Role<\/th>\n        <th>Notes<\/th>\n      <\/tr>\n    <\/thead>\n    <tbody>\n\n      <!-- Reserved \/ buses -->\n      <tr class=\"section-row section-reserved\">\n        <td colspan=\"5\">Reserved \u2014 power \u00b7 I2C \u00b7 SPI<\/td>\n      <\/tr>\n      <tr class=\"row-reserved\">\n        <td class=\"pin-num\">\u2014<\/td>\n        <td class=\"pin-num\">1<\/td>\n        <td>3.3V power<\/td>\n        <td>VCC for encoders \/ OLEDs<\/td>\n        <td class=\"note\">shared rail<\/td>\n      <\/tr>\n      <tr class=\"row-reserved\">\n        <td class=\"pin-num\">\u2014<\/td>\n        <td class=\"pin-num\">2<\/td>\n        <td>5V power<\/td>\n        <td>VCC for TCA9548A<\/td>\n        <td class=\"note\">5V rail<\/td>\n      <\/tr>\n      <tr class=\"row-reserved\">\n        <td class=\"pin-num\">\u2014<\/td>\n        <td class=\"pin-num\">6, 9, 14, 20, 25, 30, 34, 39<\/td>\n        <td>GND<\/td>\n        <td>Ground for all components<\/td>\n        <td class=\"note\">multiple GND pins available<\/td>\n      <\/tr>\n      <tr class=\"row-reserved\">\n        <td class=\"pin-num\">2<\/td>\n        <td class=\"pin-num\">3<\/td>\n        <td>I2C SDA<\/td>\n        <td>OLEDs via TCA9548A multiplexer<\/td>\n        <td class=\"note\">shared I2C bus<\/td>\n      <\/tr>\n      <tr class=\"row-reserved\">\n        <td class=\"pin-num\">3<\/td>\n        <td class=\"pin-num\">5<\/td>\n        <td>I2C SCL<\/td>\n        <td>OLEDs via TCA9548A multiplexer<\/td>\n        <td class=\"note\">shared I2C bus<\/td>\n      <\/tr>\n      <tr class=\"row-reserved\">\n        <td class=\"pin-num\">10<\/td>\n        <td class=\"pin-num\">19<\/td>\n        <td>SPI MOSI<\/td>\n        <td>Colour TFT display data<\/td>\n        <td class=\"note\">ST7789 \/ ILI9341<\/td>\n      <\/tr>\n      <tr class=\"row-reserved\">\n        <td class=\"pin-num\">11<\/td>\n        <td class=\"pin-num\">23<\/td>\n        <td>SPI SCLK<\/td>\n        <td>Colour TFT display clock<\/td>\n        <td class=\"note\">ST7789 \/ ILI9341<\/td>\n      <\/tr>\n      <tr class=\"row-reserved\">\n        <td class=\"pin-num\">8<\/td>\n        <td class=\"pin-num\">24<\/td>\n        <td>SPI CE0<\/td>\n        <td>Colour TFT chip select<\/td>\n        <td class=\"note\">CS pin<\/td>\n      <\/tr>\n      <tr class=\"row-reserved\">\n        <td class=\"pin-num\">25<\/td>\n        <td class=\"pin-num\">22<\/td>\n        <td>TFT DC<\/td>\n        <td>Colour TFT data\/command select<\/td>\n        <td class=\"note\">data\/cmd pin<\/td>\n      <\/tr>\n      <tr class=\"row-reserved\">\n        <td class=\"pin-num\">24<\/td>\n        <td class=\"pin-num\">18<\/td>\n        <td>TFT RST<\/td>\n        <td>Colour TFT reset<\/td>\n        <td class=\"note\">reset pin<\/td>\n      <\/tr>\n\n      <!-- Selector encoder -->\n      <tr class=\"section-row section-selector\">\n        <td colspan=\"5\">Selector encoder \u2014 module navigation<\/td>\n      <\/tr>\n      <tr class=\"row-selector\">\n        <td class=\"pin-num\">17<\/td>\n        <td class=\"pin-num\">11<\/td>\n        <td>Selector encoder<\/td>\n        <td>CLK<\/td>\n        <td class=\"note\">pull-up, interrupt<\/td>\n      <\/tr>\n      <tr class=\"row-selector\">\n        <td class=\"pin-num\">18<\/td>\n        <td class=\"pin-num\">12<\/td>\n        <td>Selector encoder<\/td>\n        <td>DT<\/td>\n        <td class=\"note\">pull-up, interrupt<\/td>\n      <\/tr>\n      <tr class=\"row-selector\">\n        <td class=\"pin-num\">27<\/td>\n        <td class=\"pin-num\">13<\/td>\n        <td>Selector encoder<\/td>\n        <td>SW \u2014 push to change page<\/td>\n        <td class=\"note\">pull-up<\/td>\n      <\/tr>\n\n      <!-- Parameter encoders -->\n      <tr class=\"section-row section-params\">\n        <td colspan=\"5\">Parameter encoders 1\u20134<\/td>\n      <\/tr>\n      <tr class=\"row-params\">\n        <td class=\"pin-num\">5<\/td>\n        <td class=\"pin-num\">29<\/td>\n        <td>Encoder 1<\/td>\n        <td>CLK<\/td>\n        <td class=\"note\">pull-up, interrupt<\/td>\n      <\/tr>\n      <tr class=\"row-params\">\n        <td class=\"pin-num\">6<\/td>\n        <td class=\"pin-num\">31<\/td>\n        <td>Encoder 1<\/td>\n        <td>DT<\/td>\n        <td class=\"note\">pull-up, interrupt<\/td>\n      <\/tr>\n      <tr class=\"row-params\">\n        <td class=\"pin-num\">13<\/td>\n        <td class=\"pin-num\">33<\/td>\n        <td>Encoder 1<\/td>\n        <td>SW \u2014 push to reset to default<\/td>\n        <td class=\"note\">pull-up<\/td>\n      <\/tr>\n      <tr class=\"row-params\">\n        <td class=\"pin-num\">19<\/td>\n        <td class=\"pin-num\">35<\/td>\n        <td>Encoder 2<\/td>\n        <td>CLK<\/td>\n        <td class=\"note\">pull-up, interrupt<\/td>\n      <\/tr>\n      <tr class=\"row-params\">\n        <td class=\"pin-num\">26<\/td>\n        <td class=\"pin-num\">37<\/td>\n        <td>Encoder 2<\/td>\n        <td>DT<\/td>\n        <td class=\"note\">pull-up, interrupt<\/td>\n      <\/tr>\n      <tr class=\"row-params\">\n        <td class=\"pin-num\">21<\/td>\n        <td class=\"pin-num\">40<\/td>\n        <td>Encoder 2<\/td>\n        <td>SW \u2014 push to reset to default<\/td>\n        <td class=\"note\">pull-up<\/td>\n      <\/tr>\n      <tr class=\"row-params\">\n        <td class=\"pin-num\">20<\/td>\n        <td class=\"pin-num\">38<\/td>\n        <td>Encoder 3<\/td>\n        <td>CLK<\/td>\n        <td class=\"note\">pull-up, interrupt<\/td>\n      <\/tr>\n      <tr class=\"row-params\">\n        <td class=\"pin-num\">16<\/td>\n        <td class=\"pin-num\">36<\/td>\n        <td>Encoder 3<\/td>\n        <td>DT<\/td>\n        <td class=\"note\">pull-up, interrupt<\/td>\n      <\/tr>\n      <tr class=\"row-params\">\n        <td class=\"pin-num\">12<\/td>\n        <td class=\"pin-num\">32<\/td>\n        <td>Encoder 3<\/td>\n        <td>SW \u2014 push to reset to default<\/td>\n        <td class=\"note\">pull-up<\/td>\n      <\/tr>\n      <tr class=\"row-params\">\n        <td class=\"pin-num\">7<\/td>\n        <td class=\"pin-num\">26<\/td>\n        <td>Encoder 4<\/td>\n        <td>CLK<\/td>\n        <td class=\"note\">pull-up, interrupt<\/td>\n      <\/tr>\n      <tr class=\"row-params\">\n        <td class=\"pin-num\">1<\/td>\n        <td class=\"pin-num\">28<\/td>\n        <td>Encoder 4<\/td>\n        <td>DT<\/td>\n        <td class=\"note\">pull-up, interrupt \u2014 avoid if HAT EEPROM conflict<\/td>\n      <\/tr>\n      <tr class=\"row-params\">\n        <td class=\"pin-num\">0<\/td>\n        <td class=\"pin-num\">27<\/td>\n        <td>Encoder 4<\/td>\n        <td>SW \u2014 push to reset to default<\/td>\n        <td class=\"note\">pull-up \u2014 avoid if HAT EEPROM conflict<\/td>\n      <\/tr>\n\n      <!-- Waveform selector, toggles, buttons -->\n      <tr class=\"section-row section-misc\">\n        <td colspan=\"5\">Waveform selector \u00b7 toggle switches \u00b7 buttons<\/td>\n      <\/tr>\n      <tr class=\"row-misc\">\n        <td class=\"pin-num\">22<\/td>\n        <td class=\"pin-num\">15<\/td>\n        <td>Wave selector<\/td>\n        <td>Position A \u2014 sine<\/td>\n        <td class=\"note\">common terminal to GND<\/td>\n      <\/tr>\n      <tr class=\"row-misc\">\n        <td class=\"pin-num\">23<\/td>\n        <td class=\"pin-num\">16<\/td>\n        <td>Wave selector<\/td>\n        <td>Position B \u2014 sawtooth<\/td>\n        <td class=\"note\">common terminal to GND<\/td>\n      <\/tr>\n      <tr class=\"row-misc\">\n        <td class=\"pin-num\">4<\/td>\n        <td class=\"pin-num\">7<\/td>\n        <td>Wave selector<\/td>\n        <td>Position C \u2014 square<\/td>\n        <td class=\"note\">common terminal to GND<\/td>\n      <\/tr>\n      <tr class=\"row-misc\">\n        <td class=\"pin-num\">14<\/td>\n        <td class=\"pin-num\">8<\/td>\n        <td>Toggle 1<\/td>\n        <td>On\/off \u2014 filter bypass<\/td>\n        <td class=\"note\">pull-up, read state on change<\/td>\n      <\/tr>\n      <tr class=\"row-misc\">\n        <td class=\"pin-num\">15<\/td>\n        <td class=\"pin-num\">22<\/td>\n        <td>Toggle 2<\/td>\n        <td>On\/off \u2014 OSC sync<\/td>\n        <td class=\"note\">pull-up, read state on change<\/td>\n      <\/tr>\n      <tr class=\"row-misc\">\n        <td class=\"pin-num\">9<\/td>\n        <td class=\"pin-num\">21<\/td>\n        <td>Patch \u25b2 button<\/td>\n        <td>Next patch<\/td>\n        <td class=\"note\">pull-up, momentary<\/td>\n      <\/tr>\n      <tr class=\"row-misc\">\n        <td class=\"pin-num\">11<\/td>\n        <td class=\"pin-num\">23<\/td>\n        <td>Patch \u25bc button<\/td>\n        <td>Previous patch<\/td>\n        <td class=\"note\">pull-up, momentary<\/td>\n      <\/tr>\n\n    <\/tbody>\n  <\/table>\n\n  <div class=\"footer\">\n    <strong>Notes<\/strong><br><br>\n    All encoder CLK and DT pins use <code>pull_up_enable=True<\/code> with interrupt-driven callbacks via <code>RPi.GPIO.add_event_detect()<\/code> \u2014 do not poll in a loop.<br><br>\n    GPIO 0 and 1 (pins 27\/28) are normally reserved for HAT EEPROM. If you hit conflicts, swap Encoder 4 DT\/SW to GPIO 9\/11 and move the patch buttons to spare pins.<br><br>\n    Waveform selector: common terminal to GND, each position pin pulled high internally. Read which pin is LOW to determine the selected waveform. Add a 4th position (triangle) by adding one more GPIO pin.<br><br>\n    Toggle switches: wired between GPIO pin and GND, pull-up enabled. GPIO LOW = switch closed = ON.<br><br>\n    Total GPIO used: <strong>26 pins<\/strong> \u2014 within the Pi 3B&#8217;s available GPIO count.\n  <\/div>\n\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>for the controls and displays so not including the rPi and Audio card pin map: PiSynth GPIO Pin Map PiSynth GPIO pin map Raspberry Pi 3B \u00b7 40-pin header \u00b7 all hardware controls GPIO Pin # Control Role Notes Reserved \u2014 power \u00b7 I2C \u00b7 SPI \u2014 1 3.3V power&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-47","post","type-post","status-publish","format-standard","hentry","category-pisces"],"_links":{"self":[{"href":"https:\/\/noisyvolt.com\/index.php?rest_route=\/wp\/v2\/posts\/47","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/noisyvolt.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/noisyvolt.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/noisyvolt.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/noisyvolt.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=47"}],"version-history":[{"count":1,"href":"https:\/\/noisyvolt.com\/index.php?rest_route=\/wp\/v2\/posts\/47\/revisions"}],"predecessor-version":[{"id":49,"href":"https:\/\/noisyvolt.com\/index.php?rest_route=\/wp\/v2\/posts\/47\/revisions\/49"}],"wp:attachment":[{"href":"https:\/\/noisyvolt.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=47"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/noisyvolt.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=47"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/noisyvolt.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=47"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}