mercoledì 29 gennaio 2014

Mandelbrot su IPhone/IOS

Per disegnare Mandelbrot su un Iphone per prima cosa si deve trovare una superficie su cui disegnare.
Scartata l'ipotesi di OpenGL (troppo complicata), la cosa piu' semplice e' utilizzare la libreria Quartz 2D facendo un subclass di UIView (per il dettaglio seguire questo link)




Questo puo' essere effettuato con i seguenti comandi (partendo da un progetto vuoto con View-Based Application)
File -> Add Files to 
si seleziona Objective-C Class e in basso si seleziona SubClass of UIView
Si seleziona un nome per la nuova classe e si conclude

In seguito dall'Interface Builder (il creatore di interfacce visuali) si seleziona tutta la finestra (UIView), si preme Command+4 e si modifica la classe da UIView con il nome precedentemente selezionato

Fatto cio' si trova che nel file miaclasse.m un scheletro vuoto di una funzione drawRect.Qui si puo' inserire il codice per la generazione dell'insieme di Mandelbrot

------------------------------------------------------------
//
//  Draw2D.m
//  Mand
//
//  Created by Luca Innocenti on 27/01/14.
//  Copyright (c) 2014 Luca Innocenti. All rights reserved.
//

#import "Draw2D.h"

@implementation Draw2D

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}


// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    // Drawing code
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(context, 2.0);
    CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor);

    
    int SCREEN_WIDTH = 480;
    int SCREEN_HEIGHT = 320;
    
    float re_min = -2.0;
    float im_min = -1.2;
    float re_max = 1.0;
    float im_max = 1.2;
    int iterazioni = 60;
    float a,b;
    float x,y,x_new,y_new;
    int test;
    int k,j,i;
    
    float re_factor = (re_max-re_min);
    float im_factor = (im_max-im_min);
    for (i=0;i<SCREEN_HEIGHT;i++)
    {
        for (j=0;j<SCREEN_WIDTH;j++)
        {
            a = re_min+(j*re_factor/SCREEN_WIDTH);
            b = im_min+(i*im_factor/SCREEN_HEIGHT);
            x = 0;
            y = 0;
            test = 0;
            for (k=0;k<iterazioni;k++)
            {
                x_new = (x*x)-(y*y)+a;
                y_new = (2*x*y)+b;
                if (((x_new*x_new)+(y_new*y_new))>4)
                {
                    test = k;
                    if (k%2)
                    {
                        CGContextMoveToPoint(context, i, j);
                        CGContextAddLineToPoint(context, i+1,j);
                        CGContextStrokePath(context);
                    }
                    break;
                }
                x = x_new;
                y = y_new;
            }
        }
    }
}

@end
--------------------------------------------------------------


martedì 28 gennaio 2014

ADS1115 ADC 16Bit su Arduino Uno

Per il progetto di acquisizione dati del Laboratorio Terre del Dipartimento di Scienze della Terra e' necessario utilizzare un convertitore analogico digitale migliore di quello presente su Arduino (10 bit =1024 livelli per Arduino Uno e 12 bit=4096 livelli per Arduino Due)

La soluzione piu' semplice e' stata utilizzare l'ADS1115, un integrato che dialoga su canale I2C con quattro ingressi analogici (in multiplex) con un ADC da 16 bit montato su una BreakOut della AdaFruit


http://learn.adafruit.com/assets/2675
Le connessioni sono semplici

Vdd = 5 V Arduino
GND = GND Arduino
SDA = A4 Arduino
SCL = A5 Arduino

non sono necessarie le resistenze di PullUp sui pin A4,A5
L'integrato ADS1115 contiene al suo interno sia l'oscillatore che la tensione di riferimento per cui non e' necessaria ulteriore elettronica di contorno. E' possibile anche settare il valore del guadagno

Per i vari valori di guadagno si hanno differenti valori di fondo scala e differente sensibilita'

Gain 2/3 : fondo scala 6.144V 1bit = 0.1875 mV
Gain 1 : fondo scala 4.096V 1bit = 0.125 mV
Gain 2 : fondo scala 2.048V 1bit = 0.0625 mV
Gain 4 : fondo scala 1.024V 1bit = 0.03125 mV
Gain 8 : fondo scala 0.512V 1bit = 0.015625 mV
Gain 16 : fondo scala 0.256V 1bit = 0.0078125 mV

(attenzione: se si setta un guadagno e si eccede il fondo scala si rischia di bruciare l'ADC)

Considerando le tensioni di lettura della strumentazione del laboratorio di geotecnica il Gain ottimale e' il 4

Per controllare questo componente si usa la libreria scaricabile a questo indirizzo 

Di seguito un semplice esempio ovvero la misura della tensione su un potenziometro variabile (montato su A0 dell'ADS1115)


ed ecco il semplice codice per la lettura
----------------------------------------------------------
#include <Wire.h>
#include <Adafruit_ADS1015.h>

Adafruit_ADS1115 ads;  /* Use this for the 16-bit version */

void setup(void) 
{
  Serial.begin(9600);
  //                                                                ADS1015  ADS1115
  //                                                               -------  -------
  ads.setGain(GAIN_TWOTHIRDS);  // 2/3x gain +/- 6.144V  1 bit = 3mV      0.1875mV (default)
  // ads.setGain(GAIN_ONE);        // 1x gain   +/- 4.096V  1 bit = 2mV      0.125mV
  // ads.setGain(GAIN_TWO);        // 2x gain   +/- 2.048V  1 bit = 1mV      0.0625mV
  // ads.setGain(GAIN_FOUR);       // 4x gain   +/- 1.024V  1 bit = 0.5mV    0.03125mV
  // ads.setGain(GAIN_EIGHT);      // 8x gain   +/- 0.512V  1 bit = 0.25mV   0.015625mV
  // ads.setGain(GAIN_SIXTEEN);    // 16x gain  +/- 0.256V  1 bit = 0.125mV  0.0078125mV
  
  ads.begin();
}

void loop(void) 
{
  int16_t adc0, adc1, adc2, adc3;

  adc0 = ads.readADC_SingleEnded(0);
  Serial.print("AIN0: "); Serial.println(adc0);
  delay(100);
}


Bussola non funzionante su Alcatel One Touch Fire 4012X

Aggiornamento
Dopo un mese e 20 giorni il telefono e' rientrato dall'assistenza Alcatel con il medesimo problema
Nonostante quanto riportato dai siti vedi per esempio qui, e qui  mi viene il forte sospetto che il telefono non abbia un sensore per la bussola
---------------------------------------------------------

Alla fine non ho resistito e mi sono comprato l'unico terminale attualmente disponibile in Italia che monta Firefox Os, ovvero l'Alcatel One Touch Fire.
Lo scopo dell'acquisto era quello di effettuare il porting di Geocompass anche per Firefox OS (e nel frattempo imparare un po' di HTML5)

Con mia grande sorpresa pero' la bussola non risulta funzionante. Mediante programma sono riuscito a leggere i valori di inclinazione ma non quelli dell'azimuth (la API e' la medesima quindi non e' un problema di programmazione). Ho provato quindi a scaricare dal Market delle applicazioni di bussola con il medesimo risultato. Nessun segnale dal sensore magnetico

Ho riportato quindi il telefono in assistenza con due scenari possibili:
1) il sensore e' rotto
2) non e' stato implementato il driver all'interno del sistema operativo

Nel negozio era disponibile un altro esemplare in vetrina e grazie al venditore e' stato possibile accenderlo ed installare applicazioni per bussola scaricate sempre dal Market. Medesimo risultato. La bussola non funziona
Attendo speranzoso che torni dall'assistenza ma il sospetto di aver comprato un oggetto per niente testato e' forte


Problemi su bussola di smartphone

Alcune persone del Dipartimento di Scienze Geologiche dell'Universita' di Firenze mi hanno segnalato che la mia applicazione Geocompass non funziona. Il primo istinto e' stato dire: non e' possibile, l'applicazione e' stata scaricata da oltre 2500 persone non ho mai avuto segnalazioni in merito
Sono andato quindi a verificare di persona ed in effetti durante le prove il valore di Dip rimaneva fisso mentre il valore di Strike oscillava sensibilmente. Nelle mie prove non avevo osservato il fenomeno e sono rimasto perplesso. Una volta tornato a casa ho riprovato l'applicazione ed il difetto non si mostrava


A questo punto ho condotto la prova mostratta nel video. Con la stessa applicazione (la mia Geocompass), sullo stesso telefono (il mio Nexus S) ho fatto una prova di misura presso l'ufficio e dopo mezz'ora presso il DST ad Arcetri. Come si vede ad Arcetri le misure oscillano in un range di +- 20° (le misure sono state effettuate il piu' distante possibile da eventuali fonti di interferenza)

Si vede anche chiaramente che il sensore affetto e' il solo sensore magnetico infatti la misura di Dip e' eseguita solo tramite l'accelerometro (e' un calcolo in base alla scomposizione del vettore della forza di gravita') ed e' stabile mentre varia il valore di Strike e' che funzione sia dell'accelerometro sia della bussola digitale

Il sospetto e' che il sensore magnetico sia ingannato da qualche interferenza localizzata

ps: il fenomeno non sembra ascrivibile a cattiva calibrazione del sensore

giovedì 16 gennaio 2014

Arduino nano ed interruttore al mercurio

Un amico mi ha richiesto un sistema basato su Arduino che fosse alimentato da una batteria, che fosse il piu' piccolo possibile e che fosse sempre spento a meno di un evento (il rovesciamento della scheda)

La soluzione piuttosto stupida e' stata quella di usare come fonte di alimentazione una pila V4034PX della Varta da 6 V ed una Arduino micro (hanno piu' o meno le stesse dimensioni)

Tra il polo positivo della pila ed il Vcc dell'Arduino e' stato messo un interruttore a Mercurio (che normalmente e' in posizione aperta). Quando la scheda viene rovesciata il circuito si chiude e si accende l'Arduino


sdf




martedì 14 gennaio 2014

Da Os X 10.6 a 10.7 via USB - Errore su installazione

Mi sono trovato a dover aggiornare un MacBook (Intel Core Due Duo con 2 Giga di Ram) per il passaggio da Mac Os X 10.6 a 10.7. (fra parentesi ho pochissima esperienza con i Mac ed in particolari con la nuova generazione Intel)
Non avendo un supporto fisico (leggasi DVD) ho preparato una chiavetta USB con il metodo che ho riassunto nel video sottostante. In sintesi si prende una chiavetta da almeno 8 Giga, si apre Utility Disco, si formatta la chiavetta e poi si ripristina sulla stessa chiavetta il .dmg del sistema operativo



A questo punto ho fatto partire la macchina tenendo premuto il tasto Option (Alt) e selezionando la chiavetta come disco di avvio. In tutte le prove effettuate, dopo un po' di pensatoio da parte dell'installer, viene sempre generato questo errore. Ho provato a rimuovere la partizione bootcamp, provato a formattare tutto il disco ... niente da fare



Frugando per forum ho trovato l'indicazione di formattare la PRAM prima di tentare l'installazione. A questo punto ho proceduto accendendo il calcolatore e premendo subito la combinazione Option+Command+P+R, il Mac fa Boing e poi fa il reboot. A questo punto ho fatto ripartire l'installazione da Usb Key e tutto e' terminato in modo corretto


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