hexagon5un / AVR-Programming

Code examples for the book "Make: AVR Programming"
http://littlehacks.org/AVR-Programming
MIT License
725 stars 340 forks source link

python code updated to python 3 #46

Open dComposer opened 3 years ago

dComposer commented 3 years ago

I updated autoPlay.py (Chapter 5, serialOrgan) for python 3 (and skipped the serialorgansongs.jottit.com lines since that site no longer exists) and added some notes for figuring out the current serial port. Thanks so much for this wonderful book!

## Scripting in python to drive the serial-port organ

## So far, the "protocol" is simple.  
## Python routine sends a note, waits for a return character, then sends next, etc.
## Organ listens for notes, when it gets one sends an 'N' to say it's ready

import serial

def playString(noteString, serialPort):
  for letter in noteString:
    print(letter)
    serialPort.write(letter.encode())
    returnValue = serialPort.read(1)

if __name__ == "__main__":

  import time
  from urllib.request import urlopen

  ## Need to consider alternatives for Mac / Windows
  ## list all serial ports being used: python -m serial.tools.list_ports
  PORT = "/dev/cu.usbserial-14130" # Change this to the current serial port being used
  BAUD = 9600

  s = serial.Serial(PORT, BAUD)
  s.flush()                     
  ## flush clears the buffer so that we're starting fresh
  ## More on serial buffers later.

  ## An intentional example.  You can use this for playing music on purpose.
  playString("f g h j k l ; ]'[", s)
  input("Press enter for next demo\n")

  ## A fun / stupid example.  You can just type stuff and see what comes out.
  playString("hello there, this is a random string turned into 'music'", s)
  input("Press enter for next demo\n")

  ## Website no longer alive... skipping:
  ## A really frivolous example.  Play websites!
  ## Bonus points for first person to tweet themselves a song.
  #print ("Downloading song data from http://serialorgansongs.jottit.com/...")
  #import re
  #contentFilter = re.compile(r'<p>(.*?)</p>')
  #songSite = urlopen("http://serialorgansongs.jottit.com/").read()
  #songText = contentFilter.findall(songSite)[0]
  #playString(songText, s)

  ## Or interactive
  mySong = input("\nType in your own song: ")
  playString(mySong, s)
dComposer commented 3 years ago

I updated Chapter 6's bossButton.py for python 3. The only changes were to add the parenthesis to the print statements and to change the response logic from: if response = 'X' to: if response = b'X'


## Simple demo
## Sits forever listening to serial port
## When you press button, opens website of your choosing.
## Extend this to many buttons and you'll have a physical
##  web-launcher.  

BOSS_SITE = "http://www.cartalk.com/content/boss-redirect"
## or perhaps more topical...
XKCD = "http://xkcd.com/353/"

## list all serial ports being used: python -m serial.tools.list_ports
SERIAL_PORT = "/dev/cu.usbserial-14130"
BAUD_RATE = 9600

import serial
import webbrowser

sp = serial.Serial(SERIAL_PORT, BAUD_RATE, timeout = 5)
sp.flush()
print("Boss Button")

while(1):                 # Sit and wait forever
    response = sp.read(1) # get one byte
    if response == b'O':
        print("Got OK Byte.  Waiting for button press.")
    elif response == b'X':
        print("Got Boss Byte!  Alarm!")
        webbrowser.open(BOSS_SITE)
    else:
        print("Got nothing.  Still waiting.")
dComposer commented 3 years ago

Chapter 7's serialScope.py updated for python 3:


import serial

def readValue(serialPort):
    return(ord(serialPort.read(1)))

def plotValue(value):
    """ Displays the value on a scaled scrolling bargraph"""
    leadingSpaces = "-" * int(value*(SCREEN_WIDTH-3) / 255)
    print(f"{leadingSpaces} {value:03}")

def cheapoScope(serialPort):
    while(1):
        newValue = readValue(serialPort)
        plotValue(newValue)

if __name__ == "__main__":
    ## list all serial ports being used: python -m serial.tools.list_ports
    PORT = '/dev/cu.usbserial-14230' # update to whatever port is listed in serial.tools.list_ports
    BAUDRATE =  9600
    TIMEOUT = None
    SCREEN_WIDTH = 80

    ## Take command-line arguments to override defaults above
    import sys
    if len(sys.argv) == 3:
        port = sys.argv[1]
        baudrate = int(sys.argv[2])
    else:                        # nothing passed, use defaults 
        print ("Optional arguments port, baudrate set to defaults.")
        port, baudrate = (PORT, BAUDRATE)

    serialPort = serial.Serial(port, baudrate, timeout=TIMEOUT)
    serialPort.flush()
    cheapoScope(serialPort)
hexagon5un commented 3 years ago

Hiya! That's lovely! I'll roll those into the code.

(I haven't been doing as much maintenance on this codebase as I probably should. Thanks for helping out.)

dComposer commented 3 years ago

My pleasure! As I convert more python code over I'll post them into this issue. Thanks for writing this great book!