Sviluppare in C per STM8

Di recente ho fatto una ricerca in Internet per trovare il microcontrollore più economico. Tale ricerca è stata effettuata sui siti dei maggiori distributori professionali di componenti elettronici ed il risultato è stato chiarissimo: il micro più economico (per quantità da produzione) è lo STM8.

Le versioni disponibili sono tante, ma rimanendo sul principio del “very cheap”, ho selezionato due modelli. Il primo è lo STM8S001J3M3 (8 pin) e il secondo lo STM8S103F3P6 (20 pin). Per vostra informazione, il secondo si trova anche montato su delle piccole schede di sviluppo, di manifattura Cinese, disponibili on-line a 1 Euro! Sì, con 1 Euro comprate una scheda di sviluppo che comprende: il microcontrollore, una presa microUSB per l’alimentazione, un regolatore di tensione a 3.3V, un pulsantino di reset e un paio di leds. La scheda ha inoltre i connettori “strip” a passo 2.54mm per collegare le vostre periferiche agli I/O disponibili.

Per poter caricare e testare i vostri programmi sul microcontrollore, avete poi bisogno dello strumento hardware che svolge le funzioni di programmer / debugger. Bene, questo strumento (che potete trovare cercando: ST-Link V2) si compra on-line, sempre di produzione Cinese, a meno di 2 Euro! Sì, programmare e fare debug in real-time per meno di 2 Euro! E’ incredibile. Io iniziai la mia carriera sul sistema di sviluppo Intel nel 1977 e ricordo che il “blue box” costava quanto un’automobile di media cilindrata… Se siete curiosi di vedere com’era fatto, potrete trovarlo in una foto del mio ufficio di progettazione (nel 1979) a destra di un me stesso assai più giovane e magro 🙂 Quell’oggetto che sembra un PC, ma non lo è, perché il PC ancora non esisteva, è in effetti il sistema di sviluppo Intel per microprocessori 8080/8085.

Torniamo ad oggi: ho comprato il modulo con il microcontrollore e quello con il programmatore, ma poi ho deciso di montare anche un circuitino tutto mio su una scheda per prototipi. La ragione di questa decisione è la necessità di testare il micro più piccolo, quello con soli 8 pin, che dovrà andare a sostituire modelli analoghi in alcuni miei progetti di produzione industriale.

Il sistema di sviluppo completo. Programmer/Debugger e microcontrollore STM8S001J3M3

Il microcontrollore piccolo (STM8S001J3M3) ha alcune limitazioni e presenta dei rischi. Se programmato con impostazioni errate delle porte di I/O, diventa irrecuperabilmente bloccato e non più riprogrammabile! Questo problema non si presenta con il modello a 20 pin e più avanti vedremo perché.

Gli strumenti software

Ora che abbiamo tutto il necessario per quanto riguarda l’hardware, possiamo pensare al software. Anche in questo caso avremo delle liete sorprese. Tutto (e dico tutto) è disponibile gratuitamente! Abbiamo a disposizione l’ambiente di sviluppo (IDE) e il software per caricare il programma sul microcontrollore forniti direttamente dalla ST e il compilatore C (completo e senza limitazioni) fornito dalla Cosmic. Per scaricare i pacchetti software è necessaria una registrazione, ma è gratuita. Quindi, facciamo i conti: 1 Euro per il modulino di test, 2 Euro per il programmatore e zero Euro per il software di sviluppo… Con 3 Euro possiamo scrivere software in C ed effettuare il debug in real-time. Beh, non è caro! 🙂

Ecco i link che vi propongo per leggere la documentazione (abbondante) e scaricare il software:

-sito principale con le informazioni ed i vari documenti disponibili: http://www.st.com/en/development-tools/stm8-software-development-tools.html

-pagina di download del programmatore STVP-STM8: http://www.st.com/content/st_com/en/products/development-tools/software-development-tools/stm8-software-development-tools/stm8-programmers/stvp-stm8.html

-pagina di download dell’ambiente di sviluppo IDE STVD-STM8: http://www.st.com/content/st_com/en/products/development-tools/software-development-tools/stm8-software-development-tools/stm8-programmers/stvd-stm8.html

-pagina di download del compilatore C di Cosmic: http://cosmicsoftware.com/download_stm8_free.php

Come anticipato, per poter effettuare i downloads sarà necessaria una rapida registrazione gratuita sia sul sito ST che sul Cosmic.

Oltre al software scaricato, conviene procurarsi subito tre PDF molto utili. Il primo è il datasheet del componente e si chiama stm8s001j3.pdf; il secondo è la lista dettagliata dei registri delle periferiche e si chiama RM0031.pdf; il terzo è il manuale di programmazione con le istruzioni assembler e si chiama PM0044.pdf. Inserendo i nomi elencati in un motore di ricerca, troverete i link per il download. Probabilmente l’ultimo file non vi servirà per scrivere applicazioni “normali”, ma se volete capire bene come funziona un micro (qualsiasi micro), date sempre una lettura approfondita alle sue istruzioni assembler, ai modi di indirizzamento, eccetera.

Installazione

Per prima cosa installiamo il compilatore Cosmic C. Ad installazione avvenuta vedremo che abbiamo a disposizione sia il compilatore per STM8 (completo e senza limiti) che quello per STM32. Quest’ultimo, però, ha un limite di 32K (sufficienti, comunque, per molte applicazioni). Si noti che il compilatore installato ha anche un suo IDE (chiamato IDEA-STM8) e potrebbe quindi essere usato come strumento di sviluppo completo, senza usare i software ST. Io ho deciso di usare l’IDE ST, ma è stata solo una scelta personale. Nulla vieta di utilizzare l’ambiente Cosmic, ma gli esempi che pubblicherò di seguito sono stati scritti per quello ST.

Oltre ad aver fatto la registrazione al sito Cosmic, dovremo ora ottenere la licenza (gratuita) per il compilatore. Per far ciò dobbiamo andare nella cartella dove è installato il compilatore e cercare il programma apposito:

C:\Program Files\COSMIC\FSE_Compilers\CXSTM8\LmregFSE.exe

Ovviamente, il percorso è valido se il programma è stato installato su C:\Program Files. Lanciando l’applicazione, troveremo dei campi da riempire.

Inseriamo quindi i nostri dati e clicchiamo il pulsante On the Web. Riceveremo quindi sulla nostra email un file di licenza da copiare nella directory di installazione del compilatore.

Se non eseguiamo questa operazione oppure se copiamo il file di licenza su un altro computer, all’atto della compilazione riceveremo questo errore:

Quindi, se cambiamo PC e reinstalliamo il compilatore, dovremo eseguire nuovamente la fase di richiesta della licenza.

…continua…

Invention #6: the (c) WaterShadow

This device is composed by an orange box of 36x24x12 cm. On the top of the box there is a solar cell, capable of charging the internal batteries and powering the electronic circuit inside; in the bottom part there are two small but powerful electric motors with propellers and two ultrasonic sensitive microphones. The internal part of the box is almost all available to the user: you can put in it your car’s keys, documents, usb keys, cellphone, bath towel etcetera. The all box is fully waterproof, thanks to neoprene seals. Another fundamental part of this invention is the wrist bracelet with special ultrasonic emitting capsule. When you want to swim and you have precious things, and you don’t want to leave them abandoned on the beach, put all inside your WaterShadow box and wear the bracelet. Then go into the water and take with you the orange box. When in the water, the box will follow you everywhere, using his double ultrasonic microphones for tracking your emitting bracelet. Have a nice swim and forget any problems.

Special notes:
1) If you swim too slowly, the WaterShadow can overtake you, and sometimes can play an “hurry up” with the embedded loudspeakers.
2) Some californian scientist asserts that the ultrasonic beep emitted by the bracelet can attract male sharks, but I can calm down you, it’s not true. It can attract only female whales.

P.S. Have a nice April First and eat some mellons taken from my tree

Do you want to read more “Probably True” stories ? Take a look at my Probably True Corner

Domenica: imparare codici di radiocomandi sconosciuti

La scorsa domenica ho costruito un piccolo circuito per imparare i codici trasmessi da un radiocomando di cui non conoscevo le caratteristiche. Nel video trovate una breve descrizione del funzionamento. Il circuito è praticamente identico a quello che ho già pubblicato sul mio sito (RxMet1 – ricevitore per sensore esterno Hygro-Thermo a 433 MHz) e sulla rivista CQ elettronica nel 2007. La decodifica del protocollo del sensore umidità/temperatura fu allora molto più difficile, dato che non c’era alcuna informazione disponibile su internet (esisteva la descrizione di un protocollo precedente, ma era totalmente diverso). Quell’esperienza, però, mi è servita a produrre questo giocattolino perfettamente funzionante in un noioso pomeriggio domenicale.

WiFi to IR interface

Last update: 2018-02-25 15:30 (See the note at end)

Once again a project realized in the B&B during my free time, far from home. The circuit described here will be capable to drive almost any device that currently uses an IR remote control, by means of WiFi connection, as to say: with your smartphone. This time I want to show all the route from the idea to the running device. I had the idea some years ago (look at my previous articles regarding IR and WiFi), but I completely forgot it until today.

When I start a new project, there is the first step that I call: “sofa time”. I spend such time lying down on the sofa, without any computer, pen, document or tool. I just think about how to realize the project with the minimal effort.

After this time, I take a block-notes and draw with a pencil (or a pen) a very minimal schematic. In practice, it’s just a brief list of essential connections for the various components that I’m going to use. Here is such minimal schematic:

I don’t need a full schematic, at this time. I will draw it “seriously” with a CAD in the final steps. Well, now I can start building the prototype. First of all I search in my “junk box” what components are available and eventually I change the schematic in order to make it possible to be realized with available components. Usually my laboratory is very complete, but currently I have only few parts, being far from home. This is the prototype, wired on a proto board :

If you are curious to see how this circuit is wired, look at the bottom part :

Note the presence of some SMD components. Sometimes I put such components mixed with the through-hole parts for space saving or just to substitute missing parts of the required value. It’s a simple circuit, but requires soldering skills to be built !

Did you noticed that I used a 16MHz crystal? Did you also noticed that I used a linear 3.3V regulator for powering the microcontroller ATmega88 and the WiFi module ESP-01? Well, there is a mistake ! A 16 MHz crystal is out of specs at 3.3V as you can see in the next picture:

The diagram is taken from the ATmega88 datasheet and says that the maximum crystal frequency at 3.3V is about 13.3MHz, evaluated with dF=(20-10)MHz and dV=(4.5-2.7)V. The nearest value that I have in my junk box is 12.288MHz, then I’m going to replace the component onto the circuit (it will be an easy job).

I plan to power my circuit with a 5V wall adapter, probably a phone charger, but during the tests I will use a Li-Ion battery, just to limit the number of cables on my unfair working place. Note that the LM1117-3.3 IC does NOT stabilize very well with the power supply taken from a Li-Ion battery. Look at this picture taken from the component’s datasheet :

A fully charged battery has 4.2V voltage, so it’s under the minimal dropout at 100mA to have a stable 3.3V output. Consider that the ESP-01 can have current peaks greater than 250mA, so the regulator output may be unstable. This situation will degrade more when the battery discharges to 3.7V (its nominal voltage) and the residual charge is about 10% of the nominal capacity. I used a 100uF capacitor connected to the ESP-01 power lines in order to absorb part of the current spikes in WiFi transmission and if necessary I will increase such capacity. In the “real life” the circuit, powered with a 5V-700mA wall adapter, will work fine ; for this test version I can accept some limitations.

Here is the first version of the circuit schematic (still subject to change):

For a better view, you can download the drawing in PDF format from this link. The pinout for the wifi module ESP-01 in the schematic diagram corresponds to this figure:

Note: if you want to replicate this project, you must program the ESP-01 module to use a 9600 BPS communication speed. There is an AT version created with such default speed on this website: http://wiki.aprbrother.com/wiki/Firmware_For_ESP8266 ; go there and look for ai-thinker-0.9.5.2-9600.bin. You can also alter (in a permanent way) the current communication speed of your ESP-01 module using AT commands. There are two, that works depending upon the version of firmware installed. Try both of them; the first that gives answer “OK” is the right one.

For additional information and useful SW tools, take a look at my previous articles here:
Interfacciare il modulo ESP-01 con una porta USB
http://ficara.altervista.org/?p=3041
AT-commands tool
http://ficara.altervista.org/?p=3158

The firmware – Part 1

At this moment I don’t want to write an App to test the device, so the first version of the firmware contains a very basic webserver, just to check if I can connect to the device with my smartphone using the default browser. The first release of the firmware (about 3 KBytes) is available at this link. The file is zipped with password. Use the program 7Z with password: eficara to expand it. The zip contains the .hex file to program the micro and the following image for the fuses map:

When the microcontroller has been programmed, you can try to check if it works. First of all, connect your smartphone to the AP that is presented by the Esp-01 module. You will be informed, obviously, that you are NOT connected to the Internet:

Note that the last 6 characters of the AP SSID will differ from the ones showed in the image, being the representation of last 3 bytes of the MAC address of the module and also the ESP_  part can differ if there is another release of the AT firmware in the module.

After connecting your smartphone to the Esp-01 AP, you can open the default browser and navigate to the single page available on this minimal webserver implementation. Here is an example:The page is always located at 192.168.4.1 (the Esp-01 IP) /cmd.htm (the single implemented web page) and the command ?k= followed by 4 hexadecimal digits. You will receive an html page with the same hex digits. This is just for test purposes. Please note that the hex digits that you will use in your requests must be in capital letters, or you will receive wrong answers:IR protocols – Tools

Now I must indagate the IR protocols that I want to use in this device. Many, many years ago, I realized an IR protocol analyzer under MS-DOS using Borland C and some subroutines in Asm 8086. It worked  with direct I/O control of the pins of a COM port. Here is the hardware I used for IR protocol analysis:

At the left, the “receiver” part ; in the middle, a more recent wired prototype used with a microcontroller and at the right the “transmitter” part, from  the same MS-DOS tools suite.

Well, I will NOT present here such old MS-DOS programs because I have found on the internet a great page published by Ondřej Staněk at this link: http://www.ostan.cz/IR_protocol_analyzer/ that has a freely downloadable tool that is much more complete and powerful than mine. It works under Windows and the involved hardware is very simple to build. Here is a screenshot of the program running on my PC:

The software uses the MIC (audio) input of your PC / Notebook to capture the IR signals from a remote controller. You can use a simple photodiode like this :

My interface, mounted on a 3.5 mm stereo jack

Or, if you can’t find the photodiode, you can try with a normal IR emitter (LED) using this circuit. I made it ‘cause I haven’t any photodiode in my “mobile laboratory”, but I have an IR emitter (LED) mounted on a small proto-board. I tested this unconventional circuit on my notebook and after a couple of tries it worked (the previous screenshot was taken with this interface).

Another detector that uses a normal IR LED as receiver. Don’t consider the other components on the board. Those parts are from another circuit !

Here are some audio settings I used on my notebook in order to make it work:

Here is a list of some articles on my website about the IR remote controls:

WM8650 tablet as remote control for Sony TV
http://ficara.altervista.org/?p=497
Using Android tablet as SIRC remote control (#2)
http://ficara.altervista.org/?p=859
General purpose infrared remote control receiver with RS232 output
http://ficara.altervista.org/?p=1221
Usare lo smartphone come telecomando TV
http://ficara.altervista.org/?p=2426
Un altro telecomando TV per smartphone Android
http://ficara.altervista.org/?p=2908

The firmware – Part 2

Well, I finished this project or, better, this “proof of concept”. It works, I can control my TV using the browser of my smartphone. The IR protocols used here are NEC and RC5. Due to the low power of IR led, driven directly by uC Port with a single resistor, the distance from the device to the TV (or other apparatus) will be 1 meter max. Add a transistor interface if you want long distance.

Note (Feb, 25 2018): I tested the circuit in the picture below and the distance now is over 3.5 meters. I can’t test if it works over 3.5 meters ‘cause my B&B room is very small !

One reader from Hackaday proposed to use multiple output pins in parallel to drive the IR LED with more power.  It’s a good idea, but the software needs to be modified ‘cause I used the SBI I/O,#bit and CBI I/O,#bit instructions respectively to turn OFF (remember, negative logic for LED) and ON the port bit.

Part of the C source (commented ASM listing) – Section: Nec protocol – Xtal: 12.288MHz – Interrupts: disabled

Controlling multiple port bits at the same time needs the OUT I/O,R instruction. Using the OUT instruction also involves to get the port status (in order to save other bits not used for IR led) and save it to 2 different registers, one to be used when you want low level on the IR outputs and the other when you want high level, without affecting the “non IR led” bits. Such approach changes the number of clock cycles needed to generate the 38KHz (Nec) and 36KHz (RC5) frequencies.  This is absolutely not difficult to realize, but at this moment I closed my test firmware, so the transistor solution is simpler.

At power-on (reset) the microcontroller automatically sends one command for testing the NEC and RC5 protocol as you can see in the Main procedure.

After sending the test commands, the main procedure loops in the wifi section (function: Parameters) waiting for commands from any browser. The same IR code used in the test procedure can be sent with the smartphone, with the same  effect.

The command 0x0408 (address, 0x04, cmd 0x08) turns on  or off the TV in my B&B room 🙂 This is the screenshot of the IR tester, splitted in two parts ‘cause is a bit long:

In the Main procedure there is also a transmission of one RC5 code. This is the screenshot of the actual code set (RC5 is smaller)

Note that in order to send RC5 protocol IR commands, you must use another string in the browser. In place of: cmd.htm?k= you must use: cmd.htm?r= . This informs the firmware that the following 4 characters (hex) must be used as address and command for RC5 protocol, not for NEC. Please, remember that the standard RC5 protocol has 5 bits address (0x00..0x1F) and 6 bits command (0x00..0x3F). Codes out of the limits will be cut out with a simple “and” operation.

Finally, the new release of the firmware. It’s only 3034 bytes long. In the zip file you can find the .hex to burn the micro and a picture of the fuses configuration. Download the file from here and use the program 7Z to expand it. The password is: eficara.

Have fun !

Note (Feb,21 2018): this article was linked by Hackaday and then I’ve seen many comments there about the “unuseful” ATmega88 micro used in my circuit. Someone assumed (wrongly) that I used the Arduino IDE to create this project ! Well, there is a big misunderstanding. May be that someone leaves his opinion before reading the article or simply thinks that reading the article is just an option. Ok, I just want to make clear that I wrote all the firmware in C language (some ASM code was optimized to C) and without using any “pre-cooked” library for ESP-01 or IR functions. All the webserver via AT commands and the IR RC5 and NEC protocols are mine, not copied from other people’s works. I know that the Esp8266 itself is a fully programmable device, but my target was to use a preprogrammed part (Ai-Thinker ESP-01 module with AT firmware) and just control that part how it comes “out-of-the-box”, without any modification, to create my “proof of concept”. I also know that there is a Lubuntu virtual machine (VirtualBox) with the complete environment to develop C language applications for the ESP8266. I have such VM enabled and working on my desktop computer, at home.

Play with colors (not for painters)

First of all, happy new year ! Another boring weekend in this B&B and another game realized for Android smartphones. It’s a well known game. The machine creates a combination of four colors (on a six colors palette) and you have to find the right combination in max 12 attempts. Every attempt has an answer that is a white dot if there is the right color in the right position or a black dot if there is a right color in a wrong position. Obviously, if the selected color isn’t part of the combination, no black or white dot appears.

The game icon as it appears on Google Play

The application is free and without any advertisement. It’s a present, so -please- don’t leave evil comments if you don’t like it !

Google Play link: https://play.google.com/store/apps/details?id=robotop.mastertab

Screenshot of the game running

The buttons on the right are used to select the color you want to add to your try. The [ C ] button clears an entered combination in case of errors. The [ Ok ] button accepts a combination, so the machine can answer with the results. The button [ nuovo codice ] generates a new random colors combination. The small orange arrow at left is a pointer to the list of attempts. If you don’t find the solution in 12 attempts, the machine will show you the result with a short animation. The program exits after 10 minutes of continuous play time. This is ‘cause you must rest after such time ! Obviously you can restart immediatly, but I suggest to not spend too much time playing with your smartphone, with your eyes focalized always at the same distance. So, after 10 minutes, take a rest ! Look out of the window !

I did the first version of this game some years ago, for the iOS environment, using a software tool called DragonFire SDK. You can read an article I wrote about this tool at this link: http://ficara.altervista.org/?p=2254. Following the link, you can also find a downloadable executable (runs like an iPhone emulator) to play the game on any Windows PC. The source file written in Visual C++ is included in the packet. Note that the libraries sold with the DragonFire SDK are NOT included ! The source file may be useful to see how the program works. The software tool was able to translate the Visual C++ source in iOS Objective-C source and compile it on remote Mac machine, giving as result the App ready for the market.

In case of errors or suggestions contact me by email and in my free time I will try to update the App. Have fun ! Bye.

Micro PLC – 2 In 2 Out

Questo progetto ha un’origine molto “antica”. Realizzai la prima versione nel 2001 per due prodotti commerciali su microcontrollori Mitsubishi M16C (oggi Renesas). Poi, nel 2007 ne feci una versione molto ridotta con il micro Zilog Z8 ; venne anche pubblicata sulla rivista CQ Elettronica (vedi pubblicazioni e http://ficara.altervista.org/zilog_z8.php#linsem). Successivamente (nel 2013) modificai, semplificandoli ancora, il circuito e il firmware per un amico che aveva la necessità di fare dei “programmi” per saldare delle gabbiette di fil di ferro. In sostanza, a lui serviva qualcosa che fosse azionato da uno o due pulsanti e che potesse azionare uno o due relè con tempi programmabili per attivare la saldatrice. Per realizzare l’oggetto, utilizzai un display LCD a caratteri 1×16 recuperato da una vecchia centrale d’allarme e un microcontrollore ATmega88 “di recupero”.

Oggi mi ritrovo, dopo qualche anno, ad avere l’esigenza di un dispositivo del genere per me stesso. Ho quindi deciso di “trasportare” il firmware su un nuovo circuito che ha come base una piccola scheda “Nano3” comprata on-line a circa 2 Euro. Il microcontrollore è l’ATmega328P, che ha molta più memoria del precedente ; tuttavia, ho modificato il programma solo per lo stretto indispensabile, senza sfruttare le più ampie possibilità offerte dal nuovo hardware. Anche se la board Nano3 è venduta come “compatibile Arduino”, il firmware è scritto esclusivamente in C e viene trasferito nel microcontrollore attraverso il connettore ICSP senza l’uso di bootloader. Nella figura sottostante potete vedere come si presenta l’oggetto:

Appena acceso, il display mostra due opzioni: ESEGUI o SCRIVI. La prima manda in esecuzione il programma che è stato precedentemente registrato nella memoria EEPROM del microcontrollore ; la seconda ci permette di inserire (scrivere) il nostro programma tramite i pulsantini che vediamo nella foto in alto a sinistra. I pulsanti hanno le classiche funzioni di Up, Down, Left, Right, Ok, Esc con cui si può fare praticamente di tutto…

Se ci spostiamo sul campo SCRIVI con il pulsante Right e quindi premiamo Ok, ci troveremo nel menù di programmazione e potremo quindi scegliere quale programma scrivere. Ce ne sono a disposizione 8, ognuno con un massimo di 32 istruzioni.

Con i pulsanti Up e Down potremo scegliere il numero di programma ; con Ok entreremo nella fase di scrittura delle istruzioni. Vediamo come si compone una linea di programma:

Il programma va da 1 a 8 ed indica una delle 8 sequenze di istruzioni programmabili. Ogni programma può avere un massimo di 32 passi, che vanno da 0 a 31. Ogni istruzione occupa 1 byte delle memoria EEPROM del microcontrollore e così risulta che l’occupazione massima di tale memoria è di 8 * 32 bytes, cioè 256 bytes. Nella EEPROM del micro c’è quindi parecchio spazio ancora libero per aumentare sia il numero dei passi, sia quello dei programmi. Veniamo ora ai codici operativi, le istruzioni vere e proprie. Sono davvero pochi ! Questo sì che è un RISC (Reduced Instruction Set Computer) !

Organizzazione dei codici operativi nel file sorgente in C

Vediamo tutti i codici in dettaglio:

- ACCESO   (operando R1 o R2)
- SPENTO   (operando R1 o R2)
- ATTESA-A (operando S1 o S2)
- ATTESA-C (operando S1 o S2)
- RITARDO  (operando da 01 a 99)
- RIPETI   (senza operando)
- FINE     (senza operando)

[ACCESO  ] - è il codice operativo per accendere un relè.
           L'operando può essere R1 (relè 1) o R2 (relè 2).
[SPENTO  ] - è il codice operativo per spegnere un relè.
           L'operando può essere R1 (relè 1) o R2 (relè 2).
[ATTESA_A] - è il codice operativo per attendere che uno
           switch (input) sia aperto.
           L'operando può essere S1 (switch 1) o S2 (switch 2).
[ATTESA_C] - è il codice operativo per attendere che uno
           switch (input) sia chiuso.
           L'operando può essere S1 (switch 1) o S2 (switch 2).
[RITARDO ] - è il codice operativo per attendere un certo tempo.
           L'operando può andare da 01 a 99 ed indica il tempo
           d'attesa in passi da 0.1 Sec.
[RIPETI  ] - è il codice operativo per ripetere il programma a
           partire dalla prima istruzione.
[FINE    ] - è il codice operativo per terminare il programma.

I pulsanti Right e Left servono per muoversi tra i campi Passo, Codice Operativo e Operando, mentre Up e Down per modificare i valori relativi al campo interessato. Il pulsante Ok accetta a salva l’istruzione corrente, mentre Esc termina la programmazione.

Vediamo un paio di esempi:

Programma 2, passo 0: Attesa switch #1 chiuso

Programma 2, passo 2: Ritardo di 40 unità di tempo (40 x 0.1 Sec = 4 Secondi)

Chiaramente, dopo aver scritto un programma, ci verrà voglia di mandarlo in esecuzione ! Per fare questo, ci sposteremo nella posizione Esegui del menù principale e premeremo Ok. A questo punto con i tasti Up e Down selezioneremo il programma da avviare (da 1 a 8) e quando sul display comparirà il numero desiderato, premeremo ancora Ok per avviarne l’esecuzione.

Vediamo ora lo schema elettrico. Per le prove, ho alimentato il prototipo attraverso la presa mini-usb presente sulla Nano3, collegata ad un caricabatterie per telefono. Conviene, però, usare un alimentatore esterno da 6 a 9V collegato al connettore JP1, più che altro per l’affidabilità dei contatti. Sulla Nano3 c’è un regolatore lineare low-drop a 5V con una corrente di uscita sufficiente per questo circuito.

Se stiamo alimentando il circuito attraverso la presa USB e se abbiamo installato il driver per il convertitore USB-Serial presente sulla Nano3 (nel mio caso un CH340G) potremo anche attivare un terminale seriale a 9600,N,8,1 (se non lo avete, qui ce n’è uno scritto da me). Con il terminale collegato, vedremo che resettando la Nano3 tramite il pulsantino presente on-board, apparirà la scritta V171217 che è la release del software (yymmdd – 17 Dic 2017). Per testare anche la trasmissione seriale potremo dare da terminale un ctrl-G (ASCII 0x07) e il buzzer sul circuito emetterà un beep di conferma.

Per una migliore visione dello schema, è possibile scaricare il file in formato PDF.

Veniamo ora al firmware. Il file da programmare nel modulo Nano3 è fornito in formato .hex e sarà inviato al microcontrollore tramite connettore ICSP (6 pin), mediante un tool idoneo. Io uso un mySmartUSB light, ma ce ne sono a decine con prestazioni simili. Come software di “burning” qui ho usato myAvr ProgTool, abbinato al tool hardware.

Per la configurazione dei “fuses”, guardate la riga 11 in questo screenshot del file in C:

Infine, il file .hex può essere scaricato da questo link. Il file è zippato con password. Per decomprimerlo usate il programma 7Z e la password: eficara. Buona sperimentazione !

Your HotSpot is a presence detector

note: USB connector used only to power the circuit

I never connect my devices to “free wifi” hotspots. I’ve seen what a (bad) hacker can do, using one laptop, a battery powered Raspberry PI board and a collection of software tools. He can spy (almost) any smartphone that is connected to the same “free wifi” hotspot.

For this reason, I always use my own LTE 4G connection and my smartphone is always enabled to share such internet connection with my other devices (one laptop, another smartphone and some other) using an access filter based on MAC address of every device. This is more secure than use “free wifi” hotspots and I suggest to everyone the same approach. However, this isn’t the subject of my post.

Having my own hotspot, with the SSID choosen by myself, I can use the smartphone for a lot of nice services. In this article I will describe one of them.

The presence blinker

I’m currently living in a B&B, ‘cause I’m far from home, due to a contract job. When I am in my room, I don’t make too much noise. I just read or write documents; the TV is turned off and also the music is off. So, it happens that other hosts of the B&B, when going out, lock the main door with the key! This makes me a bit claustrophobic! To avoid this unfair situation, I decided to build a flashing light that will be visible from the low side of my room’s door, just to warn the other hosts that I am in my room

I thought about a passive IR sensor, but such devices work only if there is a movement in the room, and I don’t move so often. Also microwave sensors based on Doppler effect work in the same way; they activate the output when there is a movement. Finally, I decided to use my smartphone as a presence detector… I built a small device based on the well known ESP-01 module. This device has an ATtiny2313 microcontroller and a blue led (high luminosity) that blinks when I am in the room (with my smartphone). When my smartphone goes out (with me) the led stops blinking…

The working principle is very simple. The microcontroller sends AT commands to the ESP-01 to get the list of active hotspots in the area. One of such hotspots is my smartphone, so the SSID string is taken and compared with the one programmed in the internal flash memory. If the two strings match, the led blinks; otherwise the led remains off. So simple…

Note that no connection is active between the module and the smartphone; there is only a periodic check of the visible hotspots. This timed check happens every six seconds and the led lights for 250 mS each time (if your SSID is found).

Note that the SSID of your smartphone must be programmed in the flash memory of the microcontroller (the default is “myHotspot_15car”) so I added an application for PC that modifies the original .hex file to change the default SSID to the one that you like. The max number of characters allowed for your SSID is 15. This limit comes from the low amount of ram memory available on the ATtiny2313 microcontroller (just 128 bytes). Remember that you can choose your SSID in the smartphone using the appropriate menu, so write down one that has max 15 characters and the job is done. Another limit imposed by low ram resources (lack of buffers for serial communication), is that you must program the ESP-01 module to use a 9600 BPS communication speed. There is an AT version created with such default speed on this website:

http://wiki.aprbrother.com/wiki/Firmware_For_ESP8266

go there and look for ai-thinker-0.9.5.2-9600.bin. You can also modify (in a permanent way) the current communication speed of your ESP-01 module using AT commands. There are two, that works depending upon the version of firmware installed. Try both of them; the first that gives answer “OK” is the right one 🙂

For additional information and tools, take a look at my previous articles here:
http://ficara.altervista.org/?p=3041
http://ficara.altervista.org/?p=3158

You could also look at another my article, that was the “starting point” for this project. There you can find a downloadable executable and the relative source program in FreeBasic. It can be useful to better understand how it works. The link is:
http://ficara.altervista.org/?p=3711

Someone can say: “Hey, I can program the same SSID on my smartphone and fool your device so it thinks that you’re in the room, while you aren’t” ! Then I can answer: “so, I will add to my firmware a check of the WPA2 password of my hotspot, that’s invisible to you” ! Such password check option opens the road to many applications where your smartphone will be the key to unlock your car, your door, to turn on lights at home and every thing you want, simply having it near to you. No buttons to click, no Apps to run, just the “native” HotSpot feature active. It’s easy !

In the downloadable file you can find the .hex file that must be programmed in the microcontroller and the .exe that allows you to insert your SSID in the flash memory, prior to program the micro ! The firmware is very small (less than 1 Kb) and has been written in pure C without any special library.

The schematic of the device is simple. Here below there is a picture of it. You can also download it in PDF format for a better view (click this link).

Disclaimer of Liability.
The program or software described, freely downloadable from the site, has to be considered a free “demo” and therefore the author Emilio P.G. Ficara will not provide any support nor will be responsible for any problem, damage, or consequence that may occur during download or execution of the application.

By clicking this link to download the file, you implicitly declare that you have read and understood the non-assumption clause and to accept it.

Always check the MD5 checksum for the files you download! In this case, it must be FC211B2DCBF05C7874489AC32C7D9641 . If it is different, the file is corrupted or is not the original one, so do not unpack it and throw it away! If it is all right, you can unzip it (use the 7Z program with the password: eficara).

You can also run the executable on a USB memory stick as it does not need installation, being a pure executable.

Have fun !!!

Problemi (risolti) su FW AT con GPIO per moduli ESP8266

Nell’articolo precedente ho descritto un utilizzo inusuale per i soliti modulini ESP8266. Per poter utilizzare il comando AT+CWLAPOPT (quello che consente di utilizzare delle opzioni quando si chiede la lista degli Access Points) ho dovuto aggiornare il firmware del modulino ESP-01 che ho utilizzato. Tutto ok. Poi, però, ho tentato di aggiornare il modulino con la versione firmware contenuta nel file ESP8266_NONOS_SDK-2.1.0.zip (il FW AT che consente di utilizzare il GPIO del modulo) ed ho trovato delle difficoltà. Una volta programmato con tale versione, il modulino si resettava di continuo. Dopo un po’ di indagini e prove con vari file di boot presi da versioni precedenti (boot 1.2 ; boot 1.6; boot 1.7 e altri), mi sono un po’ stufato ed ho preso con un editor esadecimale la zona di memoria dedicata al boot (a partire dall’indirizzo 0x00000) da un firmware sicuramente funzionante (una versione vecchia, distribuita con un file .bin unico) e da quella ho ricavato un nuovo file boot.bin “tutto mio” o quasi 🙂 Usando questo “frankenstein” ho finalmente programmato con successo l’ultima release del firmware. Ora i comandi relativi al GPIO vengono accettati ed eseguiti.

Ho deciso di pubblicare qui il piccolo file myboot.zip per coloro i quali si trovassero ad affrontare lo stesso problema.

Tengo a precisare che si tratta di una soluzione “per hobbisti” ! Non mi assumo responsabilità per malfunzionamenti o difetti ! Si tratta di un esperimento e come tale va trattato !

Nota: il file myboot.bin è zippato con password. Usate il programma 7Z con la password eficara per estrarlo.

ESP-01 : usi alternativi di RSSI

Normalmente, usiamo il modulino wifi ESP-01 per fare dispositivi che si connettono a Internet ; trasmettiamo o riceviamo informazioni, fondamentalmente per realizzare dei sensori o degli attuatori. C’è un’infinità di applicazioni in giro, alcune ben documentate e originali, altre copie di copie di copie (ricursivo). Da un lato ci sono dei principianti con una preparazione “vergognosa” che si spacciano per “specialisti”, ben consci del fatto che ci sarà sempre in giro su Internet qualcuno che ne capisce meno di loro 🙂 , altri invece sono decisamente “bravi e preparati” e leggere quello che propongono è davvero interessante, anche per un “addetto ai lavori”.

Negli ultimi anni, prodotti come Arduino, ESP8266 e Raspberry PI hanno “rivitalizzato” un settore hobbystico che era praticamente morto, con conseguenze assolutamente positive per tutto il settore dell’elettronica e dell’informatica. Come già detto, però, c’è anche il fattore negativo di tanta gente senza talento che “imbratta i muri”, ma è una contropartita accettabile, pur di vedere di nuovo l’entusiasmo per l’autocostruzione, com’era ai (bei) tempi delle “riviste cartacee”.

Per fare alcune prove che riguardano un’idea che mi è venuta in mente, ho sviluppato un programmino che utilizza una delle “features” del modulino ESP-01 nella versione di firmware con protocollo AT. Lo scopo di questo programma è di fare dei “beep” quando la misura di RSSI (Received Signal Strength Indicator) di un determinato Access Point scende al di sotto di una soglia impostata. Ho deciso di pubblicare l’intera cartella di progetto, contenente sia l’eseguibile sul path /release/Radar.exe, sia il file sorgente in FreeBASIC (con FireFly Visual Designer) sul path /forms/Form1.frm, così chi vorrà potrà modificare / migliorare il software a proprio piacimento. Vediamo la schermata del programma appena lanciato:

Andiamo per punti : (1) è il pulsante per aprire la porta di comunicazione seriale verso il modulino ESP-01 (ho usato lo stesso circuitino presentato qualche tempo fa sul mio sito a questo link). Per prima cosa, premeremo Open e se tutto andrà a buon fine, la porta seriale verrà aperta e la scritta sul pulsante cambierà in Close. Subito dopo premeremo in fila i pulsanti riferiti con (2), (3), (4) e (5). Questi servono per inviare una serie di comandi AT al modulino wifi ESP-01. Per pima cosa si setta la potenza di trasmissione a circa un terzo del massimo possibile (27 su un range da 0 a 82); poi si sceglie di operare come STA (station); poi si chiede di usare, nel comando CWLAP (List Access Points) solo i parametri relativi ad SSID e RSSI (il valore 6 setta i bits 1 e 2, che sono appunto relativi ai due campi indicati). Infine si richiede la lista completa degli Access Points “visibili” dal modulo. Di sotto segue un esempio di tutto quello che compare nella finestra (10) eseguendo le operazioni elencate nell’ordine:

>Open
TX: AT+RFPOWER=27<0x0D><0x0A>
AT+RFPOWER=27

OK
TX: AT+CWMODE=1<0x0D><0x0A>
AT+CWMODE=1

OK
TX: AT+CWLAPOPT=0,6<0x0D><0x0A>
AT+CWLAPOPT=0,6

OK
TX: AT+CWLAP<0x0D><0x0A>
AT+CWLAP

+CWLAP:("MW40Wind_xxxx",-58)
+CWLAP:("DIRECT-Bh-BRAVIA",-86)
+CWLAP:("NETGEAR26",-93)
+CWLAP:("CEM_host",-36)

OK

Una volta visualizzata la lista di AP, potremo fare un “copia” di quello che vogliamo utilizzare e poi incollarlo nel campo riferito dal numero (6). Prenderemo quindi nota anche del valore di RSSI relativo al medesimo AP e lo scriveremo nel campo riferito dal numero (7). A questo punto potremo finalmente premere il bottone Start (8) e il programma comincerà ad inviare una serie di comandi AT+CWLAP=”APcopiato”, che potremo vedere nel campo (9) e quindi verificherà le risposte formite dal modulino. Se il valore di RSSI ricevuto è inferiore (sono numeri negativi !) a quello che abbiamo programmato nel campo (7), allora si sentirà un “beep”. Vediamo una schermata del programma in funzione:

Naturalmente, il valore di RSSI è influenzato da vari fattori e non è costante, ma si mantiene in un certo range. Notate che più il numero si avvicina allo zero, più il segnale è forte ! Se scende a livello di -100 è assente. Con una certa approssimazione e con una sensibilità un po’ scarsina 🙂 potremo usare il modulino Esp-01 come sensore di presenza. Infatti, se qualcuno si piazza nelle vicinanze del modulino, o meglio, sulla linea ideale che unisce il modulino all’Access Point, il segnale diminuirà (sarà assorbito/riflesso dall’individuo) e il computer farà beep ! Lo stesso succederà se prendiamo il computer (supponendo che sia un portatile !) e ci allontaniamo dall’Access Point. E’ da notare che non facciamo una connessione all’AP, ma ci limitiamo a leggere la potenza del segnale ricevuto. Quindi, abbiamo due usi immediati per questo “giocattolo” : un sensore di presenza e un allarme di allontanamento. Naturalmente, il tutto può essere trasportato su un piccolissimo microcontrollore per rendere il lavoro più interessante. Purtroppo, l’utilizzo dei comandi AT rende la cosa un po’ lentina : tipicamente un “beep” ogni due secondi, ma lavorando direttamente nel chip ESP8266 (con gli strumenti giusti) si può fare ben di più ! Sotto la clausola di non assunzione di responsabilità, troverete la cartella di lavoro FBgui_Radar zippata con password. Se non avete Freebasic e Firefly, potete scaricarli gratuitamente ; cercate nel mio sito “links utili” e troverete i collegamenti per il download.

Clausola di non assunzione di responsabilità.
Il programma o software descritto, liberamente prelevabile dal sito, è da considerarsi una “demo” gratuita e pertanto l’autore Emilio P.G. Ficara non fornirà alcun supporto, né si assumerà alcuna responsabilità per ogni eventuale problema, danno o conseguenza che dovesse presentarsi nel download o nell’esecuzione dell’applicazione.

Cliccando questo link per effettuare il download del file implicitamente dichiarate di aver letto e capito la clausola di non assunzione di responsabilità e di accettarla.

Verificate sempre il checksum MD5 dei files che scaricate ! In questo caso deve essere: F6E1617D0E8E7CABC7FD6D1A7BB0B392 ; se è diverso, il file è corrotto o non è quello originale, quindi non scompattatelo e buttatelo via ! Se invece è tutto ok, potete scompattarlo (usate il programma 7Z con la password: eficara).

Potete usare l’eseguibile anche su una chiavetta di memoria USB, in quanto non ha bisogno di installazione.

Be Happy !

Qualche tempo fa, precisamente il 29 Novembre (non ricordo di quale anno !) alle 19:00, vidi in TV una trasmissione della BBC (un documentario) con un argomento piuttosto interessante. Si trattava di un metodo, sviluppato da un gruppo di studiosi, che avrebbe permesso ai soggetti coinvolti nell’esperimento di aumentare il proprio ottimismo. La cosa mi piacque, perché ho sempre avuto tanta voglia di incrementare il mio ottimismo ! Ora, dato che ho il weekend libero da impegni, ho deciso di programmare un’App per esercitarmi e vedere se finalmente riesco a diventare ottimista (ne dubito…hehe).

L’esperimento mostrato in TV consisteva in uno schermo di computer che veniva mostrato al soggetto impegnato nella prova. Su tale schermo apparivano sedici facce di persone di varie razze, con caratteristiche somatiche differenti. Queste facce erano disposte in una matrice di 4 x 4, quindi un totale di 16 immagini. Tra queste, solo una mostrava una faccia sorridente ; tutte le altre avevano espressioni tristi, arrabbiate, annoiate o depresse. Il soggetto in prova doveva cliccare il più velocemente possibile sull’unica faccia sorridente e così facendo incrementava il proprio punteggio, quindi lo schermo cambiava, mostrando una nuova matrice di volti. La voce narrante diceva che la durata ottimale dell’esperimento era di 8 fasi di 15 minuti ognuna (in giorni diversi). Alla fine di questo periodo, i soggetti si sarebbero sentiti più ottimisti.

Non conosco la validità scientifica di questo esperimento e non sono riuscito a trovare notizie sulla cosa perché purtroppo non ho seguito la trasmissione dall’inizio, ma ho visto tanti di quei metodi per agire sul cervello e sulle emozioni (alcuni sembrano autentiche fesserie), da essere disposto a fare un tentativo… Se volete provare anche voi, troverete l’App per Android in fondo a questo articolo. Questa è l’icona dell’App:

Bene, non avendo a disposizione 16 persone disposte a farsi fotografare con espressioni sorridenti (e nemmeno arrabbiate o depresse o tristi) ho deciso di usare delle “emoticons” che si trovano ovunque. Per simulare le differenze razziali ed estetiche, ho modificato il colore di background delle varie “faccine” e così le varie griglie presentate all’utente sono sempre diverse. Quello che rimane invariato rispetto alla versione originale è che ci sono sedici volti in una griglia di 4 x 4 e solo uno è sorridente. Ecco come si presenta il “gioco” appena installato e avviato:

Qui vediamo le sedici “emoticons” (per una volta, tutte sorridenti) e una finestra di messaggi che ci dice di premere sulla scritta per iniziare. In basso vediamo un messaggio che ci dice il tempo totale di “gioco”, dal momento dell’installazione. Quando questo tempo arriva a 2 ore e mezza (9000 secondi), il programma si ferma, perché dovreste già essere diventati ottimisti ! Spero che allora, pieni di gioia di vivere, partiate per un magnifico viaggio intorno al mondo (senza smartphone)…

Vediamo che succede appena avviamo il “gioco”:

Eccole qui, le nostre 16 faccine, tutte tristi, arrabbiate, depresse tranne una. Dobbiamo trovarla e toccarla nel più breve tempo possibile. In basso a destra vediamo un contatore che segna i secondi passati da quando abbiamo iniziato a giocare. Questo tempo sarà sommato al totale quando chiudiamo l’App. E’ da notare che l’App si chiude con il solito triangolino in basso per l’uscita dai programmi, ma anche con eventi che interrompono l’App in esecuzione, come chiamate, messaggi, eccetera. Questa App non va mai “in sospensione”… quando si chiude, si chiude.

Se tocchiamo la faccina sorridente, la finestra dei messaggi ci mostra OK e il numero di volte in cui abbiamo fatto la scelta giusta :

Se invece premiamo sulla faccina sbagliata (triste, depressa o arrabbiata), la finestra dei messaggi lampeggia brevemente in rosso e compare la scritta NO !

Quando ci stufiamo di giocare, possiamo chiudere l’App e i dati saranno salvati: durata della sessione di gioco, numero di volte che si è fatta la scelta giusta in tale sessione, tempo totale dall’installazione. Quando riavvieremo l’App, potremo leggere le “statistiche di gioco”, premento a lungo sulla scritta Play time = xx sec. Ci verrà mostrata una linea di testo per ogni sessione di gioco, in modo da poter valutare i nostri progressi.

Ecco un esempio :

Se avrete usato l’App per più di due ore e mezza di gioco, nel momento in cui toccherete la finestra dei messaggi per iniziare una nuova sessione, vi troverete davanti questo messaggio :

In questo caso, non disperate: se ancora non vi siete stufati di provare a diventare ottimisti 🙂 potrete riprovarci reinstallando l’App o cancellandone i dati con il gestore di App del sistema. Questo è tutto. Spero che questo giochino gratuito e senza pubblicità vi porti un po’ di ottimismo o almeno vi faccia fare due risate ! Non troverete questa App sulla mia pagina di Google Play, ma solo qui sul mio sito. L’App BeHappy.apk messa a disposizione per il download è compressa in un file zip con password. Dovrete quindi scaricarla, decomprimerla ed infine potrete installarla sul vostro smartphone / tablet Android, selezionando la checkbox “Installa da origini sconosciute” nel menù della sicurezza del dispositivo.

Clausola di non assunzione di responsabilità.
Il programma o software descritto, liberamente prelevabile dal sito, è da considerarsi una “demo” gratuita e pertanto l’autore Emilio P.G. Ficara non fornirà alcun supporto, né si assumerà alcuna responsabilità per ogni eventuale problema, danno o conseguenza che dovesse presentarsi nel download o nell’esecuzione dell’applicazione.

Cliccando questo link per effettuare il download del file implicitamente dichiarate di aver letto e capito la clausola di non assunzione di responsabilità e di accettarla.

Verificate sempre il checksum MD5 dei files che scaricate ! In questo caso deve essere: 0E94043AB497723E796F9520676BF453 ; se è diverso, il file è corrotto o non è quello originale, quindi non scompattatelo e buttatelo via ! Se invece è tutto ok, potete scompattarlo (usate il programma 7Z e la password: eficara).

Versioning:
2017 Set,24 Rel 0.2
 - modificato tempo massimo da 1 ora a 2 ore e mezza
 - aggiunto avviso di 15 minuti di gioco continuativo
   (con chiusura automatica)
2017 Set,23 Rel 0.1
 - versione di partenza