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(){
}

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


giovedì 17 maggio 2012

Led






Non essendo molto pratico di elettronica mi manda nei pazzi anche un solo Led (quale sara' la maledetta polarita'??) per questo mi metto questo appunto
Il pin piu' lungo di un led corrisponde al polo positivo

Per evitare di bruciare un led e' necessario inserire una resistenza che nel caso di un led rosso puo' essere da 220 Ohm (ma fino ad un 1KOhm vanno bene)

Nel caso di uso con Arduino il Pin 13 digitale e' gia' provvisto di una resistenza interna per cui non e' necessario aggiungerne altre

Rele' ed Arduino

Per fare qualche prova mi sono comprato un rele' per vedere se riesco a pilotarlo con l'Arduino.
E' qualche anno che non ho piu' pratica di rele' e quindi e' necessario un ripasso
Il modello che ho comprato e' un Finder 40.52.9012 con 12 Vdc sul magnete (sono i due pin piu' a sinistra) ed 8A/250V sull'uscita con due invertitori .... probabilmente il primo errore e' stato prendere un rele' con 12 Vdc di alimentazione in quanto l'Arduino spara fuori 5 Volts dalle uscita analogiche ...diciamo con un pacco da 4 pile ricaricabili (meno 5 Volts) riesco a farlo scattare quindi potrebbe funzionare




Pedinatura


Considerando nel dettaglio la pedinatura
i due terminali separati pilotano la tensione della bobina
i 6 terminali raggruppati gestiscono di fatto due linee separate (divise lungo l'asse maggiore del rele')
quando non viene applicata corrente i pin 1 e 2 di ciascun canale risultano in corto (0 Ohm) mentre i pin 2 e 3 di ciascun canale hanno resistenza infinita (non sono in collegamento)
quando si applica corrente alla bobina (e si sente chiaramente il rumore dell'elettrocalamita che stacca i contatti) e pin 1 e  2 risultano a resistenza infinita mentre i pin 2 e 3 risultano in corto (0 Ohm)

AGGIORNAMENTO
Il problema con Arduino e' quello di trovare dei rele' con corrente di bobina di 5 V che pilotino il 220 sul rele'; inoltre la corrente di una Arduino disponibile sui pin digitali e' di circa 40 mA mentre la bobina ne consuma circa 150 mA per cui non e' fattibile di gestire direttamente i rele' dalla scheda.
Una soluzione e' quella di utilizzare gli appositi shield rele' che presentano alimentazioni separate

AGGIORNAMENTO 2
Per il calcolo della corrente da inserire in un rele' per la corrente di bobina non e' necessario conoscere la sola tensione ma anche l'amperaggio.
Se sono riportate solo le indicazione dei Volt di bobina si puo' prendere un multimetro, calcolare la resistenza ai pin della bobina, e tramite la legge di Ohm calcolare la tensione di attivazione della bobina

Calcolo del tempo con Arduino

Per prima cosa si deve scaricare la libreria Time da qui da inserire poi nella directory libraries del software di programmazione dell'Arduino (vengono aggiunte Time TimeAlarms e DS1307RTC)

dopo si puo' provare con il seguente sketch che riporta il valore in millisecondi dall'accensione della scheda

---------------------
unsigned long time;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  Serial.print("tempo : ");
  time = millis();
  Serial.println(time);
  delay(1000);
}

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

Arduino Ethernet


 L'Arduino Ethernet non e' provvista di una porta USB per la programmazione ma solo di un ingresso FTDI per cui e' stato necessario comprare un convertitore esterno che lega l'FTDI ad un ingresso MicroUSb (l'uso dell'interfaccia permette anche di evitare l'uograde del bootloader)

L'alimentazione alla scheda viene data dal convertitore, in caso di assenza si deve alimentare mediante una batteria da 9 V in quanto il voltaggio di ingresso consentito e' tra 7 e 12 V. Altrimenti si puo' usare un alimentatore AC/DC da muro con 9 V ed il + sul pin centrale


Per la programmazione e' necessario anche modifica il file boards.txt che si trova nella directory /hardware/arduino del software di programmazione (fatto cio' nell'interfaccia e' possibile selezionare la scheda)

Nella foto soprastante si puo' vedere l'Arduino collegata direttamente al PC mediante un cavo di rete incrociato

Arduino unboxing

C'e chi fa l'unboxing dei prodotti Apple....io quello dei nuovi giocattoli Arduino




mercoledì 16 maggio 2012

Sensore Umidita' e temperatura

Per questa prova e' stato usato un sensore Phidgets 1125 che monta sia un sensore di temperatura che di umidita' relativa; il sensore e' nato per essere collegato alla PhidgetInterfaceKit 8/8/8 ma in realta' puo' essere collegato tranquillamente ad una Arduino visto che in uscita si ha un segnala analogico

La pedinatura dei cavi e'
Nero = Ground
Rosso = Power (+5v)
Bianco = segnale analogic0



I collegamenti sulla bread board sono piuttosto banali

Lo sketch per leggere i dati e' nettamente piu' semplice rispetto all'intefaccia I2C
(Le formule di conversione tra segnale  e temperatura/umidita' sono state riprese dalle specifiche tecniche del sensore)

------------------------
// legge temperatura e umidita'
int temp = 0;
int umi = 0;
float temp2 = 0.0;
float rh = 0.0;

void setup() {      
Serial.begin(9600); 
}

void loop() {
  temp = analogRead(A0);   // legge il primo
  umi = analogRead(A1);
  temp2 = (temp * 0.2222) -61.11;
  rh = (umi*0.1906)-40.2;
  Serial.print("Temp  (C): ");
  Serial.println(temp2);
  Serial.print("Umidita' rel.%: ");
  Serial.println(rh);
  delay(1000);           
}

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


I valori di temperatura sono coerenti .... non ho ancora capito bene i risultati dell'umidita' :<<<<


Debugger integrato ESP32S3

Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede  nell'ID USB della porta Jtag. Nel modulo...