{"id":29651465,"url":"https://github.com/mark-mdo47/mdonotatypewriter","last_synced_at":"2026-02-07T04:31:01.985Z","repository":{"id":305555234,"uuid":"1023189371","full_name":"Mark-MDO47/mdoNotATypeWriter","owner":"Mark-MDO47","description":"My version of Adafruit Learning Not A Typewriter","archived":false,"fork":false,"pushed_at":"2025-08-23T00:42:09.000Z","size":6323,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-08-23T01:34:00.965Z","etag":null,"topics":["circuitpython","dual-usb","feather","keyboard","rp2040","solenoid"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Mark-MDO47.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-07-20T17:58:36.000Z","updated_at":"2025-08-23T00:42:12.000Z","dependencies_parsed_at":"2025-08-08T00:18:46.009Z","dependency_job_id":"ae504823-8056-461a-9a3c-777260d451b5","html_url":"https://github.com/Mark-MDO47/mdoNotATypeWriter","commit_stats":null,"previous_names":["mark-mdo47/mdonotatypewriter"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Mark-MDO47/mdoNotATypeWriter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mark-MDO47%2FmdoNotATypeWriter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mark-MDO47%2FmdoNotATypeWriter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mark-MDO47%2FmdoNotATypeWriter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mark-MDO47%2FmdoNotATypeWriter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Mark-MDO47","download_url":"https://codeload.github.com/Mark-MDO47/mdoNotATypeWriter/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mark-MDO47%2FmdoNotATypeWriter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29186736,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-07T03:35:06.566Z","status":"ssl_error","status_checked_at":"2026-02-07T03:34:57.604Z","response_time":63,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["circuitpython","dual-usb","feather","keyboard","rp2040","solenoid"],"created_at":"2025-07-22T05:35:38.043Z","updated_at":"2026-02-07T04:31:01.978Z","avatar_url":"https://github.com/Mark-MDO47.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# mdo NotATypeWriter\nMy version of the fantastic Adafruit Learning project \"Not A Typewriter\".\n\nThe original is here:\n- https://learn.adafruit.com/not-a-typewriter\n- Ruiz Brothers and Liz Clark\n\nI am happy to provide Attribution to Adafruit and to the Ruiz Brothers (3D design) and to Liz Clark (author of the code) !\n\n| Original | Mine |\n| --- | --- |\n| \u003cimg src=\"https://cdn-learn.adafruit.com/assets/assets/000/137/815/medium640/3d_printing_hero-ipad.jpg?1750171571\" width=\"300\" alt=\"Original Adafruit Learning Not A Typewriter\"\u003e | \u003cimg src=\"https://github.com/Mark-MDO47/mdoNotATypeWriter/blob/master/resources/images/NOT_SideView.jpg\" width=\"200\" alt=\"MDO Not A TypewriterFront View\"\u003e |\n\n\n**Table Of Contents**\n* [Top](#mdo-notatypewriter \"Top\")\n* [Introduction](#introduction \"Introduction\")\n* [Differences from Original Adafruit Learning Not A Typewriter](#differences-from-original-adafruit-learning-not-a-typewriter \"Differences from Original Adafruit Learning Not A Typewriter\")\n* [RP2040 and Dual USB](#rp2040-and-dual-usb \"RP2040 and Dual USB\")\n  * [CircuitPython USB Keyboard Documentation](#circuitpython-usb-keyboard-documentation \"CircuitPython USB Keyboard Documentation\")\n  * [Arduino USB Keyboard Documentation](#arduino-usb-keyboard-documentation \"Arduino USB Keyboard Documentation\")\n* [The Code - Derived from Adafruit Learning](#the-code-\\--derived-from-adafruit-learning \"The Code - Derived from Adafruit Learning\")\n* [Schematic](#schematic \"Schematic\")\n* [Assembly](#assembly \"Assembly\")\n* [Parts List](#parts-list \"Parts List\")\n* [License](#license \"License\")\n\n## Introduction\n[Top](#mdo-notatypewriter \"Top\")\u003cbr\u003e\nThe \"Not A Typewriter\" project was so great I had to make a copy for myself.\n\nHere is a video of my version in action:\n- https://youtube.com/shorts/a_9GTjH4s5s\n\n## Differences from Original Adafruit Learning Not A Typewriter\n[Top](#mdo-notatypewriter \"Top\")\u003cbr\u003e\nSome parts were unavailable at this time and others I chose to do in a slightly different manner.\n- The I2C Solenoid Driver https://www.adafruit.com/product/6318 was not available at the time I ordered\n  - ... so I replaced it with a non-I2C version https://www.adafruit.com/product/970\n- The original project includes files for a beautiful 3D-printed typewriter/project-box\n  - ... I chose to use a \"dollhouse\" typewriter https://www.amazon.com/dp/B0B86HYR6P and some cardboard boxes and scrap I had on hand\n\nHere is an image of most of the cast of characters for this project.\u003cbr\u003e\n\u003cimg src=\"https://github.com/Mark-MDO47/mdoNotATypeWriter/blob/master/resources/images/CastOfCharacters_NOT.jpg\" width=\"500\" alt=\"My cast of characters for Not A Typewriter\"\u003e\n\n## RP2040 and Dual USB\n[Top](#mdo-notatypewriter \"Top\")\u003cbr\u003e\nThe RP2040 is a new experience for me, as is the use of two USB interfaces. I gather that the \"device\" USB port is used to program the RP2040 and implemented by its native hardware USB facilities while the \"host\" USB port is implemented by software bit-banging, requiring one of the two M0 ARM cores of the RP2040 and both PIO peripherals. Still learning about this.\n- https://www.adafruit.com/product/5723\thttps://learn.adafruit.com/adafruit-feather-rp2040-with-usb-type-a-host\n- https://github.com/adafruit/Adafruit-Feather-RP2040-USB-Host-PCB/blob/main/Adafruit_Feather_RP2040_USB_Host_PrettyPins.pdf\n\nThis area contains information about the dual USB usage.\n- https://github.com/adafruit/Adafruit_TinyUSB_Arduino/tree/master/examples/DualRole\n\nHere is a work-in-progress list of things I need to keep in mind regarding this Dual USB technique and the RP2040.\n\nFor Arduino-style programming:\n- RP2040: \"pio_usb.h\" must not be included, otherwise pio-usb will be used as host controller\n\nFor CircuitPython-style programming:\n- nothing yet\n\n### CircuitPython USB Keyboard Documentation\nSome useful documentation for reading the keyboard data from the USB-A port\n- https://learn.adafruit.com/using-a-keyboard-with-usb-host?view=all\n- https://learn.adafruit.com/using-a-keyboard-with-usb-host/circuitpython\n- https://learn.adafruit.com/adafruit-feather-rp2040-with-usb-type-a-host/usb-host-device-info-2\n\nSome useful information for relaying keyboard data to the USB-C port and on into the PC\n- https://docs.circuitpython.org/projects/hid/en/latest/\n- https://docs.circuitpython.org/projects/hid/en/latest/api.html\n- https://learn.adafruit.com/circuitpython-essentials/circuitpython-hid-keyboard-and-mouse\n- https://learn.adafruit.com/adafruit-circuit-playground-express/circuitpython-hid-keyboard\n\n### Arduino USB Keyboard Documentation\nSome useful documentation for reading the keyboard data from the USB-A port\n- https://learn.adafruit.com/using-a-keyboard-with-usb-host?view=all\n- https://learn.adafruit.com/using-a-keyboard-with-usb-host/arduino\n- https://learn.adafruit.com/adafruit-feather-rp2040-with-usb-type-a-host/arduino-ide-setup\n\n## The Code - Derived from Adafruit Learning\n[Top](#mdo-notatypewriter \"Top\")\u003cbr\u003e\nHere is a link to the area with my version of the code and a description of the changes I made.\n- https://github.com/Mark-MDO47/mdoNotATypeWriter/blob/master/code/USB_Host_Not_A_Typewriter/README.md\n\n## Schematic\n[Top](#mdo-notatypewriter \"Top\")\u003cbr\u003e\nBelow is the schematic for my version of the Not A Typewriter project.\n- The main difference from the original version is the use of the ULN2803A chip instead of the I2C Solenoid Driver module\n  - My favorite explanation of how to use ULN2803A are posts from pcmanbob starting at \"Aug 15, 2023 9:13 am\": https://forums.raspberrypi.com/viewtopic.php?t=354993\n- I chose to use some regular GPIO pins to control the solenoids instead of the ones on the I2C connector\n  - Saving the I2C connector in case I have another use for it\n- I have some LEDs that flash when the solenoids activate and a switch that disables the solenoids but allows the LEDs to still work. This lets me type quietely when my family is asleep.\n\n\u003cimg src=\"https://github.com/Mark-MDO47/mdoNotATypeWriter/blob/master/resources/images/mdoNotATypeWriter_schem.png\" width=\"500\" alt=\"Schematic Diagram\"\u003e\n\n## Assembly\n[Top](#mdo-notatypewriter \"Top\")\u003cbr\u003e\nBelow is a conceptual assembly diagram. Most of this is assembled on a perf stripboard; see below.\u003cbr\u003e\n\u003cimg src=\"https://github.com/Mark-MDO47/mdoNotATypeWriter/blob/master/resources/images/mdoNOT_assy.png\" width=\"500\" alt=\"Schematic Diagram\"\u003e\n\nAt first I had a circuit mistake: connected ULN2803A COM with GROUND instead of +5V. After spending an unjustifiable amount of time, I corrected it. The following shows a depiction similar to my debugging efforts.\n- https://x.com/MakerIO/status/1953442023186305311\n\nWith the addition of the LEDs, resistors, and switch it got complicated enough to use a StripBoard for part of the circuit. By not including the Feather RP2040 on the StripBoard I was able to keep the board quite small. Here is an indication of how it is assembled.\n- Squares starting with F are connections from the Feather RP2040, SOL from the solenoids, SW a connection to the switch, R and C for resistor and capacitor, L for LED, and W for wire.\n- The center dark area is the ULN2803A.\n\n| Image | Connections | Assembled |\n| --- | --- | --- |\n| \u003cimg src=\"https://github.com/Mark-MDO47/mdoNotATypeWriter/blob/master/resources/images/mdoNOT_image_StripPerfBoard.png\" width=\"200\" alt=\"StripBoard Picture\"\u003e | \u003cimg src=\"https://github.com/Mark-MDO47/mdoNotATypeWriter/blob/master/resources/images/mdoNOT_connect_StripPerfBoard.png\" width=\"200\" alt=\"StripBoard Connections\"\u003e | \u003cimg src=\"https://github.com/Mark-MDO47/mdoNotATypeWriter/blob/master/resources/images/mdoNOT_assembled_StripPerfBoard.jpg\" width=\"200\" alt=\"StripBoard Assembled\"\u003e |\n\nBelow is the assembled electronics.\u003cbr\u003e\n\n| Top View | Front View |\n| --- | --- |\n| \u003cimg src=\"https://github.com/Mark-MDO47/mdoNotATypeWriter/blob/master/resources/images/NOT_TopView.jpg\" width=\"300\" alt=\"Top View\"\u003e | \u003cimg src=\"https://github.com/Mark-MDO47/mdoNotATypeWriter/blob/master/resources/images/NOT_SideView.jpg\" width=\"350\" alt=\"Front View\"\u003e |\n\n## Parts List\n[Top](#mdo-notatypewriter \"Top\")\u003cbr\u003e\n\n| Price (each) | Num | Description | URL or similar |\n| --- | --- | --- | --- |\n| $17.50 | 1 | Adafruit Feather RP2040 with USB Type A Host | https://www.adafruit.com/product/5723\u003cbr\u003ehttps://learn.adafruit.com/adafruit-feather-rp2040-with-usb-type-a-host\u003cbr\u003ehttps://github.com/adafruit/Adafruit-Feather-RP2040-USB-Host-PCB/blob/main/Adafruit_Feather_RP2040_USB_Host_PrettyPins.pdf |\n| $9.60 | 1 | Toyvian Dollhouse Miniature Typewriter Typewriter Mini Office Typewriter Tiny Wooden Typewriter Decor Miniature Antique Typewriter Classic Manual Typewriter Dollhouse Decor Accessories | https://www.amazon.com/dp/B0B86HYR6P |\n| $2.50 | 1 | 2 PCS Small Call Bell, 2.56 Inch Service Bell, Ring Bell for Service, Dinner Bell, Counter Bell, Desk Bell | https://www.amazon.com/dp/B0DYDWRYZT |\n| $4.00 | 1 | ULN2803: 8 Channel Darlington Driver (Solenoid/Unipolar Stepper) - ULN2803A | https://www.adafruit.com/product/970\u003cbr\u003ehttps://www.openhacks.com/uploadsproductos/uln2803a.pdf\u003cbr\u003ehttps://www.ic-components.com/blog/Your-Guide-to-ULN2803A-Transistor-Array.jsp |\n| N/A | 1 | 100uF 16V Electrolytic capacitor | https://www.amazon.com/dp/B081PT78Y5 |\n| $5.00 | 2 | Mini Push-Pull Solenoid - 5V | https://www.adafruit.com/product/2776 |\n| $0.70 | 1 m/f | 10 PCS (5@M 5@F) Upgraded Tiny Whoop JST-PH 2.0 Male and Female Connector Cable for Battery | https://www.amazon.com/dp/B07NWD5NTN |\n| $0.95 | 1 | Breadboard-friendly SPDT Slide Switch | https://www.adafruit.com/product/805 |\n| $0.15 | 2 | LED Green Diffused 3mm Round | https://www.digikey.com/en/products/detail/w%C3%BCrth-elektronik/151031VS06000/4489988 |\n| $0.10 | 2 | 330-Ohm 1/4 watt through-hole resistors | https://www.digikey.com/en/products/detail/yageo/CFR-25JB-52-330R/1636 |\n| $2.00 | 1 | small StripBoard | https://www.amazon.com/dp/B0778G64QZ\u003cbr\u003ealt: https://www.amazon.com/dp/B081MSKJJX |\n| ??? | * | various angle brackets, scrap wood, screws and bolts | from my parts bin |\n\n## License\n[Top](#mdo-notatypewriter \"Top\")\u003cbr\u003e\nI am using the MIT license for this project since that is what Adafruit Learning uses.\n\nThere may be code included that I have modified from other open sources (such as Arduino, Espressif, SparkFun, Seeed Studio, DFRobot, RandomNerds, etc.). These other sources may possibly be licensed using a different license model. In such a case I will include some notation of this. Typically I will include verbatim the license in the included/modified source code, but alternatively there might be a LICENSE file in the source code area that points out exceptions to the MIT License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmark-mdo47%2Fmdonotatypewriter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmark-mdo47%2Fmdonotatypewriter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmark-mdo47%2Fmdonotatypewriter/lists"}