[PYTHON] Un programme qui reçoit la commande d'asservissement du contrôleur radio, interrompt la tarte aux râpes et l'enregistre.

Code mémoire pour tarte aux râpes

filename.py


import pigpio
import time
import signal
import csv

#T
wfilename='wlogfile_1.csv'
rfilename='rlogfile_1.csv'

time_HI_STR_N=1520#Temps HAUT dans l'état neutre d'entrée côté direction[us]
time_HI_STR_MAX=2020
time_HI_STR_MIN=1020
time_HI_DRV_N=1520#Temps HIGH dans l'état neutre d'entrée côté variateur[us]
time_HI_DRV_MAX=2020
time_HI_DRV_MIN=1020
DUTY_MOT_MAX=20

frec_PWM_STR=50#Hz
frec_PWM_DRV=50#Hz
frec_logic=50#Hz

GAIN_DRV=DUTY_MOT_MAX/(time_HI_DRV_N-time_HI_DRV_MIN) #Grand temps[us]× constante = rapport cyclique
DRV_TH=1*10000 #Seuil de zone morte[%*10000]

#▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲


#T Pas de changement
#Réglage du numéro de broche
#Deux broches compatibles PWM matérielles pour la sortie ne peuvent pas être modifiées
pin_PWM_STR=12
pin_PWM_DRVF=13
pin_PWM_DRVR=19
#Peut être changé pour l'entrée
pin_IN_STR=16
pin_IN_DRV=20

#création d'instance pigpio
pi=pigpio.pi()

#output pin setup
pi.set_mode(pin_PWM_STR,pigpio.OUTPUT)
pi.set_mode(pin_PWM_DRVF,pigpio.OUTPUT)
pi.set_mode(pin_PWM_DRVR,pigpio.OUTPUT)

#input pin setup
pi.set_mode(pin_IN_STR,pigpio.INPUT)
pi.set_pull_up_down(pin_IN_STR,pigpio.PUD_DOWN)
pi.set_mode(pin_IN_DRV,pigpio.INPUT)
pi.set_pull_up_down(pin_IN_DRV,pigpio.PUD_DOWN)

HITIME_TO_OUTDUTY=frec_PWM_STR/(1000*1000)*100*10000#Grand temps[us]× constante = valeur de consigne de service[%*10^4]Quoi
#▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲ Pas de changement

#T
#Variable de calcul des droits d'entrée
time_UP_STR=[0,0]
time_DW_STR=[0,0]
time_UP_DRV=[0,0]
time_DW_DRV=[0,0]

#Variable d'enregistrement du rapport cyclique d'entrée
duty_IN_STR=0
duty_IN_DRV=0
#Variable d'enregistrement à temps élevé d'entrée
time_HI_STR=0
time_HI_DRV=0

#Gestion d'état
mod_req=0
mod_state=0
MODE_INIT=0
MODE_LOGING=1
MODE_REPLAY=2

duty_OUT_STR=0
duty_OUT_DRV=0


#▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

#▼▲▲ ▼ ▲ ▼ ▲ ▼ ▲ ▼ ▲ ▲ ▼ ▲ ▼ ▲ ▼ ▲ ▼ ▲ ▼ ▲ ▼ ▲ ▼ ▲ ▼ ▲ ▼ ▲ ▼ ▲
#Entrée PWM pour le rappel d'interruption de direction
def callback_IN(gpio,level,tick):
    #Procédure d'utilisation des variables globales
    global time_UP_STR
    global time_DW_STR
    global duty_IN_STR
    global time_HI_STR
    global time_UP_DRV
    global time_DW_DRV
    global duty_IN_DRV
    global time_HI_DRV
    
    if gpio==pin_IN_STR:#Interruption causée par la direction
        if level == 1:#Monter
            time_UP_STR[1]=time_UP_STR[0]
            time_UP_STR[0]=tick
            duty_IN_STR=(time_DW_STR[0]-time_UP_STR[1])/(time_UP_STR[0]-time_UP_STR[1])*100
            time_HI_STR=(time_DW_STR[0]-time_UP_STR[1])
        else:#Tomber
            time_DW_STR[1]=time_DW_STR[0]
            time_DW_STR[0]=tick
    else:#L'interruption n'est pas causée par la direction (causée par la conduite)
        if level == 1:#Monter
            time_UP_DRV[1]=time_UP_DRV[0]
            time_UP_DRV[0]=tick
            duty_IN_DRV=(time_DW_DRV[0]-time_UP_DRV[1])/(time_UP_DRV[0]-time_UP_DRV[1])*100
            time_HI_DRV=(time_DW_DRV[0]-time_UP_DRV[1])
        else:#Tomber
            time_DW_DRV[1]=time_DW_DRV[0]
            time_DW_DRV[0]=tick
        
    #print(time_HI_STR,time_HI_DRV,duty_IN_STR,duty_IN_DRV)
#▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲


#▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ interrompre
def logic_main(arg1, arg2):
    #Procédure d'utilisation des variables globales
    global time_HI_STR#[us]
    global time_HI_DRV#[us]
    global time_HI_STRtmp#[us]
    global time_HI_DRVtmp#[us]
    global index,index_lim
    #▼▲▲ ▼ ▲ ▼ ▲ ▼ ▲ ▼ ▼
    

    duty_OUT_STR=0
    duty_OUT_DRV=0
    
    if mod_state==MODE_REPLAY:
        if index<index_lim:
            duty_OUT_STR=int(data[index][0])
            duty_OUT_DRV=int(data[index][1])
            index=index+1
        elif index==index_lim:
            print("Fin de la lecture! Appuyez sur la touche Entrée")
            index=index+1
        else:
            duty_OUT_STR=0
            duty_OUT_DRV=0
            
    else:
        #Montant de l'opération de direction
        duty_OUT_STR=int(max(min(time_HI_STRtmp*HITIME_TO_OUTDUTY,100*10000),0))#Limites de limite supérieure et inférieure et conversion
        #Montant du lecteur
        duty_OUT_DRV=int(max(min((time_HI_DRVtmp-time_HI_DRV_N)*GAIN_DRV,DUTY_MOT_MAX),-DUTY_MOT_MAX)*10000)
    
    #production
    pi.hardware_PWM(pin_PWM_STR,frec_PWM_STR,duty_OUT_STR)
    if duty_OUT_DRV>DRV_TH:#Rotation avant
        pi.hardware_PWM(pin_PWM_DRVF,frec_PWM_DRV,duty_OUT_DRV)
        pi.write(pin_PWM_DRVR,0)
        #print(duty_OUT_STR,duty_OUT_DRV,"F")
    elif duty_OUT_DRV<-DRV_TH:#Renversement
        pi.write(pin_PWM_DRVF,0)
        pi.hardware_PWM(pin_PWM_DRVR,frec_PWM_DRV,-duty_OUT_DRV)
        #print(duty_OUT_STR,duty_OUT_DRV,"R")
    else:#Arrêtez
        pi.write(pin_PWM_DRVF,0)
        pi.write(pin_PWM_DRVR,0)
        #print(duty_OUT_STR,duty_OUT_DRV)
    
    if mod_state==MODE_LOGING:
        w.writerow([duty_OUT_STR,duty_OUT_DRV])
    
    #▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
#▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲ interrompre
    
    
#▼▲▲ ▼ ▲ ▼ ▲ ▼ ▲ ▼ ▲ ▲ ▼ ▲ ▼ ▲ ▼ ▲ ▼ ▲ ▼ ▲ ▼ ▲ ▼ ▲ ▼ ▲ ▼ ▲ ▼ ▲
pi.callback(pin_IN_STR,pigpio.EITHER_EDGE,callback_IN)#Côté direction
pi.callback(pin_IN_DRV,pigpio.EITHER_EDGE,callback_IN)#Côté entraînement
signal.signal(signal.SIGALRM,logic_main)#Exécution et réglage de la logique principale (interruption de la minuterie) lorsqu'un signal arrive
signal.setitimer(signal.ITIMER_REAL,0.1,0.02)#Interruption de la minuterie avec signal 50Hz
#▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲


#T

time_HI_STRtmp=5000
time_HI_DRVtmp=5000

while 1:
    print('1:Journalisation 2:Lecture 3:Fin')
    try:
        tmp_req=input('> ')
    except KeyboardInterrupt:
        print("stop!")
        break
    
    try:
        mod_req=int(tmp_req)
    except:
        print("miss")
        break
#début
    if mod_req==MODE_LOGING:
        file=open(wfilename,'w')
        w=csv.writer(file)
        mod_state=MODE_LOGING
        print("Enregistrement...")
        print("Appuyez sur la touche Entrée pour arrêter")

    elif mod_req==MODE_REPLAY:
        file=open(rfilename,'r')
        r=csv.reader(file)
        data=[row for row in r]
        index=0
        index_lim=len(data)
        mod_state=MODE_REPLAY
        print("En jouant...")
    else:
        print("END!")
        break
    

#Fin
    try:
        input('> ')
    except KeyboardInterrupt:
        print("stop!")
        break
   
    if mod_req==MODE_LOGING:
        mod_state=MODE_INIT
        mod_req=MODE_INIT
        file.close()
    elif mod_req==MODE_REPLAY:
        mod_state=MODE_INIT
        mod_req=MODE_INIT
        file.close()
    else:
        print("END!")
        break
    
time.sleep(0.1)
#▼▲▲ ▼ ▲ ▼ ▲ ▼ ▲ ▼ ▲ ▲ ▼ ▲ ▼ ▲ ▼ ▲ ▼ ▲ ▼ ▲ ▼ ▲ ▼ ▲ ▼ ▲ ▼ ▲ ▼ ▲
pi.set_mode(pin_PWM_STR,pigpio.INPUT)
pi.set_mode(pin_PWM_DRVF,pigpio.INPUT)
pi.set_mode(pin_PWM_DRVR,pigpio.INPUT)
pi.stop()
signal.setitimer(signal.ITIMER_REAL,0)
#▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲



Recommended Posts

Un programme qui reçoit la commande d'asservissement du contrôleur radio, interrompt la tarte aux râpes et l'enregistre.
Fabriquez un thermomètre avec Raspberry Pi et rendez-le visible sur le navigateur Partie 3
[Python] Un programme qui calcule le nombre de mises à jour des enregistrements les plus élevés et les plus faibles
Comment faire un Raspberry Pi qui parle les tweets d'un utilisateur spécifié
[Python] Un programme qui compte le nombre de vallées
J'ai créé un système avec Raspberry Pi qui mesure périodiquement l'indice d'inconfort de la pièce et envoie une notification LINE s'il s'agit d'une valeur dangereuse
Une histoire sur l'obtention du champ Atom (télégramme XML) de l'Agence météorologique avec une tarte à la râpe et de le tweeter
[Python] Un programme qui compare les positions des kangourous.
Créez facilement un TweetBot qui vous informe de la température et de l'humidité avec Raspberry Pi + DHT11.
[Python] Un programme pour trouver le nombre de pommes et d'oranges qui peuvent être récoltées
Production de système de contrôle de température avec tarte aux framboises et ESP32 (1)
Créez une partition, puis installez le système d'exploitation Raspberry Pi
Un programme qui appuie et relâche simplement la touche Échap
Enfin ... Créez un contrôleur radio en utilisant python sur Raspberry Pi 3! (Lorsque l'aimant est rapproché, le moteur se déplace et s'arrête automatiquement)
Contrôlez le moteur avec un pilote de moteur en utilisant python sur Raspberry Pi 3!
Créez un thermomètre avec Raspberry Pi et rendez-le visible sur le navigateur Partie 4
Ecrire un programme qui abuse du programme et envoie 100 e-mails
Un programme qui répond à quelques questions et prédit la prochaine réponse
[Python] Un programme qui fait pivoter le contenu de la liste vers la gauche
Commande de servomoteur avec Raspberry Pi
[Python / Jupyter] Traduisez le commentaire du programme copié dans le presse-papiers et insérez-le dans une nouvelle cellule.
Enfin ... Créez un contrôleur radio en utilisant python sur Raspberry Pi 3! (Le moteur se déplace lorsque le bouton est enfoncé)
Lisez les données du lecteur NFC connecté à Raspberry Pi 3 avec Python et envoyez-les à openFrameworks avec OSC
L'histoire de l'exportation d'un programme
Mettez à jour les données en les téléchargeant sur s3 d'aws avec une commande, et supprimez les données utilisées (en chemin)
[Python] Un programme qui calcule le nombre de segments de chocolat qui remplissent les conditions
[Python] Un programme qui calcule le nombre de chaussettes jumelées
Un programme python qui redimensionne une vidéo et la transforme en image
Production d'un système de contrôle de température avec tarte aux framboises et ESP32 (2) Production d'un appareil de transmission
Enfin ... Créez un contrôleur radio en utilisant python sur Raspberry Pi 3! (Le moteur se déplace tandis que l'aimant est rapproché)
Un simple serveur simulé qui incorpore simplement l'en-tête de la requête HTTP dans le corps de la réponse et le renvoie.
Expliquez doucement le processus de création d'une simple caméra de surveillance sans serveur à l'aide de Raspeye, de l'API Gmail et de l'API Line
Créez une application simple qui intègre l'API Fetch pour les requêtes Ajax dans Flask et expliquez-la rapidement.
Ceci et celui de la notation d'inclusion.
[Raspberry Pi] Ajouter un thermomètre et un hygromètre
Notez l'achèvement d'une commande chronophage
[Python] Un programme qui arrondit le score
Supprimer les fichiers qui ont passé un certain temps avec Raspberry PI
Transformez un programme Python en démon et exécutez-le automatiquement au démarrage du système d'exploitation
Connectez-vous à la console Raspberry PI et affichez les informations IP et SD locales
J'ai tweeté l'éclairement de la pièce avec Raspberry Pi, Arduino et un capteur optique
L'histoire de la fabrication d'une boîte qui interconnecte la mémoire AL de Pepper et MQTT
Publier et utiliser un programme qui collecte automatiquement les images du visage de personnes spécifiées
Création d'un système de contrôle de température avec tarte aux framboises et ESP32 (3) Réception d'un fichier Python
[Python] Un programme qui trouve les valeurs minimales et maximales sans utiliser de méthodes
Utilisez python sur Raspberry Pi 3 pour éclairer la LED quand il fait noir!
Une histoire à laquelle j'ai pensé en essayant d'identifier les informations de plénitude du parking en utilisant l'image obtenue par la caméra Web et Razpai et le deep learning.