Welcome, guest | Sign In | My Account | Store | Cart
# DC_IN.py
#
# This DEMO shows how to get DC, (Direct Current), into a computer without
# the need for Integrated Cirduits, USB, Serial, Parallel etc, etc...
# It is used in this code as a very simple Logic Probe that will give some
# indication of a Logic 0, 1 or indeterminate. Only the external microphone input
# is required. "/dev/dsp" IS required so install "oss-compat" from your distro's
# repository if you do not have "/dev/dsp"...
# Ensure the sound system is not in use, and, use the OS's mixing facilities to
# set any input and output levels...
# Tested on Debian 6.0.0 using Python 3.1.3 and PCLinuxOS 2009 using Python 3.2.2.
# (C)2010, B.Walker, G0LCU. Now issued as Public Domain.
# Written in such a way that anyone can understand how it works.
#
# A very simple VCO, (Voltage COntrolled Oscillator), can be found here...
#
# http://www.4qdtec.com/mvbz/vco2.gif
#
# Assume a supply rail of 5 Volts to the VCO along with the circuit of the probe below...
#
# +5 Volt rail on VCO, (Vcc).
#  O-------------------------+
#                            |
#                            | +
#                          --+--
#                       D2. / \
#                          +---+
#                            |
# 1-4 Volt VCO I/P, (Vc).    |
#  O--------o---/\/\/\---o---o---/\/\/\---0 Probe I/P.
#           |     R2.    |         R3.
#  O       <             | +
#  |         >         --+--
#  |   R1. <            / \ D1.
#  |         >         +---+
#  |       <             |
#  |        |            |
#  +--------o------------o-------o--------O -VE.
# 0 Volts.                       |
#                             ---+--- GND.
# Parts List.                 ///////
# -----------
# R1 = 1 MegOhm.
# R2, R3 = 470 Ohms.
# D1, D2 = 1N4148 Diodes.
# All tolerances are wide open.
# Sundries, stripboard, wire, etc...

def main():
       
# Make variables global; my choice... ;o)
       
global record
       
global n
       
global freq
       
global logic
       
global LED
       
global colour
       
# Set the startup values...
        freq
=0
        record
=b"?"
        n
=0
        logic
="0"
       
# Use "H" for this DEMO although the commented out "LED" may look better.
        LED
="H"
       
# LED=chr(0x2588)
        colour
="\033[1;32m"
       
while 1:
               
# Do a 1 second recorded burst...
                audio
=open('/dev/dsp', 'rb')
               
# "record" is the "binary string" to be counted...
                record
=audio.read(8000)
                audio
.close()
               
# Enter another loop to do the count...
                n
=0
                freq
=0
               
while 1:
                       
# A VCO with a mark to space ratio of 1 to 1 will be used for this DEMO,
                       
# so "wait" until a "space" is found.
                       
# (For those that don't know.)
                       
#
                       
#                  +------+      +---
                       
# Square wave:-    | Mark |Space |
                       
#               ---+      +------+
                       
#
                       
# This ensures that the loop cycles when NO input is
                       
# applied to the microphone socket.
                       
# Exit this loop when "mark" is found or n>=8000...
                       
while record[n]<=127:
                                n
=n+1
                               
# Ensure as soon as n>=8000 occurs it drops out of the loop.
                               
if n>=8000: break
                       
# Ensure as soon as n>=8000 occurs it drops completely out of this loop.
                       
if n>=8000: break
                       
# Now the "mark" can loop until a "space" is found again and the whole
                       
# can cycle until n>=8000...
                       
while record[n]>=128:
                                n
=n+1
                               
# Ensure as soon as n>=8000 occurs it drops out of the loop.
                               
if n>=8000: break
                       
# Ensure as soon as n>=8000 occurs it drops completely out of this loop.
                       
if n>=8000: break
                       
# "freq" will become the frequency of a symmetrical waveform
                       
# when the above loops are finally exited, n>=8000...
                       
# Tick up the freq(uency) per "mark to space" cycle.
                        freq
=freq+1
                       
# Just 3 levels are displayed here but with more "if" statements much more
                       
# accuracy and range is easily possible. Also "look up tables" could be used if desired...
                       
# Set colour to Green for Logic 0, Red for Logic 1 and Yellow for indeterminate.
                       
# Logic 1 is approximately greater than 4 Volts.
                       
if freq>=3000:
                                logic
="1"
                               
# Red...
                                colour
="\033[1;31m"
                       
# Logic 0 is approximately less than 1 Volt.
                       
if freq<=300:
                                logic
="0"
                               
# Green...
                                colour
="\033[1;32m"
                       
# Indeterminate is between 1 and 4 Volts and/or a slow oscillation being measured...
                       
if freq>=301 and freq<=2999:
                                logic
="indeterminate"
                               
# Yellow...
                                colour
="\033[1;33m"
               
# An ultra simple clear screen line...
               
# This line is not needed for the demo but added for fullness...
               
print("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n")
               
# Now display the value in the same place on screen every time.
               
# This assumes a 24 or 25 line Python Shell window. Just modify to
               
# suit your particular Shell that you use...
               
print("\033[0m\nSimple DC Input in the guise of a TTL level Logic Probe.\n")
               
print("(C)2010-2011, B.Walker, G0LCU. Issued as Public Domain.\n\n\n")
               
# Print a large coloured square "LED" for quick and easy viewing.
               
for n in range (0,3,1):
                       
print("                                     "+colour+LED+LED+LED+LED+LED+LED)
               
print("\033[0m\n\n\nLogic level is "+colour+logic+"\033[0m...\n\n\n\n\n\n\n\n\n")
main
()
# End of DC_IN.py DEMO.
# Enjoy finding simple solutions to often very difficult problems.

Diff to Previous Revision

--- revision 1 2011-12-02 19:59:41
+++ revision 2 2011-12-04 11:55:44
@@ -27,11 +27,11 @@
 
#                          +---+
 
#                            |
 
# 1-4 Volt VCO I/P, (Vc).    |
-#  O--------o---/\/\/\---o---o---/\/\/\---0 Probe I/P
+#  O--------o---/\/\/\---o---o---/\/\/\---0 Probe I/P.
 
#           |     R2.    |         R3.
 
#  O       <             | +
 
#  |         >         --+--
-#  | * R1. <            / \ D1.
+#  |   R1. <            / \ D1.
 
#  |         >         +---+
 
#  |       <             |
 
#  |        |            |
@@ -56,12 +56,12 @@
       
global colour
       
# Set the startup values...
        freq
=0
-       record="?"
+       record=b"?"
        n
=0
        logic
="0"
       
# Use "H" for this DEMO although the commented out "LED" may look better.
        LED
="H"
-       # LED=unichr(0x2588)
+       # LED=chr(0x2588)
        colour
="\033[1;32m"
       
while 1:
               
# Do a 1 second recorded burst...

History