La mia prima calcolatrice scientifica...ancora dopo 30 anni ha le batterie funzionanti
lunedì 21 gennaio 2019
LCD-286
Questo computer e' piuttosto particolare perche' non presenta nessun etichetta che indichi la ditta di fabbricazione oppure codice identificativo ad esclusione di LCD-286
Chiuso si presenta come un parallelepipedo con la tastiera che copre l'LCD
Chiuso si presenta come un parallelepipedo con la tastiera che copre l'LCD
Si tratta sostanzialmente di un desktop 286 con tastiera a presa DIN con un display LCD inclinabile (esiste un pulsante Tilt che sgancia il display e permette di inclinarlo)
Si possono montare dei floppy disk drive da 3 1/2 e 5 1/4 standard
Queste invece sono le schede ISA nascoste dietro uno sportellino
Su internet ho trovato altre macchine simili senza marca... forse si tratta OEM
venerdì 18 gennaio 2019
Sviluppare Alexa Skills: Echo od emulatore??
Questa e' una cosa che ho imparato a spese mie: gli emulatori di Alexa, anche quello ufficiale di Amazon, non hanno lo stesso comportamento e funzionalita' dei dispositivi Echo
Per esempio gli emulatori hanno problemi sono le skills di flash briefing od con il reprompt
Quando si sviluppa e' quindi sempre meglio utilizzare un dispositivo Echo reale in modo da non perdere la testa pensando di aver fatto un errore nel codice di una skill quando invece il problema e' il dispositivo
Per esempio gli emulatori hanno problemi sono le skills di flash briefing od con il reprompt
Quando si sviluppa e' quindi sempre meglio utilizzare un dispositivo Echo reale in modo da non perdere la testa pensando di aver fatto un errore nel codice di una skill quando invece il problema e' il dispositivo
Alexa Skills: Reprompt e YesNoIntent
Per avere una maggiore interazione utente Alexa puo' terminare la propria frase con una domanda e rimanere in attesa di una risposta da parte dell'utente
Questa fase e' gestita tramite la direttiva reprompt e si possono usare le BuildIntents Yes e No quando e' sufficiente che l'utente interagisca in modo affermativo o negativo
Per esempio partendo da un custom intent si puo' aggiungere il reprompt
===========================================
const geo = {
canHandle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
return (request.type === 'IntentRequest'
&& request.intent.name === 'geo');
},
async handle(handlerInput) {
const response = await httpGet();
//console.log("Risposta "+response);
const { intent } = handlerInput.requestEnvelope.request;
const activity = intent.slots.luogo.value;
var speechOutput = response;
if (activity == "firenze")
{
speechOutput = "_______________";
//console.log("Speechout firenze"+ speechOutput+data);
}
if (activity == "milano")
{
speechOutput = "_______________";
}
console.log(activity);
return handlerInput.responseBuilder
.speak(speechOutput)
.reprompt("Vuoi la spiegazione del messaggio?")
.getResponse();
},
};
===========================================
"name": "AMAZON.YesIntent",
"samples": []
}
Questa fase e' gestita tramite la direttiva reprompt e si possono usare le BuildIntents Yes e No quando e' sufficiente che l'utente interagisca in modo affermativo o negativo
Per esempio partendo da un custom intent si puo' aggiungere il reprompt
===========================================
const geo = {
canHandle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
return (request.type === 'IntentRequest'
&& request.intent.name === 'geo');
},
async handle(handlerInput) {
const response = await httpGet();
//console.log("Risposta "+response);
const { intent } = handlerInput.requestEnvelope.request;
const activity = intent.slots.luogo.value;
var speechOutput = response;
if (activity == "firenze")
{
speechOutput = "_______________";
//console.log("Speechout firenze"+ speechOutput+data);
}
if (activity == "milano")
{
speechOutput = "_______________";
}
console.log(activity);
return handlerInput.responseBuilder
.speak(speechOutput)
.reprompt("Vuoi la spiegazione del messaggio?")
.getResponse();
},
};
===========================================
Si aggiunge quindi il buildinten Yes
-------------------------------------------------
{"name": "AMAZON.YesIntent",
"samples": []
}
-------------------------------------------------
a questo punto per gestire la eventuale risposta positiva si aggiunge alla lambda
--------------------------------------------------
const YesHandler = {
canHandle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
return request.type === 'IntentRequest'
&& request.intent.name === 'AMAZON.YesIntent'
},
handle(handlerInput) {
return handlerInput.responseBuilder
.speak("Speigazione")
.getResponse();
},
};
--------------------------------------------------
si deve infine aggiungere lo YesHandler
---------------------------------------------------
const skillBuilder = Alexa.SkillBuilders.standard();
exports.handler = skillBuilder
.addRequestHandlers(
LaunchRequestHandler,
YesHandler,
geo,
HelpHandler,
ExitHandler,
SessionEndedRequestHandler
)
.addErrorHandlers(ErrorHandler)
.lambda();
martedì 15 gennaio 2019
Installare Debian testing su Lenovo X1 Carbon
Mi sono trovato a dover installare Debian su un Ultrabook Lenovo X1 Carbon e dover seguire una procedura mai provata.
Di solito installo i driver della scheda WiFi al secondo riavvio, anche perche' i driver sono spesso proprietari, usando la Ethernet per scaricare la distribuzione (Debian testing e' scaricabile solo come netinst)
X1 Carbon non ha una Ethernet integrata ed il dongle USB della Lenovo monta un Realtek 8153 il cui driver non e' compreso nel Cd di installazione
Come fare allora. Arrivato a questa schermata ho trovato il firmware della scheda di rete Wireless del Carbon (iwlwifi-7260-17.ucode), ho scaricato il file .dpgk su un altro computer, lo ho scompattato con ar e salvato il file .ucode (nel pacchetto ve ne sono molti altri) su una chiavetta USB
A questo punto ho rimosso il supporto USB con la iso Debian e messo quello con il driver. L'installer ha preso al volo il cambio di chiavetta e montato il driver attivando il WiFi. E' pero' necessario continuare l'installazione con il supporto di installazione e qui le cose si fanno un po' piu/ complicate.,...reinserendo la chiavetta di installazione questa non viene montata in automatico. Si deve entrare in shell (CTRL+ALT+F4) e montare a mano la chiavetta su /cdrom.
A questo punto si ritorna sulla finestra dell'installer (CTRL+ALT+F7) per terminare la configurazione
Di solito installo i driver della scheda WiFi al secondo riavvio, anche perche' i driver sono spesso proprietari, usando la Ethernet per scaricare la distribuzione (Debian testing e' scaricabile solo come netinst)
X1 Carbon non ha una Ethernet integrata ed il dongle USB della Lenovo monta un Realtek 8153 il cui driver non e' compreso nel Cd di installazione
Come fare allora. Arrivato a questa schermata ho trovato il firmware della scheda di rete Wireless del Carbon (iwlwifi-7260-17.ucode), ho scaricato il file .dpgk su un altro computer, lo ho scompattato con ar e salvato il file .ucode (nel pacchetto ve ne sono molti altri) su una chiavetta USB
A questo punto ho rimosso il supporto USB con la iso Debian e messo quello con il driver. L'installer ha preso al volo il cambio di chiavetta e montato il driver attivando il WiFi. E' pero' necessario continuare l'installazione con il supporto di installazione e qui le cose si fanno un po' piu/ complicate.,...reinserendo la chiavetta di installazione questa non viene montata in automatico. Si deve entrare in shell (CTRL+ALT+F4) e montare a mano la chiavetta su /cdrom.
A questo punto si ritorna sulla finestra dell'installer (CTRL+ALT+F7) per terminare la configurazione
SSR Relay a stato solido per Arduino
Per un progetto in cui mi serve un relay ho voluto provare a sostituire un rele' meccanico con uno a stato solido (in particolare un modulo da due SSR della Keyestudio)
Lo ho connesso come d'uso per i relay ad una Arduino Uno e non avevo interruzione di corrente al dispositivo
Dopo un po' di pensatoio ho provato ad isolare il problema.
A componente singolo attaccato ad Arduino l'SSR presenta due stati: uno a resistenza infinita (ops....molto molto alta sopra la scala del multimetro) ed uno stato di circa 6 KOhm...in pratica c'e' uno stato disconnesso ed uno con una resistenza non trascurabile....non c'e' praticamente circuitazione tra i due connettori quando il rele' e' chiuso
Se attacco un carico sui terminali la cosa diventa ancora piu' strana....in pratica il rele' non interrompe mai la connessione tra gli elettrodi... alla fine sono capitato su questo documento in cui viene spiegato il motivo per cui un rele' non fa il suo lavoro
Torno ai rele' meccanici....
Lo ho connesso come d'uso per i relay ad una Arduino Uno e non avevo interruzione di corrente al dispositivo
Dopo un po' di pensatoio ho provato ad isolare il problema.
A componente singolo attaccato ad Arduino l'SSR presenta due stati: uno a resistenza infinita (ops....molto molto alta sopra la scala del multimetro) ed uno stato di circa 6 KOhm...in pratica c'e' uno stato disconnesso ed uno con una resistenza non trascurabile....non c'e' praticamente circuitazione tra i due connettori quando il rele' e' chiuso
Se attacco un carico sui terminali la cosa diventa ancora piu' strana....in pratica il rele' non interrompe mai la connessione tra gli elettrodi... alla fine sono capitato su questo documento in cui viene spiegato il motivo per cui un rele' non fa il suo lavoro
Torno ai rele' meccanici....
lunedì 14 gennaio 2019
Arduino Sleep Mode e risveglio con Interrupt da DS3231
Arduino ha diverse modalita' di funzionamento, oltre a quella standard, per ridurre al minimo il consumo di una eventuale batteria. La modalita' sleep mode interna al processore prevede un watchdog che puo' essere settato al massimo ad 8 secondi; per ottenere dei tempi di sleep mode piu' lunghi di deve fornire al microprocessore un segnale dall'esterno che viene gestito come interrupt
Per fornire tale segnale esterno uno dei metodi piu' comodi e' quello di usare un RTC che preveda il canale SQW come il DS3231 (che peraltro risulta essere molto piu' preciso del DS1307)
Il DS3231 funzione su I2C per cui le connessioni sono VCC=3.3 V (attenzione), GND, SDA su A4 Arduino e SCL su A5 Arduino. In piu' si deve collegare SQW sul Pin dell'Arduino per avere segnale di risveglio
Sul DS3231 ci sono due allarmi ma ne sara' usato uno che dopo ogni utilizzo sara' spostato di 60 minuti nel futuro e subito dopo la scheda sara' messa in sleep mode in attesa di essere risvegliata
Il codice del loop riparte dall'ultima istruzione eseguita prima di essere andata in sleep
-------------------------------------------------------------------------------------------------
#include <Wire.h>
#include <RTClibExtended.h>
#include <LowPower.h>
#define wakePin 2
RTC_DS3231 rtc;
//-------------------------------------------------
void wakeUp() // here the interrupt is handled after wakeup
{
}
//------------------------------------------------------------
void setup() {
Serial.begin(9600);
delay(3000);
//imposta il PIN D2 per il wqakeup
pinMode(wakePin, INPUT);;
Wire.begin();
rtc.begin();
rtc.adjust(DateTime(__DATE__, __TIME__)); //imposta l'orologio in fase di compilazione col computer
//elimina allarmi eventualmente presenti
rtc.armAlarm(1, false);
rtc.clearAlarm(1);
rtc.alarmInterrupt(1, false);
rtc.armAlarm(2, false);
rtc.clearAlarm(2);
rtc.alarmInterrupt(2, false);
rtc.writeSqwPinMode(DS3231_OFF);
delay(1000);
Serial.println("Inizio");
}
//------------------------------------------------------------
void loop() {
DateTime now = rtc.now();
Serial.print(now.hour(),DEC);
Serial.print(":");
Serial.print(now.minute(),DEC);
Serial.print(":");
Serial.print(now.second(),DEC);
Serial.println();
//calcola la prossima ora di risveglio ovvero dopo un'ora
DateTime nextAlarm = now + TimeSpan(0, 1, 0, 0);
// l'ordine del timespan e' giorni,ore,minuti,secondi
rtc.setAlarm(ALM1_MATCH_HOURS, nextAlarm.minute(), nextAlarm.hour(), nextAlarm.second()); //imposta l'allarme
rtc.alarmInterrupt(1, true);
delay(3000); // wait for console
attachInterrupt(0, wakeUp, LOW);
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); //entra in sleep su questa istruzione
detachInterrupt(0); //execution resumes from here after wake-up
//cancella la precedente impostazione dell'allarme 1
rtc.armAlarm(1, false);
rtc.clearAlarm(1);
rtc.alarmInterrupt(1, false);
delay(3000);
}
Per fornire tale segnale esterno uno dei metodi piu' comodi e' quello di usare un RTC che preveda il canale SQW come il DS3231 (che peraltro risulta essere molto piu' preciso del DS1307)
Il DS3231 funzione su I2C per cui le connessioni sono VCC=3.3 V (attenzione), GND, SDA su A4 Arduino e SCL su A5 Arduino. In piu' si deve collegare SQW sul Pin dell'Arduino per avere segnale di risveglio
Sul DS3231 ci sono due allarmi ma ne sara' usato uno che dopo ogni utilizzo sara' spostato di 60 minuti nel futuro e subito dopo la scheda sara' messa in sleep mode in attesa di essere risvegliata
Il codice del loop riparte dall'ultima istruzione eseguita prima di essere andata in sleep
-------------------------------------------------------------------------------------------------
#include <Wire.h>
#include <RTClibExtended.h>
#include <LowPower.h>
#define wakePin 2
RTC_DS3231 rtc;
//-------------------------------------------------
void wakeUp() // here the interrupt is handled after wakeup
{
}
//------------------------------------------------------------
void setup() {
Serial.begin(9600);
delay(3000);
//imposta il PIN D2 per il wqakeup
pinMode(wakePin, INPUT);;
Wire.begin();
rtc.begin();
rtc.adjust(DateTime(__DATE__, __TIME__)); //imposta l'orologio in fase di compilazione col computer
//elimina allarmi eventualmente presenti
rtc.armAlarm(1, false);
rtc.clearAlarm(1);
rtc.alarmInterrupt(1, false);
rtc.armAlarm(2, false);
rtc.clearAlarm(2);
rtc.alarmInterrupt(2, false);
rtc.writeSqwPinMode(DS3231_OFF);
delay(1000);
Serial.println("Inizio");
}
//------------------------------------------------------------
void loop() {
DateTime now = rtc.now();
Serial.print(now.hour(),DEC);
Serial.print(":");
Serial.print(now.minute(),DEC);
Serial.print(":");
Serial.print(now.second(),DEC);
Serial.println();
//calcola la prossima ora di risveglio ovvero dopo un'ora
DateTime nextAlarm = now + TimeSpan(0, 1, 0, 0);
// l'ordine del timespan e' giorni,ore,minuti,secondi
rtc.setAlarm(ALM1_MATCH_HOURS, nextAlarm.minute(), nextAlarm.hour(), nextAlarm.second()); //imposta l'allarme
rtc.alarmInterrupt(1, true);
delay(3000); // wait for console
attachInterrupt(0, wakeUp, LOW);
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); //entra in sleep su questa istruzione
detachInterrupt(0); //execution resumes from here after wake-up
//cancella la precedente impostazione dell'allarme 1
rtc.armAlarm(1, false);
rtc.clearAlarm(1);
rtc.alarmInterrupt(1, false);
delay(3000);
}
Iscriviti a:
Post (Atom)
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...
-
In questo post viene indicato come creare uno scatterplot dinamico basato da dati ripresi da un file csv (nel dettaglio il file csv e' c...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...
-
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...