venerdì 18 maggio 2012

Bussola + Pitch + Roll


Ho sperimentato il sensore CMPS10 (in pratica una bussola con compensazione di inclinazione) che fornisce indicazioni anche sull'inclinazione degli assi di pitch e di roll

Il sensore costa una quarantina di euro ed ammette voltaggi di ingresso da 3.3 a 5 V (ottimo per l'Arduino) con un consumo di 25 mA. La risoluzione di 0.1 gradi con una accuratezza minima dell'1%.
La comunicazione puo' avvenire su interfaccia I2C, SPI e Seriale .. io sono andato sulla S2C

Questa e' la pedinatura dell'I2C..dato che il componente non riporta sigle sulla scheda e che si monta a testa all'ingiu' sulla breadboard mi sono fatto un adesivo con i nomi dei connettori per non sbagliare.
L'orientamento dell' heading della scheda e' verso sinistra ovvero il valore di angolo tra il Nord e la scheda viene letto rispetto al lato con i pin 

ATTENZIONE : per funzionare correttamente il sensore deve essere messo con i pin e con gli integrati rivolti verso l'alto (non come in fotografia, nelle prove e' stata rigirara la breadboard) altrimenti la compensazione dell'inclinazione della bussola non funziona e risponde in modo causuale

La scheda di prova montata




Per rendere piu' chiaro il montaggio della scheda riporto un disegno fatto con Fritzing

Lo skecth e' stato modificato rispetto a quello di esempio della ditta perche' sostanzialmente non funzionava per problemi sulla libreria Wire.h..cosi' funziona
------------
#include <Wire.h>

#define ADDRESS 0x60        // Defines address of CMPS10


void setup(){
  Wire.begin();  // Conects I2C
  Serial.begin(9600);
}

void loop(){
   byte highByte, lowByte, fine;              // highByte and lowByte store high and low bytes of the bearing and fine stores decimal place of bearing
   char pitch, roll;                          // Stores pitch and roll values of CMPS10, chars are used because they support signed value
   int bearing;                               // Stores full bearing
  
   Wire.beginTransmission(ADDRESS);           //starts communication with CMPS10
   Wire.send(2);                              //Sends the register we wish to start reading from
   Wire.endTransmission();

   Wire.requestFrom(ADDRESS, 4);              // Request 4 bytes from CMPS10
   while(Wire.available() < 4);               // Wait for bytes to become available
   highByte = Wire.receive();          
   lowByte = Wire.receive();           
   pitch = Wire.receive();             
   roll = Wire.receive();              
  
   bearing = ((highByte<<8)+lowByte)/10;      // Calculate full bearing
   fine = ((highByte<<8)+lowByte)%10;         // Calculate decimal place of bearing
  
   display_data(bearing, fine, pitch, roll);  // Display data to the LCD03
  
   delay(1000);
}

void display_data(int b, int f, int p, int r){    // pitch and roll (p, r) are recieved as ints instead oif bytes so that they will display corectly as signed values.
 
  Serial.print("Bearing = ");                      // Display the full bearing and fine bearing seperated by a decimal poin on the LCD03
  Serial.print(b);                              
  Serial.print(".");
  Serial.println(f);
  Serial.print("Pitch = ");
  Serial.println(p);
  Serial.print("Roll = ");
  Serial.println(r);
  delay(1000);
}
 
------------




Leggendo le specifiche mi sono accorto che nei registri da 16 a 21 (16-17 = X, 18-19 = Y, 20-21 = Z) sono inseriti i dati di accelerazione...potrebbe essere interessante

Per effettuare il reset ai valori di fabbrica si puo' usare la seguente procedura
----------------------------------------------------
 #include <Wire.h>

#define deviceId 0x60        // Defines address of CMPS10


void setup(){
  Wire.begin(); 
Wire.beginTransmission(deviceId);
Wire.send(22);
Wire.send(0x20);
Wire.endTransmission();
delay(100);
Wire.beginTransmission(deviceId);
Wire.send(22);
Wire.send(0x2A);
Wire.endTransmission();
delay(100);
Wire.beginTransmission(deviceId);
Wire.send(22);
Wire.send(0x60);
Wire.endTransmission();
}

void loop(){
}

----------------------------------------
 


Nessun commento:

Posta un commento

Physics informed neural network Fukuzono

Visto che puro ML non funziona per le serie tempo di cui mi sto occupando ed le regressioni basate su formule analitiche mostrano dei limiti...