-
Notifications
You must be signed in to change notification settings - Fork 0
/
picoboard.py
111 lines (77 loc) · 2.88 KB
/
picoboard.py
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
"""pypicoboard
Python library for using the Scratch PicoBoard. Scratch has built in support
for the PicoBoard. more information about the PicoBoard may be found here:
https://wiki.scratch.mit.edu/wiki/PicoBoard
Project page:
https://github.com/drewarnett/pypicoboard
Note: this library Python2 and Python3 compatible.
Prerequisites:
* pyserial
"""
from __future__ import print_function
import struct
import serial
_SCRATCH_DATA_REQUEST = 1
_CHANNEL_NUMBERS_PER_NAME = {
"D": 0,
"C": 1,
"B": 2,
"button": 3,
"A": 4,
"light": 5,
"sound": 6,
"slider": 7
}
_CHANNEL_NAMES_PER_CHANNEL = {
value: key for key, value in _CHANNEL_NUMBERS_PER_NAME.items()}
_ID_CHANNEL_RESPONSE = (15, 4)
CHANNEL_NAMES = tuple(sorted(_CHANNEL_NUMBERS_PER_NAME.keys()))
class PicoBoard(object):
"""PicoBoard interface object
Example use:
>>> from picoboard import PicoBoard
>>> pb = PicoBoard('/dev/ttyUSB0') # or 'COM1' or '/dev/ttyS0', etc.
>>> readings = pb.read()
>>> print(readings["button"])
"""
def __init__(self, serial_port):
"""connect to PicoBoard using given serial port
UNIX example: /dev/ttyUSB0
MS Windows example: COM1
"""
self._interface = serial.Serial(serial_port, 38400, timeout=0.1)
self._interface.flushInput()
self.ser = serial_port
def read(self):
"""reads the PicoBoard sensors once and returns a readings dictionary
key: channel name
A - resistance sensor A
B - resistance sensor B
C - resistance sensor C
D - resistance sensor D
button - button sensor
light - light sensor
slider - slider sensor
sound - sound sensor
value: value from PicoBoard sensor
"""
def readchannel():
"""read and parse once channel worth of response data
returns (channel, value)
"""
data = self._interface.read(2)
upper_byte, lower_byte = struct.unpack('>BB', data)
#assert (upper_byte >> 7) & 1 == 1, (upper_byte, lower_byte)
#assert (lower_byte >> 7) & 1 == 0, (upper_byte, lower_byte)
channel = (upper_byte >> 3) & 0xf
value = ((upper_byte & 0x7) << 7) | ((lower_byte & 0x7f) << 0)
return (channel, value)
self._interface.flushInput()
self._interface.write(struct.pack('B', _SCRATCH_DATA_REQUEST))
id_channel_response = readchannel()
assert id_channel_response == _ID_CHANNEL_RESPONSE, id_channel_response
rval = dict()
for i in range(8):
channel, value = readchannel()
rval[_CHANNEL_NAMES_PER_CHANNEL[channel]] = value
return rval