From c38faa940fcf0d9635c661ecaad19c172816c350 Mon Sep 17 00:00:00 2001 From: N07070 Date: Sun, 27 Dec 2020 21:10:19 +0100 Subject: [PATCH] Updated readme, add cover and completed instructions --- README.md | 33 ++++++++++++++++++++++++--------- dither_it_cover.png | Bin 0 -> 21020 bytes 2 files changed, 24 insertions(+), 9 deletions(-) create mode 100644 dither_it_cover.png diff --git a/README.md b/README.md index d641b65..3606ded 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,9 @@ > Print out shit from the cloud. +![Ditherd image of a Adafruit Thermal Printer](dither_it_cover.png) +[CC-BY oomlout](https://commons.wikimedia.org/wiki/File:TPRI-01_(14335248671).jpg) + ## About This project started when I got a Thermal Printer from a friend. I don't really know if you can do anything more, but I guess it's fun. @@ -11,39 +14,52 @@ This project started when I got a Thermal Printer from a friend. I don't really ## Requirements To make this project work, you will need : -- [A Thermal Printer](https://www.adafruit.com/product/597) -- A Raspberry Pi +- A Thermal Printer : + - I used Adafruit's thermal printer at first, but it broke down. You can get it here : https://www.adafruit.com/product/597 + - I then used a EPSON TM-T2OIII. It's expensive, but it's also high quality, and has better CUPS and specific library support. +- A Raspberry Pi or any computer with USB or Serial. - Some electric wires. -- Some knowledge of the command line -- 3h of your time +- Some knowledge of the command line, +- Some knowledge of Python. +- 3h of your time, 5h if things need debugging. +- `git`, `virtualenv`,`pip` and `python` >= 3.8.6. ## Installation -Start by following the guide [here](https://learn.adafruit.com/networked-thermal-printer-using-cups-and-raspberry-pi) to install the CUPS software needed to print images. If you want, you can install it via the command line, [following this guide](https://help.ubuntu.com/lts/serverguide/cups.html). +For the EPSON TM-T20III, you can get the CUPS driver from [here](https://download.epson-biz.com/modules/pos/index.php?page=soft&scat=32). It's not specific to the printer I've been using, so you can try with other printers. + +With that, you can try out your printer and print normal text, images or pdf documents for example. LittlePrynter itself does not require any other software than the ones installed with it, i.e the ones listed in the `requirements.txt` file. + +For the Adafruit printer, start by following the guide [here](https://learn.adafruit.com/networked-thermal-printer-using-cups-and-raspberry-pi) to install the CUPS software needed to print images. If you want, you can install it via the command line, [following this guide](https://help.ubuntu.com/lts/serverguide/cups.html). You can also get some information from [here](https://learn.adafruit.com/mini-thermal-receipt-printer) and [here](https://learn.adafruit.com/instant-camera-using-raspberry-pi-and-thermal-printer) if you're stuck. Then, setup the project : ``` git clone https://git.n07070.xyz/n07070/LittlePrynter +virtualenv LittlePrynter cd LittlePrynter pip install -r requirements.txt ``` -Now, edit `the users.json` and add a user. **Don't forget to remove the test user.** + +You should see a folder named `configuration`. Enter it, and duplicate the file named `config.toml.sample`, and rename the copy to `config.toml`. Now, edit this file by following the comments in the file itself. You can now start the web server with ``` -export FLASK_APP=littleprynter.py +export FLASK_APP=main.py flask run ``` +This command should start a web server with which you can test your configuration. If you plan on exposing your printer to the Internet, and give it an IP / URL, _please, please, please_, don't run it this way. Look at Flask's documentation and read about running a production server. It's a little more work, but it will prevent your computer/server being hacked in too easily. + VoilĂ  ! ## More + If you liked this project, feel free to support my work ! -[https://n07070.xyz/post/about-me/about-me/](Donations welcome :-]) +[Donations welcome ! :)](https://n07070.xyz/about-me) ## Links @@ -51,7 +67,6 @@ If you liked this project, feel free to support my work ! - [Github repo with CUPS drivers for the Adafruit Thermal Printer ( zj-58 )](https://github.com/klirichek/zj-58) - [A link to buy one in Europe](https://rlx.sk/sk/various-boards/1829-mini-thermal-receipt-printer-adafruit-597.html) - [Another link to buy one, direct from factory](https://www.cashinotech.com/csn-a2-58mm-mini-panel-thermal-receipt-printer_p11.html) -- ## Licence diff --git a/dither_it_cover.png b/dither_it_cover.png new file mode 100644 index 0000000000000000000000000000000000000000..12db889daf627bbd122c479a1498b811f9f52d40 GIT binary patch literal 21020 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

oKlrFidbm#>m0U;tvR=TVV;UXj_1< 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 BD--|# literal 0 HcmV?d00001