Visualizzazione post con etichetta Edison. Mostra tutti i post
Visualizzazione post con etichetta Edison. Mostra tutti i post

mercoledì 10 giugno 2020

Solar Edison

Premessa: il progetto Solar Edison e' stato sostituito dal progetto Solar Raspberry

Uno dei miei progetti di piu' lungo corso che non ho mai realizzato e' quello di realizzare un computer completamente svincolato dall'alimentazione di rete. Deve essere trasportabile (quindi con dimesioni e peso contenuto), possibilmente con uptime superiore al 95% e con una capacita' di calcolo discreta

E' arrivato il momento di provare a costruirselo

Per il computer ho tirato fuori una Intel Edison che giaceva nel cassetto 
Il sistema di alimentazione e' composto da un pannello solare da 10 W con una batteria da moto da 7.2 Ah 12V ed un regolatore di tensione la cui uscita a 12 V e' collegata al barrel jack della Edison dove si possono applicare tensioni da 9 a 19 V



Visto che il consumo della Edison e' abbondantemente sotto i 100 mA pensavo di avere vita facile a mantenere il sistema in vita .. sbagliavo. Per motivi non meglio chiariti il sistema scarica la batteria nel giro di poche ore tanto da non passare nemmeno la notte. 


Ho provato a collegare il cavo USB di alimentazione della Edison all'uscita USB del regolatore di tensione, in questo modo i consumi sono scesi drasticamente forse perche' l'energia della batteria era dissipata dal regolatore di tensione della Edison che deve portare 12 V ai 5,3.3 e 1.8 rispettivamente della Arduino Board e del processore Atom.

Sembrava vinta ma in questa configurazione ho perso la porta USB della Edison su cui dovevo montare un GPS

Per fare una prova ho preso un pannello solare da 50W con una batteria da auto da 42Ah ma con questa soluzione si perde la trasportabilita'. Il progetto e' quindi stato chiuso in favore di una Solar Raspberry



venerdì 4 gennaio 2019

Intel Edison: Batteria RTC o UPS

Ho ripreso la Intel Edison dal cassetto per un progetto che prevede di salvare dati da un GPS.
La Edison non sara' connessa ad una rete WiFi e quindi non e' possibile ricavare data/ora via NTP


Intel Edison dichiara nelle specifiche di montare un RTC (anche se non c'e' l'alloggiamento della batteria) rispettivamente sul pin 23 del modulo Edison od al pin 5 del J18 del mini breakout
Io in realta' uso il breakout Arduino e si trova solo il connettore J2 con indicazione BATT. Attandoci una LiPO che questa non funziona solo come batteria tampone per RTC ma funziona come un UPS per tutta la scheda (e quindi secondariamente mantiene vivo anche RTC)

In conclusione con il breakout Arduino non ha una connessione diretta con l'RTC, la batteria esterna alimenta tutta la scheda

lunedì 27 marzo 2017

Lighttpd e Pydio su Intel Edison

Questo e' un tentativo di usare Intel Edison per creare un cloud file server.
Avevo iniziato con Apache, PHP e OwnCloud ma quest'ultimo e' particolarmente esigente in termini di estensioni di PHP e non avevo voglia di ricompilare tutto da zero. Per questo motivo sono passato a Pydio e Lighttpd per motivi di leggerezza


Installare i pacchetti per Pydio in Yocto e' piuttosto banale perche' basta digitare i seguenti comandi

opkg install lighttpd
opkg install lighttpd-module-rewrite
opkg install lighttpd-module-fastcgi
opkg install php

la home del web server si trovera' in  /www/pages/ mentre il file di configurazione e'  /etc/lighttpd.conf

A questo punto si nota che se si crea un file .php e lo si interroga via web, il server risponde sempre errore 403 (Forbidden). Questo perche' Lighttpd non e' stato istruito su come interpretare i file .PHP. Si vede quindi editare il file di configurazione (in giallo le modifiche)

-----------------------
# lighttpd configuration file
#
# use it as a base for lighttpd 1.0.0 and above
#
# $Id: lighttpd.conf,v 1.7 2004/11/03 22:26:05 weigon Exp $

############ Options you really have to take care of ####################

## modules to load
# at least mod_access and mod_accesslog should be loaded
# all other module should only be loaded if really neccesary
# - saves some time
# - saves memory
server.modules              = (
#                               "mod_rewrite",
#                               "mod_redirect",
#                               "mod_alias",
                                "mod_access",
#                               "mod_cml",
#                               "mod_trigger_b4_dl",
#                               "mod_auth",
#                               "mod_status",
#                               "mod_setenv",
                               "mod_fastcgi",
#                               "mod_proxy",
#                               "mod_simple_vhost",
#                               "mod_evhost",
#                               "mod_userdir",
#                               "mod_cgi",
#                               "mod_compress",
#                               "mod_ssi",
#                               "mod_usertrack",
#                               "mod_expire",
#                               "mod_secdownload",
#                               "mod_rrdtool",
# "mod_webdav",
                                "mod_accesslog" )

## a static document-root, for virtual-hosting take look at the
## server.virtual-* options
server.document-root        = "/www/pages/"

## where to send error-messages to
server.errorlog             = "/www/logs/lighttpd.error.log"

# files to check for if .../ is requested
index-file.names            = ( "index.php", "index.html",
                                "index.htm", "default.htm" )

## set the event-handler (read the performance section in the manual)
# server.event-handler = "freebsd-kqueue" # needed on OS X

# mimetype mapping
mimetype.assign             = (
  ".pdf"          =>      "application/pdf",
  ".sig"          =>      "application/pgp-signature",
  ".spl"          =>      "application/futuresplash",
  ".class"        =>      "application/octet-stream",
  ".ps"           =>      "application/postscript",
  ".torrent"      =>      "application/x-bittorrent",
  ".dvi"          =>      "application/x-dvi",
  ".gz"           =>      "application/x-gzip",
  ".pac"          =>      "application/x-ns-proxy-autoconfig",
  ".swf"          =>      "application/x-shockwave-flash",
  ".tar.gz"       =>      "application/x-tgz",
  ".tgz"          =>      "application/x-tgz",
  ".tar"          =>      "application/x-tar",
  ".zip"          =>      "application/zip",
  ".mp3"          =>      "audio/mpeg",
  ".m3u"          =>      "audio/x-mpegurl",
  ".wma"          =>      "audio/x-ms-wma",
  ".wax"          =>      "audio/x-ms-wax",
  ".ogg"          =>      "application/ogg",
  ".wav"          =>      "audio/x-wav",
  ".gif"          =>      "image/gif",
  ".jpg"          =>      "image/jpeg",
  ".jpeg"         =>      "image/jpeg",
  ".png"          =>      "image/png",
  ".xbm"          =>      "image/x-xbitmap",
  ".xpm"          =>      "image/x-xpixmap",
  ".xwd"          =>      "image/x-xwindowdump",
  ".css"          =>      "text/css",
  ".html"         =>      "text/html",
  ".htm"          =>      "text/html",
  ".js"           =>      "text/javascript",
  ".asc"          =>      "text/plain",
  ".c"            =>      "text/plain",
  ".cpp"          =>      "text/plain",
  ".log"          =>      "text/plain",
  ".conf"         =>      "text/plain",
  ".text"         =>      "text/plain",
  ".txt"          =>      "text/plain",
  ".dtd"          =>      "text/xml",
  ".xml"          =>      "text/xml",
  ".mpeg"         =>      "video/mpeg",
  ".mpg"          =>      "video/mpeg",
  ".mov"          =>      "video/quicktime",
  ".qt"           =>      "video/quicktime",
  ".avi"          =>      "video/x-msvideo",
  ".asf"          =>      "video/x-ms-asf",
  ".asx"          =>      "video/x-ms-asf",
  ".wmv"          =>      "video/x-ms-wmv",
  ".bz2"          =>      "application/x-bzip",
  ".tbz"          =>      "application/x-bzip-compressed-tar",
  ".tar.bz2"      =>      "application/x-bzip-compressed-tar"
 )

# Use the "Content-Type" extended attribute to obtain mime type if possible
#mimetype.use-xattr        = "enable"


## send a different Server: header
## be nice and keep it at lighttpd
# server.tag                 = "lighttpd"

#### accesslog module
accesslog.filename          = "/www/logs/access.log"
debug.log-request-handling = "enable"




## deny access the file-extensions
#
# ~    is for backupfiles from vi, emacs, joe, ...
# .inc is often used for code includes which should in general not be part
#      of the document-root
url.access-deny             = ( "~", ".inc" )

$HTTP["url"] =~ "\.pdf$" {
  server.range-requests = "disable"
}

##
# which extensions should not be handle via static-file transfer
#
# .php, .pl, .fcgi are most often handled by mod_fastcgi or mod_cgi
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )

######### Options that are good to be but not neccesary to be changed #######

## bind to port (default: 80)
#server.port                = 81

## bind to localhost (default: all interfaces)
#server.bind                = "grisu.home.kneschke.de"

## error-handler for status 404
#server.error-handler-404   = "/error-handler.html"
#server.error-handler-404   = "/error-handler.php"

## to help the rc.scripts
#server.pid-file            = "/var/run/lighttpd.pid"


###### virtual hosts
##
##  If you want name-based virtual hosting add the next three settings and load
##  mod_simple_vhost
##
## document-root =
##   virtual-server-root + virtual-server-default-host + virtual-server-docroot
## or
##   virtual-server-root + http-host + virtual-server-docroot
##
#simple-vhost.server-root   = "/home/weigon/wwwroot/servers/"
#simple-vhost.default-host  = "grisu.home.kneschke.de"
#simple-vhost.document-root = "/pages/"


##
## Format: <errorfile-prefix><status-code>.html
## -> ..../status-404.html for 'File not found'
#server.errorfile-prefix    = "/home/weigon/projects/lighttpd/doc/status-"

## virtual directory listings
#dir-listing.activate       = "enable"

## enable debugging
#debug.log-request-header   = "enable"
#debug.log-response-header  = "enable"
#debug.log-request-handling = "enable"
#debug.log-file-not-found   = "enable"

### only root can use these options
#
# chroot() to directory (default: no chroot() )
#server.chroot              = "/"

## change uid to <uid> (default: don't care)
#server.username            = "wwwrun"

## change uid to <uid> (default: don't care)
#server.groupname           = "wwwrun"

#### compress module
#compress.cache-dir         = "/tmp/lighttpd/cache/compress/"
#compress.filetype          = ("text/plain", "text/html")

#### proxy module
## read proxy.txt for more info
#proxy.server               = ( ".php" =>
#                               ( "localhost" =>
#                                 (
#                                   "host" => "192.168.0.101",
#                                   "port" => 80
#                                 )
#                               )
#                             )

#### fastcgi module
## read fastcgi.txt for more info
## for PHP don't forget to set cgi.fix_pathinfo = 1 in the php.ini
fastcgi.server             = ( ".php" =>
                               ( "localhost" =>
                                 (
                                   "socket" => "/tmp/php-fastcgi.socket",
                                   "bin-path" => "/usr/bin/php-cgi"
                                 )
                               )
                            )

#### CGI module
#cgi.assign                 = ( ".pl"  => "/usr/bin/perl",
#                               ".cgi" => "/usr/bin/perl" )
#

#### SSL engine
#ssl.engine                 = "enable"
#ssl.pemfile                = "server.pem"

#### status module
#status.status-url          = "/server-status"
#status.config-url          = "/server-config"

#### auth module
## read authentication.txt for more info
#auth.backend               = "plain"
#auth.backend.plain.userfile = "lighttpd.user"
#auth.backend.plain.groupfile = "lighttpd.group"

#auth.backend.ldap.hostname = "localhost"
#auth.backend.ldap.base-dn  = "dc=my-domain,dc=com"
#auth.backend.ldap.filter   = "(uid=$)"

#auth.require               = ( "/server-status" =>
#                               (
#                                 "method"  => "digest",
#                                 "realm"   => "download archiv",
#                                 "require" => "user=jan"
#                               ),
#                               "/server-config" =>
#                               (
#                                 "method"  => "digest",
#                                 "realm"   => "download archiv",
#                                 "require" => "valid-user"
#                               )
#                             )

#### url handling modules (rewrite, redirect, access)
#url.rewrite                = ( "^/$"             => "/server-status" )
#url.redirect               = ( "^/wishlist/(.+)" => "http://www.123.org/$1" )

#### both rewrite/redirect support back reference to regex conditional using %n
#$HTTP["host"] =~ "^www\.(.*)" {
#  url.redirect            = ( "^/(.*)" => "http://%1/$1" )
#}

#
# define a pattern for the host url finding
# %% => % sign
# %0 => domain name + tld
# %1 => tld
# %2 => domain name without tld
# %3 => subdomain 1 name
# %4 => subdomain 2 name
#
#evhost.path-pattern        = "/home/storage/dev/www/%3/htdocs/"

#### expire module
#expire.url                 = ( "/buggy/" => "access 2 hours", "/asdhas/" => "access plus 1 seconds 2 minutes")

#### ssi
#ssi.extension              = ( ".shtml" )

#### rrdtool
#rrdtool.binary             = "/usr/bin/rrdtool"
#rrdtool.db-name            = "/var/www/lighttpd.rrd"

#### setenv
#setenv.add-request-header  = ( "TRAV_ENV" => "mysql://user@host/db" )
#setenv.add-response-header = ( "X-Secret-Message" => "42" )

## for mod_trigger_b4_dl
# trigger-before-download.gdbm-filename = "/home/weigon/testbase/trigger.db"
# trigger-before-download.memcache-hosts = ( "127.0.0.1:11211" )
# trigger-before-download.trigger-url = "^/trigger/"
# trigger-before-download.download-url = "^/download/"
# trigger-before-download.deny-url = "http://127.0.0.1/index.html"
# trigger-before-download.trigger-timeout = 10

## for mod_cml
## don't forget to add index.cml to server.indexfiles
# cml.extension               = ".cml"
# cml.memcache-hosts          = ( "127.0.0.1:11211" )

#### variable usage:
## variable name without "." is auto prefixed by "var." and becomes "var.bar"
#bar = 1
#var.mystring = "foo"

## integer add
#bar += 1
## string concat, with integer cast as string, result: "www.foo1.com"
#server.name = "www." + mystring + var.bar + ".com"
## array merge
#index-file.names = (foo + ".php") + index-file.names
#index-file.names += (foo + ".php")

#### include
#include /etc/lighttpd/lighttpd-inc.conf
## same as above if you run: "lighttpd -f /etc/lighttpd/lighttpd.conf"
#include "lighttpd-inc.conf"

#### include_shell
#include_shell "echo var.a=1"
## the above is same as:
#var.a=1

# include other config file fragments from lighttpd.d subdir
include_shell "find /etc/lighttpd.d -maxdepth 1 -name '*.conf' -exec cat {} \;" 

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

A questo punto e' tutto pronto per Pydio.
Alla fine la macchina funziona ma non e' molto veloce ed inoltre non sono ancora configurate le API di Pydio per cui non e' possibile utilizzare i client desktop per sincronizzare i file

mercoledì 15 marzo 2017

Mini web server con Intel Edison

Una piccola guida per installare un web server con PHP su Intel Edison


Si parte connettendo la Edison alla WiFi interagendo prima con la connessione seriale via USB
configure_edison --wifi

si impostano poi il nome e la password
configure_edison --password
configure_edison --name

Per prima cosa deve essere evidenziato che nell'installazione standard di Yocto e' presente un web server basato su Node.JS. (si puo' verificare con netstat -tnpl)
Si deve quindi disattivare il web server su porta 80 (che peraltro non funziona) modificando il file /usr/lib/edison_config_tools/edison-config-server.js
e commentando la riga
http.createServer(requestHandler).listen(80)

a questo punto per installare Apache si modificano i repository con le istruzioni a questo link
http://alextgalileo.altervista.org/edison-package-repo-configuration-instructions.html

modificando il file
nano /etc/opkg/base-feeds.conf
Dopo aver modificato i repository si puo' iniziare ad installa i pacchetti


opkg update
opkg install apache2
opkg start apache2
opkg enable apache2

opkg install php 

A questo punto Apache funziona ma non interpreta le pagine php. Bisogna editare il file httpd.conf  con le seguenti righe

LoadModule php5_module lib/apache2/modules/libphp5.so

Include /etc/apache2/modules.d/70_mod_php5.conf

<IfModule mime_module>
    TypesConfig /etc/apache2/mime.types

e poi si edita /etc/httpd/conf/mime.types:
application/x-httpd-php php

la directory dove inserire i file html e' 

/usr/share/apache2/htdocs

mentre i file di log sono

/var/apache2/logs

Per impostare la giusta timezone 

opkg install ntpdate
ntpdate -v ntp1.inrim.it
timedatectl set-timezone "Europe/Paris"

Per modificare il DNS server di edita /etc/resolv.conf

domain lan
nameserver 8.8.8.8

infine, per effettuare il port forwarding e' necessario impostare un IP statico editando /etc/wpa_supplicant/wpa_cli-actions.sh 

if [ "$CMD" = "CONNECTED" ]; then
    kill_daemon udhcpc /var/run/udhcpc-$IFNAME.pid
#   udhcpc -i $IFNAME -p /var/run/udhcpc-$IFNAME.pid -S
    ifconfig $IFNAME 192.168.1.250 netmask 255.255.255.0
    route add default gw 192.168.1.254
fi
La Edison ha un server SSH che supporta anche SFTP. L'unico problema e' che accetta di default connessioni dall'utente root (questo puo' diventare un problema di sicurezza su server di produzione)

venerdì 23 dicembre 2016

Primi passi con Android Things su Intel Edison

Doveva chiamarsi Brillo ma alla fine IoT di Google e' diventato Android Things.

Per iniziare ad usarlo si deve configurare un dispositivo, nel mio caso una Intel Edison

Premessa: questa fase e' stata eseguita su due computer differenti perche' sulla mia Linux Box Centos 7 avevo qualche problema ad installare Platform Flash Tool di Intel (ed ho quindi usato Mac) mentre su Mac mi veniva generato un errore non comprensibile al momento di utilizzare fastboot (ed ho quindi usato Linux)

Si parte flashando il firmware della Edison scaricando il software da qui e l'immagine da qui (non ci sono altre impostazioni da fare ..di default si trova Flash file FlashEdison.json e Configuration Non_OS)

Si preme il tasto FW (SW1U3 il secondo da sinistra sopra al processore nell'Arduino Kit di Edison)
e si collega il cavo al connettore J16 (il tasto SW1 deve essere posizionato con il cursore verso J16)



a questo punto si clicca browse e si punta al file .zip e si attende

al termine delle operazioni si ha una schermata di questo tipo ed usando il comando
fastboot devices
si vede il dispositivo in modalita' fast boot
A questo punto si scarica entra nella directory dove e' stato scompattato il file precedentemente scaricato (androidthings_edison_devpreview_1.zip)

Ho provato a continuare a seguire la guida  ma su Mac e' stato generato il seguente comando


su Linux invece tutto procede bene

$ fastboot \
    flash gpt partition-table.img \
    flash u-boot u-boot-edison.bin \
    flash boot_a boot.img \
    flash boot_b boot.img \
    flash system_a system.img \
    flash system_b system.img \
    flash userdata userdata.img \
    erase misc \
    set_active _a

$ fastboot \
    flash gapps_a gapps.img \
    flash gapps_b gapps.img

$ fastboot \
    flash oem_a oem.img \
    flash oem_b oem.img

si riavvia quindi il dispositivo per togliere la modalita' fastboot e passare in modalita' device
fastboot reboot
adb devices
(attenzione; a questo punto e' necessario alimentare la Edison non solo dalla microUSB su J16)






martedì 30 agosto 2016

Intel Galileo Gen 2

Questa Intel Galileo e' stata presa su Ebay a circa 25 euro. Di fatto e' un prodotto che non si differenzia moltissimo da Intel Edison

Attenzione: la Galileo Gen 2 si differenzia dalla  Gen 1 per l'assenza del jack da 3.5 mm della porta seriale a fianco della porta Ethernet

In questo caso si tratta di un processore Quark x86  32 bit a 400 MHz di classe Pentium contro Atom di Edison, una scheda di rete cablata al posto della WiFi di Edison, 256 Mb di memoria flash contro gli 8 Gb di Edison



Ne vale la pena???
Per quanto l'ho pagata io decisamente si' ma il prezzo del componente nuovo varia tra gli 80 e 100 euro ed a questo punto la decisione vira decisamente per Intel Edison

La scheda viene venduta con il proprio alimentatore (e questo comincia ad essere un bel risparmio) ed al contrario di Edison non ha una porta di programmazione micro USB


Per entrare in consolle si deve connettere il cavo FTDI al connettore tra l'Ethernet e microUsb client. Il pin GND e' quello nero posto all'estrema sinistra della foto mentre le posizioni Rx e Tx occupano le posizioni 2 e 3 partendo da destra (il primo pin e' CTS)

La configurazione dei pin e' quindi

GND
RTS
vuoto
RX
TX
CTS

per entrare in shell l'account di default e' root senza password

La porta microUSB client e' usata solo per la programmazione degli sketch da Arduino IDE mentre la porta USB Host puo' alloggiare tastiera, mouse ed altri dispositivi
E' presente un lettore di carte microSD (fino a 32 Gb) ed un connettore per la LiPo in posizione simile a quello di Edison
E' possibile selezionare il voltaggio della parte Arduino a 3.3V e 5V con un apposito jumper al di sotto del connettore seriale ed inoltre nella parte inferiore c'e' l'ingresso per una scheda mini Pci Express (tipicamente per montare una schedina WiFi full length)

Esiste anche la comoda possibilita' di montare un modulo per l'alimentazione via POE

Importante : la scheda Ethernet di default non e' configurata (nemmeno via DHCP), si deve quindi alla prima accesione configurare il tutto via FTDI, assicurarsi il collegamento di rete e solo successivamente passare ad SSH







martedì 9 agosto 2016

Crontab su Intel Edison/Yocto

Curiosamente sull'immagine standard di Yocto di Intel Edison non e' installato il server di cron.

opkg update
opkg install cronie

Un piccolo riassunto per mia memoria della sintassi di crontab
ogni minuto
* * * * * /path/to/script

ogni 5 minuti
*/5 * * * * /path/to/script

ogni minuto pari
*/2 * * * * /path/to/script

ogni minuto dispari
1-59/2 * * * * /path/to/script

ogni 24 ore (a mezzanotte)0 0 * * * /path/to/script

Reverse SSH su Intel Edison

Il tunnel reverse SSH e' un metodo estremamente comodo per amministrare macchine su reti private senza necessariamente installare una VPN e senza dover cambiare le configurazioni dei firewall (questo perche' la connessione viene iniziata dall'interno della rete privata, regola generalmente accettata e non filtrata dai firewall su un protocollo SSH che viene spesso lasciato non filtrato)

Le condizioni necessarie sono
1) una macchina deve essere disponibile con indirizzo pubblico
2) le due macchine devono poter instaurare una connessione SSH

diciamo di avere una macchina A su indirizzo pubblico del tipo 150.217.xxx.xxx ed una chiamata B (una Intel Edison per esempio) su una rete privata con indirizzo del tipo 192.168.1.10. L'obbiettivo e' di amministrare la macchina B da A mediante una shell SSH

Per prima cosa si deve procedere allo scambio delle chiavi in modo da rendere l'autenticazione automatica (cio' aiuta nel caso in cui la connessione cada per creare uno script per riattivarla in modo automatico o per iniziare il reverse tunnel al boot)

Macchina B
con il comando
ssh-keygen 

si creano una coppia di chiave pubblica e privata per la macchina B.
Su Intel Edison non e' disponibile ssh-agent quindi e' piu' comodo NON utilizzare una passphrase 

a questo punto si copia la chiave pubblica sulla macchina A mediante

scp -P 22 ~/.ssh/id_rsa.pub root@150.217.xxx.xxx:~/.ssh/authorized_keys
per comodita' l'utente della Intel Edison e quello della macchina remota sono identici e sono root (lo so, non si fa....e' solo per semplicita')

da questo punto ci si dovrebbe loggare da B (Edison) al server esterno con il solo comando

ssh root@150.217.xxx.xxx
se tutto va bene si puo' procedere a creare il tunnel inverso

dalla macchina B si digita il comando
ssh -R 19999:localhost:22 root@150.217.xxx.xxx

a questo punto la connessione e' stabilita. Per amministrare la macchina B dalla macchina A si digita

ssh localhost -p 19999

e si entra nella shell di B

A questo punto non e' ancora finita perche' bisogna assicurarsi che la macchina B chiami A ad ogni riavvio (per esempio per mancanza di corrente)
Per fare cio' si deve creare la directory

mkdir /etc/init.d

copiare il file script che avvia il reverse tunnel e renderlo eseguibile
a questo punto si digita

update-rc.d script.sh defaults

sembra finito ma non e' cosi' perche' se la connessione non viene usata (ovvero non passano pacchetti lungo il tunnel) il collegamento viene resettato dopo un timeout. Non volendo modificare le impostazioni del server la soluzione piu' semplice e' usare autossh

L'installazione non e' banale perche' non e' disponibile il pacchetto opkg

wget http://www.harding.motd.ca/autossh/autossh-1.4e.tgz 
gunzip -c autossh-1.4e.tgz > autossh.tar  
tar xvf autossh.tar 
cd autossh-1.4e 
./configure 
make 
make install

si sostituisce il comando precedente con autossh

autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -L 19999:localhost:22 root@150.217.xxx.xxx 

un altro sistema e' quello di usare la sintassi
autossh -i /home/root/.ssh/id_rsa. -M 20002 -N -R 20000:localhost:22 root@150.217.73.18 &


lunedì 8 agosto 2016

Proxy settings ed OPKG su Intel Edison

Per poter effettuare gli aggiornamenti di Intel Edison all'interno di una rete proxata si deve configurare  il file /etc/opkg/opkg.conf modificando le option

Per motivi che non ho ben definito ho dovuto inserire l'indirizzo numerico del proxy perche' il DNS non riusciva a risolvere l'indirizzo mnemonico (il DNS funzionava correttamente su altre macchine della stessa rete)



domenica 7 agosto 2016

GMail Notifier con Yun ed Edison

Per verificare se vi sono messaggi non letti in una casella postale di GMail non e' necessario utilizzare l'accesso POP3 od IMAP. Esiste infatti un servizio Atom che riporta tale informazione



Per fare cio' si usa la url
https://mail.google.com/mail/feed/atom/label

ma prima di fare cio' si deve andare nella configurazione della propria mailbox e configurare almeno una label e poi associare un filtro ad una determinata label

per esempio si puo' creare una label Lavoro e poi creare un filtro che in base ad un indirizzo mail associa l'etichetta Lavoro.

per recuperare il numero delle mail arrivate con la label Lavoro E NON APERTE si puo' usare il comando dove username e' la mail privata di @gmail.com e la password  e' quella dell'account

curl -u username:password "https://mail.google.com/mail/feed/atom/Lavoro" -k --silent |grep -o "<fullcount>[0-9]*</fullcount>" |grep -o "[0-9]*"

se si lancia il comanda si ha un errore di violazione. Questo perche' gli account di GMail sono particolarmente protetti. Per fare si' che il comando abbia buon fine si deve andare nel proprio account e cercare Consenti app meno sicure e settare On

Fatto cio' si puo' creare uno script che se il numero delle mail non lette con una determinata label e' maggiore di zero effettua una azione, diciamo azionare un rele' collegato al pin D12 a sua volta collegato per esempio ad una sirena o ad una luce a 12 V





YUN
In YUN si procede caricando lo script bash e poi, dall'interfaccia web, si abilita l'accesso REST senza password (OPEN)


Si carica quindi lo sketch Bridge dagli esempi e si lancia lo script sottostante

------------------------------
gmail=$(curl -u username:password "https://mail.google.com/mail/feed/atom/Lavoro" -k --silent |grep -o "<fullcount>[0-9]*</fullcount>" |grep -o "[0-9]*")
#echo $gmail
if [ "$gmail" -gt "0" ]; then
        then curl http://localhost/arduino/digital/12/1;
else
        then curl http://localhost/arduino/digital/12/0;
fi
------------------------------

Edison 
------------------------------
advertence=$(curl -u username:password "https://mail.google.com/mail/feed/atom/Lavoro" -k --silent |grep -o "<fullcount>[0-9]*</fullcount>" |grep -o "[0-9]*")
echo $advertence

if [ "$advertence" -gt "0" ]; then
        ./accendi.py
else
    ./spegni.py
fi
------------------------------

accendi.py
------------------------------
#!/usr/bin/env python

import mraa

x = mraa.Gpio(12)
x.dir(mraa.DIR_OUT)
x.write(1)
------------------------------

spegni.py
------------------------------
#!/usr/bin/env python

import mraa

x = mraa.Gpio(12)
x.dir(mraa.DIR_OUT)
x.write(0)
------------------------------

lunedì 4 luglio 2016

Wired Ethernet su Intel Edison

Come prova ho provato a connettere via cavo Ethernet la Edison utilizzando un dongle USB-Ethernet

Il primo tentativo (ricordarsi di spostare il selettore verso la porta USB standard per attivarla) , utilizzando un dongle Lenovo USB 3 che usa il modulo cdc_ether, non e' andato a buon fine perche' il modulo non era riconosciuto dal kernel



Successivamente ho provato con un vecchio dongle USB-Ethernet di Apple che utilizza il modulo Asix  AX 88772 che e' stato immediatamente riconosciuto


[  872.328790] usb 1-1: new high-speed USB device number 3 using dwc3-host
[  872.368156] usb 1-1: New USB device found, idVendor=05ac, idProduct=1402
[  872.368187] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  872.368209] usb 1-1: Product: Apple USB Ethernet Adapter
[  872.368228] usb 1-1: Manufacturer: Apple Inc.     
[  872.368247] usb 1-1: SerialNumber: 019F66
[  873.250659] asix 1-1:1.0 eth0: register 'asix' at usb-dwc3-host.2-1, ASIX AX88772 USB 2.0 Ethernet, 00:1f:5b:ff:27:2e
[  873.379958] systemd-udevd[410]: renamed network interface eth0 to enp0s17u
1

Peraltro il dispositivo ha assunto direttamente l'IP da DHCP
-----------------------------------------------
root@edison:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: sit0: <NOARP> mtu 1480 qdisc noop
    link/sit 0.0.0.0 brd 0.0.0.0
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 98:f1:70:67:20:fb brd ff:ff:ff:ff:ff:ff
    inet 192.168.43.200/24 brd 192.168.43.255 scope global wlan0
       valid_lft forever preferred_lft forever
4: usb0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 02:00:86:73:47:06 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.15/24 brd 192.168.2.255 scope global usb0
       valid_lft forever preferred_lft forever
5: enp0s17u1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:1f:5b:ff:27:2e brd ff:ff:ff:ff:ff:ff
    inet 10.200.4.12/16 brd 10.200.255.255 scope global enp0s17u1
       valid_lft forever preferred_lft forever
    inet6 fe80::21f:5bff:feff:272e/64 scope link
       valid_lft forever preferred_lft forever

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

A questo puo' essere comodo disabilitare la connessione WiFi con i seguenti comandi

systemctl start connman
systemctl enable connman
connmnanctl
connmanctl> disable wifi




mercoledì 29 giugno 2016

Autostart Python e Sketch in Intel Edison

Gli sketch su Intel Edison, a differenza di Arduino, non vanno in esecuzione automatica.
Per fare cio si deve creare la directory /etc/init.d ed un file sh

mkdir /etc/init.d
cd /etc/init.d
vi automatico.sh


all'interno del file automatico.sh si digita il comando exec puntado al file sketch.elf che dovra' essere stato prima spostato dalla directory /tmp a /sketch
----------------------------
#!/bin/sh
exec /sketch/sketch.elf /dev/ttyGS0 /dev/ttyGS0

----------------------------
a questo punto per l'esecuzione automatica si rende il file eseguibile

root@edison:/etc/init.d# chmod +x /etc/init.d/automatico.sh
root@edison:/etc/init.d# update-rc.d automatico.sh defaults

lo stesso si puo' fare anche con gli script Python modificando il contenuto del file /etc/init.d/automatico.sh come segue
----------------------------
 #!/bin/sh
python /home/root/programma.py >> /dev/null 2>&1 &
----------------------------

lunedì 27 giugno 2016

Accedere da Arduino a Yocto su Intel Edison

Un altro sistema (dopo quello via seriale visto qui) per scambiare dati tra il lato Arduino ed il lato Edison e' quello di sfruttare il fatto che Arduino IDE espone il file system.

tramite il comando system e' possibile lanciare dei comandi sulla shell di Yocto e potendo creare file. Nel banale esempio sottostante si appende il valore 1 al file /home/root/luca.txt...forgiando la stringa in modo adeguato si possono per esempio salvare i valori letti  da un sensore o le stringhe GPS

mini sketch Arduino
--------------------------
void loop()
{
system("echo '1' >> /home/root/luca.txt");
delay(1000);
}
--------------------------

E' possibile oltre che a scrivere anche leggere i file sul parte Yocto da sketch Arduino

Scambio seriale tra Arduino Expansion Board e Intel Edison

Scambiare dati tra il lato Arduino (via Expansion Board) ed Intel Edison non e' immediato perche' in Yocto non sono predisposte porte seriali.(ripreso da questo link)

Per aggirare il problema si deve installare prima socat, con le istruzioni sotto indicate
----------------------------
wget http://www.dest-unreach.org/socat/download/socat-2.0.0-b8.tar.gz 
tar xvf socat-2.0.0-b8.tar.gz 
cd socat-2.0.0-b8 
configure 
make 
make install
----------------------------
Una volta installato il programma si creano delle interfacce seriali virtuali

nohup socat pty,link=$HOME/tty0,raw,echo=0 pty,link=$HOME/tty1,raw,echo=0 &

(viene generato un messaggio ma non si tratta di un errore)
Si vedra' che in /home/root/ sono comparsi di due dispositivi tty0 e tty1

Adesso si puo' caricare su Arduino IDE lo sketch sottostante che di fatto usa una seriale virtuale che punta su /home/root/tty0
----------------------------------------------
RingBuffer rx_buffer_S1;
TTYUARTClass mySerial(&rx_buffer_S1, 3, false);

void setup() {
  mySerial.init_tty("/home/root/tty0");
  mySerial.begin(115200);
}

void loop()
{
  mySerial.write("luca");
  delay(500);
}
---------------------------------------------

Per leggere i dati inviati dal lato Arduino (in questo caso una semplice stringa) e' sufficiente puntare minicom (o altro terminale seriale) su /home/root/tty1 con i parametri 115200 8N1

Intel Edison e Xbee

Connettere una Intel Edison ha una rete Xbee e' piuttosto semplice ed automatico
Dopo aver montato uno shield Arduino Xbee con il relativo modulo radio (gia' programmato) si invieranno e riceveranno i dati sulla connessione seriale /dev/ttyMFD1 (che di fatto cortocircuita i pin Rx/Tx 0 ed 1 di Arduino verso Yocto)



giovedì 23 giugno 2016

Programmare Arduino Expansion Board su Intel Edison

Edison Intel non e' una vera Arduino (nel senso che non monta un microcontrollore ATMEGA328) ma ha comunque un buon grado di compatibilita' anche per gli shield Arduino

Per la programmazione dei pin Arduino si puo' utilizzare Python o C++ mediante la libreria MRAA ed UPM

Blink led con Python
-----
 import mraa
 led = mraa.Gpio(13)
 led.dir(mraa.DIR_OUT)
led.write(1)
led.write(0)
exit()

-----

Lettura della porta analogica 0
-----
import mraa 
porta = mraa.Aio(0)
while 1: 
     valore = float(pot.read())
     print valore
-----

usando la libreria UPM sono gia' disponibili molti esempi su diversi sensori a questo indirizzo

Si puo' utilizzare anche Arduino IDE per controllare i pin. In questo caso si deve in modo preliminare configurare la scheda andando in Strumenti/Scheda/Gestore Schede installando Intel i686 Boards (Edison)

Utilizzando Arduino IDE l'upload degli sketch avviene in modo tradizionale. L'unica differenza fondamentale e' che gli sketch vengono salvati in /tmp per cui al successivo riavvio non sara'  piu ' disponibile. Per ovviare a questo problema si deve procedere come

cp /tmp/nome_sketch /sketch/sketch.elf
chmod 755 /sketch.sketch.elf


L'Expansion Board puo' essere programmata anche tramite C/C++. Per fare cio' si usa Intel System Studio IoT Edition (sostanzialmente una versione modificata di Eclipse)


Per lanciare il programma si usa ./iss-iot-launcher


Di fatto si tratta di programmazione remota perche' il file viene compilato sul PC e poi inviato ed eseguito sulla Edison via SSH (WiFi, Ethernet-over-Usb). Si deve quindi, prima di procedere, creare una connessione con Edison

I file compilati vengono copiati sulla /tmp di Edison. Per questo motivo non saranno disponibili dopo un riavvio a meno di non  copiare il file eseguibile in un'altra posizione

Blink in C++
----------------------------------------------
/*
 * Author: Jessica Gomez <jessica.gomez.hernandez@intel.com>
 * Copyright (c) 2015 - 2016 Intel Corporation.
 *
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

#include "mraa.h"

#include <stdio.h>
#include <unistd.h>

/*
 * On board LED blink C example
 *
 * Demonstrate how to blink the on board LED, writing a digital value to an
 * output pin using the MRAA library.
 * No external hardware is needed.
 *
 * - digital out: on board LED
 *
 * Additional linker flags: none
 */

int main()
{
// select onboard LED pin based on the platform type
// create a GPIO object from MRAA using it
mraa_platform_t platform = mraa_get_platform_type();
mraa_gpio_context d_pin = NULL;
switch (platform) {
case MRAA_INTEL_GALILEO_GEN1:
d_pin = mraa_gpio_init_raw(3);
break;
case MRAA_INTEL_GALILEO_GEN2:
d_pin = mraa_gpio_init(13);
break ;
case MRAA_INTEL_EDISON_FAB_C:
d_pin = mraa_gpio_init(13);
break;
default:
fprintf(stderr, "Unsupported platform, exiting");
return MRAA_ERROR_INVALID_PLATFORM;
}
if (d_pin == NULL) {
fprintf(stderr, "MRAA couldn't initialize GPIO, exiting");
return MRAA_ERROR_UNSPECIFIED;
}

// set the pin as output
if (mraa_gpio_dir(d_pin, MRAA_GPIO_OUT) != MRAA_SUCCESS) {
fprintf(stderr, "Can't set digital pin as output, exiting");
return MRAA_ERROR_UNSPECIFIED;
};

// loop forever toggling the on board LED every second
for (;;) {
mraa_gpio_write(d_pin, 0);
sleep(1);
mraa_gpio_write(d_pin, 1);
sleep(1);
}

return MRAA_SUCCESS;
}
----------------------------------------------

Node.JS

nonostante sia possibile programmare Edison con Node:JS non sono riuscito a far funzionare XKD Iot su Centos. Si puo' comunque usare Node. direttamente da shell senza usare la programmazione remota

Blink led con Node.JS
-----
var mraa = require('mraa'); 
console.log('MRAA Version: ' + mraa.getVersion());
var myOnboardLed = new mraa.Gpio(13); 
myOnboardLed.dir(mraa.DIR_OUT); 
-----

Lettura della porta analogica 0
-----
var mraa = require('mraa'); 
console.log('MRAA Version: ' + mraa.getVersion()); 
var analogPin0 = new mraa.Aio(0); 
var analogValue = analogPin0.read(); 
console.log(analogValue);
-----

Ethernet-over-USB per Intel Edison su Linux

La Intel Edison oltre alla connessione della consolle via Seriale e via WiFi dispone anche della possibilita' di stabilitre una connessione TCP anche via cavo Usb con il protocollo Ethernet-over-USB (su Windows prende il nome del protocollo proprietario RNDIS)

Se si collega Edison con la porta USB-OTG e si digita sul Pc il comando
ip a

si ottiene un nuovo dispositivo che nel mio caso specifico e' enp0s26u1u1uc2.
Intel Edison ha un Ip statico sulla connessione USB (192.168.2.15). Per ottenere una connessione SSH via USB e' sufficiente impostare l'ip della connessione lato PC con

ifconfig enp0s26u1u1uc2 192.168.2.2

a questo punto si puo' lanciare la sessione ssh con
ssh root@192.168.2.15

questa configurazione puo' essere utile nel caso si voglia programmare il dispositivo utilizzando iss-iot-linux (l'ambiente di sviluppo Linux/Eclipse per Edison) senza la necessita' di attivare un access point

Flash firmware su Intel Edison

E' passato un paio di settimane che gioco con Intel Edison e sono gia' nella necessita' di flashare il firmware (cercando di installare un dongle USB-Ethernet ho incasinato la connessione WiFi)




Per ripristinare il sistema operativo di Edison si parte scaricando il file
iot-devkit-prof-dev-image-edison-2010606.zip

p
Prima di procedere oltre si deve installare il programma dfu-util.
La sequenza e' la seguente

git clone git://git.code.sf.net/p/dfu-util/dfu-util
cd dfu-util
./autogen.sh
./configure
make
make install

a questo punto si puo' lanciare il file ./flash_all.sh

Si vedono scorrere i seguenti messaggi (il tempo e' di circa 5 minuti)
------------------------------------------------------
[root@localhost immagine]# ./flashall.sh
Using U-Boot target: edison-blankcdc
Now waiting for dfu device 8087:0a99
Please plug and reboot the board
Flashing IFWI
Download    [=========================] 100%      4194304 bytes
Download    [=========================] 100%      4194304 bytes
Flashing U-Boot
Download    [=========================] 100%       237568 bytes
Flashing U-Boot Environment
Download    [=========================] 100%        65536 bytes
Flashing U-Boot Environment Backup
Download    [=========================] 100%        65536 bytes
Rebooting to apply partition changes
Now waiting for dfu device 8087:0a99
Flashing boot partition (kernel)
Download    [=========================] 100%      6144000 bytes
Flashing rootfs, (it can take up to 5 minutes... Please be patient)
Download    [=========================] 100%   1373149184 bytes
Rebooting
U-boot & Kernel System Flash Success...
Your board needs to reboot to complete the flashing procedure, please do not unplug it for 2 minutes.


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

Al reboot si collega il cavo USB alla porta seriale per ottenere una consolle

screen /dev/ttyUSB1 115200

(per terminare una connessione screen CTRL+A CTRL+D)

di default l'utente root non ha password. Al login basta digitare root e si entra in shell
Per ottenere la connessione SSH si deve prima configurare la password del dispositivo con

configure-edison --password

a questo punto si configura la connessione WiFi con
configure-edison --wifi

il dispositivo, oltre all'Ip, puo' essere anche richiamato come edison.local

per terminare e' sufficiente installare gli aggiornamenti di sistema

opkg update
opkg upgrade

Facendo cio' si genera il seguente errore
Failed to download http://iotdk.intel.com/repos/3.5/intelgalactic/opkg/i586//Packages

l'errore e' generato dal fatto che la directory non esiste: Guardando al sistema precedente (il 3.0) nella directory http://iotdk.intel.com/repos/3.0/intelgalactic/opkg/i586/ sono contenuti gli aggiornamenti per la libreria mraa e upm ma questi nel sistema 3.5 sono contenuti in http://iotdk.intel.com/repos/3.5/iotdk/edison/core2-32/

Per questo motivo credo si tratti solo di un refuso nel file dei repository nel passaggio da 3.0 a 3.5



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