Blame view

software/pwm_handler/upython/pwm_handler.py 3.14 KB
14b996da3   benny   First commit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
  # -*- coding: utf-8 -*-
  
  """
  author  Benoit Dubois
  licence GPL v3+
  brief   Main file of PWM controller (VNH5019 device).
  """
  import pyb
  import ujson
  import serial_com as sc
  import vnh5019
  
  # Avoid use of timer 2, 3, 5 and 6
  # see http://docs.micropython.org/en/latest/pyboard/library/pyb.Timer.html
  TIMER_PWM_ID = 4
  
  TIMER_PWM_FREQ = 1000
  
  TIMER_PWM1_CH = 1
  TIMER_PWM2_CH = 2
  
  PIN_INA1 = 'PD5'
  PIN_INB1 = 'PD6'
  PIN_INA2 = 'PD1'
  PIN_INB2 = 'PD2'
  PIN_PWM1 = 'PB6'
  PIN_PWM2 = 'PB7'
  
  
  #----------------------------------------------------------
  class MySerialCom(sc.SerialCom):
  
      MNEMO_LIST = ["value"]
  
      def decode_message(self, msg):
          """Message can be of type request or command.
          Request message are made of a mnemonique followed by '?'.
          Command message are made of 2 parts:
          - a mnemonique,
          - the value to be applied.
          Each parts are separated with a space.
          """
          if msg[:-1] == '?': # Request
              return
          else:
              cmd = msg.split()
              if len(cmd) != 3:
                  print("Decode error: bad command format")
                  return
              mnemo = str(cmd[0])
              if mnemo not in self.MNEMO_LIST:
                  print("Decode error: bad mnemonique")
                  return
              num = int(cmd[1])
              if num != 0 and num != 1:
                  print("Decode error: bad controller number")
                  return
              try:
                  val = int(cmd[2])
              except ValueError:
                  print("Decode error: bad command value")
                  return
              return (mnemo, num, val)
  
  
  #----------------------------------------------------------
  class PwmHandler(object):
  
      def __init__(self, config_filename):
          self.scom = MySerialCom()
          vnh0 = vnh5019.Vnh5019(in_a=PIN_INA1, in_b=PIN_INB1, pwm=PIN_PWM1,
                                 timer=TIMER_PWM_ID, freq=TIMER_PWM_FREQ,
                                 ch=TIMER_PWM1_CH)
          vnh1 = vnh5019.Vnh5019(in_a=PIN_INA2, in_b=PIN_INB2, pwm=PIN_PWM2,
                                 timer=TIMER_PWM_ID, freq=TIMER_PWM_FREQ,
                                 ch=TIMER_PWM2_CH)
          self.pwm = [vnh0, vnh1]
          with open(config_filename, 'r') as f:
              config = ujson.loads(f.read())
          self.pwm[0].set_pwm_percent(config['val0'])
          self.pwm[1].set_pwm_percent(config['val1'])
  
      def apply_cmd(self, cmd):
          if len(cmd) == 1: # Request
              pass
          else:
              if cmd[0] == "value":
                  self.pwm[cmd[1]].set_pwm_percent(cmd[2])
  
      def run(self):
          while True:
              self.scom.poller.poll(250)
              if self.scom.vcom.any():
                  msg = self.scom.read_message()
                  if msg is not None:
                      cmd = self.scom.decode_message(msg)
                      if cmd is not None:
                          #print("pwm_handler.run.cmd:", cmd)
                          self.apply_cmd(cmd)
                          self.scom.write_message(msg)
  
  
  #----------------------------------------------------------
  if __name__=='__main__':
      my_pwm = PwmHandler(config_filename='config.json')
      my_pwm.run()