Orgelpatch
Playnote
Reading device
Made of a typewriter and elements of a sewing and reproduction machine
Arduino source code
/*
* SN74HC165N_shift_reg
*
* Program to shift in the bit values from a SN74HC165N 8-bit
* parallel-in/serial-out shift register.
*
* This sketch demonstrates reading in 16 digital states from a
* pair of daisy-chained SN74HC165N shift registers while using
* only 4 digital pins on the Arduino.
*
* You can daisy-chain these chips by connecting the serial-out
* (Q7 pin) on one shift register to the serial-in (Ds pin) of
* the other.
*
* Of course you can daisy chain as many as you like while still
* using only 4 Arduino pins (though you would have to process
* them 4 at a time into separate unsigned long variables).
*
*/
/* How many shift register chips are daisy-chained.
*/
#define NUMBER_OF_SHIFT_CHIPS 6
/* Width of data (how many ext lines).
*/
#define DATA_WIDTH NUMBER_OF_SHIFT_CHIPS * 8
/* Width of pulse to trigger the shift register to read and latch.
*/
#define PULSE_WIDTH_USEC 5
/* Optional delay between shift register reads.
*/
#define POLL_DELAY_MSEC 1
/* You will need to change the "int" to "long" If the
* NUMBER_OF_SHIFT_CHIPS is higher than 2.
*/
#define BYTES_VAL_T unsigned long
int ploadPin = 8; // Connects to Parallel load pin the 165 WIT
int clockEnablePin = 9; // Connects to Clock Enable pin the 165 - NIET GEBRUIKT, LIGT AAN AARDE
int dataPin = 11; // Connects to the Q7 pin the 165 ORANJE
int clockPin = 12; // Connects to the Clock pin the 165 GEEL
BYTES_VAL_T pinValues;
BYTES_VAL_T oldPinValues;
BYTES_VAL_T pinValues2;
BYTES_VAL_T oldPinValues2;
/* This function is essentially a "shift-in" routine reading the
* serial Data from the shift register chips and representing
* the state of those pins in an unsigned integer (or long).
*/
BYTES_VAL_T read_shift_regs(int offset=0)
{
unsigned long bitVal;
BYTES_VAL_T bytesVal = 0;
/* Trigger a parallel Load to latch the state of the data lines,
*/
digitalWrite(clockEnablePin, HIGH);
digitalWrite(ploadPin, LOW);
delayMicroseconds(PULSE_WIDTH_USEC);
digitalWrite(ploadPin, HIGH);
digitalWrite(clockEnablePin, LOW);
/* Loop to read each bit value from the serial out line
* of the SN74HC165N.
*/
for(int i = 0; i < DATA_WIDTH-offset; i++)
{
bitVal = digitalRead(dataPin);
// Set the corresponding bit in bytesVal.
bytesVal |= (bitVal << ((DATA_WIDTH-1-offset) - i));
// Pulse the Clock (rising edge shifts the next bit).
digitalWrite(clockPin, HIGH);
delayMicroseconds(PULSE_WIDTH_USEC);
digitalWrite(clockPin, LOW);
}
return(bytesVal);
}
void display_pin_values_short()
{
uint16_t xlow = pinValues & 0xffff;
uint16_t xhigh = (pinValues >> 16);
uint8_t chip1 = xlow & 0xff;
uint8_t chip2 = (xlow >> 8);
uint8_t chip3 = xhigh & 0xff;
uint8_t chip4 = (xhigh >> 8);
uint16_t bank_low = pinValues2 & 0xffff;
uint16_t bank_high = (pinValues2 >> 16);
uint8_t chip5 = bank_low & 0xff;
uint8_t chip6 = (bank_low >> 8);
// Serial.print("/values1 ");
// Serial.println(pinValues,BIN);
// Serial.print("/values2 ");
// Serial.println(pinValues2);
Serial.print("/chip1 ");
Serial.println(chip1);
Serial.print("/chip2 ");
Serial.println(chip2);
Serial.print("/chip3 ");
Serial.println(chip3);
Serial.print("/chip4 ");
Serial.println(chip4);
Serial.print("/chip5 ");
Serial.println(chip5);
Serial.print("/chip6 ");
Serial.println(chip6);
delay(10);
}
void setup()
{
Serial.begin(9600);
// Initialize our digital pins...
pinMode(ploadPin, OUTPUT);
pinMode(clockEnablePin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, INPUT);
digitalWrite(clockPin, LOW);
digitalWrite(ploadPin, HIGH);
// Read in and display the pin states at startup.
pinValues = read_shift_regs();
pinValues2 = read_shift_regs(32);
display_pin_values_short();
oldPinValues = pinValues;
oldPinValues2 = pinValues2;
}
void loop()
{
// Read the state of all zones.
pinValues = read_shift_regs();
pinValues2 = read_shift_regs(32);
//If there was a chage in state, display which ones changed.
if(pinValues != oldPinValues || pinValues2 != oldPinValues2)
{
display_pin_values_short();
oldPinValues = pinValues;
oldPinValues2 = pinValues2;
}
delay(POLL_DELAY_MSEC);
}
Special thanks to Corneel Canters, David Lamain and Jan Klug
New top domestication
The explanation and the philosophy behind the domestication of technology, and how I apply it to the interpretator,
I will describe this in my blog in October.
I will describe this in my blog in October.
No comments:
Post a Comment