giovedì 24 dicembre 2020

Brunsviga 13 ZK

 Calcolatrice meccanica Brunsviga 13 ZK seriale 213474... indicativamente 1930-19340

A parte lo stato della vernice e' ancora funzionate








martedì 22 dicembre 2020

Intel RealSense L515

 Ho avuto modo di provare il sensore Intel RealSense L515 sul campo e piu' precisamente in una acquisizione in cava. Il sensore era promettente perche' la scheda tecnica parla di un raggio di azione del lidar massimo di 9 m


Ci sono da indicare un paio di aspetti

Il primo e' che il sensore e' dal punto di vista del firmware e del software ancora abbastanza immaturo. RTab-Map utilizza il sensore solo in alcune versioni ancora beta....funziona bene ma non sono disponibili tutti i parametri di impostazione che si possono settare in Intel RealSense Viewer. Per esempio il firmware attuale permette di lavorare a 1280 pixel di risoluzione mentre RTab-Map lavora al massimo a 640x480 facendo un downgrade al firmware 1.5.0.0 

https://www.intelrealsense.com/optimizing-the-lidar-camera-l515-range/

Il secondo aspetto decisamente penalizzante e' che il raggio di azione in cava era compreso tra 0.5 ed 1 m dalla parete rocciosa ... a maggiori distanze non c'era segnale

Leggendo nel dettaglio la scheda tecnica si osserva che il laser emette ad una frequenza di 860 nm che si sovrappone con lo spettro di emissione del Sole.. in pratica se si usa il sensore outdoor questo viene completamente accecato dalla luce solare. Per una riprova ho fatto una acquisizione di notte e sono arrivato fino a 7 di range di rilevamento. C'e' inoltre da dire il raggio d'azione del laser e' su un settore circolare per cui se ci troviamo all'estremo del range di misura la parte centrale potra' essere acquisita mentre i bordi dell'immagine no




In estrema sintesi strumento interessante ma si puo' usare per scopi geologici solo in miniera, il che puo' avere un senso date le ridotte dimensioni


domenica 20 dicembre 2020

Congiunzione Giove Saturno 20 Dicembre 2020

 La migliore congiunzione si raggiungera' il 21 dicembre ma vista l'incertezza meteo ho preferito approfittare di una finestra tra le nuvole per fare qualche foto

Questa e' la foto migliore...si riescono a vedere anche i satelliti galileiani

Congiunzione Giove Saturno
Congiunzione Giove Saturno foto singola


Elaborazione da video 



Da Stellarium (ovviamente l'immagine del telescopio e' ribaltata)






Per avere un'idea della distanza angolare ho ripreso con le stelle impostazione :Luna e Giove-Saturno




Celestron Nexstart 127 SLT con Canon EOS 450d




giovedì 17 dicembre 2020

Salvare dati seriali orari in Linux

 Per salvare i dati da una porta seriale (nello specifico un GPS) e dividerli in blocchi orari ho trovato comodo il comando timeout che uccide un processo dopo un tempo definito dall'utente

per esempio si puo' creare un file come il seguente

file sig.sh

================================

timeout -sHUP 59m cat /dev/ttyUSB0 > "/$(date +"%Y%m%d_%H_%M").ubx"

================================

a questo punto si puo' mettere il tutto in cron con esecuzione oraria per riavviare  

@hourly /sig.sh

(ho impostato il timeout a 59 minuti in modo da essere sicuro che quando parte il cron con cadenza oraria la porta seriale non sia bloccata dal processo in esecuzione in precedenza)


sabato 12 dicembre 2020

Blocco trasformatore Olivetti Logos 55 e 58

 Il modulo trasformatore della Olivetti Logos 55 e 58 (sono intercambiali) si trova al di sopra della tastiera ed e' fissato con 4 viti. Il collegamento con la 220 V viene con un cavo faston bianco direttamente dalla presa di rete



E' presente un fusibile da 100 mA 



Per verificare le tensioni si puo' seguire lo schema sottostante (questa piastrina nel linguaggio Olivetti si chiama Piastrina ALI)

la linea +12V di sinistra e' definita A, quella a destra B

Le tolleranze sono -10.8/-13.2V per la linea -12V, +10.8/13.2V per la la linea +12V-A e +10/14V per la linea +12V-B

Mi e' capitato di avere un modulo rotto che non presentava tensione sulla linea a -12V. In questo caso all'accensione anche premendo il tasto di CLR Registers la luce rossa non si spengeva. 

Il modulo di alimentazione e' collegato alla parte elettronica con un connettore  a pettine sull'estremita sinistra 

Coperto da una copertura bianca si trova questo condensatore


Al di sotto del fusibile e' presente un cavo fissato con faston a 6 posizioni (con soli 5 pin) definito nel manuale Olivetti Combo-Line alternata con le posizioni dello schema in grassetto 

   1 N 5

    2 4 6

Se si scollega il faston si devono trovare 12V alternati tra i pin 1 e 2, 24V alternati tra i pin 5 e 6, e tra i punti 4 e 5, 4 e 6 si trovano 11-12V



martedì 8 dicembre 2020

Riparazione tastiera Olivetti Logos 55

Aggiornamento 2

Ho avuto modo di osservare una tastiera di una Olivetti Logos 58

In alto Logos 55, in basso Logos 58

Ad esclusione del differente numero di tasti il meccanismo e' sostanzialmente il solito. Avendo un modello di tastiera funzionante ho visto che alcuni pendolini non hanno solo due posizioni (come indicato in precedenza) ma hanno anche una posizione neutra centrale. Inoltre nella Logos 58 tutti i pendoli sono dello stesso colore

In alto Logos 55, in basso Logos 58

Consultando il sito http://johnwolff.id.au/calculators/Olivetti/Logos58/Logos58.htm ho potuto osservare di non essermi sbagliato sulla natura binaria della codifica della tastiera

in realta' i bit sono 6 perche' il sesto collegamento e' il segnale di strobe

e' anche presentato lo schema elettrico


========================================

Aggiornamento 

ho avuto modo di leggere il service manual originale Olivetti 

Nel linguaggio del manuale gli interruttori sono indicati come Dry-Reed mentre quelli che io ho indicato come cavallotti vengono definiti "pendolini". Viene inoltre indicata la presenza di un "ponte qualificazione capacita'" 

========================================

Sto cercando di rimettere in funzione una Olivetti Logos 55. La calcolatrice si smonta in modo modulare C'e' il blocco tastiera, il blocco alimentazione (riconoscibile dal generoso condensatore blu), il blocco motore (a destra dell'alimentazione), il blocco piastrina console (tasto on/off e selettori di precisione del calcolo) e blocco stampa. 


 

Per sganciare la tastiera basta spostare 4 forcelle e tirare verso l'alto tutto il blocco tastiera

Al di sotto della tastiera sono presenti 7 interruttori di prossimita' magnetici (ampolle reed). Si tratta di piccole ampolle di vetro riempite di gas inerte nel quale sono inserite due lamine. Azionando i tasti si alzano ed abbassano 7 cavallotti (2 rossi,1 bianco e 4 neri) con un magnete all'estremita'

http://www.elektro.it/magnetici/magnetici_01.html

I cavallotti sono bloccati da un gabbietta di plastica bianca. L'eta' ha reso molto fragile la plastica ed i dentini sono molto facili da rompere. A sinistra si possono vedere i cavallotti smontati e la gabbietta fuori dalla sede


In pratica la tastiera si comporta come un encoder a 7 bit. Per ogni tasto premuto c'e' una  combinazione univoca delle posizioni dei cavallotti

Un esempio di movimento





questa e' la tabella delle combinazione usando la codifica della foto superiore indicando con 1 interrutore chiuso e 0 interruttore aperto



Il meccanismo per rialzare ogni singolo tasto e' dato dalla molla alla sinistra della tastiera


Sul bordo della tastiera c'e' una guarnizione di gomma (prima e dopo la pulizia)





giovedì 3 dicembre 2020

Certificato corso Swift

Corso di difficolta' molto bassa ma in ogni caso utile per partire con Swift....certo che ci sono convergenze astrali tra Kotlin e Swift 






martedì 1 dicembre 2020

Includere libreria in qmake con Pkgconfig

Per includere una libreria in qmake  che disponga del supporto a pkg-config e' sufficiente aggiungere le due righe sottostanti nel file .pro

unix: CONFIG += link_pkgconfig
unix: PKGCONFIG += pcl_common-1.11 pcl_features-1.11 pcl_io-1.11

per conoscere il nome esatto si puo' digitare 

pkg-config --list-all

venerdì 27 novembre 2020

martedì 24 novembre 2020

Luna e Marte

 23 Novembre 2020 Firenze 18:30 




Visualizzatore di nuvole di punti con GLFW e PCL

Per imparare un po' di librerie mi sono fatto il mio visualizzatore di nuvole di punti

Volevo includere ImGui o NanoGui per settare i valori delle variabili ma non riesco a trovare il modo di compilarli

 https://github.com/c1p81/cloudpoint_glfw


La visualizzazione si modifica con i tasti freccia/pg up-down ed il mouse

sabato 21 novembre 2020

Realsense SDK con D435 in Debian

Dopo un po' di esperienza con i sensori a luce strutturata ho provata il sensore Intel RealSense D435 (attenzione manca la i finale....a differenza al D435i qui non e' presenta la IMU integrata) che funziona come sensore di profondita' usando la stereoscopia di due camere

Il sensore e' nato per applicazioni di robotica ed e' molto veloce nell'acquisizione/elaborazione (circa 30 fps) ma il risultato come dato di profondita' e' molto differente da quello che si ottiene da un sensore a luce strutturata


Oltre alle due camere per la stereoscopia e' presente un illuminatore IR per migliorare il dato di profondita' ed una camera RGB

La distanza massima operativa e' di circa 4m. Come si nota dal video il dato e' molto rumoroso



Un aspetto che mi ha lasciato molto perplesso e' che non risultano essere conservati gli angoli. Per esempio nella realta' l'angolo e' di 90 gradi mentre dalla mesh risulta essere di 105 gradi. Credo che questo sia dovuto al fatto che le lenti sono quasi dei fish-eye



Per quanto rigurda le lunghezza la porta in realta' e' larga 125 cm mentre il sensore la misura circa 105 cm

Diciamo che i dati al centro dell'immagine sono coerenti ma sui bordi 

l'SDK e' nato per Windows e Ubuntu ma si puo' installare su Debian utilizzando Snap

snap install librealsense

Oltre alle librerie si installa anche realsense-viewer da cui e' possibile anche effettuare l'upgrade del firmware della camera

Gli esempi si trovano a  https://dev.intelrealsense.com/docs/code-samples

Per compilare gli esempi ho dovuto installare anche la libreria StbEasyFont (e' presente nella directory third parts ma io la ho installata con apt per semplicita')

=================================================
cmake_minimum_required(VERSION 3.5)

project(realsense LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(realsense2 REQUIRED )


add_executable(realsense main.cpp)
target_link_libraries(realsense realsense2)

=================================================

=================================================
#include <iostream>
#include <librealsense2/rs.hpp> 

using namespace std;

int main()
{
    rs2::pipeline p;
    p.start();
    rs2::frameset frames = p.wait_for_frames();
    rs2::depth_frame depth = frames.get_depth_frame();
    float width = depth.get_width();
    float height = depth.get_height();
    float dist_to_center = depth.get_distance(width / 2, height / 2);
    std::cout << "The camera is facing an object " << 
dist_to_center << " meters away" << endl << endl;
    return 0;
}
=================================================

Multicam
Nell'esempio Multicam oltre alla libreria Realsense viene usata anche OpenGL con glfw


================================================
cmake_minimum_required(VERSION 3.5)

project(multicam LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# finds OpenGL, GLU and X11
find_package(OpenGL REQUIRED)
if(NOT OPENGL_FOUND)
    message("ERROR: OpenGL not found")
endif(NOT OPENGL_FOUND)
set(GL_LIBRARY GL GLU X11)


find_package(realsense2 REQUIRED )

add_executable(multicam main.cpp)
target_link_libraries(multicam realsense2 glfw ${GL_LIBRARY} m)
================================================


Iphone 12 Pro per la geologia

Avevo provato tempo fa ad usare il tablet Google Tango per scansionare un affioramento roccioso

Adesso che anche Iphone 12 pro (e Ipad Pro 2020) ha un lidar volevo vedere la possibilita' di usare il telefono di Apple per applicazione geologiche



 
Mettendo a confronto Tango con Iphone si nota che entrambi hanno un raggio di scansione massimo tra i 3 ed i 4 metri ma sicuramente la IMU di Iphone e' migliore in quanto spostandosi non decorrela in modo significativo anche su lunghezze superiori ai 10 m

Scansione con Iphone

Scansione con Google Tango Tablet


La cosa che mi impressiona sempre e' come sia possibile ottenere delle misure di lunghezza senza la necessita' di ricalibrare i dati ma questo aspetto e' comune sia a Tango che ad IPhone

Misura di strato : a sinistra di misura reale, a destra misura dal mesh


Non esiste una applicazione ufficiale per esportare i cloudpoint o la mesh da IPhone ma sono disponibili 3DScanner App, PolyCam e Heges



I dati comunque sono leggibili ed elaboraibili da CloudCompare 

giovedì 19 novembre 2020

Compilare VTK su WIndows

 Una volta spacchettato il file tar.gz per esempio c:\vtk\src. Si crea una directory build e con CMake-GUI si indica la sorgente in src e ovviamente la build con build usando come target il compilatore di Visual Studio 2019 (viene richiesta la scelta dopo aver premuto Configure)

Al termine si clicca Generate  e si aprono gli strumenti di Visual Studio/Developer Command Prompt, si entra nella directory dove e' stato creato il file progetto 



e si digita

msbuild /p:Configuration=Debug ALL_BUILD.vcxproj

la compilazione richiede abbastanza tempo

PCL Library e Visual Studio 2019

 Per installare ed usare PCL su Windows la cosa piu' comoda e' utilizzare il pacchetto PCL-1.11.1-AllInOne-msvc2019-win64 

Una volta installato il file exe per esempio in C:\Program Files\PCL 1.11.1


Per creare un progetto in QT con le PCL si devono aggiungere nella path OpenNI2 (stranamente l'installer non la ha aggiunta nella PATH)

Ho sostituito la versione di CMAKE da quella di default di QT con l'installer di CMake  (modificabile dai Kit di Qt) ed come compilatore ho selezionato MSVC2019



il file CMAKE e' il seguente

===============================================

cmake_minimum_required(VERSION 3.5)


project(t3 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(PCL 1.3 REQUIRED COMPONENTS common io features)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})


add_executable(t3 main.cpp)
target_link_libraries(t3 ${PCL_LIBRARIES})

===============================================

mentre un programma di esempio e' 
===============================================
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>

#include <pcl/features/normal_3d.h>

using namespace std;

int main()
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);

     if (pcl::io::loadPCDFile<pcl::PointXYZ> ("c://gabriele.pcd", *cloud) == -1) //* load the file
     {
       PCL_ERROR ("Couldn't read file test_pcd.pcd \n");
       return (-1);
     }
     //std::cout << "Loaded " << cloud->width * cloud->height << " data points from test_pcd.pcd with the following fields: " << std::endl;
     /*for (size_t i = 0; i < cloud->points.size (); ++i)
       std::cout << "    " << cloud->points[i].x << " "    << cloud->points[i].y << " "    << cloud->points[i].z << std::endl;
    */
     // Create the normal estimation class, and pass the input dataset to it

     pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
     ne.setInputCloud (cloud);
    // Create an empty kdtree representation, and pass it to the normal estimation object.
       // Its content will be filled inside the object, based on the given input dataset (as no other search surface is given).
       pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ> ());
       ne.setSearchMethod (tree);

       // Output datasets
       pcl::PointCloud<pcl::Normal>::Ptr cloud_normals (new pcl::PointCloud<pcl::Normal>);

       // Use all neighbors in a sphere of radius 3cm
       ne.setRadiusSearch (0.03);

       // Compute the features
       ne.compute (*cloud_normals);

       //std::cout << endl << cloud_normals->size() << endl;


       // cloud_normals->size () should have the same size as the input cloud->size ()*

       int i = 0;
       for (pcl::Normal n : *cloud_normals) {
           //std::cerr << i << " n = " << n.normal_x << ", " << n.normal_y << ", " << n.normal_z << "\n";
           std::cout << n.normal_x << "," << n.normal_y << "," << n.normal_z << "\n";
           i++;
       }



    return 0;
}


venerdì 13 novembre 2020

Riparazione Soundic Pong

Questo modello di Pong Soundic anno 1979 a colori lo ho comprato come rotto in quanto i controller non rispondevano 


Di fatto pero' i controller sono dei semplici potenziometri


E' stato sufficiente un pulisci contatti a secco 


Pensavo che fosse rotto perche' ad un certo punto nonostante colpissi la pallina la racchetta era come trasparente. Un amico mi ha detto che e' un comportamento normale, a 15 punti la partita e' terminata e nonostante il gioco continui non si puo' piu' colpire la palla



domenica 8 novembre 2020

Misurazione lunghezze ed angoli con CloudCompare

 Per misurare le lunghezze e gli angoli di una nuvola di punti su CloudCompare si clicchi sul pulsante cerchiato in rosso nell'immagine successiva


Si apre il menu

La seconda icona permette di misurare le distanze, la terza di calcolare gli angoli



LLama3 Anita

A seguito di questo post ho provato a vedere ho provato a vedere cosa accadeva ad utilizzare un modello specifico per la lingua italiana in...