Started code for Noel2013
* Arduino code to handle 5 electrodes (5 notes in Jingle Bells) * TODO : Reuse python code from chorizo to play the music
This commit is contained in:
parent
e6fbaa2ffd
commit
6cfb48fbe3
1
.gitignore
vendored
1
.gitignore
vendored
@ -1 +1,2 @@
|
|||||||
*__pycache*
|
*__pycache*
|
||||||
|
*.pyc
|
||||||
|
93
Noel2013/arduino/touchless_tracking.ino
Normal file
93
Noel2013/arduino/touchless_tracking.ino
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
/* Touchless tracking
|
||||||
|
* ==================
|
||||||
|
* This code takes as many measurements as it can at approximately
|
||||||
|
* 10Hz = 60 Hz / (2 full cycles * 3 sensors).
|
||||||
|
*
|
||||||
|
* The code takes as many measurements as possible on the period of two
|
||||||
|
* cycles of the main power frequency, in order to cancel out any potential
|
||||||
|
* coupling.
|
||||||
|
*
|
||||||
|
* Original code was found on instructables :
|
||||||
|
* http://www.instructables.com/id/DIY-3D-Controller/
|
||||||
|
*
|
||||||
|
* Code slightly modified and commented by Phyks for HackENS
|
||||||
|
*
|
||||||
|
* As I found the code on Instructables and I don't give a damn to the
|
||||||
|
* modifications I made, you may reuse it freely by writing where you
|
||||||
|
* found it.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define resolution 8
|
||||||
|
// Frequency of main power to avoid coupling
|
||||||
|
#define mains 50
|
||||||
|
// Time between measures
|
||||||
|
#define refresh 2 * 1000000 / mains
|
||||||
|
#define MAX_PINS 6
|
||||||
|
|
||||||
|
// Pins to use
|
||||||
|
// Must be between 8 and 13 to use this code without
|
||||||
|
// modifications (PORTB is for pins 8 to 13)
|
||||||
|
//
|
||||||
|
// Note : If you change pin numbers, you *must* change the mask.
|
||||||
|
// See arduino doc for more info.
|
||||||
|
int pins[MAX_PINS] = {8, 9, 10, 11, 12}
|
||||||
|
|
||||||
|
// Counter for the timer
|
||||||
|
extern volatile unsigned long timer0_overflow_count;
|
||||||
|
|
||||||
|
void startTimer() {
|
||||||
|
timer0_overflow_count = 0;
|
||||||
|
TCNT0 = 0; // Initialize counter value to 0
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long checkTimer() {
|
||||||
|
return ((timer0_overflow_count << 8) + TCNT0) << 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
long time(int pin, byte mask) {
|
||||||
|
unsigned long count = 0, total = 0;
|
||||||
|
|
||||||
|
while(checkTimer() < refresh) {
|
||||||
|
// Note : pinMode is about 6 times slower than assigning
|
||||||
|
// DDRB directly, but that pause is important
|
||||||
|
|
||||||
|
// Set pin as output and LOW, see arduino doc for info on PORTB
|
||||||
|
pinMode(pin, OUTPUT);
|
||||||
|
PORTB = 0;
|
||||||
|
|
||||||
|
// Set it as INPUT to take measure
|
||||||
|
pinMode(pin, INPUT);
|
||||||
|
|
||||||
|
// While PINB is low, increment counter
|
||||||
|
while((PINB & mask) == 0)
|
||||||
|
count++;
|
||||||
|
|
||||||
|
total++;
|
||||||
|
}
|
||||||
|
// Restart timer for next measurement
|
||||||
|
startTimer();
|
||||||
|
// Return the measurement result
|
||||||
|
return (count << resolution) / total;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// Initialize serial communication
|
||||||
|
Serial.begin(115200);
|
||||||
|
|
||||||
|
// INPUT on pins
|
||||||
|
pinMode(PIN_R, INPUT);
|
||||||
|
pinMode(PIN_G, INPUT);
|
||||||
|
pinMode(PIN_B, INPUT);
|
||||||
|
|
||||||
|
// Start timer
|
||||||
|
startTimer();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// Print output to serial in decimal
|
||||||
|
for(int i = 0; i < MAX_PINS; i++) {
|
||||||
|
Serial.print(time(PINS[i], i));
|
||||||
|
Serial.print(" ");
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
}
|
93
Noel2013/arduino/touchless_tracking.ino~
Normal file
93
Noel2013/arduino/touchless_tracking.ino~
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
/* Touchless tracking
|
||||||
|
* ==================
|
||||||
|
* This code takes as many measurements as it can at approximately
|
||||||
|
* 10Hz = 60 Hz / (2 full cycles * 3 sensors).
|
||||||
|
*
|
||||||
|
* The code takes as many measurements as possible on the period of two
|
||||||
|
* cycles of the main power frequency, in order to cancel out any potential
|
||||||
|
* coupling.
|
||||||
|
*
|
||||||
|
* Original code was found on instructables :
|
||||||
|
* http://www.instructables.com/id/DIY-3D-Controller/
|
||||||
|
*
|
||||||
|
* Code slightly modified and commented by Phyks for HackENS
|
||||||
|
*
|
||||||
|
* As I found the code on Instructables and I don't give a damn to the
|
||||||
|
* modifications I made, you may reuse it freely by writing where you
|
||||||
|
* found it.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define resolution 8
|
||||||
|
// Frequency of main power to avoid coupling
|
||||||
|
#define mains 50
|
||||||
|
// Time between measures
|
||||||
|
#define refresh 2 * 1000000 / mains
|
||||||
|
#define MAX_PINS 6
|
||||||
|
|
||||||
|
// Pins to use
|
||||||
|
// Must be between 8 and 13 to use this code without
|
||||||
|
// modifications (PORTB is for pins 8 to 13)
|
||||||
|
//
|
||||||
|
// Note : If you change pin numbers, you *must* change the mask.
|
||||||
|
// See arduino doc for more info.
|
||||||
|
int pins[MAX_PINS] = {8, 9, 10, 11, 12}
|
||||||
|
|
||||||
|
// Counter for the timer
|
||||||
|
extern volatile unsigned long timer0_overflow_count;
|
||||||
|
|
||||||
|
void startTimer() {
|
||||||
|
timer0_overflow_count = 0;
|
||||||
|
TCNT0 = 0; // Initialize counter value to 0
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long checkTimer() {
|
||||||
|
return ((timer0_overflow_count << 8) + TCNT0) << 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
long time(int pin, byte mask) {
|
||||||
|
unsigned long count = 0, total = 0;
|
||||||
|
|
||||||
|
while(checkTimer() < refresh) {
|
||||||
|
// Note : pinMode is about 6 times slower than assigning
|
||||||
|
// DDRB directly, but that pause is important
|
||||||
|
|
||||||
|
// Set pin as output and LOW, see arduino doc for info on PORTB
|
||||||
|
pinMode(pin, OUTPUT);
|
||||||
|
PORTB = 0;
|
||||||
|
|
||||||
|
// Set it as INPUT to take measure
|
||||||
|
pinMode(pin, INPUT);
|
||||||
|
|
||||||
|
// While PINB is low, increment counter
|
||||||
|
while((PINB & mask) == 0)
|
||||||
|
count++;
|
||||||
|
|
||||||
|
total++;
|
||||||
|
}
|
||||||
|
// Restart timer for next measurement
|
||||||
|
startTimer();
|
||||||
|
// Return the measurement result
|
||||||
|
return (count << resolution) / total;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// Initialize serial communication
|
||||||
|
Serial.begin(115200);
|
||||||
|
|
||||||
|
// INPUT on pins
|
||||||
|
pinMode(PIN_R, INPUT);
|
||||||
|
pinMode(PIN_G, INPUT);
|
||||||
|
pinMode(PIN_B, INPUT);
|
||||||
|
|
||||||
|
// Start timer
|
||||||
|
startTimer();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// Print output to serial in decimal
|
||||||
|
for(int i = 0; i < MAX_PINS; i++) {
|
||||||
|
Serial.print(time(PINS[i], i));
|
||||||
|
Serial.print(" ");
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user