lunedì 3 febbraio 2020
venerdì 31 gennaio 2020
Tensorflow Lite su Arduino Ble 33
A questo link e' comparso un interessante esempio su come utilizzare i sensori (accelerometro e giroscopio) di una Arduino BLE per addestrare una rete neurale con Tensorflow Lite e poi utilizzare la stessa libreria per classificare le gesture sempre tramite Arduino
Per prova ho inserito la Arduino sotto ad un guanto (per tenerla bloccata) e poi registrando un centinaio di rotazione del polso verso l'interno e verso l'esterno
L'ultima modifica che ho apportato e' di modificare a 50 il numero di campioni per gesture
Una volta salvata due file csv (uno per movimento) ho utilizzato questo Colab per creare il file model. h
Come si deve dai grafici l'errore del modello in train/validation e' estremamente ridotto
Il risultato del Notebook sono un file di modello di Tensorflow Lite ed un file model.h che deve essere copiato nello sketch ImuClassifier per fare il deploy del modello
Devo ammettere che il sistema funziona ma e' lontano dall'essere perfetto. Devo ancora capire se e' un problema di posizionamento del sensore durante le varie proprie (che per ovvi motivi non e' sempre identico) od un addestramento errato
Per prova ho inserito la Arduino sotto ad un guanto (per tenerla bloccata) e poi registrando un centinaio di rotazione del polso verso l'interno e verso l'esterno
L'ultima modifica che ho apportato e' di modificare a 50 il numero di campioni per gesture
Una volta salvata due file csv (uno per movimento) ho utilizzato questo Colab per creare il file model. h
Grafico accelerazione di riferimento |
Grafico giroscopi di riferimento |
Training and validation loss |
Stesso grafico precedente eliminando i primi 100 dati |
Risultati validazione |
Il risultato del Notebook sono un file di modello di Tensorflow Lite ed un file model.h che deve essere copiato nello sketch ImuClassifier per fare il deploy del modello
Devo ammettere che il sistema funziona ma e' lontano dall'essere perfetto. Devo ancora capire se e' un problema di posizionamento del sensore durante le varie proprie (che per ovvi motivi non e' sempre identico) od un addestramento errato
SSTV da ISS 30/01/2020 17:33 GTM Firenze
Dopo aver avuto un contatto radio con la ISS via voce nel transito del 30 gennaio 2020 alle 17:33 GMT sono riuscito a registrare una trasmissione della ARISS SSTV
La ricezione e' avvenuta da Firenze con un normalissimo scanner radio palmare Icom IC-R5 ed antenna standard registrando l'audio direttamente dal cellulare
Per la cronaca avevo acceso anche un Baofeng UV-5R ma con questo dispositivo il segnala era praticamente sommerso dal rumore nonostante le due radio fossero a meno di 3 metri di distanza.
La decodifica e' stata effettuata con la applicazione Android Robot360
L'immagine e' stata poi postata al sito https://www.spaceflightsoftware.com/ARISS_SSTV/
Alla fine ho anche mandato ad Ariss SSTV Archive la mia immagine ed e' stato impressionante vedere il numero di radioamatori che hanno condiviso nello stesso momento le immagini a giro per il mondo
La ricezione e' avvenuta da Firenze con un normalissimo scanner radio palmare Icom IC-R5 ed antenna standard registrando l'audio direttamente dal cellulare
Per la cronaca avevo acceso anche un Baofeng UV-5R ma con questo dispositivo il segnala era praticamente sommerso dal rumore nonostante le due radio fossero a meno di 3 metri di distanza.
La decodifica e' stata effettuata con la applicazione Android Robot360
L'immagine e' stata poi postata al sito https://www.spaceflightsoftware.com/ARISS_SSTV/
Alla fine ho anche mandato ad Ariss SSTV Archive la mia immagine ed e' stato impressionante vedere il numero di radioamatori che hanno condiviso nello stesso momento le immagini a giro per il mondo
mercoledì 29 gennaio 2020
NOAA 18
Una volta capito come funziona ci si prende gusto. A questo giro ho provato a ricevere i dati dal satellite NOOA18, un satellite meteo in orbita polare
Il passaggio sull'Europa e' avvenuto alle 21:15 (GMT+1) del 28 gennaio (fonte https://www.heavens-above.com/)
La caratteristica di questo satellite e' che trasmette sui 137.912 MHz con una ampiezza di banda di 38 KHz. In WebSDR per allargare l'ampiezza di banda si deve selezionare FM e poi con il mouse selezionare ciascun estremo della banda e trascinarlo fino a quando non viene coperta tutta l'estenzione del segnale. Il segnale e' caratterizzato da una serie di righe parallele nella modalita' waterfall
Vista la frequenza di esercizio non potevo usare il WebSdr utilizzato per la ISS e mi sono spostato su questo link http://erc-websdr.esa.int/
Il passaggio sull'Europa e' avvenuto alle 21:15 (GMT+1) del 28 gennaio (fonte https://www.heavens-above.com/)
La caratteristica di questo satellite e' che trasmette sui 137.912 MHz con una ampiezza di banda di 38 KHz. In WebSDR per allargare l'ampiezza di banda si deve selezionare FM e poi con il mouse selezionare ciascun estremo della banda e trascinarlo fino a quando non viene coperta tutta l'estenzione del segnale. Il segnale e' caratterizzato da una serie di righe parallele nella modalita' waterfall
Waterfall |
Spettro |
Vista la frequenza di esercizio non potevo usare il WebSdr utilizzato per la ISS e mi sono spostato su questo link http://erc-websdr.esa.int/
Di fatto il problema principale con NOOA e' possedere una antenna a polarizzazione circolare destra
Il file .wav deve essere processato attraverso il software WxtoImg ma e' posssibile utilizzare anche https://noaa-apt.mbernardi.com.ar/
Se si usa WxtoImg si deve prima prendere il file .wav in uscita da WebSDR e processarlo con Audacity per ricampionarlo da 8000 Hz s 11025 Hz. Si salva il file ma cio' comporta che il nuovo file abbia un timestamp diverso dal file iniziale. Per correggere questo problema si utilizza il comando
touch -a -m -t 202001282130.00 t1.wav
dove il timestamp e' formato YYYYMMDDHHMM.SS
Il software si chiama in questo modo perche' il protocollo di trasmissione e' denominato WeFax ed e' in pratica molto simile al buon vecchio sistema Fax che si usava in ufficio
Il servizio APT e' invece una trasmissione di due immagini relative a due bande (in questo caso nel termico) di 2080 x 909 pixels
Elaborazioni con WxToImg
Temperatura Mare |
MCIR |
Tenpeartura |
se si usa noaa-apt i passi di cambio ora e resampling sono eseguiti in automatico e questo e' il risultato. Di fatto con questo software non possono essere eseguite elaborazioni. Le due bande vengono visualizzate a fianco con inclusa la banda di sincronia del segnale
Per confronto questa e' la stessa immagine acquisita da https://www.osservatoriometeoesismicoperugia.it/satellitipolari/index.html
La differenza principale e' che qui le nuvole sono bianche mentre in wxtoimg risultano grigie
La differenza principale e' che qui le nuvole sono bianche mentre in wxtoimg risultano grigie
martedì 28 gennaio 2020
ISS Ham Radio Luca Parmitano 27/01/2020 17:38 GMT
Erano anni che provavo ad ascoltare il canale amatoriale della Stazione Spaziale ISS sulla frequenza 145.800 MHz con radio sempre migliori (ma sempre a basso costo da scanner palmari a RTL-SDR)
Ma di fatto bisogna avere fortuna perche' i transiti della ISS sono di pochi minuti e di solito gli astronauti sono impegnati in altre cose (si tratta di una Ham Radio, non si tratta della radio effettiva di lavoro con il controllo missione)
Finalmente ci sono riuscito anche se non usando la mia apparecchiatura.
Visto che il transito sull'Europa era previsto quando non ero in casa mi sono collegato con il sito http://farnham-sdr.com/ dove si puo' usare una radio RTL-SDR a piacimento (l'antenna si trova nella parte meridionale dell'Inghilterra)
Tramite https://www.heavens-above.com/ era calcolato un transito alle 16:38 GMT (in Italia 17:38) e puntualmente come la ISS e' emersa dall'orizzonte ho visto il segnale sul waterfall
La cosa che mi ha fatto ancora piu' piacere e' stato trovare Luca Parmitano in trasmissione (avevo provato ad ascoltare anche nella precedente missione 36 senza nessun successo)
La cosa impressionante e' lo spostamente doppler del segnale. La frequenza di riferimento e' di 145.800 MHz ma quando emerge dall'orizzonte la frequenza e' oltre 145.803 MHz
per poi spostarsi rapidamente verso sinistra nello spettro, Nel momento di passaggio allo zenit lo spostamento Doppler e' cosi' rapido che la linea di riferimento sullo spettro e' chiaramente inclinata (la ISS e' dannatamente veloce!). Quando e' scomparsa all'orizzonte opposto la frequenza era vicino a 145.796 MHz
Ma di fatto bisogna avere fortuna perche' i transiti della ISS sono di pochi minuti e di solito gli astronauti sono impegnati in altre cose (si tratta di una Ham Radio, non si tratta della radio effettiva di lavoro con il controllo missione)
Finalmente ci sono riuscito anche se non usando la mia apparecchiatura.
Visto che il transito sull'Europa era previsto quando non ero in casa mi sono collegato con il sito http://farnham-sdr.com/ dove si puo' usare una radio RTL-SDR a piacimento (l'antenna si trova nella parte meridionale dell'Inghilterra)
Tramite https://www.heavens-above.com/ era calcolato un transito alle 16:38 GMT (in Italia 17:38) e puntualmente come la ISS e' emersa dall'orizzonte ho visto il segnale sul waterfall
La cosa che mi ha fatto ancora piu' piacere e' stato trovare Luca Parmitano in trasmissione (avevo provato ad ascoltare anche nella precedente missione 36 senza nessun successo)
La cosa impressionante e' lo spostamente doppler del segnale. La frequenza di riferimento e' di 145.800 MHz ma quando emerge dall'orizzonte la frequenza e' oltre 145.803 MHz
per poi spostarsi rapidamente verso sinistra nello spettro, Nel momento di passaggio allo zenit lo spostamento Doppler e' cosi' rapido che la linea di riferimento sullo spettro e' chiaramente inclinata (la ISS e' dannatamente veloce!). Quando e' scomparsa all'orizzonte opposto la frequenza era vicino a 145.796 MHz
lunedì 27 gennaio 2020
Mobike e BLE
Mentre stavo giocherellando con lo scanner Bluetooth LE mi e' apparso in lista un dispositivo Mobike ed ho visto che era stata appena parcheggiata una bicicletta a noleggio fuori dall'ufficio. Avevo sempre pensato che le Mobike fossero basate tutte su comunicazioni dati su rete cellulare ma a quanto sembra non e' proprio cosi..di fatto vengono esposte due servizi di uno scrivibile via BLE
c'e ovviamente chi ha fatto un'analisi decisamente piu' apprfondita
https://gsec.hitb.org/ materials/sg2018/D2%20-% 20Hacking%20BLE%20Bicycle% 20Locks%20for%20Fun%20and%20( a%20Small)%20Profit%20-% 20Vincent%20Tan.pdf
e c'e' anche chi ha smontato un lucchetto Mobike trovandoci dentro un modulo telefonico, un GPS ed un processore STM32
https://projectgus.com/2017/04/sharing-bikes-in-shanghai/
In ogni caso la gran parte del lavoro di scambio dati per lo sblocco e' svolto dal telefono del cliente
Sarei curioso di sapere come e' stato risolto da Mobike il problema di alimentare un sistema cosi' energivoro (GPS+Cellulare possono drenare in modo molto veloce le batterie)
c'e ovviamente chi ha fatto un'analisi decisamente piu' apprfondita
https://gsec.hitb.org/
e c'e' anche chi ha smontato un lucchetto Mobike trovandoci dentro un modulo telefonico, un GPS ed un processore STM32
https://projectgus.com/2017/04/sharing-bikes-in-shanghai/
In ogni caso la gran parte del lavoro di scambio dati per lo sblocco e' svolto dal telefono del cliente
Sarei curioso di sapere come e' stato risolto da Mobike il problema di alimentare un sistema cosi' energivoro (GPS+Cellulare possono drenare in modo molto veloce le batterie)
BLE Write Characteristic da Android
Dopo il precedente tentativo di leggere una caratteristica BLE da Python adesso un tentativo di scrivere una caratteristica (lo so e' una brutta traduzione) da Android su un dispositivo BLE
Lo sketch Arduino e' stato modificato per esporre una caratteristica 2A30 in modalita' lettura/scrittura, settare il valore a 3, leggere il valore e se e' differente da 3 spengere il Led di Arduino
=================================================================
#include <ArduinoBLE.h>
BLEService numero("180F");
BLEUnsignedCharCharacteristic casuale("2A19",BLERead | BLENotify);
BLEUnsignedCharCharacteristic scrittura("2A30",BLERead | BLEWrite);
long previousMillis = 0;
byte test =3 ;
void setup() {
Serial.begin(9600);
while (!Serial);
pinMode(LED_BUILTIN, OUTPUT);
if (!BLE.begin()) {
while (1);
}
BLE.setLocalName("Random");
BLE.setAdvertisedService(numero);
numero.addCharacteristic(casuale);
numero.addCharacteristic(scrittura);
BLE.addService(numero);
casuale.writeValue(0); // set initial value for this characteristic
scrittura.writeValue(2);
BLE.advertise();
}
void loop() {
int i = 0;
BLEDevice central = BLE.central();
if (central) {
while (central.connected()) {
long currentMillis = millis();
if (currentMillis - previousMillis >= 20) {
previousMillis = currentMillis;
scrittura.readValue(test);
if(test ==3)
{
Serial.println(test);
digitalWrite(LED_BUILTIN, HIGH);
}
else
{
Serial.println(test);
digitalWrite(LED_BUILTIN, LOW);
}
}
}
digitalWrite(LED_BUILTIN, LOW);
}
}
=================================================================
Per Android ho usato la libreria a questo indirizzo . Ne esistono di piu' complete ma
in questo caso avevo bisogno di semplicita'
=================================================================
Lo sketch Arduino e' stato modificato per esporre una caratteristica 2A30 in modalita' lettura/scrittura, settare il valore a 3, leggere il valore e se e' differente da 3 spengere il Led di Arduino
=================================================================
#include <ArduinoBLE.h>
BLEService numero("180F");
BLEUnsignedCharCharacteristic casuale("2A19",BLERead | BLENotify);
BLEUnsignedCharCharacteristic scrittura("2A30",BLERead | BLEWrite);
long previousMillis = 0;
byte test =3 ;
void setup() {
Serial.begin(9600);
while (!Serial);
pinMode(LED_BUILTIN, OUTPUT);
if (!BLE.begin()) {
while (1);
}
BLE.setLocalName("Random");
BLE.setAdvertisedService(numero);
numero.addCharacteristic(casuale);
numero.addCharacteristic(scrittura);
BLE.addService(numero);
casuale.writeValue(0); // set initial value for this characteristic
scrittura.writeValue(2);
BLE.advertise();
}
void loop() {
int i = 0;
BLEDevice central = BLE.central();
if (central) {
while (central.connected()) {
long currentMillis = millis();
if (currentMillis - previousMillis >= 20) {
previousMillis = currentMillis;
scrittura.readValue(test);
if(test ==3)
{
Serial.println(test);
digitalWrite(LED_BUILTIN, HIGH);
}
else
{
Serial.println(test);
digitalWrite(LED_BUILTIN, LOW);
}
}
}
digitalWrite(LED_BUILTIN, LOW);
}
}
=================================================================
Per Android ho usato la libreria a questo indirizzo . Ne esistono di piu' complete ma
in questo caso avevo bisogno di semplicita'
=================================================================
package com.ble.ellamma.ble; import android.bluetooth.BluetoothDevice;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log; import com.ble.ellamma.bleand.Ble;
import java.util.UUID;
public class MainActivity extends AppCompatActivity { private static final String MAC_ADDRESS = "ED:CB:86:2A:68:C1"; private static final UUID BLE_NOTIFY_CHARACTER = UUID.fromString("00002a19-0000-1000-8000-00805f9b34fb"); //.00002a19-0000-1000-8000-00805f9b34fb--18 private static final UUID BLE_SERVICE = UUID.fromString("0000180f-0000-1000-8000-00805f9b34fb"); private static final UUID CLIENT_CCD = UUID.fromString("00002a30-0000-1000-8000-00805f9b34fb"); ArrayList<String> getDevicess; List<BluetoothDevice> getConnectedDevicess; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); getDevicess = new ArrayList<>();
getConnectedDevicess = new ArrayList<>(); Ble ble = new Ble(this,getApplicationContext(),".Myreceiver"); ble.enableBle();
//ble.scanLeDevice(true,1000);
//ble.getDevices(); ble.connectBLE(MAC_ADDRESS);
byte dati[] = "A".getBytes();
ble.writeCharacteristics(dati,BLE_SERVIVE,CLIENT_CCD,true);
ble.disConnectBLE(); } public void onReceive(Context context, Intent intent) { //String data = intent.getStringExtra("data");
//Log.w("Luca", "Request Recieved On MyReciever ::" + data); } }
Iscriviti a:
Post (Atom)
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...
-
In questo post viene indicato come creare uno scatterplot dinamico basato da dati ripresi da un file csv (nel dettaglio il file csv e' c...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...
-
La scheda ESP32-2432S028R monta un Esp Dev Module con uno schermo TFT a driver ILI9341 di 320x240 pixels 16 bit colore.Il sito di riferiment...