Skip to content

Commit 7c04b66

Browse files
authored
Merge pull request #1869 from kattni/ano-encoder
Code for rotary encoder guide.
2 parents 93876c0 + bd602ba commit 7c04b66

File tree

4 files changed

+167
-1
lines changed

4 files changed

+167
-1
lines changed

.pylintrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ confidence=
5252
# no Warning level messages displayed, use"--disable=all --enable=classes
5353
# --disable=W"
5454
# disable=import-error,print-statement,parameter-unpacking,unpacking-in-except,old-raise-syntax,backtick,long-suffix,old-ne-operator,old-octal-literal,import-star-module-level,raw-checker-failed,bad-inline-option,locally-disabled,locally-enabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,apply-builtin,basestring-builtin,buffer-builtin,cmp-builtin,coerce-builtin,execfile-builtin,file-builtin,long-builtin,raw_input-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,no-absolute-import,old-division,dict-iter-method,dict-view-method,next-method-called,metaclass-assignment,indexing-exception,raising-string,reload-builtin,oct-method,hex-method,nonzero-method,cmp-method,input-builtin,round-builtin,intern-builtin,unichr-builtin,map-builtin-not-iterating,zip-builtin-not-iterating,range-builtin-not-iterating,filter-builtin-not-iterating,using-cmp-argument,eq-without-hash,div-method,idiv-method,rdiv-method,exception-message-attribute,invalid-str-codec,sys-max-int,bad-python3-import,deprecated-string-function,deprecated-str-translate-call
55-
disable=too-many-instance-attributes,len-as-condition,too-few-public-methods,anomalous-backslash-in-string,no-else-return,simplifiable-if-statement,too-many-arguments,duplicate-code,no-name-in-module,no-member,print-statement,parameter-unpacking,unpacking-in-except,old-raise-syntax,backtick,long-suffix,old-ne-operator,old-octal-literal,import-star-module-level,raw-checker-failed,bad-inline-option,locally-disabled,locally-enabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,apply-builtin,basestring-builtin,buffer-builtin,cmp-builtin,coerce-builtin,execfile-builtin,file-builtin,long-builtin,raw_input-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,no-absolute-import,old-division,dict-iter-method,dict-view-method,next-method-called,metaclass-assignment,indexing-exception,raising-string,reload-builtin,oct-method,hex-method,nonzero-method,cmp-method,input-builtin,round-builtin,intern-builtin,unichr-builtin,map-builtin-not-iterating,zip-builtin-not-iterating,range-builtin-not-iterating,filter-builtin-not-iterating,using-cmp-argument,eq-without-hash,div-method,idiv-method,rdiv-method,exception-message-attribute,invalid-str-codec,sys-max-int,bad-python3-import,deprecated-string-function,deprecated-str-translate-call,import-error,missing-docstring,invalid-name,bad-whitespace,consider-using-enumerate,unexpected-keyword-arg
55+
disable=too-many-instance-attributes,len-as-condition,too-few-public-methods,anomalous-backslash-in-string,no-else-return,simplifiable-if-statement,too-many-arguments,duplicate-code,no-name-in-module,no-member,print-statement,parameter-unpacking,unpacking-in-except,old-raise-syntax,backtick,long-suffix,old-ne-operator,old-octal-literal,import-star-module-level,raw-checker-failed,bad-inline-option,locally-disabled,locally-enabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,apply-builtin,basestring-builtin,buffer-builtin,cmp-builtin,coerce-builtin,execfile-builtin,file-builtin,long-builtin,raw_input-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,no-absolute-import,old-division,dict-iter-method,dict-view-method,next-method-called,metaclass-assignment,indexing-exception,raising-string,reload-builtin,oct-method,hex-method,nonzero-method,cmp-method,input-builtin,round-builtin,intern-builtin,unichr-builtin,map-builtin-not-iterating,zip-builtin-not-iterating,range-builtin-not-iterating,filter-builtin-not-iterating,using-cmp-argument,eq-without-hash,div-method,idiv-method,rdiv-method,exception-message-attribute,invalid-str-codec,sys-max-int,bad-python3-import,deprecated-string-function,deprecated-str-translate-call,import-error,missing-docstring,invalid-name,bad-whitespace,consider-using-enumerate,unexpected-keyword-arg,consider-using-f-string
5656

5757
# Enable the message, report, category or checker with the given id(s). You can
5858
# either give multiple identifier separated by comma (,) or put this option

ANO_Rotary_Encoder/ANO_Rotary_Encoder_NeoPixel_Arduino_Example/.feather_m4_express.test.only

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
// SPDX-FileCopyrightText: 2021 Kattni Rembor for Adafruit Industries
2+
//
3+
// SPDX-License-Identifier: MIT
4+
5+
#include <Adafruit_NeoPixel.h>
6+
#include <RotaryEncoder.h>
7+
8+
#define PIN_ENCODER_A 13
9+
#define PIN_ENCODER_B 12
10+
#define COM_A 11
11+
#define COM_B SDA
12+
#define BUTTON_UP 5
13+
#define BUTTON_LEFT SCL
14+
#define BUTTON_DOWN 9
15+
#define BUTTON_RIGHT 6
16+
#define BUTTON_IN 10
17+
18+
RotaryEncoder encoder(PIN_ENCODER_A, PIN_ENCODER_B, RotaryEncoder::LatchMode::TWO03);
19+
// This interrupt will do our encoder reading/checking!
20+
void checkPosition() {
21+
encoder.tick(); // just call tick() to check the state.
22+
}
23+
int last_rotary = 0;
24+
25+
26+
#define NUMPIXELS 12
27+
Adafruit_NeoPixel pixels(NUMPIXELS, A0, NEO_GRB + NEO_KHZ800);
28+
29+
30+
void setup(void) {
31+
Serial.begin(115200);
32+
while (!Serial);
33+
Serial.println("ANO Rotary Encoder Demo");
34+
35+
pinMode(COM_A, OUTPUT);
36+
digitalWrite(COM_A, LOW);
37+
pinMode(COM_B, OUTPUT);
38+
digitalWrite(COM_B, LOW);
39+
40+
attachInterrupt(PIN_ENCODER_A, checkPosition, CHANGE);
41+
attachInterrupt(PIN_ENCODER_B, checkPosition, CHANGE);
42+
43+
pinMode(BUTTON_UP, INPUT_PULLUP);
44+
pinMode(BUTTON_DOWN, INPUT_PULLUP);
45+
pinMode(BUTTON_LEFT, INPUT_PULLUP);
46+
pinMode(BUTTON_RIGHT, INPUT_PULLUP);
47+
pinMode(BUTTON_IN, INPUT_PULLUP);
48+
pixels.begin();
49+
pixels.setBrightness(30);
50+
pixels.show();
51+
}
52+
53+
54+
void loop(void) {
55+
// read encoder
56+
int curr_rotary = encoder.getPosition();
57+
RotaryEncoder::Direction direction = encoder.getDirection();
58+
59+
pixels.clear();
60+
if (curr_rotary != last_rotary) {
61+
Serial.print("Encoder value: ");
62+
Serial.print(curr_rotary);
63+
Serial.print(" direction: ");
64+
Serial.println((int)direction);
65+
}
66+
last_rotary = curr_rotary;
67+
68+
pixels.setPixelColor((curr_rotary + (1000*NUMPIXELS)) % NUMPIXELS, pixels.Color(0, 150, 0));
69+
70+
if (! digitalRead(BUTTON_UP)) {
71+
pixels.setPixelColor(0, pixels.Color(150, 0, 0));
72+
}
73+
if (! digitalRead(BUTTON_LEFT)) {
74+
pixels.setPixelColor(NUMPIXELS/4, pixels.Color(150, 0, 0));
75+
}
76+
if (! digitalRead(BUTTON_DOWN)) {
77+
pixels.setPixelColor(NUMPIXELS/2, pixels.Color(150, 0, 0));
78+
}
79+
if (! digitalRead(BUTTON_RIGHT)) {
80+
pixels.setPixelColor(NUMPIXELS*3/4, pixels.Color(150, 0, 0));
81+
}
82+
if (! digitalRead(BUTTON_IN)) {
83+
pixels.fill(pixels.Color(50, 50, 50));
84+
}
85+
pixels.show();
86+
87+
delay(20);
88+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
# SPDX-FileCopyrightText: 2021 Kattni Rembor for Adafruit Industries
2+
#
3+
# SPDX-License-Identifier: MIT
4+
5+
"""
6+
CircuitPython ANO Rotary Encoder and NeoPixel Ring example.
7+
"""
8+
import board
9+
import digitalio
10+
import rotaryio
11+
import neopixel
12+
13+
# The pin assignments for the breakout pins. Update this is you are not using a Feather.
14+
ENCA = board.D13
15+
ENCB = board.D12
16+
COMA = board.D11
17+
SW1 = board.D10
18+
SW2 = board.D9
19+
SW3 = board.D6
20+
SW4 = board.D5
21+
SW5 = board.SCL
22+
COMB = board.SDA
23+
24+
# Rotary encoder setup
25+
encoder = rotaryio.IncrementalEncoder(ENCA, ENCB)
26+
last_position = None
27+
28+
# NeoPixel ring setup. Update num_pixels if using a different ring.
29+
num_pixels = 12
30+
pixels = neopixel.NeoPixel(board.A0, num_pixels, auto_write=False)
31+
32+
# Set the COMA and COMB pins LOW. This is only necessary when using the direct-to-Feather or other
33+
# GPIO-based wiring method. If connecting COMA and COMB to ground, you do not need to include this.
34+
com_a = digitalio.DigitalInOut(COMA)
35+
com_a.switch_to_output()
36+
com_a = False
37+
com_b = digitalio.DigitalInOut(COMB)
38+
com_b.switch_to_output()
39+
com_b = False
40+
41+
# Button pin setup
42+
button_pins = (SW1, SW2, SW3, SW4, SW5)
43+
buttons = []
44+
for button_pin in button_pins:
45+
pin = digitalio.DigitalInOut(button_pin)
46+
pin.switch_to_input(digitalio.Pull.UP)
47+
buttons.append(pin)
48+
49+
while True:
50+
position = encoder.position
51+
if last_position is None or position != last_position:
52+
print("Position: {}".format(position))
53+
last_position = position
54+
55+
pixels.fill((0, 0, 0))
56+
pixels[position % num_pixels] = (0, 150, 0)
57+
58+
if not buttons[0].value:
59+
print("Center button!")
60+
pixels.fill((100, 100, 100))
61+
62+
if not buttons[1].value:
63+
print("Up button!")
64+
pixels[0] = (150, 0 ,0)
65+
66+
if not buttons[2].value:
67+
print("Left button!")
68+
pixels[3] = (150, 0, 0)
69+
70+
if not buttons[3].value:
71+
print("Down button!")
72+
pixels[6] = (150, 0, 0)
73+
74+
if not buttons[4].value:
75+
print("Right button!")
76+
pixels[9] = (150, 0, 0)
77+
78+
pixels.show()

0 commit comments

Comments
 (0)