Dato che avevo uno slot libero sul mio Lenovo T430 mi sono comprato una estensione SATA per lo slot Ultrabay. Ho riutilizzato un disco SSD che ho preso da un'altra macchina ma al momento di montarlo sulla Debian Box non riuscivo a vederlo
Guardando con GParted il disco era formattato LVM. A questo punto ho scaricato il pacchetto LVM
apt-get install lvm2
con vgscan ho scansionato i dischi ed ho attivato il volume con
vgachange -ay centos
con lvs si possono vedere le partizioni sul disco. A questo punto si puo' montare il filesystem
mount /dev/centos/home /media/ -o ro,user
a questo punto per fare le cose per bene sarebbe da inserire in fstab. Per avere lo UUID si puo' digitare blkid
venerdì 24 gennaio 2020
giovedì 23 gennaio 2020
Cython
Era un po' di tempo che volevo provare Cython, la versione compilata di Python, ma non avevo mai avuto la necessita'. Con il trasferimento dati via BLE del precedente post pensavo che il collo di bottiglia fosse legato a Python e non al transfer rate di BLE ed ho cosi' convertito lo script in Python tramite Cython. In pratica il primo passo e' la conversione in C mentre il secondo passo e' una classica compilazione con GCC per avere un eseguibile
cython --embed -o ble_test.c ../ble_test.py
gcc -Os -I /usr/include/python2.7/ -o ble_test ble_test.c -lpython2.7 -lpthread -lm -util -ldl
...e no, il problema non era Python
cython --embed -o ble_test.c ../ble_test.py
gcc -Os -I /usr/include/python2.7/ -o ble_test ble_test.c -lpython2.7 -lpthread -lm -util -ldl
...e no, il problema non era Python
BLE Arduino Nano 33
Un eesmpio di scambio dati via Bluetooth LE tra una scheda Arduino Nano 33 BLE ed un PC
La Arduino Nano BLE 33 e' una scheda interessante perche' oltre al Bluetooth LE sono disponibili una IMU (LMS9DS1), un microfono digitale (MP34DT05), un sensore di colore e prossimita' (APDS9960), un sensore di pressione atmosferica (LPS22HB), un sensore di umidita' relativa e temperatura (HTS221)
Lo sketch su Arduino apre un servizio su BLE con numero 180F ed una caratteristica 2A19 in cui vengono salvati i dati di un contatore progressivo da 0 a 255 (questo per fare in modo che sul lato PC si sia in grado di vedere se si perdono pacchetti)
Lato Arduino
================================================
#include <ArduinoBLE.h>
BLEService numero("180F");
BLEUnsignedCharCharacteristic casuale("2A19",BLERead | BLENotify);
long previousMillis = 0;
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);
BLE.addService(numero);
casuale.writeValue(0); // set initial value for this characteristic
BLE.advertise();
}
void loop() {
int i = 0;
BLEDevice central = BLE.central();
if (central) {
digitalWrite(LED_BUILTIN, HIGH);
while (central.connected()) {
long currentMillis = millis();
if (currentMillis - previousMillis >= 20) {
i++;
casuale.writeValue(i%255);
previousMillis = currentMillis;
}
}
digitalWrite(LED_BUILTIN, LOW);
}
}
================================================
Per verificare che i dati vengano inviati correttamente si puo' usare gattool
================================================
gatttool -b ED:CB:86:2A:68:C1 -I
[ED:CB:86:2A:68:C1][LE]> connect
Attempting to connect to ED:CB:86:2A:68:C1
Connection successful
[ED:CB:86:2A:68:C1][LE]> char-read-uuid 2A19
handle: 0x000b value: 41
================================================
A questo punto con la libreria Bluepy si possono leggere i dati inviati dalla Arduino
================================================
from bluepy import btle
from bluepy.btle import UUID, Peripheral
addr = "ED:CB:86:2A:68:C1"
conn = Peripheral(addr, "public")
print ("-Servizi")
services = conn.getServices()
for service in services:
print(service.uuid)
print("-Caratteristica")
charac_dic = service.getCharacteristics()
for charac in charac_dic:
print(charac.uuid)
if charac.uuid == "2a19":
print ("Trovata")
Data_char = charac
print(Data_char)
Data_handle = Data_char.getHandle()
print Data_handle
while True:
print (ord(charac.read()))
La Arduino Nano BLE 33 e' una scheda interessante perche' oltre al Bluetooth LE sono disponibili una IMU (LMS9DS1), un microfono digitale (MP34DT05), un sensore di colore e prossimita' (APDS9960), un sensore di pressione atmosferica (LPS22HB), un sensore di umidita' relativa e temperatura (HTS221)
Lo sketch su Arduino apre un servizio su BLE con numero 180F ed una caratteristica 2A19 in cui vengono salvati i dati di un contatore progressivo da 0 a 255 (questo per fare in modo che sul lato PC si sia in grado di vedere se si perdono pacchetti)
Lato Arduino
================================================
#include <ArduinoBLE.h>
BLEService numero("180F");
BLEUnsignedCharCharacteristic casuale("2A19",BLERead | BLENotify);
long previousMillis = 0;
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);
BLE.addService(numero);
casuale.writeValue(0); // set initial value for this characteristic
BLE.advertise();
}
void loop() {
int i = 0;
BLEDevice central = BLE.central();
if (central) {
digitalWrite(LED_BUILTIN, HIGH);
while (central.connected()) {
long currentMillis = millis();
if (currentMillis - previousMillis >= 20) {
i++;
casuale.writeValue(i%255);
previousMillis = currentMillis;
}
}
digitalWrite(LED_BUILTIN, LOW);
}
}
================================================
Per verificare che i dati vengano inviati correttamente si puo' usare gattool
================================================
gatttool -b ED:CB:86:2A:68:C1 -I
[ED:CB:86:2A:68:C1][LE]> connect
Attempting to connect to ED:CB:86:2A:68:C1
Connection successful
[ED:CB:86:2A:68:C1][LE]> char-read-uuid 2A19
handle: 0x000b value: 41
================================================
A questo punto con la libreria Bluepy si possono leggere i dati inviati dalla Arduino
================================================
from bluepy import btle
from bluepy.btle import UUID, Peripheral
addr = "ED:CB:86:2A:68:C1"
conn = Peripheral(addr, "public")
print ("-Servizi")
services = conn.getServices()
for service in services:
print(service.uuid)
print("-Caratteristica")
charac_dic = service.getCharacteristics()
for charac in charac_dic:
print(charac.uuid)
if charac.uuid == "2a19":
print ("Trovata")
Data_char = charac
print(Data_char)
Data_handle = Data_char.getHandle()
print Data_handle
while True:
print (ord(charac.read()))
================================================
la trasmissione dati in questo modo e' piuttosto lenta..circa un dato ogni decimo di secondo.
Usando la tecnica di subscribe and notify la Arduino invia i dati al PC senza la necessita' per quest'ultimo di richiederli. Con questa tecnica non si perde nessun pacchetto
================================================
from bluepy import btle
from bluepy.btle import UUID, Peripheral
import struct
def listAll(p):
for svc in p.getServices():
print(svc.uuid.getCommonName())
for ch in svc.getCharacteristics():
print(" " + str(ch.valHandle) + ": " + ch.uuid.getCommonName())
class MyDelegate(btle.DefaultDelegate):
def __init__(self):
btle.DefaultDelegate.__init__(self)
def handleNotification(self, cHandle, data):
print(ord(data))
addr = "ED:CB:86:2A:68:C1"
p = btle.Peripheral(addr,"public")
services=p.getServices()
for service in services:
print(service.uuid)
p.setDelegate( MyDelegate() )
listAll(p)
svc = p.getServiceByUUID("0000180f-0000-1000-8000-00805f9b34fb")
ch = svc.getCharacteristics()[0]
p.writeCharacteristic(ch.valHandle+1, b'\x01\x00', withResponse=True)
while True:
if p.waitForNotifications(1.0):
continue
print "Waiting..."
from bluepy.btle import UUID, Peripheral
import struct
def listAll(p):
for svc in p.getServices():
print(svc.uuid.getCommonName())
for ch in svc.getCharacteristics():
print(" " + str(ch.valHandle) + ": " + ch.uuid.getCommonName())
class MyDelegate(btle.DefaultDelegate):
def __init__(self):
btle.DefaultDelegate.__init__(self)
def handleNotification(self, cHandle, data):
print(ord(data))
addr = "ED:CB:86:2A:68:C1"
p = btle.Peripheral(addr,"public")
services=p.getServices()
for service in services:
print(service.uuid)
p.setDelegate( MyDelegate() )
listAll(p)
svc = p.getServiceByUUID("0000180f-0000-1000-8000-00805f9b34fb")
ch = svc.getCharacteristics()[0]
p.writeCharacteristic(ch.valHandle+1, b'\x01\x00', withResponse=True)
while True:
if p.waitForNotifications(1.0):
continue
print "Waiting..."
martedì 21 gennaio 2020
Debian Bullseye e Xrandr
Mettendo a posto una Debian Testing BullsEye su un Lenovo Thinkpad serie T volevo usare il trucco di newrez per aumentare la risoluzione dello schermo ma nonostante tutto xrandr sembrava non funzionare
Ho scoperto dopo un po' che era in uso Wayland e cio' impediva l'uso di xrandr. A questo punto e' stato necessario editare il file /etc/gdm3/daemon.conf e decommentare WaylandEnable=false
Al successivo riavvio e' stato possibile far funzionare newrew semplicemente modificando LVDS1 a LDVS-1 e VGA1 a VGA-1
Ho scoperto dopo un po' che era in uso Wayland e cio' impediva l'uso di xrandr. A questo punto e' stato necessario editare il file /etc/gdm3/daemon.conf e decommentare WaylandEnable=false
Al successivo riavvio e' stato possibile far funzionare newrew semplicemente modificando LVDS1 a LDVS-1 e VGA1 a VGA-1
sabato 18 gennaio 2020
Copiare docker container su diverse macchine
Per spostare un container tra due macchine si procede prima creando un file .tar con docker save
docker save -o /home/luca/container.tar DOCKER_ID
per avere un tgz si puo' usare
docker save DOCKER_ID | gzip -c > container.tar.gz
una volta copiato il file sulla seconda macchina il container puo' essere installato con
docker load -i container.tar
facendo cosi' si avranno Repository e Tag impostati a <none>. Per completare il lavoro si usa
docker image tag DOCKER_ID nome_repository nome_tag
con DOCKER_ID recuperato tramite il comando docker image ls e impostando il nome_repository con la sintassi per esempio tensorflow/tensorflow mentre il nome_tag puo' essere per esempio latest
docker save -o /home/luca/container.tar DOCKER_ID
per avere un tgz si puo' usare
docker save DOCKER_ID | gzip -c > container.tar.gz
una volta copiato il file sulla seconda macchina il container puo' essere installato con
docker load -i container.tar
facendo cosi' si avranno Repository e Tag impostati a <none>. Per completare il lavoro si usa
docker image tag DOCKER_ID nome_repository nome_tag
con DOCKER_ID recuperato tramite il comando docker image ls e impostando il nome_repository con la sintassi per esempio tensorflow/tensorflow mentre il nome_tag puo' essere per esempio latest
giovedì 16 gennaio 2020
Single Step LSTM Time Series Tensorflow
Le serie tempo sono successioni di uno (univariata) o piu' parametri (multivariata) acquisiti da strumenti a cadenza regolari di tempo (il tempo definisce l'indice della serie)
A differenza di una serie normale di dati qui l'ordine assume una importanza perche' ciascun dato e' collegato a quello immediatamente successivo e antecedente in una successione che i matematici direbbero continua
Un metodo per poter prevedere il prossimo dato nella successione usando le reti neurali e' quello di usare l'approccio LSTM (Long Short Term Memory) riconducibili alle reti RNN
Il fato che il titolo indichi Single Step vuol dire che l'algoritmo e' in grado di individuare solo il valore della variabile al tempo T+1 e non e' possibile avere piu' dati previsti
Un sistema comodo per esplorare l'algoritmo e' quello di usare il codice a questo GitHub
Nel file di configurazione training_config.json si possono impostare le caratteristiche della rete neurale come i dati di train e test, il dropout ma soprattutto si imposa la window_size ovvero la grandezza della finestra che viene usata dall'algoritmo per calcolare il valore al tempo T+1
Per effettuare ho preso i dati della stazione meteo di Antella (localita' vicino a Firenze) nel periodo dicembre 2002 aprile 2010 con misure giornaliere della temperatura massima
i dati sono stati processati mediante il codice linkato in precedenza
Il risultato della validazione dei dati risulta sostanzialemente corretta
Nel grafico sottostante (ripreso da qui) si osservano tutti i limiti del metodo nel caso di estrapolazione di piu' di un valore sul tren futuro. Usando una finestra mobile e' stato simulata la previsione di trend nel futuro su varie porzioni dei dati e si vede abbastanza chiaramente che la predizione, essendo legata alla finestra dei dati immediatamente precedenti, puo; indurre anche errori grossolani
asdasd
A differenza di una serie normale di dati qui l'ordine assume una importanza perche' ciascun dato e' collegato a quello immediatamente successivo e antecedente in una successione che i matematici direbbero continua
Un metodo per poter prevedere il prossimo dato nella successione usando le reti neurali e' quello di usare l'approccio LSTM (Long Short Term Memory) riconducibili alle reti RNN
Il fato che il titolo indichi Single Step vuol dire che l'algoritmo e' in grado di individuare solo il valore della variabile al tempo T+1 e non e' possibile avere piu' dati previsti
Un sistema comodo per esplorare l'algoritmo e' quello di usare il codice a questo GitHub
Nel file di configurazione training_config.json si possono impostare le caratteristiche della rete neurale come i dati di train e test, il dropout ma soprattutto si imposa la window_size ovvero la grandezza della finestra che viene usata dall'algoritmo per calcolare il valore al tempo T+1
Per effettuare ho preso i dati della stazione meteo di Antella (localita' vicino a Firenze) nel periodo dicembre 2002 aprile 2010 con misure giornaliere della temperatura massima
i dati sono stati processati mediante il codice linkato in precedenza
Il risultato della validazione dei dati risulta sostanzialemente corretta
Nel grafico sottostante (ripreso da qui) si osservano tutti i limiti del metodo nel caso di estrapolazione di piu' di un valore sul tren futuro. Usando una finestra mobile e' stato simulata la previsione di trend nel futuro su varie porzioni dei dati e si vede abbastanza chiaramente che la predizione, essendo legata alla finestra dei dati immediatamente precedenti, puo; indurre anche errori grossolani
asdasd
mercoledì 15 gennaio 2020
Jupyter notebook inside docker
Per poter utilizzare un Notebook Jupyter contenuto all'interno di un container docker si avvia prima il container con una sintassi del tipo
docker run -it --rm -p8888:8888 -v /home/luca/Downloads/time-series-forecasting-rnn-tensorflow-master:/tmp2 -w /tmp2 intelaipg/intel-optimized-tensorflow:2.0.0-mkl-py3
montando la directory esterna al docker dove sono contenuti i notebook
a questo punto dall'interno del container si lancia
jupyter notebook --ip 0.0.0.0 --no-browser --allow-root
docker run -it --rm -p8888:8888 -v /home/luca/Downloads/time-series-forecasting-rnn-tensorflow-master:/tmp2 -w /tmp2 intelaipg/intel-optimized-tensorflow:2.0.0-mkl-py3
a questo punto dall'interno del container si lancia
jupyter notebook --ip 0.0.0.0 --no-browser --allow-root
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...
-
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...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...