giovedì 21 maggio 2020
sabato 16 maggio 2020
ISS Docking
SpaceX ha reso pubblico un simulatore per il docking alla ISS e non potevo non provare
Non e' stato banalissimo piu' che altro per il controllo della velocita' anche perche' non ci sono istruzioni su tasti funzione
Le cose piu' divertenti sono gli easter eggs:
La modalita' Terra piatta
e la macchina Tesla che si trova ruotando la visuale all'indietro rispetto all'orientamento iniziale
Non e' stato banalissimo piu' che altro per il controllo della velocita' anche perche' non ci sono istruzioni su tasti funzione
Le cose piu' divertenti sono gli easter eggs:
La modalita' Terra piatta
e la macchina Tesla che si trova ruotando la visuale all'indietro rispetto all'orientamento iniziale
giovedì 14 maggio 2020
MicroPython Bluetooth su Esp-Wroom-32
Ho provato a convertire la mia ESP32 DevKit V2 Esp-Wroom-32 per utilzzare Micropython
Per fare cio' per prima cosa si deve eliminare il firmware esistente
esptool.py --chip esp32 --port /dev/ttyUSB0 erase_flash
esptool.py --chip esp32 --port /dev/ttyUSB0 erase_flash
e poi flashare il firmware con MicroPython da questo link. Ne esistono due: il primo con il supporto completo indicato da V3 ed uno con il solo supporto BLE indicato da V4
esptool.py --chip esp32 --port /dev/ttyUSB0 write_flash -z 0x1000 /home/luca/Downloads/esp32-idf4-20191220-v1.12.bin
Al termine, per vedere se ha funzionato si puo' aprire un terminale seriale come Minicom. Attenzione che devono disabilitati Hardware Flow e Software Flow
minicom -s
CTRL+A+Z
Serial Port Setup 115200 8N1
Hardware Flow NO
Software Flow NO
ci si trova davanti al prompt REPL di Python
al posto di scrivere sulla shell tramite Minicom si puo' effettuare l'upload di un file tramite
pip install adafruit-ampy
per copiare un file sulla scheda si usa
ampy --port=/dev/ttyUSB0 put ble_advertising.py
ci si trova davanti al prompt REPL di Python
al posto di scrivere sulla shell tramite Minicom si puo' effettuare l'upload di un file tramite
pip install adafruit-ampy
per copiare un file sulla scheda si usa
ampy --port=/dev/ttyUSB0 put ble_advertising.py
mentre per eseguirlo
ampy --port=/dev/ttyUSB0 run ble_advertising.py
i comandi completi sono i seguenti
get Retrieve a file from the board.
ls List contents of a directory on the board.
mkdir Create a directory on the board.
put Put a file or folder and its contents on the board.
reset Perform soft reset/reboot of the board.
rm Remove a file from the board.
rmdir Forcefully remove a folder and all its children from the board.
run Run a script and print its output.
(questi codici erano gia' stati visti con M5Stack)
per avere gli esempi di MicroPython si puo' clonare
git clone https://github.com/micropython/micropython
un altro comodo sistema per gestire il dispotivo e' RShell con cui si puo' interagire con il file system
root@debian:~# rshell --buffer-size=30 -p /dev/ttyUSB0
Using buffer-size of 30
Connecting to /dev/ttyUSB0 (buffer-size 30)...
Trying to connect to REPL connected
Testing if ubinascii.unhexlify exists ... Y
Retrieving root directories ... /boot.py/ /ble_temperature.py/ /advertise.py/ /socialdistance.py/ /ble_temperature_central.py/ /scan.py/
Setting time ... May 12, 2020 19:08:12
Evaluating board_name ... pyboard
Retrieving time epoch ... Jan 01, 2000
Welcome to rshell. Use Control-D (or the exit command) to exit rshell.
/root>
gli script python si trovano nella directory /pyboard quindi basta fare
cd /pyboard
ls
per osservarli
edit nome_file.py
apre vi per permettere l'editing (l'editor non si trova sull'ESP32 ma sul computer)
per fare un scansione di dispositivi BLE con Micropython si puo' usare
--------------------------------------------------------------------
import bluetooth
from micropython import const
import time
_IRQ_CENTRAL_CONNECT = const(1 << 0)
_IRQ_CENTRAL_DISCONNECT = const(1 << 1)
_IRQ_GATTS_WRITE = const(1 << 2)
_IRQ_GATTS_READ_REQUEST = const(1 << 3)
_IRQ_SCAN_RESULT = const(1 << 4)
_IRQ_SCAN_COMPLETE = const(1 << 5)
_IRQ_PERIPHERAL_CONNECT = const(1 << 6)
_IRQ_PERIPHERAL_DISCONNECT = const(1 << 7)
_IRQ_GATTC_SERVICE_RESULT = const(1 << 8)
_IRQ_GATTC_CHARACTERISTIC_RESULT = const(1 << 9)
_IRQ_GATTC_DESCRIPTOR_RESULT = const(1 << 10)
_IRQ_GATTC_READ_RESULT = const(1 << 11)
_IRQ_GATTC_WRITE_STATUS = const(1 << 12)
_IRQ_GATTC_NOTIFY = const(1 << 13)
_IRQ_GATTC_INDICATE = const(1 << 14)
def bt_irq(event, data):
if event == _IRQ_SCAN_RESULT:
addr_type, addr, connectabt, rssi, adv_data = data
print(data)
elif event == _IRQ_SCAN_COMPLETE:
print("scan complete")
bt = bluetooth.BLE()
bt.active(True)
bt.gap_scan(10000, 10000, 10000)
bt.irq(bt_irq)
time.sleep(20)
--------------------------------------------------------------------
per creare un dispositivo che fa solo l'advertise in BLE
---------------------------------------------------------------------
import bluetooth
import struct
import time
from ble_advertising import advertising_payload
from micropython import const
_ENV_SENSE_UUID = bluetooth.UUID(0x181A)
_ADV_APPEARANCE_GENERIC_THERMOMETER = const(768)
class BLETemperature:
def __init__(self, ble, name="SocialDistance"):
self._ble = ble
self._ble.active(True)
self._payload = advertising_payload(
name=name, services=[_ENV_SENSE_UUID], appearance=_ADV_APPEARANCE_GENERIC_THERMOMETER
)
self._advertise()
def _advertise(self, interval_us=500000):
self._ble.gap_advertise(interval_us, adv_data=self._payload)
def demo():
ble = bluetooth.BLE()
temp = BLETemperature(ble)
while True:
print("Sociale")
if __name__ == "__main__":
demo()
---------------------------------------------------------------------
martedì 12 maggio 2020
Damn Vulnerable Web Application
Mi sto leggendo avanza tempo il libro HackLog Manuale di Sicurezza Informatica ed Hacking Etico di Stefano Novelli. Nel libro viene DVWA - Damn Vulnerable Web Application, una applicazione web studiata appositamente per fare pratica con le vulnerabilita' principalmente di webserver
Si puo' ottenere la DVWA da questo link in formato iso o docker. Ho scelto la ISO ma ho scoperto su Debian Testing VirtualBox non ne vuole sapere di installarsi....sono passato a QEmu
a questo punto basta puntare il browser su http://localhost:8080/login.php con credenziali admin/password
Di esempi ce ne sono tanti ma molto semplici ad impegnativi.
domenica 19 aprile 2020
QTCustomPlot da dati CSV
Un progettino semplice per graficare dati derivanti da un file CSV (si tratta di un progetto satellite di un progetto Android con cui, tramite applicazione, vengono salvati i dati di accelerazione)
Come libreria per plottare i dati ho usato QTCustomPlot per la semplicita' di zoom/pan mentre per la lettura di CSV e' stata impiegata QtCSV
Il codice e' disponibile su GitHub. E' possibile zoom/pan ed avere le coordinate del puntatore
Per impostare QTCustomPlot su QtCreator si devono imporate i file qtcustomplot.cpp/ qtcustomplot.h, si aggiunge al file .pro QT += printsupport, si trascina sul form un QWidget, tasto destro Promote To e si fa il promote a QtCustomPlot (il metodo e' cambiato rispetto al precedente post https://debiaonoldcomputers.blogspot.com/2013/11/software-per-progetto-force-gauge.html)
======================================================
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "qcustomplot.h"
#include "variantdata.h"
#include "reader.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QString filePath = "/home/luca/ss/7.csv";
QList<QStringList> readData = QtCSV::Reader::readToList(filePath,";");
QVector<double> x(readData.size()), y(readData.size());
//l.resize(readData.size());
for ( int i = 0; i < readData.size(); ++i )
{
x[i] = readData.at(i).value(1).toDouble()-1587149254484;
y[i] = readData.at(i).value(2).toDouble();
}
//Abilita Drag e Zoom
ui->customPlot->setInteraction(QCP::iRangeDrag,true);
ui->customPlot->setInteraction(QCP::iRangeZoom,true);
ui->customPlot->addGraph();
ui->customPlot->graph(0)->setData(x,y);
ui->customPlot->graph(0)->setBrush(QBrush(QColor(0, 0, 255, 20)));
ui->customPlot->graph(0)->setPen(QPen(Qt::blue));
connect(ui->customPlot,SIGNAL(mousePress(QMouseEvent *)),SLOT (clickedGraph(QMouseEvent*)));
connect(ui->customPlot,SIGNAL(mouseMove(QMouseEvent *)),SLOT (MouseGraph(QMouseEvent*)));
ui->customPlot->addGraph();
ui->customPlot->xAxis->setLabel("Time");
ui->customPlot->yAxis->setLabel("Acc");
//double x_min = *std::min_element(x.constBegin(), x.constEnd());
//double x_max = *std::max_element(x.constBegin(), x.constEnd());
//double y_min = *std::min_element(y.constBegin(), y.constEnd());
//double y_max = *std::max_element(y.constBegin(), y.constEnd());
//ui->customPlot->xAxis->setRange(x_min, x_max);
//ui->customPlot->yAxis->setRange(y_min, y_max);
ui->customPlot->rescaleAxes();
ui->customPlot->replot();
//qDebug() << ui->customPlot->xAxis->pixelToCoord(mouseEvent->pos().x()) << ui->customPlot->yAxis->pixelToCoord(mouseEvent->pos().y());
}
void MainWindow::clickedGraph(QMouseEvent *event)
{
QPoint point = event->pos();
qDebug() << ui->customPlot->xAxis->pixelToCoord(point.x());
qDebug() << ui->customPlot->yAxis->pixelToCoord(point.y());
}
void MainWindow::MouseGraph(QMouseEvent *event)
{
QPoint point = event->pos();
qDebug() << ui->customPlot->xAxis->pixelToCoord(point.x());
qDebug() << ui->customPlot->yAxis->pixelToCoord(point.y());
QVariant xi = ui->customPlot->xAxis->pixelToCoord(point.x());
QVariant yi = ui->customPlot->yAxis->pixelToCoord(point.y());
ui->xmouse->setText(xi.toString());
ui->ymouse->setText(yi.toString());
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_horizontalSlider_valueChanged(int value)
{
}
Come libreria per plottare i dati ho usato QTCustomPlot per la semplicita' di zoom/pan mentre per la lettura di CSV e' stata impiegata QtCSV
Il codice e' disponibile su GitHub. E' possibile zoom/pan ed avere le coordinate del puntatore
Per impostare QTCustomPlot su QtCreator si devono imporate i file qtcustomplot.cpp/ qtcustomplot.h, si aggiunge al file .pro QT += printsupport, si trascina sul form un QWidget, tasto destro Promote To e si fa il promote a QtCustomPlot (il metodo e' cambiato rispetto al precedente post https://debiaonoldcomputers.blogspot.com/2013/11/software-per-progetto-force-gauge.html)
======================================================
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "qcustomplot.h"
#include "variantdata.h"
#include "reader.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QString filePath = "/home/luca/ss/7.csv";
QList<QStringList> readData = QtCSV::Reader::readToList(filePath,";");
QVector<double> x(readData.size()), y(readData.size());
//l.resize(readData.size());
for ( int i = 0; i < readData.size(); ++i )
{
x[i] = readData.at(i).value(1).toDouble()-1587149254484;
y[i] = readData.at(i).value(2).toDouble();
}
//Abilita Drag e Zoom
ui->customPlot->setInteraction(QCP::iRangeDrag,true);
ui->customPlot->setInteraction(QCP::iRangeZoom,true);
ui->customPlot->addGraph();
ui->customPlot->graph(0)->setData(x,y);
ui->customPlot->graph(0)->setBrush(QBrush(QColor(0, 0, 255, 20)));
ui->customPlot->graph(0)->setPen(QPen(Qt::blue));
connect(ui->customPlot,SIGNAL(mousePress(QMouseEvent *)),SLOT (clickedGraph(QMouseEvent*)));
connect(ui->customPlot,SIGNAL(mouseMove(QMouseEvent *)),SLOT (MouseGraph(QMouseEvent*)));
ui->customPlot->addGraph();
ui->customPlot->xAxis->setLabel("Time");
ui->customPlot->yAxis->setLabel("Acc");
//double x_min = *std::min_element(x.constBegin(), x.constEnd());
//double x_max = *std::max_element(x.constBegin(), x.constEnd());
//double y_min = *std::min_element(y.constBegin(), y.constEnd());
//double y_max = *std::max_element(y.constBegin(), y.constEnd());
//ui->customPlot->xAxis->setRange(x_min, x_max);
//ui->customPlot->yAxis->setRange(y_min, y_max);
ui->customPlot->rescaleAxes();
ui->customPlot->replot();
//qDebug() << ui->customPlot->xAxis->pixelToCoord(mouseEvent->pos().x()) << ui->customPlot->yAxis->pixelToCoord(mouseEvent->pos().y());
}
void MainWindow::clickedGraph(QMouseEvent *event)
{
QPoint point = event->pos();
qDebug() << ui->customPlot->xAxis->pixelToCoord(point.x());
qDebug() << ui->customPlot->yAxis->pixelToCoord(point.y());
}
void MainWindow::MouseGraph(QMouseEvent *event)
{
QPoint point = event->pos();
qDebug() << ui->customPlot->xAxis->pixelToCoord(point.x());
qDebug() << ui->customPlot->yAxis->pixelToCoord(point.y());
QVariant xi = ui->customPlot->xAxis->pixelToCoord(point.x());
QVariant yi = ui->customPlot->yAxis->pixelToCoord(point.y());
ui->xmouse->setText(xi.toString());
ui->ymouse->setText(yi.toString());
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_horizontalSlider_valueChanged(int value)
{
}
lunedì 13 aprile 2020
Da Arduino ad Internet tramite Android
Avevo la necessita' di collegare una Arduino Nano 33 BLE ad internet ma non avevo molte idee quando ho pensato di usare come ponte un telefono Android
Per leggere i dati della porta seriale di Arduino ho collegato un cavo OTG alla USB di Android usando la libreria https://github.com/felHR85/UsbSerial. I dati poi sono stati inviati in HTTP Get tramite OKHttp. Il progetto della applicazione Android si trova sul mio GitHub https://github.com/c1p81/Seriale (si tratta di una modifica dell'esempio della libreria UsbSerial)
Questo e' invece lo skecth Arduino
=========================================================
#include <Arduino_LSM9DS1.h>
#include <Arduino_HTS221.h>
#include <Arduino_LPS22HB.h>
#include <Arduino_APDS9960.h>
int conteggio;
void setup() {
conteggio = 0;
Serial.begin(9600);
while (!Serial);
if (!IMU.begin()) {
Serial.println("Failed to initialize IMU!");
while (1);
}
if (!HTS.begin()) {
Serial.println("Failed to initialize humidity temperature sensor!");
while (1);
}
if (!BARO.begin()) {
Serial.println("Failed to initialize pressure sensor!");
while (1);
}
if (!APDS.begin()) {
Serial.println("Error initializing APDS9960 sensor.");
}
}
void loop() {
float x, y, z;
double dx,dy,dz;
double mx,my,mz;
double fx,fy,fz;
double pitch,roll = 0.0;
double mpitch,mroll = 0.0;
const float alpha = 0.5;
float pressure = BARO.readPressure();
float temperature = HTS.readTemperature();
float humidity = HTS.readHumidity();
while (! APDS.colorAvailable()) {
delay(5);
}
int r, g, b, light_int;
APDS.readColor(r, g, b, light_int);
if (IMU.accelerationAvailable()) {
IMU.readAcceleration(x, y, z);
dx = (double)x;
dy = (double)y;
dz = (double)z;
mx = mx + dx;
my = mx + dy;
mz = mx + dz;
fx = (dx*alpha) + (fx*(1-alpha));
fy = (dy*alpha) + (fy*(1-alpha));
fz = (dz*alpha) + (fz*(1-alpha));
conteggio++;
}
if (conteggio > 10000)
{
mx = mx /conteggio;
my = my /conteggio;
mz = mz /conteggio;
roll = atan2(fy,fz)*57.29577;
pitch = atan2(-fx,sqrt((fy*fy)+(fz*fz)))*57.29577;
mroll = atan2(my,mz)*57.29577;
mpitch = atan2(-mx,sqrt((my*my)+(mz*mz)))*57.29577;
Serial.println(String(mpitch)+";"+String(mroll)+";"+String(pitch)+";"+String(roll)+";"+String(temperature)+";"+String(humidity)+";"+String(pressure)+";"+String(light_int));
conteggio = 0;
fx = fy = fz = 0;
mx = my = mz = 0;
}
delay(10);
//delay(5000);
}
=========================================================
La Arduino e' contenuta nella scatolina bianca |
Per leggere i dati della porta seriale di Arduino ho collegato un cavo OTG alla USB di Android usando la libreria https://github.com/felHR85/UsbSerial. I dati poi sono stati inviati in HTTP Get tramite OKHttp. Il progetto della applicazione Android si trova sul mio GitHub https://github.com/c1p81/Seriale (si tratta di una modifica dell'esempio della libreria UsbSerial)
Questo e' invece lo skecth Arduino
=========================================================
#include <Arduino_LSM9DS1.h>
#include <Arduino_HTS221.h>
#include <Arduino_LPS22HB.h>
#include <Arduino_APDS9960.h>
int conteggio;
void setup() {
conteggio = 0;
Serial.begin(9600);
while (!Serial);
if (!IMU.begin()) {
Serial.println("Failed to initialize IMU!");
while (1);
}
if (!HTS.begin()) {
Serial.println("Failed to initialize humidity temperature sensor!");
while (1);
}
if (!BARO.begin()) {
Serial.println("Failed to initialize pressure sensor!");
while (1);
}
if (!APDS.begin()) {
Serial.println("Error initializing APDS9960 sensor.");
}
}
void loop() {
float x, y, z;
double dx,dy,dz;
double mx,my,mz;
double fx,fy,fz;
double pitch,roll = 0.0;
double mpitch,mroll = 0.0;
const float alpha = 0.5;
float pressure = BARO.readPressure();
float temperature = HTS.readTemperature();
float humidity = HTS.readHumidity();
while (! APDS.colorAvailable()) {
delay(5);
}
int r, g, b, light_int;
APDS.readColor(r, g, b, light_int);
if (IMU.accelerationAvailable()) {
IMU.readAcceleration(x, y, z);
dx = (double)x;
dy = (double)y;
dz = (double)z;
mx = mx + dx;
my = mx + dy;
mz = mx + dz;
fx = (dx*alpha) + (fx*(1-alpha));
fy = (dy*alpha) + (fy*(1-alpha));
fz = (dz*alpha) + (fz*(1-alpha));
conteggio++;
}
if (conteggio > 10000)
{
mx = mx /conteggio;
my = my /conteggio;
mz = mz /conteggio;
roll = atan2(fy,fz)*57.29577;
pitch = atan2(-fx,sqrt((fy*fy)+(fz*fz)))*57.29577;
mroll = atan2(my,mz)*57.29577;
mpitch = atan2(-mx,sqrt((my*my)+(mz*mz)))*57.29577;
Serial.println(String(mpitch)+";"+String(mroll)+";"+String(pitch)+";"+String(roll)+";"+String(temperature)+";"+String(humidity)+";"+String(pressure)+";"+String(light_int));
conteggio = 0;
fx = fy = fz = 0;
mx = my = mz = 0;
}
delay(10);
//delay(5000);
}
=========================================================
I dati sono plottati sul server mediante JSCanvas. Gli script si trovano qui https://github.com/c1p81/Seriale/tree/master/app/seriale_html
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...