Our project is an expandable bar inventory system that
implements wireless communication.
The bar inventory system was an interesting project, because
it involved both hardware and software together, since we are comprised of one
analog designer and one computer programmer, both of whom are alcoholics. On
the hardware side, there are sensors and wireless communication, and on the
software side, there is data encoding and clever data manipulation.
Also, it was an excuse for us to drink for class, and not
because of class.
The project idea sprang from the concept of smart
refrigerators that keep an inventory of their contents. However, we feel that
alcohol is more important than food, so we wanted to make sure we didn€™t run low
at any time. Therefore, slowly the project morphed into an inventory system for
commercial use in a bar. The project was intended to be adjustable and
convenient for any bar.
Some background math was necessary, because we wanted the
system to be practical. It is not practical for users of the system to know the
exact mass of a liquor bottle, so a scheme was developed that would require just
an empty bottle and a full bottle to calculate both a minimum and maximum
€œweight€¯ for the bottles. The weights were actually just the values obtained
from the ADC, since actual mass units were not necessary. These extrema allowed
us to calculate percentages:
Note: The force sensor decreases resistance with
increased force, and thus the MinWeight is larger than the
MaxWeight.
One hardware tradeoff dealt with using the UART on the ATMEL
Mega16L microcontroller on the receiver side. The UART had to be reserved for
serial communication with a HyperTerminal, so it could not be used to aid in the
wireless communication. This also affected the software, because the necessary
code for RF transmission became rather tedious and extremely specialized.
The largest tradeoff we had involved communication with a
television display. Initially we wanted to be able to display the inventory
status on a TV screen, but there were so many synchronization issues involving
the RF transmission (which itself had its own timing issues because it was
transmitting two different pieces of information) and the serial communication.
The main problem was that since we couldn't use UART for wireless transmission,
we needed to manually transmit bits on the order of 1 per millisecond, which is
much faster than the clock used for the TV. So, to implement both the wireless
and the TV, we would need two timer interrupts: one for the TV and one for
wireless. This turns out to be impossible at the level of accuracy required for
both of these devices, since multiple interrupts cannot be processed at the same
time. It also would affect our budget since we would be required to use a Mega32
as opposed to a cheaper Mega16. Finally, we decided that the output could just
easily be outputted onto HyperTerminal without really taking away from the
visual experience, because it was primarily a text display.
The final project block diagram can be found in Appendix B.
Because we are using RF transmission, we are required to
comply with the FCC regulations described in Title 47, Chapter 1, Part 15.
Quoting from Section 15.5(b), €œOperation of [a]€¦radiator is subject to the
conditions that no harmful interference is caused and that interference must be
accepted that may be caused by the operation of an authorized€¦radiator.€¯ Also,
since our device is a home-built device (i.e. it€™s not marketed, constructed
from a kit, or built in quantities greater than 5, and is for personal use), we
are not required to get a license for operation and meet regulations exactly.
We are, however, required to €œemploy good engineering practices€¯
(47CFR15.23).
We are not aware of any
inventory system for a bar, and we don€™t know of any copyright and trademarks
that we are infringing upon. We do however say that any pictures involving
alcohol bottles are trademarks of their respective liquor companies, however,
the pictures are copyrighted to us.
In building the inventory system, we used a force sensor to
obtain the weight of a bottle. The bottle rests on a stand which pushes down on
the force sensor and varies the resistance between its two leads. This variable
resistance was then translated into a variable voltage using a simple voltage divider circuit.
Resistors with a ratio of 5:1 were used in the divider to allow the voltage
swing to be reasonable. This voltage is fed into the analog-to-digital
converter (ADC) of an ATMEL Mega163 microcontroller, therefore we need the input
swing to be large enough to interact with the internal voltage reference of the
ADC.
There were two bottle stations so we had two inputs into the ADC, but only
one output, which was controlled by the ADMUX register on the MCU. There was a
slight hurdle with this: if the ADMUX register was changed while a conversion
was occurring, there we be incorrect operation. To correct this, we had to look
at the ADIF bit in the ADCSR register. When ADIF is high, the conversion is
complete, and so we can then change the value of ADMUX.
The ADC output was then encoded and sent to a transmitter operating at 433
MHz. The transmitter used a choke inductor and blocking capacitor to the power
supply from the PC board power supply to allow for a larger range on
transmission. The choke inductor helps to eliminate power supply noise, and
allows for a more DC stable power supply into the transmitter. The choke
inductor was just wire wrapped around a regular pen to create an inductor on the
order of μH. I also placed a blocking capacitor between the antenna output and
the antenna, which was a quarter wave length (‰ˆ17
cm) piece of wire. Since the receiver takes some time to turn on, we
first transmit 4 €˜a€™s followed by a start bit (2 1's) to indicate the start of
data. A Manchester encoding scheme was used for the data to allow for the
receiver to keep the correct auto-gain settings. The receiver will increase and
decrease its gain depending on whether or not it received a lot of 0s or 1s.
Therefore, over a given number of bits, we want the numbers of 0s and 1s to be
the same. Manchester encoding is a simple way to do this since each bit is
encoded into 2 bits€”one 1 and one 0. Though Manchester encoding is a bit
conservative, we transmit so little data that we could be lax on this.
Furthermore, Manchester encoding provides additional data integrity checks,
which allow the receiver to be quite confident that the data obtained is what
the transmitter sent.
Transmission was complicated because it had to transmit from
two different bottle stations. So, each transmission included start sequences,
bottle station identifiers, and weight values. This complexity made the
expandability of the system convenient because bottle stations transmit
independently (rather than, say, transmitting information about both bottles in
one chunk). It does not matter when a transmission is sent, just that it is sent
at all. To add more bottle stations, no additional work needs to be done with
respect to the transmission units. We also have a delay between transmissions,
so we won€™t have to worry about the transmissions running into each other on the
receiver side.
To further complicate things, we were unable to use the UART
for RF transmission, since it had to be reserved for serial communication to a
computer on the receiver end. Since we would only be allowed to use the UART on
one end, we felt it would be easier to not use it on both the transmitter and
receiver sides.
The receiver, contained on its own custom PC board, then
passed the data to an ATMEL Mega16L microcontroller. The MCU does various
checks on the data before it can accept it as valid. First, it must check for a
minimum of 4 €˜a€™s (alternating high and low), and once it recognizes the start
bit, the MCU stores the data into a transmit_buffer. While the MCU is
receiving data, it is checking for Manchester encoding (i.e. checking to see if
the odd-index bits received are the complement of the event bits). This allows
us to ignore transmissions that may have lost a bit in communication or garbage
received due to random noise or other transmitting devices. Once the data
passes checking, the MCU decodes it, and updates the inventory. However, we
don€™t want the inventory to update if a bottle is removed from a station to be
poured into a glass. To prevent this update, if a bottle station receives a
weight that is less than the empty bottle weight, the current weight will not be
updated.
The MCU also contains the user interface which interacts with
the HyperTerminal. There was a menu with functional commands including: 1)
programming a bottle station, 2) adding a bottle selection, 3) removing a bottle
selection, 4) checking the inventory, 5) displaying the bottle list, and 6)
resetting all the settings. A detailed list of the functions is as follows:
1) Program a bottle station: Programs one of the
weight stations with a bottle chosen from the bottle list with preprogrammed
bottles. A bottle can also be removed from the station.
2) Add a bottle type: Adds a type of bottle to the
existing bottle list. This can only be done on the designated program station
and requires both an empty and a full bottle. This way both a minimum and
maximum weight can be obtained to calculate weight percentages with various
liquid levels. A maximum volume is also prompted to enable shot calculation
(calculate number of shots remaining).
3) Remove a bottle type: Removes a bottle from the
existing bottle list. This allows one bottle to be removed at a time, as
opposed to resetting all settings. This also warns the user if they delete a
bottle which is currently programmed onto a station, but it still allows
removal.
4) Check the inventory status: Displays the
remaining percentage in each bottle as well as the number of shots remaining in
the bottle.
5) Display the bottle list: Displays the existing
bottle list.
6) Reset all settings: This command is necessary
since we save the bottle list along with programmed bottle stations in EEPROM.
There was one minor detail involving EEPROM because you can€™t
store pointers in EEPROM. This meant we were unable to use sprintf, which is typically used for
copying character arrays. We solved this by creating our own character array
copier that copies characters one by one into a separate character
array.
As mentioned above, we initially tried to use the TV as a
display, but were unsuccessful. We also tried to improve the accuracy of the
inventory with an exponential decay weighting scheme to make weight readings
more accurate and stabilize faster. This didn€™t really work, because it just
made the stabilization take longer, since older values were incorrect and should
simply be replaced with new readings.
We are pleased to say that we managed to get the project to
work and function as intended. There are some time delays with bottle
calibration, because adding a bottle requires a long time period for accurate
readings. However, this is not too inconvenient in a real life setting, because
the bottle needs only to be calibrated once.
The accuracy is not always consistent because of settling
time on the force sensor. However, the longer time waited for bottle
calibration, the better the accuracy. Also, we noticed that the sensor
sensitivity varied for different weights, which affected accuracy. This was
unexpected since the data sheet showed a linear resistance vs. mass
relationship.
To our joy, RF Transmission was very accurate. Because of our thorough data
checks, invalid data was hardly ever accepted, and if it was, it was completely
replaced with the next transmission. We transmitted every half a second, so
updating was accurate enough for practical application.
(1) According to the surgeon general, women should not drink
alcoholic beverages during pregnancy because of the risk of birth defects. (2)
Consumption of alcoholic beverages impairs your ability to drive a car or
operate heavy machinery, and may cause health problems.
We also do not condone underage drinking.
Since liquid is involved in this project, we had to ensure the electronics
would not be harmed and cause electrocution. Since in a real life situation, a
bartender may spill while pouring, the exterior of a bottle may get wet so the
weight stations have a plastic top to save the force sensor from getting wet.
Ideally we would also want to encase the transmitter PC board, however I was not
able to dig around my room enough to find something that would work and not
interfere with RF communication.
Though we did not try to transmit and receive while others were transmitting,
it is possible that our project may not receive accurate readings as often as it
normally would. The MCU will still ignore data that is not valid, which is
likely to occur with interference, so the inventory should not alter
dramatically. However, this was never actually tested.
Usability was an important feature of the project because we wanted it to be
useful in a practical application. The user interface is easy to use and
incorporates many functions. Also the method of programming a bottle was
designed to allow for little knowledge necessary of the actual bottle.
The design met our expectations, however the accuracy was a
little random because of the pressure sensors. The RF transmission worked
better than expected, mostly due to data validation. The user terminal was very
reliable and allowed for mistakes to be corrected without resetting the
program. Also, terminal use is non-blocking with the inventory updating. Next
time, we might use more than one pressure sensor for each bottle station to
improve accuracy. Or, we may try to find a different way of sensing pressure
that used a different type of sensor.
1. ...to be honest and realistic in
stating claims or estimates based on available data;
We
honestly state the results of our project by reporting both the good points and
the bad points.
2. ...to reject bribery in all its
forms;
We will openly share our design with anyone who
requests information and wants to replicate the project. We will accept
donations, but not bribes.
3. ...to seek, accept, and offer
honest criticism of technical work, to acknowledge and correct errors, and to
credit properly the contributions of others;
We will
definitely accept any criticism of the project, especially if it is paired with
suggestions for improvement on the design. Credit would be given to the proper
sources of information.
4. ...to avoid injuring others, their
property, reputation, or employment by false or malicious
action;
We don€™t intend harm on anyone or their
employment. Therefore we warn everyone that alcohol may impair your judgment
and should not be consumed excessively.
5. ...to assist colleagues and
co-workers in their professional development and to support them in following
this code of ethics.
We gladly assist colleagues in the
common goal of learning and applying knowledge gained in a practical design.

Final Project Block Diagram

Voltage Divider Circuit

Transmitter Pinout and Circuitry
We came just under budget, however we could have saved on power
had we attached batteries instead of using power supplies. We also could have
saved money by sampling earlier than we did
|
Part |
Quantity |
Price |
|
Force Sensor |
2 |
$9.50 ($4.75
each) |
|
ATMEL
Mega16L |
1 |
$5 |
|
ATMEL
Mega163 |
1 |
$2 |
|
Custom PC
Board |
1 |
$5 |
|
Custom PC Board w/
RS232 |
1 |
$10 |
|
Power Supply |
2 |
$10 |
|
Transmitter/Receiver
Pair |
1 |
$8 |
|
White Boards |
2 |
Free (previously
owned) |
|
Pepsi Bottle
Caps |
6 |
Free (previously
owned) |
|
Cheap Cutting
Board |
1 |
Free (previously
owned) |
|
Bottles |
3 |
Free (previously
owned) |
|
Personal Computer w/
HyperTerminal |
1 |
Free (previously owned) |
|
|
Total: |
$49.50 |
We both worked on everything simultaneously. However, Adam
has more knowledge into the exact inner workings of the code, whereas Tania has
more knowledge of the operation of the hardware. Though we both understand all
aspects of the design.
ECE 476 Final Project: Demolition RC car, http://instruct1.cit.cornell.edu/courses/ee476/FinalProjects/s2004/cml45/webpage/index.html
by Christopher Lehmann, Steve Lowe, and Daren Zou