From 844a1b814024ee2fe78ff473a380fe16183231f6 Mon Sep 17 00:00:00 2001 From: Andrea Manni Date: Mon, 11 May 2015 18:59:19 +0200 Subject: [PATCH] Bussola e interrupt --- hardware/bussola/magsensor/magsensor.ino | 115 ++++++++++++++++++ .../input_interrupt_1_debounce.ino | 41 +++++++ 2 files changed, 156 insertions(+) create mode 100644 hardware/bussola/magsensor/magsensor.ino create mode 100644 interrupts/input_interrupt_1_debounce/input_interrupt_1_debounce.ino diff --git a/hardware/bussola/magsensor/magsensor.ino b/hardware/bussola/magsensor/magsensor.ino new file mode 100644 index 0000000..a414f7f --- /dev/null +++ b/hardware/bussola/magsensor/magsensor.ino @@ -0,0 +1,115 @@ +/*************************************************************************** + This is a library example for the HMC5883 magnentometer/compass + + Collegamenti: + + Sensore + - SCL SDA (da SX.) + Arduino + - A5 A4 + + Designed specifically to work with the Adafruit HMC5883 Breakout + http://www.adafruit.com/products/1746 + + *** You will also need to install the Adafruit_Sensor library! *** + + These displays use I2C to communicate, 2 pins are required to interface. + + Adafruit invests time and resources providing this open source code, + please support Adafruit andopen-source hardware by purchasing products + from Adafruit! + + Written by Kevin Townsend for Adafruit Industries with some heading example from + Love Electronics (loveelectronics.co.uk) + + This program is free software: you can redistribute it and/or modify + it under the terms of the version 3 GNU General Public License as + published by the Free Software Foundation. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + + + ***************************************************************************/ + +#include +#include +#include + +/* Assign a unique ID to this sensor at the same time */ +Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(12345); + +void displaySensorDetails(void) +{ + sensor_t sensor; + mag.getSensor(&sensor); + Serial.println("------------------------------------"); + Serial.print ("Sensor: "); Serial.println(sensor.name); + Serial.print ("Driver Ver: "); Serial.println(sensor.version); + Serial.print ("Unique ID: "); Serial.println(sensor.sensor_id); + Serial.print ("Max Value: "); Serial.print(sensor.max_value); Serial.println(" uT"); + Serial.print ("Min Value: "); Serial.print(sensor.min_value); Serial.println(" uT"); + Serial.print ("Resolution: "); Serial.print(sensor.resolution); Serial.println(" uT"); + Serial.println("------------------------------------"); + Serial.println(""); + delay(500); +} + +void setup(void) +{ + Serial.begin(9600); + Serial.println("HMC5883 Magnetometer Test"); Serial.println(""); + + /* Initialise the sensor */ + if(!mag.begin()) + { + /* There was a problem detecting the HMC5883 ... check your connections */ + Serial.println("Ooops, no HMC5883 detected ... Check your wiring!"); + while(1); + } + + /* Display some basic information on this sensor */ + displaySensorDetails(); +} + +void loop(void) +{ + /* Get a new sensor event */ + sensors_event_t event; + mag.getEvent(&event); + + /* Display the results (magnetic vector values are in micro-Tesla (uT)) */ + Serial.print("X: "); Serial.print(event.magnetic.x); Serial.print(" "); + Serial.print("Y: "); Serial.print(event.magnetic.y); Serial.print(" "); + Serial.print("Z: "); Serial.print(event.magnetic.z); Serial.print(" ");Serial.println("uT"); + + // Hold the module so that Z is pointing 'up' and you can measure the heading with x&y + // Calculate heading when the magnetometer is level, then correct for signs of axis. + float heading = atan2(event.magnetic.y, event.magnetic.x); + + // Once you have your heading, you must then add your 'Declination Angle', which is the 'Error' of the magnetic field in your location. + // Find yours here: http://www.magnetic-declination.com/ + // Mine is: -13* 2' W, which is ~13 Degrees, or (which we need) 0.22 radians + // If you cannot find your Declination, comment out these two lines, your compass will be slightly off. + //float declinationAngle = 0.22; + //heading += declinationAngle; + + // Correct for when signs are reversed. + if(heading < 0) + heading += 2*PI; + + // Check for wrap due to addition of declination. + if(heading > 2*PI) + heading -= 2*PI; + + // Convert radians to degrees for readability. + float headingDegrees = heading * 180/M_PI; + + Serial.print("Heading (degrees): "); Serial.println(headingDegrees); + + delay(500); +} diff --git a/interrupts/input_interrupt_1_debounce/input_interrupt_1_debounce.ino b/interrupts/input_interrupt_1_debounce/input_interrupt_1_debounce.ino new file mode 100644 index 0000000..9361345 --- /dev/null +++ b/interrupts/input_interrupt_1_debounce/input_interrupt_1_debounce.ino @@ -0,0 +1,41 @@ +/* + Interrupts : input deboounce + + Utilizzare un interrupt per intercettare + l'input di un interruttore momentaneo. + + Debounce software nella funzione richiamata. + Per debounce hardware: http://www.all-electric.com/schematic/debounce.htm + + */ + +int ledPin = 13; +volatile int state = LOW; + +void setup() +{ + pinMode(ledPin, OUTPUT); + pinMode(2, INPUT_PULLUP); + attachInterrupt(0, blink, FALLING); +} + +void loop() +{ + //digitalWrite(ledPin, state); + delay(10000); // Mette in pausa Arduino per 10sec +} + +// Funzioni +void blink() +// Modifica dello stato del LED +{ + static unsigned long last_interrupt_time = 0; + // If interrupts come faster than 200ms, assume it's a bounce and ignore + if (millis() - last_interrupt_time > 200) + { // Azione da intraprendere + state = !state; + digitalWrite(ledPin, state); + } + last_interrupt_time = millis(); +} + -- 2.39.2