Visualizzazione post con etichetta Raspberry. Mostra tutti i post
Visualizzazione post con etichetta Raspberry. Mostra tutti i post

mercoledì 18 dicembre 2024

JRP7008

Schermo a risoluzione 1024x600 con connessione HDMI.

Lo ho comprato a 35 euro


per utilizzarlo con Raspberry si modifica il file confix.txt nella SdCard

max_usb_current=1
hdmi_force_hotplug=1
config_hdmi_boost=10
hdmi_group=2
hdmi_mode=87
hdmi_cvt 1024 600 60 6 0 0 0

 

Lo schermo si puo' usarea come display secondario su Debian senza nessuna ulteriore configurazione


 

 

Arducam IMX519 16 Mpx

Ho provato la Arducam 16 Mpx basata sul sensore Sony IMX519

 


 Per prima cosa c'e' da evindenziare che il supporto non e' nativo su Raspberry a differenza delle PiCam. Le istruzioni per montare il driver si trovano a questo link 

 https://docs.arducam.com/Raspberry-Pi-Camera/Native-camera/16MP-IMX519/


La camera si utilizza con libcamera e permette di salvare in DNG  e raw

giovedì 5 dicembre 2024

Pi Cam HQ e telescopio

Ho provato ad accoppiare la Pi Cam HQ module 12 MPx (vecchiotta ma e' sempre un sensore Sony) con un spotting scope della Celestron MK70 MiniMak (fortunatamente comprato di seconda mano). E' stato impiegato un adattatore da CS (lato PiCam) ad oculare 1.25 inch (standard telescopi) stampato 3D la filettatura non era perfetta ma il fatto di essere fatto di plastica permette un buon accoppiamento forzando un po' 





ho usato una flat lunga 







La zona inquadrata era l'insegna del negozio di elettronica ...la zona e' indicata dalla freccia blu


questo e' il risultato tramite il telescopio


direi un ottimo risultato 




giovedì 28 novembre 2024

Turn On raspberry via GPIO

 Per accenderere una Raspberry e' sufficiente mettere allo stato zero il pin GPIO3..quindi basta collegare con un cavo (non in maniera permanente) il pin GPIO ed un pin GND


 


 

 

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



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)

martedì 5 novembre 2019

Buildroot e Raspberry Pi

Con BuildRoot e' possibile compilare un firmware completo per un dispositivo embedded...per fare le cose semplici ho provato con Raspberry Pi

Si clona il repository di Buildroot e si lancia

make raspberrypi_defconfig
che preimposta i valori di default per il target Raspberry. Si possono aggiungere sia pacchetti che librerie per personalizzare la configurazione base cosi' come la password di root (System Configuration/Enable root login with password)

Si lancia make e si aspetta un paio di ore...alla fine nella directory output/images si trovera' file sdcard.img 

si puo' quindi copiare il file su una Sd Card con dd ed usare una Raspberry reale oppure si puo' emulare tramite QEmu
Per fare cio' si deve scaricare il kernel per QEmu da

git clone https://github.com/dhruvvyas90/qemu-rpi-kernel.git

e si lancia

qemu-system-arm -kernel ./qemu-rpi-kernel/kernel-qemu-3.10.25-wheezy -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" -hda sdcard.img


ci si trova quindi in una shell Busybox

mercoledì 27 febbraio 2019

Raspberry e Windows 10

E' di qualche giorno fa la notizia di poter installare Windows 10 (versione ARM) su Raspberry...in realta' gia' qualche anno fa Microsoft aveva rilasciato una versione di Windows per Raspeberry ma si trattava di una versione priva di desktop ed indirizzata all'IoT



Il progetto si trova a questo indirizzo http://jhanc.altervista.org/jargon/Intro.html ma diciamo che le cose sono partite subito un po' male ...l'installer non voleva saperne di funzionare


Dopo un po' di lettura del forum degli sviluppatori in cui venivano descritti errori e rimedi l'installazione e' andata a buon fine




ma il problema principale e' che la Raspberry con il solo desktop di Windows 10 e' sempre in picco con il processore sopra al 90% se non al 100%. Il sistema quindi non risponde ai comandi (se non molto lentamente). Non oso pensare quando l'utente inizia a fare girare un applicativo


In conclusione un progetto interessante ma piu' una curiosita' che non uno strumento da utilizzare 

martedì 25 settembre 2018

Captive Portal su Raspberry Pi Zero W

Un esempio di Captive Portal (ovvero un Access Point WiFi che obbliga gli utenti a visualizzare determinate pagine, sia per loggarsi per l'accesso ad internet sia per altri accedere ad un web server interno)

La Raspberry Pi Zero W, non avendo due schede di rete di default come la 3b+, non puo' essere usata per fornire accesso ad internet come router


Per prima cosa si deve installare sulla SD una Raspbian Lite . Dato l'uso in HeadLess mode e' necessario configurare la scheda via SSH, non abilitata di default tramite la porta USB OTG, non abilitata di default

Una volta formattata la scheda SD si monta la partizione boot e
1) si inserisce un file vuoto denominato ssh (senza estensione)
2) si modifica il file config.txt aggiungendo una ultima riga con scritto dtoverlay=dwc2
3) si modifica il file cmdline.txt aggiungendo modules-load=dwc2,g_ether subito dopo rootwait

Fatto cio' si inserisce la SD nella Raspberry e si collega un cavo microUSB nella porta posta piu' centralmente collegando l'altro cavo al PC (l'alimentazione e' data dallo stesso cavo e non e' necessario di collegare la seconda USB)

A questo punto da PC (Linux o Mac) si puo' entrare in shell mediante SSH con il comando

ssh pi@raspberrypi.local

password : raspberry

si passa quindi a configurare la connessione WiFi per l'aggiornamento dei pacchetti con

sudo raspi-config 

opzione Netowork Options/Wifi dove si inseriscono i dati dell'Acces Point
si aggiorna il sistema e si installano i pacchetti

apt-get install hostapd dnsmasq apache2 php7.0

(questa configurazione e' stata ripresa da qui togliendo la parte malevola)

rc.local
-----------------------------------------------------------

service apache2 start

sleep 1
hostapd -B /etc/hostapd/hostapd.conf
sleep 2
ifconfig br0 up
ifconfig br0 10.1.1.1 netmask 255.255.255.0
sysctl net.ipv4.ip_forward=1
iptables --flush
iptables -t nat --flush
iptables -t nat -A PREROUTING -i br0 -p udp -m udp --dport 53 -j DNAT --to-destination 10.1.1.1:53
iptables -t nat -A PREROUTING -i br0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.1.1.1:80
iptables -t nat -A PREROUTING -i br0 -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.1.1.1:80
iptables -t nat -A POSTROUTING -j MASQUERADE
service dnsmasq start
exit 0


-----------------------------------------------------------

hostapd.conf
-----------------------------------------------------------
interface=wlan0
channel=6
hw_mode=g
ssid=Wi-Fi
bridge=br0
auth_algs=1
wmm_enabled=0
------------------------------------------------------------

dnsmasq.conf

------------------------------------------------------------
interface=br0
listen-address=10.1.1.1
no-hosts
dhcp-range=10.1.1.2,10.1.1.254,72h
dhcp-option=option:router,10.1.1.1
dhcp-authoritative

address=/apple.com/10.1.1.1
address=/appleiphonecell.com/10.1.1.1
address=/airport.us/10.1.1.1
address=/akamaiedge.net/10.1.1.1
address=/akamaitechnologies.com/10.1.1.1
address=/microsoft.com/10.1.1.1
address=/msftncsi.com/10.1.1.1
address=/msftconnecttest.com/10.1.1.1
address=/google.com/10.1.1.1
address=/gstatic.com/10.1.1.1
address=/googleapis.com/10.1.1.1
address=/android.com/10.1.1.1


override.conf
------------------------------------------------------------
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order Allow,Deny
 Allow from all
</Directory>
------------------------------------------------------------






giovedì 19 maggio 2016

LCD 3.2 " Waveshare su Raspberry

Ho provato uno schermo LCD da 3.2 pollici per Raspberry da montare direttamente sul connettore a 40 pin.



Se si prova ad usare una Raspbian pura il risultato e' il seguente.. nessuna immagine tranne lo schermo bianco



Il problema e' che lo schermo comunica con la Raspberry tramite SPI e su Raspbian di default non e' montato il modulo per gestire lo schermo. Su Waveshare sono presenti tutte le istruzioni passo passo per compilare il modulo e montarlo ma la soluzione piu' diretta e' scaricarsi una distribuzione Raspbian gia' modificata



Lo schermo ha una risoluzione di 320x240 ed una volta avviato X si vede che le finestre sono tutte piu' grandi di questa dimensioni. La  soluzione per spostare l'area di visualizzazione e' quella di cliccare sinistro tenendo premuto il tasto Alt. In questo modo si puo' trascinare la finestra


Riducendo poi il font di default di X e di XTerm si riesce "quasi" a lavorarci

Con la Raspbian gia' modificata e' gia' montato anche il modulo per il touchscreen per cui e' possibile utilizzare il Raspberry con il pennino (in dotazione) od anche con le dita.In alto e' disponibile una tastiera virtuale ma e' veramente difficile usarla

Sulla sinistra dello schermo sono presenti tre pulsanti che sono connessi ai pin GPIO 12,16 e 18

Per completezza il dispositivo dello schermo si trova su /dev/fb1

mercoledì 13 aprile 2016

Orange Pi Pc

Mi sono interessato a questo microcomputer basato su armhf H3 con 1Gb di Ram, piu' che altro per il costo di 22 euro compreso il case (una Raspberry costa piu' del doppio)


Si tratta di un dispositivo sostanzialmente molto simile a Raspberry Model B con tre porte USB + 1 MicroUsb OTG, microfono, infrarossi (una Raspberry agli steroidi)

La differenza principale risiede nel modo in cui creare la microSD con il sistema operativo (ho ovviamente scelto l'immagine di Debian 8 con XFCE (link per immagini di numerosi OS)

Dopo aver creato la SD c'e' un ulteriore passo da eseguire. Sul disco esiste una partizione in formato FAT denominata BOOT nella quale devono essere inseriti i file  uImage_OPI-2 e si deve rinominare il file script.bin.OPI-PC_1080p60_hdmi in script.bin

Le impressioni di uso sono generalmente buone anche perche' si tratta di una Debian vera anche se ho riscontrato qualche problema nella compilazione con Eclipse. Sicuramente la scheda scalda come una stufetta anche dopo pochi minuti di accesione e l'accesso al disco (SDCard) e' molto lento (ma in questo caso potrebbe essere anche colpa del tipo di sdcard che ho usato per la prova, una SanDisk Ultra HC I)




mercoledì 6 aprile 2016

La mia famiglia Raspberry




Raspberry Pi 2 Model B : in alto a sinistra
Raspberry Pi Model B rev B : in alto a destra
Raspberry Pi Model B rev A : in basso a sinistra
Raspberry Pi Zero : in basso a destra

venerdì 1 aprile 2016

Raspberry Pi solare

Una cosa che ho sempre desiderato e' quella di avere un calcolatore portatile alimentato ad energia solare.



La cosa che piu' ci si e' avvicinata nel tempo e' stata l'OLPC-X0-1, un computer portatile destinati ai bambini dei paesi in via di sviluppo, che era dotato di un meccanismo a manovella per generare corrente (tipo i telefoni di campagna della prima guerra mondiale)

Visto che i tempi sono cambiati ho voluto provare ad usare una Raspberry 2 collegato ad un PowerBank da 10000 mA e un pannello solare da 7W (per rendere la cosa completa la Raspberry doveva essere fornita di un monitor da 5 pollici ed una tastiera/trackpad della Logitech ma al momento non e' ancora arrivato il corriere con lo schermo)

Il problema si e' pero' evidenziato subito. Il pannello solare, in piena insolazione ed orientato direttamente verso il Sole, riesce a generare a malapena 450 mA. Considerando che il solo Raspberry 2 consuma  circa 330 mA e' presto detto che in condizioni non ottimali di illuminazione solare sara' utilizzata la sola carica della batteria senza possibilita' di ricarica da parte del pannello

Qualche speranza in piu' usando una Pi Zero (220 mA) ma in generale direi che dovro' ancora rimandare il mio progetto di calcolatore portatile solare

lunedì 22 febbraio 2016

Disabilitare video su Raspberry

Spesso uso la Raspberry in modalita' headless.
Adesso visto che lavoro ad un progetto in cui e' necessario risparmiare energia ho voluto provare a vedere se e' possibile disabilitare l'output da HDMI e da Video-Out (il connettore giallo) e se cio' diminuisce i consumi



Senza modifiche il consumo di Raspberry e' di circa 330 mA.
Mediante il comando

/opt/vc/bin/tvservice --off 

e' possibile disabilitare completamente l'output video. In questa modalita' il consumo passa a circa 300 mA con un  risparmio di circa il 10%. Non tantissimo ma puo' valere la pena di usare questa funzionalita' in caso di alimentazione a batteria

Consolle seriale su Raspberry

La possibilita' di amministrare una Raspberry via porta seriale e' particolarmente utile nel caso di una Pi Zero, vista l'assenza di una scheda di rete preinstallata.

La Raspberry dispone di una porta seriale TTL (in /dev/ttyAMA0) sui pin GPIO 8 (TX) ed 10 (RX) a cui si puo' connettere un modulo FTDI (attenzione, deve essere a 3.3 V pena il rischio di bruciare la porta). Attenzione: deve essere connesso anche il GND, l'alimentazione non e' obbligatoria ed e' necessaria solo se la Raspberry non ha nessuna altra alimentazione



Normalmente su questa porta seriale (115200, 8N1) vengono dirottati i messaggi di boot del kernel ma in Raspbian, tramite raspi-config (Avanzato,opzione A8) e' possibile ottenere una shell collegandosi via seriale



Schermata di raspi-config
Dal PC, per connettersi alla Raspberry si utilizza il comando screen

screen /dev/ttyUSB0 115200


Ovviamente se e' impostata questa funzione la porta seriale non sara' disponibile per altri usi, come per esempio interfacciarsi con una Arduino. In questo caso dovranno essere disabilitati, oltre alla shell mediante raspi-config, anche i messaggi di boot modificando il file in /boot/cmdline.txt






giovedì 18 febbraio 2016

RTKLib su Raspberry

Allo scopo di usare una attrezzatura piu' leggera e di maggiore durata di batteria ho provato ad accoppiare l'UBlox M8T ad una Raspberry B alimentando il tutto con un power bank da 10000 mAh


Per fare cio' era necessario compilare le RTKLib sulla Raspbian. La compilazione e' avvenuta senza nessuna modifica rispetto a quella che si esegue su desktop e rtkrcv funziona correttamente anche su Raspberry (ovviamente ci vuole molta pazienza per compilare i sorgenti data la velocita' del processore)

Per scaricare i dati e' stato sufficiente abilitare l'SFTP e connettersi con un cavo cross da portatile

venerdì 4 dicembre 2015

Pi Zero: ne vale la pena??

Grazie ad un amico che la ha acquistata il giorno di uscita, sono riuscito a mettere le mani su una Raspberry Pi Zero. Ma, a parte il prezzo di 5 dollari (la spedizione costa circa 6 volte di piu' che non l'oggetto) vale veramente la pena usare una Pi Zero al posto di una Raspberry B+ per esempio??


Il consumo del dispositivo e' decisamente inferiore ad un Raspberry B (110 mA contro circa il doppio della B...si e' bruciato il punto decimale del misuratore di corrente..si deve leggere 0.11 A)

Sul prezzo c'e' poco da dire, non esistono confronto se non con il futuro Chip (adesso in preordine).
Il problema che per usare una Pi Zero ci si deve munire di almeno un cavo microUsb-USB possibilmente OTG, un HUB Usb per attaccarci tastiera e mouse e un eventuale dongle Ethernet o Wifi (quindi forse e' meglio prendere un HUB alimentato), un non comunissimo cavo HDMI con un connettore standard ed uno in formato miniHDMI

In conclusione un sacco di cavi e cavetti sul tavolo che rendono inutili le dimensioni estremamente ridotte della Pi Zero (avessero messo almeno un Bluetooth ....). Puo' essere interessante come schedina da saldare in un progetto IOT (Internet of Things)... anche se per queste cose preferisco i microcontrollori al posto dei microprocessori ... ma come computer e' molto meglio la PI B+ (anche se molto piu' costosa)

Io nel frattempo ho fatto un preordine per CHIP..........




giovedì 10 settembre 2015

DIY HomeKit con Android Wear e Raspberry

Questo e' un tentativo di realizzare un homekit, un sistema di domotica, che permetta di accendere dei dispositivi con un sensore di prossimita' (tipo il lampadario quando si entra in una stanza)

I componenti di questo kit sono
1) un orologio con Android Wear
2) un Raspberry (qualsiasi modello) con un dongle Bluetooth LE
3) un rele



L'orologio e' stato programmato come emettitore di beacon (e' possibile modificare il valore del minor in modo da personalizzarlo)


Di seguito il codice Android

--------------------------------------
apply plugin: 'com.android.application'

android {
    compileSdkVersion 21    buildToolsVersion "21.1.2"
    defaultConfig {
        applicationId "luca_innocenti.beacontrasmitter"        minSdkVersion 21        targetSdkVersion 21        versionCode 1        versionName "1.0"    }
    buildTypes {
        release {
            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }
    }
}

final def var = repositories {
    jcenter{
        url "http://jcenter.bintray.com/"    }
}
var

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.google.android.support:wearable:1.2.0'    compile 'com.google.android.gms:play-services-wearable:7.5.0'}
dependencies {
    compile 'org.altbeacon:android-beacon-library:2+'
} 

--------------------------------------

--------------------------------------
package luca_innocenti.beacontrasmitter;

import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.wearable.view.WatchViewStub;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.TextView;
import android.bluetooth.BluetoothManager;
import android.content.Context;
import android.content.pm.PackageManager;

import org.altbeacon.beacon.Beacon;
import org.altbeacon.beacon.BeaconParser;
import org.altbeacon.beacon.BeaconTransmitter;
import org.altbeacon.beacon.Identifier;

import java.util.Arrays;


@TargetApi(21)
public class MainActivity extends Activity {

    private BeaconTransmitter mBeaconTransmitter;
    private TextView testo;
    private SeekBar barra;
    private Button pulsante;
    private int stato;
    private TextView testo2;
    private TextView testo3;


    private void trasmetti(){
        if (checkPrerequisites()) {
            //            //mBeaconTransmitter = new BeaconTransmitter(this, new BeaconParser().setBeaconLayout("m:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25"));            mBeaconTransmitter = new BeaconTransmitter(this, new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
            //beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:0-3=4c000215,i:4-19,i:20-21,i:22-23,p:24-24"));  // iBeacons
            //beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));      // Estimotes
            //beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:0-3=a7ae2eb7,i:4-19,i:20-21,i:22-23,p:24-24"));  // easiBeacons
            // uuid estimote B9407F30-F5F8-466E-AFF9-25556B57FE6D
            Beacon beacon = new Beacon.Builder()
                    .setId1("B9407F30-F5F8-466E-AFF9-25556B57FE6D")
                    .setId2("999")
                    .setId3(testo.getText().toString())
                    .setManufacturer(0x015D) // Simula Estimote                    .setTxPower(-59)
                    .setDataFields(Arrays.asList(new Long[]{0l}))
                    .build();

            mBeaconTransmitter.startAdvertising(beacon);
            stato = 1;
        }

    }

    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);



        final WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub);
        stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
            @Override            public void onLayoutInflated(WatchViewStub stub) {
                barra = (SeekBar) stub.findViewById(R.id.seekBar);
                testo = (TextView) stub.findViewById(R.id.textView);
                testo2 = (TextView) stub.findViewById(R.id.textView2);
                testo3 = (TextView) stub.findViewById(R.id.textView3);
                pulsante = (Button) stub.findViewById(R.id.button);


                barra.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                                                     @Override                                                     public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                                                         testo.setText(String.valueOf(new Integer(progress)));
                                                     }

                                                     @Override                                                     public void onStartTrackingTouch(SeekBar seekBar) {

                                                     }

                                                     @Override                                                     public void onStopTrackingTouch(SeekBar seekBar) {

                                                     }
                                                 }
                );

                pulsante.setOnClickListener(new View.OnClickListener() {
                    @Override                    public void onClick(View v) {
                        testo2.setText("Trasmitter ON");
                        testo3.setText("B9407F30-F5F8-466E-AF\nF9-25556B-57FE6D-999-"+testo.getText());
                        pulsante.setEnabled(false);
                        barra.setEnabled(false);
                        trasmetti();
                    }
                });
            }
        });
    }


    @Override    protected void onDestroy() {
        super.onDestroy();
        if (stato == 1) {
            mBeaconTransmitter.stopAdvertising();
        }
    }

    @TargetApi(21)
    private boolean checkPrerequisites() {

        if (android.os.Build.VERSION.SDK_INT < 18) {
            final AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("Bluetooth LE not supported by this device's operating system");
            builder.setMessage("You will not be able to transmit as a Beacon");
            builder.setPositiveButton(android.R.string.ok, null);
            builder.setOnDismissListener(new DialogInterface.OnDismissListener() {

                @Override                public void onDismiss(DialogInterface dialog) {
                    finish();
                }

            });
            builder.show();
            return false;
        }
        if (!getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
            final AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("Bluetooth LE not supported by this device");
            builder.setMessage("You will not be able to transmit as a Beacon");
            builder.setPositiveButton(android.R.string.ok, null);
            builder.setOnDismissListener(new DialogInterface.OnDismissListener() {

                @Override                public void onDismiss(DialogInterface dialog) {
                    finish();
                }

            });
            builder.show();
            return false;
        }
        if (!((BluetoothManager) getApplicationContext().getSystemService(Context.BLUETOOTH_SERVICE)).getAdapter().isEnabled()){
            final AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("Bluetooth not enabled");
            builder.setMessage("Please enable Bluetooth and restart this app.");
            builder.setPositiveButton(android.R.string.ok, null);
            builder.setOnDismissListener(new DialogInterface.OnDismissListener() {

                @Override                public void onDismiss(DialogInterface dialog) {
                    finish();
                }

            });
            builder.show();
            return false;

        }

        try {
            // Check to see if the getBluetoothLeAdvertiser is available.  If not, this will throw an exception indicating we are not running Android L            ((BluetoothManager) this.getApplicationContext().getSystemService(Context.BLUETOOTH_SERVICE)).getAdapter().getBluetoothLeAdvertiser();
        }
        catch (Exception e) {
            final AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("Bluetooth LE advertising unavailable");
            builder.setMessage("Sorry, the operating system on this device does not support Bluetooth LE advertising.  As of July 2014, only the Android L preview OS supports this feature in user-installed apps.");
            builder.setPositiveButton(android.R.string.ok, null);
            builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
                @Override                public void onDismiss(DialogInterface dialog) {
                    finish();
                }

            });
            builder.show();
            return false;

        }

        return true;
    }
}

--------------------------------------
Per leggere la prossimita' dell'orologio ho montato sulla Raspberry un dongle Broadcome (gia' visto qui) ed il programma in Python iBeacon-Scanner (Github) leggermente modificato

Il programma cicla fino quando non vede un dispositivo con minor=1, allora controlla l'Rssi e stima la distanza. Se la distanza e' inferiore ad un determinato valore si puo' agire sulle porte GPIO ed attivare il rele' (funzione da implementare ma di facilissima realizzazione)

--------------------------------------
import blescan
import sys

import bluetooth._bluetooth as bluez

dev_id = 0
try:
    sock = bluez.hci_open_dev(dev_id)
    #print "ble thread started"

except:
    print "error accessing bluetooth device..."
        sys.exit(1)

blescan.hci_le_set_scan_parameters(sock)
blescan.hci_enable_le_scan(sock)

while True:
    returnedList = blescan.parse_events(sock, 10)
    #print "----------"
    for beacon in returnedList:
        #print beacon
        valori = beacon.split(",")
        mac = valori[0]
        uuid = valori[1]
        major = valori[2]
        minor = valori[3]
        rssi = valori[4]
        rssi2 = valori[5]
        #print minor
        if (minor == "1"):
            #print minor+" "+rssi2
            if (int(rssi2) > -75):
                print "vicino"
            else:
                print "lontano"
--------------------------------------

giovedì 27 agosto 2015

Battery Pack con Arduino e Raspberry

Ho fatto qualche prova per vedere quanto puo' funzionare una scheda Raspberry od una scheda Arduino alimentandola semplicemente via USB con una batteria esterna

Da un primo semplice confronto si vede che Raspberry ha una richiesta, per la verita' variabile in funzione anche del carico di lavoro, di circa 350 mA
Raspberry
Al contrario Arduino mostra valori sempre inferiori a 10 mA (spesso il display indicava 0.00)

Arduino
In modo molto empirico

Raspberry: alimentando Raspberry con una batteria da 5000 mAh (partendo da carica completa) il sistema e' rimasto acceso 8 ore

Arduino: alimentando una Arduino Nano con una batteria da 2000 mAh il sistema e' rimasto acceso per circa  32 ore (per essere precisi  la batteria non alimentava solo Arduino ma anche un CH376 ed il voltmetro USB che anche loro un po' consumano)

C'e' da fare una osservazione: non tutte le batterie esterne sono risultate idonee ad alimentare Arduino


Da sinistra a destra tre pacchi batteria rispettivamente SBS da 2000 mAh, una cinesata (dovrebbe ricaricarsi mediante il pannello solare ma di fatto non funziona) dichiarato da 5000 mAh ed un da 10000 mAh. Il secondo ed il terzo hanno un pulsante di accensione mentre quello piu' a sinistra basta connetterlo e funziona.
Ho visto che Arduino funziona bene con il primo ed il terzo mentre con la batteria da 5000 mAh, la scheda si accende da dopo circa un secondo si spenge tutto (sia i led sulla scheda che sulla batteria), mi e' venuto il sospetto che non sentendo un carico significativo sulla porta USB il circuito sulla batteria stacchi l'alimentazione; infatti connettendola ad una Raspberry, la cui richiesta di corrente e' decisamente superiore, la batteria funziona regolarmente

mercoledì 5 agosto 2015

Usbmount

Un amico mi ha chiesto un sistema (per un gioco) di creare un sistema di registrare il passaggio dei concorrenti da alcuni passaggi obbligati....ovviamente il sistema doveva essere al costo minimo possibile ed i dati di passaggio dovevano essere registrati su un dispositivo portato dal concorrente (non e' previsto che ci potesse essere un collegamento Internet nei punti di passaggio ed i punti di passaggio dovevano essere recuperati anche molte ore dopo il termine del gioco)



Scartata l'ipotesi Rfid, per il costo del singolo chip Rfid scrivibile intorno ai 3-4 euro ciascuno e per il costo del programmatore di chip, una possibile soluzione e' quella di usare una Raspberry e delle normali chiavette USB per registrare i dati del passaggio

In pratica il concorrente deve inserire la chiavetta nella Raspberry ed in automatico devono inseriti i dati e la chiavetta deve essere estrarre senza smontare esplicitamente il dispositivo

La soluzione e' stata quella di usare una Raspbian minimale (senza Xwindow) ed il pacchetto Usbmount che crea automaticamente i device /media/usb, /media/usb0/ (apt-get install usbmount)

Per intercettare l'evento di inserimento della chiavetta e poter scrivere i dati sulla stessa si puo' modificare lo script /etc/usbmount/mount.d/00_create_model_symlink aggiungendo al termine del file (prima dell'exit) qualcosa del tipo

echo "luca" > /media/usb0/file.txt

in generale il sistema funziona bene anche se non e' velocissimo perche' impiega circa 5 secondi per la scrittura

ho provato anche un altro sistema ovvero creare una regola /etc/udev/rules.d/100-miaregola.rules con questo contenuto

ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z]1", RUN+="/home/luca/usb.sh" 

nella home ho poi ho messo uno script che doveva scrivere il file sul dispositivo USB. Curiosamente, nonostante l'evento di inserimento della penna USB venisse correttamente intercettato (ho usato logger per scrivere in syslog e verificare) la scrittura del file, nonostante tutti i tentativi di svuotare le cache, avveniva solo alla disconnessione della penna USB e quindi sul disco fisso (cioe' in /media/sdb1 ma solo quando il device era stato smontato)

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