mercoledì 10 giugno 2020

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);
}

 



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