10 input devices

fernando meneses

base3

10_measure something: add a sensor to a microcontroller board that you’ve designed and read it

For this activity, I will try to design a sensor for my final project (the artifact for bacteria).

first part_

To start with, and not being an expert on the subject, I will begin with activity sensors in the image below the PNG share of the light sensor.

LUZ

Here the PCB-luz:

FullSizeRender-2b

Here the sensor components:

A

We will use the ISP for the data and the FTDI for energy.

B

To program the bootloader (see more  7 embedded programming)

We select our ATtiny microcontrollers..

01

 

Select the ATtiny45.

02

 

Select the clock.

 

03

And now, launch bootloader burned.

04

Burning I bootloader completed.

Captura de pantalla 2015-06-24 a las 21.18.40

To program will use the example of “AnalogReadSerial”.

  1. void setup() {
  2. Serial.begin(9600);
  3. }
  4. void loop() {
  5. int sensorValue = analogRead("pin");
  6. Serial.println(sensorValue);
  7. delay(1);
  8. }

 

To open the serial port, it opens in Tools / serial.

05

It can also be opened from menu, in the serial monitor icon.

06

Here is a video to read the sensor data.

 

second part_

The next step we made in our laboratory was looking for the largest possible number of sensors in the I share image sensors are:

1-10

1- Height Sensor/Pressure – MPL3115A2
2 – Accelerometer, three Axis – MMA8452Q
3 – Humidity Sensor HTU21D
4 – IR Receiver
5 – Magnetometer, three Axis – HMC5883L
6 – Gyroscope with digital outputs, three axes ITG-3200
7 – Ultrasonic Rangefinder – Maxbotix LV-EZ1
8 – PIR Motion Sensor
9 – Large Piezo Vibration Sensor
10, Reed Switch
11- Imam Square 0.25 ”
12 – Resistance Force-sensitive 0.5 ”
13 – SoftPot
14 – Cell Fotoeléctricia
15 – Optical Detector / Phototransistor
16 – Flexible Sensor
17 – Sound Sensor
18 – Color Sensor

As a starting point I will use the color sensor TCS34725 shared by Adafruit:
https://github.com/adafruit/Adafruit_TCS34725

Here an image sensor:
2-10

To test the operation of the sensor, I used an Arduino Mega and the original sensor Adafruit, here we see sensor operation:

4-10

 

5-10b

 

Here is the sample code to control the sensor from the Arduino:

  1. #include
  2. #include "Adafruit_TCS34725.h"
  3. #define redpin 3
  4. #define greenpin 5
  5. #define bluepin 6
  6. #define commonAnode true
  7. byte gammatable[256];
  8. Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X);
  9. void setup() {
  10. Serial.begin(9600);
  11. Serial.println("Color View Test!");
  12. if (tcs.begin()) {
  13. Serial.println("Found sensor");
  14. } else {
  15. Serial.println("No TCS34725 found ... check your connections");
  16. while (1); // halt!
  17. }
  18. pinMode(redpin, OUTPUT);
  19. pinMode(greenpin, OUTPUT);
  20. pinMode(bluepin, OUTPUT);
  21. for (int i=0; i<256; i++) {
  22. float x = i;
  23. x /= 255;
  24. x = pow(x, 2.5);
  25. x *= 255;
  26. if (commonAnode) {
  27. gammatable[i] = 255 - x;
  28. } else {
  29. gammatable[i] = x;
  30. }
  31. }
  32. }
  33. void loop() {
  34. uint16_t clear, red, green, blue;
  35. tcs.setInterrupt(false);
  36. delay(60);
  37. tcs.getRawData(&red, &green, &blue, &clear);
  38. tcs.setInterrupt(true);
  39. Serial.print("C:\t"); Serial.print(clear);
  40. Serial.print("\tR:\t"); Serial.print(red);
  41. Serial.print("\tG:\t"); Serial.print(green);
  42. Serial.print("\tB:\t"); Serial.print(blue);
  43. uint32_t sum = clear;
  44. float r, g, b;
  45. r = red; r /= sum;
  46. g = green; g /= sum;
  47. b = blue; b /= sum;
  48. r *= 256; g *= 256; b *= 256;
  49. Serial.print("\t");
  50. Serial.print((int)r, HEX); Serial.print((int)g, HEX); Serial.print((int)b, HEX);
  51. Serial.println();
  52. analogWrite(redpin, gammatable[(int)r]);
  53. analogWrite(greenpin, gammatable[(int)g]);
  54. analogWrite(bluepin, gammatable[(int)b]);
  55. }

and here the code for the interface in Processing:

  1. import processing.serial.*;
  2. import java.awt.datatransfer.*;
  3. import java.awt.Toolkit;
  4. Serial port;
  5. void setup(){
  6. size(200,200);
  7. port = new Serial(this, "/dev/cu.usbmodem1411", 9600);
  8. }
  9. String buff = "";
  10. int wRed, wGreen, wBlue, wClear;
  11. String hexColor = "ffffff";
  12. void draw(){
  13. background(wRed,wGreen,wBlue);
  14. while (port.available() > 0) {
  15. serialEvent(port.read());
  16. }
  17. }
  18. void serialEvent(int serial) {
  19. if(serial != '\n') {
  20. buff += char(serial);
  21. } else {
  22. int cRed = buff.indexOf("R");
  23. int cGreen = buff.indexOf("G");
  24. int cBlue = buff.indexOf("B");
  25. int clear = buff.indexOf("C");
  26. if(clear >=0){
  27. String val = buff.substring(clear+3);
  28. val = val.split("\t")[0];
  29. wClear = Integer.parseInt(val.trim());
  30. } else { return; }
  31. if(cRed >=0){
  32. String val = buff.substring(cRed+3);
  33. val = val.split("\t")[0];
  34. wRed = Integer.parseInt(val.trim());
  35. } else { return; }
  36. if(cGreen >=0) {
  37. String val = buff.substring(cGreen+3);
  38. val = val.split("\t")[0];
  39. wGreen = Integer.parseInt(val.trim());
  40. } else { return; }
  41. if(cBlue >=0) {
  42. String val = buff.substring(cBlue+3);
  43. val = val.split("\t")[0];
  44. wBlue = Integer.parseInt(val.trim());
  45. } else { return; }
  46. print("Red: "); print(wRed);
  47. print("\tGrn: "); print(wGreen);
  48. print("\tBlue: "); print(wBlue);
  49. print("\tClr: "); println(wClear);
  50. wRed *= 255; wRed /= wClear;
  51. wGreen *= 255; wGreen /= wClear;
  52. wBlue *= 255; wBlue /= wClear;
  53. hexColor = hex(color(wRed, wGreen, wBlue), 6);
  54. println(hexColor);
  55. buff = "";
  56. }
  57. }

You need to be a little careful with external light, but the sensor works perfectly.

The plate was designed by Adafruit Industries. Creative Commons Attribution license, can download the library here:

https://github.com/adafruit/Adafruit-Eagle-Library

And here we see TCS34725 Eagle files:

8-10

9-10

After this, I have designed a PCB with sensors for bacteria recognizer.

10-10

11-10

After reviewing the cost of the device with 12 sensors, and thinking it was an inexpensive device, it was decided to make a simple PCB in one sensor, for now embark on the light sensor Adafruit, but in the Future development must include a sensor device of a color, so leave this here for future reference.

At the moment I am presenting in the python code for TCS34725:

https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code/tree/master/Adafruit_TCS34725

  1. +#!/usr/bin/python
  2. +
  3. +import time
  4. +from Adafruit_I2C import Adafruit_I2C
  5. +
  6. +# ===========================================================================
  7. +# TCS3472 Class
  8. +# ===========================================================================
  9. +
  10. +
  11. +class TCS34725:
  12. + i2c = None
  13. +
  14. + __TCS34725_ADDRESS = 0x29
  15. + __TCS34725_ID = 0x12 # 0x44 = TCS34721/TCS34725, 0x4D = TCS34723/TCS34727
  16. +
  17. + __TCS34725_COMMAND_BIT = 0x80
  18. +
  19. + __TCS34725_ENABLE = 0x00
  20. + __TCS34725_ENABLE_AIEN = 0x10 # RGBC Interrupt Enable
  21. + __TCS34725_ENABLE_WEN = 0x08 # Wait enable - Writing 1 activates the wait timer
  22. + __TCS34725_ENABLE_AEN = 0x02 # RGBC Enable - Writing 1 actives the ADC, 0 disables it
  23. + __TCS34725_ENABLE_PON = 0x01 # Power on - Writing 1 activates the internal oscillator, 0 disables it
  24. + __TCS34725_ATIME = 0x01 # Integration time
  25. + __TCS34725_WTIME = 0x03 # Wait time (if TCS34725_ENABLE_WEN is asserted)
  26. + __TCS34725_WTIME_2_4MS = 0xFF # WLONG0 = 2.4ms WLONG1 = 0.029s
  27. + __TCS34725_WTIME_204MS = 0xAB # WLONG0 = 204ms WLONG1 = 2.45s
  28. + __TCS34725_WTIME_614MS = 0x00 # WLONG0 = 614ms WLONG1 = 7.4s
  29. + __TCS34725_AILTL = 0x04 # Clear channel lower interrupt threshold
  30. + __TCS34725_AILTH = 0x05
  31. + __TCS34725_AIHTL = 0x06 # Clear channel upper interrupt threshold
  32. + __TCS34725_AIHTH = 0x07
  33. + __TCS34725_PERS = 0x0C # Persistence register - basic SW filtering mechanism for interrupts
  34. + __TCS34725_PERS_NONE = 0b0000 # Every RGBC cycle generates an interrupt
  35. + __TCS34725_PERS_1_CYCLE = 0b0001 # 1 clean channel value outside threshold range generates an interrupt
  36. + __TCS34725_PERS_2_CYCLE = 0b0010 # 2 clean channel values outside threshold range generates an interrupt
  37. + __TCS34725_PERS_3_CYCLE = 0b0011 # 3 clean channel values outside threshold range generates an interrupt
  38. + __TCS34725_PERS_5_CYCLE = 0b0100 # 5 clean channel values outside threshold range generates an interrupt
  39. + __TCS34725_PERS_10_CYCLE = 0b0101 # 10 clean channel values outside threshold range generates an interrupt
  40. + __TCS34725_PERS_15_CYCLE = 0b0110 # 15 clean channel values outside threshold range generates an interrupt
  41. + __TCS34725_PERS_20_CYCLE = 0b0111 # 20 clean channel values outside threshold range generates an interrupt
  42. + __TCS34725_PERS_25_CYCLE = 0b1000 # 25 clean channel values outside threshold range generates an interrupt
  43. + __TCS34725_PERS_30_CYCLE = 0b1001 # 30 clean channel values outside threshold range generates an interrupt
  44. + __TCS34725_PERS_35_CYCLE = 0b1010 # 35 clean channel values outside threshold range generates an interrupt
  45. + __TCS34725_PERS_40_CYCLE = 0b1011 # 40 clean channel values outside threshold range generates an interrupt
  46. + __TCS34725_PERS_45_CYCLE = 0b1100 # 45 clean channel values outside threshold range generates an interrupt
  47. + __TCS34725_PERS_50_CYCLE = 0b1101 # 50 clean channel values outside threshold range generates an interrupt
  48. + __TCS34725_PERS_55_CYCLE = 0b1110 # 55 clean channel values outside threshold range generates an interrupt
  49. + __TCS34725_PERS_60_CYCLE = 0b1111 # 60 clean channel values outside threshold range generates an interrupt
  50. + __TCS34725_CONFIG = 0x0D
  51. + __TCS34725_CONFIG_WLONG = 0x02 # Choose between short and long (12x) wait times via TCS34725_WTIME
  52. + __TCS34725_CONTROL = 0x0F # Set the gain level for the sensor
  53. + __TCS34725_ID = 0x12 # 0x44 = TCS34721/TCS34725, 0x4D = TCS34723/TCS34727
  54. + __TCS34725_STATUS = 0x13
  55. + __TCS34725_STATUS_AINT = 0x10 # RGBC Clean channel interrupt
  56. + __TCS34725_STATUS_AVALID = 0x01 # Indicates that the RGBC channels have completed an integration cycle
  57. +
  58. + __TCS34725_CDATAL = 0x14 # Clear channel data
  59. + __TCS34725_CDATAH = 0x15
  60. + __TCS34725_RDATAL = 0x16 # Red channel data
  61. + __TCS34725_RDATAH = 0x17
  62. + __TCS34725_GDATAL = 0x18 # Green channel data
  63. + __TCS34725_GDATAH = 0x19
  64. + __TCS34725_BDATAL = 0x1A # Blue channel data
  65. + __TCS34725_BDATAH = 0x1B
  66. +
  67. + __TCS34725_INTEGRATIONTIME_2_4MS = 0xFF # 2.4ms - 1 cycle - Max Count: 1024
  68. + __TCS34725_INTEGRATIONTIME_24MS = 0xF6 # 24ms - 10 cycles - Max Count: 10240
  69. + __TCS34725_INTEGRATIONTIME_50MS = 0xEB # 50ms - 20 cycles - Max Count: 20480
  70. + __TCS34725_INTEGRATIONTIME_101MS = 0xD5 # 101ms - 42 cycles - Max Count: 43008
  71. + __TCS34725_INTEGRATIONTIME_154MS = 0xC0 # 154ms - 64 cycles - Max Count: 65535
  72. + __TCS34725_INTEGRATIONTIME_700MS = 0x00 # 700ms - 256 cycles - Max Count: 65535
  73. +
  74. + __TCS34725_GAIN_1X = 0x00 # No gain
  75. + __TCS34725_GAIN_4X = 0x01 # 2x gain
  76. + __TCS34725_GAIN_16X = 0x02 # 16x gain
  77. + __TCS34725_GAIN_60X = 0x03 # 60x gain
  78. +
  79. + __integrationTimeDelay = {
  80. + 0xFF: 0.0024, # 2.4ms - 1 cycle - Max Count: 1024
  81. + 0xF6: 0.024, # 24ms - 10 cycles - Max Count: 10240
  82. + 0xEB: 0.050, # 50ms - 20 cycles - Max Count: 20480
  83. + 0xD5: 0.101, # 101ms - 42 cycles - Max Count: 43008
  84. + 0xC0: 0.154, # 154ms - 64 cycles - Max Count: 65535
  85. + 0x00: 0.700 # 700ms - 256 cycles - Max Count: 65535
  86. + }
  87. +
  88. + # Private Methods
  89. + def __readU8(self, reg):
  90. + return self.i2c.readU8(self.__TCS34725_COMMAND_BIT | reg)
  91. +
  92. + def __readU16Rev(self, reg):
  93. + return self.i2c.readU16Rev(self.__TCS34725_COMMAND_BIT | reg)
  94. +
  95. + def __write8(self, reg, value):
  96. + self.i2c.write8(self.__TCS34725_COMMAND_BIT | reg, value & 0xff)
  97. +
  98. + # Constructor
  99. + def __init__(self, address=0x29, debug=False, integrationTime=0xFF, gain=0x01):
  100. + self.i2c = Adafruit_I2C(address)
  101. +
  102. + self.address = address
  103. + self.debug = debug
  104. + self.integrationTime = integrationTime
  105. + self.initialize(integrationTime, gain)
  106. +
  107. + def initialize(self, integrationTime, gain):
  108. + "Initializes I2C and configures the sensor (call this function before \
  109. + doing anything else)"
  110. + # Make sure we're actually connected
  111. + result = self.__readU8(self.__TCS34725_ID)
  112. + if (result != 0x44):
  113. + return -1
  114. +
  115. + # Set default integration time and gain
  116. + self.setIntegrationTime(integrationTime)
  117. + self.setGain(gain)
  118. +
  119. + # Note: by default, the device is in power down mode on bootup
  120. + self.enable()
  121. +
  122. + def enable(self):
  123. + self.__write8(self.__TCS34725_ENABLE, self.__TCS34725_ENABLE_PON)
  124. + time.sleep(0.01)
  125. + self.__write8(self.__TCS34725_ENABLE, (self.__TCS34725_ENABLE_PON | self.__TCS34725_ENABLE_AEN))
  126. +
  127. + def disable(self):
  128. + reg = 0
  129. + reg = self.__readU8(self.__TCS34725_ENABLE)
  130. + self.__write8(self.__TCS34725_ENABLE, (reg & ~(self.__TCS34725_ENABLE_PON | self.__TCS34725_ENABLE_AEN)))
  131. +
  132. + def setIntegrationTime(self, integrationTime):
  133. + "Sets the integration time for the TC34725"
  134. + self.integrationTime = integrationTime
  135. +
  136. + self.__write8(self.__TCS34725_ATIME, integrationTime)
  137. +
  138. + def getIntegrationTime(self):
  139. + return self.__readU8(self.__TCS34725_ATIME)
  140. +
  141. + def setGain(self, gain):
  142. + "Adjusts the gain on the TCS34725 (adjusts the sensitivity to light)"
  143. + self.__write8(self.__TCS34725_CONTROL, gain)
  144. +
  145. + def getGain(self):
  146. + return self.__readU8(self.__TCS34725_CONTROL)
  147. +
  148. + def getRawData(self):
  149. + "Reads the raw red, green, blue and clear channel values"
  150. +
  151. + color = {}
  152. +
  153. + color["r"] = self.__readU16Rev(self.__TCS34725_RDATAL)
  154. + color["b"] = self.__readU16Rev(self.__TCS34725_BDATAL)
  155. + color["g"] = self.__readU16Rev(self.__TCS34725_GDATAL)
  156. + color["c"] = self.__readU16Rev(self.__TCS34725_CDATAL)
  157. +
  158. + # Set a delay for the integration time
  159. + delay = self.__integrationTimeDelay.get(self.integrationTime)
  160. + time.sleep(delay)
  161. +
  162. + return color
  163. +
  164. + def setInterrupt(self, int):
  165. + r = self.__readU8(self.__TCS34725_ENABLE)
  166. +
  167. + if (int):
  168. + r |= self.__TCS34725_ENABLE_AIEN
  169. + else:
  170. + r &= ~self.__TCS34725_ENABLE_AIEN
  171. +
  172. + self.__write8(self.__TCS34725_ENABLE, r)
  173. +
  174. + def clearInterrupt(self):
  175. + self.i2c.write8(0x66 & 0xff)
  176. +
  177. + def setIntLimits(self, low, high):
  178. + self.i2c.write8(0x04, low & 0xFF)
  179. + self.i2c.write8(0x05, low >> 8)
  180. + self.i2c.write8(0x06, high & 0xFF)
  181. + self.i2c.write8(0x07, high >> 8)
  182. +
  183. + #Static Utility Methods
  184. + @staticmethod
  185. + def calculateColorTemperature(rgb):
  186. + "Converts the raw R/G/B values to color temperature in degrees Kelvin"
  187. +
  188. + if not isinstance(rgb, dict):
  189. + raise ValueError('calculateColorTemperature expects dict as parameter')
  190. +
  191. + # 1. Map RGB values to their XYZ counterparts.
  192. + # Based on 6500K fluorescent, 3000K fluorescent
  193. + # and 60W incandescent values for a wide range.
  194. + # Note: Y = Illuminance or lux
  195. + X = (-0.14282 * rgb['r']) + (1.54924 * rgb['g']) + (-0.95641 * rgb['b'])
  196. + Y = (-0.32466 * rgb['r']) + (1.57837 * rgb['g']) + (-0.73191 * rgb['b'])
  197. + Z = (-0.68202 * rgb['r']) + (0.77073 * rgb['g']) + ( 0.56332 * rgb['b'])
  198. +
  199. + # 2. Calculate the chromaticity co-ordinates
  200. + xc = (X) / (X + Y + Z)
  201. + yc = (Y) / (X + Y + Z)
  202. +
  203. + # 3. Use McCamy's formula to determine the CCT
  204. + n = (xc - 0.3320) / (0.1858 - yc)
  205. +
  206. + # Calculate the final CCT
  207. + cct = (449.0 * (n ** 3.0)) + (3525.0 *(n ** 2.0)) + (6823.3 * n) + 5520.33
  208. +
  209. + return int(cct)
  210. +
  211. + @staticmethod
  212. + def calculateLux(rgb):
  213. + "Converts the raw R/G/B values to color temperature in degrees Kelvin"
  214. +
  215. + if not isinstance(rgb, dict):
  216. + raise ValueError('calculateLux expects dict as parameter')
  217. +
  218. + illuminance = (-0.32466 * rgb['r']) + (1.57837 * rgb['g']) + (-0.73191 * rgb['b'])
  219. +
  220. + return int(illuminance)

 

_conclusion

Receive data from the real world, is wonderful, this is one of the most powerful parties to do just about anything in particular, I learned that there are a large number of sensors, I also learned that there is a serial port. In this activity explore the input signal from the Arduino.

_files

luz.png
luz.ai
TCS34725.sch
TCS34725.bdr
_
Original source: http://academy.cba.mit.edu/classes/input_devices/index.html

Contact:  fernando.meneses@udem.edu / fernandomeneses@nodolab.com /  f  /  in  /  g+ / b / vmx / w