]> git.piffa.net Git - sketchbook_andrea/commitdiff
Bussola e interrupt
authorAndrea Manni <andrea@piffa.net>
Mon, 11 May 2015 16:59:19 +0000 (18:59 +0200)
committerAndrea Manni <andrea@piffa.net>
Mon, 11 May 2015 16:59:19 +0000 (18:59 +0200)
hardware/bussola/magsensor/magsensor.ino [new file with mode: 0644]
interrupts/input_interrupt_1_debounce/input_interrupt_1_debounce.ino [new file with mode: 0644]

diff --git a/hardware/bussola/magsensor/magsensor.ino b/hardware/bussola/magsensor/magsensor.ino
new file mode 100644 (file)
index 0000000..a414f7f
--- /dev/null
@@ -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 <http://www.gnu.org/licenses/>.
+
+ ***************************************************************************/
+
+#include <Wire.h>
+#include <Adafruit_Sensor.h>
+#include <Adafruit_HMC5883_U.h>
+
+/* 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 (file)
index 0000000..9361345
--- /dev/null
@@ -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();
+}
+