old-fashioned milk bottles meet iot

If you remember from my last post on the subject, I’m into those old-school glass bottles of various sizes. Here’s the typical size and lid type that I’ll be talking about:

quart

The lids seem to come in a variety of colors and are probably made from ABS plastic—they work well and last a while. Everything cleans up nicely and I’ve had quite a few of these in my pantry for the last five years now.

Identification

There are times, though, when I wished that it were easier to tell what’s what. I honestly have a variety of things which kind of look the same: masa, ground corn meal, pancake batter, semolina flour, etc. They’re all vaguely yellowish. The same is true for the many flours which I buy.

My usual routine is to put a small Post-It type of note of some kind on the front of the bottle. But sometimes these fall off. I have been known to tape them on.

It would be nice if I had a way of easily identifying the contents of the bottle as well as preserving things like nutritional information or the instructions that you might find on the back of a Cream of Wheat box. I could also record the date of purchase and/or the expiration date but I’m not that fussy.

High-tech version

Today’s creativity involves the idea of self-identifying bottles. I’ve just purchased some tiny RFID tags which I hope to embed inside my own self-made bottle caps. I’ve just spent an hour designing the cap in Autodesk Fusion 360 and it’s now getting a test print to see if it fits. When the tags arrive I’ll carefully measure one and then design an internal cavity to accommodate the tag inside the cap. Given that the tag is completely embedded, it should be waterproof as well and should stand up to being repeatedly washed.

 

The usual tactic with respect to printing these with an embedded object is to create two jobs out of the part (1st half, 2nd half) and then insert the tag in between the print jobs. My own GetToDahChoppa project would be the way of chopping that. For this project it will be easier to just insert a pause command at the magic moment in the gcode file so that the printer pauses, alerting me to insert the tag and then I’ll manually resume. As long as I don’t include internal supports, this technique should work fine.

I thought I’d create a NodeJS-based server which sits on a Raspberry Pi computer which minimally includes an RFID reader. It would host a database of the RFID numbers and their corresponding information for each bottle in service.

The system should include a mechanism for simply reporting which bottle is being held up to the reader as well as several convenience features to include fetching the nutritional information given a UPC symbol. I’m guessing it would be nice to have something which actually scans UPC symbols but that’s not strictly necessary since it doesn’t take much to just type them in.

I guess I’ll have to type in the instructions or include a photograph of the box’s instructions.

Interface choices

I guess now, I’ll need to determine what kind of interface this will have. I could include a TFT panel. I think this would be the normal way of communicating things back to the user. In this way, you could click tabs on the screen if you wanted more information. I would assume that this would use Kivy as the graphical interface. It’s possible but I’d have to have somewhere near the pantry with power and the correct orientation, distance and lighting for the panel. And it must also work out with respect to the distance of the reader.

At the moment, though, I’m thinking that it might be interesting to push the report information to an Echo Dot that’s in the same room. In theory, you would hold the bottle’s top to the horizontally-mounted reader. There would be a delay of perhaps three seconds and then you’d hear Alexa say “Cream of Wheat”, having initiated an Alexa Skill of some kind. I’m guessing then that I might have to say “Alexa, read the instructions” to have her then read from another topic.

Given the way Amazon’s Lambda functions work, it feels like it will be problematic unless I host the database in the cloud otherwise the function wouldn’t easily have access to that information. I dunno, but I kind of like the idea that the database just lives on the Raspberry Pi itself.

I could use a simpler text-to-speech project from earlier, requiring a speaker on the Raspberry. The sound quality is basically similar to listening to Stephen Hawkins reading your panty list. I’ve also been successful using the Snips home assistant interface for doing something Alexa-like without the cloud. The quality of the output voice isn’t as slick as Alexa but it’s good enough.

Hot off the printer

While I’ve been thinking about all this, the first draft print has finished. It’s very nearly identical to the hand-measured original lid only that inner insert seems to be slightly too wide for the bottle. The PLA plastic I’m using is more rigid or I’ve made that wall too thick; it will need a slight adjustment and another test fit before I advance to the next step. It lacks subtle details that aren’t actually necessary on the original lid like central spokes and outer ribs.

FirstVersion

I’ll tweak the design and reprint it. And I guess I have to wait for those RFID tags to arrive in the mail before the next phase of this.

recycle, re-use, re-purpose – part ii

Continuing with the work to re-purpose a computer mouse as a filament movement detection device, I designed and printed some parts for this. The bottom part is perhaps 5mm in height from the spool itself and is reasonably a good distance to see changes.

I’ve edited the earlier Python script which originally detected the scroll wheel button; it’s now detecting movements of Y as if the mouse were being moved on a mousepad. It will only do this if I take the white assembly and move it around on a patterned surface, however.

To help the mouse detect movement better, I’ve tried using both grid paper and a polar version of same. I don’t love the feedback loop that’s going now. I’m sure there’s a better way to get this movement detected all the time, though.

IMG_0115

IMG_0116

IMG_0118

recycle, re-use, re-purpose

This week’s project involves dealing with filament-delivery problems on my 3D printer. Out of the box, the filament runout detection never worked. Frankly, it was a terrible design to begin with from the manufacturer and I’m convinced that someone at the factory just turned off that behavior anyway.

As a result of this, I’ve lost a few print jobs over the last year. In only two cases, I simply ran out of filament for large parts. In all the remaining cases, a number of problems contributed to the loss of filament delivery to the printed part:

  1. simple end-of-roll loss of filament
  2. spool sticking to manufacturer’s poorly-designed spool holder
  3. cross-threading of the filament on the roll
  4. hot-spooling the filament at the factory which resulted in filament which sticks together
  5. filament like carbon fiber—infused which likes to stick to itself
  6. old filament which is now brittle and breaks as a result
  7. overall poor design of the spool (boxy) shape itself, resulting in cross-threading
  8. overall poor design of the filament delivery path itself, resulting in too much force needed to extrude
  9. filament thickness quality issues as combined with PTFE feed tubing, resulting in stuck filament in the tube
  10. too-flexible filament as combined with any of the conditions above, resulting in filament notching at the bowden gear
  11. z-offset too close to the bed, resulting in hotend jamming
  12. poor first-layer adhesion, leading to a build-up of filament and ultimate hotend jamming

Now granted, the bowden drive for this printer is one of the beefiest NEMA 17 style of stepper motors I’ve seen. And yet the number of filament delivery—related problems is just too high to continue to ignore. So I’ve decided to finally deal with the issue rather than working around it.

Ideas & inventions

Remove the stock holder, add bearings to its replacement

I designed, printed and assembled a very good dual-spool filament delivery system which worked much better than the stock filament holder. I sometimes still use it.

DSC_0062

Dual runout switches

Perhaps six months ago, I designed, printed, sourced parts for and assembled a very good dual-spool filament runout detection block to replace the stock part. I have yet to install it since I’m not in love with the idea of the filament path beginning at the table level. Time has taught me that the spools need to be higher than the printer for this to be optimal. As designed, though, it works in principle to detect loss of filament from both spools.

DSC_0211

And yet, this entire concept does not directly address the problems associated with cross-linked filament. It only addresses the loss of filament as seen in a switch.

Parabolic spool guides and re-purposed monitor stand

Additionally, I designed, printed and assembled parabolic spool guides to better deliver filament (especially for hot-spooled or otherwise sticky filaments like carbon fiber). This I combined with a designed/re-purposed dual-monitor stand to move the spools above the printer rather than below.

SpoolHolderOverhead

SpoolHolderWithBracket

Remove the temperature gradient

First-layer adhesion was aided by adding a foam enclosure/door and a temperature-monitoring Raspberry Pi 3B to the inside (opposite the internal webcam). The latter helps to heat up the print volume area, keeping things from 90-100 degrees Fahrenheit.

foam

Remove the PTFE tubing

Filament diameter inconsistencies resulted in filament getting stuck in the PTFE tubing. I now rarely route the filament through the tubing, having removed the awkward bottom-to-top filament delivery path from earlier.

And finally, a filament movement detection mechanism

This weeks work then revolves around fixing the underlying problem. The solution isn’t filament runout detection. The more accurate problem and better solution is actually loss of filament movement and its detection.

When I began to think of solutions, in my head I was adding black/white encoder rings to the sides of the spools themselves. I would need to add those to all spools of course. I’d also need to design something which reads those as ones and zeroes.

I decided that a roller/follower which is turned by the spool is also a solution. I then envisioned writing drivers and creating a small circuit board for all this so that it could talk to Raspbian, the operating system which OctoPrint runs on.

Mouse to the rescue

Finally, it hit me that a standard computer mouse does this naturally. The older style of ball mouse has a follower which detects when the ball is moving. Even the newer style of mice still have a scroll wheel which is covered in rubber and would do nicely. In my imagination, the first iteration of this had the filament trapped against that rubber wheel. In today’s version, the wheel merely comes in contact with the side of the spool itself for the win.

As a bonus, the computer mouse already has the serial communication and Linux driver built-in. It was trivial to write a small Python script to detect scrolling events.

no mice will be harmed … in the making of this gadget.

The mouse should fit nicely and without any modifications to a 3D-printed holder. The serial connection goes to the Raspberry Pi and is then detected in an OctoPrint plugin. During a print job the scrolling events will be monitored; any loss of scrolling over the sampling period will then pause the job and alert the operator with a sound event.

rat on computer mouse

old-fashioned milk bottles

Once upon a time, you’d get milk delivered in the morning in glass bottles. Okay, honestly, it was other people who got that but I do know this from watching old movies.

milkman

Now that I’m old enough to go shopping myself, I have a fondness for buying my milk in bottles like this. For most people, I’d guess, the thought of adding an extra $2 for the glass rubs them the wrong way. For me, I see it as an excellent way of picking up a great deal. It would cost about $10.84 for that same glass two-quart container from Amazon.

Re-use, recycle, re-invent

So what would I do with the extra bottle? Almost anything that can fit through the top is a good candidate but food is what I primarily store in mine. I have at least 30 bottles storing dry goods, two storing refrigerated drinks and perhaps eight storing filtered water.

When I make waffles, I usually mix up several batches of the batter and that will go into the pint-sized glass bottle. Turbinado sugar also goes into the pint-sized version, making it easy to spoon straight out from there.

I purchase the Mueller’s pot-sized spaghetti which fits nicely into the quart-sized bottles. Most flours as packaged by Bob’s Red Mill will exactly fill the quart-sized version. Potato flakes? Check. Granola? Check.

I have rows of beans and lentils, pastas of all shapes, flours, starches, coconut flakes and almond slices. There’s trailmix in one. I have semolina, masa, corn meal, oatmeal, Scottish oats and Creme of Wheat.

In the refrigerator today I just added two quarts of iced tea and a quart of iced coffee. Three visits to a local coffee shop would probably set me back $12 for three drinks and I’ve just stored away the same amount for a fraction of that cost.

Perhaps the best benefit of storing most of your pantry in glass is that you no longer have to deal with pests. This is the first time in my life that I have literally zero bugs trying to eat my food.

Enter the 3D printer

The tie-in, then, to the 3D printer involves me designing a replacement funnel using Autodesk Fusion 360 for the purchased funnel I’ve used up until now. Hopefully it turns out, it’s about as big as my printer could do.

The previous funnel was okay but it wasn’t a great fit for the bottle. Big items like granola would constantly get stuck in the too-small funnel neck. This one should fit perfectly.

Screen Shot 2018-07-09 at 4.03.41 PM

Food safety and plastic

Some of you may then caution about the use of printed plastic in conjunction with food. I’m sure the PLA filament (which is made of a polymer of corn starch) is actually closer to be food-safe than the funnel which I’d purchased from a car parts store earlier.

Some of the typical concerns with food versus printed plastic is that the small grooves in the plastic allow for bacteria to grow. Okay, but this is the same for most of the plastic utensils which we routinely include in our kitchen, right?

Another concern is regarding the existence of lead in some of the nozzles used. Yes, but that must be so minuscule as to be outside of the realm of concern. In response, I could site the many harsh chemicals used in the processing of naturally-green soybeans to create an unnaturally-white soy milk product, for example.

For dry goods, the PLA funnel should be a non-issue. With reasonable cleaning I think that it will do fine with liquids as well as long as I don’t use it to funnel boiling water, for example.

magnetic card readers

Continuing in the series of fun recycling projects for these Dell Vostro 200 computers, I purchased a MagTek Dynamag USB-based swipe card reader for a new project to track visitors in the office’s entrance.

dynamag

Overview

The solution includes an Ubuntu server which only runs a single application to receive the card swipe details, to find the Track 1 data and to then submit this information to a Microsoft IIS—based website. The pages here then offer up an API for the incoming card swipe details and an administrative page for registering new visitors, reviewing the log details and the visitors as seen, to include the ability to export those details to Excel. The data is stored in a Microsoft SQL Server database.

To save cost, I decided to have each visitor just use a magnetic swipe card already in their wallet. In this way, I wouldn’t have to buy a magnetic card encoder, purchase card blanks nor worry about designing or issuing them (or trying to get them back later).

Typical Cost of an Access Control System for Visitors

From this webpage 2016 Average Card Access Cost

“Expect to pay an average of $1,500 to $2,500 per door for a high-quality system for up to 150 people. … It will cost an average of $1,000 to $1,500 for the hardware for the door. It will cost an average of $3 to $5 per keycard. Monthly service fees can range from $10 to $100 per month.”

My total cost for this project was just eight hours’ labor plus the $48.36 for the card reader! This included the database and website coding plus the I.T. work to setup the Ubuntu server and to create the Python script to talk to the USB-based reader, to test everything and to write up the documentation. This isn’t bad, considering the cost of an average system.

kloudspeaker

In my quest for recycling old Dell Vostro 200 computers here at work I’ve recently had the pleasure of creating a document management system using the open-sourced Kloudspeaker software. It appears to be a mature project and installs easily.

It’s important to read through the documentation. Out-of-the-box it doesn’t do file uploads, for example, but the configuration may be modified to do so. And I found an issue with files larger than 2MB which again was fixed by reading the docs. It helps to have some reasonable system experience on your UNIX server because some of these issues are dealt with outside of the Kloudspeaker software’s configuration itself.

kloudspeaker_login

The interface is attractive throughout.  The upper menu is responsive to changes in window size, buttons (like Upload) will optionally appear if the feature is turned on and if the user has the correct rights.  Overall it just seems to work without problems.

kloudspeaker_documents.png

Typical Cost of a Document Management System

From the webpage How Much Does a Document Management System Cost?

“[For a cloud-based system] …you should expect to invest between $20 and $50 per person per month, with the major variable being the level of service you subscribe to.

“[For an on-premised system] To start, you’ll have an up-front charge for your server and desktop licensing. This licensing tends run between $350 and $500 per person on average. Depending upon which features you sign up for, you’ll need to purchase the appropriate number of servers at the average rate of $5,000 to $6,000 per device. Ongoing support and maintenance will take the form of an annual per person fee, which will typically cost you around $40 per seat.”

Installation

Below is the list of things I needed to do to get the server running. I managed to do all of this in just under two hours. It then took me another two hours of finding over 300 contracts so that I could upload them into the system.  All-in-all, that’s not bad (four hours’ labor + $0.00) for an excellent document management system that could have cost a lot of money!

  1. Boot from a (free) GParted disc on a Dell Vostro 200 computer to remove any existing partitions
  2. In BIOS, set the computer so that it will run without a keyboard without stopping during POST
  3. Boot from a (free) Ubuntu disc and install it as a server
    1. Choose server install
    2. Use entire disk with LVM
    3. Install GRUB
    4. Install OpenSSH server and LAMP
  4. Edit the /etc/network/interfaces file to give the server a static IP address
  5. Edit the /etc/apache2/apache2.conf file to give the webserver its name
  6. Create a CNAME record in my DNS server of contracts for this Intranet server
  7. Run sudo apt-get update, sudo apt-get upgrade and sudo do-release-upgrade to make sure that I’m using the latest software
  8. Run sudo apt-get install unzip to install this necessary software
  9. To pull the latest zip file from their website, in my home directory run the command  wget http://www.kloudspeaker.com/download/latest.php, run unzip to expand the file structure and then copy this recursively to the /var/www/html area under a kloudspeaker folder name, remembering to use the -a option for the sudo cp command to get hidden files as well
  10. Log into MySQL as the root user with mysql -u root -p and then from this console, run create database kloudspeaker; and then run exit; to come out of the MySQL client
  11. Edit the /var/www/html/loudspeaker/backend/configuration.php file, setting the appropriate database credentials for the newly-created kloudspeaker database, as well as adding "EventLogging" => array() to the list of plugins
  12. Edit the /etc/apache2/sites-available/000-default.conf configuration file to change the DocumentRoot to /var/www/html/kloudspeaker
  13. From another computer, visit the http://contracts/backend/install link to start their installation, verifying the database credentials and next, creating an administrative user for the software
  14. Back in a terminal, manually create a folder at the root with sudo mkdir /files and subfolders below this to hold each subgroup
  15. Run sudo chown -R www-data:www-data /files to make sure that the Apache service user can control the files uploaded into the system
  16. Edit /etc/php/7.0/apache2/php.ini to add these two lines: upload_max_filesize = 40M and post_max_size = 40M
  17. Run sudo apt-get update and sudo apt-get upgrade again to verify that your system is up-to-date after bringing in software
  18. Again from another computer, log into the website interface, creating users, groups, adjusting the access rights to the folders you’ve defined, making sure to test as a non-administrator user to verify the results
  19. Shut down the Ubuntu server, remove all peripherals and put the computer into the server room with only Ethernet cable and power cord connections, turning it back on

Using Kloudspeaker

Now that everything’s installed and setup, you add the user accounts for the people who also need access. You use their email address so it will invite them to create their own passwords.

I’m very pleased with the way this has turned out and how little effort was required to get it going. I’d highly recommend this software for businesses.