giovedì 9 gennaio 2014

EasyPeasy su EEEPC 1001 PXD

Mi e' stato chiesto un consiglio per rendere operativo un EEEPC 1001 PXD comprato oltre due anni fa e che giaceva chiuso in un cassetto da oltre un anno perche' la macchina era oggettivamente non usabile.
Dato che il proprietario lo vuole usare solo per archiviare e sentire la musica e vedere le foto non me la sono sentita di fare una installazione di Debian (piu' che altro per il tempo necessario)


Mi sono ricordato che sul mio Samsung N150 avevo installato in un primo momento una Ubuntu specifica per netbook ma da una ricerca su internet ho verificato che la distribuzione non e' piu mantenuta.
Sono cosi' incappato in EasyPeasy, una distribuzione basata su Ubuntu che sembra aver raccolto il testimone di Ubuntu per Netbook
Il kernel e' rimasto alla serie 2.6 ed e' stato mantenuta l'interfaccia originale di Ubunti per netbook
L'EEEPC non e' decollato (ha un Atom 550 con un giga di memoria) ma quanto meno l'installazione ha riconosciuto tutte le periferiche ed il computer e' usabile

mercoledì 8 gennaio 2014

Sonda Effetto Hall (KY-003 Clone cinese)

Ho comprato su DealExtreme questa sonda di Hall giusto per fare qualche esperimento (per dettagli su cosa sia effettivamente l'effetto Hall si puo' leggere la relativa pagina di Wikipedia)
Il costo era ridicolo (meno di due euro spedizione compresa)


Si tratta di un piccolo componente elettronico (44E938) montato su una basetta con i reofori ed un piccolo led. Il componente di per se non e' niente di speciale: ha solo lo stato On/Off e necessita di un discreto campo magnetico per attivarsi. Lo stato e' normalmente On e la schedina e' dotata di un led rosso che si attiva alla prossimita' del magnete (in linea di principio non e' richiesta l'Arduino ma basta l'alimentazione)

La pedinatura dell'integrato e' (con la scritta rivolta verso l'alto)
Sinistra : VCC 5V
Centro GND
Destra : Segnale

mentre quella della schedina e'
Sinistra : GND
Centro VCC 5V
Destra : Segnale

L'utilizzo di questo sensore puo' essere come interruttore (accoppiato ad un piccolo magnete) per verificare l'apertura di una porta o per contare i giri di un disco


(il magnete e' nascosto all'interno del tessuto. Ho usato il fermaglio magnetico del case del tablet)

Ps: un utente ha segnalato nei commenti di DealtExtreme che la pedinatura scritta sulla scheda non e' corretta. Per quanto mi riguarda i collegamenti sono corretti
--------------------------------------------------------------
int val = 0; 
void setup()
{
pinMode(2, INPUT); // segnale del sensore
pinMode(13, OUTPUT); 
Serial.begin(9600); 
}

void loop()
{

val = digitalRead( 2 );
Serial.println(val); 

if ( val == HIGH )
digitalWrite ( 13, HIGH ); 
else
digitalWrite ( 13, LOW ); .
delay(1000);
}

martedì 7 gennaio 2014

Controllo batteria su Android

Un semplice snippet per monitorare via Api il livello della batteria su Android

--------------------------------------------------------
import android.os.Bundle;
import android.widget.TextView;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;


public class MainActivity extends Activity {


private TextView battery;

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

battery=(TextView)findViewById(R.id.batteria);

this.registerReceiver(this.batteryInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
}
private BroadcastReceiver batteryInfoReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
             
            int  level= intent.getIntExtra(BatteryManager.EXTRA_LEVEL,0);
            battery.setText("Livello : " + Integer.toString(level));
        }
    };

}

Problemi con QGis in Debian

Al momento di usare QGis su Debian mi e' comparso il seguente messaggio


La cosa curiosa e' che avevo di recente usato QGis senza errori di sorta. Ho verificato che il malfunzionamento deriva dall'aggiornamento di alcune librerie di appoggio di QGis e del mancato aggiornamento di QGis stesso (il repository ufficiale non e' sincronizzato)
La soluzione e' quella di impiegare come repository direttamente qgis.org

per prima cosa si rimuove la versione di default di QGis

apt-get remove qgis python-qgis qgis-plugin-grass

si aggiunge al file /etc/apt/sources.list il repository di QGis
deb http://qgis.org/debian jessie main

si aggiungono le chiavi
gpg --recv-key 47765B75 gpg --export --armor 47765B75 | sudo apt-key add -
e si reinstalla QGis dalla nuova sorgente
sudo apt-get update sudo apt-get install qgis python-qgis qgis-plugin-grass
come risultato sono passato da una versione 1.7 non funzionante (o meglio con i plugin Python non funzionanti) ad una fiammante versione 2.0

Fauna caldinese - Caprioli

Affacciarsi alla finestra e vedere tre caprioli placidamente seduti nel prato a cento metri dal paese e' gradevole. Sapere che proprio li' sotto c'e' il bar dei cacciatori non ha prezzo


Da notare che seduti, con la livrea invernale e visti di coda,i caprioli  sono praticamente invisibili (se non evidenziati dai quadratini rossi)

lunedì 6 gennaio 2014

RS232-TTL su Arduino con Max3232

Arduino ha una o piu' di una porta seriali (Arduino Uno ne ha una nei pin 0-RX ed 1-TX)
Non e' pero' possibile collegarla direttamente alla seriale a causa dei differenti livelli logici. Per questo motivo si deve usare un chip MAX 3232 (per semplicita' ho comprato a circa 5 euro una basetta gia' montata)



I collegamenti sono semplici
VCC -> 5 V Arduino
GND -> GND Arduino
Tx -> Rx Arduino
Rx->Tx Arduino
(i pin della fila piu' interna non sono necessari)

Per verificare il funzionamento si puo' usare Minicom (e nel mio caso un caso USB-Seriale in quanto il portatile non dispone di una porta seriale vera)

minicom -D /dev/ttyUSB0 -b 9600

Lo sketch di prova e' particolarmente semplice
---------------------------------------
void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.println("Luca");
  delay(1000);        
}

domenica 5 gennaio 2014

Texas CC1101 su Arduino con libreria Panstamp

Dopo lo scarso successo della precedente prova e stimolato da un commento ho riprovato ad usare il modulo Texas CC1101 con le librerie Panstamp

Viste le modeste dimensioni delle scritte sul circuito riporto la pedinatura del modulo CC1101 (non l'integrato ma tutto il modulo) in modo da rendere piu' semplici i collegamenti

I collegamenti con Arduino sono
GND / GND
VCC / VCC (3.3V)
CSN / D10
MOSI /D11
MISO / D12
SCK / D13
GD0 / D2

Le prove sono state effettuate con la IDE 1.5.5 su Windows
E' stato seguito l'esempio riportato a questo link (Erwan's Blog) e la libreria associata  (grazie per l'aiuto)
Il primo tentativo e' miseramente fallito perche' ho modificato il programma cambiando il settaggio del baudrate dello sketch originale (da 38400 a 19200). Questa modifica la avevo effettuata perche' nel Monitor Seriale di Arduino non e' prevista la velocita' di 38400....questa insignificante modifica rendeva non funzionante lo sketch (lo ho scoperto dopo un paio di giorni e quasi per caso

Riportati gli sketch all'origine mi sono adattato a monitorare la seriale via Minicom con il comando

minicom -D /dev/ttyACM0 -b 38400

in questo modo la trasmissione e ricezione funzionano correttamente. Ma quale e' la massima distanza di trasmissione con questa libreria??
Dopo varie prove, anche invertendo le schede Arduino che fungono da trasmettitore e ricevitore oppure invertendo le antenne, il risultato e' stato identico alla prova precedente con una portata di circa 25 metri (l'RSSI parte da un valore di circa 78 con le antenne praticamente attaccate e scende a circa 100 alla massima distanza)

Viste le esperienze di altre persone che hanno mostrato trasmissioni con una distanza di oltre 200 metri mi sta venendo il dubbio che il problema sia hardware

Emettitore
-------------------------------------
#include "EEPROM.h"
#include "cc1101.h"

CC1101 cc1101;

// The LED is wired to the Arduino Output 4 (physical panStamp pin 19)
#define LEDOUTPUT 7

// counter to get increment in each loop
byte counter;
byte b;
byte syncWord = 199;

void blinker(){
digitalWrite(LEDOUTPUT, HIGH);
delay(100);
digitalWrite(LEDOUTPUT, LOW);
delay(100);
}

void setup()
{
Serial.begin(38400);
Serial.println(" start ");

// setup the blinker output
pinMode(LEDOUTPUT, OUTPUT);
digitalWrite(LEDOUTPUT, LOW);

// blink once to signal the setup
blinker();

// reset the counter
counter=0;
Serial.println(" initializing… ");
// initialize the RF Chip
cc1101.init();

cc1101.setSyncWord(&syncWord, false);
cc1101.setCarrierFreq(CFREQ_433);
cc1101.disableAddressCheck();
//cc1101.setTxPowerAmp(PA_LowPower);

delay(1000);

Serial.print(" CC1101_PARTNUM " ); //cc1101=0
Serial.println(cc1101.readReg(CC1101_PARTNUM, CC1101_STATUS_REGISTER));
Serial.print(" CC1101_VERSION " ); //cc1101=4
Serial.println(cc1101.readReg(CC1101_VERSION, CC1101_STATUS_REGISTER));
Serial.print(" CC1101_MARCSTATE " );
Serial.println(cc1101.readReg(CC1101_MARCSTATE, CC1101_STATUS_REGISTER) & 0x1f);

Serial.println(" device initialized ");
//Serial.println(" done ");
}

void send_data() {
CCPACKET data;
data.length=10;
byte blinkCount=counter++;
data.data[0]=5;
data.data[1]=blinkCount;data.data[2]=0;
data.data[3]=1;data.data[4]=0;
//cc1101.flushTxFifo ();
Serial.print(" CC1101_MARCSTATE " );
Serial.println(cc1101.readReg(CC1101_MARCSTATE, CC1101_STATUS_REGISTER) & 0x1f);
if(cc1101.sendData(data)){
Serial.print(blinkCount,HEX);
Serial.println( " sent ok :)  ");
blinker();
}else{
Serial.println(" sent failed :( " );
blinker();
blinker();
}
}

void loop()
{
send_data();
delay(4000);
}
-------------------------------------

Ricevitore
--------------------------------------
#include "EEPROM.h"
#include "cc1101.h"

// The LED is wired to the Arduino Output 4 (physical panStamp pin 19)
#define LEDOUTPUT 4

// The connection to the hardware chip CC1101 the RF Chip
CC1101 cc1101;

byte b;
byte i;
byte syncWord = 199;
long counter=0;
byte chan=0;

// a flag that a wireless packet has been received
boolean packetAvailable = false;

void blinker(){
digitalWrite(LEDOUTPUT, HIGH);
delay(100);
digitalWrite(LEDOUTPUT, LOW);
delay(100);
}

/* Handle interrupt from CC1101 (INT0) gdo0 on pin2 */
void cc1101signalsInterrupt(void){
// set the flag that a package is available
packetAvailable = true;
}

void setup()
{
Serial.begin(38400);
Serial.println(" start ");

// setup the blinker output
pinMode(LEDOUTPUT, OUTPUT);
digitalWrite(LEDOUTPUT, LOW);

// blink once to signal the setup
blinker();
// initialize the RF Chip
cc1101.init();

cc1101.setSyncWord(&syncWord, false);
cc1101.setCarrierFreq(CFREQ_433);
cc1101.disableAddressCheck(); //if not specified, will only display " packet received "
//cc1101.setTxPowerAmp(PA_LowPower);

Serial.print(" CC1101_PARTNUM " ); //cc1101=0
Serial.println(cc1101.readReg(CC1101_PARTNUM, CC1101_STATUS_REGISTER));
Serial.print(" CC1101_VERSION " ); //cc1101=4
Serial.println(cc1101.readReg(CC1101_VERSION, CC1101_STATUS_REGISTER));
Serial.print(" CC1101_MARCSTATE " );
Serial.println(cc1101.readReg(CC1101_MARCSTATE, CC1101_STATUS_REGISTER) & 0x1f);

attachInterrupt(0, cc1101signalsInterrupt, FALLING);

Serial.println(" device initialized ");
}

void ReadLQI()
{
byte lqi=0;
byte value=0;
lqi=(cc1101.readReg(CC1101_LQI, CC1101_STATUS_REGISTER));
value = 0x3F - (lqi & 0x3F);
//value = 0x3F – (lqi & 0x3F);
Serial.print(" CC1101_LQI " );
Serial.println(value);
}

void ReadRSSI()
{
byte rssi=0;
byte value=0;

rssi=(cc1101.readReg(CC1101_RSSI, CC1101_STATUS_REGISTER));

if (rssi >= 128)
{
value = 255 -rssi;
//value = 255 – rssi;
value /= 2;
value += 74;
}
else
{
value = rssi/2;
value += 74;
}
Serial.print(" CC1101_RSSI " );
Serial.println(value);
}

void loop()
{
if(packetAvailable){
Serial.println(" packet received ");
// Disable wireless reception interrupt
detachInterrupt(0);

ReadRSSI();
ReadLQI();
// clear the flag
packetAvailable = false;

CCPACKET packet;

if(cc1101.receiveData(&packet) > 0){
if(!packet.crc_ok) {
Serial.println(" crc not ok ");
}

if(packet.length > 0){
Serial.print(" packet: len " );
Serial.print(packet.length);
Serial.print( " data: " );
for(int j=0; j<packet.length; j++){
Serial.print(packet.data[j],HEX);
Serial.print( " " );
}
Serial.println(" . ");
}
}
// Enable wireless reception interrupt
attachInterrupt(0, cc1101signalsInterrupt, FALLING);
}
}


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