sensor.h 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. #ifndef SENSOR_MODULE
  2. #define SENSOR_MODULE
  3. #import <Arduino.h>
  4. // #include "I2C/I2C.cpp"
  5. #include <Wire.h>
  6. #include "mpr121.h"
  7. #include "definitions.h"
  8. struct Sensor
  9. {
  10. private:
  11. PIN_TYPE interrupt_pin;
  12. public:
  13. CONST_PIN_TYPE LEFT_ANALOUGE_PIN = 9;
  14. CONST_PIN_TYPE RIGHT_ANALOUGE_PIN = 2;
  15. Sensor (PIN_TYPE sensor_interrupt_pin)
  16. {
  17. this->interrupt_pin = sensor_interrupt_pin;
  18. }
  19. SensorTouched readInput()
  20. {
  21. // Serial.print("Checking for interrupt on pin: ");
  22. // Serial.println(this->interrupt_pin);
  23. SensorTouched sensor_touched = SensorTouched(false, false);
  24. if (!digitalRead(this->interrupt_pin))
  25. {
  26. //read the touch state from the MPR121
  27. Wire.requestFrom(0x5A,2);
  28. //I2c.read(0x5A,2);
  29. byte LSB = Wire.read(); // I2c.receive();
  30. byte MSB = Wire.read(); // I2c.receive();
  31. uint16_t touched = ((MSB << 8) | LSB); //16bits that make up the touch states
  32. // Serial.print("Checking for interrupt. variable touched: ");
  33. // Serial.println(touched);
  34. // We run the next commented out for loop to check for each pin,
  35. // but we already know which pins are possible so no need for the loop
  36. /*
  37. for (int i=0; i < 12; i++)
  38. { // Check what electrodes were pressed
  39. if(touched & (1<<i))
  40. {
  41. }
  42. }
  43. */
  44. sensor_touched.change_happened = false;
  45. if(touched & (1<<LEFT_ANALOUGE_PIN))
  46. {
  47. sensor_touched.left_sensor = true;
  48. }
  49. else
  50. {
  51. sensor_touched.left_sensor = false;
  52. }
  53. if(touched & (1<<RIGHT_ANALOUGE_PIN))
  54. {
  55. sensor_touched.right_sensor = true;
  56. }
  57. else
  58. {
  59. sensor_touched.right_sensor = false;
  60. }
  61. if (sensor_touched.left_sensor || sensor_touched.right_sensor)
  62. {
  63. sensor_touched.change_happened = true;
  64. }
  65. }
  66. if (sensor_touched.change_happened)
  67. {
  68. //Serial.print("Returning sensor_touched: change_happened: ");
  69. //Serial.print(sensor_touched.change_happened ? "true" : "false");
  70. //Serial.print(" left_sensor: ");
  71. //Serial.print(sensor_touched.left_sensor ? "touched" : "untouched");
  72. //Serial.print(" right_sensor: ");
  73. //Serial.println(sensor_touched.right_sensor ? "touch" : "untouched");
  74. }
  75. return sensor_touched;
  76. }
  77. void setup()
  78. {
  79. static bool initialize_once = false;
  80. if (!initialize_once)
  81. {
  82. this->setupOnce();
  83. initialize_once = true;
  84. }
  85. }
  86. private:
  87. void setupOnce(void)
  88. {
  89. //Serial.print("Setting up sensor on pin: ");
  90. //Serial.println(this->interrupt_pin);
  91. pinMode(this->interrupt_pin, INPUT);
  92. digitalWrite(this->interrupt_pin, HIGH); //enable pullup resistor
  93. Wire.begin();
  94. // I2c.begin();
  95. // I2c.timeOut(3000);
  96. //Serial.println("Setting 0x00 register");
  97. set_register(0x5A, ELE_CFG, 0x00);
  98. //Serial.println("Setting Section A");
  99. // Section A - Controls filtering when data is > baseline.
  100. set_register(0x5A, MHD_R, 0x01);
  101. set_register(0x5A, NHD_R, 0x01);
  102. set_register(0x5A, NCL_R, 0x00);
  103. set_register(0x5A, FDL_R, 0x00);
  104. //Serial.println("Setting Section B");
  105. // Section B - Controls filtering when data is < baseline.
  106. set_register(0x5A, MHD_F, 0x01);
  107. set_register(0x5A, NHD_F, 0x01);
  108. set_register(0x5A, NCL_F, 0xFF);
  109. set_register(0x5A, FDL_F, 0x02);
  110. // Section C - Sets touch and release thresholds for each electrode
  111. // #define NEW_TOU_THRESH TOU_THRESH // 0x10
  112. // #define NEW_REL_THRESH REL_THRESH // 0x02
  113. #define NEW_TOU_THRESH 0x09
  114. #define NEW_REL_THRESH 0x35
  115. set_register(0x5A, ELE0_T, NEW_TOU_THRESH);
  116. set_register(0x5A, ELE0_R, NEW_REL_THRESH);
  117. set_register(0x5A, ELE1_T, NEW_TOU_THRESH);
  118. set_register(0x5A, ELE1_R, NEW_REL_THRESH);
  119. set_register(0x5A, ELE2_T, NEW_TOU_THRESH);
  120. set_register(0x5A, ELE2_R, NEW_REL_THRESH);
  121. set_register(0x5A, ELE3_T, NEW_TOU_THRESH);
  122. set_register(0x5A, ELE3_R, NEW_REL_THRESH);
  123. set_register(0x5A, ELE4_T, NEW_TOU_THRESH);
  124. set_register(0x5A, ELE4_R, NEW_REL_THRESH);
  125. set_register(0x5A, ELE5_T, NEW_TOU_THRESH);
  126. set_register(0x5A, ELE5_R, NEW_REL_THRESH);
  127. set_register(0x5A, ELE6_T, NEW_TOU_THRESH);
  128. set_register(0x5A, ELE6_R, NEW_REL_THRESH);
  129. set_register(0x5A, ELE7_T, NEW_TOU_THRESH);
  130. set_register(0x5A, ELE7_R, NEW_REL_THRESH);
  131. set_register(0x5A, ELE8_T, NEW_TOU_THRESH);
  132. set_register(0x5A, ELE8_R, NEW_REL_THRESH);
  133. #define NEW_TOU_THRESH_SPECIAL 0x01
  134. #define NEW_REL_THRESH_SPECIAL 0x35
  135. set_register(0x5A, ELE9_T, NEW_TOU_THRESH_SPECIAL);
  136. set_register(0x5A, ELE9_R, NEW_REL_THRESH_SPECIAL);
  137. set_register(0x5A, ELE10_T, NEW_TOU_THRESH);
  138. set_register(0x5A, ELE10_R, NEW_REL_THRESH);
  139. set_register(0x5A, ELE11_T, NEW_TOU_THRESH);
  140. set_register(0x5A, ELE11_R, NEW_REL_THRESH);
  141. //Serial.println("Setting Section D");
  142. // Section D
  143. // Set the Filter Configuration
  144. // Set ESI2
  145. set_register(0x5A, FIL_CFG, 0x04);
  146. // Section E
  147. // Electrode Configuration
  148. // Set ELE_CFG to 0x00 to return to standby mode
  149. set_register(0x5A, ELE_CFG, 0x0C); // Enables all 12 Electrodes
  150. // Section F
  151. // Enable Auto Config and auto Reconfig
  152. /*set_register(0x5A, ATO_CFG0, 0x0B);
  153. set_register(0x5A, ATO_CFGU, 0xC9); // USL = (Vdd-0.7)/vdd*256 = 0xC9 @3.3V set_register(0x5A, ATO_CFGL, 0x82); // LSL = 0.65*USL = 0x82 @3.3V
  154. set_register(0x5A, ATO_CFGT, 0xB5);*/ // Target = 0.9*USL = 0xB5 @3.3V
  155. set_register(0x5A, ELE_CFG, 0x0C);
  156. }
  157. void set_register(int address, unsigned char r, unsigned char v)
  158. {
  159. // Serial.println("Beginnig transimittion");
  160. Wire.beginTransmission(address);
  161. //Serial.print("Writing r:");
  162. Wire.write(r);
  163. //Serial.println( I2c.write((uint8_t)address, r) );
  164. //Serial.print("Writing v: ");
  165. Wire.write(v);
  166. //Serial.println( I2c.write((uint8_t)address, v) );
  167. //Serial.println("ending transimittion");
  168. Wire.endTransmission();
  169. }
  170. };
  171. #endif