Electromag1 Circuits électroniques et Picaxes

Petit site pour ceux qui bricolent en électronique en général et sur les PICAXES en particulier.
Les PICAXES sont des microprocesseurs (PIC de Microship) programmables en BASIC. Pleins de qualités, pas chers, ultra faciles à programmer.
Tout (ou presque) est sur le site du distributeur Gotronic (voir les liens).
Les pages  seront ajoutées ou modifiées petit à petit.
Dans le but d'améliorer ce blog, communiquez moi vos remarques et les erreurs que vous pouvez constater.
Pour me contacter: Envoyez un mail à l'adresse : mag1mic@free.fr .  Tout message reçoit une réponse
Pour retourner au menu, Cliquer sur "LISTE DES PAGES", ici ou en haut de la colonne de gauche
Pour laisser un message, allez dans le "LIVRE D'OR"
Bonne visite
 
 

Le GPS de Mazda Rx8


Sur Futura Sciences, le forumeur Ghashog Delta cherchait une solution pour commander son GPS escamotable.
L'intégratité de cette discussion assez longue est ICI
Le cahier des charges est le suivant:
Il y a deux poussoirs de commande, un pour ouvrir et fermer le volet, un second pour régler le tilt (inclinaison) du volet.
Le système doit garder en mémoire la dernière position du volet, s'ouvrir à cette position à la mise du contact et  se fermer automatiquement à la fermeture du contact.
La position du volet est mesurée par un potentiomètre.
On ajoute un arret du fonctionnement en cas de blocage du volet.

Le shéma proposé se compose essentiellement d'un picaxe 14M2 et d'un driver L293 pour le moteur:

Remarques:
Les quatre amplis du L293D sont en parallèle deux à deux
La broche B.0 est utilisée pour la programmation et le reset du L293D
Il devrait y avoir une résistance de pulldown sur l'entrée C.3 (alimentation contact). Mais si le contact est ouvert, tous les équipements non alimentés relient cette entrée au 0v, sans risque de tension aléatoire.
Le second schéma proposé est dans le lien de la discussion originale.

Le code correspondant à ce schéma:

;mazda MM 14/12/2017
#picaxe 14M2
symbol tilt=pinC.0        ;poussoir tilt
symbol onoff=pinC.1        ;poussoir on/off
symbol contact=pinC.3    ;entrée contact
symbol protect=B.1        ;entrée courant lu
symbol potar=C.4            ;entrée ADC capteur
symbol leve=B.2            ;sortie moteur lever
symbol baisse=B.5            ;sortie moteur baisser
symbol flag=bit0            ;flag enregistrement on/off
symbol pos=b1                ;position sélectionnée,0=entré , 1=pos1, 2=pos2, 3=pos3
symbol memopos=b2            ;mémo position pour onoff
symbol autopos=b3            ;position actuelle
symbol courmax=b4            ;seuil courant max
symbol courant=b5            ;valeur lue
symbol posact=w13            ;valeur actuelle capteur
symbol posoff=w12            ;valeur capteur rentré
symbol pos1=w11
symbol pos2=w10
symbol pos3=w9
symbol posfin=w8        ;valeur recherchée

posoff=20    ;pos rentré valeur ADC pour essais
pos1=400        ;pos1        (valeurs réelles)
pos2=500        ;pos2        (à recalculer)
pos3=600        ;pos3
courmax= 50     ;(1v -> 255/5)
memopos=1
autopos=0
    dirsB=%11111101        ;portsB en sorties sauf B.1
    low leve :low baisse    ;confirmation arrêt moteur
    do                         ;en sommeil env 140µA
        sleep 2                ;réveil toutes le env 4,5 s
    loop while contact=0    ;tant que contact off
    setfreq M16                ;fréquence à 16MHz
    pullup %11100000000    ;pullup sur C.0 à C.2
    read 0,pos                ;lecture position mémorisée
    if pos <>0 then     gosub mouv    ;si pos non rentrée, on bouge
    setint or %00, %11    ;interruption sur onpff et tilt (C.0 ou C.1)
;****** boucle principale ************
    do             
        if pos<>autopos then gosub mouv    ;suite interupt, si nouvelle pos différente, on bouge
        if flag=1 then gosub M_A            ;demande OFF par interrupt    
        if contact=0 then     gosub repos    ;détection coupure contact
    loop
; ********************************************
M_A:                    ;sub poussoir onoff
    if pos=0 then     ;il est rentré,on le sort
        pos=memopos        
    else                ;il est sorti        
        memopos=pos
        pos=0            ;on le rentre
    endif        
    gosub mouv:        ;activation moteur
    flag=0            ;raz flag
    return

repos:                ;arret sur coupure contact    
    pause 5000        ;délai 1,25 s
    if contact=1 then        ;confirmation (test inutile?)
        return                ;non confirmé
    endif
    write 0,pos        ;mémo position    
    pos=0              ;position rentré
    readadc10 potar,posact                ;si non rentré
    if posact > posoff then gosub mouv    ;on le rentre    
    reset                      ;réinitialisation -> sleep

mouv:            ;sub mouvement
    lookup pos,(posoff,pos1,pos2,pos3),posfin    ;valeur capteur ft position
    if posact>posfin then                ; on est au dessus,
         high    baisse                  ;on baisse
        do
            readadc protect, courant
            if courant>courmax then blocage
            readadc10 potar,posact        ;valeurs de 0 à 1023                                
        loop while posact > posfin        ;jusqu'à position finale
        low baisse                        ;arrêt moteur
        goto fin                          ;on sort
    elseif posact < posfin then        ;on est en dessous, on lève
        high leve
        do
            readadc protect, courant
            if courant>courmax then blocage
            readadc10 potar,posact                
        loop while posact < posfin
            low leve
    else                                 ;autres cas,
            low leve : low baisse        ; tout arrêt (on sait jamais...)
    endif
fin:    
        autopos=pos        ;mémorisation nouvelle position
        return

blocage:
    low baisse: low leve
    pos=0
    write 0,pos
    reset

interrupt:                ;sub interruption sur C.O ou C.1
    if tilt=0 and pos<>0 then        ;action sur tilt
        inc pos            ;incrémentation position
        if pos>=4 then    ;boucle sur 3 positions
             pos=1
        endif
    endif
    if onoff=0 then    ;action sur onoff
         flag=1        ;marque passage
    endif
    do loop while tilt=0 or onoff=0    ;attente fin de condition interruption
    setint or %00, %11        ;réarmement interruption
    return


Le résultat.... avec les commentaires de
Ghashog Delta (merci à lui)

 



Créer un site
Créer un site