Input Devices
The thirteenth lecture on Wednesday April 26th was about Input Devices: types and communication, switch (button, slide), motion, distance (sonar, optical), magnetic field, temperature, light (IR, visible, phototransistor), acceleration-orientation-rotation, sound, step response, vibration, force, image. Assignment given by Neil for this thirteenth week was:
Between the various output types described by Neil during Week 13 lecture, and despite the fact that Neil's preferred and suggested ones to work with "in-case-of-doubt" were the step-response sensors (covering a very wide range: from resistance to capacitance, inductance, position, pressure, proximity, tilt, acceleration, humidity; event until touchpad and multitouch). I decided to focus on the control of a G1&2" Water Flow Sensor YF-S201, thinking it could also maybe useful to integrate my previously designed servo motor output board, in order to obtain someway a prototype of a very basic aquaponics control board module. This sensor consists in a plastic valve body, a water rotor, and a hall-effect sensor.
Starting point for this assignment was the previous built servo output device board; I used KiCAD EDA and opened Eeschema Module. I removed the button from Port PA7, then I connected the Pin headers to +5V, GND and Port PA7 (Pin#6, renaming it "FLOW"), compatible with flow sensor (at least as reported on ATTiny 84-SSU microcontroller datasheet).
Then as usual, I went successfully through automatic schema Annotation, Electrical Rules Check (ERC) and, before exporting the NETlist, I associated components and footprints from libraries using KiCAD cvPCB Module; from the fab library I associated it to the 1x06SMD footprint. Here's the manual route result:
Here's with the filled zone, before SVG export
Here's is the KiCAD 3D render output
About the firmware, I took some inspiration from Adafruit Flow-meter example, then wrote the following code with Arduino IDE. I removed all serial commands (using interrupts together with software serial it's not so simple), all LCD commands (LCD not present in this case), and finally added commands for servo.
/*
* Based on Liquid flow meter example code
* by Adafruit <http://www.adafruit.com>
*/
#include <Servo.h>
// which pin to use for reading the sensor? can use any pin!
#define FLOWSENSORPIN 6
Servo myservo; // create servo object to control a servo
// count how many pulses!
volatile uint16_t pulses = 0;
// track the state of the pulse pin
volatile uint8_t lastflowpinstate;
// you can try to keep time of how long it is between pulses
volatile uint32_t lastflowratetimer = 0;
// and use that to calculate a flow rate
volatile float flowrate;
// Interrupt is called once a millisecond, looks for any pulses from the sensor!
SIGNAL(TIMER0_COMPA_vect) {
uint8_t x = digitalRead(FLOWSENSORPIN);
if (x == lastflowpinstate) {
lastflowratetimer++;
return; // nothing changed!
}
if (x == HIGH) {
//low to high transition!
pulses++;
}
lastflowpinstate = x;
flowrate = 1000.0;
flowrate /= lastflowratetimer; // in hertz
lastflowratetimer = 0;
}
void useInterrupt(boolean v) {
if (v) {
// Timer0 is already used for millis() - we'll just interrupt somewhere
// in the middle and call the "Compare A" function above
OCR0A = 0xAF;
TIMSK0 |= _BV(OCIE0A);
} else {
// do not call the interrupt function COMPA anymore
TIMSK0 &= ~_BV(OCIE0A);
}
}
void setup() {
pinMode(FLOWSENSORPIN, INPUT);
digitalWrite(FLOWSENSORPIN, HIGH);
lastflowpinstate = digitalRead(FLOWSENSORPIN);
useInterrupt(true);
}
void loop() {
if (flowrate >= 10) {
myservo.write(0);
} else {
myservo.write(180);
}
float liters = pulses;
liters /= 7.5;
liters /= 60.0;
delay(100);
}
Here's the "Hero Shot" of the actual final flow board result, with flow sensor attached: milled, stuffed with components and programmed (for details see Week 04)
and here with flow sensor and servo actuator attached