Skip to content

Commit 489d06c

Browse files
authored
Merge pull request #2029 from caternuson/knob_sketcher
Add knob sketch code
2 parents a9b2066 + e12b023 commit 489d06c

File tree

1 file changed

+116
-0
lines changed
  • CircuitPython_Knob_Sketcher/feather_sketcher

1 file changed

+116
-0
lines changed
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
# SPDX-FileCopyrightText: 2022 Carter Nelson for Adafruit Industries
2+
#
3+
# SPDX-License-Identifier: MIT
4+
5+
#
6+
# Dual Knob Sketcher
7+
#
8+
9+
import time
10+
import board
11+
import displayio
12+
import digitalio
13+
import analogio
14+
import adafruit_ili9341
15+
from simpleio import map_range
16+
17+
#--| User Config |---------------------------------------------------
18+
SKETCH_SCALE = 3
19+
DRAW_COLOR = 0xFFFFFF
20+
BACKGROUND_COLOR = 0x000000
21+
PEN_UP_COLOR = 0xFF0000
22+
PEN_DOWN_COLOR = 0x00FF00
23+
KNOB_READS = 10
24+
KNOB_DELAY = 0.001
25+
#--| User Config |---------------------------------------------------
26+
27+
# Feather M4 + 2.4" TFT FeatherWing setup
28+
DISPLAY_WIDTH = 320
29+
DISPLAY_HEIGHT = 240
30+
SKETCH_WIDTH = DISPLAY_WIDTH // SKETCH_SCALE
31+
SKETCH_HEIGHT = DISPLAY_HEIGHT // SKETCH_SCALE
32+
PEN_SWITCH = board.D12
33+
CLEAR_BUTTON = board.D11
34+
X_KNOB = board.A0
35+
Y_KNOB = board.A1
36+
37+
# set up knobs
38+
x_knob = analogio.AnalogIn(X_KNOB)
39+
y_knob = analogio.AnalogIn(Y_KNOB)
40+
41+
# set up button
42+
clear_button = digitalio.DigitalInOut(CLEAR_BUTTON)
43+
clear_button.switch_to_input(pull=digitalio.Pull.UP)
44+
45+
# set up pen up/down switch
46+
pen_switch = digitalio.DigitalInOut(PEN_SWITCH)
47+
pen_switch.switch_to_input(pull=digitalio.Pull.UP)
48+
49+
# set up display
50+
displayio.release_displays()
51+
52+
spi = board.SPI()
53+
tft_cs = board.D9
54+
tft_dc = board.D10
55+
tft_rst = board.D6
56+
display_bus = displayio.FourWire(
57+
spi, command=tft_dc, chip_select=tft_cs, reset=tft_rst
58+
)
59+
display = adafruit_ili9341.ILI9341(display_bus, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT)
60+
61+
# add base UI element
62+
splash = displayio.Group(scale=SKETCH_SCALE)
63+
display.show(splash)
64+
65+
# add sketch
66+
sketch_bitmap = displayio.Bitmap(SKETCH_WIDTH, SKETCH_HEIGHT, 2)
67+
sketch_palette = displayio.Palette(2)
68+
sketch_palette[0] = BACKGROUND_COLOR
69+
sketch_palette[1] = DRAW_COLOR
70+
sketch = displayio.TileGrid(sketch_bitmap, pixel_shader=sketch_palette, x=0, y=0)
71+
splash.append(sketch)
72+
73+
# add pen cursor
74+
pen_bitmap = displayio.Bitmap(3, 3, 2)
75+
pen_palette = displayio.Palette(2)
76+
pen_palette[0] = BACKGROUND_COLOR
77+
pen_palette[1] = PEN_DOWN_COLOR
78+
CURSOR = (
79+
1, 1, 1,
80+
1, 0, 1,
81+
1, 1, 1,
82+
)
83+
for i, value in enumerate(CURSOR):
84+
pen_bitmap[i] = value
85+
pen = displayio.TileGrid(pen_bitmap, pixel_shader=pen_palette)
86+
splash.append(pen)
87+
88+
# helper to average analog knob readings
89+
def read_knobs(reads, delay):
90+
avg_x = avg_y = 0
91+
for _ in range(reads):
92+
avg_x += x_knob.value
93+
avg_y += y_knob.value
94+
time.sleep(delay)
95+
avg_x /= reads
96+
avg_y /= reads
97+
xx = map_range(avg_x, 0, 65535, 0, SKETCH_WIDTH - 1)
98+
yy = map_range(avg_y, 0, 65535, 0, SKETCH_HEIGHT - 1)
99+
return int(xx), int(yy)
100+
101+
#-------
102+
# MAIN
103+
#-------
104+
while True:
105+
while clear_button.value:
106+
x, y = read_knobs(KNOB_READS, KNOB_DELAY)
107+
pen.x = x - 1
108+
pen.y = y - 1
109+
if pen_switch.value:
110+
# PEN DOWN
111+
pen_palette[1] = PEN_DOWN_COLOR
112+
sketch_bitmap[x, y] = 1
113+
else:
114+
# PEN UP
115+
pen_palette[1] = PEN_UP_COLOR
116+
sketch_bitmap.fill(0)

0 commit comments

Comments
 (0)