mercoledì 9 marzo 2016

Unity con Google Cardboard ed Android


Cardboard SDK for Unity
Dopo aver installato Unity si lancia l'applicazione creando un nuovo progetto.
Si cancella dal progetto la camera di default e si scarica lo Unity Package dell' SDK Cardboard.
Una volta effettuato il download, tenendo aperto Unity, si fa doppio click sullo Unity package e si attiva l'importazione. Si importa tutto tranne il ramo Legacy

A questo punto da Assets/Cardboard/Prefabs si trascina sulla Hierarchy il componente Carboard Main per creare nel progetto la camera stereoscopica per Cardboard



Importare Modelli 3D
Si trascina il modello 3d (in formato 3DS o FBX) dentro la cartella Assets
Si scala il modello
Si crea una nuova cartella Texture dentro Assets e si copiano le texture trascinandole

a questo punto si deve collegare il modello 3d alla texture
si deve modificare lo Shader portandolo da Standard a Legacy Shader/Bumped Diffuse
si aprono due finestre Base e NormalMap. Si devono trascinare le due immagini (Base e' la pelle del modello mentre NormalMap e' la mappa delle normali dei vettori dei modello e di solito si mostra come immagine azzurra o nera)



Un sito da cui scaricare modelli gratuiti e'  http://tf3dm.com/

Joystick XBox 360 USB su Mac e Unity
Un altro problema con cui mi sono dovuto confrontare e' stato quello di interfacciare il Joystick Microsoft XBox 360 USB su Mac con Unity

Per prima cosa si deve installare il driver prelevandolo da questo indirizzo


In seguito si deve aggiungere al progetto XBoxCtrlInput

Interazione utente
Per aggiungere l'interazione utente devono essere definiti gli script collegati con i GameObject. Cio' si fa cliccando un oggetto in Hierarchy e poi andando su Inspector ed Add Component/New Script in C#

per esempio per muovere la camera i pulsanti A,B,X ed Y del mouse si puo' aggiungere questo script

--------------------------------
using UnityEngine;
using XboxCtrlrInput;

using System.Collections;

public class muovi_camera : MonoBehaviour {

    public float speed = 5.0f;


    // Use this for initialization
    void Start () {
    
    }
    
    // Update is called once per frame
    void Update () {
        if (XCI.GetButton (XboxButton.B)) {
            transform.Translate(new Vector3(speed * Time.deltaTime,0,0));
        }

        if (XCI.GetButton (XboxButton.X)) {
            transform.Translate(new Vector3(-speed * Time.deltaTime,0,0));
        }

        if (XCI.GetButton (XboxButton.Y)) {
            transform.Translate(new Vector3(0,0,speed * Time.deltaTime));
        }

        if (XCI.GetButton (XboxButton.A)) {
            transform.Translate(new Vector3(0,0,-speed * Time.deltaTime));
        }


    }
}

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

per ruotare un oggetto, in questo caso un dinosauro, con il joystick 

--------------------------------
using UnityEngine;
using System.Collections;

public class gira_tiranno : MonoBehaviour {

    // Use this for initialization
    void Start () {
    
    }
    
    // Update is called once per frame
    void Update () {
        
        float h = Input.GetAxis ("Horizontal");
        float v = Input.GetAxis ("Vertical");
        transform.Rotate(0, h, v);
        Debug.Log (h);
        Debug.Log (v);


    
    }
}
--------------------------------

Unendo il tutto (usando il pulsante Play)



Per finire si deve mandare in esecuzione su Android usando il comando Build&Run.
Per compilare un progetto verso Android e' necessario il solo Android SDK e Unity fa tutto per conto suo.
Su IOS invece Unity crea solo un progetto ma non lo compila, deve essere compilato separatamente all'interno XCode (con la versione attulamente in uso non sono riuscito a compilare su XCode per un errore nelle impostazioni del progetto)


martedì 8 marzo 2016

Xbee Stick

Oggi ho provato lo XBee Stick. In estrema sintesi e' un dongle USB con all'interno un trasmettitore XBee



Di fatto non c'e'  differenza tra uno XBee Stick e un Xbee Explorer con montata sopra una trasmittente Xbee (a parte il fatto che lo Stick e' piu' solido)
Dal punto di vista dei costi uno Xbee Stick ZB costa circa 66 euro mentre l'accopiata Xbee Explorer (circa 30 euro) piu' trasmittente Xbee (circa 40 euro) costa poco piu' di 70 euro

La programmazione e' identica a quella di un modulo Xbee standard e funziona anche sotto Linux come seriale virtuale sotto /dev/ttyUSBx

In conclusione lo Stick e' utile se deve essere installato su un PC di acquisizione mentre l'Explorer e' da usare per la programmazione dei moduli Xbee che poi saranno montati su altri dispositivi

venerdì 4 marzo 2016

Raw data su UART1 in Ublox M8T ed Arduino

Sono arrivato al punto di connettere l'Ublox M8T ad Arduino. La connessione, come nel suo fratello minore, e' banale perche' basta connettere Vcc (in questo caso 5V), GND e Tx al D2 di Arduino



Lo sketch e' una banale modifica dell'esempio di SoftwareSerial

------------------------------------------
#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3); // RX,TX

void setup()
{
  Serial.begin(9600);
  mySerial.begin(9600);
}

void loop()
{
  if (mySerial.available())
    Serial.write(mySerial.read());
}
------------------------------------------

Il problema e' che sulla porta seriale UART1 di Ublox di default vengono trasmessi solo i dati NMEA ed anche abilitando i messaggi UBX questi si vedono passare sulla porta USB e non sulla UART1


Cio' deriva dal fatto che i messaggi UBX su UART1 devono essere esplicitamente abilitati da U-Center andando nel menu Configuration View (CTRL+F9), MSG, dalla tendina si selezione RXM-RAWX, si spunta la UART1 e si preme SEND

A questo punto si vedranno i messaggi raw UBX anche sulla porta seriale

giovedì 3 marzo 2016

Arduino Xbee Shield + USB Shield ???

Sto provando a mettere insieme un sistema un minimo complicato utilizzando  Arduino ed al momento di montarlo mi sono accorto che non e' possibile accoppiare insieme lo shield USB e lo Shield XBee,


Normalmente gli shield si connettono alla Arduino di base utilizzando il connettore ISCP 3x2 pint che si trova all'estrema destra della foto superiore tra i pin D0 ed A5

Questo connettore, oltre a replicare i pin D13,D12,D11 e D10 della porta SPI porta anche i contatti Vcc, Gnd e reset.
In Shield come il Solar Shield il conettore e' passante, nel senso che i contatti dal basso vengono portati sopra la scheda per metterli a disposizione di un altro shield

Solar Shield

Il problema e' che l'USB shield non replica verso l'alto tali contatti. Si vede chiaramente l'assenza nella foto sottostante. Poco male si dira' perche' comunque vengono replicati verso l'alto tutti i contatti sulle due strisce laterali (compresi quindi anche D13,D12,D11,D10 Vcc e Gnd)

USB Shield
Il problema che lo Xbee Shield non ha contatti nella zona di potenza (quindi nei pin da IREF a Vin) e l'unica sorgente di alimentazione deriva dal connettore ISCP


Anche invertendo l'ordine, mettendo prima lo Xbee Shield e poi in alto l'USB Shield, la situazione non migliora perche' Xbee shield non espone verso l'alto nessun contatto di alimentazione

In conclusione non risulta possibile, a meno di non fare una patch volante, utilizzare contemporaneamente Xbee Shield e USB Shield su Arduino










mercoledì 2 marzo 2016

PL2303 falsificato : error code 10

Mi sono comprato su un e-commerce cinese un paio di cavi USB to 232TTL PL2303HX (avevo bisogno della doppia tensione a 5V e 3.3 V) al prezzo ridicolo 1.33 euro l'uno



Il dispositivo inserito in una Linux Box si mostra come segue e funziona correttamente
--------------------------------------------------
Mar  1 14:04:53 luca-ThinkPad-X201 kernel: [  623.298691] usb 2-1.2: new full-speed USB device number 10 using ehci-pci
Mar  1 14:04:53 luca-ThinkPad-X201 kernel: [  623.392179] usb 2-1.2: New USB device found, idVendor=067b, idProduct=2303
Mar  1 14:04:53 luca-ThinkPad-X201 kernel: [  623.392184] usb 2-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
Mar  1 14:04:53 luca-ThinkPad-X201 kernel: [  623.392188] usb 2-1.2: Product: USB-Serial Controller
Mar  1 14:04:53 luca-ThinkPad-X201 kernel: [  623.392191] usb 2-1.2: Manufacturer: Prolific Technology Inc.
Mar  1 14:04:53 luca-ThinkPad-X201 mtp-probe: checking bus 2, device 10:"/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2"
Mar  1 14:04:53 luca-ThinkPad-X201 mtp-probe: bus: 2, device: 10 was notan MTP device
Mar  1 14:04:54 luca-ThinkPad-X201 kernel: [  624.422524] usbcore:registered new interface driver pl2303
Mar  1 14:04:54 luca-ThinkPad-X201 kernel: [  624.422561] usbserial: USB Serial support registered for pl2303
Mar  1 14:04:54 luca-ThinkPad-X201 kernel: [  624.422589] pl2303 2-1.2:1.0: pl2303 converter detected
Mar  1 14:04:54 luca-ThinkPad-X201 kernel: [  624.424404] usb 2-1.2: pl2303 converter now attached to ttyUSB1

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

mentre una volta inserito in un PC Windows, una volta installato il driver scaricato dalla Prolific, all'inserimento del dispositivo, viene generato un Error Code 10.
Dopo aver frugato un po' su Internet ho scoperto che si tratta di un problema relativo a chip Porolific contraffatti. La Prolific, per evitare questo problema, distribuisce dei driver che sono in grado di verificare l'originalita' del dispositivo ed in caso contrario ne impedisce l'uso (su Linux il problema ovviamente non esiste perche' il driver non e' svilutppato da Prolific)
L' unica soluzione e' quella di non installare l'ultima versione del driver ma ricorrere a versioni vecchiotte (che comunque funzionano)


lunedì 29 febbraio 2016

Esperimento di video 3D con Nintendo 3DS su Youtube


La Nintendo 3DS e' un giocattolo (indicativamente bambini piccoli a vedere il parco giochi) ma e' anche un oggetto per la presenza di uno schermo in auto stereoscopia

E' anche interessante la presenza di una coppia di fotocamere che permette di realizzare stereocoppie in modo semplice e con una geometria non modificabile. Aggiornando il firmware e' possibile, oltre alle stereocoppie, realizzare anche video stereo




I dati sono salvati nella SD Card del dispositivo e sono in formato MJPG (estensione del file .AVI). Per visualizzare i video su Youtube si deve prima installare il codec MPJPG da SourceForge
Dopo l'installazione  si apre VFW Configuratione e si abilita il Decoder MJPEG portandolo a libavcodec


Si installa quindi Stereo Movie Maker e si apre il file .avi precedentemente salvato


non c'e' bisogno di allineare le due semimeta' dello schermo perche' sono gia' sincronizzate
Si salva il file mettendo il flag in Side-by-Side e definendo il codec di compressione (questa ultima fase e' in po' a prove per trovare quello giusto)



Effettuando l'upload su Youtube viene riconosciuto il formato ma si puo' comunque indicare che si tratta di un filmato 3D. In Youtube versione desktop il filmato viene visualizzato come anaglifo (da visualizzare con gli occhialini a lenti rosse e blu) mentre su Android lo schermo viene diviso in due meta' per poter essere visualizzato con Google Cardboard
Lo stesso risultato si puo' ottenere con ffmpeg ma e' piu' macchinoso


martedì 23 febbraio 2016

Mini Tennis su Arduino

Sono abbastanza vecchio da aver giocato a Pong sulle consolle di fine anni 70-inizio anni 80 (in particolare alla versione Polistil) ed avendo una mezz'ora libera ed un schermo oled SSD1306 (32x128 pixel) ho voluto provare a farmi la mia versione di Pong con Arduino


Pong della Polistil

Questo progettino e' fatto soltanto per divertirsi e per imparare ad usare l'SSD1306, non c'e' nessuna pretesa di giocabilita'


Come sul pong originale il controllo della racchetta avviene mediante un potenziometro.
Via via che il gioco va avanti la velocita' della palla aumenta

// -------------------------------------------------------------------------------------
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4

Adafruit_SSD1306 display(OLED_RESET);


int x;
int y;
int dx = 2;
int dy = 2;
int yb = 0;
int punteggio;
int contatore;
int ritardo;

#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

void setup()   {         
  Serial.begin(9600);
       
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  
  display.display();
  delay(200);
  punteggio = 48; //codice ASCII per il numero zero
  x = 64;
  y = random(30);
  contatore = 0;
  ritardo = 40;
  
  randomSeed(analogRead(0));

}


void loop() {
  x = x + dx;
  y = y + dy;
  display.clearDisplay();

  // disegna il punto
  display.drawPixel(x, y, WHITE);

  //disegna il punteggio
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(120,0);
  display.write(punteggio);
  //display.display();

  //legge il potenziometro
  int pot = analogRead(A2);
  Serial.println(pot);
  yb = round(pot/25);

  // disegna il rettangolo
  display.fillRect(1, yb, 2, 7, 1);
  display.display();

  // se trova una parete rimbalza
  if (x >= 127) dx = -dx;
  if (y >= 31) dy = -dy;
  //if (x <= 1) dx = -dx;
  if (y <= 1) dy = -dy;
  
  // se e' sulla parete di destra controlla la posizione
  // della barra
  // se rimbalza inverte la direzione
  if (x < 7)
     {
       if ((y >= yb) && (y <= yb+7))
           {
             dx = -dx;
             // dopo 10 rimbalzi consecutivi il gioco si fa piu' veloce 
             contatore = contatore + 1;
              if (contatore == 3)
                  {
                  contatore = 0;
                  ritardo = ritardo = ritardo - 3;
                  }
             }
       else
           {
              punteggio = punteggio + 1;
              delay(500);
              x = 64;
              y = random(30);
              dx = 2;
              dy = 2;
              ritardo = 40;
              contatore = 0;
           }
      } 

delay(ritardo);
}


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