Fix 74HC165 protocol: match RoxMux library polarity
Key difference from RoxMux (the library designed for this hardware): - LD pin starts HIGH, pulses LOW->HIGH to latch (was inverted) - Data pin is INPUT (not INPUT_PULLUP) - 10k pullups on MUX board - bitWrite instead of manual bit shifting
This commit is contained in:
+20
-31
@@ -1,18 +1,20 @@
|
|||||||
#include "pixel_stomp_mux.h"
|
#include "pixel_stomp_mux.h"
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
#define ROXMUX_DELAY 1
|
||||||
|
|
||||||
PixelStompMux::PixelStompMux(uint8_t dat, uint8_t ld, uint8_t clk, uint8_t di)
|
PixelStompMux::PixelStompMux(uint8_t dat, uint8_t ld, uint8_t clk, uint8_t di)
|
||||||
: pin_dat(dat), pin_ld(ld), pin_clk(clk), pin_di(di),
|
: pin_dat(dat), pin_ld(ld), pin_clk(clk), pin_di(di),
|
||||||
strip(nullptr), last_button_state(0) {
|
strip(nullptr), last_button_state(0) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void PixelStompMux::begin() {
|
void PixelStompMux::begin() {
|
||||||
pinMode(pin_ld, OUTPUT);
|
|
||||||
pinMode(pin_clk, OUTPUT);
|
pinMode(pin_clk, OUTPUT);
|
||||||
pinMode(pin_di, INPUT_PULLUP);
|
pinMode(pin_ld, OUTPUT);
|
||||||
|
pinMode(pin_di, INPUT);
|
||||||
|
|
||||||
digitalWrite(pin_ld, LOW);
|
|
||||||
digitalWrite(pin_clk, LOW);
|
digitalWrite(pin_clk, LOW);
|
||||||
|
digitalWrite(pin_ld, HIGH);
|
||||||
|
|
||||||
strip = new Adafruit_NeoPixel(NUM_LEDS, pin_dat, NEO_GRB + NEO_KHZ800);
|
strip = new Adafruit_NeoPixel(NUM_LEDS, pin_dat, NEO_GRB + NEO_KHZ800);
|
||||||
strip->begin();
|
strip->begin();
|
||||||
@@ -22,19 +24,25 @@ void PixelStompMux::begin() {
|
|||||||
|
|
||||||
Serial.printf("[MUX] Init DAT=%d LD=%d CLK=%d DI=%d\n",
|
Serial.printf("[MUX] Init DAT=%d LD=%d CLK=%d DI=%d\n",
|
||||||
pin_dat, pin_ld, pin_clk, pin_di);
|
pin_dat, pin_ld, pin_clk, pin_di);
|
||||||
Serial.printf("[MUX] 74HC165 x2 daisy-chain for %d buttons\n", NUM_BUTTONS);
|
Serial.printf("[MUX] 74HC165 x2 daisy-chain, WS2812C x%d LEDs\n", NUM_LEDS);
|
||||||
Serial.printf("[MUX] WS2812C for %d LEDs\n", NUM_LEDS);
|
|
||||||
Serial.printf("[MUX] DI pin reads: %d\n", digitalRead(pin_di));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t PixelStompMux::read_buttons() {
|
uint8_t PixelStompMux::read_buttons() {
|
||||||
digitalWrite(pin_ld, HIGH);
|
|
||||||
delayMicroseconds(20);
|
|
||||||
digitalWrite(pin_ld, LOW);
|
digitalWrite(pin_ld, LOW);
|
||||||
delayMicroseconds(20);
|
delayMicroseconds(ROXMUX_DELAY);
|
||||||
|
digitalWrite(pin_ld, HIGH);
|
||||||
|
|
||||||
last_button_state = shift_in_74hc165();
|
uint8_t data = 0;
|
||||||
return last_button_state;
|
for (int i = 7; i >= 0; i--) {
|
||||||
|
bitWrite(data, i, digitalRead(pin_di));
|
||||||
|
digitalWrite(pin_clk, HIGH);
|
||||||
|
delayMicroseconds(ROXMUX_DELAY);
|
||||||
|
digitalWrite(pin_clk, LOW);
|
||||||
|
delayMicroseconds(ROXMUX_DELAY);
|
||||||
|
}
|
||||||
|
|
||||||
|
last_button_state = data;
|
||||||
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PixelStompMux::is_button_pressed(uint8_t index) {
|
bool PixelStompMux::is_button_pressed(uint8_t index) {
|
||||||
@@ -78,36 +86,17 @@ void PixelStompMux::dump() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t PixelStompMux::shift_in_74hc165() {
|
|
||||||
uint8_t data = 0;
|
|
||||||
|
|
||||||
for (int i = NUM_BUTTONS - 1; i >= 0; i--) {
|
|
||||||
if (digitalRead(pin_di)) {
|
|
||||||
data |= (1 << i);
|
|
||||||
}
|
|
||||||
digitalWrite(pin_clk, HIGH);
|
|
||||||
delayMicroseconds(2);
|
|
||||||
digitalWrite(pin_clk, LOW);
|
|
||||||
delayMicroseconds(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
void PixelStompMux::probe() {
|
void PixelStompMux::probe() {
|
||||||
Serial.println("[MUX] === Hardware Probe ===");
|
Serial.println("[MUX] === Hardware Probe ===");
|
||||||
|
|
||||||
Serial.printf(" DI (GPIO %d) raw: %d\n", pin_di, digitalRead(pin_di));
|
Serial.printf(" DI (GPIO %d) raw: %d\n", pin_di, digitalRead(pin_di));
|
||||||
|
|
||||||
Serial.println(" Testing LD pin...");
|
Serial.println(" Testing LD pin (RoxMux protocol)...");
|
||||||
digitalWrite(pin_ld, LOW);
|
digitalWrite(pin_ld, LOW);
|
||||||
delayMicroseconds(10);
|
delayMicroseconds(10);
|
||||||
Serial.printf(" LD=LOW, DI=%d\n", digitalRead(pin_di));
|
Serial.printf(" LD=LOW, DI=%d\n", digitalRead(pin_di));
|
||||||
digitalWrite(pin_ld, HIGH);
|
digitalWrite(pin_ld, HIGH);
|
||||||
delayMicroseconds(10);
|
delayMicroseconds(10);
|
||||||
Serial.printf(" LD=HIGH, DI=%d\n", digitalRead(pin_di));
|
Serial.printf(" LD=HIGH, DI=%d\n", digitalRead(pin_di));
|
||||||
digitalWrite(pin_ld, LOW);
|
|
||||||
delayMicroseconds(10);
|
|
||||||
|
|
||||||
Serial.println(" Toggling CLK 16 times, reading DI...");
|
Serial.println(" Toggling CLK 16 times, reading DI...");
|
||||||
for (int i = 0; i < 16; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
|
|||||||
Reference in New Issue
Block a user