File: kuttyPy.py

package info (click to toggle)
expeyes 4.8.8%2Brepack-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 85,276 kB
  • sloc: python: 33,528; ansic: 9,754; xml: 1,010; makefile: 828; javascript: 824; sh: 580; asm: 202; php: 1
file content (158 lines) | stat: -rw-r--r-- 3,419 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
import serial, time, platform, sys,struct

VERSION = 99        # uC return this when GETVER is send

GETVER = 1			# Codes for the uC communication
READB  = 2   		
WRITEB = 3        

# Register addresses of ATmega32 micro-controller
TWAR	= 0X22
TWDR	= 0X23
ADCL	= 0X24       # ADC data
ADCH	= 0X25
ADCSRA	= 0X26		# ADC status/control
ADMUX	= 0X27       # ADC channel, reference
ACSR	= 0X28
UBRRL	= 0X29
UCSRB	= 0X2A
UCSRA	= 0X2B
UDR		= 0X2C
SPCR	= 0X2D
SPSR	= 0X2E
SPDR	= 0X2F
PIND	= 0x30       # Port D input
DDRD	= 0x31		# Port D direction
PORTD	= 0x32		# Port D output
PINC	= 0x33
DDRC	= 0x34
PORTC	= 0x35
PINB	= 0x36
DDRB	= 0x37
PORTB	= 0x38
PINA	= 0x39
DDRA	= 0x3A
PORTA	= 0x3B
EECR	= 0X3C
EEDR	= 0X3D
EEARL	= 0X3E
EEARH	= 0X3F

OCR2	= 0X43		# Timer/Counter 2  Output Compare  Reg
TCNT2	= 0X44		# Counter2 
TCCR2	= 0x45		# Timer/Counter 2 control reg
ICR1L	= 0X46
ICR1H	= 0X47
OCR1BL	= 0X48
OCR1BH	= 0X49
OCR1AL	= 0X4A
OCR1AH	= 0X4B
TCNT1L	= 0X4C
TCNT1H	= 0X4D
TCCR1B	= 0X4E
TCCR1A	= 0x4F
SFIOR	= 0X50

TCNT0	= 0x52		# Timer/ Counter 0
TCCR0	= 0x53
MCUCSR	= 0X54
MCUCR	= 0X55
TWCR	= 0X56
SPMCR	= 0X57
TIFR	= 0X58
TIMSK	= 0X59
GIFR	= 0X5A
GICR	= 0X5B
OCR0	= 0x5C
SPL		= 0X5D
SPH		= 0x5E
SREG	= 0X5F

# Register bit definitions
REF_EXT	= 0			# Feed reference voltage externally
REF_INT	= (3<<6)	# use the 2.56 V internal reference
REF_AVCC = (1<<6)	# Connect AVCC internally to reference
ADMAX = 7			# channels 0 to 7 
ADC_SPEED = 7		# ADCClk = (8 MHz/ 128) = 62.5 KHz =>208 usec
ADEN   = 7
ADIF   = 4
ADSC   = 6


#--------------------Function that communicate to ATmega32 -------------------
fd = None
def connectKP(s):  	 # Establish connection to ATmega32 connected to USB port
	global fd
	try:
		fd = serial.Serial(s, 9600, stopbits=1, timeout = 0.1)    #to overcome a possible bug in pyserial
		fd.flush();fd.read(1)									  # not required for all versions
		fd.close()
		
		fd = serial.Serial(s, 38400, stopbits=1, timeout = 1.0)
		if fd == None: 
			return None
		fd.setRTS(0)				# Set the RTS LED ON
		fd.flush()
		fd.write(chr(GETVER))			# Look for kuttyPy signature
		res = fd.read()
		ver = ord(res)
		if ver == VERSION:
			return fd
		else:
			print 'Found port %s, but no kuttyPy on it',s
			return None
	except:
		pass
	#Exception as e:
	#print str(e)
		
def findKP():
	device_list = []
	pf = platform.platform()
	if 'Windows' in pf:	
		for k in range(1,255):
			s = 'COM%d'%k
			device_list.append(s)
		for k in range(1,11):
			device_list.append(k)
	elif 'inux' in pf:	
		device_list = ['/dev/ttyUSB0', '/dev/ttyUSB1', '/dev/ttyACM0','/dev/ttyACM1']
	#print device_list
	for dev in device_list:
		res = connectKP(dev)
		if res != None:
			print 'KuttyPy found on port ',dev
			return res
	

def setReg(reg, data):
	fd.write(chr(WRITEB))
	time.sleep(0.01)
	fd.write(chr(reg))
	time.sleep(0.01)
	fd.write(chr(data))

def getReg(port):
	fd.write(chr(READB))
	time.sleep(0.01)
	fd.write(chr(port))
	val = fd.read()
	return ord(val)

#-----------------------------------------------------------------

def readADC(ch):        # Read the ADC channel
	setReg(ADMUX, REF_INT | ch)
	setReg(ADCSRA, 1 << ADEN | (1 << ADSC) | ADC_SPEED)		# Enable the ADC
	low = getReg(ADCL);
	hi = getReg(ADCH);
	return (hi << 8) | low

#---------------------------------------------------------------------------------------------------

KP = findKP()
if KP == None:
	print 'Hardware NOT detected. Exiting'
	sys.exit(0)