Forum: Mikrocontroller und Digitale Elektronik 4x4 Button Pad and Shift Register 595


von Elias *. (green_phanta)


Lesenswert?

Moin!

Ich habe ein 4x4 Button Pad von SparkFun, ein Teensy 3.6 und einige 595 
Shift Register.

Das ButtonPad läuft, wenn ich es direkt an die Pins des Teensy schließe.
Die Shift Register laufen super gut, auch mit PMW.

Wenn ich aber das Button Pad an die Shift Register anschließen möchte … 
tja dann, sitze ich schon seit Stunden ohne Fortschritt. Sämtliche 
Libraries haben "pinModes" definiert, welche ich nicht nutzen kann da 
ich ja den ShiftReg verwende. Ich habe das Monochrome Beispiel 
(https://learn.sparkfun.com/tutorials/button-pad-hookup-guide?_ga=1.253550537.1910979409.1476116853#exercise-1-monochrome-leds) 
auch mit Shift Registern bewerkstelligen können … aber, sobald es an 
Color Mixing und Buttons geht, klappt nix.

Hat jemand eventuell einen Lösungsansatz, eine Lib, einen Link, einen 
Denkanstoß … ich bin über jede Hilfe froh.

Danke!


Hier der Monochrome Code … an den Shift Register angepasst.
1
#include <ShiftRegister74HC595.h>
2
3
//config variables
4
#define NUM_LED_COLUMNS (4)
5
#define NUM_LED_ROWS (4)
6
#define NUM_COLORS (1)
7
8
// Global variables
9
static bool LED_buffer[NUM_LED_COLUMNS][NUM_LED_ROWS];
10
static int32_t next_advance;
11
static uint8_t led_index;
12
13
static const uint8_t ledcolumnpins[NUM_LED_COLUMNS]   = {4,2,23,8};;
14
static const uint8_t colorpins[NUM_LED_ROWS] = {21,17,12,7};
15
16
17
ShiftRegister74HC595 sr (3, 7, 8, 6); 
18
19
20
static void setuppins()
21
{
22
  uint8_t i;
23
24
  // initialize all of the output pins
25
26
  // LED column lines
27
  for(i = 0; i < NUM_LED_COLUMNS; i++)
28
  {
29
    // with nothing selected by default
30
    sr.set(ledcolumnpins[i], HIGH);
31
  }
32
33
  // LED row lines
34
  for(i = 0; i < NUM_LED_ROWS; i++)
35
  {
36
    // with nothing driven by default
37
    sr.set(colorpins[i], LOW);
38
  }
39
40
}
41
42
static void scan()
43
{
44
  static uint8_t current = 0;
45
  uint8_t val;
46
  uint8_t i, j;
47
48
  // Select a column
49
  sr.set(ledcolumnpins[current], LOW);
50
51
  // write the row pins
52
  for(i = 0; i < NUM_LED_ROWS; i++)
53
  {
54
    if(LED_buffer[current][i])
55
    {
56
      sr.set(colorpins[i], HIGH);
57
    }
58
  }
59
60
  delay(1);
61
62
  sr.set(ledcolumnpins[current], HIGH);
63
64
  for(i = 0; i < NUM_LED_ROWS; i++)
65
  {
66
    sr.set(colorpins[i], LOW);
67
  }
68
69
  // Move on to the next column
70
  current++;
71
  if (current >= NUM_LED_COLUMNS)
72
  {
73
    current = 0;
74
  }
75
76
}
77
78
void setup() 
79
{
80
  // put your setup code here, to run once:
81
  Serial.begin(115200);
82
  Serial.print("Starting Setup...");
83
84
  // setup hardware
85
  setuppins();
86
87
  // init global variables
88
  next_advance = millis() + 1000;
89
  led_index = 0;
90
91
  // Initialize the LED display array
92
  for(uint8_t i = 0; i < NUM_LED_COLUMNS; i++)
93
  {
94
    for(uint8_t j = 0; j < NUM_LED_ROWS; j++)
95
    {
96
      LED_buffer[i][j] = false;
97
    }
98
  }
99
  // Set the first LED in the buffer on
100
  LED_buffer[0][0] = true;
101
102
  Serial.println("Setup Complete.");
103
104
}
105
106
void loop() 
107
{
108
  // put your main code here, to run repeatedly:
109
110
  scan();
111
112
  if(millis() >= next_advance)
113
  {
114
    next_advance = millis()+1000;
115
116
    // Vorherige LED Aus
117
    LED_buffer[led_index/NUM_LED_COLUMNS][led_index%NUM_LED_COLUMNS] = false;
118
    
119
    // Led 0-15 auswählen
120
    led_index++;
121
122
    // Nicht über die Maxiimale Array Size (16m in dem Fall)
123
    led_index %= (NUM_LED_COLUMNS * NUM_LED_ROWS);
124
    
125
    // Neue Led ausrechnen und anzeigen
126
    LED_buffer[led_index/NUM_LED_COLUMNS][led_index%NUM_LED_COLUMNS] = true;
127
  }
128
}

von holger (Gast)


Lesenswert?

>Wenn ich aber das Button Pad an die Shift Register anschließen möchte …

Mit einem Ausgaberegister kann man halt keine Buttons einlesen.

von Elias *. (green_phanta)


Lesenswert?

Ok, das macht Sinn. Da habe ich wohl etwas überlesen.
Aber kann ich, so wie das Button Pad aufgebaut ist, die LEDs und die 
Buttons getrennt voneinander abnehmen?

Das heißt LEDs über Shift Reg 595 und Buttons zB über Multiplexer 4051?

von Mikki M. (mmerten)


Lesenswert?

4051 als Mux geht oder 74xx165 74xx597 als Input Shift Register

von Peter D. (peda)


Lesenswert?

Du könntest am I2C-Bus den PCF8574 nehmen, der kann gleichzeitig Input 
und Output.

von Elias *. (green_phanta)


Lesenswert?

Verstehe ich die Unterschiede zwischen i2C PortExpander, Shift Reg und 
Multiplexer in etwa so richtig:

Shift Reg: Nur Output, aber mit PMW
MUX: Nur input
Port Expander: In & Out, aber kein PMW

1 Frage: Warum dann einen Mux, wenn ich doch auch einen Port Expander 
nehmen könnte?

2 Frage: Gibt es kein IC das In & Out kann, aber zusätzlich PMW 
unterstützt?

3 Frage: Stimmt es, dass man nur bei Port Expandern die internen PullUp 
Widerstände für die erweiterten Pins aktivieren kann?

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.