mercoledì 30 gennaio 2019

Invio SMS da Particle Electron da interrupt

Come gestire gli interrupt fisici su Particle Electron ed inviare SMS
Al contratio di Arduino Uno sulla Electron ci sono molteplici pin che possono essere settati per ricevere un interrupt. In questo caso e' stato scelto il D2


Per atttivare l'interrupt viene mandata una corrente di 3.3V sul Pin D2 e viene settata una variabile volatile in modo che possa essere intercettata anche fuori dall'interrupt nella funzione loop. La gestione di invio inoltre non puo' essere gestita all'interno della funzione di interrupt

per la compilazione

particle compile electron interrupt.ino --saveTo interrupt.bin
particle flash --usb  interrupt.bin 

Nel video si osserva la procedura

----------------------------------------------------------------
#include "application.h"
#include "cellular_hal.h"
STARTUP(cellular_credentials_set("TM", "", "", NULL));

const char* phNum = "+3934710xxxxx";
const char* msg = "Interrupt fired";
int  ret;
volatile bool invio;

void  IN4_ISR() {
      invio = true;
}

void setup()
{
  invio = false;
 pinMode(D7, OUTPUT);
 pinMode(D2, INPUT_PULLDOWN);    // sets pin as input
 attachInterrupt(D2, IN4_ISR, FALLING);  //RISING, FALLING, CHANGE
}

void loop()
    {
      if (invio)
      {
        digitalWrite(D7, HIGH);
        ret = Cellular.command("AT+CMGF=1\r\n");
        ret = Cellular.command("AT+CMGS=\"%s%s\",129\r\n",(phNum[0] != '+') ? "+" : "", phNum); //
        ret = Cellular.command("%s\x1a", msg);
        invio = false;
        delay(500);
        digitalWrite(D7, LOW);
      }

}

martedì 29 gennaio 2019

Electron Particle e SIM Mobile Things

Dopo un po' di tempo ho ripreso in mano la Electron Sparkle ed ho montato una scheda SIM di Things Mobile. Nel tempo peraltro e' andata persa l'antenna originale della confezione prodotta da Taoglass ed il dispositivo non puo' funzionare senza... ho preso questa antenna su Amazon come sostituzione


Per configurare la scheda con una SIM di terze parti si deve installare la parte CLI di Particle con

npm install --unsafe-perm --verbose -g particle-cli

(attenzione potrebbero esserci problemi nella compilazione della seriale)

particle update

Per effettuare il flash del firmware si deve premere RESET+MODE, poi rilasciare RESET e tenendo premuto MODE attendere che il led diventi giallo

Si deve scaricare il file Tinker.ino modificando l'APN che per Mobile Things e' TM

#include "cellular_hal.h"
STARTUP(cellular_credentials_set("TM", "", "", NULL));
ed impostando il KeepAlive

Queste righe dovranno essere comprese in ogni script che verra' caricato sul dispositivo

si compila quindi
particle compile electron tinker.ino --saveTo firmware.bin
particle flash --usb firmware.bin


Puo' essere necessario effettuare il claim del device ma prima si deve conoscere il seriale
Per effettuare l'identify si deve premere il pusante Mode fino a quando il led diventa blu.
A questo punto si lancia

particle identify

Ci si logga sul cloud
particle cloud login

e si efffettua il claim
particle device add device_ID


Per verificare che tutto sia andato a buon fine si puo' provare ad accendere il led blu da linea di comando con il comando (dove Geocell e' il nome mnemonico del dispositivo)

particle call Geocell digitalwrite D7,HIGH

per l'invio degli SMS Mobile Things non ha problemi ed e' sufficiente il seguente codice
-----------------------------------------------
const char* phNum = "+39347107xxxxx";
const char* msg = "Test message";
int  ret;

void setup() {
Serial.begin(115200);
ret = Cellular.command("AT+CMGF=1\r\n");
Serial.print("Return from message format = ");
Serial.println(ret);
ret = Cellular.command("AT+CMGS=\"%s%s\",129\r\n",(phNum[0] != '+') ? "+" : "", phNum); //
Serial.print("Return from phNum send = ");
Serial.println(ret);
ret = Cellular.command("%s\x1a", msg);
Serial.print("Return from message send = ");
Serial.println(ret);

}


void loop() {

}
--------------------------------------------------



lunedì 28 gennaio 2019

Installazione Linux su IBM Netvista 8307

Questo piccolo IBM NetVista aveva bisogno di una nuova vita ricominciando da Linux....ma c'e' stato qualche problema. La macchina e' un P4 2.8GHz Single Core, 1 Gb Ram, 40 Gb HD


Il primo tentativo e' stato quello di effettuare un boot da USB Drive....niente da fare...il BIOS non supporta supporti USB...comprati e masterizzati DVD per procedere

La seconda sorpresa....il CPU non e' una x86-64. Ovviamente avevo masterizzato una Crunchbang 64 bit....via con il secondo download ed la seconda masterizzazione

Inizia l'installazione e kernel panic. Niente APIC....in fase di avvio bisogna avviare Grub di andare NoApic


Ennesimo riavvio e messaggio esoterico ..riavvio



a questo punto non riesce ad identificare il modo grafico giusto come avviare l'installazione (ero partito fiduciosamente per l'installer grafico)...Imposto il 311 ed inizia l'installazione


Formattazione del disco fisso e.....drive rotto. Basta non e' giornata...e per una macchina del genere non so quanto valga la pena cambiare HD....a proposito...anche il DVD Rom e' risultato non funzionante

Breakout Level Converter per Arduino

E' sempre piu' comune trovare elettronica a 3.3V e puo' succedere di doverla interfacciare con dispositivi a 5V...tipicamente una porta seriale

Per non friggere tutto si usano i level converter

Si collegano due tensioni di riferimento a 5V (su HV e GND) e 3.3 V (su LV e GND) e poi si possono usare i rimanenti pin (che corrispondono a 4 canali) per trasferire il segnale in modo bidirezionale dal pin superiore (per esempio HV1 canale 1 ad alto voltaggio) al pin inferiore (per esempio LV1 canale 1 basso voltaggio)


Testare un transistor con un multimetro

Per testare il transistor 2N2222A ho usato un tester ProKit MT-1210. Questo tester ha una predisposizione per cui si puo' misurare direttamente il valore di hFE ovvero il guadagno in corrente continua

Inserendo Emettitore, Base e Collettore nei rispettivi alloggiamenti e selezionando la funzione hFE si ottiene una lettura di 228 (le impostazioni di misura del multimetro sono 10 microA sul collettore ed una Vce di 2.8V a 20°C)




A questo punto si puo' andare a consultare la scheda tecnica del transistor. Il grafico e' basato su una Vce di 10 V
e' quindi verificato il funzionamento del transistor

Interruttore con transistor 2N2222A con Arduino

Invece di usare come al solito (e per comodita') un relay qui viene descritto come usare un transistor in funzione di interruttore. Il transistor in questione e' un 2N2222A (da non confondere con il P2N2222A dato che hanno la posizione dell'emettitore e del collettore invertiti)




Un pin digitale (il 13) e' collegato alla base del transistor per pilotare l'apertura o chiusura dell'interruttori (non dimenticarsi della resistenza)

Il transistor e' posizionato a valle dell'utilizzatore (qui semplificato con un led) ovvero sul lato GND

Si carica sull'Arduino lo sketch di esempio Blink

Ma perche' utilizzare un sistema cosi' complicato quando si potrebbe derivare la corrente dal pin13?? Perche' i pin digitali di Arduino possono erogare al massimo 45 mA e non possono quindi alimentare degli utilizzare piu' esigenti in termini di corrente

Per una trattazione piu' completa anche se introduttiva seguire questo link

venerdì 25 gennaio 2019

MKR1000 Sleep Mode con Interrupt da RTC

Ho ripreso in mano anche la MKR1000 per testare le capacita' di sleep mode in rapporto ad Arduino Uno. La MKR1000 ha un processore completamente differente (un SAMD21  per la precisione) e integra un RTC per cui non ha bisogno di supporto esterno



Un paio di annotazioni
1) La MKR1000 non ha un pulsante di accensione e l'unico modo di spengerla e' staccare la batteria. Cio' e' abbastanza fastidioso

2) In un caso ho perso il controllo della scheda perche' non si vedeva il device tra i dispositivi USB. In questi casi si deve premere in modo ravvicinato nel tempo per due volte il pulsante di reset

3) Per minimizzare il consumo si deve esplicitamente spengere il modulo Wifi, questa operazione non viene eseguita dallo standbymode

4) Le alimentazioni, quando e' presente la sola LiPo, sono a 3.3V. La porta a 5V in alimentazione output e' disponibile solo quando c'e' un cavo USB che alimenta dall'esterno

Il trucco per impostate il risveglio da RTC e' simile a quello visto in questo post. Si setta un'allarme ad una certa ora, poi all'interno del codice di interrupt si setta il nuovo allarme nel futuro. In questo esempio gli allarmi sono spostati nel tempo di un minuto

(il codice e' stato ripreso da questo link originario e leggermente migliorato per le mie esigenze)
----------------------------------------------

#include <RTCZero.h>

#include <WiFi101.h>


RTCZero rtc;

bool matched = false;
int alarmMinutes = 15;

/* Change these values to set the current initial time */
const byte seconds = 0;
const byte minutes = 14;
const byte hours = 14;

/* Change these values to set the current initial date */
const byte day = 25;
const byte month = 1;
const byte year = 19;

void setup()
{
  Serial.begin(9600);


  WiFi.end();



  rtc.begin();

  rtc.setTime(hours, minutes, seconds);
  rtc.setDate(day, month, year);

  rtc.setAlarmMinutes(alarmMinutes);
  
  rtc.enableAlarm(rtc.MATCH_MMSS);
  rtc.attachInterrupt(alarmMatch);
}

void loop()
{
  if (matched) {


    matched = false;
    printDate();
    printTime();
    Serial.println();
    delay(1000);
        
    alarmMinutes= (rtc.getMinutes()+1)%60;
    rtc.setAlarmMinutes(alarmMinutes);
    rtc.enableAlarm(rtc.MATCH_SS);
    rtc.attachInterrupt(alarmMatch);

    rtc.standbyMode();    // Sleep until next alarm match
  }
}

void alarmMatch()
{
  matched = true;
}

void printTime()
{
  print2digits(rtc.getHours());
  Serial.print(":");
  print2digits(rtc.getMinutes());
  Serial.print(":");
  print2digits(rtc.getSeconds());
  Serial.println();
}

void printDate()
{
  Serial.print(rtc.getDay());
  Serial.print("/");
  Serial.print(rtc.getMonth());
  Serial.print("/");
  Serial.print(rtc.getYear());
  Serial.print(" ");
}

void print2digits(int number) {
  if (number < 10) {
    Serial.print("0");
  }
  Serial.print(number);
}

Change Detection with structural similarity

L'idea di base e' quella di cercare le differenze tra le due immagini sottostanti Non e' immediatamente visibile ma ci sono dei ...