Prise en main d’un module NodeMCU (ESP8266)

Dans l’objectif final de faire le relevé de mon compteur d’eau, j’ai investi dans un module NodeMCU. Ce module permet de faire du microcontrôleur connecté sur son réseau wifi. Ce qui est parfait pour faire de l’IoT, surtout quand on voit le prix de l’engin (inférieur à 10€).

Découverte du kit

Marquage sous le NodeMCU

Le marquage indique un baudrate de 9600 baud. Mais cela ne semble pas marcher.

L’interface USB du module est juste un convertisseur USB-UART, qui est vu comme un ttyUSB0 sur ma debian:

$ sudo dmesg
[50235.509550] usb 1-1: new full-speed USB device number 5 using xhci_hcd
[50235.680785] usb 1-1: New USB device found, idVendor=10c4, idProduct=ea60
[50235.680788] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[50235.680790] usb 1-1: Product: CP2102 USB to UART Bridge Controller
[50235.680792] usb 1-1: Manufacturer: Silicon Labs
[50235.680793] usb 1-1: SerialNumber: 0001
[50235.688967] cp210x 1-1:1.0: cp210x converter detected
[50235.690454] usb 1-1: cp210x converter now attached to ttyUSB0

Si l’on tente de se connecter avec le baudrate indiqué sur le module (9600 bauds) on n’obtient (presque) que des caractères spéciaux.

Message obtenu après s’être connecté au module et appuyé sur le bouton reset:

r$$��|�l�|�
               $�p�|�p�s�c�p
                                �p�o�loo���
                                            cp�l`{$p�N��d"N��N�"��nn�l� l`�22oo
                                                                                                 l`Nr����{r$p�N�r����



                                                                                                                               b
                                                                                                                                n�|쎟�
                                                                                                                                       ��oo�
                                                                                                                                            d �no
                                                                                                                                                     l`or�{$p�N�r�������

            c
             o�|��
                   c��NN�$ �nn
                                    l`o{�{�$ r��n

                                                        �l`{d��o���NN����brnnn�l�cl
                                                                                       �2�������
                                                                                                         lllsd
                                                                                                               ���d$N��

                                                                                                                            �l���ld
                                                                                                                                    ��$��N�n�lbc���ld��B
                                                                                                                                                          ��d$p"�"r��nc{cr���d cd $����n�|��ol��|�$
                                     l`sl����N��r��N|�$$l��r�d�d�d ��r�d�d�


                                                                                      l`�œN�l
                                                                                              �

                                                                                                ll`sl{l��cc
                                                                                                             ��"�"B{�B��o��2oo�l��
                                                                                                                                            l
                                                                                                                                             ��l� ll����$�N���BB
                                                                                                                                                                   l
                                                                                                                                                                    l
                                                                                                                                                                     c
                                                                                                                                                                      ��cc
     l�"rlr$
ready

Le dernier mot s’affiche en texte clair.

Le point d’accès wifi est lui visible avec le nom FaryLink_3818DF.

Le premier objectif de la prise en main du kit est de faire en sorte que le module se connect à ma box wifi. Il faut donc trouver un moyen de lui communiquer le SSID ainsi que le mot de passe.

Programmation avec l’ide arduino

Il n’est pas facile de trouver des tutoriels autre que vidéos pour prendre en main ce kit. Apparemment la méthode utilisée pour développer sur nodeMCU passe par l’IDE de Arduino : stretch. Il faut donc commencer par l’installer, puis le configurer avec les paramètres du node.

L’installation de l’ide arduino est hyper simple sous debian :

sudo apt install arduino

Et voila… Par contre il faut ensuite le configurer pour NodeMCU !

Déjà on ajoute le port série à l’ide en modifiant son fichier de préférence ~/.arduino/preference.txt:

serial.port=/dev/ttyUSB0

Pour l’instant je n’ai pas réussi à le configurer pour NodeMCU. On va donc directement passer au flashage d’un firmware plus récent.

Flashage d’un firmware récent.

Les guides pour flasher un firmware récent sont déjà plus facile à trouver.

J’ai pris la version la plus récente du firmware sur le github:

wget https://github.com/nodemcu/nodemcu-firmware/releases/download/0.9.6-dev_20150704/nodemcu_integer_0.9.6-dev_20150704.bin

Elle date un peu mais visiblement si on veut un truc plus récent il faut le compiler, et donc installer la toolchain, ce qui ne semble pas si évident.

L’outils de flashage est en python :

git clone https://github.com/themadinventor/esptool.git

Celui dispo dans debian n’a pas l’air de fonctionner pareil.

Une fois le kit branché il suffit de lancer la commande suivante :

$ sudo python esptool.py --port /dev/ttyUSB0  write_flash 0x00000 /opt/nodemcu/nodemcu_integer_0.9.6-dev_20150704.bin 
esptool.py v2.2-dev
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 4MB
Flash params set to 0x0040
Compressed 450072 bytes to 290528...
Wrote 450072 bytes (290528 compressed) at 0x00000000 in 25.7 seconds (effective 139.9 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting...

Visiblement tous semble s’être bien passé, pourtant quand on appuie sur reset on obtient le message suivant sur la console :

rld��|�$�|

           �
             l�b|��r�c�p��oo�lno���
                                       cp�sdrlp�n�

                                                     �l
                                                        

                                                          c
                                                            N�|�$���on�$� $ �Nl`nr�n
                                                                                             �� p�N�
                                                                                                         r�����
                                                                                                                
                                                                                                                  bo��n�
                                                                                                                         �c��on�
                                                                                                                                  l`�o
                                                                                                                                        l nr�n{{$ p�N�
                                                                                                                                                             r�������#
 n�|

     #��no�

            $ �oo
                    $ N{��
                              �$`s��n
                                       �l �ՁMEM CHECK FAIL!!!
�r$

Visiblement ça marche pas, pourtant le point d’accès wifi est toujours visible. Du coup on va tout de même installer la toolchain.

Installation de la toolchain.

C’est pas si compliqué en fait, il suffit de télécharger le github :

git clone https://github.com/pfalcon/esp-open-sdk.git
cd esp-open-sdk

Puis de lancer make. Dans mon cas il me manquait le paquet help2man pour que ça se configure correctement :

sudo apt install help2man

Il faut ensuite patienter environ 30 minute pour compiler le tout en faisant make:

make

Et attendre qu’il nous dise que c’est bon :

[...]
net_chksum.o lwip/core/ipv4/ip_addr.o lwip/core/ipv4/ip.o lwip/core/ipv4/ip_frag.o lwip/netif/etharp.o lwip/app/dhcpserver.o espconn_dummy.o
cp liblwip_open.a /opt/nodemcu/esp-open-sdk/xtensa-lx106-elf/xtensa-lx106-elf/sysroot/usr/lib/
make[1]: Leaving directory '/opt/nodemcu/esp-open-sdk/esp-open-lwip'
cp -a esp-open-lwip/include/arch esp-open-lwip/include/lwip esp-open-lwip/include/netif \
    esp-open-lwip/include/lwipopts.h \
    /opt/nodemcu/esp-open-sdk/xtensa-lx106-elf/xtensa-lx106-elf/sysroot/usr/include/

Xtensa toolchain is built, to use it:

export PATH=/opt/nodemcu/esp-open-sdk/xtensa-lx106-elf/bin:$PATH

Espressif ESP8266 SDK is installed, its libraries and headers are merged with the toolchain

Compilation du firmware

On récupère la dernière release du firmware sur le github correspondant:

wget https://github.com/nodemcu/nodemcu-firmware/archive/2.1.0-master_20170824.tar.gz
tar -zxvf 2.1.0-master_20170824.tar.gz
cd 2.1.0-master_20170824

On exporte la toochain précédemment compilée puis on lance make :

export PATH=/opt/nodemcu/esp-open-sdk/xtensa-lx106-elf/bin:$PATH
make

Et on attend 5 minutes d’avoir une compilation sans message d’erreur.

Flashage du firmware 2.1

On peut désormais flasher le nouveau firmware aux adresses indiquées:

sudo python esptool.py --port /dev/ttyUSB0  write_flash 0x00000 ../nodemcu/nodemcu-firmware-2.1.0-master_20170824/bin/0x00000.bin
sudo python esptool.py --port /dev/ttyUSB0  write_flash 0x10000 ../nodemcu/nodemcu-firmware-2.1.0-master_20170824/bin/0x10000.bin

Une fois flashé on obtient bien une réaction du nodemcu après reset :

rd$ܞ�c�n
         �$�
               B|��p��|"�
                           c��oo�loN���bp�l rlp�o�
                                                       �
                                                         l

                                                           
                                                             cn�|���

                                                                      #��oN�l�`�N
                                                                                    $or�o
                                                                                           B$�lp�n�
                                                                                                      r�����

                                                                                                             b
                                                                                                               o�|�$

                                                                                                                     "�|�n� l �N
                                                                                                                                      l or�o
                                                                                                                                               {�$`p�N�
                                                                                                                                                           {�����
                                                                                                                                                                 
                                                                                                                                                                  n�|l쌏b��Nn�
                                                                                                                                                                                   l �2Nn
                                                                                                                                                                                           d Nr�N

                                                                                                                                                                                                   �l� {ےN

                                                                                                                                                                                                           �l� ���N천p��o|�l
                d$l`b�2��2r�l�N�
                                     �o�
                                        l ��{�p����


                                                      $ �œn�l�d�l`��s�p��
                                                                                  ld rd�o����B��cp|
                                                                                                       cp��l#��o��no�$l��l �l� d�
                                                                                                                                         �ll �o���#"ll�2B
                                                                                                                                                                ����B$
                                                                                                                                                                         �#rl{
Formatting file system. Please wait...

NodeMCU 2.1.0 build unspecified powered by Lua 5.1.4 on SDK 2.1.0(116b762)
lua: cannot open init.lua
> 
> 
> 
> ls
>> ls
stdin:2: '=' expected near 'ls'
> echo "pouet"
stdin:1: attempt to call global 'echo' (a nil value)
stack traceback:
	stdin:1: in main chunk
> reset
>> reset
stdin:2: '=' expected near 'reset'
> 
> print("Coucou")
Coucou
>

On a bien la main sur la console, je ne comprend toujours pas à quoi correspondent les caractères spéciaux du début par contre.

Connexion au point d’accès wifi

Une fois qu’on a la main sur la console lua la configuration du point d’accès à sa box wifi est relativement simple:

> print(wifi.sta.getip())
nil
> wifi.sta.config {ssid="MON_POINT_DACCES", pwd="fbisecurity"}
> print(wifi.sta.getip()) 
192.168.0.11	255.255.255.0	192.168.0.1

On peut également enregistrer un script lua d’initialisation :

> file.open("init.lua","w+")
> file.writeline([[print("Bienvenue chez Martoni")]])
> file.close()
> node.restart()
> 
 ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x40100000, len 26820, room 16 
tail 4
chksum 0x2e
load 0x3ffe8000, len 2180, room 4 
tail 0
chksum 0xc6
load 0x3ffe8884, len 136, room 8 
tail 0
chksum 0x4a
csum 0x4a
���n��{��o|�
              dl$l #�����s�l�N��n�l ��r�d�l�
                                                        $`��{�$�$�
                                                                     l`��r�l�

                                                                                 $l rd�o��bc�|$�cbp��$b��n�noƒll��
                                                                                                                               l�$���
                                                                                                                                      �lr$�o����cBld�
                                                                                                                                                       
                                                                                                                                                        B
                                                                                                                                                         ���cBl�crl{

NodeMCU 2.1.0 build unspecified powered by Lua 5.1.4 on SDK 2.1.0(116b762)
Bienvenue chez Martoni
> 

Conclusion provisoire:

C’est mal vendu ! Parce que la prise en main n’a rien d’évident, et il faut se battre un peu pour enfin pouvoir prendre la main sur le kit. Je ne sais pas si le firmware par défaut est buggé ou si j’ai utilisé la bonne procédure mais ce fut une connexion compliqué.

Par contre le wifi à l’air de très bien tourner.

Publié dans embarqué, informatique, programmation | Marqué avec , , , | Laisser un commentaire

Analog input with usb soundcard on Linux [Part3]

[<< part2]

Time to get serious things now and put it all together.

Record waves

I will record audio waves with a first python script named recordwaves.py. This script will simply launch arecord each 60 seconds and save it under ram directory (/run/).

$ arecord -d 10 -f S16_LE -c1 -r4000 -D plughw:1 -t wav foobar.wav

The script must be launched at raspberry pi boot. We just have to add the command in crontab with command crontab -e

@reboot cd /opt/house_power/ && python3 recordwaves.py -d /run/hdata &

Current calculation

Two things with waverms.py : calculate RMS current from wavefile recorded by recordwaves.py, store value and time in csv and database sqlite3.

Then we must have to create a sqlite3 file to store value with sqlite3 command :

pi@raspberrypi:/opt/house_power $ sqlite3 housepower.db
SQLite version 3.8.7.1 2014-10-29 13:59:56
Enter ".help" for usage hints.
sqlite> CREATE TABLE rms (id INTEGER, recordtype VARCHAR(20), rmsvalue INTEGER, recordtime INTEGER);

To calculate rms, don’t forget that Python3 is provided with “batteries included” then there is a module for that named audioop. This module include a method simply named rms().

As recordwaves.py, the script waverms.py is launched with crontab command :

@reboot cd /opt/house_power/ && python3 waverms.py -d /run/hdata &

Web page display

For displaying datas, we will keep python3 language using module flask for web server and bokeh for graphes generation. The python3 script server is named house_power.py and need an html template named graph.html.

Flask can be installed with apt :

sudo apt-get install python3-flask

And bokeh with pip3

sudo pip3 install bokeh

And launch it also with crontab :

@reboot cd /opt/house_power/web/ && python3 house_power.py &

The graphes of electricity current house consumption is then accessible on following local networks address : http://192.168.0.10:5000/ (of course, if your raspberrypi address is 192.168.0.10).

This give us graph like it :

All codes are available on my github repository named housepower. It’s fully functionnal but not finished yet. I have to increase website functionnality. Adding days mean consumption and maybe more.

Publié dans embarqué, informatique, Non classé | Marqué avec , , , , , , , , | Laisser un commentaire

Analog input with usb soundcard on Linux [Part2]

[<< part1]

Ok, we seen on a first article how to record signal from the input of an usb sound card. But our objective is not to just «ear the sound of current» but our objective is to make a measurement.

Displaying waves with python

For quick and dirty displaying we can use the opensource sound software audacity . But for more computation, and for the end application I used python with the following script found on stackoverflow:

import matplotlib.pyplot as plt
import numpy as np
import wave
import sys

spf = wave.open('foobar.wav','r')

#Extract Raw Audio from Wav File
signal = spf.readframes(-1)
signal = np.fromstring(signal, 'Int16')

plt.figure(1)
plt.title('Signal Wave...')
plt.plot(signal)
plt.show()

Saturation

There is a problem with sound card Line in : its voltage level limit is low ~400mVpp depend to volume input control. Then recorded signal is dramatically saturated by the sound card. As we can see on the following measurement curves

toaster current curve : saturated

Kettle and toaster current curve : saturated

To solve this problem, I simply soldered resistor divider to divide by ~10 the input signal level. Then I get good signal entry.

Voltage dividor

To unsure that signal level will not saturate, don’t forget to set input sound level at maximum with alsamixer :

$ alsamixer

We can then obtain a not saturated signal :

Toaster plus kettle current curve not saturated

Plugging it on raspberrypi and electric distribution board.

In my house, the electric distribution board and internet box are under the same cupboard then it’s easy to connect current probe + raspberrypi + usb sound card and it’s power (tricks: to power the raspberrypi you can use the usb plug from your box instead of power wall adapt).

Wire plug in my electric cupboard

Visualize the sound of your house electric consumption

I can now make measurement from the raspberrypi then download wave on computer to see the my house electric consumption.

ssh pi@192.168.0.111
arecord -d 10 -f cd -D plughw:1 -t wav foobar.wav

This above command give is not stopping after ten seconds like on my laptop and give me multiple files of 44Bytes. I don’t know why ?
Once it recorded we can download it with scp on laptop :

$ scp pi@192.168.0.111:~/foobar-* .

Then display it with my little python script :

Electric consumption before and after power on the inductive hot plate for boiling water.

 

In a futur article we will see how to calculate the RMS current with a deamon and save it in raspberrypi to see the consumption history.

[ Part3 >>]

Publié dans embarqué, informatique | Marqué avec , , , , , , , , | Laisser un commentaire

Analog input with usb soundcard on Linux [Part1]

I recently bought a current sensor to measure my electric house consumption. This sensor as a 1 volt amplitude output signal that can be captured by a simple sound input.

Current curve on my kettle consumption captured by the sensor. Using a 10k resistor on output

I don’t have microphone input on my raspberry pi 3. Then to use my sensor I had to buy an USB soundcard on the internet.

On my laptop (debian stretch), the usb-key is correctly seen as a sound-card :

$ sudo dmesg
[ 9474.556786] usb 1-1.2: new full-speed USB device number 5 using ehci-pci
[ 9474.668021] usb 1-1.2: New USB device found, idVendor=8086, idProduct=0808
[ 9474.668026] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 9474.668028] usb 1-1.2: Product: USB PnP Sound Device
[ 9474.668029] usb 1-1.2: Manufacturer: C-Media Electronics Inc.
[ 9474.758118] hidraw: raw HID events driver (C) Jiri Kosina
[ 9474.767742] usbcore: registered new interface driver snd-usb-audio
[ 9474.771791] usbcore: registered new interface driver usbhid
[ 9474.771793] usbhid: USB HID core driver
[ 9474.778747] input: C-Media Electronics Inc. USB PnP Sound Device as /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.3/0003:8086:0808.0001/input/input19
[ 9474.837031] hid-generic 0003:8086:0808.0001: input,hidraw0: USB HID v1.00 Device [C-Media Electronics Inc. USB PnP Sound Device] on usb-0000:00:1a.0-1.2/input3

And works same on raspberrypi3 (with raspbian) :

[171165.501265] usb 1-1.2: new full-speed USB device number 4 using dwc_otg
[171165.609589] usb 1-1.2: New USB device found, idVendor=8086, idProduct=0808
[171165.609608] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[171165.609621] usb 1-1.2: Product: USB PnP Sound Device
[171165.609634] usb 1-1.2: Manufacturer: C-Media Electronics Inc.      
[171165.618168] input: C-Media Electronics Inc.       USB PnP Sound Device as /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/1-1.2:1.3/0003:8086:0808.0001/input/input0
[171165.671634] hid-generic 0003:8086:0808.0001: input,hidraw0: USB HID v1.00 Device [C-Media Electronics Inc.       USB PnP Sound Device] on usb-3f980000.usb-1.2/input3
[171165.766026] usbcore: registered new interface driver snd-usb-audio

And seems to be correctly recognized by arecord on raspberrypi3 :

pi@raspberrypi:~ $ arecord -l
**** List of CAPTURE Hardware Devices ****
card 1: Device [USB PnP Sound Device], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

And on my laptop !

$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: ALC3202 Analog [ALC3202 Analog]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
card 1: Device [USB PnP Sound Device], device 0: USB Audio [USB Audio]
  Subdevices: 0/1
  Subdevice #0: subdevice #0

With -L option :

$ arecord -L
default
    Playback/recording through the PulseAudio sound server
null
    Discard all samples (playback) or generate zero samples (capture)
sysdefault:CARD=PCH
    HDA Intel PCH, ALC3202 Analog
    Default Audio Device
front:CARD=PCH,DEV=0
    HDA Intel PCH, ALC3202 Analog
    Front speakers
dmix:CARD=PCH,DEV=0
    HDA Intel PCH, ALC3202 Analog
    Direct sample mixing device
dsnoop:CARD=PCH,DEV=0
    HDA Intel PCH, ALC3202 Analog
    Direct sample snooping device
hw:CARD=PCH,DEV=0
    HDA Intel PCH, ALC3202 Analog
    Direct hardware device without any conversions
plughw:CARD=PCH,DEV=0
    HDA Intel PCH, ALC3202 Analog
    Hardware device with all software conversions
sysdefault:CARD=Device
    USB PnP Sound Device, USB Audio
    Default Audio Device
front:CARD=Device,DEV=0
    USB PnP Sound Device, USB Audio
    Front speakers
surround21:CARD=Device,DEV=0
    USB PnP Sound Device, USB Audio
    2.1 Surround output to Front and Subwoofer speakers
surround40:CARD=Device,DEV=0
    USB PnP Sound Device, USB Audio
    4.0 Surround output to Front and Rear speakers
surround41:CARD=Device,DEV=0
    USB PnP Sound Device, USB Audio
    4.1 Surround output to Front, Rear and Subwoofer speakers
surround50:CARD=Device,DEV=0
    USB PnP Sound Device, USB Audio
    5.0 Surround output to Front, Center and Rear speakers
surround51:CARD=Device,DEV=0
    USB PnP Sound Device, USB Audio
    5.1 Surround output to Front, Center, Rear and Subwoofer speakers
surround71:CARD=Device,DEV=0
    USB PnP Sound Device, USB Audio
    7.1 Surround output to Front, Center, Side, Rear and Woofer speakers
iec958:CARD=Device,DEV=0
    USB PnP Sound Device, USB Audio
    IEC958 (S/PDIF) Digital Audio Output
dmix:CARD=Device,DEV=0
    USB PnP Sound Device, USB Audio
    Direct sample mixing device
dsnoop:CARD=Device,DEV=0
    USB PnP Sound Device, USB Audio
    Direct sample snooping device
hw:CARD=Device,DEV=0
    USB PnP Sound Device, USB Audio
    Direct hardware device without any conversions
plughw:CARD=Device,DEV=0
    USB PnP Sound Device, USB Audio
    Hardware device with all software conversions

 

To test it on my laptop I hacked an extension cord to have a wire loop and grip the current sensor. I then plugged a kettle on it to capture the electric current signal.

current loop measurement

Then I made measurement with arecord :

$ arecord -d 10 -f cd -D plughw:1 -t wav foobar.wav
Recording WAVE 'foobar.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo

And eared the sound of my boiling water with play :

[16:51:57]fabien@martonilp:~
$ play foobar.wav

foobar.wav:

File Size: 1.76M Bit Rate: 1.41M
Encoding: Signed PCM
Channels: 2 @ 16-bit
Samplerate: 44100Hz
Replaygain: off
Duration: 00:00:10.00

In:100% 00:00:10.00 [00:00:00.00] Out:441k [!=====|=====!] Hd:0.0 Clip:0
Done.

Then I can ear the sound of current boiling water :

 

In futur article we will see how to calculate the current consumption of my kettle from this wave files.

References:

[Next >> Part2]

Publié dans embarqué, informatique | Marqué avec , , , , , , , , | Laisser un commentaire

Poulet industriel ou poulet bio ?

Twitter est un éleveur de poulets en batterie. L’objectif principal de cet éleveur est que ça piaille et que ça se batte dans la basse cour.
Pour cela Twitter multiplie les contraintes pour vous énerver et vous faire réagir : limitation des messages à 140 caractères, mise en valeurs des messages les plus polémiques, publicité incessante, …
L’utilisation de twitter est mauvaise pour les nerfs et produit de la mauvaise viande.
 
Mais il existe un autre système basé sur de l’élevage de poulets en liberté avec des restrictions moindre et moins d’énervement : mastodon
https://joinmastodon.org/
Du bon poulets de Loué ™ 😉
Pour utiliser mastodon il faut choisir parmi les nombreux élevages disponibles dans le monde:
Et si l’on se sent l’âme d’un éleveur il est même possible de monter le sien.
Du point de vue du poulet, mastodon fonctionne comme twitter (l’énervement en moins). Les messages sont limités à 500 caractères, on peux faire des «hashtag» comme dans twitter.
On ne parle pas de twit mais de pouet (toot) et re-pouet. Il est possible de suivre les pouets des autres poulets, même quand ils sont dans un autre élevage.
Si vous souhaitez me suivre, mon poulet se trouve dans l’élevage du parti pirate et se nomme Martoni :
https://mastodon.partipirate.org/@Martoni
Bon pouet !

Publié dans Non classé | Laisser un commentaire

«Il vaut mieux avoir l’état d’urgence même s’il ne se passe rien, que de risquer qu’il se passe quelque chose de pire sans état d’urgence.»

[Via mastodon]

Publié le par admin | Laisser un commentaire

Sortie de l’opos6ul_nano, version micro de l’opos6ul

La nouvelle Opos6ul_nano qui tien entre deux doigts

La nouvelle Opos6ul_nano qui tient entre deux doigts

 

L’OPOS6UL est une petite carte Linux embarqué à base d’i.MX6UL permettant de faire tourner ses applications Raspberry-Pi(TM) sur un produit industriel.

l’opos6UL sodimm board avec le Wifi/Bt et 4GB eMMC

Cette carte est déjà relativement petite au format SODIMM, mais visiblement elle était encore trop grande pour certain. C’est pourquoi Armadeus Systems sort maintenant la version ultra-mini de cette carte au format NGFF (M.2) : l’OPOS6UL_NANO.

Carte quasiment 3 fois plus petite que sa grande sœur, mais avec les même caractéristiques qui ont fait le succès de l’opos6ul :

  • Linux embarqué bien sûr
  • i.MX6UL ou i.MX6ULL
  • Wifi
  • BT
  • Ethernet
  • USB2
  • SPI
  • I²C
  • GPIO
Un aperçu de la taille de l'opos6ul_nano à coté de sa grande sœur.

Un aperçu de la taille de l’opos6ul_nano à coté de sa grande sœur.

Le module est compatible avec la carte de développement de l’opos6ul en utilisant un adaptateur.

Bien sûr il est possible de monter la nouvelle opos6ul_nano sur la carte de développement de l'opos6ul.

Bien sûr il est possible de monter la nouvelle opos6ul_nano sur la carte de développement de l’opos6ul.

Il est donc toujours possible de faire un développement «Raspberry-Pi compatible» grâce au connecteur Raspberry-Pi(TM) présent sur cette carte de développement.

-> Fiche technique de l’opos6ul_nano sur le site officiel.

Publié dans embarqué, informatique | Laisser un commentaire

Theresa May

« Si les lois des droits de l’homme entravent la lutte contre l’extrémisme et le terrorisme, nous changerons ces lois pour protéger le peuple britannique. »

Publié dans Non classé | Laisser un commentaire

Tablette Wacom Intuos Draw sous Debian Jessie

Salut,

Je viens de claquer mon fric sur un coup de tête d’investir dans une tablette graphique Wacom Intuos Draw. L’objectif est de pouvoir faire sur ordinateur les petits dessins que j’ai appris à faire en suivant le bouquin «you can draw in 30 days».

J’ai quand même cherché une tablette qui soit compatible avec Linux. L’idéal aurait-été que TuBranchesÇaMarche sur une Debian Jessie.

Mais ça n’a pas tout à fait été le cas puisqu’il a tout de même fallu recompiler le driver. Bon on en est finalement pas très loin la recompilation du driver est vraiment très simple et se fait très vite.

L’explication est donnée sur le wiki du projet input-wacom pour les distri Debian, Ubuntu, Mint, Suse et Redhat.

Une fois le driver compilé et installé, il n’y a même pas à tripoter des fichiers de config, ça marche direct.

Voici mes premiers ébats dessinatoire avec MyPaint :

Bref, ça marche bien et c’est plutôt rigolo. L’avenir nous dira si ça reste un gadget.

@+

Publié dans dessin | Marqué avec | Laisser un commentaire

Comment indiquer la version de son projet dans le bitstream vivado ?

En règle générale on aime bien avoir la version du firmware générée sur lequel tourne notre FPGA. Cependant, pour intégrer une date de compile, une version de logiciel ou autre dans un bitstream, cela ne se fait pas très simplement.

L’exemple ici est certainement quick&dirty, mais c’est une solution possible pour résoudre ce problème. Le système est conçu via le «blocs designer» de vivado et contient un microblaze.

Pour pouvoir ajouter des «registres» spécifiques sans avoir à coder en HDL on intégrera un bloc de ROM nommé «Distributed Memory Generator». Pour intégrer ce bloc dans l’espace mémoire du Microblaze on ajoutera un contrôleur de ram AXI comme le montre la saisie d’écran ci-dessous:

Ce bloc peut être configuré via un fichier texte avec l’extension «.coe» qui contiendra les valeurs.


memory_initialization_radix=10;
memory_initialization_vector=1562 1490616824 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;

La variable memory_initialization indique la base (ici du décimal) des valeurs données dans le vecteur memory_initialization_vector. Dans cet exemple, trois valeurs sont données : la période de l’horloge du contrôleur de DDR, la date en secondes unix et la version.

Plutôt que d’avoir à modifier notre fichier *.coe à chaque synthèse, nous allons écrire un script tcl qui sera appelé automatiquement par vivado à chaque synthèse/placement-routage. Le TCL est un langage de script que beaucoup de logiciels d’électronique sont capable d’éxecuter, c’est le cas de vivado (tcl version 8.5).

Le répertoire du projet est donné par la commande tcl :


set current_project_dir [get_property DIRECTORY [current_project]]

On peut l’afficher au besoin dans la console «Messages» de vivado avec puts :


puts $current_project_dir

période du contrôleur de DDR

L’idée ici est d’aller chercher l’information dans le fichier datasheet.txt généré par le fucking MIG. La méthode Quick&Dirty pour récupérer l’info dans le fichier est de découper le texte à coup de split et de lindex pour se focaliser sur la «Design Clock Frequency».

...
/*******************************************************/
/*                  Controller 0                       */
/*******************************************************/
Controller Options :
   Memory                        : DDR3_SDRAM
   Interface                     : AXI
   Design Clock Frequency        : 1562 ps (  0.00 MHz)
   Phy to Controller Clock Ratio : 4:1
   Input Clock Period            : 5077 ps
   CLKFBOUT_MULT (PLL)           : 13
   DIVCLK_DIVIDE (PLL)           : 2
   VCC_AUX IO                    : 1.8V
   Memory Type                   : Components
   Memory Part                   : MT41K1G8SN-125
   Equivalent Part(s)            : --
   Data Width                    : 8
   ECC                           : Disabled
   Data Mask                     : enabled
   ORDERING                      : Normal
...

La période est ainsi stockée dans la variable $period :


# Get DDR period
set fp [open "$current_project_dir/../../../projet.srcs/sources_1/bd/ {...} /datasheet.txt"]
set filedata [read $fp]
set data [split $filedata "\n"]
foreach line $data {
	if {[regexp {Design} $line]} {
		set period [expr [lindex [split [lindex [split $line ":"] 1] "ps"] 0]]
	} 
}

version

Pour la version c’est à nous de définir un «generic» dans le projet avec le nom que nous voulons (par exemple ProjectVersion). Ce generic se définit dans le menu setting du projet, pour cette exemple il sera défini à ‘1’, quelle originalité !

Ce generic se retrouve ensuite dans le fichier xml du projet au format *.xpr. De la même manière que pour la period du contrôleur de DDR, nous allons lire ce fichier au moyen d’une savante boucle de découpage split et lindex:


set fp [open "$current_project_dir/../../project.xpr"]
set filedata [read $fp]
set data [split $filedata "\n"]
foreach line $data {
	if {[regexp {ProjectVersion} $line]} {
		set ProjectVersion [lindex [split [string trim $line] "\""] 3]
	} 
}

date

Pour la date c’est beaucoup plus simple puisqu’il existe une commande tcl (>=8.5) qui nous donne les «seconds unix» : clock seconds.


set thetime [clock seconds]

Enregistrement du fichier coe

Il suffit pour cela d’ouvrir en écriture le pathname que nous désinons écrire puis ajouter les valeurs avec puts :


# Write coe file for rom
set wfp [open "$current_project_dir/../../../../rom_version.coe" w]
puts $wfp "memory_initialization_radix=10;"
puts $wfp "memory_initialization_vector=$period $thetime $ProjectVersion 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;"

Ajout du crochet (hook)

Pour que notre script tcl soit appelé automatiquement par vivado il faut le définir comme un «hook» de pre-synthèse. Pour cela il faut se rendre dans le menu de configuration de la synthèse:

Puis sélectionner notre script name.tcl dans l’option tcl.pre (pour pre-synthèse).

Le script sera exécuté dans le répertoire :

project/project.runs/run_name/

Il suffit maintenant de lancer la synthèse pour que notre «hook» soit lancé avant la synthèse et remplisse correctement la rom de paramètres de notre design.

Publié dans informatique | Marqué avec , , , | Laisser un commentaire