martedì 8 settembre 2020

Z80 su breadboard

 Usando le indicazioni riportate su questo blog mi sto costruendo un piccolo calcolatore basato su Z80 su breadboard.....e costruirlo leggendo il libro di Faggin ha decisamente un valore aggiunto


Per rendere l'esperienza piu' stimolante ho usato un 555 per generare il clock al posto della Arduino dell'esempio. Ci sono diversi progetti che usano Arduino come emulazione di  memoria RAM ma mi sembra un po' barare sull'idea di base

Per dimensionare i componenti in confronto al clock richiesti si puo' usare questo calcolatore online per 555 Visto che si tratta di un progetto didattico ho settato un clock molto basso (circa 1 Hz)




venerdì 28 agosto 2020

Laptop solare

Uno dei miei vecchi progetti era quello di alimentare il PC con il solo contributo solare. Oggi ho terminato il progetto


Per prima cosa non ho scelto un desktop ma ho preso un Lenovo T220 che giaceva non utilizzato. Ho tagliato il cavo dell'alimentatore ed ho trovato un cavo coassiale in cui l'esterno e' negativo ed il centro il positivo con un voltaggio di 20.2 V 

Cavo alimentatore Lenovo

Visto che l'impianto solare esce a 12 V e non volendo sprecare energia passando da un inverter a 220 V per poi ritornare a 20 V ho collegato all'uscita del regolatore solare un modulo convertitore boost (da 400 W ma ne bastano 65 W). Attenzione...alcuni convertitori sono limitati a 35 W ed alcuni fanno solo lo step down della tensione e non lo step up



L'uscita del convertitore e'collegata direttamente allo spinotto del Lenovo

Nella foto sottostante il regolatore del pannello solare (attaccato ad una batteria da auto a 12 V ed un pannello solare da 50 W). Il converitore che si vede nella foto non e' quello definitivo perche' andava sempre in protezione per troppo carico


Sono iniziate le prove per vedere quanto e' efficiente il sistema e per quanto tempo mi tiene in vita il portatile


giovedì 27 agosto 2020

Saturno

 Saturno con lente di Barlow 3X post processata come il precedente post su Giove

Le condizione dell'atmosfera erano veramente pessime con molta turbolenza



Una piccola nota: ho fatto il video con la Eos 500 e dallo schermo era chiaro che stato inquadrando Saturno. Una volta aperto il file MOV con VLC ho pensato di non aver registrato perche' lo schermo era tutto nero....provando a modificare le impostazioni della luminosita' del video e' stato possibile osservare Saturno. 




mercoledì 26 agosto 2020

Compilare Fritzing da sorgenti su Debian

Ho appena scoperto che non e' piu' possibile scaricare in modo gratuito Fritzing....ma e' comunque possibile compilarlo da sorgenti

Ovviamente ho deciso di provare a compilarlo da sorgenti


Per prima cosa si deve creare un directory in cui eseguire


git clone https://github.com/fritzing/fritzing-app

git clone https://github.com/fritzing/fritzing-parts


a questo punto si scaricano i sorgenti di Boost

apt-get install  libboost-dev

si crea quindi una directory libgit2 e si decomprimono i sorgenti da https://github.com/libgit2/libgit2/releases/tag/v0.28.5 e si compilano

mkdir build 
cd build 
cmake -DBUILD_SHARED_LIBS=OFF .. 
cmake --build .

a questo punto si apre QtCreator e si apre il progetto phoenix.pro e si lancia la compilazione

Arrivati fino a qui l'eseguibile e' compilato ma non riesce a trovare le librerie delle parti elettroniche

Per attivarle da linea di comando si lancia

/Fritzing -f "/home/luca/fritzing/build-phoenix-Desktop_Qt_5_13_2_GCC_64bit-Debug/" -parts "/home/luca/fritzing/fritzing-parts/"




Offuscare funzione Javascritp con Obfuscator.io

 Premesso che offuscare un codice difende solo curiosi piu' pigri, tra le opzioni piu' complete per offuscare una funzione javascript ho trovato utile e funzionante Obfuscator.io

Dopo aver copiato il codice JS conviene flaggare Dead Code Injection, String Array Rotate and Shuffle, Encode RC4, Split String, Disable Console Output, Self Defending e Debug Protection

In questo modo il codice viene offuscato ed anche andando nei Developer Tools di Chrome 







Scansioni codici QR in Kotlin Android

Nel 2013 avevo fatto qualche esperimento con la lettura dei codici a barre tramite la libreria ZXing.

Ad oggi le funzioni di scansioni dei codici sono incluse nelle librerie di Google Play ma le trovo complicate mentre la libreria ZXing (https://github.com/zxing/zxing) e' in maintenance mode. Ho trovato una alternativa a questo link    https://github.com/yuriy-budiyev/code-scanner

build.gradle(app)

implementation 'com.budiyev.android:code-scanner:2.1.0'

Layout
=====================================================
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">

<com.budiyev.android.codescanner.CodeScannerView
android:id="@+id/scanner_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:autoFocusButtonColor="@android:color/white"
app:autoFocusButtonVisible="true"
app:flashButtonColor="@android:color/white"
app:flashButtonVisible="true"
app:frameColor="@android:color/white"
app:frameCornersSize="50dp"
app:frameCornersRadius="0dp"
app:frameAspectRatioWidth="1"
app:frameAspectRatioHeight="1"
app:frameSize="0.75"
app:frameThickness="2dp"
app:maskColor="#77000000"/>
</FrameLayout>

</androidx.constraintlayout.widget.ConstraintLayout>
=====================================================
codice

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

    val scannerView = findViewById<CodeScannerView>(R.id.scanner_view)

codeScanner = CodeScanner(this, scannerView)

// Parameters (default values)
codeScanner.camera = CodeScanner.CAMERA_BACK // or CAMERA_FRONT or specific camera id
codeScanner.formats = CodeScanner.ALL_FORMATS // list of type BarcodeFormat,
// ex. listOf(BarcodeFormat.QR_CODE)
codeScanner.autoFocusMode = AutoFocusMode.SAFE // or CONTINUOUS
codeScanner.scanMode = ScanMode.SINGLE // or CONTINUOUS or PREVIEW
codeScanner.isAutoFocusEnabled = true // Whether to enable auto focus or not
codeScanner.isFlashEnabled = false // Whether to enable flash or not

// Callbacks
codeScanner.decodeCallback = DecodeCallback {
runOnUiThread {
Toast.makeText(this, "Scan result: ${it.text}", Toast.LENGTH_LONG).show()
}
}
codeScanner.errorCallback = ErrorCallback { // or ErrorCallback.SUPPRESS
runOnUiThread {
Toast.makeText(this, "Camera initialization error: ${it.message}",
Toast.LENGTH_LONG).show()
}
}

scannerView.setOnClickListener {
codeScanner.startPreview()
}
}

override fun onResume() {
super.onResume()
codeScanner.startPreview()
}

override fun onPause() {
codeScanner.releaseResources()
super.onPause()
}

lunedì 24 agosto 2020

Decrittare PGP in Kotlin per Android


Un comodo sistema per decrittare messaggi PGP con Kotlin su Android e' quello di usare la libreria https://github.com/Tlaster/KotlinPGP che in pratica e' un wrapper per BountyCastle 

in build.gradle(app)  si aggiunge
 
implementation 'moe.tlaster:kotlinpgp:1.0.20'

il codice e' sostanzialmente autoesplicativo per quanto e' semplice

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

package com.luca.innocenti.pgp_k2

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import moe.tlaster.kotlinpgp.KotlinPGP

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var segreta = "-----BEGIN PGP PRIVATE KEY BLOCK-----\n" +
"\n" +
"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\n" +
"1XGfLXE+Y3U1WlFWF19aWRB054bdz5DDgBjIbw==\n" +
"=7ffe\n" +
"-----END PGP PRIVATE KEY BLOCK-----"

var encryptedData:String = "-----BEGIN PGP MESSAGE-----\n" +
"Version: OpenPGP.js v4.10.4\n" +
"Comment: https://openpgpjs.org\n" +
"\n" +
"wcBMA8AU2yvA99UdAQf+MylbvwaDMuqBneUH8kfMhq5CxCiUwORkZ4sE7/e+\n" +
"CIb+XTc5wYCuTIIqsv8JfcCjLs6fSwjlvEcvjSAn08geiIrquiBbgnkBWPR7\n" +
"iv7CMt6LPzcKfuHt18ZZarEQEf4mwH/DxU+ohYqXpRIuAVbGbcR1n1qWPkto\n" +
"hWDQQLXFZ/fAYKdZekA+SdvISrzpEbS+yy5y0K035oD0aqee6Up93jARvHTk\n" +
"R7kWuBCFoMk23PDTZM+Hv9DNumOXIOm/avZfbVr4I0O0LYlCaq1QOkmV1sfq\n" +
"P2lLD2cGgYp0c6VeLCb9/bbZx/UXPBiakXS3dH09jDE7zUXvk9mrPFz3YlA5\n" +
"M9I/AViN02M0pF83CYzDqCkJ4GkzjAv50bXWzn4ZS0nNR1dl9rY/Ve6KSGiV\n" +
"kTRtpLQ17TI1awzTg4wyifMkrYNW\n" +
"=xPR8\n" +
"-----END PGP MESSAGE-----"

val decrypt = KotlinPGP.decrypt(segreta, "password", encryptedData)
Log.d("test", decrypt.result)

}
}

mercoledì 19 agosto 2020

Cubo di Rubik

Questo e' solo un post di festeggiamento
Il cubo  di rubik e' sempre stata la mia croce da bambino tanto che per "risolverlo" avevo imparato a smontarlo e rimontalo

Oggi per la prima volta sono riuscito a risolverlo grazie all'aiuto di Internet
Con questo algoritmo http://www.giuseppestablum.it/grafica/RUBIK_STRATI.pdf basta solo essere attenti e ligi alle istruzioni 

 



Giove post processing

Ed alla fine una foto decente di Giove 

Per realizzare la foto ho usato un Celestron SLT 127 con una lente di barlow x2 ed una fotocamera Canon EOS 500D ed anello T2


Invece di fare una foto ho fatto un video (formato MOV)  che e' stato successivamente convertito in un AVI non compresso tramite il programma PIPP https://sites.google.com/site/astropipp/



Per lo stacking delle foto e' stato utilizzato AutoStakkert! https://www.autostakkert.com/wp/download/

martedì 4 agosto 2020

Tim Smart Spaces Hackathon

Attestato di partecipazione al Tim Smart Spaces Hackathon

Per i pochi interessati il github in cui sono stati pubblicati i documenti e' https://github.com/c1p81/Smart_Fridge/


lunedì 20 luglio 2020

Cometa NeoWise C/2020 F3 Firenze

Mentre sui giornali uscivano spettacolori foto della cometa Neowise 2020 io non riuscivo a vederla nel cielo di Firenze....alla fine ho scoperto il motivo



Abitando a Firenze Sud ed essendo la cometa nel quadrante NW del cielo in pratica mi trovavo tutta la luce di Firenze nel mezzo. Giusto per prova ho provato non a guardare a occhio nudo ma utilizzando un Celestron Travelscope 70...ed eccola li' che spunta (la foto e' stata fatta col cellulare dall'oculare del telescopio e non rende bene lo spettacolo)

Visto che avevo la macchina fotografica dietro ho provato senza telescopio. Ho scattato alla cieca puntando piu' o meno dove doveva essere la cometa....e come si vede ero completamente fuori fuoco


Un po' di distingue la cometa con la coda

Il giorno successivo ho provato fare una foto un po' piu' decente utilizzando la app IOS Night Cap

 

forse e' meglio indicare la cometa....



martedì 7 luglio 2020

Ancora telescopio


Un breve video sull'osservazione della Luna


per realizzarlo ho preso utilizzato il dispositivo nella foto sottostante


si tratta in breve di una webcam 320x200 priva della lente e con adattatore da 1,25 pollici


lunedì 6 luglio 2020

Ritorno al 1985 (Grafica C64)

Una simpatica applicazione web http://c64.superdefault.com/ riscala le foto attuali nella palette e nelle dimensioni della grafica del C64



sabato 27 giugno 2020

Primi passi col telescopio

Mi sono comprato a 50 euro un telescopio newtoniano Sky-watcher) con diametro 130 mm e focale 900 mm con montatura equatoriale EQ2 non motorizzata (per la cronaca il modello e' ancora in vendita al prezzo di 269 euro) . Il telescopio era venduto senza oculare ma compreso di ragnatele e polvere all'interno del tubo

Non ho nessuna esperienza diretta di osservazione con telescopio ed il primo passo e' quello di imparare ad settare la montatura verso la stella polare

La prima foto, fatta con un cellulare appoggiato all'oculare, 



Immagine raddrizzata con indicazione dei toponimi


domenica 14 giugno 2020

Configurare AS32-TTL100-V2.0

Si impostano M0 ed M1 a 0 togliendo i jumper dalla scheda



Su un terminale si inviano i dati
Per configurare la porta si usa stty
stty 9600 cs8 -cstopb -ixoff -F /dev/ttyUSBx

(per la configurazione si usano sempre 9600 indipendentemente da come era configurata
la UART in precedenza) 

con echo si inviano i dati
echo -en '\xC1\xC1\xC1' > /dev/ttyUSB3

su un altro terminale si riceve la risposta
cat < /dev/ttyUSB3


per configurare il dispositivo si devono inviare 6 Byte in formato esadecimale

C0h 
00h High Address
00h Low Address
25h = 00-100-101  00 indica 8N1, 100 indica 19200, 101 19200 airspeed
17h = canale di trasmissione (433 MHz)
44h = 0-1-000-100 0 transparent mode, 1 IO Drive, 000 wakeup time, 1 Fec switch, 00 30 dBm
 

19200 Air 19200 USB/Seriale
echo -en '\xC0\x00\x00\x25\x17\x44' > /dev/ttyUSB3

9600 Air 9600 USB/Serial
echo -en '\xC0\x00\x00\x1C\x17\x44' > /dev/ttyUSB3

19200 Air 9600 USB/Serial
echo -en '\xC0\x00\x00\x1D\x17\x44' > /dev/ttyUSB3

Trasferimento file via Lora

Per trasferire via LoRa e' come trasferire dati tramite un normale collegamento seriale
Si puo' quindi usare minicom impostando Hardware e Software Flow Control ad Off

Su un endpoint si digita CTRL A Z S selezionando XModem (non sono riuscito ad usare ZModem)
Sull'altro endpoint si digita CTRL A Z R selezionando XModem


La velocita' di traferimento e' molto bassa.....nel mio caso 98 BPS su un file di 300 KB (di default la scheda e' impostata a 2.4 kbps).. modificando la velocita' a 19.2 kbps sono passato a 633 bps

Includendo errori e ritrasmissioni alla massima velocita' si riescono a trasferire 100 kb in circa 2.5 minuti e 1 Mb in circa 25 minuti

sabato 13 giugno 2020

Algoritmi di compressione file testo

Devo trasferire su una connessione seriale molto lenta un file testo e per cercare di minimizzare il tempo di trasferimento, visto che non posso modificare la velocita', devo provare a comprimere al massimo

Dimensioni originali : 4012005 bytes 

Di seguito i risultati (in ordine di percentuale di compressione, ovviamente non sono previsti algoritmi lossy) dal peggiore al migliore

ZIP (26%) 1052588 bytes
BZIP (19%) 777324 bytes 
KGB standard compression (17%)  704919 bytes
LRZIP (16.5%) 664153 bytes
BROTLI max compression (15%) 607908  bytes
XZ (14%) 590916 bytes
LZMA (14%) 586371 bytes
KGB (14%) best compression 573005 bytes

Per KGB massima compressione le richieste di memoria sono particolarmente onerose

mercoledì 10 giugno 2020

Porta seriale dirottata su Internet con ser2net

Se si ha un dispositivo con una uscita seriale (per esempio un GPS) ma che non ha la possibilita' di connettersi ad Internet un modo semplice di creare un gateway seriale e' quello di utilizzare un Raspberry, per esempio un 3 A+, ed il software ser2net



Una volta installato tramite apt si edita il file /etc/ser2net.conf inserendo per esempio una riga del tipo

6000:raw:600:/dev/ttyACM0:115200 8DATABITS NONE 1STOPBIT banner

che espone sulla porta TCP 6000 del dispositivo i dati raw della porta seriale /dev/ttyACM0 a velocita' 115200 8N1


riavviato il servizio tramite /etc/init.d/ser2net reload ci si puo' spostare su un altro computer e chiamare, per esempio tramite netcat, la porta 6000 per vedere arrivare lo stream dei dati seriali

nc xxx.xxx.xxx.xxx 6000



Solar Edison

Premessa: il progetto Solar Edison e' stato sostituito dal progetto Solar Raspberry

Uno dei miei progetti di piu' lungo corso che non ho mai realizzato e' quello di realizzare un computer completamente svincolato dall'alimentazione di rete. Deve essere trasportabile (quindi con dimesioni e peso contenuto), possibilmente con uptime superiore al 95% e con una capacita' di calcolo discreta

E' arrivato il momento di provare a costruirselo

Per il computer ho tirato fuori una Intel Edison che giaceva nel cassetto 
Il sistema di alimentazione e' composto da un pannello solare da 10 W con una batteria da moto da 7.2 Ah 12V ed un regolatore di tensione la cui uscita a 12 V e' collegata al barrel jack della Edison dove si possono applicare tensioni da 9 a 19 V



Visto che il consumo della Edison e' abbondantemente sotto i 100 mA pensavo di avere vita facile a mantenere il sistema in vita .. sbagliavo. Per motivi non meglio chiariti il sistema scarica la batteria nel giro di poche ore tanto da non passare nemmeno la notte. 


Ho provato a collegare il cavo USB di alimentazione della Edison all'uscita USB del regolatore di tensione, in questo modo i consumi sono scesi drasticamente forse perche' l'energia della batteria era dissipata dal regolatore di tensione della Edison che deve portare 12 V ai 5,3.3 e 1.8 rispettivamente della Arduino Board e del processore Atom.

Sembrava vinta ma in questa configurazione ho perso la porta USB della Edison su cui dovevo montare un GPS

Per fare una prova ho preso un pannello solare da 50W con una batteria da auto da 42Ah ma con questa soluzione si perde la trasportabilita'. Il progetto e' quindi stato chiuso in favore di una Solar Raspberry



Autografo Gino Bartali

Ho avuto la fortuna di intervistare Gino Bartali negli anni 80 per un giornalino di ragazzi, lo ho sentito raccontare le sue storie dal vivo insieme a Martini...del resto abitavo a 500 metri da casa sua. Ero anche invidioso del barbiere che aveva un poster con la foto dello scambio di borraccia con Coppi sul Galibier autografato...ma non ho mai avuto occasione di chiederglielo. A distanza di tanti anni ho una cartolina con un autografo originale datata 1953






AX25 over LoRa

Quando ho iniziato ad usare Linux negli anni 90 sui Cd c'era quasi sempre una directory denominata Ham Radio con programmi di cui non conoscevo l'utilizzo. Dopo cosi' tanto tempo sono riuscito ad utilizzare AX25  e KISS , specifici per radio, per instradare pacchetti dati con TCP/IP utilizzando dei moduli Lora gia' visti un questo precedente post 



Nel dettaglio ho messo in comunicazione via una Raspberry 3 A+ Raspbian ed un portatile Lenovo T430 Debian  

I moduli LoRa sono visti come semplici seriali virtuali via USB. Non ho modificato i parametri LoRa lasciando quelli di default...cio' vuol dire che le radio non sono impostate alla massima velocita' di trasmissione

Per prima cosa si installano i pacchetti

#apt-get install libax25 ax25-apps ax25-tools ax25-node


si configura quindi il file /etc/ax25/axports

ABCDEF e' il callsign dei radioamatori, in pratica un UID. Sui due dispositivi deve essere differente..inventando una serie di 6 caratteri unici
====================================
# /etc/ax25/axports
#
# The format of this file is:
#
# name callsign speed paclen window description
#

#1      OH2BNS-1        1200    255     2       144.675 MHz (1200  bps)
#2      OH2BNS-9        38400   255     7       TNOS/Linux  (38400 bps)
ax0 ABCDEF 9600 254 1 LoRa
====================================

per inizializzare le antenne si usano i comandi

/usr/sbin/kissattach -m 254 /dev/ttyUSB3 ax0 10.0.0.1
/usr/sbin/ax25d
/usr/sbin/mheardd

dove /dev/ttyUSBx e' la porta dove viene vista la radio. L'IP dovra' essere modificato sui vari dispositivi

a questo punto si puo' iniziare a pingare il dispositivo remoto

Come si vede i tempi di ping sono molto lenti ..tanto da dover usare lo switch -i del comando ping per avere il tempo di ricevere la risposta


Ho provato ad avere una amministrazione remota tramite SSH ma non sono riuscito a farla partire mentre con telnet, fatto salva la lentezza, le cose funziona. (Aggiornamento: impostando la velocita' a 19200 SSH funziona ed e' vagamente usabile)

Sono riuscito a creare uno stream dati tramite netcat via TCP che UDP ed a visualizzare il server web dei due dispositivi

Si puo' usare anche FTP ma il collegamento e' molto piu' lento ed inaffidabile rispetto ad usare un trasferimento seriale via YModem

martedì 9 giugno 2020

Raspbian Headless



Per configurare una Raspbian per modalita' senza schermo e tastiera (headless) la prima cosa e' creare il file wpa_supplicant.conf nella partizione di boot della SdCard 

----------------------------------------
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=IT

network={
 ssid="nome_hotspot_wifi"
 psk="password_hotspot_wifi"
}
----------------------------------------

Non sono riuscito a configurare un Ip Statico in modalita' headless. Ho dovuto modificare il file /etc/dhcpcd.conf al primo boot dove ho ripreso l'ip dinamico dalle tabelle del router

# Example static IP configuration:
interface wlan0
static ip_address=192.168.1.240/24
#static ip6_address=fd51:42f8:caae:d92e::ff/64
static routers=192.168.1.254
static domain_name_servers=192.168.0.1 8.8.8.8 fd51:42f8:caae:d92e::1


per abilitare il server SSH e' sufficiente creare un file vuoto denominato ssh nella partizione di boot

lo username di default e' pi e la password raspberry 

non e' possibile disabilitare, nel caso si vogliano ridurre i consumi, l'output video  dal file config.txt. La cosa piu' semplice e' loggarsi in SSH e lanciare
/usr/bin/tvservice -o
ed inserire il comando in rc.local

altre configurazioni possono a questo punto essere effettuate con il comando raspi-config (per esempio per espandere il filesystem alla dimensione della SdCard)

domenica 31 maggio 2020

Pi Hole filtraggio contenuti per adulti su Dell FX 170

Visto che il bambino ha avuto come regalo per la promozione in V elementare il suo telefono personale, volevo una soluzione per filtrare i contenuti di Internet basato su una soluzione centralizzata

Ho voluto provare PiHole , un progetto nato per filtrare le pubblicita' ma che puo' essere modificato anche per filtrare i siti per adulti



Il progetto viene associato a Raspberry ma funziona anche su altre distribuzioni Linux e su hardware x86. Una Raspberry completa costa un centinaio di euro... ho convertito quindi un vecchio Thin Client Dell FX 170 (fanless) del costo di una trentina di euro installando una Debian stable ultra base




Per configurare PiHole a filtrare i siti per adulti e' necessario aggiungere una lista come quella fornita a questo link https://github.com/chadmayfield/my-pihole-blocklists direttamente nell'interfaccia web di amministrazione di PiHole sotto Groups


Il passo finale e' quello di configurare il DNS del DHCP del router per puntare all'indirizzo di PiHole


Attenzione : PiHole imposta una propria password di amministrazione, meglio appuntaserla in fase di installazione


Passaggio ISS e Crew Dragon su Firenze


Ieri sera, grazie ad un momento propizio privo di nuvole, e' stato possibile osservare il passaggio della ISS inseguita dal Crew Dragon decollato una ventina di minuti prima di Cape Canaveral

Il puntino e' la ISS




La cosa che mi aspettavo e' che i due oggetti spaziali fossero gia' sostanzialmente sulla stessa orbita, visto che nel giro di 16 ore la Crew Dragon doveva attraccare alla ISS ma la ISS era molto piu' alta nel cielo rispetto alla Dragon che seguiva a distanza di circa 7 minuti

Passaggio ISS

Passaggio Crew Dragon

venerdì 29 maggio 2020

Social Distancing 2

Il precedente tentativo di creare un dispositivo portatile di social distancing aveva avuto successo ma la ridotta capacita' dellla batteria rendeva il braccialetto sostanzialmente inutile. Per migliorare l'autonomia ho voluto provare una scheda TTGO T18 che permette di montare (e ricaricare) una batteria 18650






Per programmare questa scheda con Arduino Ide si deve selezionare la board ESP32 Wrover 
Uno dei limiti di questa scheda e' ha solo un led di stato di colore blu sul GPIO5. Per rendere piu' interattivo l'avviso all'utente ho provato a montare un motore coreless con peso asimmettrico su GPIO13. Non e' possibile pilotare un motore direttamente da un GPIO si impiegare  un ponte ad H (esistono dei breakout gia' costruiti, basta collegare VCC a 5V, GND ed un GPIO)




La vibrazione non e' molto forte

 
Skecth di sola scansione di prossimita'
-----------------------------------------------------------------------------------
/*
   Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleScan.cpp
   Ported to Arduino ESP32 by Evandro Copercini
*/

#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>

int scanTime = 5; //In seconds
BLEScan* pBLEScan;

class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
    void onResult(BLEAdvertisedDevice advertisedDevice) {
      Serial.printf("Advertised Device: %s \n", advertisedDevice.toString().c_str());
            
      String address = advertisedDevice.getAddress().toString().c_str();

      String name;
      if (advertisedDevice.haveName ())
            {
                name = advertisedDevice.getName().c_str();
                //Serial.printf("%s\n",name);
            }

      int rssi = advertisedDevice.getRSSI();
      if (name.equals("SocialDistance"))
        {
         Serial.println(address);
         Serial.println(rssi);
         Serial.println("=="); 
            if (rssi > -55)
            {
              Serial.println("Vicino");
              digitalWrite(5, HIGH);
              digitalWrite(13, HIGH);

            }
            else
            {
              Serial.println("Lontano");
              digitalWrite(5, LOW);
              digitalWrite(13, HIGH);

            }
        }

    }
};

void setup() {
  Serial.begin(115200);
  Serial.println("Scanning...");
  pinMode(5, OUTPUT);
  pinMode(13, OUTPUT);
  // led
  digitalWrite(5, LOW);
  // motore 
  digitalWrite(13, LOW);
  


  BLEDevice::init("");
  pBLEScan = BLEDevice::getScan(); //create new scan
  pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
  pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
  pBLEScan->setInterval(100);
  pBLEScan->setWindow(99);  // less or equal setInterval value
}

void loop() {
  // put your main code here, to run repeatedly:
  BLEScanResults foundDevices = pBLEScan->start(scanTime, false);
  Serial.print("Devices found: ");
  Serial.println(foundDevices.getCount());
  Serial.println("Scan done!");
  pBLEScan->clearResults();   // delete results fromBLEScan buffer to release memory
  delay(2000);
}

 



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