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
venerdì 1 aprile 2016
giovedì 31 marzo 2016
PIC 16F877A e ATMEGA328P standalone su breadboard
Era da un po' di tempo che volevo provare ad usare un ATMEGA328P (il microcontrollore di Arduino Uno) separato dalla sua scheda. Cio' permette di rispamiare un po' di soldi (la spesa piu' importante e' il microcontrollore con flashato il bootloader) e di elettronica (regolatore di tensione, programmatore via USB)
Per rendere le cose semplici l'obbiettivo era quello di far girare lo sketch Blink (lampeggio di un led su PIN D13)
Ho scoperto quindi che la circuiteria per usare un ATMEGA ed un PIC su una breadboard sono molto simili e si riducono sostanzialmente ad alimentare il microcontrollore e fornire il clock da un quarzo con due condensatori accessori
PIC 16F877A
Il microcontrollore e' stato programmato con PicKit 3. A differenza di ATMEGA si possono impostare differenti frequenze di clock secondo le modalita' LP (Low Power, 32.768 KHz), XT (fino a 8MHz) ed HS
Il led e' stato posto sulla pin D0
ATMEGA 328P
La configurazione minimale di un ATMEGA 328P e' molto simile a quella del PIC. In pratica e' sufficiente prima programmare il chip direttamente sulla Arduino usando la normale procedura via IDE
Poi si rimuove il chip e lo si inserisce sulla breadboard (ATTENZIONE: i pin sono estremamente delicati e facili da piegare) . Sono sufficienti un quarzo oscillatore da 16 MHz tra i pin 9 e 10 (vedi schema successivo) e due condensatori da 22 pF a ponte tra GND ed i due piedini dell'oscillatore. Successivamente si devono connettere i pin 7 e 20 a Vcc +5V e pin 8 e 22 a GND
Fatto cio' si puo' inserire un led sul pin 19 (che corrisponde alla porta digitale 13 nel linguaggio Arduino) per vedere se tutto funziona (ho omesso per semplicita' la resistenza sul led perche' la prova e' durata pochi secondi e non c'era il rischio di fare danni all'elettronica)
E' possibile far funzionare l'ATMEGA 328P anche con il suo clock interno a 8 MHz (senza quindi necessita' di nient'altro che l'alimentazione) ma cio' richiede di modificare il bootloader
Per rendere le cose semplici l'obbiettivo era quello di far girare lo sketch Blink (lampeggio di un led su PIN D13)
Ho scoperto quindi che la circuiteria per usare un ATMEGA ed un PIC su una breadboard sono molto simili e si riducono sostanzialmente ad alimentare il microcontrollore e fornire il clock da un quarzo con due condensatori accessori
PIC 16F877A
Il microcontrollore e' stato programmato con PicKit 3. A differenza di ATMEGA si possono impostare differenti frequenze di clock secondo le modalita' LP (Low Power, 32.768 KHz), XT (fino a 8MHz) ed HS
Il led e' stato posto sulla pin D0
ATMEGA 328P
La configurazione minimale di un ATMEGA 328P e' molto simile a quella del PIC. In pratica e' sufficiente prima programmare il chip direttamente sulla Arduino usando la normale procedura via IDE
Il pin 1 del microcontrollore deve essere orientato verso il connettore ISCP della Arduino. Il microcontrollore e' smontato dalla Arduino Uno |
Poi si rimuove il chip e lo si inserisce sulla breadboard (ATTENZIONE: i pin sono estremamente delicati e facili da piegare) . Sono sufficienti un quarzo oscillatore da 16 MHz tra i pin 9 e 10 (vedi schema successivo) e due condensatori da 22 pF a ponte tra GND ed i due piedini dell'oscillatore. Successivamente si devono connettere i pin 7 e 20 a Vcc +5V e pin 8 e 22 a GND
Fatto cio' si puo' inserire un led sul pin 19 (che corrisponde alla porta digitale 13 nel linguaggio Arduino) per vedere se tutto funziona (ho omesso per semplicita' la resistenza sul led perche' la prova e' durata pochi secondi e non c'era il rischio di fare danni all'elettronica)
E' possibile far funzionare l'ATMEGA 328P anche con il suo clock interno a 8 MHz (senza quindi necessita' di nient'altro che l'alimentazione) ma cio' richiede di modificare il bootloader
venerdì 25 marzo 2016
Display 7 Led su Pic Dev Board
Lo schema elettrico per attivare il display a 7 Led sulla Pic Dev Board e' mostrato qui sotto
Per attivare il display a 7 Led si deve spostare il jumper bianco del connettore 5x2 sulla prima posizione (VCC-SW)
Per comandare quale posizione dei display si deve agire sulla porta A. Per esempio impostando la maschera dei bit della porta A a 0xFD si attiva il secondo posto da sinistra (maschera 11111101) mentre con 0xDF si attiva il 6° posto da sinistra (maschera 11011111)
Impostando la porta D si decide quale carattere mostrare
Questo e' il programma
-----------------------------------
#include <xc.h>
// CONFIG
#pragma config FOSC = XT // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
const unsigned char LED[]=
{
0xc0,0xf9,0xa4,0xb0,//0~3
0x99,0x92,0x82,0xf8,//4~7
0x80,0x90,0x88,0x83,//8~b
0xc6,0xa1,0x86,0x8e //c~f
};
void delay(unsigned int count);
void main(void)
{
unsigned int i;
TRISA&=0XFD;
TRISD=0B00000000;
PORTD=0xFF;
PORTA=0XFD;
while(1)
{
for(i=0;i<16;i++)
{
PORTD=LED[i];
delay(30);
}
}
}
void delay(unsigned int count)
{
unsigned int a,i;
for(i=0;i<count;i++)
{
for(a=0;a<5000;a++)
asm("NOP");
}
}
-----------------------------------
Programmazione PIC con PicKit3 e MPLAB Ide
Ho iniziato ad interessarmi ai PIC nel lontano 2004 quando mi sono comprato un programmatore seriale ed un paio di integrati alla Fiera dell'Elettronica di Empoli. La programmazione dei PIC non e' pero' banale rispetto alle schede Arduino per cui in seguito ho abbandonato PIC per usare le piu' intuitive Arduino con processore ATMEL...fino ad oggi.
Per programmare un PIC prima di tutto si deve acquistare un programmatore, nel mio caso un PicKit 3 comprato per una decina di euro su un e-commerce cinese
Il programmatore viene venduto con uno zoccolo ZIF (Zero Inserction Force). Per le prove mi sono comprato dei PIC 16F877A in formato 40 pin. Per vedere l'orientazione del processore sullo zoccolo si possono leggere le istruzioni nella parte sottostante, nel mio caso il Pin 1 e' vicino alla leva di blocco dello ZIF
Per programmare un PIC prima di tutto si deve acquistare un programmatore, nel mio caso un PicKit 3 comprato per una decina di euro su un e-commerce cinese
Da notare i colori della pedinatura tra il programmatore e lo zoccolo ZIF |
Per programmare i PIC si puo' usare MPLAB X Ide, scaricabile dal sito Microchip. Attenzione che questo e' il solo ambiente di sviluppo. Per compilare i programmi dovra' essere scaricato anche il compilatore (per esempio XC8)
Creazione di un nuovo progetto in MPALB |
Selezione del microcontrollore |
Selezione del programmatore |
Selezione del compilatore |
Quando si crea un nuovo progetto un MPLAB non viene creato un file sorgente da compilare. Dopo aver creato il progetto si deve selezionare la cartella Source Files ed Add New C Main File
Per poter programmare il PIC in PICKIT 3 si deve impostare l'alimentazione dal programmatore. Questo si effettua da Run/Set Project Configuration/Customize/PicKit3/Power/Power target circuit form PicKit3
Ovviamente il primo tentativo di programmare il microprocessore e' stato quello di usare un Led. Il PIC16F877A ha 4 porte digitali (A,B,C,D) programmabili da 8 bit in input ed output
Il PIC 16F877A non e' in grado di funzionare in modo autonomo perche' necessita di un oscillatore esterno (alcuni integrati della famiglia PIC hanno invece l'oscillatore integrato). Il quarzo deve essere posto ai pin 13 e 14 con a valle dei condensatori.
Si possono usare varie combinazioni di clock (per esempio 4MHz con condensatori da 15 pF)
http://www.elektrojo.com/img/cms/fig4-29.png |
Per rendere l'apprendimento un po' piu' semplice mi sono comprato una Pic Dev Board da un AliExpress. Prima nota : e' stata una pessima scelta perche' la documentazione a bordo e' tutta in cinese e organizzata in modo confuso. Sono riuscito a farla funzionare solo perche' insieme alla scheda era presente un CD con dei video tutorial (in cinese ma comunque comprensibili)
Sulla scheda sono gia' montati diversi dispositivi.
1) 8 Display a 7 Led
2) connettore per display LCD 12864
3) connettore per display LCD 1602
4) connettore per DS18B20 (termometro digitale)
5) tastiera 4x4
6) tastiera 4x1
7) 2 potenziometri collegati all'ADC del PIC
8) DS1302 (RealTime Clock) con batteria tampone
9) connettore PS2
10) RS232 connettore seriale DB9 con Max 232
11) interruttore di accesione
12) buzzer
13) 24C02 EEPROM 512 Bytes
14) HS0038 Universal IR Receiver
15) pulsante di reset per il PIC
16) resistenza variabile per gli LCD
17) 8 led verdi
Per usare il programmatore con la Dev Board quest'ultima deve essere alimentata separatamente mediante una alimentatore a 5 V (pin + al centro) oppure dalla porta microUsb (altrimenti MPLAB IDE segnala che non c'e' abbastanza tensione, circa 4.85 V) per procedere con la programmazione)
Da notare la pedinatura di connessione tra il PICKIT3 e la Dev Board |
La Dev Board ha gia' montato un quarzo da 4MHz. I led, come si vede dallo schema elettrico della Dev Board sono connessi alla porta D
Per alimentare i led si deve pero' fare un passo ulteriore. Si deve aggiungere un Jumper sul connettore 5x2 tra i pin VCC e LED VCC
Jumper bianco a fianco delle due resistenze variabili |
Questo e' il programma. A differenza di Arduino si deve impostare la configurazione del processore mediante i Configuration Bits in cui si indica per esempio la sorgente dell'oscillatore ed eventuali protezioni
Per impostare i Configuration Bits si seleziona da dentro MPLAB Window/PIC Memory Views/Configuration Bits. Si selezionano i valori desiderati e poi si clicca su Generate Source Code to Output. Si copia e si incolla quindi il risultato nel codice del sorgente
In questo programma viene acceso e spento il led connesso alla porta D0
------------------------------------
#include <xc.h>
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
// CONFIG
#pragma config FOSC = XT // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
void delay(void);
void main(void)
{
TRISD=0x00;
PORTD=0xFF;
while(1)
{
RD0=!RD0;
delay();
}
}
void delay(void)
{
unsigned int a;
for(a=0;a<50000;a++);
}
------------------------------------
mercoledì 16 marzo 2016
Realta' virtuale su FSX con KinoVR-OpenTrack-Cardboard
Ho sempre avuto una passione sfrenata per i simulatori di volo dai tempi di MS-DOS (anche se di fatto tocco terra in modo rude il 99% delle volte). In questo post ho voluto provare la possibilita' di creare un simulatore di volo in realta' virtuale con un costo decisamente abbordabile (una decina di euro per l'app piu' una 20-30 euro per un visore 3D di plastica ed un cavo USB piuttosto lungo. il telefono deve avere accelerometri e giroscopi) utilizzando Google CardBoard e Flight Simulator X
Per ottenere una visualizzazione stereoscopica (anche se non e' una vera stereoscopia perche' il gioco non la prevede, e' una duplicazione dello stesso schermo sui due oculari) ho provato sia TrinusVR che KinoVR, due applicazioni di realta' virtuale per Android con una parte server su Windows
E' importante segnalare che, nonostante siano disponibili collegamenti via WiFi e USB Tethering, la prima opzione e' fortemente sconsigliata per il ritardo che si genera sul segnale video.
Un altro aspetto che si puo' aggiungere per rendere piu' realistica la simulazione e' il cambio di visuale a seconda di come e' orientata la destra, cioe' se si guarda a destra anche la visione del gioco si sposta sulla destra e cosi' via. Per fare cio' ho utilizzato OpenTrack che pero' ha funzionato solo su KinoVR e non su TrinusVR
Nella prima schermata di OpenTrack si deve impostare il protocollo a Microsoft FSX SimConnect
Poi si va nelle Opzione e si configura l'output come segue invertendo gli assi
Infine si calibra la cuva di risposta degli assi di Yaw, Pitch e Roll
Per ottenere una visualizzazione stereoscopica (anche se non e' una vera stereoscopia perche' il gioco non la prevede, e' una duplicazione dello stesso schermo sui due oculari) ho provato sia TrinusVR che KinoVR, due applicazioni di realta' virtuale per Android con una parte server su Windows
E' importante segnalare che, nonostante siano disponibili collegamenti via WiFi e USB Tethering, la prima opzione e' fortemente sconsigliata per il ritardo che si genera sul segnale video.
Un altro aspetto che si puo' aggiungere per rendere piu' realistica la simulazione e' il cambio di visuale a seconda di come e' orientata la destra, cioe' se si guarda a destra anche la visione del gioco si sposta sulla destra e cosi' via. Per fare cio' ho utilizzato OpenTrack che pero' ha funzionato solo su KinoVR e non su TrinusVR
Nella prima schermata di OpenTrack si deve impostare il protocollo a Microsoft FSX SimConnect
Poi si va nelle Opzione e si configura l'output come segue invertendo gli assi
Infine si calibra la cuva di risposta degli assi di Yaw, Pitch e Roll
Al termine delle modifiche si preme Start
Si apre quindi Kino Console/VR Settings.
Si flagga Use Opentrack to headtracking, disable mouse acceleration e Enable image Duplication
A questo punto si collega il cavo USB e dal telefono Android si abilita USB Tethering e si disabilita la connessione di rete WiFi. Il telefono cerca il server sul PC. Il programma e' un po' instabile ed a volte richiede piuttosto tempo per stabilire la connessione. Al termine si clicca sull'icona e si inserisce la password per perfezionare il collegamento
lunedì 14 marzo 2016
Photosphere
Photosphere sono immagini a 360° sul piano orizzontale e +/- 90° sul piano verticale.
Non sono una novita' in senso assoluto perche' e' ormai una decina d'anni che si vedono a giro ma cio' che ora e' interessante e' la possibilta' di poterle realizzare con dei comuni smartphone che effettuano in automatico la ricucitura delle varie immagini e la compensazione dei colori
L'applicazione Fotocamera di Google permette questa possibilita' (o meglio lo permette solo su alcuni telefoni, per esempio su MotoG Google Edition non e' disponibile l'opzione che invece e' presente su Nexus 4...ed entrambi i telefoni condividono praticamente lo stesso software)
Per avere una visione panoramica si devono eseguire foto girando su se stessi con 5 angoli di inclinazione rispetto all'orizzontale e seguendo le indicazioni dei punti blu che compaiono sullo schermo
Per vedere l'immagine si puo' utilizzare anche l'apposita applicazione ed un visore Cardboard in modo da avere un poco di realta' virtuale
Questa e' l'immagine dentro Google Maps ma si puo' ottenere la visualizzazione via browser web anche utilizzando delle librerie JS come questa, di semplicissimo utliizzo
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));
}
}
}
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);
}
}
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)
Iscriviti a:
Post (Atom)
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...
-
In questo post viene indicato come creare uno scatterplot dinamico basato da dati ripresi da un file csv (nel dettaglio il file csv e' c...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...
-
La scheda ESP32-2432S028R monta un Esp Dev Module con uno schermo TFT a driver ILI9341 di 320x240 pixels 16 bit colore.Il sito di riferiment...