mercoledì 1 gennaio 2014

ENC28J60 Ethernet Shield

In un precedente post avevo segnalato che uno dei due miei shield non funzionava con Arduino Due. In realta' i due shield presentati sono profondamente differenti in quanto basati su due chip differenti.

Il chip W5100 e' quello montato dallo shield supportato direttamente da Arduino e che quindi funziona direttamente con gli sketch presenti nell'IDE mentre il secondo chip e' denominato ENC28J60 non ha un supporto diretto con la necessita' quindi di installare una libreria apposita. Quale e' la differenza tra i due: il W5100 gestisce in modo nativo lo stack TCP/IP mentre ENC28J60 usa il processore dell'Arduino per le operazioni di rete. Ovviamente il secondo costa decisamente meno del primo a causa delle capacita' piu' limitate

A sinistra lo shield ENC28J60,a destra lo shield W5100



Ho provato differenti librerie ma l'unica che sembra funzionare e' questa. piuttosto limitata nelle funzioni
Secondo alcuni dovrebbe funzionare la libreria Ethercard ma per le mie prove gli sketch si compilano ma la scheda non assuma mai l'IP (sia che statico che dinamico)
Per la cronaca la scheda e' stata acquistata qui

CC1101 su Arduino

Mi e' stata prestata questa coppia di trasmettitori/ricevitori basati su chip Texas CC1101.
Questo componente promette bene perche' sulla scheda tecnica e' riportato un range di trasmissione di 300-500 metri in aria libera


I collegamenti sono a 7 fili (a destra i pin del CC1101,a sinistra i pin dell'Arduino)

GND / GND
VCC / VCC (3.3V)
CSN / D10
MOSI /D11
MISO / D12
SCK / D13
GD0 / D2

E' riportato che il componente lavori sia con le librerie di PanStamp che ElecHouse
Dalle mie prove (fatte su una Debian Box con l'ultima IDE di Arduino) non sono riuscito a compilare gli esempi di PanStamp (sembra a causa di un variabile definita in un header che non viene gestita dal compilatore, commentando la definizione di questa variabile relativa al risparmio energetico, lo sketch si compila ma non funziona)

Usando invece gli esempi della libreria ElecHouse tutto si compila correttamente ma da un paio di prove non sono mai riuscito a superare i 25 m di distanza di trasmissione in aria libera (a 25 m i pacchetti arrivano completi, da 25 a 30 m di distanza arrivano corrotti, oltre i 30 metri non arriva niente).
Sicuramente e' un mio errore perche' le librerie Pamstamp permettono di definire il livello di potenza della trasmissione (cosa che sembra assente in ElecHouse)

Interrupt su Arduino

Supponiamo il seguente scenario con protagonista un microcontrollore Arduino
1) Il compito e' quello di effettuare un compito ripetitivo (perfetto per il loop) ma di lunga durata.
2) All'interno di questo compito di lunga durata devono essere intercettati eventi (quale puo' essere un sistema di allarme od un sistema di protezione) in realtime che forzi Arduino ad agire immediatamente

Questo e' un campo di applicazione degli interrupt

Per semplificare diciamo che il compito ripetitivo e' quello di far blinkare il led in porta D13 con un ciclo di 10 secondi mentre l'evento extra e' dato dalla pressione di un pulsante collegato al pin D02 (interrupt 0 su Arduino UNO) che accenda il led in porta D12


Nel video si osserva come nel caso di accensione del led non determinato dall'interrupt si deve attendere che il loop effettui il suo ciclo completo (vedi sorgente sottostante, un ciclo completo e' di 10 secondi), nella seconda parte gestita dall'interrupt l'accensione e' istantanea

Come e' fatto il circuito



L'aspetto importante di questo esempio e' la possibilita' di effettuare operazioni all'interno di un interrupt (l'esempio del sito di Arduino mostra come cambiare il valore di una variabile ma l'azione di interpretare la variabile ed agire di conseguenza era sempre demandata al loop, cosi' se questo era occupato in una operazione lunga, non c'e' nessun vantaggio)


con gestione interrupt
-----------------------------------------------
int pin = 13;
volatile int state = LOW;
int led = 12;



void setup()
{
  pinMode(pin, OUTPUT);
  pinMode(led, OUTPUT);  

  attachInterrupt(0, blink, CHANGE);
}

void loop()
{
  digitalWrite(led, HIGH);  
  delay(1000);               
  digitalWrite(led, LOW);    
  delay(1000);               
}

void blink()
{
  state = !state;
  digitalWrite(pin, state);

}
-------------------------------------------------------------------------


senza gestione interrupt
-------------------------------------------------------------------------
#define led 13               
#define led2 12
#define BUTTON 2           
int  val = 0;                 

void setup() {
  pinMode(led, OUTPUT);       
  pinMode(BUTTON, INPUT);     
  pinMode(led2, OUTPUT);
}

void loop() {
  val = digitalRead(BUTTON);  // legge il valore dell'input e lo conserva

  // controlla che l'input sia HIGH (pulsante premuto)
  if (val == HIGH) {
    digitalWrite(led, HIGH);  //accende il led
  }
  else {
    digitalWrite(led, LOW);   //spegne il led
  }
  digitalWrite(led2, HIGH);   
  delay(5000);               
  digitalWrite(led2, LOW);    
  delay(5000);           
}

lunedì 30 dicembre 2013

Aggiornamento PN51T

In occasione dello scadere del contratto Internet annuale con TIM e nell'incertezza se rinnovare con la stessa societa' o passare a Vodafone (che allo stesso prezzo fornisce anche l'access point mobile) ho provato ad aggiornare il firmware del PN51T per farlo funzionare con la Arduino Yun (il motivo principale per cui mi tornerebbe comodo usare il PN51T, vedi precedente post)

da una visita sul sito http://www.ondacommunication.com/it/software_manuals.html ho visto che e' disponibile all'aggiornamento alla versione 10 del firmware mentre il mio dispositivo monta ancora la versione 6 (link a file di aggiornamento)

Firmware originale
L'aggiornamento si puo' eseguire solo sotto Windows e solo dopo aver installato i driver del dispositivo


La procedura dura circa 7 minuti


Al termine il dispositivo ha aggiornato il software


Attenzione: al riavvio si deve reinserire il codice PIN dall'interfaccia Web (altrimenti l'icona di rete rimane rosssa e non si accede ad Internet)

Adesso il PN51T funziona correttamente con Arduino Yun

venerdì 27 dicembre 2013

Distanza da antenna di telefonia mobile

UPDATE:
c'e' un errore di fondo nel calcolo della distanza impiegato in questo post
Le api di Android riportano la potenza del segnale in modo differente se si tratta di GSM o UMTS. Nel primo caso il valore viene espresso in dB mentre nel secondo in Dbm
Nei prossimi post cerchero'  di correggere l'errore
------------------------------------------------------------------------

Utilizzando la funzione signalStrength.getGsmSignalStrength() di Android e' possibile stimare la potenza del segnale della rete GSM e convertirla nel suo valore espresso in dB

Utilizzando la formula di FSPL (Free Space Path Loss) e' possibile inoltre risalire alla distanza tra l'antenna della telefonia mobile ed il proprio dispositivo mobile

Riprendendo da Wikipedia, la FSPL espressa per valori in GHz e' la seguente

dove
d = distanza tra l'antenna ed il dispositivo mobile
f = frequenza (2.1 GHz per la rete GSM italiana)
FSPL = il valore riportato dalla funzione Android

invertendo per ottenere la distanza e semplificando i calcoli (dato che la frequenza e' sempre la stesssa) si ha che
distanza = 10E((FSPL-98.89)/20)

Questa formula e' stata implementata in un semplice programma che mostra i dati di telefonia correlati ai dati derivanti dal GPS per una verifica (grossolana) dell'efficacia del sistema. Possono inseriti anche fattori di attenuazione e guadagni delle antenne ma nel caso in esame sono dati non disponibili


(la massima copertura di una antenna di telefonia e' di circa 24 Km)
Per la posizione delle antenne di telefonia mobile sono stati presi i dati da http://www.opencellid.org o da developer.opensignal.com
-----------------------------------------------------
Caso 1:
il telefono e' ubicato in posizione
Long : 11°17'27,32'' (ovvero 11.290922)
Lat : 43°45'33,05" (ovvero 43.759181)

La cella agganciata ha identificativo
MCC : 222
MNC :88
LAC : 36057
CID : 27988244
Long : 11.291428
Lat : 43.757431



La distanza stimata mediante il metodo FSPL e' di 0.16 Km mentre la distanza reale e' di Km 0.2


-----------------------------------------------------
Caso 2:
il telefono e' ubicato in posizione
Long : 11°18'38,73'' (ovvero 11.310758)
Lat : 43°50'1,61" (ovvero 43.833781)

La cella agganciata ha identificativo
MCC : 222
MNC :88
LAC : 36057
CID : 27997133
per una posizione dell'antenna di
Long : 11.304655
Lat : 43.8257665



La distanza stimata mediante il metodo FSPL e' di 0.2 Km mentre la distanza reale e' di Km 1.017


 -----------------------------------------------------
Caso 3:
il telefono e' ubicato in posizione
Long : 11°13'47,94'' (ovvero 11.229983)
Lat : 43°47'2,92" (ovvero 43.784144)

La cella agganciata ha identificativo
MCC : 222
MNC :88
LAC : 36057
CID : 27988287
per una posizione dell'antenna di
Long : 11.2312
Lat : 43.7845993



La distanza stimata mediante il metodo FSPL e' di 0.04 Km mentre la distanza reale e' di Km 0.11


 -----------------------------------------------------
Caso 4:
il telefono e' ubicato in posizione
Long : 11°18'38.73'' (ovvero 11.229983)
Lat : 43°50'1.5" (ovvero 43.784144)

La cella agganciata ha identificativo
MCC : 222
MNC :88
LAC : 36057
CID : 27997133
per una posizione dell'antenna di
Long : 11.304655
Lat : 43.825766






La distanza stimata mediante il metodo FSPL e' di 0.2 Km mentre la distanza reale e' di 4.7 Km 

 -----------------------------------------------------
Caso 5:
il telefono e' ubicato in posizione
Long : 11°18'38.73'' (ovvero 11.310758)
Lat : 43°50'1.5" (ovvero 43.83375)

La cella agganciata ha identificativo
MCC : 222
MNC :88
LAC : 36057
CID : 27988276
per una posizione dell'antenna di
Long : 11.245845
Lat : 43.79564150






La distanza stimata mediante il metodo FSPL e' di 0.05 Km mentre la distanza reale e' di Km 6.7
-----------------------------------------------------
Caso 6:
il telefono e' ubicato in posizione
Long : 11°16'48.99'' (ovvero 11.28)
Lat : 43°48'22.2" (ovvero 43.806167)

La cella agganciata ha identificativo
MCC : 222
MNC :88
LAC : 36057
CID : 27988315
per una posizione dell'antenna di
Long : 11.272541
Lat : 43.793081






La distanza stimata mediante il metodo FSPL e' di 1.27 Km mentre la distanza reale e' di Km 1.54
-----------------------------------------------------
Caso 7:
il telefono e' ubicato in posizione
Long : 11°17'32.39'' (ovvero 11.292222)
Lat : 43°48'58.15" (ovvero 43.816153)

La cella agganciata ha identificativo
MCC : 222
MNC :88
LAC : 36057
CID : 28021137
per una posizione dell'antenna di
Long : 11.2440335
Lat : 43.787733


La distanza stimata mediante il metodo FSPL e' di 0.02 Km mentre la distanza reale e' 4.9 di Km
-----------------------------------------------------
Caso 8:
il telefono e' ubicato in posizione
Long : 11°17'41.9'' (ovvero 11.294972)
Lat : 43°49'9.97" (ovvero 43.819436)

La cella agganciata ha identificativo
MCC : 222
MNC :88
LAC : 36057
CID : 28021135
per una posizione dell'antenna di
Long : 11.295127
Lat : 43.818963



La distanza stimata mediante il metodo FSPL e' di 0.16 Km mentre la distanza reale e' di 0.054 Km

In conclusione si osserva in alcuni casi un ottimo accordo tra la distanza calcolata e la distanza reale mentre in altri il valore e' sensibilmente differente. Probabilmente presumere la frequenza fissa e' un assunto non valido

lunedì 23 dicembre 2013

Database antenne telefonia mobile

Per ottenere la posizione delle antenne cellulari, oltre all'interfaccia web, e' possibile scaricare anche l'intero database in modo da effettuare una consultazione offline



Il database si scarica all'indirizzo http://downloads.opencellid.org/ ed e' particolarmente corposo perche' e' attualmente costituito da un file da 57 Mb compressi di posizioni testuali di celle (corrispondenti a  2390305entrate) e da oltre 4.5 Gb compressi di dati di misure (divisi in 12 file di cui ogni file contiene circa 500.000 misure)

Ovviamente e' impossibile consultare con un editor di testo tale mole di dati e quindi e' necessaria la conversione in database, in particolare MySQL

Per prima cosa si crea la struttura della tabella
----------------------------------------------------------------

-- MySQL dump 10.13  Distrib 5.5.33, for debian-linux-gnu (x86_64)
--
-- Host: localhost    Database: celle
-- ------------------------------------------------------
-- Server version 5.5.33-1

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `celle`
--

DROP TABLE IF EXISTS `celle`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `celle` (
  `mcc` int(11) NOT NULL,
  `mnc` int(11) NOT NULL,
  `lac` int(11) NOT NULL,
  `cellid` int(11) NOT NULL,
  `long` double NOT NULL,
  `lat` double NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
----------------------------------------------------------------

In seguito ci si logga dentro mysql (mysql -u root -p) e si digita il seguente comando

load data infile '/home/luca/Desktop/cell_towers.csv' into table celle columns terminated by ',';

per il seguente risultato
Query OK, 2390305 rows affected, 65535 warnings (1 min 33.18 sec)
Records: 2390305  Deleted: 0  Skipped: 0  Warnings: 2390386

A questo punto si puo' fare una semplice pagina web di consultazione
--------------------------------------------------------
<form action="search.php" method="post">     
MCC: <input type="text" name="mcc" />
MNC: <input type="text" name="mnc" />
LAC: <input type="text" name="lac" />
CellId: <input type="text" name="cellid" />
<input type="Submit" /></form>
--------------------------------------------------------

ed il corrispondente script in Php
--------------------------------------------------------
<?php
$username="root";
$password="xxxxxx";
$database="celle";
mysql_connect(localhost,$username,$password);
@mysql_select_db($database) or die( "Unable to select database");
$query="SELECT * FROM celle WHERE mcc='".$_POST['mcc']."' AND mnc='".$_POST['mnc']."' AND lac  LIKE '".$_POST['lac']."%' AND cellid  LIKE '".$_POST['cellid']."%'";

print $query."<br>";
$result=mysql_query($query);
$num=mysql_numrows($result);


while($row = mysql_fetch_array($result))
  {
  echo "<a target=blank href=\"http://www.openstreetmap.org/?mlat=".$row['lat']."&mlon=".$row['long']."&zoom=12\">MCC:".$row['mcc']."-MNC:".$row['mnc']."-LAC:".$row['lac']."-CellId:".$row['cellid']."</a>";
  echo "<br>";
  }

mysql_close();
?>
--------------------------------------------------------
Lo script riporta un link, cliccando sopra si evidenzia la posizione su Openstreetmap

Similarmente si puo' fare per il database delle misure

Effettuando una esportazione dei punti che sono compresi tra 10-11.9° di longitudine e 42-44.5° latitudine (piu' o meno i confini della Toscana) si osserva che sono censite 6780 antenne di telefonia cellulare ma la loro distribuzione e' molto disomogenea con una curiosa predilezione per le grandi vie di comunicazione



Arduino e pannello solare

Per una prova (senza troppe velleita' di utilizzo reale) ho provato ad accoppiare una Arduino con un pannellino solare per verificare la possibilita' di una alimentazione alternativa alle batterie od alla corrente di rete

Il pannellino e' stato attaccato sull'ingresso VIn ed eroga un massimo di 6 V-350mA (cosi' da non necessitare un limitatore di tensione per proteggere l'Arduino)



La prova sul campo ha verificato che
1) si puo' alimentare l'Arduino soltanto con illuminazione diretta. In giornate invernali nuvolose, dove sono presenti velature, il pannello non e' sufficiente per alimentare Arduino
2) e' stato montato per prova lo sketch Blink. E' stato verificato che, con il led verde di On accesso, in caso di scarsa alimentazione Arduino non e' in grado di eseguire il programma ed accendere il led (forse il led verde e' a monte del processore)

In fine dei conti si puo' utilizzare il  pannellino per ricaricare un pacco batterie (che a sua volta alimenta l'Arduino) ma in maniera diretta non e' utile

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...