From bd602ba0f4924196e777370995911c56417a226a Mon Sep 17 00:00:00 2001 From: Kattni Rembor Date: Fri, 1 Oct 2021 11:17:46 -0400 Subject: [PATCH] Code for rotary encoder guide. --- .pylintrc | 2 +- .../.feather_m4_express.test.only | 0 ...otary_Encoder_NeoPixel_Arduino_Example.ino | 88 +++++++++++++++++++ .../code.py | 78 ++++++++++++++++ 4 files changed, 167 insertions(+), 1 deletion(-) create mode 100644 ANO_Rotary_Encoder/ANO_Rotary_Encoder_NeoPixel_Arduino_Example/.feather_m4_express.test.only create mode 100644 ANO_Rotary_Encoder/ANO_Rotary_Encoder_NeoPixel_Arduino_Example/ANO_Rotary_Encoder_NeoPixel_Arduino_Example.ino create mode 100644 ANO_Rotary_Encoder/ANO_Rotary_Encoder_NeoPixel_CircuitPython_Example/code.py diff --git a/.pylintrc b/.pylintrc index c88a7fadc..7791f53d2 100644 --- a/.pylintrc +++ b/.pylintrc @@ -52,7 +52,7 @@ confidence= # no Warning level messages displayed, use"--disable=all --enable=classes # --disable=W" # 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 -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 +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 # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option diff --git a/ANO_Rotary_Encoder/ANO_Rotary_Encoder_NeoPixel_Arduino_Example/.feather_m4_express.test.only b/ANO_Rotary_Encoder/ANO_Rotary_Encoder_NeoPixel_Arduino_Example/.feather_m4_express.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/ANO_Rotary_Encoder/ANO_Rotary_Encoder_NeoPixel_Arduino_Example/ANO_Rotary_Encoder_NeoPixel_Arduino_Example.ino b/ANO_Rotary_Encoder/ANO_Rotary_Encoder_NeoPixel_Arduino_Example/ANO_Rotary_Encoder_NeoPixel_Arduino_Example.ino new file mode 100644 index 000000000..2897d73e3 --- /dev/null +++ b/ANO_Rotary_Encoder/ANO_Rotary_Encoder_NeoPixel_Arduino_Example/ANO_Rotary_Encoder_NeoPixel_Arduino_Example.ino @@ -0,0 +1,88 @@ +// SPDX-FileCopyrightText: 2021 Kattni Rembor for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include +#include + +#define PIN_ENCODER_A 13 +#define PIN_ENCODER_B 12 +#define COM_A 11 +#define COM_B SDA +#define BUTTON_UP 5 +#define BUTTON_LEFT SCL +#define BUTTON_DOWN 9 +#define BUTTON_RIGHT 6 +#define BUTTON_IN 10 + +RotaryEncoder encoder(PIN_ENCODER_A, PIN_ENCODER_B, RotaryEncoder::LatchMode::TWO03); +// This interrupt will do our encoder reading/checking! +void checkPosition() { + encoder.tick(); // just call tick() to check the state. +} +int last_rotary = 0; + + +#define NUMPIXELS 12 +Adafruit_NeoPixel pixels(NUMPIXELS, A0, NEO_GRB + NEO_KHZ800); + + +void setup(void) { + Serial.begin(115200); + while (!Serial); + Serial.println("ANO Rotary Encoder Demo"); + + pinMode(COM_A, OUTPUT); + digitalWrite(COM_A, LOW); + pinMode(COM_B, OUTPUT); + digitalWrite(COM_B, LOW); + + attachInterrupt(PIN_ENCODER_A, checkPosition, CHANGE); + attachInterrupt(PIN_ENCODER_B, checkPosition, CHANGE); + + pinMode(BUTTON_UP, INPUT_PULLUP); + pinMode(BUTTON_DOWN, INPUT_PULLUP); + pinMode(BUTTON_LEFT, INPUT_PULLUP); + pinMode(BUTTON_RIGHT, INPUT_PULLUP); + pinMode(BUTTON_IN, INPUT_PULLUP); + pixels.begin(); + pixels.setBrightness(30); + pixels.show(); +} + + +void loop(void) { + // read encoder + int curr_rotary = encoder.getPosition(); + RotaryEncoder::Direction direction = encoder.getDirection(); + + pixels.clear(); + if (curr_rotary != last_rotary) { + Serial.print("Encoder value: "); + Serial.print(curr_rotary); + Serial.print(" direction: "); + Serial.println((int)direction); + } + last_rotary = curr_rotary; + + pixels.setPixelColor((curr_rotary + (1000*NUMPIXELS)) % NUMPIXELS, pixels.Color(0, 150, 0)); + + if (! digitalRead(BUTTON_UP)) { + pixels.setPixelColor(0, pixels.Color(150, 0, 0)); + } + if (! digitalRead(BUTTON_LEFT)) { + pixels.setPixelColor(NUMPIXELS/4, pixels.Color(150, 0, 0)); + } + if (! digitalRead(BUTTON_DOWN)) { + pixels.setPixelColor(NUMPIXELS/2, pixels.Color(150, 0, 0)); + } + if (! digitalRead(BUTTON_RIGHT)) { + pixels.setPixelColor(NUMPIXELS*3/4, pixels.Color(150, 0, 0)); + } + if (! digitalRead(BUTTON_IN)) { + pixels.fill(pixels.Color(50, 50, 50)); + } + pixels.show(); + + delay(20); +} diff --git a/ANO_Rotary_Encoder/ANO_Rotary_Encoder_NeoPixel_CircuitPython_Example/code.py b/ANO_Rotary_Encoder/ANO_Rotary_Encoder_NeoPixel_CircuitPython_Example/code.py new file mode 100644 index 000000000..d9ac3aa44 --- /dev/null +++ b/ANO_Rotary_Encoder/ANO_Rotary_Encoder_NeoPixel_CircuitPython_Example/code.py @@ -0,0 +1,78 @@ +# SPDX-FileCopyrightText: 2021 Kattni Rembor for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +""" +CircuitPython ANO Rotary Encoder and NeoPixel Ring example. +""" +import board +import digitalio +import rotaryio +import neopixel + +# The pin assignments for the breakout pins. Update this is you are not using a Feather. +ENCA = board.D13 +ENCB = board.D12 +COMA = board.D11 +SW1 = board.D10 +SW2 = board.D9 +SW3 = board.D6 +SW4 = board.D5 +SW5 = board.SCL +COMB = board.SDA + +# Rotary encoder setup +encoder = rotaryio.IncrementalEncoder(ENCA, ENCB) +last_position = None + +# NeoPixel ring setup. Update num_pixels if using a different ring. +num_pixels = 12 +pixels = neopixel.NeoPixel(board.A0, num_pixels, auto_write=False) + +# Set the COMA and COMB pins LOW. This is only necessary when using the direct-to-Feather or other +# GPIO-based wiring method. If connecting COMA and COMB to ground, you do not need to include this. +com_a = digitalio.DigitalInOut(COMA) +com_a.switch_to_output() +com_a = False +com_b = digitalio.DigitalInOut(COMB) +com_b.switch_to_output() +com_b = False + +# Button pin setup +button_pins = (SW1, SW2, SW3, SW4, SW5) +buttons = [] +for button_pin in button_pins: + pin = digitalio.DigitalInOut(button_pin) + pin.switch_to_input(digitalio.Pull.UP) + buttons.append(pin) + +while True: + position = encoder.position + if last_position is None or position != last_position: + print("Position: {}".format(position)) + last_position = position + + pixels.fill((0, 0, 0)) + pixels[position % num_pixels] = (0, 150, 0) + + if not buttons[0].value: + print("Center button!") + pixels.fill((100, 100, 100)) + + if not buttons[1].value: + print("Up button!") + pixels[0] = (150, 0 ,0) + + if not buttons[2].value: + print("Left button!") + pixels[3] = (150, 0, 0) + + if not buttons[3].value: + print("Down button!") + pixels[6] = (150, 0, 0) + + if not buttons[4].value: + print("Right button!") + pixels[9] = (150, 0, 0) + + pixels.show()