Jumping Jack Flash weblog

How to paste Word tables into Excel preventing Excel from splitting cells

Posted in Programmazione by jumpjack on 24 aprile 2013

When you copy a table from Word to Excel, if a cell contains carriage returns it will be splitted into two or more cells when pasting into Excel.

Following macros prevent such behaviour, by temporary replacing carriage returns into clipboard by specific strings and then restoring them once table is copied into Excel.

==== Insert into Word Module =====

Public Sub CopyTableForExcel()
' Select whole table in Word and start this macro to copy table in clipboard.
' Then switch to Excel and run PasteTableFromWord macro

Dim Newdoc As Document
If Selection.Information(wdWithInTable) = False Then
   MsgBox "Selection is not in a table.  Exiting macro."
   Exit Sub
End If
Selection.Tables(1).Select ' Select whole table
Selection.Copy
Set Newdoc = Documents.Add(, , , True) ' Create a temporary document to store modded table.
Newdoc.Activate
Selection.Paste ' Paste the table in the new document.
 
   ' Replace all carriage returns (ascii 13) by "[exVbLF]" string:
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = Chr(13)
        .Replacement.Text = "[exVbLF]"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    
   ' Replace all carriage returns (VbCR) by "[exVbLF]" string:
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = vbCr
        .Replacement.Text = "[exVbLF]"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    
' Copy modded table into clipboard:
    ActiveDocument.Tables(1).Select
    Selection.Copy
 
    ActiveDocument.Close (wdDoNotSaveChanges) ' Close temporary document
    MsgBox ("Table copied into clipboard. Start Excel macro to paste the table into Excel.")
End Sub
  

 

==== Insert into Excel Module ====

 
Sub PasteTableFromWord()
' Use in Excel after using CopyTableForExcel() in Word
    ActiveSheet.Paste ' Paste modded table
    Cells.Select ' select whole sheet (necessary?)
 
' Restore carriage returns inside cells:
    Selection.Replace What:="[exVbLf]", Replacement:=vbLf, LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
 
' Fix the table
    Selection.EntireColumn.AutoFit
    Rows("1:1").EntireRow.AutoFit
    With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlTop
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
End Sub

Installation:

– Copy first macro into a Word module in NORMAL.DOT (common to all documents)

– Copy second macro into an Excel module in PERSONAL.XLS (common to all documents)

Usage:

– Select table in Word

– Start CopyTableForExcel macro

– Switch to Excel destination sheet

– Start PasteTableFromWord macro

Following version of the Macros also turns all “.” (dots)  in the Word table into “,” (commas) in Excel table: this is needed because my Italian version of Excel uses commas to separate decimals and I often have to copy english-formatted tables (with dots for decimals) into italian-formatted Excel sheets (with commas for decimals).

==== Insert into Word Module =====

Public Sub CopyTableForExcel()
' Select whole table in Word and start macro to copy table in clipboard.
' NOTE: macro also replaces "." (dots) by "," (commas), as it is used to paste
' tables into Italian version of Excel, which uses commas rather than dots
' to separate decimals; comment-out the related part of the code if your Excel
' version uses dots for decimals.
 
Dim Newdoc As Document
    If Selection.Information(wdWithInTable) = False Then
        MsgBox "Selection is not in a table.  Exiting macro."
        Exit Sub
    End If
    Selection.Tables(1).Select ' Select whole table
   Selection.Copy
Set Newdoc = Documents.Add(, , , True) ' Create a temporary document to store modded table.
Newdoc.Activate
Selection.Paste ' Paste the table in the new document.
 
   ' Replace all carriage returns (ascii 13) by "[exVbLF]" string:
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = Chr(13)
        .Replacement.Text = "[exVbLF]"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    
   ' Replace all carriage returns (VbCR) by "[exVbLF]" string:
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = vbCr
        .Replacement.Text = "[exVbLF]"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    
 ' Replace all dots by commas; needed to translate from UK decimal to Italian decimal numbers.:
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "."
        .Replacement.Text = ","
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
 
 
' Copy modded table into clipboard:
    ActiveDocument.Tables(1).Select
    Selection.Copy
 
    ActiveDocument.Close (wdDoNotSaveChanges) ' Close temporary document
    MsgBox ("Table copied into clipboard. Start Excel macro to paste the table into Excel.")
End Sub
 
 
 
==== Insert into Excel Module ====
 
Sub PasteTableFromWord()
' Use in Excel after using CopyTableForExcel() in Word
    ActiveSheet.Paste ' Paste modded table
    Cells.Select ' select whole sheet (necessary?)
 
' Restore carriage returns inside cells:
    Selection.Replace What:="[exVbLf]", Replacement:=vbLf, LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
 
' Fix the table
    Selection.EntireColumn.AutoFit
    Rows("1:1").EntireRow.AutoFit
    With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlTop
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
End Sub

PowerDuino Standalone, ecco i sorgenti

Posted in hardware, Programmazione by jumpjack on 7 aprile 2013

AGGIORNAMENTO 29 marzo 2014 – Arduino Day 2014

Presentato in fiera progetto dimostrativo basato su sensori di luce.

power1

 

Il progetto dimostrativo utilizza due fotoresistenze e un sensore con accelerometro e bussola.

Le fotoresistenze mostrano come si possa programmare Arduino per rilevare la luce o il buio e per controllare apparecchi a 330V (lampadine);

PowerDuino è una dimostrazione di utilizzo del rilevamento di luce : ad ogni lampeggio del led di un contatore di energia, arduino incrementa un contatore, riuscendo così a calcolare la potenza istantanea e l’energia consumata.

Il sensore con bussola+accelerometro serve a illustrare la facilità con cui è possibile interfacciare sensori ad Arduino: bastano due fili per i sensori dotati di protocollo I2C; altri due fili servono per la massa e l’alimentazione. Opportune librerie permettono di pilotare i sensori con facilità.

Il sensore in uso nel progetto dimostrativo è un LSM303D, utilizzato con questa libreria.

 

Sketch dimostrativo:

 

#include <Wire.h>
#include <LSM303.h>
LSM303 compass;
char report[80];
int ControlPin=13;
int RelayOne=7;
int RelayTwo=8;
int SensorOne=A1; // Light sensor one (SHORT RESISTOR - DARKNESS)
int SensorTwo=A2; // Light sensor two (LONG RESISTOR - LIGHT)
int GND_One=11; // For light sensor one (SHORT RESISTOR - DARKNESS)
int GND_Two=12; // for light sensor two (LONG RESISTOR - LIGHT)
int GND_Three=6; // For I2c Sensor
int DARKNESS_THRESHOLD = 200; // if above, it's dark, turn on the light
int LIGHT_THRESHOLD = 450; // if below, light is detected, turn on the lamp!
void setup()
{
 Serial.begin(9600);
 Serial.println("Init wire...");
 delay(1000);
 Wire.begin();
 delay(1000);
 Serial.println("Init compass...");
 compass.init();
 delay(1000);
 Serial.println("Enable compass...");
 compass.enableDefault();
 delay(1000);
 Serial.println("Init vars...");
 pinMode(ControlPin,OUTPUT); //Led
 pinMode(RelayOne,OUTPUT); //Xboard relay 2
 pinMode(RelayTwo,OUTPUT); //Xboard relay 2
 pinMode(GND_One,OUTPUT);
 digitalWrite(GND_One,LOW);
 pinMode(GND_Two,OUTPUT);
 digitalWrite(GND_Two,LOW);
 pinMode(GND_Three,OUTPUT);
 digitalWrite(GND_Three,LOW);
 pinMode(SensorOne,INPUT);
 pinMode(SensorTwo,INPUT);
 digitalWrite(ControlPin,HIGH);
 digitalWrite(SensorOne,HIGH);
 digitalWrite(SensorTwo,LOW);
 delay(1000);
 digitalWrite(ControlPin,LOW);
 Serial.println("Program started!");
}
void loop()
{
 compass.read();
snprintf(report, sizeof(report), "A: %6d %6d %6d M: %6d %6d %6d",
 compass.a.x, compass.a.y, compass.a.z,
 compass.m.x, compass.m.y, compass.m.z);
 Serial.print("ResistenzE; ");
 Serial.print(analogRead(SensorOne));
 Serial.print(",");
 Serial.print(analogRead(SensorTwo));
 Serial.print(",");
 Serial.println(report);
 
 
// GRAVITY //////////////// 
if (compass.a.z<0) {
 digitalWrite(RelayOne,HIGH);
}
if (compass.a.z>0) {
 digitalWrite(RelayOne,LOW);
}
// COMPASS ////////////////
if (compass.m.x<0) {
 digitalWrite(RelayTwo,HIGH);
}
if (compass.m.x>0) {
 digitalWrite(RelayTwo,LOW);
}

// DARKNESS /////////////////
if (analogRead(SensorOne)>DARKNESS_THRESHOLD) {
 digitalWrite(RelayOne,HIGH);
}
if (analogRead(SensorOne)<=DARKNESS_THRESHOLD) {
 digitalWrite(RelayOne,LOW);
}
// LIGHT ///////////////////
if (analogRead(SensorTwo)<LIGHT_THRESHOLD) {
 digitalWrite(RelayTwo,HIGH);
}
if (analogRead(SensorTwo)>=LIGHT_THRESHOLD) {
 digitalWrite(RelayTwo,LOW);
}
 delay(100);
}

power2

power3

 

Powerduino può essere usato per disegnare la curva di carico di lavatrice e lavastoviglie, scoprire quando e per quanto tempo assorbono 2000W, e quindi scoprire di quanto va sfalsata l’acdensione dei due elettrodomestici in modo che possano lavorare insieme senza far saltare il contatore.
image

image

============================

Dopo la presentazione all’Arduino Day 2013, ecco i sorgenti del PowerDuino Standalone:

DOWNLOAD PowerDuino 0.3.2

E’ sufficiente caricarlo(*)  su un normale Ardulog (meglio evitare l’Openlog, a meno di essere in grado di effettuare microsaldature a mano…), e immediatamente l’Ardulog si trasformerà da logger seriale a logger standalone, ossia in grado di registrare autonomamente dati dal pin analogico A1, senza bisogno di una Arduino esterna di supporto.

Al momento il listato è ancora un po’ primitivo, non è assolutamente ottimizzato, al contrario di quello originale Openlog 3.0  superottimizzato a basso livello in modo da ridurre al minimo i consumi del processore (quello distribuito con Ardulog è invece molto più rudimentale).

In futuro avrei in mente di realizzare un listato generico che, anzichè registrare specificamente la potenza misurata da un energy monitor esterno, semplicemente registri i dati grezzi letti dai 4 pin analogici e due digitali presenti su Ardulog: in questo modo, Hobbytronics, autore dell’Ardulog,  potrebbe vendere il prodotto in versione “standalone” oltre che “serial”, e tale versione sarebbe adatta per qualunque applicazione: basterebbe demandare al file excel in cui si copiano i dati il compito di elaborarli in modo opportuno. Il file conterrebbe infatti semplicemente una riga per ogni lettura, effettuata ogni TOT millisecondi, e in ogni riga ci sarebbero i valori dei pin.

Bisogna però decidere in che modo impostare l’intervallo dall’esterno senza dover riprogrammare l’Ardulog; potrei ad esempio usare i due pin digitali per impostare 4 livelli diversi di precisione (2 bit= 4 valori), oppure i due digitali più A1, che sta fisicamente separato dagli altri, in modo da poter impostare 8 valori (2^3=8), semplicemente a seconda di quali pin sono a massa e quali a +Vcc.

Spero di riuscire a farmi un’idea più chiara in tempo per la prossima “uscita pubblica” di PowerDuino, che probabilmente sarà in occasione della “Geek Sunday” in programma a Roma per il prossimo 5 maggio.

 

(*) Per caricare uno “sketch” (=listato=programma) su Ardulog, bisogna collegarlo al PC tramite circuito adattatore FTDI (RS232/TTL), oppure tramite una Arduino Uno priva del microchip, collegando i pin RX-RX, TX-TX, Vcc-3.3V, GND-GND, RST-RESET, e impostando Arduino Uno sull’IDE.

Energy Logger fai-da-te, da quadro o a batteria.

Posted in hardware, Programmazione by jumpjack on 31 marzo 2013

Dopo un anno di prove, ricerche, esperimenti e sbattimenti, ho finalmente il piacere di annunciarvi che il primo logger “professionale” di energia a basso costo è ufficialmente una realtà!

Prevedo di mettere in commercio due versioni:

– autonoma, per interni; autonomia infinita, in quanto preleva la tensione direttamente dalla corrente di casa; è contenuto in un normale modulo DIN (dimensioni: 1+1.5, da montare nel quadro elettrico), al quale bisogna semplicemente collegare 4 fili: due che vengono dal contatore ENEL, due che vanno alle utenze di casa. Dotato di cicalino interno di allarme per sovraccarico.  Contiene una SD card estraibile che memorizza i dati. Al momento registra solo i Wh tramite energy monitor esterno interfacciato otticamente, ma prevedo, in caso di interesse, un aggiornamento per misurazione anche di V e CosFI.
Il costo complessivo risulterebbe di 65 euro + spedizione.

– a batteria, autonomia di circa una settimana con una batteria da 9V, o… infinita con un pannello solare da 1W (il consumo è di max 10 mA, tensione ammessa tra 3,3 e 12V); basta collocarlo vicino al contatore ENEL, incollare il sensore sul LED del contatore, ed è tutto. A registrazione ultimata, si stacca la batteria, si preleva la SD Card e si leggono i dati sul PC, eventualmente facendo grafici con Excel.
Questa versione costerebbe (se risultasse esserci mercato…) 30 euro + spedizione.

Con una SD card da 2 GB potrebbe registrare teoricamente dati per 2000 giorni.

Il vantaggio maggiore su qualunque altro modello in commercio è la programmabilità: chi ha competenze su Arduino potrà espandere/migliorare a piacimento il logger. Ma soprattutto, potrà costruirselo da sè a prezzo di costo scaricandosi schemi e sorgenti che pubblicherò tra una settimana.
Lo svantaggio è il dover “tagliare i fili” dell’impianto per collegarlo, ma è necessario per avere l’accuratezza necessaria; in ogni caso posso facilmente realizzare una più “classica” versione con pinza.

Presenterò i prototipi sabato 6 aprile ad Arduino Day 2013, nel pomeriggio.
Nel frattempo accetto consigli, suggerimenti e richieste.

Appunti su OpenLog (e ArduLog)

Posted in Programmazione by jumpjack on 29 marzo 2013

Tempo fa ho acqustato un Openlog della Sparkfun, un logger seriale arduino-based.

Non sono mai riuscito a farlo funzionare, però nel frattempo tanta gente ci si è rotta la testa trovando un sacco di problemi, e risolvendoli alcuni; le soluzioni sono sparse nellalunghissima pagina dell’openlog, provo a riassumerle qui sotto; nel frattempo, ho ordinato invece un ARDUlog, che essendo un successore sembra un po’ migliore: ha dei fori per avvitarlo a un supporto, e ha vari pin analogici di ingresso, quindi è predisposto a livello hardware per diventare un logger standalone, anche se ancora non esiste un firmware adatto.

 

Openlog:

Ardulog 1.0:

 

 

Ardulog 2.0 (notare l’inversione di TX e RX per coincidere con la board FTDI):

PROBLEMA 1 – Condensatori di disaccoppiamento sull’alimentazione:

Member #124829 | about 3 months ago 1

I am using the open log to log weather and cosmic ray data once a minute. I have an Atmega 328 connected on the bread board to the open log for data logging, and to a FTDI header for programming. The open log log’s data fine when I have the FTDI adaptor (DEV-09716) attached, but doesn’t log anything when It isn’t attached. I assume I have a hardware failure, and I forgot to connect something to the open log that the FTDI is connecting for me, but I checked and the TX and RX pins are connected properly, and so are GND and VCC. Right now my only guess is that the FTDI is putting more capacitance on the power supply that causes it to start working, but I haven’t tested it yet. However when I measured the voltage W/ the FTDI adaptor both the TX and RX lines sat at 4.7 to 4.9V and W/O it was 3.3 for both of them. Can I please get some help?

I fixed the problem, there wasn’t enough capacitance and the bypass caps on the FTDI were making the open log work. Make sure you have bypass caps on your power supply, I added a 10uf about 10cm of wire away and a 0.1uf right on the header of the open log and it started working perfectly.

PROBLEMA 2 – Livelli a 5V o 3,3 V?

tsm | about a month ago * 1

I’m getting a stream of 1s back from the data logger over serial.

I’m using a 5V Arduino, powering the OpenLog off of its 5V pin, and sending serial over to it and getting serial back. When the TX from the Arduino is not connected to the RX on the OpenLog, the OpenLog reports “12<”. However, when I connect the Arduino’s TX pin to the OpenLog’s RXI pin, I only getting “11111111….”

While the datasheet says that the RXI pin can take up to 6V, I notice that the schematic shows regulation of VCC down to 3.3V, while the RXI pin undergoes no translation and is connected directly to the ATMEGA. This makes me think that in fact a 5V TTL signal from the Arduino is too high and is causing the ATMEGA to result. Just a guess though.

Has anyone else seen this? The closest thing I found was unanswered (https://github.com/sparkfun/OpenLog/issues/138).

For reference, everything works correctly when I use a 3.3V FTDI.

I just soldered up a TTL logic level shifter (the Sparkfun one), taking my 5V TTL on the Arduino side down to 3.3V on the OpenLog side, and now it’s working. It looks like the 5V serial signal in fact is unacceptable to the ATMEGA, despite that the datasheet suggests it can accept 6V. Big debugging nightmare! Does anyone k

PROBLEMA 3 – Malfunzionamento a batterie

This is working when using USB power, but not battery power. Setup:

5V Arduino’s TX –> logic level shifter –> OpenLog’s RX

OpenLog’s TX –> resistor –> Arduino RX

Arduino’s reset pin –> logic level shifter –> OpenLog’s reset pin

tsm | about 2 weeks ago 1

I had a high-current device on the same bus. Interestingly, a separate mistake was drawing the 3.3V bus to 5V, but when the high-current device was on the line, it was pulling too much current and bringing the bus back down closer to 3.3V. When I used the battery, which delivered more current, this didn’t happen, and so the OpenLog would reset. Nasty problem. Fixed with a separate bus for that current-hungry component.

PROBLEMA 4 – flashing firmware con AVRDUDE:

gek | about 3 years ago 1

I’m using a FTDI 3.3v (DEV-09717) cable connected to my OpenLog. Using teraterm on COM10 I can make a connection to the device. all is good.
to upgrade the firmware I’m using the follow cmd:
avrdude.exe -p atmega328p -P COM10 -c stk500v1 -b 57600 -Cavrdude.conf -U flash:w:main.hex
and get this response:
avrdude.exe: ser_open(): can’t open device “COM10”: The system cannot find the file specified.
I have put libusb0.dll in the system32 directory.
is the problem that arvdude can’t handle high number com ports?
thank you
gek

I did a little hacking with regedt32 and changed the comport from 10 to 3. I can now update the firmware.
see:
http://www.ftdichip.com/Documents/AppNotes/AN_132_Re-Assigning_COM_Port_Numbers_Using_Registry.pdf
The registry remembers all FTDI converters that have been used. The driver does not reassign unused comport numbers. In some cases that a good thing. It would be nice to be able to “reserve” a set of comport numbers to be reused as devices are used and removed.

PROBLEMA 5 – flashing firmware

kzwinn | about 2 years ago 1

Hi,
Anyone encountered this problem while flashing the firmware? Thanks!

C:\openlog>avrdude.exe -p atmega328p -P COM6 -c stk500v1 -b 57600 -Cavrdude.conf
-U flash:w:main.hex
avrdude.exe: stk500_getsync(): not in sync: resp=0x00
avrdude.exe: stk500_disable(): protocol error, expect=0x14, resp=0x51

  • ok..solved. you need to connect all pins of FTDI Basic board and openLog. Not just TX/RX/5V/GND won’t be able to download.
    https://github.com/nseidle/OpenLog/wiki/Datasheet
    Under this topic
    How do I attach a FTDI Basic board to OpenLog for configuring and bootloading?

    PROBLEMA 6 – output 1, no prompt, no logging

    Lubin | about a year ago * 1

    Hello,

    I get an OpenLog with firmware v1.51 as I remmeber. I have a standard FTDI cable.

    I downloaded newer firmware through the git repository. I can upgrade sucessfully to any firmware version. I Only have Rx-Tx wires with Vcc-GND. I power up openlog whild pressing enter with: avrdude -p atmega328p -P COM2 -c stk500v1 -b 57600 -Cavrdude.conf -U flash:w:main.hex

    It’s programming without error. However, open log is only showint one 1 at hyperterm when starting. I do not have anymore 12>.

    What’s going on ? any ideas ?

    • Find out : the computer corrupted the Sd card. reformating the card make its working with latet firmware.

CONSIGLIO 1

Just got it working! Very nice.
Couple of hints for others.
—Default baud is 9600 8n1.
—Make sure your card is formated as fat16.
—If you hook it directly up to FTDI Basic don’t forget to cross the rx and tx lines.

CONSIGLIO 2:

to format FAT16 with dos in xp:
c:>format e: /fs:fat

INFO:

STAT1 LED is the LED right of the word OpenLog and is sitting on PD5 (Arduino D5). This LED toggles on/off every time a new character is received. This LED helps troubleshoot and indicate serial communication is working.
STAT2 LED is the LED left of the word OpenLog and is sitting on PB5 (Arduino D13). This LED is attached to the SPI Serial Clock line. You will see this LED flash rarely. It only turns on when the SPI interface is active and this is rare as the OpenLog buffers 512 bytes at a time before recording to the SD card. Recording 512 bytes is very fast so the LED is on for very little.

Nate | about 3 months ago 1

OpenLog expects TTL voltage levels. RS232 will not work and could (maybe) harm the OpenLog (probably not though). You’ll need a MAX3232 or a shifter circuit.

UPLOAD FIRMWARE SENZA AVRDUDE:

Hobbytronics | last year 1

If you want to upgrade the firmware on this board with the latest version, you don’t have to go through the hassle of installing a custom version of Arduino as suggested. The compiled hex file is included in the download. There is a great little program called XLoader (http://xloader.russemotto.com/) which you can use to download the firmware into the openlog. (No avrdude knowledge required)

PinguiLogger – registrazione corrente e tensione con board Pinguino

Posted in hardware, Programmazione by jumpjack on 12 febbraio 2013

Sta per vedere la luce il mio PinguiLogger 🙂 , un aggeggino che permette di registrare correnti fino a 70 A e tensioni fino a 60V su scheda SD, per analizzare cosa combina il mio scooter elettrico.

Al momento il listato C è già pronto e funzionante su scheda Arduino, anche se si limita a registrare i dati senza elaborarli, quindi registra solo valori compresi tra 0 e 1023 da due sensori di corrente e da due partitori di tensione 1:21, creando un file .CSV; poi bisogna importare il file in Excel e fare i dovuti calcoli.

I campi registrati nel file sono:

  • tempo (millisecondi)
  • riferimento 1
  • corrente 1
  • tensione 1
  • riferimento 2
  • corrente 2
  • tensione 2

Il “riferimento” è il pin di riferimento dei sensori di corrente, il cui valore dovrebbe servire, se ho ben capito, a indicare a quale valore del pin di output corrisponde una corrente nulla (perchè immagino che il “punto 0″ dipenda dalla tensione effettiva di alimentazione”, ma devo ancora studiare bene la faccenda…

(more…)

Posted in Programmazione by jumpjack on 14 ottobre 2011

Girare un filmato in HD con un oggettino che sta in una tasca.

Comunicare con milioni di persone nel mondo a un click del mouse.

Usare un pezzo di plastica grande quanto un’unghia per contenere i libri di una biblioteca intera.

Farsi dire la strada di casa da uno “strano oggetto elettronico parlante”.

Niente di tutto questo, nè migliaia di altre cose, sarebbero forse oggi possibili se non fosse stato per lui; eppure praticamente nessuno sa chi era. Invece tutti conoscono il nome di una persona… che non ha inventato niente, ma ha convinto tutti di averlo fatto.

Se c’e’ qualcuno che tutti dovrebbero ringraziare oggi, dai tecno-maniaci alla massaia che usa il cellulare per chiamare il nipote, non è certo il genio del marketing Steve Jobs, che ha fatto della tecnologia un fenomeno social, ma uno dei tre geni dell’informatica che la tecnologia moderna la resero possibile, quando ancora l’informatica quasi non esisteva, inventando il Linguaggio C: Brian Kernighan, Ken Thompson e Dennis MacAlistair Ritchie.

Cos’è il linguaggio C?

E’ semplicemente lo strumento che permette ai programmi per computer di esistere. Ai programmi per computer, per cellulari, per decoder TV, per lavatrici, e per qualunque oggetto dotato di un microprocessore, o cervello elettronico.

D’accordo, forse non è letteralmente così, esistono decine di altri linguaggi di programmazione, ma il C è forse uno dei più diffusi, e sicuramente uno dei più famosi tra i programmatori; inventato nel 1972, ancora oggi sopravvive nei moderni C++ e C#, grazie alla sua versatilità e alla sua potenza, e milioni, forse miliardi di righe di codice sono state scritte in questi quasi 40 anni, per fornire a milioni di persone le comodità della tecnologia, senza che esse neanche sapessero cos’è un linguaggio di programmazione, cos’è il Linguaggio C, e chi era Dennis MacAlistair Ritchie. Persino un linguaggio il cui nome non sembra avere niente a che fare col C, sembra invece avere in esso le sue radici: il Java, oggi installato forse su alcuni miliardi di apparecchi nel mondo, televisori inclusi.

La frase con sui “dmr” salutò il Mondo col suo primo programma in C, “Hello World!”, resterà per sempre nel bagaglio culturale di tutti i programmatori, anche di quelli che neanche sanno chi, quando e perché la usò.

Adesso il Mondo Informatico saluta Dennis con un “Bye, dmr!

I computer IBM eguagliano il cervello umano… ma l’IBM tranquillizza: vince l’uomo

Posted in intuizioni, Programmazione, Scienza by jumpjack on 22 agosto 2011

Lo scorso 23 febbraio  il computer IBM “Watson” ( http://ibm.com/watson/it ) è balzato agli onori delle cronache per un clamoroso risultato: partecipando al quiz televisivo Jeopardy (l’originale da cui nacque l’italiano Rischiatutto) come un “comune” concorrente, cioè semplicemente ascoltando le domade fatte a voce dal presentatore, è riuscito a capirle e a fornire le risposte giuste, risultando alla fine vincitore contro i concorrenti umani, aggiudicandosi il montepremi di un milione di dollari.

Ecco l’inquietante video (nonchè umililante per i concorrenti umani) della trasmissione:

Un risultato così strabiliante… che l’IBM ha sentito la necessità di tranquillizzare la gente: è già da alcune settimane infatti che pubblica questo “manifesto” che suona però come un poco tranquillizzante “niente panico”:


Ma la ricerca non si ferma: pochi giorni fa l’IBM stessa ha fatto un altro annuncio clamoroso: è riuscita a fabbricare dei chip (completamente elettronici, quindi senza componenti organiche e senza collegamenti a neuroni “veri”) in grado di riprourre i processi cognitivi del cervello umano.

Per il momento ogni chip riproduce solo 256 (=2^8)  neuroni e al massimo 262’144 (=2^18) sinapsi, ma visto che ogni neurone umano ha al massimo 100’000 sinapsi, il traguardo raggiunto è sensazionale, perchè significa che adesso esiste la capacità tecnica di riprodurre un cervello umano funzionante!

Un cervello umano completo contiene fino a 100 miliardi di neuroni, ognuno con fino a 100’000 sinapsi. Si tratterebbe quindi di collegare tra loro circa 400 milioni di chip da 256 neuroni ciascuno: una cifra esorbitante, che quindi rende (fortunatamente?) ancora non troppo vicina la realizzazione di un cervello umano artificiale.

C’è da chiedersi però se questa ricerca non verrà “insabbiata” come probabillmente è già successo per quella del robot QRIO della Sony, che all’apice del suo sviluppo, quando era ormai prossimo alla commercializzazione, è stato cancellato dai progetti Sony. Cancellato… o forse “passato” a qualche ente che potrebbe avere interesse a disporre di un robot umanoide in grado di camminare e correre in modo autonomo, seppur ancora non troppo disinvolto?

QRIO

QRIO

 

E che tipo di “macchina” risulterebbe dall’unione di un androide bipede autonomo con un cervello umano artificiale?

Sarebbe ancora una macchina? Sarebbe ancora tenuta a rispettare la programmazione? Vorrebbe ancora rispettare la sua programmazione?

La discussione su “dove risieda la mente” dentro a un cervello, e soprattutto dove e come sia “codificata” la morale in un cervello umano, va avanti da alcune migliaia di anni, dai tempi degli antichi Greci. Il cervello è solo una macchina, e i pensieri solo scambi elettrochimici, oppure esite un’ “anima”, o una “entità” che noi chiamiamo “mente”? E’ sufficiente riprodurre bit per bit, neurone per neurone, questa “macchina”, per creare un cervello che sia anche in grado di provare emozioni e sentimenti, oltre che di ragionare? Sarà in grado di avere pensieri propri? Ma cos’e’ che definisce “proprio” e “spontaneo” un pensiero? Siamo noi  creare i nostri pensieri e a produrre le nostre idee, o si tratta solo di processi elettrochimici casuali che poi noi “elaboriamo”? Ma questa elaborazione stessa, è fatta di meri processi elettrochimici, oppure….????

Migliaia di domande, e c’è da chiedersi se davvero vogliamo avere le risposte.

Io personalmente vorrei non dovermi neppure fare le domande!!!

Cyborg terminator

Cyborg del film Terminator

"L'uomo bicentenario"

"L'uomo bicentenario": nel film, tratto da un romanzo di Isaac Asimov del lontano 1976, il robot chiede al suo costruttore di essere "aggiornato" ripetutamete fino a diventare umano.

 

Isaac Asimov è forse il più famoso autore di fantascienza ad aver trattato in modo continuato, approfondito e con approccio scientifico il “problema” robot; non robot com quelli di ieri, che sono al massimo bracci meccanici automatici e “pseudo-intelligenti”, ma i robot di domani… o forse, ormai, di oggi: di forma umanoide, e dotati di intelligenza vera, se non addirittura creativa (sebbene non esista una esatta definizione di “intelligenza”, men che meno “intelligenza vera“).

Ma fin dai suoi primi romanzi, c’è sempre stato un fattore comune nella “robotica asimoviana”: la tre leggi della robotica, requisito indispensabile e imprescindibile, senza il quale nessun robot è autorizzato ad uscire dalle fabbriche (del futuro). Queste tre leggi sono ormai così “antiche” e conosciute che ci sono persone che pensano che siano reali, e cioè che un robot intelligente non possa in alcun modo nuocere a un essere umano. Le tre leggi della robotica, completamente frutto della fantasia di Asimov, dicono infatti:

  1. Un robot non può recar danno a un essere umano né può permettere che, a causa del proprio mancato intervento, un essere umano riceva danno.
  2. Un robot deve obbedire agli ordini impartiti dagli esseri umani, purché tali ordini non contravvengano alla Prima Legge.
  3. Un robot deve proteggere la propria esistenza, purché questa autodifesa non contrasti con la Prima o con la Seconda Legge.

Sfortunatamente, sebbene sembrino “perfette”, è Asimov stesso, in molti racconti, a mostrarne la debolezza intrinseca, che fa sì che molto spesso i robot che le adottano finiscano sempre, in un modo o nell’altro, per nuocere all’essere umano, sebbene “a fin di bene”; un tema ripreso anche in un vecchio film italiano con Alberto Sordi, “Io e Caterina“, in cui la badante robotica era così premurosa… che alla fine diventa la guardiana del suo datore di lavoro, che si ritrova invece ad essere prigioniero. Ma “per la sua sicurezza”!

Alberto Sordi in "Io e Caterina"

Un altro tema spesso affrontato dalla fantascienza è invece la superiorità delle scelte robotiche rispetto a quelle umane, che indurrebbe le intelligenze robotiche a ritenere l’umanità un problema per il mondo, e quindi alla fine risulta necessario eliminarla. E’ così che nasce la nota saga di Terminator, che ha debuttato sul grande schermo nel lontano 1984, ma ancora nel 2009 ha avuto un quarto seguito, e ne sono in programma altri. Per l’appunto nel secondo film della serie, “Il giorno del giudizio”, si scopre che alle origini di Skynet, la rete mondiale di computer e robot che dichiara guerra all’umanità, è stata resa possibile dalle ricerche di uno scienziato; come si legge su Wikipedia:

[…]l’uomo più direttamente responsabile si chiama Myles Dyson, il direttore della Cyberdyne Systems Corporation, il quale, dieci anni prima, rinvenne i rottami del primo Terminator (un chip e un braccio), da cui sono partite le ricerche per lo sviluppo di un esercito di Terminator, lo stesso che nel futuro daranno battaglia all’umanità, nonché alle ricerche che negli anni novanta stanno portando alla creazione di Skynet su commissione del governo degli Stati Uniti.

Neppure la fantasia hollywoodiana fu in grado, all’epoca, di far inventare all’uomo il “chip pensate”: in uno strano paradosso temporale, il chip viene infatti non inventato, ma ricostruito a partire da un chip esistente arrivato dal futuro, lasciando così “alla fantasia del lettore” capire chi e come  quando, davvero, ha inventato il chip che, nel 2029, ha dato il via alla guerra dei robot contro gli umani.

Ma ora forse sappiamo che è stata l’IBM.

Con buona pace di Kurzweil, che prevedeva, fino a poco tempo fa, che avremmo dovuto aspettare fino al 2029 (? per l’appunto ?!?) per vedere un cervello umano riprodotto da un PC da tavolo. Forse ha sbagliato le previsoini, e succederà prima?

 

Proiezione di crescita della potenza di calcolo dei computer

Proiezione di crescita della potenza di calcolo dei computer

Problemi vari con scheda Arduino

Posted in arduino, Programmazione by jumpjack on 4 dicembre 2010

Lista di alcuni problemi trovati nell’utilizzare la scheda Arduino, con relative soluzioni.

Scheda utilizzata: Arduino Uno

Sistema utilizzato: PC AMD 2.8 GHz, 3 GB RAM, Windows XP SP3

1)
PROBLEMA: Impossibile utilizzare l’IDE. Quando si prova ad avviarlo, succede questo:

*doppio click su arduino IDE;
*compare splash screen;
*rimane lì per 5 o 6 minuti
*”Bling” (segnale acustico di errore): dialog di errore, ci sono stati problemi nell’avvio dell’applicazione, si può solo premere OK;
*nuovo doppio click su icona IDE, stessa storia.
*altro doppio click, uguale.
*dopo 10 minuti appaiono 3 finestre dell’IDE.  Shocked
*cliccando sul menu TOOLS, si ha un blocco totale dell’applicazione, il menu non si apre. Stessa cosa per tutte e tre le finestre. E’ impossibile anche chiuderle.
* dopo 10 minuti rivado su una delle finestre: si è apertoil menu TOOLS…  Huh Selezionano Arduino Uno….  si riblocca tutto…

SOLUZIONE
Se avete incontrato questo tipo di problema, e sul PC è installato il driver Bluetooth “IVT Bluseoleil”, provate a terminare manualmente i processi BlueSoleil.exe e BTNtService.exe usando il task manager (CTRL+SHIFT+ESC), e a riavviare l’IDE: questa volta dovrebbe funzionare correttamente.

 

2)
PROBLEMA: Collegandosi alla arduino tramite porta seriale “simulata” sulla porta USB, ogni volta che la porta viene aperta, la scheda si resetta e il programma a bordo riparte da capo.

SOLUZIONE: Bisogna disattivare il flag DTR (Data Terminal Ready) quando si configura la porta seriale.

ESEMPIO in Visual Basic for Applications (incluso in Microsoft Office):
Connettere prima al progetto la libreria Microsoft Comm Control (MSCOMM32.OCX) , poi usare questo codice:

Dim MSComm1 As Object

Sub ArduinoOpen()
Set MSComm1 = CreateObject(“MSCOMMLib.MSComm”)
MSComm1.Settings = “9600,n,8,1”
MSComm1.CommPort = 4
MSComm1.InBufferCount = 0
MSComm1.DTREnable = False
MSComm1.PortOpen = True
If Err Then
MsgBox “COM” & MSComm1.CommPort & “: not opened, Sorry!”
Exit Sub
End If
End Sub

Sub ArduinoClose()
MSComm1.PortOpen = False
Set MSComm1 = Nothing
End Sub

Usando invece python:

ser = serial.Serial(‘COM4′, 9600, bytesize=8, parity=’N’, stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=True)

 

3) PROBLEMA: le istruzioni su come usare la scheda ethernet sono troppo generiche: dicono “lo shield ethernet va configurato secondo come è configurata la propria rete”.

SOLUZIONE:
Serve una rapida infarinatura su indirizzi IP, indirizzi MAC e “porte”.

L’indirizzo MAC (MAC address) è un codicedi 12 caratteri che identifica ogni singolo apparato in grado di connettersi a una rete. Normalmente un apparato contiene questo codice codificato indelebilmente nei propri circuiti, ma nella scheda ethernet per arduino puo’ essere programmata a piacere; lo svantaggio è che se per sbaglio si usa un codice già usato da un altro dispositivo presente sulla rete, nessuno dei due funzionerà.

Dopo vedremo quindi come scoprire i MAC address dei propri dispositivi.

Per impostare il MAC sulla arduino,nell’esempio sottostante si usa l’istruzione:

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x23, 0x5D };

E’ preferibile usare l’indirizzo che si trova scritto sull’adesivo attaccato allo shield ethernet, per evitare conflitti e incompatibilità con altri dispositivi.

L’indirizzo IP (IP Address) è una sequenza di 4 numeri compresi tra 0 e 255, e identifica ogni dispositivo all’interno di una rete,similmente al MAC; anche questo quindi dev’essere univoco per ogni dispositivo sulla rete. Non se ne può però assegnare uno a caso: ogni rete ha TUTTI i suoi IP configurati secondo le stesse regole, che DEVONO essere rispettate se di aggiunge un dispositivo alla rete.

Queste regole sono definite dalla subnet mask, un’altra sequenza di 4 numeri, che indicano quali dei quattro numeri dell’IP sono modificabili a piacere: se la subnet mask vale 255.255.255.0,  vuol dire che per gli IP su quella rete puo’ cambiare solo l’ultimo numero, quindi si possono collegare al massimo solo 256 dispositivi.
E’ la configurazione tipica che si trova sui PC “casalinghi”.

Ogni indirizzo di rete locale avrà in genere la forma 192.168.aaa.bbb , cioe’ 192 e 168 saranno fissi e aaa e bbb potranno cambiare. Una volta stabilito che gli indirizzi devono essere nella forma, per esempio, 192.168.1.bbb, tutti gli altri dispositivi su quella rete dovranno avere un “1” come terzo numero.

Nel programma, l’IP viene impostato con:

byte ip[] = { 192,168,0, 177 };

Notare le virgole al posto dei punti.

 

La porta TCP/UDP

La “porta” è un numero compreso tra 0 e 65535, ed è solo una convenzione: non corrisponde a una “porta fisica”, cioè a un connettore. Dire che un programma “comunica sulla porta 80” vuol dire solo che si serve sempre  della porta di rete fisica, che è una sola, ma che solo programmi “in ascolto” sulla porta logica 80 potranno “leggere” i dati scritti dal programma su quella porta.

Perche’ si dica “in ascolto” se poi si parla di “leggere” e “scrivere” è un antico mistero dell’informatica… 😉

Non tutte le porte sono disponibili “a piacimento”: molte sono “riservate”, cioe’ sono comunemente usate da programmi specifici, quindi non si possono usare per programmi propri, a meno che l’intento non sia proprio quello di comunicare con quei programmi. Per esempio, i programmi di posta elettronica usano le porte 25 e 110, i browser internet la 80 e la 8080, ecc.

Nel programma, la porta è impostata con:

Server server(80);

 

Infine, il router.

Quando un PC di casa non è il solo apparecchio a connettersi a internet, ma ce n’è almeno un altro, serve un router. Questo dispositivo possiede varie porte ethernet invece che una, e ognuna di esse puo’ essere usata per permettere a un dispositivo di accedere a internet….anche una Arduino.

PERO’, le persone che da internet cercheranno di collegarsi alla nostra Arduino, prima di essa “incontreranno” il nostro router, che si frappone tra la Arduino e la rete. Dovremo quindi spiegare al router come distinguere le “cose” che da internet sono dirette al PC (le pagine web che vogliamo visitare, la posta che scarichiamo) da quelle dirette all’Arduino (tentativi di leggere e/o impostare i pin). Per farlo, ci serviamo del meccanismo di redirezionamento delle porte (port forwarding) messo a disposizione dal router.

Col port forwarding, indicheremo al router quale numero di porta si dovrà usare da internet per collegarsi alla Arduino, e quale numero di porta usa invece effettivamente l’arduino per collegarsi al router: può essere la stessa, se non ci sono altri dispositivi collegati; ma se, per esempio, sul PC è installato un webserver che comunica tramite la porta standard 80, l’arduino non potrà comunicare tramite quella porta locale, ma dovremo specificarne un’altra, che rimarrà del tutto sconosciuta a chi si collega da internet, che invece vedrà la porta pubblica impostata sul router.

 

Per conoscere IP e MAC di tutti i dispositivi collegati alla propria rete, su Windows si usa il comando

ipconfig /all

da DOS.

 

Questo è il programma di esempio fornito con la libreria ethernet di Arduino: per poterlo usare, dovremo modificare le suddette righe, qui evidenziate; il programma è stato leggermente modificato rispetto all’originale in modo da produrre una pagina HTML corretta, con giuste intestazioni e pie’ di pagina nel codice, e per fare in modo che si aggiorni automaticamente una volta al secondo, in modo da permettere di veder cambiare in tempo reale i valori.

Notare che i pin non collegati a niente avranno valori variabili in modo casuale.

 

/*
Web  Server

A simple web server that shows the value of the analog input pins.
using an Arduino Wiznet Ethernet shield.

Circuit:
* Ethernet shield attached to pins 10, 11, 12, 13
* Analog inputs attached to pins A0 through A5 (optional)

created 18 Dec 2009
by David A. Mellis
modified 4 Sep 2010
by Tom Igoe

*/

#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
//byte mac[] = { 0x00, 0x25, 0x22, 0x20, 0xee, 0x99 };
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x23, 0x5D };
byte ip[] = { 192,168,0, 177 };

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
Server server(80);

void setup()
{
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
}

void loop()
{
// listen for incoming clients
Client client = server.available();
if (client) {
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
// if you’ve gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
if (c == ‘\n’ && currentLineIsBlank) {
// send a standard http response header
client.println(“HTTP/1.1 200 OK”);
client.println(“Content-Type: text/html”);
client.println();
client.println(“<html>”);
client.print(“<head><meta http-equiv=\”refresh\” content=\”1\”></head>”);
client.println(“<body>”);
client.println(“Arduino says:”);

// output the value of each analog input pin
for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
client.print(“analog input “);
client.print(analogChannel);
client.print(” is “);
client.print(analogRead(analogChannel));
client.println(“<br />”);
}
client.println(“</body></html>”);
break;
}
if (c == ‘\n’) {
// you’re starting a new line
currentLineIsBlank = true;
}
else if (c != ‘\r’) {
// you’ve gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
}
}

 

 

Per leggere dati utili da un sensore, ci si puo’ collegare un potenziometro, collegando il connettore centrale al pin A0, uno di quelli laterali al pin +5V e l’altro al pin GND.

Esportazione appunti (Jotter) da cellulari Symbian UIQ 2.x (p800, p900, Motorola a1000)

Posted in Motorola a1000, Programmazione, Symbian, Symbian UIQ by jumpjack on 21 febbraio 2008

I telefoni UIQ 2.x usano per gli appunti un formato particolare, probabilmente proprieario, binario,
incompatibile con qualunque altra applicazione. Su alcuni modelli è FORSE possibile esportali tramite
SyncML, ma in ogni caso non sul mio Motorola a1000.

Questo è uno studio di reverse engineering sul formato del jotter, che dovrebbe portare, con l’aiuto di chi legge,
a scrivere un programma per PC in grado di esportare le note del Jotter.

Gli appunti sono organizzati su due file:

c:\system\apps\jotter\jotter.ini  File delle categorie

c:\documents\jotter\jotter  File dei dati

Il file jotter.ini sembra contenere il percorso c:\documents\jotter\jotter tante volte quante sono le
categorie esistenti, incluse quelle predefinite Generale e Personale.

E’ inoltre presente l’elenco delle categorie; ogni entry è formato da:

un  byte che indica la lunghezza del testo MOLTIPLICATA PER 4 (???)

il testo

4 byte che rappresentano l’UID della categoria; il terzo di questi byte vale 0x10 se la categoria è
“di sistema” (Generale, Personale, e forse un’altra (???)  ).

La categoria “Tutto” ha l’UID speciale ff ff 00 00

Categoria “Personale”: 01 10 00 00

Categoria “Generale”: 02 10 00 00

Sembra che, A VOLTE (???), aggiungendo una nuova categoria, questo elenco non vnga aggiornato, ma quello nuovo viene accodato a quello vecchio.

Le categorie sono elencate in ordine alfabetico.

E’ POSSIBILE che cambiando i percorsi associati alle categorie si possa usare un file Jotter
diverso per ogni categoria (???). Forse bisogna prima creare a mano le cartelle (???).

Il file Jotter contiene i dati degli appunti. Ogni entry è formato da 6 campi (elencati all’inizio del file):

Create_date (8), Update_date (8), Flags (8) , UID (4) , Sketch (6), Text_Jot (xxx)

Le date sono in formato symbian standard (vedi articolo apposito).

I flag sono sempre tutti a 00 00 00 sul mio A1000.

L’UID è ovviamente quello della categoria associata.

“Sketch” è presente solo se c’e’ un disegno associato alla nota

Text_jot è formato da 2 byte:

– se il primo vale 0x00, il secondo indica IL DOPPIO della lunghezza della stringa dell’appunto.

– se il secondo vale 0x40, il primo indica la lunghezza ESATTA della stringa

– se il secondo vale 0x4Y e il primo 0xQR, con Y=qualunque , allora la lunghezza della stringa è data da 0x0YQR

Probabilmente questo schema è descrivibile in un modo piu’ sensato, che al momento non mi viene in mente…

PROBLEMA: non tutti gli appunti rispettano questo schema: alcuni sono semplicemente stringhe
precedute dalla loro lunghezza!

Questo pero’ puo’ dipendere che il Jotter sul mio a1000 è stato “ereditato” dal SonyEricsson p800
che avevo prima, per cui forse c’e’ stato un miscuglio di formati.

PROBLEMA2: bisogna scoprire se esiste una tabella di indirizzi che punta ai vari entry, per individuare
anche quelli “speciali” senza intestaiozne.

Questa prima bozza di programma è in grado di estrarre ALCUNI degli appunti (solo se successivi
al 2003), individuandoli tramite le loro date:

http://www.planetmobile.it/jumpjack/ReadJotter.zip

Leggere coordinate GPS da ricevitore bluettoth esterno con PersonalJAVA e JavaBT su UIQ

Posted in GPS, Java, jython, Programmazione by jumpjack on 28 ottobre 2007

import se.sics.bt.symbian
import java.lang.Short
import jarray

lib = se.sics.bt.symbian # Connessione a libreria JavaBT
address = jarray.array([0,10,58,35,16,194],’h’) # Array di “short” per indirizzo GPS
commander = lib.BTCommander()
device = lib.BTDevice(“LC_GPS”, address, commander) # Prepara connessione a GPS
port = 1
abyte0 = jarray.zeros(3,’b’) # Crea array di 3 byte
currentSocket = device.connect(port, commander.RFCOMM, 20) # Apre connessione

i = 1;
print “\nReading data…”
MAX=200 # Numero di bytes da leggere al ricevitore
n=0
dati = “Dati ricevuti: ”
while i > -1 and n<MAX:
n=n+3
i = currentSocket.read(abyte0, 3, 1000)
j = 0
while j < i:
dati = dati + chr(abyte0[j]) # Accoda a stringa i dati letti
j = j+1
print “\ndone”
print “LAT: “, dati[dati.find(“$GPGGA”)+18:dati.find(“$GPGGA”)+18+9]
print “LON: “, dati[dati.find(“$GPGGA”)+30:dati.find(“$GPGGA”)+30+10]
currentSocket.close()

Download file con indentatura corretta:

http://www.planetmobile.it/jumpjack/BT_test.py