Linux Format forums Forum Index Linux Format forums
Help, discussion, magazine feedback and more
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Another Python Freebie, DC_IN.py...

 
Post new topic   Reply to topic    Linux Format forums Forum Index -> Programming
View previous topic :: View next topic  
Author Message
Bazza
LXF regular


Joined: Sat Mar 21, 2009 11:16 am
Posts: 1462
Location: Loughborough

PostPosted: Sun Dec 04, 2011 3:01 pm    Post subject: Another Python Freebie, DC_IN.py... Reply with quote

Hi all...

I recently uploaded this to <http://code.activestate.com/> and thought I
would share it with you lot... Another bit of my lateral thinking and has
opened up new avenues for experiment like a text mode Python Audio
I/O Modem using the audio socket(s) on my netbook, notebook and
laptop, a la Sinclair Spectrum Load/Save modem... ;o)

Watch for word wrapping etc...

Code:

# 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.

_________________
73...

Bazza, G0LCU...

Team AMIGA...
Back to top
View user's profile Send private message
View previous topic :: View next topic  
Display posts from previous:   
Post new topic   Reply to topic    Linux Format forums Forum Index -> Programming All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
Linux Format forums topic RSS feed 


Powered by phpBB © 2001, 2005 phpBB Group


Copyright 2011 Future Publishing, all rights reserved.


Web hosting by UKFast