giovedì 5 settembre 2013
Ricerca dell'ID I2C su Arduino
Molti dispositivi da accoppiare ad Arduino si basano sul canale I2C e vengono identificati mediante un Id unico
Nel caso in cui non sia disponibile la documentazione si puo' trovare l'Id effettuando una scansione del bus mediante questo sketch derivante direttamente dal sito Arduino
// --------------------------------------
// i2c_scanner
//
// Version 1
// This program (or code that looks like it)
// can be found in many places.
// For example on the Arduino.cc forum.
// The original author is not know.
// Version 2, Juni 2012, Using Arduino 1.0.1
// Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26 2013
// V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
// by Arduino.cc user Krodal.
// Changes by louarnold removed.
// Scanning addresses changed from 0...127 to 1...119,
// according to the i2c scanner by Nick Gammon
// http://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
// As version 4, but address scans now to 127.
// A sensor seems to use address 120.
//
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//
#include <Wire.h>
void setup()
{
Wire.begin();
Serial.begin(9600);
Serial.println("\nI2C Scanner");
}
void loop()
{
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ )
{
// The i2c_scanner uses the return value of
// the Write.endTransmisstion to see if
// a device did acknowledge to the address.
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("I2C device found at address 0x");
if (address<16)
Serial.print("0");
Serial.print(address,HEX);
Serial.println(" !");
nDevices++;
}
else if (error==4)
{
Serial.print("Unknow error at address 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");
delay(5000); // wait 5 seconds for next scan
}
mercoledì 4 settembre 2013
Vonets VAP11G ed Arduino
Mi e' stato possibile provare il Vonets VAP11G, un bridge Ethernet-WiFi, ovvero un sistema per instradare il traffico da e per Wifi su una porta Ethernet. E' molto utile in casi nei quali un dispositivo non ammetta una scheda Wi-Fi (per esempio un MacMini senza Airport) e Arduino con il solo shield Ethernet.
Si tratta di un prodotto a basso costo e parente povero del Netgear WNCE2001 e come tale e' privo di alcune funzionalita'. La configurazione avviene soltanto mediante programma dedicato che funziona solo sotto Windows. Ricercando su internet ho trovato questo script in Python che dovrebbe servire per configurare il VAP11G ma per la mia esperienza non ha funzionato
L'alimentazione avviene tramite cavo USB oppure tramite alimentatore esterno
Funziona molto bene con Arduino+shield Ethernet, basta avere l'accortezza di accendere un po' prima il Vortes in modo da fargli aggianciare il WiFi e poi accendere l'Arduino
Si tratta di un prodotto a basso costo e parente povero del Netgear WNCE2001 e come tale e' privo di alcune funzionalita'. La configurazione avviene soltanto mediante programma dedicato che funziona solo sotto Windows. Ricercando su internet ho trovato questo script in Python che dovrebbe servire per configurare il VAP11G ma per la mia esperienza non ha funzionato
L'alimentazione avviene tramite cavo USB oppure tramite alimentatore esterno
Funziona molto bene con Arduino+shield Ethernet, basta avere l'accortezza di accendere un po' prima il Vortes in modo da fargli aggianciare il WiFi e poi accendere l'Arduino
martedì 3 settembre 2013
Ottenere il numero di Like su una pagina Facebook (2)
Per ottenere il numero di Like su una pagina direttamente da browser si puo' lanciare il seguente comando
http://api-read.facebook.com/restserver.php?format=xml&method=fql.multiquery&pretty=0&queries={%22page_info%22%3A%22select%20name%2Cfan_count%2Cpage_url%2Ctype%20from%20page%20where%20page_id%20IN%20(266068113416863)%22}&sdk
dove si deve modificare il solo Id pagina (in questo caso 266068113416863)
http://api-read.facebook.com/restserver.php?format=xml&method=fql.multiquery&pretty=0&queries={%22page_info%22%3A%22select%20name%2Cfan_count%2Cpage_url%2Ctype%20from%20page%20where%20page_id%20IN%20(266068113416863)%22}&sdk
dove si deve modificare il solo Id pagina (in questo caso 266068113416863)
Ottenere il numero di Like su una pagina Facebook
Diciamo che vogliamo visualizzare da programma il numero di Like su una pagina Facebook per esempio questa
https://www.facebook.com/SAAM.Firenze
Per prima cosa si deve conoscere l'id della pagina che si ottiene usando OpenGraph
http://graph.facebook.com/?ids=https://www.facebook.com/SAAM.Firenze
che produce il seguente risultato. Circa alla fine si trova
"id": "266068113416863",
che e' il numero desiderato
-----------------------------------
a questo punto si puo' scrivere una semplice applicazione Facebook che tramite le Api ci riporti il valore di Like (che come si vede dall'interfaccia Web e' di 259) Come si vede, a parte le chiavi dell'applicazione non e' necessario passare nessun access token od avere permessi particolari
--------------------------------------
<?
require_once '../src/facebook.php';
$appid = '673135956xxxxxx';
$appsecret = 'dde6cfb07dbb769c7efxxxxxx';
$facebook = new Facebook(array(
'appId' => $appid,
'secret' => $appsecret,
'cookie' => false,
));
$like = array(
'method' => 'fql.query',
'query' => 'select fan_count from page where page_id=266068113416863;'
);
$result = $facebook->api($like);
print $result[0]['fan_count'];
?>
--------------------------------------
https://www.facebook.com/SAAM.Firenze
Per prima cosa si deve conoscere l'id della pagina che si ottiene usando OpenGraph
http://graph.facebook.com/?ids=https://www.facebook.com/SAAM.Firenze
che produce il seguente risultato. Circa alla fine si trova
che e' il numero desiderato
-----------------------------------
{
"https://www.facebook.com/SAAM.Firenze": {
"about": "Istruttore e Responsabile di sala: Alessandro Battistini Iacopo Venni Lorenzo Leoni",
"category": "Sports venue",
"description": "La sede di Firenze della Sala d'Arme Achille Marozzo svolge ampio lavoro di ricerca sulla scherma del medioevo e del rinascimento. Finalmente, dopo lungo tempo passato sullo studio sui trattatisti toscani, si sono aperti, per la prima volta, corsi sulle tecniche di combattimento della antica scuola di scherma fiorentina.",
"hours": {
"tue_1_open": "20:30",
"tue_1_close": "23:00",
"thu_1_open": "20:30",
"thu_1_close": "23:00"
},
"is_published": true,
"location": {
"street": "Via Pistoiese angolo Viuzzo della Cavalla",
"city": "Florence",
"state": "",
"country": "Italy",
"zip": ""
},
"parking": {
"street": 1,
"lot": 0,
"valet": 0
},
"phone": "+39 339 66.83.646",
"price_range": "$$$ (30-50)",
"talking_about_count": 67,
"username": "SAAM.Firenze",
"website": "http://www.achillemarozzo.it/sale/firenze.php",
"were_here_count": 0,
"id": "266068113416863",
"name": "Sala d'arme Achille Marozzo - Firenze",
"link": "http://www.facebook.com/SAAM.Firenze",
"likes": 259,
"cover": {
"cover_id": 366553573368316,
"source": "http://sphotos-b.ak.fbcdn.net/hphotos-ak-prn1/s720x720/64899_366553573368316_453567495_n.jpg",
"offset_y": 55,
"offset_x": 0
}
}
}
-----------------------------------a questo punto si puo' scrivere una semplice applicazione Facebook che tramite le Api ci riporti il valore di Like (che come si vede dall'interfaccia Web e' di 259) Come si vede, a parte le chiavi dell'applicazione non e' necessario passare nessun access token od avere permessi particolari
--------------------------------------
<?
require_once '../src/facebook.php';
$appid = '673135956xxxxxx';
$appsecret = 'dde6cfb07dbb769c7efxxxxxx';
$facebook = new Facebook(array(
'appId' => $appid,
'secret' => $appsecret,
'cookie' => false,
));
$like = array(
'method' => 'fql.query',
'query' => 'select fan_count from page where page_id=266068113416863;'
);
$result = $facebook->api($like);
print $result[0]['fan_count'];
?>
Rfid su Nexus S
Sono riuscito ad farmi prestare un tag Rfid da 13.56 MHz per testare la capacita' NFC di Nexus S. La storia racconta che la funzione di lettura/scrittura di Rfid era stata implementata all'interno di Android senza documentarla e che e' stata scoperta (e sfruttata) da alcuni utilizzatori
Per la prova ho usato un normale tag di sola lettura da 13.56 Mhz ed il programma NFC Reader, del quale sono disponibili anche i sorgenti su GitHub
L'antenna fa il suo lavoro anche se non e' molto sensibile (il tag va letteralmente strusciato sulla cover del telefono)
Per la prova ho usato un normale tag di sola lettura da 13.56 Mhz ed il programma NFC Reader, del quale sono disponibili anche i sorgenti su GitHub
L'antenna fa il suo lavoro anche se non e' molto sensibile (il tag va letteralmente strusciato sulla cover del telefono)
Tethering e Hotspot Android per Debian
Ho scoperto (quasi per caso dato che uso sempre l'hotspot portatile su Android) che collegando il cavo USB ed impostando il Tethering USB, Debian si connette ad Internet senza nessuna altra impostazione....molto comodo
Lettore RFID RC522 su Arduino
Il lettore RFID RC522 e' forse il sistema meno costoso per leggere i tag Rfid a 13.56 MHz in quanto il suo costo arriva al minimo anche a 5 dollari su E-Commerce cinesi
L'interfaccia e' a sette cavi
MOSI: Pin 11 / ICSP-4
MISO: Pin 12 / ICSP-1
SCK: Pin 13 / ISCP-3
SS: Pin 10
RST: Pin 9
(possono essere modificati da programma i pin 9 e 10)
oltre ovviamente ai due collegamenti di alimentazione a GND e 3.3V
La mia versione del lettore mostra le scritte solo sul lato superiore e quindi, quando montato sulla breadboard, non si riesce a leggere la pedinatura. Per comodita' metto questa foto del medesimo lettore ma con le scritte sul lato inferiore per facilitare il montaggio
La programmazione della scheda viene effettuata mediante la libreria che si trova a questo indirizzo
Per la lettura di un tag si puo' impiegare l'esempio CardRead compreso nella libreria stessa (attenzione: ogni lettura viene confrontata con l'ultima acquisita e se uguale non mostra niente a schermo se non una fila di puntini)
versione corta
------------------------------------------
#include <SPI.h>
#include <RFID.h>
#define SS_PIN 10
#define RST_PIN 9
RFID rfid(SS_PIN, RST_PIN);
// Setup variables:
int serNum0;
int serNum1;
int serNum2;
int serNum3;
int serNum4;
void setup()
{
Serial.begin(9600);
SPI.begin();
rfid.init();
}
void loop()
{
if (rfid.isCard()) {
if (rfid.readCardSerial()) {
serNum0 = rfid.serNum[0];
serNum1 = rfid.serNum[1];
serNum2 = rfid.serNum[2];
serNum3 = rfid.serNum[3];
serNum4 = rfid.serNum[4];
String Id = String(rfid.serNum[0],HEX)+String(rfid.serNum[1],HEX)+String(rfid.serNum[2],HEX)+String(rfid.serNum[3],HEX)+ String(rfid.serNum[4],HEX);
Serial.println(Id);
}
}
rfid.halt();
}
-----------------------------------
-----------------------------------
/**
* Read a card using a mfrc522 reader on your SPI interface
* Pin layout should be as follows (on Arduino Uno):
* MOSI: Pin 11 / ICSP-4
* MISO: Pin 12 / ICSP-1
* SCK: Pin 13 / ISCP-3
* SS: Pin 10
* RST: Pin 9
*
* Script is based on the script of Miguel Balboa.
* New cardnumber is printed when card has changed. Only a dot is printed
* if card is the same.
*
* @version 0.1
* @author Henri de Jong
* @since 06-01-2013
*/
#include <SPI.h>
#include <RFID.h>
#define SS_PIN 10
#define RST_PIN 9
RFID rfid(SS_PIN, RST_PIN);
// Setup variables:
int serNum0;
int serNum1;
int serNum2;
int serNum3;
int serNum4;
void setup()
{
Serial.begin(9600);
SPI.begin();
rfid.init();
}
void loop()
{
if (rfid.isCard()) {
if (rfid.readCardSerial()) {
if (rfid.serNum[0] != serNum0
&& rfid.serNum[1] != serNum1
&& rfid.serNum[2] != serNum2
&& rfid.serNum[3] != serNum3
&& rfid.serNum[4] != serNum4
) {
/* With a new cardnumber, show it. */
Serial.println(" ");
Serial.println("Card found");
serNum0 = rfid.serNum[0];
serNum1 = rfid.serNum[1];
serNum2 = rfid.serNum[2];
serNum3 = rfid.serNum[3];
serNum4 = rfid.serNum[4];
//Serial.println(" ");
Serial.println("Cardnumber:");
Serial.print("Dec: ");
Serial.print(rfid.serNum[0],DEC);
Serial.print(", ");
Serial.print(rfid.serNum[1],DEC);
Serial.print(", ");
Serial.print(rfid.serNum[2],DEC);
Serial.print(", ");
Serial.print(rfid.serNum[3],DEC);
Serial.print(", ");
Serial.print(rfid.serNum[4],DEC);
Serial.println(" ");
Serial.print("Hex: ");
Serial.print(rfid.serNum[0],HEX);
Serial.print(", ");
Serial.print(rfid.serNum[1],HEX);
Serial.print(", ");
Serial.print(rfid.serNum[2],HEX);
Serial.print(", ");
Serial.print(rfid.serNum[3],HEX);
Serial.print(", ");
Serial.print(rfid.serNum[4],HEX);
Serial.println(" ");
} else {
/* If we have the same ID, just write a dot. */
Serial.print(".");
}
}
}
rfid.halt();
}
-----------------------------------
L'interfaccia e' a sette cavi
MOSI: Pin 11 / ICSP-4
MISO: Pin 12 / ICSP-1
SCK: Pin 13 / ISCP-3
SS: Pin 10
RST: Pin 9
(possono essere modificati da programma i pin 9 e 10)
La mia versione del lettore mostra le scritte solo sul lato superiore e quindi, quando montato sulla breadboard, non si riesce a leggere la pedinatura. Per comodita' metto questa foto del medesimo lettore ma con le scritte sul lato inferiore per facilitare il montaggio
La programmazione della scheda viene effettuata mediante la libreria che si trova a questo indirizzo
Per la lettura di un tag si puo' impiegare l'esempio CardRead compreso nella libreria stessa (attenzione: ogni lettura viene confrontata con l'ultima acquisita e se uguale non mostra niente a schermo se non una fila di puntini)
versione corta
------------------------------------------
#include <SPI.h>
#include <RFID.h>
#define SS_PIN 10
#define RST_PIN 9
RFID rfid(SS_PIN, RST_PIN);
// Setup variables:
int serNum0;
int serNum1;
int serNum2;
int serNum3;
int serNum4;
void setup()
{
Serial.begin(9600);
SPI.begin();
rfid.init();
}
void loop()
{
if (rfid.isCard()) {
if (rfid.readCardSerial()) {
serNum0 = rfid.serNum[0];
serNum1 = rfid.serNum[1];
serNum2 = rfid.serNum[2];
serNum3 = rfid.serNum[3];
serNum4 = rfid.serNum[4];
String Id = String(rfid.serNum[0],HEX)+String(rfid.serNum[1],HEX)+String(rfid.serNum[2],HEX)+String(rfid.serNum[3],HEX)+ String(rfid.serNum[4],HEX);
Serial.println(Id);
}
}
rfid.halt();
}
-----------------------------------
-----------------------------------
/**
* Read a card using a mfrc522 reader on your SPI interface
* Pin layout should be as follows (on Arduino Uno):
* MOSI: Pin 11 / ICSP-4
* MISO: Pin 12 / ICSP-1
* SCK: Pin 13 / ISCP-3
* SS: Pin 10
* RST: Pin 9
*
* Script is based on the script of Miguel Balboa.
* New cardnumber is printed when card has changed. Only a dot is printed
* if card is the same.
*
* @version 0.1
* @author Henri de Jong
* @since 06-01-2013
*/
#include <SPI.h>
#include <RFID.h>
#define SS_PIN 10
#define RST_PIN 9
RFID rfid(SS_PIN, RST_PIN);
// Setup variables:
int serNum0;
int serNum1;
int serNum2;
int serNum3;
int serNum4;
void setup()
{
Serial.begin(9600);
SPI.begin();
rfid.init();
}
void loop()
{
if (rfid.isCard()) {
if (rfid.readCardSerial()) {
if (rfid.serNum[0] != serNum0
&& rfid.serNum[1] != serNum1
&& rfid.serNum[2] != serNum2
&& rfid.serNum[3] != serNum3
&& rfid.serNum[4] != serNum4
) {
/* With a new cardnumber, show it. */
Serial.println(" ");
Serial.println("Card found");
serNum0 = rfid.serNum[0];
serNum1 = rfid.serNum[1];
serNum2 = rfid.serNum[2];
serNum3 = rfid.serNum[3];
serNum4 = rfid.serNum[4];
//Serial.println(" ");
Serial.println("Cardnumber:");
Serial.print("Dec: ");
Serial.print(rfid.serNum[0],DEC);
Serial.print(", ");
Serial.print(rfid.serNum[1],DEC);
Serial.print(", ");
Serial.print(rfid.serNum[2],DEC);
Serial.print(", ");
Serial.print(rfid.serNum[3],DEC);
Serial.print(", ");
Serial.print(rfid.serNum[4],DEC);
Serial.println(" ");
Serial.print("Hex: ");
Serial.print(rfid.serNum[0],HEX);
Serial.print(", ");
Serial.print(rfid.serNum[1],HEX);
Serial.print(", ");
Serial.print(rfid.serNum[2],HEX);
Serial.print(", ");
Serial.print(rfid.serNum[3],HEX);
Serial.print(", ");
Serial.print(rfid.serNum[4],HEX);
Serial.println(" ");
} else {
/* If we have the same ID, just write a dot. */
Serial.print(".");
}
}
}
rfid.halt();
}
lunedì 2 settembre 2013
Creazione di post automatici su Facebook con RFID(5)
Questo riepilogo non è disponibile.
Fai clic qui per visualizzare il post.
Setup Qt5 per Android
Finalmente dopo un po' di tentativi non riusciti con la versione 5.1, ho compilato un programma per Android realizzato mediante le Qt 5.1.1
Attenzione: per la mia esperienza e' decisamente meglio utilizzare le Qt 5.1.1 su Linux piuttosto che in Windows...non so bene il motivo ma in XP il compilatore e' decisamente lento e non trova mai la fine
Attenzione 2 : la compilazione e l'esecuzione ha avuto successo solo un dispositivo reale (Nexus S) in quanto l'emulatore Android non viene agganciato da QtCreator e non viene copiato l'apk (errore Starting remote process. Unable to start 'org.qtproject.t1')
Attenzione 3: questa riga dovrebbe andare al termine ma e' bene metterla in evidenzia. Il solo programma Hello World occupa 30.26 Mb !!!!
Una volta scaricato ed installato il pacchetto Qt 5.1.1 for Android (Linux 32-bit, 461 MB) si deve procedere a configurare l'ambiente QtCreator per indicare dove sono ubicate le directory dell'SDK e dell'NDK di Android. La cosa migliore e' ovviamente avere l'ultima versione aggiornata che nel mio caso e' l'NDK 9. Devono inoltre essere installati Ant e deve essere indicata la directory della Java VM
All'avvio di QtCreator (versione Linux) compare il seguente errore. La libreria libgstreamer-0.10.so e' presente. L'errore non pregiudica la compilazione ed esecuzione dei programmi
Una volta creato un progetto Android di base (il semplice Hello World) si puo' lanciare l'esecuzione usando come target Android for arm
Vengono generati i seguenti messaggi
----------------------------------------------
11:55:58: Running steps for project t1...
11:55:58: Configuration unchanged, skipping qmake step.
11:55:58: Starting: "/usr/bin/make"
make: Nothing to be done for `first'.
11:55:58: The process "/usr/bin/make" exited normally.
11:55:58: Starting: "/usr/bin/make" INSTALL_ROOT=/home/luca/qt5_dir/t1/android install
cp -f -R /home/luca/qt5_dir/t1/qml/t1 /home/luca/qt5_dir/t1/android/assets/qml/
install -m 755 -p "libt1.so" "/home/luca/qt5_dir/t1/android/libs/armeabi-v7a/libt1.so"
11:55:58: The process "/usr/bin/make" exited normally.
11:55:58: Copy Qt app & libs to Android package ...
11:56:00: Creating package file ...
11:56:00: Package deploy: Running command '/usr/bin/ant clean debug'.
Buildfile: /home/luca/qt5_dir/t1/android/build.xml
-check-env:
[checkenv] Android SDK Tools Revision 22.0.5
[checkenv] Installed at /home/luca/android/sdk
-setup:
[echo] Project Name: T1
[gettype] Project Type: Application
-pre-clean:
clean:
[getlibpath] Library dependencies:
[getlibpath] No Libraries
[subant] No sub-builds to iterate on
-set-mode-check:
-set-debug-files:
-check-env:
[checkenv] Android SDK Tools Revision 22.0.5
[checkenv] Installed at /home/luca/android/sdk
-setup:
[echo] Project Name: T1
[gettype] Project Type: Application
-set-debug-mode:
-debug-obfuscation-check:
-pre-build:
-build-setup:
[getbuildtools] Using latest Build Tools: 18.0.1
[echo] Resolving Build Target for T1...
[gettarget] Project Target: Android 2.3.3
[gettarget] API level: 10
[gettarget] WARNING: No minSdkVersion value set. Application will install on all Android versions.
[echo] ----------
[echo] Creating output directories if needed...
[mkdir] Created dir: /home/luca/qt5_dir/t1/android/bin
[mkdir] Created dir: /home/luca/qt5_dir/t1/android/bin/res
[mkdir] Created dir: /home/luca/qt5_dir/t1/android/gen
[mkdir] Created dir: /home/luca/qt5_dir/t1/android/bin/classes
[mkdir] Created dir: /home/luca/qt5_dir/t1/android/bin/dexedLibs
[echo] ----------
[echo] Resolving Dependencies for T1...
[dependency] Ordered libraries:
[dependency]
[dependency] ------------------
[dependency] API<=15: Adding annotations.jar to the classpath.
[echo] ----------
[echo] Building Libraries with 'debug'...
[subant] No sub-builds to iterate on
-code-gen:
[mergemanifest] Merging AndroidManifest files into one.
[mergemanifest] Manifest merger disabled. Using project manifest only.
[echo] Handling aidl files...
[aidl] Found 2 AIDL files.
[aidl] Compiling 2 AIDL files.
[echo] ----------
[echo] Handling RenderScript files...
[renderscript] No RenderScript files to compile.
[echo] ----------
[echo] Handling Resources...
[aapt] Generating resource IDs...
[echo] ----------
[echo] Handling BuildConfig class...
[buildconfig] Generating BuildConfig class.
-pre-compile:
-compile:
[javac] Compiling 6 source files to /home/luca/qt5_dir/t1/android/bin/classes
-post-compile:
-obfuscate:
-dex:
[dex] input: /home/luca/qt5_dir/t1/android/bin/classes
[dex] input: /home/luca/android/sdk/tools/support/annotations.jar
[dex] input: /home/luca/qt5_dir/t1/android/libs/--Managed_by_Qt_Creator--QtAndroid-bundled.jar
[dex] Pre-Dexing /home/luca/android/sdk/tools/support/annotations.jar -> annotations-d989d2aabb78bbfbe6fcbd2162e157ce.jar
[dex] Pre-Dexing /home/luca/qt5_dir/t1/android/libs/--Managed_by_Qt_Creator--QtAndroid-bundled.jar -> --Managed_by_Qt_Creator--QtAndroid-bundled-11a7e4dd2e664969be723f2377cf863f.jar
[dex] Converting compiled files and external libraries into /home/luca/qt5_dir/t1/android/bin/classes.dex...
[dx] Merged dex A (23 defs/37,5KiB) with dex B (2 defs/1,1KiB). Result is 25 defs/44,8KiB. Took 0,2s
[dx] Merged dex A (25 defs/44,8KiB) with dex B (27 defs/40,3KiB). Result is 52 defs/101,4KiB. Took 0,1s
-crunch:
[crunch] Crunching PNG Files in source dir: /home/luca/qt5_dir/t1/android/res
[crunch] To destination dir: /home/luca/qt5_dir/t1/android/bin/res
[crunch] Crunched 0 PNG files to update cache
-package-resources:
[aapt] Creating full resource package...
-package:
[apkbuilder] Current build type is different than previous build: forced apkbuilder run.
[apkbuilder] Creating T1-debug-unaligned.apk and signing it with a debug key...
-post-package:
-do-debug:
[zipalign] Running zip align on final apk...
[echo] Debug Package: /home/luca/qt5_dir/t1/android/bin/T1-debug.apk
[propertyfile] Creating new property file: /home/luca/qt5_dir/t1/android/bin/build.prop
[propertyfile] Updating property file: /home/luca/qt5_dir/t1/android/bin/build.prop
[propertyfile] Updating property file: /home/luca/qt5_dir/t1/android/bin/build.prop
[propertyfile] Updating property file: /home/luca/qt5_dir/t1/android/bin/build.prop
-post-build:
debug:
BUILD SUCCESSFUL
Total time: 20 seconds
11:56:21: Package created.
11:56:21: Installing package onto 373342FC9C0400EC.
11:56:21: Package deploy: Running command '/home/luca/android/sdk/platform-tools/adb -s 373342FC9C0400EC uninstall org.qtproject.example.t1'.
Failure
11:56:22: Package deploy: Running command '/home/luca/android/sdk/platform-tools/adb -s 373342FC9C0400EC install /home/luca/qt5_dir/t1/android/bin/T1-debug.apk'.
732 KB/s (9256497 bytes in 12.346s)
pkg: /data/local/tmp/T1-debug.apk
----------------------------------------------
Dopo un bel po' di pazienza il programma parte sul Nexus
Mjpg-streamer su Raspberry/Raspbian
In questo post viene mostrato come usare MJpg-stream per creare uno stream video mediante Webcam e Raspberry. Le stesse informazioni si possono usare anche per un normale portatile con montato Debian
Sul web si trovano molti post che mostrano questa procedura ma spesso non funzionano piu' per vari motivi.
La prima cosa (piu' importante) e' prelevare l'ultima versione di mjpg-stream mediante Subversion da Sourceforge
svn checkout svn://svn.code.sf.net/p/mjpg-streamer/code/ mjpg-streamer-code
in seguito si digita
apt-get install libv4l-dev libjpeg8-dev imagemagick
per soddisfare le dipendenze della compilazione
Andando nella sottodirectory mjpg-streamer-code si vedra' che esiste una sottodirectory mjpg-streamer ed un mjpg-streamer-experimental ..io ho preferito quella non sperimentale
si inizia la compilazione con
make USE_LIBV4L2=true clean all
se ci sono problemi nell'includere V4L si lanci il seguente comando e si ripeta il make
cd /usr/include/linux sudo ln -s ../libv4l1-videodev.h videodev.h
siamo alla fine. Si digiti
export LD_LIBRARY_PATH=.
a questo punto il file README indica di lanciare il programma con la seguente riga
./mjpg_streamer -o "output_http.so -w ./www"
ma io ho trovato piu' semplice lanciare il comando
./start.sh
lo streaming si dovrebbe avviare senza problemi (ovviamente se la webcam e' collegata) e per osservare il flusso dati ci si puo' collegare via web browser all'indirizzo
http://mioip:8080/?action=stream
Ho provato anche VLC per fare streaming via web ma Raspberry ha delle risorse troppo limitate per poter gestire un cosi' pesante carico di lavoro
Sul web si trovano molti post che mostrano questa procedura ma spesso non funzionano piu' per vari motivi.
La prima cosa (piu' importante) e' prelevare l'ultima versione di mjpg-stream mediante Subversion da Sourceforge
svn checkout svn://svn.code.sf.net/p/mjpg-streamer/code/ mjpg-streamer-code
in seguito si digita
apt-get install libv4l-dev libjpeg8-dev imagemagick
per soddisfare le dipendenze della compilazione
Andando nella sottodirectory mjpg-streamer-code si vedra' che esiste una sottodirectory mjpg-streamer ed un mjpg-streamer-experimental ..io ho preferito quella non sperimentale
si inizia la compilazione con
make USE_LIBV4L2=true clean all
se ci sono problemi nell'includere V4L si lanci il seguente comando e si ripeta il make
cd /usr/include/linux sudo ln -s ../libv4l1-videodev.h videodev.h
siamo alla fine. Si digiti
export LD_LIBRARY_PATH=.
a questo punto il file README indica di lanciare il programma con la seguente riga
./mjpg_streamer -o "output_http.so -w ./www"
ma io ho trovato piu' semplice lanciare il comando
./start.sh
lo streaming si dovrebbe avviare senza problemi (ovviamente se la webcam e' collegata) e per osservare il flusso dati ci si puo' collegare via web browser all'indirizzo
http://mioip:8080/?action=stream
Ho provato anche VLC per fare streaming via web ma Raspberry ha delle risorse troppo limitate per poter gestire un cosi' pesante carico di lavoro
venerdì 30 agosto 2013
Compilare librerie Python
Tentando di installare un libreria python mediante il classico comando sulla mia Debian Box
python setup.py install
mi vengono generati una serie di errori. La causa e' che di default non viene installato il pacchetto python-dev indispensabile per la compilazione da sorgenti. tutto si risolve con
apt-get install python-dev
Raspberry in emulazione Qemu
Puntando il browser su questo indirizzo http://sourceforge.net/projects/rpiqemuwindows/ e' possibile ottenere un pacchetto gia' confezionato per emulare Raspberry e sistemi operativi collegati in QEmu
si possono provare altre distribuzioni senza dover formattare SD Card.
La velocita' non e' assolutamente niente di particolare. Curiosamente la distro PiBang non riesce a partire a causa di un errore nella D-Bus connection
Creazione di post automatici su Facebook (4)
Questo riepilogo non è disponibile.
Fai clic qui per visualizzare il post.
Creazione di post automatici su Facebook (3)
![]() |
| Arduino con shield Ethernet e sullo sfondo il post automatico su Facebook |
Visti i precedenti post (1 e 2) adesso si deve configurare l'Arduino come Client Http per chiamare lo script Php che genera post automaticamente mediante l'access_token
La cosa e' piuttosto semplice e viene compiuta dallo sketch sottostante che crea una chiamata HTTP passando i parametri via GET. Il codice si commenta da solo
----------------------------------------
#include <Ethernet.h>
#include <SPI.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte server[] = { 150, 217, 73, XX };
EthernetClient client;
void setup()
{
Ethernet.begin(mac);
Serial.begin(9600);
client.connect(server, 80);
delay(1000);
Serial.println("connecting...");
if (client.connected()) {
Serial.println("connected");
client.println("GET /luca/xxxxxx/example3.php?msg=Arduino_automatico HTTP/1.0");
client.println();
} else {
Serial.println("connection failed");
}
}
void loop()
{
if (client.available()) {
char c = client.read();
Serial.print(c);
}
if (!client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
for(;;)
;
}
}
------------------------------------------------------
sul lato server il log di apache mostra la connessione dell'Arduino con il web server
----------------------------
m.xxxxx.unifi.it:80 79.4.7.201 - - [29/Aug/2013:23:01:31 +0200] "GET /luca/xxxxx/example3.php?msg=Arduino_automatico HTTP/1.0" 200 418 "-" "-"sul lato server il log di apache mostra la connessione dell'Arduino con il web server
----------------------------
giovedì 29 agosto 2013
Problema di DNS su Ubuntu Server
E' accaduta una cosa curiosa sul server sul quale effettuo alcune prove tra cui quella di Facebook.
A seguito di una interruzione del corrente il server si e' spento brutalmente ed alla riaccensione erano scomparse le impostazioni del DNS (il file /etc/resolv.conf era vuoto con l'indicazione di non editare a mano)
E' stato necessario ripopolare il file /etc/resolv.conf con la sintassi
A seguito di una interruzione del corrente il server si e' spento brutalmente ed alla riaccensione erano scomparse le impostazioni del DNS (il file /etc/resolv.conf era vuoto con l'indicazione di non editare a mano)
E' stato necessario ripopolare il file /etc/resolv.conf con la sintassi
nameserver xxx.xxx.xxx.xxx
probabilmente le impostazioni del DSN vengono gestite in automatico da qualche programma (vedi questo link) ma su una macchina server mi sembra una scelta quantomeno discutibile
Creazione di post automatici su Facebook (2)
Proseguendo il discorso iniziato con il post precedente adesso si cerca di pubblicare un post senza l'interazione utente utilizzando l'access token
La stringa dell'access token e' quella lunga stringa alfanumerica che viene prodotta come risultato dallo script del post precedente
Per la politica di Facebook attualmente questo metodo funziona solo per 60 giorni perche' gli access token hanno una durata temporale; dopo tale scadenza l'utente deve riloggarsi manualmente ed ottenere un nuovo access token
Questo script di fatto e' una versione semplificata del precedente in cui tutta la fase di autenticazione e' contenuta nell'access token
E' stato leggermente modificato il campo messaggio in modo da renderlo dinamico.
In questo modo se si aggiunge la variale msg alla URL si modifica il testo del messaggio
tipo
http://www.mioserver//script.php?msg=Luca
--------------------------------------------------------------------
<?
require_once '../src/facebook.php';
$appid = '6731359560xxxxxx';
$appsecret = 'dde6cfb07dbb769c7efe949cxxxxxxx';
$msg = $_GET["msg"];
$title = 'Messaggio Automatico Arduino';
$uri = 'http://debiaonoldcomputers.blogspot.com/';
$desc = 'Luca Innocenti.';
$pic = 'https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgluMOnPyTph3iUuLEcHHX8yoUSfMUnM5JlJH4xtJUoNTbZydICSkco_aB1Nc_gZ521xnI_JRptSkThfY7w1-dVLT7_9y5lzyWslzLYnhTQaExMPdr9Z8-Ed73ymkPwQwpnXmKuhfGdJPJ4/s400/Basic-+Facebook+Developers.jpg';
$action_name = 'Action Link in the Footer of the Post';
$action_link = 'http://debiaonoldcomputers.blogspot.com/';
$facebook = new Facebook(array(
'appId' => $appid,
'secret' => $appsecret,
'cookie' => false,
));
$user = $facebook->getUser();
$accessToken = "CAAJkNq2LttoBAJywtmNSbVHqFPubOjYmQ2yyUG4kpibD75BHid9J7xsvif8osSOc4ewgK4aYerrLZBsZCQM5wykRTYVLDkCJXlXYl3gi8WFRQ8U4p4y4ZAXYsdamz6RVdRJZAe4vZA80mWBayuG0qc4IAj2TMDmQXKiv1OrKp8CwKjD6Rz2ZCAqpxxxxxxxx";
$attachment = array(
'access_token' => $accessToken,
'message' => $msg,
'name' => $title,
'link' => $uri,
'description' => $desc,
'picture'=>$pic,
'actions' => json_encode(array('name' => $action_name,'link' => $action_link))
);
$status = $facebook->api("/me/feed", "post", $attachment);
print "Ok";
?>
La stringa dell'access token e' quella lunga stringa alfanumerica che viene prodotta come risultato dallo script del post precedente
Per la politica di Facebook attualmente questo metodo funziona solo per 60 giorni perche' gli access token hanno una durata temporale; dopo tale scadenza l'utente deve riloggarsi manualmente ed ottenere un nuovo access token
Questo script di fatto e' una versione semplificata del precedente in cui tutta la fase di autenticazione e' contenuta nell'access token
E' stato leggermente modificato il campo messaggio in modo da renderlo dinamico.
In questo modo se si aggiunge la variale msg alla URL si modifica il testo del messaggio
tipo
http://www.mioserver//script.php?msg=Luca
--------------------------------------------------------------------
<?
require_once '../src/facebook.php';
$appid = '6731359560xxxxxx';
$appsecret = 'dde6cfb07dbb769c7efe949cxxxxxxx';
$msg = $_GET["msg"];
$title = 'Messaggio Automatico Arduino';
$uri = 'http://debiaonoldcomputers.blogspot.com/';
$desc = 'Luca Innocenti.';
$pic = 'https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgluMOnPyTph3iUuLEcHHX8yoUSfMUnM5JlJH4xtJUoNTbZydICSkco_aB1Nc_gZ521xnI_JRptSkThfY7w1-dVLT7_9y5lzyWslzLYnhTQaExMPdr9Z8-Ed73ymkPwQwpnXmKuhfGdJPJ4/s400/Basic-+Facebook+Developers.jpg';
$action_name = 'Action Link in the Footer of the Post';
$action_link = 'http://debiaonoldcomputers.blogspot.com/';
$facebook = new Facebook(array(
'appId' => $appid,
'secret' => $appsecret,
'cookie' => false,
));
$user = $facebook->getUser();
$accessToken = "CAAJkNq2LttoBAJywtmNSbVHqFPubOjYmQ2yyUG4kpibD75BHid9J7xsvif8osSOc4ewgK4aYerrLZBsZCQM5wykRTYVLDkCJXlXYl3gi8WFRQ8U4p4y4ZAXYsdamz6RVdRJZAe4vZA80mWBayuG0qc4IAj2TMDmQXKiv1OrKp8CwKjD6Rz2ZCAqpxxxxxxxx";
$attachment = array(
'access_token' => $accessToken,
'message' => $msg,
'name' => $title,
'link' => $uri,
'description' => $desc,
'picture'=>$pic,
'actions' => json_encode(array('name' => $action_name,'link' => $action_link))
);
$status = $facebook->api("/me/feed", "post", $attachment);
print "Ok";
?>
Iscriviti a:
Post (Atom)
Mappa frane da news on line
Correva l'anno 2008 ed il mio direttore di Dipartimento mi aveva chiesto di lavorare sui Big Data per estrarre dati di geolocalizzazione...
-
Aggiornamento questo e' la risposta degli sviluppatori First of all, almost all operating systems on both mobile and laptop/desktop n...
-
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...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...















