Visualizzazione post con etichetta Nexus 5. Mostra tutti i post
Visualizzazione post con etichetta Nexus 5. Mostra tutti i post

sabato 4 aprile 2020

Deriva termica su accelerometri MEMS

Stavo registrando dati con il telefono usando questa mia applicazione quando mi sono accorto che i dati non erano piu' stabili ma avevano una deriva. Rispetto alle prove precedenti stavo registrando usando come alimentazione del cellulare un pannello solare


Questi sono i grafici di pitch e roll in funzione del tempo. Come si vede i dati sono sincronizzati e seguono il ciclo diurno o meglio quello della temperatura (la prova e' durata tre giorni e nel giorno centrale era nuvoloso ed il minimo e' appena accennato)




Si tratta quindi di una deriva termica. Non avendo sul Nexus 5 un termometro (ho provato a loggare di dati del termometro della batteria ma sono dati completamente inutili con temperatura di 29 gradi C con una temperatura ambiente sempre inferiore ai 20 C)

C'e' un sistema semplice per ripulire la deriva termica e vedere se il telefono sta ruotando un pitch/roll o se e' solo l'effetto della temperatura

Tenendo il telefono fermo e plottando pitch vs roll si vede che le due misure sono fortemente correlate


il valore di R2 di correlazione e' di circa 0.8 (quindi abbastanza scarso) con una equazione

roll = 0.36pitch + 1.53

a questo punto si puo' calcolare, tramite questa formula, la distanza di ogni punto dalla retta di regressione. La distanza massima dei punti in condizioni statiche e' pari a 0.081 
Se la distanza di un punto, indipendentemente dalla temperatura, e' superiore al valore sopra riportato e' molto probabile che sia uno spostamento significativo e non una deriva termica

Per completezza questo e' il grafico in cui in ascisse ci sono i minuti da inizio ricarica solare ed in ordinata la percentuale di carica del telefono


lunedì 23 marzo 2020

Errore Pitch, Roll, Azimuth su Android Nexus 5

Volevo fare un po' di test sull'accuratezza dei dati degli accelerometri di un telefono (nello specifico un Nexus 5) e per fare cio' mi sono scritto questa applicazione in Kotlin che cerca di disabilitare il Doze Mode per fare lavorare in continuo la app

Di seguito i risultati



Ogni punto sul grafico e' dato dalla media di 20000 misure ed e' rappresentativo di circa 7.5 minuti

Misura 1
nr punti : 144
durata minuti : 1080
Std.dev pitch : 0.33 gradi decimali
Std.dev roll : 0.36 gradi decimali
St.dev azimuth : 0.65 gradi decimali


Misura 2
nr punti : 39
durata minuti : 273
Std.dev pitch : 0.1 gradi decimali
Std.dev roll : 0.09 gradi decimali
St.dev azimuth : 0.067 gradi decimali

Misura 3
nr punti : 122
durata minuti : 812
Std.dev pitch : 0.19 gradi decimali
Std.dev roll : 0.17 gradi decimali
St.dev azimuth : 0.1 gradi decimali

Misura 4
nr punti : 84
durata minuti : 574
Std.dev pitch : 0.4 gradi decimali
Std.dev roll : 0.14 gradi decimali
St.dev azimuth : 0.21 gradi decimali


In generale la standard deviation rimane sotto (anche abbondantemente) a 0.5 gradi decimali.. non male

L'unico aspetto che mi ha lasciato un po' perplesso e' il fatto che durante la prova 4 le misure evidenziano un chiaro trend crescente





giovedì 12 marzo 2020

Accensione automatica da ricarica di telefoni Android

Per un nuovo progetto avevo bisogno di una funzione che trovo molto comoda su IPhone, ovvero l'avvio automatico da spento quando viene inserito il cavo USB collegato alla corrente, e che non avevo trovato su Android

Lo scopo poi e' quello di avviare in automatico una applicazione una volta terminato il boot


Frugando ho trovato che questa opzione e' facilmente disponibile nei Nexus con semplici comandi da fastboot

./adb reboot bootloader
./fastboot oem off-mode-charge 0
./fastboot reboot

A questo punto per rimuovere il lock screen di Android si va in Impostazioni/Sicurezza/Blocco schermo/nessuno

A questo punto sarebbe interessante avviare in automatico un app (od un servizio)
Per fare una prova ho usato Nexus 5 con Android 6 perche' le versioni piu' recenti
di Android rendono piu' difficile lanciare una app al boot in automatico

Si vede modificare il Manifest (righe evidenziate in giallo)

AndroidManifest.xml
============================================
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.luca.innocenti.autoboot">    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

    <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:roundIcon="@mipmap/ic_launcher_round"        android:supportsRtl="true"        android:theme="@style/AppTheme">        <activity android:name=".MainActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>

        <receiver
            android:name=".BootReceiver"
            android:enabled="true"
            android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.QUICKBOOT_POWERON" />
        </intent-filter>
    </receiver>

    </application>
</manifest>
============================================

Nella MainActivity si crea una nuova classe che riceve la notifica dell'avvenuto boot
(per vedere se il codice funziona si osservi logcat, non ci sono messaggi per l'utente)


MainActivity.kt
============================================
package com.luca.innocenti.autoboot
import android.content.BroadcastReceiverimport android.content.Contextimport android.content.Intentimport android.content.Intent.ACTION_BOOT_COMPLETED
import androidx.appcompat.app.AppCompatActivityimport android.os.Bundleimport android.util.Log
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

class BootReceiver : BroadcastReceiver() {

    override fun onReceive(c: Context, intent: Intent?) {
        val action = intent?.action        Log.d("ASD123123", "RECEIVED BOOT")
        val b = intent?.toUri(Intent.URI_INTENT_SCHEME)
        when (action) {
            ACTION_BOOT_COMPLETED -> startWork(c)
        }
    }


    private fun startWork(context: Context) {
        Log.d("Test", "Test")
    }
}

martedì 18 luglio 2017

Sostituzione display Nexus 5

In questo post viene indicato come sostituire uno schermo non funzionante di un Nexus 5 (la parte di ricambio e' stata comprata su Aliexpress....la qualita' del ricambio non e' per niente buona ma funziona ed soprattutto ha un prezzo che giustifica l'acquisto..il ricambio originale non e' conveniente)

Questo progettino non e' per utenti pavidi: bisogna armarsi di micro cacciavite ma soprattutto di phon per rimuovere le parti incollate

Per prima cosa si deve rimuovere lo scocca posteriore: Attenzione: al contrario di molti altri telefoni dove questo componente e' solo un pezzo di plastica, nel Nexus 5 sono ospitati dei componenti nella back cover. Rimuovere con delicatezza magari usanto un plettro di plastica


Con un piccolo cacciavite si rimuovono le parti nere sopra e sotto la batteria. Quello superiore e' solo uno schermo in plastica mentre quello inferiore ospita elettronica e deve essere prestata maggiore attenzione

A questo punto si devono rimuovere nell'ordine il cavo flat T (che libera la batteria) ed il connettore della batteria. Per i connettori basta esercitare una leggera pressione verso l'alto metre la batteria e' saldamente incollata


Si solleva quindi il connettore della flat P



Qui arriva la parte piu' delicata perche' si deve rimuovere la piastrina dove e' inserita la microUSB che risulta essere incollata. Al di sotto di questa si trovera' la flat del display




A questo punto si deve rimuovere lo schermo dalla parte anteriore...ulteriore colla. Nella foto sottostante il display e' stato separato dallo chassis e si vede la flat. Questa deve essere fatta scivolare nell'incavo dello chassis per liberare lo schermo


Si monta il nuovo schermo e si ripetono le operazioni al contrario

venerdì 2 dicembre 2016

Sostituzione batteria Nexus 5

Sostituzione della batteria di un Nexus 5.
Per prima cosa e' necessario rimuovere la cover posteriore. Attenzione: non si tratta solo di un solo un pezzo di plastica ma c'e' elettronica sul retro. E' quindi necessario rimuoverla con calma

Si svitano quindi 6 viti per rimuovere la copertura della parte superiore


Si sgancia quindi il cavo flat colore oro che attraversa la batteria sul lato sinistro (basta alzare con delicatezza il connettore in alto indica dalla lettera T). Si piega quindi a 90°§ per liberare la batteria


Si sgancia, sempre con una leggera pressione verso l'alto il connettore della batteria. La batteria e' incollata allo chassis per cui bisogna fare un po' di leva per sollevarla


Si ripete il tutto all'incontrario per rimontare il tutto. Difficolta' da 1 a 3 direi 1 (bastano 10 minuti ed un po' di manualita')



venerdì 1 luglio 2016

Android 6.0.1 su Nexus 5

Visto il calo dei prezzi mi sono preso un Nexus 5 32 Giga per sviluppo su Android 6




Il telefono era nuovo e quindi all'accensione e' iniziata la fila degli aggiornamenti che, partendo dalla versione 4.4, mi avrebbero preso un bel po' di tempo via OTA.
Durante un aggiornamento incrementale di Android 4.4.3 il telefono si e' riacceso con il robottino con la pancia aperta e la scritta Errore in rosso. 2 minuti di panico e poi il sistema si e' riavviato da solo

Non volendo ripetere l'esperienza e per risparmiare tempo ho provato a fare direttamente il salto a 6.0.1 evitando le OTA.

Dopo aver scaricato il file https://dl.google.com/dl/android/aosp/hammerhead-mob30m-factory-8fc48e44.tgz  (579 Mb) ed averlo scompattato ho seguito questi passi

adb reboot bootloader
fastboot oem unlock
./flash-all

bisogna armarsi di pazienza prima di riottenere il dispositivo funzionate (circa 20 minuti).




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