Go Down

Topic: MAX7219 et DS3231 sur STM32 Blue Pill (Read 626 times) previous topic - next topic

hbachetti

Nov 25, 2018, 11:34 am Last Edit: Nov 25, 2018, 04:30 pm by hbachetti
Salut à tous

J'aborde une phase cruciale de mon existence : le dernier trimestre de ma vie professionnelle.

Il m'est venu à l'idée d'afficher sur mon bureau le décompte de secondes qui va s'écouler jusqu'à ce moment tant attendu.

Une espèce de QUILLE électronique.

Un ARDUINO avec un MAX7219 + afficheur 8x7 segments ?
Oui mais c'est trop facile. Il fallait que je fasse un petit effort supplémentaire.

J'ai donc choisi cette carte :



La "petite" BLUE PILL que l'on peut trouver ICI à un prix plus qu'intéressant.

Pour le même prix qu'une NANO :
- cœur 32bits 72MHz
- large gamme de tension d'utilisation de 2V à 3.6V
- 128Ko de mémoire flash
- 20Ko de SRAM
- unité de calcul CRC, ID unique 96 bits
- deux convertisseurs A/N 1µs 12 bits (jusqu'à 10 voies)
- dontrôleur DMA 7 voies, 3 timers à usage général et 1 timer de contrôle avancé
- 37 ports E/S rapides
- interfaces de débogage fil série (SWD) et JTAG
- interfaces : deux SPI, deux I2C, trois USART, une USB et une CAN

Mon intention est de faire tourner ce petit sketch :

Code: [Select]

#include <TimeLib.h>
#include "LedControl.h"

#define TIME_HEADER  "T"   // Header tag for serial time sync message
#define TIME_REQUEST  7    // ASCII bell character requests a time sync message

#define LED     PA0
LedControl lc = LedControl(PA1, PA2, PA3, 1);

const unsigned long DEFAULT_TIME = 1543138573; // Nov 25 2018

void processSyncMessage() {
  unsigned long pctime;

  if(Serial.find(TIME_HEADER)) {
     pctime = Serial.parseInt();
     Serial.print("PC TIME: ");
     Serial.println(pctime);
     if( pctime >= DEFAULT_TIME) { // check the integer is a valid time
       setTime(pctime); // Sync Arduino clock to the time received on the serial port
     }
  }
}

time_t requestSync()
{
  Serial.write(TIME_REQUEST); 
  return 0; // the time will be sent later in response to serial mesg
}

void setup() {
  Serial.begin(115200);
  pinMode(LED, OUTPUT);
  lc.shutdown(0, false);
  lc.setIntensity(0, 4);
  lc.clearDisplay(0);
  setTime(DEFAULT_TIME);
  setSyncProvider(requestSync);
}

tmElements_t t = {0, 0, 0, 6, 1, 2, 2019-1970};

void loop() {
  time_t retirement = makeTime(t);  // convert time elements into time_t
  if (Serial.available()) {
    processSyncMessage();
  }
  lc.clearDisplay(0);
  printNumber(0, retirement-now());
  if (timeStatus() == timeSet) {
    digitalWrite(LED, HIGH); // LED on if synced
  } else {
    digitalWrite(LED, LOW);  // LED off if needs refresh
  }
  delay(1000);
}

void printNumber(int addr, long num) {
  byte c;
  int j;
  int d;
  num < 1000 ? d = 4 : d = countDigits(num);
  for (j = 0; j < d; j++) {
     c = num % 10;                      // Modulo division = remainder
     num /= 10;                         // Divide by 10 = next digit
     boolean dp = (j ==3);               // Add decimal point at 3rd digit.
     lc.setDigit(addr, j, c, dp);
  } 


int countDigits(long num) {
  int c = 0;
  while (num) {
    c++;
    num /= 10;
  }
  return c;
}

Comme vous pouvez le remarquer, la différence par rapport à un sketch ARDUINO ne saute pas aux yeux.
Ceci est normal, car je l'ai développé d'abord sur une NANO.

Seules ces deux lignes diffèrent :

Code: [Select]

// version NANO
#define LED     13
LedControl lc = LedControl(12, 11, 10, 1);

// version STM32
#define LED     PA0
LedControl lc = LedControl(PA1, PA2, PA3, 1);

Comment faire pour exécuter du code ARDUINO sur un STM32 ?
Toutes les explications sont ICI.
Un petit tuto personnel pour aider pas à pas les néophytes ICI.

Le sketch utilise TimeLib et LedControl, deux librairies classiques qui ne devraient à priori pas poser de problème particulier.

Et cela fonctionne !



@+
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

hbachetti

La photo du montage ne passe pas les contrôles de sécurité du forum.
Il est vrai que cela ressemble fortement à une bombe terroriste  ;D
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

68tjs

Tu oublies : 50% d'entrées qui sont 5V tolérantes. Avec le mélange actuel de CI 5V et 3,3V c'est assez intéressant.

Je sens qu'un certain blog va s'étoffer dans les prochains mois,  :smiley-mr-green:

hbachetti

Quote
Tu oublies : 50% d'entrées qui sont 5V tolérantes. Avec le mélange actuel de CI 5V et 3,3V c'est assez intéressant.
Non. Ce n'est pas un oubli. Mais tu connais mieux que moi apparemment.

Quote
Je sens qu'un certain blog va s'étoffer dans les prochains mois,  :smiley-mr-green:
C'est certain amigo.  ;)

@+
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

hbachetti

Quote
Tu oublies : 50% d'entrées qui sont 5V tolérantes. Avec le mélange actuel de CI 5V et 3,3V c'est assez intéressant.
Le pire c'est que tu me l'avais déjà dit en avril : ICI.

C-joint le plan de brochage que tu avais fait à l'époque.

@+
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

68tjs

Quote
Mais tu connais mieux que moi apparemment.
Faut pas exagérer, je n'ai que programotté avec.
Je suis assez faignant et j'ai vite accroché au fait de ne plus avoir à faire d'adaptation de niveau.

Les bibliothèques Mbed sont aussi très riches.
Ce qui est gênant avec Mbed c'est que c'est volontairement orienté professionnel,
Bien que ce soit possible, il n'existe pas  de forum Mbed en français, juste un en espagnol et un autre en japonais et encore ils sont assez déserts.
Rien que de l'anglais .

D'un coté Mbed est plus sérieux qu'arduino, la gestion des bibliothèques avec un dépôt mercurial (gratuit) n'a rien à voir avec le foutoir arduino, de l'autre je pense qu'Mbed risque d'être assez hermétique aux débutants complets.
Perso ne connaissant à priori rien sur les microcontrôleurs je pense que si je n'avais pas fait mes premières réalisations ici avec arduino et les avr  finalement relativement simples, j'aurais eu des grosses difficultés avec Mbed et les ARM,
Mais le passage arduino/Mbed n'est pas impossible à qui veut bien faire un effort supplémentaire.



hbachetti

Quote
Ce qui est gênant avec Mbed c'est que c'est volontairement orienté professionnel,
C'est bien pour cela que je joue avec STM32DUINO.

Un mapping en couleur de la BLUE PILL :


Tiré d'ici : http://wiki.stm32duino.com/index.php?title=Blue_Pill

Concernant mes petites expérimentations, j'ai ajouté la gestion d'un module RTC DS3231.
Je sais : le STM32F103C8 possède un RTC interne et un oscillateur 32.768KHz est implanté sur la carte BLUE PILL.
Mais j'avais envie de jouer avec l'I2C. :)

Les pins fonctionnant avec Wire sont :
SDA : PB7
SCL : PB6

Le STM32 a deux I2C et l'I2C1 peut utiliser soit PB9+PB8 ou PB7+PB6
Le problème est qu'il faudrait lire le code de la librairie core pour savoir comment c'est configuré.

Donc, pour l'instant 3 librairies utilisées avec succès :
Wire
TimeLib
LedControl

Plutôt prometteur.

La version complète des branchements et du sketch sur mon BLOG

@+
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

68tjs

#7
Nov 25, 2018, 05:42 pm Last Edit: Nov 25, 2018, 05:47 pm by 68tjs
Quote
Je sais : le STM32F103C8 possède un RTC interne et un oscillateur 32.768KHz est implanté sur la carte BLUE PILL.
A ce que j'ai compris c'est une RTC mais pas une RTC.

Non je ne suis pas encore devenu gâteux, c'est toujours la même histoire avec ces anglophones qui ont un vocabulaire ridiculement pauvre et qui donnent le même nom à des notions différentes comme le "driver" qui est au choix un jockey "cavalier" au trot attelé, un conducteur automobile, un bout de programme ou un ampli pour commander un moteur ou des dels, donc parlons français.

Avec les réserves d'usage : toujours à ce que j'en ai compris, c'est une simple horloge qui compte je ne sais plus quoi exactement, probablement les secondes, mais ce n'est pas un DS3231 qui donne séparément  l'année, le mois, le jour, les heures, les minutes, les secondes. Le STM32F103 peut  faire comme le DS3231 à condition d'écrire le programme correspondant.

hbachetti

Apparemment oui, ce serait juste un compteur sur 2 x 32bits. Ils ont prévu large.
Mais ce n'est pas si mal, cela permet de stocket uniquement l'heure au format UNIX (epoch) UTC.
Cela nécessite pas mal de boulot pour la librairie à mettre par dessus, mais ST la fournit.

Mais avant tout un DS3231 est très précis et compensé en température.

@+
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

68tjs

Et si une RTC n'est  pas forcément une RTC, un quartz reste un quartz, il n'aime pas les variations de température . :smiley-mr-green: 

hbachetti

Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Artouste

Salut à tous

J'aborde une phase cruciale de mon existence : le dernier trimestre de ma vie professionnelle.

Il m'est venu à l'idée d'afficher sur mon bureau le décompte de secondes qui va s'écouler jusqu'à ce moment ...
Bonsoir Henri
Tu ne me précéderas  donc que  de quelques trimestres :smiley-mr-green:





[HUM]
Ne pas oublier aussi que  "Demain" sera aussi quasi toujours le premier jour   du reste de ta vie :smiley-mr-green:

hbachetti

Quote
Tu ne me précéderas  donc que  de quelques trimestres :smiley-mr-green:
Tu as encore du temps pour bricoler ta quille donc.

@+
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Go Up