VendArt at MakerFX

This effort aims to restore a National
Vendors, Inc. Manual Cigarette Merchandiser Series 222, which was a classic
mechanical cigarette vending machine that was popular between the 1960s and
1980s. The machine that I’m helping
restore is from 1975, as indicated by a stamp on the vending machine’s internal
hardware.

Date stamp found inside the merchandiser
Another MakerFX
member owns this project, but I’m supporting the effort by restoring the
mechanical vending mechanisms and integrating modern payment solutions while
preserving the machine’s original and existing hardware. When completed, this vending machine will
sell local makers’ unique makes at various Central Florida maker events, like Maker Faire Orlando.
The machine’s vending mechanisms are
locked when idle, preventing the pull knobs from dispensing items from their
respective magazines. When payment is
accepted, a solenoid engages the vending mechanisms to unlock the pull knobs
and enable vending. I was tasked with
replacing the missing solenoid, designing and implementing a solenoid driver,
and writing the code that drives the solenoid during a transaction.
Tech Stack
|
Mechanical |
Electronics |
Software |
Development
Environment |
|
Fusion 360 |
Raspberry Pi Pico W
(Development) |
Python
3.13.9 |
Visual Studio (VS)
Code |
|
Bambu Lab P1S 3D
Printer |
Raspberry Pi Zero
2W (Production) |
Bambu
Studio |
Thonny |
|
Solenoid
12V 10mm 5N Push Pull |
MP1584EN
DC-DC Buck Converter |
Square
API Developer |
GitHub |
|
Infrared
Thermometer |
IRLZ44NPBF
Logic Level MOSFET |
ngrok |
|
|
Prototyping |
Breadboard,
Perfboard |
|
|
|
Testbed
and Experiment Design |
Soldering |
|
|
Mechanical
|
|
|
|
|
Left to Right: Internal vending unit front,
merchandise magazines, internal vending unit side, vending lock mechanism
detail
Solenoid 12V 10mm 5A Push Pull
|
|
|
Technical Specifications
|
Voltage |
12VDC |
|
Current |
1.7A |
|
Force |
5N |
|
Stroke |
10mm |
XYZ Adjustable Solenoid Carriage (left)
and Mount (right)
|
|
|
XYZ Adjustable Solenoid Carriage and
Mount Assembly
|
|
·
Carriage
and mount were designed in Fusion 360
·
Carriage
and mount were 3D printed on the Bambu P1S
|
|
|
|
Detail of solenoid on XYZ carriage and mount,
and fastened to existing machine bracket
Retrofitted XYZ Adjustable Solenoid
Carriage and Mount Assembly on Existing Bracket
|
|
|
|
·
The
solenoid carriage and mount are adjustable in the XYZ directions, so the
solenoid can be precisely positioned to engage the vending lock mechanism
o
The
solenoid fastens to the carriage
o
The
carriage fastens to the mount
o
The
mount fastens to the vending machine’s existing bracket
· I designed this XYZ solenoid carriage
and mount assembly to fit the existing bracket
· This design makes it possible to
position the solenoid plunger (piece that extends and retracts) with the
vending machine’s mechanical lock mechanism
· The XYZ carriage and mount positions are
‘locked’ with screws, washers, and nuts creating bolted joints
|
|
Bolted Joint
Solenoid Cycle Temperature Testing
· The solenoid’s plunger extends by
creating a magnetic field when current flows through the tightly wound coils
surrounding the plunger
· Continuous current flowing through the
solenoid coils produces a lot of thermal energy (heat)
o I reduced the solenoid’s input voltage
from 12V to 6V to reduce the heat produced when current is flowing through the
coils
· Since the solenoid is mounted to a
carriage and mount that was 3D printed with PLA, I want to make sure that the
hear produced by the solenoid does not exceed the melting point of PLA
·
I
created a test bed to measure the temperature of the solenoid with an infrared
thermometer
o
I attempted
to keep the ambient temperature constant throughout each experiment run
§
No
AC running, ambient temperature measured during the experiment
o
The
infrared thermometer was mounted onto a tripod to secure its distance from the
solenoid through the experiment
§
The
infrared thermometer’s documentation recommends measuring a temperature from
14”, so I mounted the thermometer at 14” from the solenoid’s top surface where
the temperature was measured
o
The
solenoid was attached to the carriage mount to observe the solenoid’s
temperature effect on the PLA
o
The
carriage mount was securely taped to the test bed to reduce movement between
engages and disengages
·
I
wrote code to iterate through an engage and disengage procedure that parallels
the use-case
o
This
makes the experiment repeatable and the data more accurate
o
Code
available on github
|
|
|
Solenoid Cycle Testbed Setup
·
This
experiment iterated through an engage-disengage cycle for multiple cycles, and
was repeated at various locations on the solenoid
· Procedure
o
Measure
surface temperature at the designated location BEFORE starting engage-disengage
cycles
§
This
location is where the cycle temperatures will be measured for the entire
experiment
o
For
130 cycles
§
Solenoid
engages for 15 seconds
§
Solenoid
disengages and temperature is measured at the designated location
§
Solenoid
remains disengaged for 10 seconds
o
NOTE: DO NOT touch the solenoid or move the
infrared thermometer during the experiment

Locations on solenoid where temperatures
were measured
|
|
Center
Side |
|
|
Center V
Leads Side |
|
|
Center |
|
|
Center
Plunger End |
|
|
Center
Spring End |
· Results
o
Cycles
1-100 cycles: Capture the temperature rise toward a temperature steady-state
o
Cycles
101-130: Measure steady temperature
o
The
results from the experiment agreed with the claim that the solenoid is hottest
near the center of the coil length, as shown in my data below
o
The
experiments’ maximum temperatures had a delta of approximately
, with the center of the coil length
hitting
and the end of the coil length hitting ![]()

Solenoid Cycle Temperature Rise and
Steady-State Data

Solenoid Steady-State Temperature Data
|
Location on Solenoid |
Measured Ambient Temperature |
Average Solenoid Steady-State
Temperature |
|
Center Side |
|
|
|
Center V Leads Side |
|
|
|
Center |
|
|
|
Center Plunger End |
|
|
|
Center Spring End |
|
|
· Data Variability
o The Average Solenoid Steady-State
Temperatures had a sample variance of 5.42℃^2,
or a standard deviation of 2.33℃
§ Variance represents the average of the
squared distance from the mean, which conveys the distribution of the data
|
Average |
|
|
|
Sample
Variance |
|
|
|
Standard
Deviation |
|
|
o This data has a low variance, which
means that the data is closer to the average
o Low variance is an indication of
consistent measurements during data acquisition. Conversely, high variance indicates unusual
or inconsistent data
· Conclusion
o The Average Solenoid Steady-State
Temperatures had a sample variance of 5.42℃^2,
or a standard deviation of 2.33℃
o PLA begins to soften at
and melts at ![]()
o This cycle test was more aggressive than
the cycles that the fielded solenoid will experience and was still
under the softening temperature
o The heat produced from the active solenoid
should not affect the PLA carriage mount
o As an extra experiment, I allowed the
solenoid to cycle through engage and disengage for 200 cycles with no impact to
the solenoid’s performance or the PLA carriage mount
§ No data collected – Just observation for
any impacts to the system at high cycle counts
· How to Improve Future Experiment
o Automate temperature readings with
software instead of manually pressing the thermometer trigger
§ Reduces human error by with more
consistent timing between measurements
§ Eliminates all shaking of the
thermometer when user presses the thermometer trigger
§ Collect more frequent temperature data
throughout the experiment to create a more complete temperature profile of the
solenoid
o Perform experiment in a more controlled
environment
§ Thermal chamber
Electronics
Raspberry Pi Pico W
|
|
|
MP1584EN DC-DC Buck Converter (Step-Down
Converter)
|
|
|
|
·
I
wanted the solenoid and microcontroller to share one 12VDC power source, but
both components have different electrical requirements:
o
Solenoid:
12VDC, 1.7A
o
Raspberry
Pi Pico W: 5V, 95mA
·
A
buck converter, AKA step-down converter, efficiently reduces a higher input DC
voltage to a lower output DC voltage
o
This
protects the lower-voltage components that are connected to a higher DC source
voltage
·
An
inductor stores and releases electromagnetic field and smooths the current by
resisting rapid changes
·
A
switch creates a duty cycle that outputs a desired voltage lower than the
source
o
The
lower the duty cycle, the lower the store in the inductor
o
Think
Pulse Width Modulation (PWM)
o
The
switch is usually a transistor (MOSFET)
·
A
diode creates a path for the current when the switch is turned off
·
A
capacitor smooths the voltage rippled
·
The
buck converter unit uses a control (potentiometer) to control the output
voltage
IRLZ44NPBF Logic Level MOSFET

IRLZ44N
Logic-Level MOSFET
·
A
MOSFET is an electronic switch that controls current flowing through a
semiconductor channel using an electric field
o
MOSFET
Terminals
§
Gate
(G): Control Input
§
Drain
(D): Where current flows out
§
Source
(S): Where current flows in

o
N-Channel:
§
Turns
on when the gate is more positive than the source
§
Current
flows from drain to source
§
Efficient
and low heat
§
Motor
drivers, solenoids, power supplies, high-current applications
o
P-Channel
§
Turns
on when the gate is more negative than the source
§
Current
flows from source to drain
§
Simpler
but less efficient at high currents (higher
)
§
Battery-powered
devices
·
The
IRLZ44N is a logic-level N-channel MOSFET, which allows us to engage and
disengage the solenoid by passing a boolean to the
MOSFET gate with the solenoid driver code
·
2
main parameters for selecting the appropriate MOSFET: Voltage (V) and Current
(I)
|
|
|
|
· MOSFET Spec Sheet
o
Spec
sheet assumes proper cooling, so operating the MOSFET at the rated specs
without proper cooling (fans, heat sinks, etc.) can overheat or melt the unit
o
The
Current spec only says that the MOSFET will not melt when operating at 47A when
properly cooled
§
While
the Current and Voltage are used to determine how a system will operate, the
MOSFET’s internal resistance,
, sets the threshold
·
tells how much power needs to dissipate from
the MOSFET at a constant load
o
Constant
Load: >10 seconds without a heat sink

IRLZ44N
MOSFET Spec Sheet
· Thermal Power Generated
o
Recall
– the internal resistance,
, is the spec that we will use to
threshold our MOSFET selection calculations
o
Since
there isn’t perfect control of the load on the MOSFET, we degrade the
by 20-30%
§
Increase
by 20%:
![]()
|
|
o
Now
calculate the thermal power generated,
, by the system given the load’s specs
§
Since
we are using the MOSFET to drive the solenoid, we are using the solenoid specs
defined above as the load
|
|
|
|
|
|
· Thermal Power Lost
o
These
thermal losses need to somehow escape the MOSFET, and that can be determined
with the thermal resistance, ![]()
§
This
tells you how much the MOSFET will heat up for each watt of thermal loss, ![]()
o
Now
that we’ve solved for
, we can calculate the thermal losses to
confirm that they are within the MOSFET’s specifications
§
The
MOSFET spec sheet indicates that the Thermal Resistance,
, for a MOSFET without a heatsink
(Junction-to-Ambient) is ![]()
·
Use
the heatsink spec sheet if a heatsink is screwed onto your MOSFET
·
We
assume that ambient is
when unknown or unspecified
§
We
calculate the thermal loss by multiplying the thermal power generated,
, and the thermal resistance, ![]()
|
|
|
|
|
|
o The calculated thermal loss can be
compared to the Operating Junction
and Storage
Temperature
Range indicated on the spec sheet:
|
|
o Since the calculated temperature from
thermal losses falls within this spec, we determine that the MOSFET can safely
operate under the solenoid’s load
|
|
· MOSFET Drive Levels

o
Since
this MOSFET is a logic-level MOSFET, we need the voltage from the logic signal
that the microcontroller produces
§
The
solenoid will be driven by the Raspberry Pi Pico W microcontroller, which
outputs 3.3V
o
The
MOSFET spec to track here is the Static Drain-to-Source On-Resistance, ![]()
o
Notice
that the resistance values on this spec are more in line with the resistance we
calculated losses with at the 20% margin
§
Resistance
goes up as the voltage goes down, which is the relationship indicated by ![]()
· Confirm MOSFET selection
o
The
spec sheet doesn’t indicate Static Drain-to-Source On-Resistance,
, but I still want to confirm that my
system won’t exceed the MOSFET’s thermal constraints
o I’m using the indicated
for 5V and 4V to linearly extrapolate
for the microcontroller’s 3.3V
|
|
|
|
|
|
|
|
o Now that
is calculated for my system, I can revisit the
calculations and use my estimated
to
more accurately determine the thermal effects on the MOSFET
|
|
|
|
|
|
|
|
|
o At
, I’m still well within the Operating
Junction
and Storage
Temperature
Range indicated on the spec sheet, so my solenoid driver will not thermally
compromise the MOSFET
o
This
MOSFET is excessive for my solenoid driver’s electrical parameters, but its
large voltage and current margin will be reliable and usable
Solenoid Driver Wiring Schematic,
designed in TinkerCAD Electrical

Solenoid Driver Breadboard
|
|
|
|
Breadboard for solenoid driver
development
Soldered Perfboards
|
|
|
Left
to Right (per image): Solenoid, Solenoid Driver, Buck
Converter, Raspberry Pi Pico Microcontroller, Redundancy Engage and Disengage
Buttons
Solenoid
Driver/Buck Converter Stack
|
|
|
Assembled solenoid driver unit on
soldered perfboard
Software

Vending Flow of Execution
· Point of Sale (POS) Solenoid Engage
o
The
trigger that commands the solenoid to engage and unlock the vending lock
mechanism is an initiated transaction
o
Once
initiated, the solenoid will remain engaged until an item is dispensed or the
defined engage time expires
§
Solenoids
engage by running a continuous current, so they get very hot when engaged
§
A
timed disengage is a safety parameter that protects the solenoid from
overheating in its engaged state
o
The
point of sale is performed via digital payment platform (DPP)
§
Square,
Stripe, Venmo, Zelle, etc.
o
When
a transaction is initiated, a webhook is posted to the defined endpoint from
the DPS
o
Receipt
of the webhook then commands the solenoid driver to engage and unlock the
vending lock mechanism
· Webhook Implementation

Production Webhook Implementation,
Raspberry Pi Zero 2W
o
I
decided to use a webhook instead of an API to keep the design efficient
§
API: System (client) pulls data or
an event from another system (host) when the client system sends a request
·
Host:
Data Source
·
Client:
Data Requester/Recipient from an endpoint
§
Webhook: System (client) automatically pushes
data to another system (host) when the client system detects an event
·
Host:
Data Recipient
·
Client:
Data Source that sends a POST to a URL endpoint
o
Instead
of polling the endpoint with an API, a webhook is sent to a server when the
endpoint detects an event
§
The
host (receives the webhook) is ‘listening’ for a POST request from the client
(sends the webhook)
§
The
API for the service I’m using limits the number of calls to the host, but not
webhooks as long as data receipt is confirmed
o
The
server to which the webhook posts is hosted locally on the Raspberry Pi, but
the server needs to be publicly accessible so that the external DPP can post
the webhook
o
A secure
tunnel creates an encrypted pathway for data to travel between two
endpoints over HTTP protocol
o
The
secure tunnel securely exposes the local server on the Raspberry Pi (host) to
the internet, enabling the external DPP (client) to post to it
§
The
Raspberry Pi (host) server ‘listens’ for a webhook post from the external
client
§
When
payment is accepted by the DPP, the DPP (client) sends a webhook to the server
hosted on the Raspberry Pi (host) via a secure tunnel to inform of a received
payment
§
The
local host must send a receipt confirmation to the client when the webhook is
received, typically within approximately10 seconds of receipt
·
Confirmation:
200 code
Dev Implementation

Development Webhook Implementation,
Raspberry Pi Pico W
o
My
dev environment uses a Raspberry Pi Pico W, which is a microcontroller, so it
can’t run a secure tunnel
o
I’m
using my laptop to create a local server and implement a secure tunnel that
receives webhooks from the DPP endpoint
o
The
laptop sends a Boolean to the Raspberry Pi Pico W’s IP on a common network when
a webhook is received, commanding the solenoid driver to engage the solenoid in
the vending lock mechanism
o
The
deliverable will consolidate the Raspberry Pi Pico W and the laptop with a
Raspberry Pi Zero 2W, which can host a local server and implement a secure
tunnel, following the first diagram in this section
·
All
code implemented in this notebook is publicly available on my github!
Helpful
Links
· MOSFET Explained - How MOSFET Works
· MOSFET Selection Calculations