update sketches
This commit is contained in:
parent
d24705d0cb
commit
9c99fd7ba7
@ -118,7 +118,7 @@ Dependency diagram of example I/O expander matrix with LEDs
|
|||||||
/ | \ / \
|
/ | \ / \
|
||||||
strobePin PortWrite PortRead Code Code_LEDLock
|
strobePin PortWrite PortRead Code Code_LEDLock
|
||||||
| \ / \ |
|
| \ / \ |
|
||||||
| PortIOE readPins LED
|
| PortIOE readPins LED_IOE
|
||||||
\___________________________/ \
|
\___________________________/ \
|
||||||
pin
|
pin
|
||||||
|
|
||||||
@ -138,7 +138,7 @@ This convention leads to class names that convey information about the classes i
|
|||||||
Underscore delineates base class name and sub-class name. Capital letters delineate words.
|
Underscore delineates base class name and sub-class name. Capital letters delineate words.
|
||||||
|
|
||||||
Interface class names end with "Interface".
|
Interface class names end with "Interface".
|
||||||
Except for Key, because sketches look nicer with short names defining Key[] arrays.
|
Except for Key, to reduce clutter because sketches define so many Key[] arrays.
|
||||||
|
|
||||||
Layer-class naming conventions
|
Layer-class naming conventions
|
||||||
------------------------------
|
------------------------------
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
#include <Scanner_uC.h>
|
#include <Scanner_uC.h>
|
||||||
|
|
||||||
//right matrix
|
//right matrix
|
||||||
#include <PortPCA9655E.h>
|
#include <Port_PCA9655E.h>
|
||||||
#include <Scanner_IOE.h>
|
#include <Scanner_IOE.h>
|
||||||
|
|
||||||
// ============ SPEED CONFIGURATION ============
|
// ============ SPEED CONFIGURATION ============
|
||||||
@ -31,8 +31,8 @@ Scanner_uC scanner_L(HIGH, readPins, readPinCount);
|
|||||||
// =============== RIGHT SCANNER ===============
|
// =============== RIGHT SCANNER ===============
|
||||||
const uint8_t IOE_ADDR = 0x18;
|
const uint8_t IOE_ADDR = 0x18;
|
||||||
|
|
||||||
PortPCA9655E port1(IOE_ADDR, 1, 0); //for strobe
|
Port_PCA9655E port1(IOE_ADDR, 1, 0); //for strobe
|
||||||
PortPCA9655E port0(IOE_ADDR, 0, 1<<0 | 1<<1 ); //for read
|
Port_PCA9655E port0(IOE_ADDR, 0, 1<<0 | 1<<1 ); //for read
|
||||||
|
|
||||||
Scanner_IOE scanner_R(HIGH, port1, port0);
|
Scanner_IOE scanner_R(HIGH, port1, port0);
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
|
||||||
/* Key is an interface class
|
/* Key is an interface class
|
||||||
|
Key class name does not end in "Interface" because sketches define so many Key[] arrays.
|
||||||
*/
|
*/
|
||||||
class Key
|
class Key
|
||||||
{
|
{
|
||||||
|
51
src/Scanner_ShiftRegsPISOMultiRow.cpp
Normal file
51
src/Scanner_ShiftRegsPISOMultiRow.cpp
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#include "Scanner_ShiftRegsPISOMultiRow.h"
|
||||||
|
|
||||||
|
/* constructor
|
||||||
|
*/
|
||||||
|
Scanner_ShiftRegsPISOMultiRow::Scanner_ShiftRegsPISOMultiRow(const bool strobeOn,
|
||||||
|
const uint8_t slaveSelect, const uint8_t byte_count)
|
||||||
|
: strobeOn(strobeOn), strobeOff(!strobeOn),
|
||||||
|
slaveSelect(slaveSelect), byte_count(byte_count)
|
||||||
|
{
|
||||||
|
pinMode(slaveSelect, OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* init() is called once for each row from Row constructor.
|
||||||
|
Configures controller to communicate with shift register matrix.
|
||||||
|
*/
|
||||||
|
void Scanner_ShiftRegsPISOMultiRow::init(const uint8_t strobePin)
|
||||||
|
{
|
||||||
|
pinMode(strobePin, OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* begin() should be called once from sketch setup().
|
||||||
|
Initializes shift register's shift/load pin.
|
||||||
|
*/
|
||||||
|
void Scanner_ShiftRegsPISOMultiRow::begin()
|
||||||
|
{
|
||||||
|
digitalWrite(slaveSelect, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* scan() strobes the row's strobePin and returns state of the shift register's input pins.
|
||||||
|
strobePin is Arduino pin number connected to this row.
|
||||||
|
Bit patterns are 1 bit per key.
|
||||||
|
*/
|
||||||
|
read_pins_t Scanner_ShiftRegsPISOMultiRow::scan(const uint8_t strobePin)
|
||||||
|
{
|
||||||
|
read_pins_t readState = 0; //bits, 1 means key is pressed, 0 means released
|
||||||
|
|
||||||
|
//strobe row on
|
||||||
|
digitalWrite(strobePin, strobeOn);
|
||||||
|
delayMicroseconds(3); //time to stablize voltage
|
||||||
|
|
||||||
|
//read all the column pins
|
||||||
|
digitalWrite(slaveSelect, LOW); //load parallel inputs to the register
|
||||||
|
digitalWrite(slaveSelect, HIGH); //shift the data toward a serial output
|
||||||
|
SPI.transfer(&readState, byte_count);
|
||||||
|
|
||||||
|
//strobe row off
|
||||||
|
digitalWrite(strobePin, strobeOff);
|
||||||
|
|
||||||
|
return readState;
|
||||||
|
}
|
||||||
|
|
56
src/Scanner_ShiftRegsPISOMultiRow.h
Normal file
56
src/Scanner_ShiftRegsPISOMultiRow.h
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
#ifndef ROWSCANNER_SHIFTREGSPISOMULTIROW_H
|
||||||
|
#define ROWSCANNER_SHIFTREGSPISOMULTIROW_H
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <config_keybrd.h>
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <ScannerInterface.h>
|
||||||
|
|
||||||
|
/* Scanner_ShiftRegsPISOMultiRow reads shift registers.
|
||||||
|
This was tested on 74HC165 shift registers, which are Parallel-In-Serial-Out (PISO).
|
||||||
|
Upto 4 shift registers can be in a daisy chained for a total of 32 read pins.
|
||||||
|
|
||||||
|
Example instantiation:
|
||||||
|
Scanner_ShiftRegsPISOMultiRow scanner_R(HIGH, SS, 4);
|
||||||
|
|
||||||
|
There are three Scanner_ShiftRegsPISOMultiRow parameters.
|
||||||
|
"strobeOn" paramter is active state HIGH or LOW.
|
||||||
|
|
||||||
|
"slaveSelect" paramter can be any controller pin connected to shift register's SHIFT-LOAD pin.
|
||||||
|
slaveSelect pin SS (Arduino pin 10) has the fastest scan.
|
||||||
|
|
||||||
|
"byte_count" is the number of bytes to read from shift registers (1 to 4).
|
||||||
|
byte_count should cover all the row's keys:
|
||||||
|
byte_count*8 >= row's keyCount
|
||||||
|
|
||||||
|
Hardware setup:
|
||||||
|
Each row needs to be connected to a strobe pin from the controller.
|
||||||
|
Switche and diode in series are connected to shift-register parallel-input pins and strobed row.
|
||||||
|
|
||||||
|
For active low:
|
||||||
|
Shift-register parallel-input pins need 10k Ohm pull-up resistors powered.
|
||||||
|
Orient diodes with cathode (banded end) towards the write pins (row)
|
||||||
|
Controller's MISO pin is connected to shift register's complementary serial output (/QH) pin
|
||||||
|
|
||||||
|
For active high:
|
||||||
|
Shift-register parallel-input pins need 10k pull-down resistors grounded.
|
||||||
|
Orient diodes with cathode (banded end) towards the read pins.
|
||||||
|
Controller's MISO pin is connected to shift register's serial output (QH) pin
|
||||||
|
*/
|
||||||
|
class Scanner_ShiftRegsPISOMultiRow : public ScannerInterface
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
const bool strobeOn; //logic level of strobe on, active state HIGH or LOW
|
||||||
|
const bool strobeOff; //logic level of strobe off, complement of strobeOn
|
||||||
|
const uint8_t slaveSelect; //controller's pin number that is
|
||||||
|
// connected to shift register's SHIFT-LOAD pin
|
||||||
|
const uint8_t byte_count; //number of bytes to read from shift registers
|
||||||
|
public:
|
||||||
|
Scanner_ShiftRegsPISOMultiRow(const bool strobeOn,
|
||||||
|
const uint8_t slaveSelect, const uint8_t byte_count);
|
||||||
|
virtual void init(const uint8_t strobePin);
|
||||||
|
virtual void begin();
|
||||||
|
virtual read_pins_t scan(const uint8_t strobePin);
|
||||||
|
};
|
||||||
|
#endif
|
43
src/Scanner_ShiftRegsPISOSingleRow.cpp
Normal file
43
src/Scanner_ShiftRegsPISOSingleRow.cpp
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
#include "Scanner_ShiftRegsPISOSingleRow.h"
|
||||||
|
|
||||||
|
/* constructor
|
||||||
|
*/
|
||||||
|
Scanner_ShiftRegsPISOSingleRow::Scanner_ShiftRegsPISOSingleRow(const bool strobeOn,
|
||||||
|
const uint8_t slaveSelect, const uint8_t byte_count)
|
||||||
|
: slaveSelect(slaveSelect), byte_count(byte_count)
|
||||||
|
{
|
||||||
|
pinMode(slaveSelect, OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* init() is called once for each row from Row constructor.
|
||||||
|
*/
|
||||||
|
void Scanner_ShiftRegsPISOSingleRow::init(const uint8_t strobePin)
|
||||||
|
{
|
||||||
|
//empty function
|
||||||
|
}
|
||||||
|
|
||||||
|
/* begin() should be called once from sketch setup().
|
||||||
|
Initializes shift register's shift/load pin.
|
||||||
|
*/
|
||||||
|
void Scanner_ShiftRegsPISOSingleRow::begin()
|
||||||
|
{
|
||||||
|
SPI.begin();
|
||||||
|
digitalWrite(slaveSelect, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* scan() returns state of the shift register's input pins.
|
||||||
|
No strobe pin is needed, the shift register is wired so the strobe is effectivley always "on".
|
||||||
|
Bit patterns are 1 bit per key.
|
||||||
|
*/
|
||||||
|
read_pins_t Scanner_ShiftRegsPISOSingleRow::scan(const uint8_t strobePin)
|
||||||
|
{
|
||||||
|
read_pins_t readState = 0; //bits, 1 means key is pressed, 0 means released
|
||||||
|
|
||||||
|
//read all the column pins
|
||||||
|
digitalWrite(slaveSelect, LOW); //load parallel inputs to the register
|
||||||
|
digitalWrite(slaveSelect, HIGH); //shift the data toward a serial output
|
||||||
|
SPI.transfer(&readState, byte_count);
|
||||||
|
|
||||||
|
return readState;
|
||||||
|
}
|
||||||
|
|
58
src/Scanner_ShiftRegsPISOSingleRow.h
Normal file
58
src/Scanner_ShiftRegsPISOSingleRow.h
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
#ifndef ROWSCANNER_SHIFTREGSPISOSINGLEROW_H
|
||||||
|
#define ROWSCANNER_SHIFTREGSPISOSINGLEROW_H
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <config_keybrd.h>
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <ScannerInterface.h>
|
||||||
|
|
||||||
|
/* Scanner_ShiftRegsPISOSingleRow reads shift registers.
|
||||||
|
This was tested on 74HC165 shift registers, which are Parallel-In-Serial-Out (PISO).
|
||||||
|
Upto 4 shift registers can be in a daisy chained for a total of 32 read pins.
|
||||||
|
|
||||||
|
Example instantiation:
|
||||||
|
Row row_R0(scanner_R, 0, ptrsKeys_R0, sizeof(ptrsKeys_R0)/sizeof(*ptrsKeys_R0));
|
||||||
|
Scanner_ShiftRegsPISOSingleRow scanner_R(HIGH, SS, 4);
|
||||||
|
|
||||||
|
The Row "strobePin" parameter is ignored.
|
||||||
|
In the above example, the "strobePin" argument is 0, but it doesn't matter what value is given.
|
||||||
|
|
||||||
|
There are three Scanner_ShiftRegsPISOSingleRow parameters.
|
||||||
|
"strobeOn" paramter is ignored, but should be active state HIGH or LOW required by ScannerInterface.
|
||||||
|
|
||||||
|
"slaveSelect" paramter can be any controller pin connected to shift register's SHIFT-LOAD pin.
|
||||||
|
slaveSelect pin SS (Arduino pin 10) has the fastest scan.
|
||||||
|
|
||||||
|
"byte_count" is the number of bytes to read from shift registers (1 to 4).
|
||||||
|
byte_count should cover all the row's keys:
|
||||||
|
byte_count*8 >= row's keyCount
|
||||||
|
|
||||||
|
Hardware setup:
|
||||||
|
There is only one row, and it is permanently active.
|
||||||
|
Switches are connected to shift-register parallel-input pins (diodes are not needed) and row.
|
||||||
|
|
||||||
|
For active low:
|
||||||
|
Shift-register parallel-input pins need 10k Ohm pull-up resistors powered.
|
||||||
|
Switches connect powered row to parallel-input pins.
|
||||||
|
Controller's MISO pin is connected to shift register's complementary serial output (/QH) pin
|
||||||
|
|
||||||
|
For active high:
|
||||||
|
Shift-register parallel-input pins need 10k pull-down resistors grounded.
|
||||||
|
Switches connect grouned row to parallel-input pins.
|
||||||
|
Controller's MISO pin is connected to shift register's serial output (QH) pin
|
||||||
|
*/
|
||||||
|
class Scanner_ShiftRegsPISOSingleRow : public ScannerInterface
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
const uint8_t slaveSelect; //controller's pin number that is
|
||||||
|
// connected to shift register's SHIFT-LOAD pin
|
||||||
|
const uint8_t byte_count; //number of bytes to read from shift registers
|
||||||
|
public:
|
||||||
|
Scanner_ShiftRegsPISOSingleRow(const bool strobeOn,
|
||||||
|
const uint8_t slaveSelect, const uint8_t byte_count);
|
||||||
|
void init(const uint8_t strobePin);
|
||||||
|
void begin();
|
||||||
|
virtual read_pins_t scan(const uint8_t strobePin);
|
||||||
|
};
|
||||||
|
#endif
|
@ -1,9 +1,7 @@
|
|||||||
/* tutorial_4b_split_keyboard_with_shift_registers.ino
|
/* tutorial_4b_split_keyboard_with_shift_registers.ino
|
||||||
Tested on Teensy LC and two 74HC165 shift registers.
|
Tested on Teensy LC and two 74HC165 shift registers.
|
||||||
|
|
||||||
The right matrix has 2 shift registers daisy chained.
|
Controller Two shift registers daisy chained
|
||||||
|
|
||||||
Layout Layout
|
|
||||||
| Left |**0**| | Right |**0**|**1**|**2**|**3**|**4**|**5**|**6**|
|
| Left |**0**| | Right |**0**|**1**|**2**|**3**|**4**|**5**|**6**|
|
||||||
|:-----:|-----| |:-----:|-----|-----|-----|-----|-----|-----|-----|
|
|:-----:|-----| |:-----:|-----|-----|-----|-----|-----|-----|-----|
|
||||||
| **0** | x | | **0** | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
|
| **0** | x | | **0** | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
|
||||||
|
@ -4,8 +4,7 @@ This sketch:
|
|||||||
is a simple 1-layer keyboard
|
is a simple 1-layer keyboard
|
||||||
runs on two matrices of a breadboard keyboard
|
runs on two matrices of a breadboard keyboard
|
||||||
|
|
||||||
This layout table shows left and right matrices:
|
Controller I/O expander
|
||||||
|
|
||||||
| Left | **0** | **1** | | Right | **0** | **1** |
|
| Left | **0** | **1** | | Right | **0** | **1** |
|
||||||
|:-----:|-------|-------|-|:-----:|-------|-------|
|
|:-----:|-------|-------|-|:-----:|-------|-------|
|
||||||
| **1** | 1 | 2 | | **1** | 3 | 4 |
|
| **1** | 1 | 2 | | **1** | 3 | 4 |
|
||||||
@ -21,7 +20,7 @@ This layout table shows left and right matrices:
|
|||||||
#include <Scanner_uC.h>
|
#include <Scanner_uC.h>
|
||||||
|
|
||||||
//right matrix
|
//right matrix
|
||||||
#include <PortMCP23S17.h>
|
#include <Port_MCP23S17.h>
|
||||||
#include <Scanner_IOE.h>
|
#include <Scanner_IOE.h>
|
||||||
|
|
||||||
// ============ SPEED CONFIGURATION ============
|
// ============ SPEED CONFIGURATION ============
|
||||||
@ -44,14 +43,14 @@ const uint8_t IOE_ADDR = 0x20; //MCP23S17 address, all 3 ADDR p
|
|||||||
/*
|
/*
|
||||||
Normally all strobe pins are on one port, and all the read pins are on the other port.
|
Normally all strobe pins are on one port, and all the read pins are on the other port.
|
||||||
In this example, portB stobes the row while portA reads the colums.
|
In this example, portB stobes the row while portA reads the colums.
|
||||||
PortMCP23S17 constructor parameters are: deviceAddr, portNum, readPins
|
Port_MCP23S17 constructor parameters are: deviceAddr, portNum, readPins
|
||||||
readPins is a bit pattern, where 0=output, 1=input.
|
readPins is a bit pattern, where 0=output, 1=input.
|
||||||
In portA, the first two pins are set to input for reading.
|
In portA, the first two pins are set to input for reading.
|
||||||
"<<" (bit shift left) and "|" (OR) are bitwise operators.
|
"<<" (bit shift left) and "|" (OR) are bitwise operators.
|
||||||
Pin numbers to be read are to the right of "1<<" and delimited by "|".
|
Pin numbers to be read are to the right of "1<<" and delimited by "|".
|
||||||
*/
|
*/
|
||||||
PortMCP23S17 portA(IOE_ADDR, 0, 1<<0 | 1<<1 );
|
Port_MCP23S17 portA(IOE_ADDR, 0, 1<<0 | 1<<1 );
|
||||||
PortMCP23S17 portB(IOE_ADDR, 1, 0);
|
Port_MCP23S17 portB(IOE_ADDR, 1, 0);
|
||||||
Scanner_IOE scanner_R(LOW, portB, portA);
|
Scanner_IOE scanner_R(LOW, portB, portA);
|
||||||
|
|
||||||
// =================== CODES ===================
|
// =================== CODES ===================
|
||||||
|
@ -7,7 +7,7 @@ This sketch:
|
|||||||
| Layout | **0** | **1** |
|
| Layout | **0** | **1** |
|
||||||
|:------:|-------|-------|
|
|:------:|-------|-------|
|
||||||
| **0** |CapsLck| a 1 |
|
| **0** |CapsLck| a 1 |
|
||||||
| **1** | fn | b 2 |
|
| **1** | fn | x = |
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// ################## GLOBAL ###################
|
// ################## GLOBAL ###################
|
||||||
@ -63,15 +63,16 @@ For example, when o_capsLock is pressed, it sends KEY_CAPS_LOCK scancode and upd
|
|||||||
Code_LEDLock o_capsLock(KEY_CAPS_LOCK, LED_CapsLck);
|
Code_LEDLock o_capsLock(KEY_CAPS_LOCK, LED_CapsLck);
|
||||||
|
|
||||||
Code_Sc s_a(KEY_A);
|
Code_Sc s_a(KEY_A);
|
||||||
Code_Sc s_b(KEY_B);
|
Code_Sc s_x(KEY_X);
|
||||||
|
|
||||||
Code_Sc s_1(KEY_1);
|
Code_Sc s_1(KEY_1);
|
||||||
Code_Sc s_2(KEY_2);
|
Code_Sc s_equal(KEY_EQUAL);
|
||||||
|
|
||||||
// =================== KEYS ====================
|
// =================== KEYS ====================
|
||||||
Key* const ptrsKeys_01[] = { &s_a, &s_1 };
|
Key* const ptrsKeys_01[] = { &s_a, &s_1 };
|
||||||
Key_LayeredKeys k_01(ptrsKeys_01);
|
Key_LayeredKeys k_01(ptrsKeys_01);
|
||||||
|
|
||||||
Key* const ptrsKeys_11[] = { &s_b, &s_2 };
|
Key* const ptrsKeys_11[] = { &s_x, &s_equal };
|
||||||
Key_LayeredKeys k_11(ptrsKeys_11);
|
Key_LayeredKeys k_11(ptrsKeys_11);
|
||||||
|
|
||||||
LayerStateInterface& Key_LayeredKeys::refLayerState = layerState;
|
LayerStateInterface& Key_LayeredKeys::refLayerState = layerState;
|
||||||
|
Reference in New Issue
Block a user