danjperron
Posts: 3076
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: liaison i2c

Fri Mar 09, 2018 2:22 pm

Ta ligne dans /boot/config
dtoverlay=i2c-rtc, ds1307
OK! il n'y a pas d'espace entre la virgule et ds1307

Et la bonne façon de l'écrire
dtoverlay=i2c-rtc,ds1307

mandrin
Posts: 65
Joined: Tue Feb 06, 2018 4:49 pm

Re: liaison i2c

Fri Mar 09, 2018 2:40 pm

Quelque fois "on a du pot"

https://www.raspberrypi-spy.co.uk/2015/ ... pberry-pi/

j'ai appliqué les instructions concernant le fichier rc-local

Code: Select all

sudo nano /etc/rc.local
Add the following two lines before the exit 0 line :

Code: Select all

echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
hwclock -s
un petit

Code: Select all

sudo reboot
et voila tout remarche l'horloge se met à l'heure.

OUF!
Depuis le temps que ça dure, enfin à la suite (les alarmes 1 et 2+ un petit bug dans la température)
Et oui c'est pas encore fini.

Amicalement

danjperron
Posts: 3076
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: liaison i2c

Fri Mar 09, 2018 4:37 pm

En réalité ce n'est que l'espace qui était le problème.


La dernière méthode que tu appliques est la veillle version avant le "device tree"

mandrin
Posts: 65
Joined: Tue Feb 06, 2018 4:49 pm

Re: liaison i2c

Sat Mar 10, 2018 9:22 am

Bonjour,

Après toutes ces méandres sur le fonctionnement de cette horloge cela m'amène à quelques questions.

Est il possible de laisser l'horloge DS3231 tourner dans son coin sans être en permanence au coeur du système.
Je veux dire par là que l'adresse 0x68 reste disponible et que l'on puisse utiliser les autres fonctions de cette horloge.

Principe d'utilisation:
Lancement du raspberry
Configurer l'horloge
Mise à l'heure en utilisant l'horloge qui a fonctionné sur pile durant l'arrêt.
synchroniser l'horloge DS3231
Arrêt de l'horloge
Connection sur internet éventuellement(si accessible).Dans ce cas synchronisation de l'heure avec ntp par exemple.
Lancement du programme qui utilise l'heure du système avec datetime
Mise à l'heure périodique

Donc possibilité d'utiliser les fonctions de la puce DS3231 en dehors du système.
Lecture de l'heure, alarmes et température interne

Quel est ton avis sur la faisabilité et par quels moyens éventuellement.

PS: j'ai corrigé le fichier config.txt mais ça ne change rien.

Amicalement

danjperron
Posts: 3076
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: liaison i2c

Sat Mar 10, 2018 1:12 pm

Est il possible de laisser l'horloge DS3231 tourner dans son coin sans être en permanence au coeur du système.
Mais oui tu n'as pas lue mon lien!

viewtopic.php?f=65&t=166853&p=1075093&h ... e#p1074313

mandrin
Posts: 65
Joined: Tue Feb 06, 2018 4:49 pm

Re: liaison i2c

Sat Mar 10, 2018 2:31 pm

Désolé, je n'avais pas percuté sur cette ligne car j'étais bien loin de cette préoccupation à ce moment là.

2 - Dé-installation du module rtc_ds1307

Code: Select all

     sudo rmmod rtc_ds1307
Du coup peut on le ré-installer sans rebooter le pi?

Je suis en train de lire des articles sur crontab et les questions se posent.

Si deux tâches sont planifiées à la même minute que ce passe t'il ?
dans quel ordre s'exécutent elle ?
Si une tâche dure plus longtemps que prévu la suivante est elle suspendue ou annulée ?

Comment lancer un programme python avec crontab ?

Code: Select all

@reboot /usr/bin/python3 /home/pi/Dossier_raspi/store_mesures.py
Est il correcte?

Le principe suivant est il compatible avec.

Lancement du raspberry (la OK)
Configurer l'horloge (la OK)
Mise à l'heure en utilisant l'horloge qui a fonctionnée sur pile durant l'arrêt. (la OK)
Synchroniser l'horloge DS3231 (la OK)
Arrêt de l'horloge pour mise à la disposition du programme xx.py (sudo rmmod rts_ds1307) (la OK)
Utilisation des fonctions: 2 Alarmes, Température du circuit DS3231 (la OK)
Utilisation de l'heure du système avec datetime (la OK)
Mise à l'heure du circuit DS3231 et du système périodique (ex: toutes les semaines).

Cette dernière impose un redémarrage et un arrêt de l'horloge ?

Tout ça sans arrêt de la Raspberry ni reboot?

Il semblerait que certaines actions soient possibles mais probablement pas toutes.

Quel est ton avis sur tout ça.

Amicalement

danjperron
Posts: 3076
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: liaison i2c

Sun Mar 11, 2018 1:42 pm

Mise à l'heure du circuit DS3231 et du système périodique (ex: toutes les semaines).

Cette dernière impose un redémarrage et un arrêt de l'horloge ?

Tout ça sans arrêt de la Raspberry ni reboot?

Il semblerait que certaines actions soient possibles mais probablement pas toutes.

Quel est ton avis sur tout ça.

Amicalement
Pourquoi une mise à l'heure toute les semaines ? Le RTC est beaucoup plus précis!

Tu n'as pas besoin d'un redémarrage utilise insmod!

Tout est possible.

mandrin
Posts: 65
Joined: Tue Feb 06, 2018 4:49 pm

Re: liaison i2c

Sun Mar 11, 2018 10:30 pm

Bonsoir,

Ce n'était qu'une question.
J'aurais du écrire tous les ans..
Je me documente sur insmod et je reviens plus tard

Amicalement

mandrin
Posts: 65
Joined: Tue Feb 06, 2018 4:49 pm

Re: liaison i2c

Mon Mar 12, 2018 10:04 am

Bonjour,

Une question:
Existe t'il un ide pour Python du genre de MPLAB IDE de Microchips avec points d'arrêts, affichage des variables, des pointeurs,
et autres gadgets très utiles? bien entendu "gratuits".
Mon usage n'est pas professionnel.
J'avoue que à certains moments il est dur de savoir où on en est.

Amicalement

danjperron
Posts: 3076
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: liaison i2c

Mon Mar 12, 2018 11:39 am

Existe t'il un ide pour Python du genre de MPLAB IDE de Microchips avec points d'arrêts, affichage des variables, des pointeurs,
et autres gadgets très utiles? bien entendu "gratuits".
La dessus je ne peux pas t'aider beaucoup. Il y a peut être Kivy ou Pyforms ou Anaconda qui plus pour le coté scientifique. J'ai déja utilisé Eclipse pour cela.

Mais je suis un "console guy".

Python est un interpréteur donc tu peux vérifier tes fonctions directement.

Même lorsque je code avec MPLab j'ai très rarement utiiisé le mode debug à un point tel que je me demande si je me rappelle comment le faire fonctionner et j'utilise beaucoup MPLab pour mes projets personnels.

mandrin
Posts: 65
Joined: Tue Feb 06, 2018 4:49 pm

Re: liaison i2c

Mon Mar 12, 2018 11:57 am

Ma question concerne surtout les pointeurs d'adresse et les variables.
Ce serait bien de pouvoir suivre ces données en fonction de la progression du programme.

J'ai utilisé MPLAB, Tubo c, ST9 c'était très pratique.

je vais continuer comme ça.

Merci de ta réponse

Amicalement

mandrin
Posts: 65
Joined: Tue Feb 06, 2018 4:49 pm

Re: liaison i2c

Thu Mar 15, 2018 2:47 pm

Bonjour,

Une information:

Dans l'ensemble Raspberry il existe un IDE avec un debug intégré c'est Thonny Python IDE qui comprend un pas a pas et un affichage des variables très sobre.

Une petite incursion dans l'horloge après un "sudo rmmod rtc-ds1307" avec:

Code: Select all

i2cdump -y -r 0x00-0x06 1 0x68 b
me donne l'heuire UTC et non locale. Nous avons un décalage de +1h00 avec UTC
comment peut on corriger cela?

Un autre petit détail, "sudo insmod rtc-ds1307" ne fait pas l'installation du process.
il me répond "Aucun fichier ou répertoire de ce nom".

Je ne sais pas ou se trouve ce fichier pour lui indiquer un chemin.
Ce n'est pas très important mais pour information.

Merci encore

Amicalement

danjperron
Posts: 3076
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: liaison i2c

Fri Mar 16, 2018 1:23 pm

je laisserais le système en UTC et j'utiliserais l'OS au lieu du chip directement à mois que tu fasses un système comme le mien (mon lien pour la pixilation avec arrêt du PI).


J'ai vérifié et il y a deux choses.

1 - Pour le ds3231 la ligne pour config.txt est

Code: Select all

dtoverlay=i2c-rtc,ds3231
2- Si tu veux enlever le pilote(driver) ce sera

Code: Select all

sudo rmmod rtc_ds1307
Le remettre sans rebooter le Pi c'est

Code: Select all

 sudo modprobe rtc_ds1307

Et ensuite ajuster l'heure du système avec

Code: Select all

sudo hwclock --hctosys


Si tu utilises l'alarme il est donc facile d'ajouter le décalage horaire avec la classe datetime.

danjperron
Posts: 3076
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: liaison i2c

Fri Mar 16, 2018 1:34 pm

OK il y a moyen d'ajuster le RTC pour l'heure local

Code: Select all

sudo hwclock -w  --localtime
Maintenant le RTC est en mode local!

mandrin
Posts: 65
Joined: Tue Feb 06, 2018 4:49 pm

Re: liaison i2c

Fri Mar 16, 2018 3:47 pm

Bonjour,

C'est parfait j'ai toutes mes réponses.

Mon idée est de laisser tourner le Pi en permanence pour effectuer les mesures toutes les 10 minutes pour l'instant en lançant les programmes en Python avec un "crontab" appelant les class en fonction du temps.

exemple de principe:
reboot
lancement de l'horloge qui met à l'heure le système
mise à l'heure du système si internet est accessible
etc..

toutes les 10 mn
lancement de mesures.py
toutes les 11 mn
vérification des alarmes
etc..
autres dépendances du temps
remise à l'heure de l'horloge
autres programmes
Si deux tâches sont planifiées à la même minute que ce passe t'il ?
Si une tâche dure plus longtemps que prévu la suivante est elle suspendue ou annulée ?
*--------------*
D'autre part j'ai avancé dans ce projet d'étude et bien entendu j'ai des questions.

Je suis en train d'adapter ton fichier mcp7940.py:
https://www.raspberrypi.org/forums/vie ... ilit=time
La variable "regOffset" n'est pas définie dans le fichier ni dans alarmes.py.
Je l'ai mise à 0 pour les essais.
A moins que ce soit la variable définie par "0x11- 0xa" ci dessous?

Code: Select all

    def SetAlarm1(self, newAlarm,pol):
        self.SetAlarm(newAlarm, 0x11 - 0xa, pol)
        val = self.ReadRegister(ADDR_CONTROL)
        val = val | 0x28
        val = val & 0x7f       
        print("out of SetAlarm1")
Auquel cas à quoi cela correspond il?
0x11
0xa
*-------------*
Avec la fonction

Code: Select all

setAlarm0(self,newAlarm,pol)
La variable "pol" n'est pas définie et quoi sert elle?
Je l'ai mise à 0 pour les éssais.
*-------------*
Après quelques adaptations du fichier mcp7940 en essayant la fonction setAlarme1.py, j'ai un petit souci.
La conversion spécifiée ci-dessous fonctionne très bien en console Python3 mais pas dans l'ensemble du programme. Je n'en vois pas la raison.
Traceback (most recent call last):
File "/home/pi/Documents/Scratch Projects/setAlarme0.py", line 88, in <module>
SetAlarm1(newAlarm,regOffset,pol)
File "/home/pi/Documents/Scratch Projects/setAlarme0.py", line 82, in SetAlarm1
WriteRegister(ADDR_ALM1_DATE+regOffset,bin2bcd(newAlarm.date))
File "/home/pi/Documents/Scratch Projects/setAlarme0.py", line 31, in bin2bcd
return ((x % 10) + ((x) << 4)// 10)
TypeError: unsupported operand type(s) for %: 'builtin_function_or_method' and 'int'
contenu de la variable "newAlarm" avec l'origine de celle ci:

Code: Select all

    def ReadRealTime(self):
        self.realTime = self.ReadTime(self.RealTime)
        Year = self.bcd2bin(self.ReadRegister(ADDR_YEAR)) + 2000
        self.realTime = self.realTime.replace(year=Year);        
        return self.realTime

ct = rtc.ReadRealTime()
nt = ct + datetime.timedelta(minutes = 3)

newAlarm=datetime.datetime(2018,3,16,14,14,34)
Dans la valeur les 3 minutes sont bien incrémentées.

Voici une copie d'écran avec Python3 dans "Thonny Python IDE" avec le bout visible du fichier, le Shell et les variables:
https://image.noelshack.com/fichiers/2 ... scrot.png

J"avance mais ce n'est pas évident de tout découvrir.

Je ne veux pas mobiliser ton attention, j'ai quelques scrupules avec toutes mes questions.

Amicalement

danjperron
Posts: 3076
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: liaison i2c

Fri Mar 16, 2018 5:58 pm

Je suis en train d'adapter ton fichier mcp7940.py:
vie ... ilit=time
La variable "regOffset" n'est pas définie dans le fichier ni dans alarmes.py.
Je l'ai mise à 0 pour les essais.

regOffset stipule quelle alarme utilisée ou lire le temps réel.

readAlarm0() => readTime(0xa)
readAlarm1() => readTime(0x11)
readRealTime => readTime(0)

readTime n'est qu'une sous fonction il faut utiliser readRealTime()!

Ce n'est qu'un offset pour lire les bons registres. Regarde la liste des registres.

***** Attention le DS3231 n'est pas un mcp7940 ***
**** les registres ne sont pas les mêmes. ***

https://datasheets.maximintegrated.com/en/ds/DS3231.pdf

Alarme 1 commence a l'adresse 0x7
Alarme 2 commence à l'adresse 0xb et n'a pas de secondes.

Donc ADR_ALM0_SEC = 0x7
et ainsi de suite

Il va falloir que tu fasses une exception avec l'alarme 2 pour les secondes, qui est dans mon code ALM1.

Je viens de regarder la différence pour le registre de commande d'interruption et c'est très différent! (page 26)

http://ww1.microchip.com/downloads/en/D ... 05010F.pdf


Il va falloir modifier mcp7940.py et faire un ds3231.py . Ils sont trop différent!


setAlarm0(self,newAlarm,pol)
La variable "pol" n'est pas définie et quoi sert elle?
Je l'ai mise à 0 pour les éssais.
C'est la polarité de la broche d'interruption. Active High ou Low!
Attention setAlarm() est aussi une sous fonction! il faut utiliser setAlarm0() ou setAlarm1()


Ok pour ton erreur je pense que c'est parce que tu n'avais pas compris le sense de regOffset.
C'est pour cela que tu as ajouté ADDR_ALM1_DATE dans setAlarm1.

mandrin
Posts: 65
Joined: Tue Feb 06, 2018 4:49 pm

Re: liaison i2c

Fri Mar 16, 2018 7:58 pm

Bonsoir,

Je vais regarder regOffset avec tes paramètres.

J'ai bien réalisé un fichier DS3231.py pour mettre les bonnes adresses et appellations du circuit.

Pour les adresses des alarmes je les ai toutes changées parce que dans le mcp7940 elles sont des alarm0 et alarm1 tandis que dans le ds3231 elle s'appellent alarm1 et alarm2, ce n'est qu'un détail.

Par contre concernant le registre CONTROL du mcp7940, là, il faut être beaucoup plus vigilant car les implications entre les deux circuits sont plus complexes. C'est un peu la source de ma question sur regOffset car le 0x11 et 0xa m'ont posés questions.

Le pol je vais explorer ta réponse car je ne vois pas de quoi tu parles. Cela est certainement une des différences avec le DS3231.

SetAlarm() j'avais vu la sous fonction.

ADDR_ALM1_DATE je l'ai ajoutée avec la même adresse afin de faire une différence à cause du bit 6 qui est a positionner à 0 ou à 1 pour la fonction day(1-7) date (1-31), de même pour l'alarm2. Je verrais plus tard si je les conservent.

J'ai de quoi lire avec tout ça.

Amicalement

mandrin
Posts: 65
Joined: Tue Feb 06, 2018 4:49 pm

Re: liaison i2c

Tue Mar 20, 2018 8:47 am

Bonjour,

Je suis en train de faire mon fichier DS3231.py pour programmer les registres de l'horloge et je suis confronté à un truc étrange.
https://image.noelshack.com/fichiers/20 ... -scrot.png
ci dessus ce sont les fonctions entrées en manuel dans python3
et
ci dessous ce sont les mêmes fonctions mais en exécution par le programme
https://image.noelshack.com/fichiers/20 ... -scrot.png
Ce dernier ne donne aucun résultat.

j'ai fait un affichage en binaire afin d'avoir les résultats visibles. Tout est dans les écrans.

Aurait tu une explication?
Amicalement

danjperron
Posts: 3076
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: liaison i2c

Tue Mar 20, 2018 1:27 pm

Tes fonctions ne sont pas très fonctionelles. Tu spécifies un paramètre que tu ne te sers pas du tout.

Regarde ma classe mcp7940.py . Les deux fonctions sont définies !

Code: Select all

    def bcd2bin(self,x):
        return (((x) & 0x0f) + ((x) >> 4) * 10)

    def bin2bcd(self,x):
        return ((x % 10) + ((x / 10) <<4))
Si les fonctions ne sont pas sans une classe enlève le paramètre self

mandrin
Posts: 65
Joined: Tue Feb 06, 2018 4:49 pm

Re: liaison i2c

Tue Mar 20, 2018 2:14 pm

Je ne fait que çà et ma surprise est totale.

Si tu regarde les deux images de Python tu verras que:

En manuel ça marche et 19 bin deviens bien 13 en bcd et réciproquement 13 redeviens 19.

Or dans le programme qui fait les mêmes fonctions, le résultat n'est pas bon.

J'ai refait tout ça sur un autre ordinateur en Windows avec un Python 3.5 le résultat est bien le même.

Il y a une coquille dans ce truc que je ne vois pas.

Image
Surprise l'image s'affiche.
Ci dessus une copie des fonctions de conversions de ton programme "mcp7940.py" qui donne exactement le même résultat.
Dans bin2bcd() il faut une division en partie entière "x //10 "

Code: Select all

   
   def bin2bcd(self,x):
        return ((x % 10) + ((x / 10) <<4)) 
une autre question:
Toujours dans ton programme "mcp7940":

Code: Select all

    
   def ReadRegister(self, Addr):
        val = self.bus.read_byte_data(self.RTC_ADDR,Addr)
        print("Read 0x{:02X} : 0x{:02X} {}".format(Addr,val,val))
        return val
peut tu me commenter la ligne print.
je n'en saisi pas le sens. C'est du 'pro' !

PS. une précision, dans l'horloge l'heure n'est pas codée en bcd mais en décimal. Contrairement à ce que précise la notice.
Image
c'est aux adresses 0x00 a 0x06 comme dans le "mcp7940".

Amicalement

mandrin
Posts: 65
Joined: Tue Feb 06, 2018 4:49 pm

Re: liaison i2c

Tue Mar 20, 2018 3:48 pm

Voila j'ai trouvé la cause.

Dans ta fonction ReadRegister():

Code: Select all

    def ReadRegister(self, Addr):
        val = self.bus.read_byte_data(self.RTC_ADDR,Addr)
        print("Read 0x{:02X} : 0x{:02X} {}".format(Addr,val,val))
        return val
La ligne qui me pose problème transforme les données du registre de la DS3231 de bcd en décimale.
Mais elles sont en décimales donc le résultat de la lecture est augmenté de 10 à 16 pour les bits supérieurs du registre lu. L'année 18 est transformée en 24, la date du 20 en 32, (impossible d'avoir une date 32 dans un mois), d'où anomalie dans le programme.

Amicalement

danjperron
Posts: 3076
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: liaison i2c

Tue Mar 20, 2018 4:03 pm

Code: Select all

def ReadRegister(self, Addr):
        val = self.bus.read_byte_data(self.RTC_ADDR,Addr)
        print("Read 0x{:02X} : 0x{:02X} {}".format(Addr,val,val))
        return val
En réalité le print devrait être enlevé. C'était valide seulement pour déboguer.
La première valeur indique l'adresse en hexadécimale.
La deuxième valeur c'est le contenu du registre en hexadécimal et qui est aussi la valeur bcd.
Et la troisième valeur est la valeur normal (non BCD).

Le ReadRegister retourne la valeur en mode binaire et non en BCD.

Il faut le convertir en bcd après la fonction.

mandrin
Posts: 65
Joined: Tue Feb 06, 2018 4:49 pm

Re: liaison i2c

Thu Mar 22, 2018 1:54 pm

Bonjour,

Afin de vérifications de la puce ds3231 je voudrais passer cette instruction dans mon programme Python:

Code: Select all

os.system("i2cset -y 1 0x68 0x08 ADDR_ALM1_MIN b")
comment configurer ADDR_ALM1_MIN pour que cette donnée soit prise en charge par os.system ?

Amicalement

danjperron
Posts: 3076
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: liaison i2c

Thu Mar 22, 2018 2:44 pm

os.system("i2cset -y 1 0x68 0x08 ADDR_ALM1_MIN b")
Je ne pense pas que l'OS utilise les alarmes RTC. Donc ce n'est pas possible. Même si tu règles l'alarme l'OS ne fera rien avec.

Si tu regardes le post que je t'ai envoyé j'utilise le coté 'hardware' pour allumer le Pi en utilisant un régulateur DC/DC.

Étant donné que je n'ai aucune idée de ce que tu veux faire avec l'alarme je ne peux être plus précis.

Il y a moyen d'utiliser python pour détecter le signal d'interruption lorsque l'alarme est activée.


Je suis en train de me faire une horloge avec quatres relais sur un arduino si cela t'intéresse et c'est avec un ds3231. La deuxième partie du github ajoutera un écran OLED de waveshare et les boutons seront 'touch' (des carrés conductifs comme boutons).
https://github.com/danjperron/ArduinoTimer

P.S. dans le code arduino je n'utilise pas les alarmes intégrées puisque je veux beaucoup d'alarmes. J'utilise donc une table d'alarmes que je vérifie à chaque seconde. j'utiliserai la broche d'interruption prochainement pour détecter la nouvelle seconde.

mandrin
Posts: 65
Joined: Tue Feb 06, 2018 4:49 pm

Re: liaison i2c

Fri Mar 23, 2018 11:19 am

Bonjour,

J'ai parcouru ton programme "Arduino Timer", c'est une 'usine à gaz'.

Bravo ! Il faut beaucoup de tenacité pour attaquer une partie aussi lourde pour l'affichage.

A cette occasion, as tu vérifié les datas contenues dans le circuit intégré DS3231CN

L'heure est codé en décimales
Les alarmes et la température en BCD.

Le datasheet indique BCD partout.

Bon courage pour ton application.
Amicalement

Return to “Français”