Advertisement
Guest User

Untitled

a guest
Dec 30th, 2018
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.42 KB | None | 0 0
  1. from influxdb import InfluxDBClient
  2. import time
  3. import Adafruit_ADS1x15
  4. import RPi.GPIO as GPIO
  5. import random
  6. import json
  7. import datetime
  8. import wiringpi
  9.  
  10.     #ustawienia bazy danych
  11. client = InfluxDBClient(host='localhost', port=8086)
  12. client = InfluxDBClient(host='localhost', port=8086, username='myuser', password='mypass', ssl=False, verify_ssl=False)
  13. client.create_database('grafana')
  14. client.switch_database('grafana')
  15.  
  16.  
  17.     #ustawienia PWM
  18. wiringpi.wiringPiSetupGpio()
  19. wiringpi.pinMode(18, wiringpi.GPIO.PWM_OUTPUT)
  20. wiringpi.pwmSetMode(wiringpi.GPIO.PWM_MODE_MS)
  21.  
  22. wiringpi.pwmSetClock(192)
  23. wiringpi.pwmSetRange(2000)
  24. delay_period = 0.01
  25.  
  26.  
  27.  
  28.     # ustawienia ADC
  29. adc = Adafruit_ADS1x15.ADS1015()
  30. GAIN = 1
  31.  
  32. adc.start_adc_comparator(0,  # Channel number
  33.                          20000, 5000,  # High threshold value, low threshold value
  34.                          active_low=True, traditional=True, latching=False,
  35.                          num_readings=1, gain=GAIN)
  36.    
  37.    
  38.     #InfluxDB
  39.  
  40.    
  41.    
  42.     #pomiar odleglosci kuli
  43. def get_adc_value():
  44.    
  45.     adc_value = adc.get_last_result()
  46.     print('Channel 0: {0}'.format(adc_value))
  47.     return adc_value
  48.    
  49.    
  50.  
  51.     #sterowanie serwem
  52. def servo(serwo_value):
  53.     if serwo_value > 208:
  54.         serwo_value = 208
  55.     if serwo_value < 98:
  56.         serwo_value = 98
  57.    
  58.     wiringpi.pwmWrite(18, serwo_value)
  59.     #print('Serwo value: {0}'.format(serwo_value))
  60.    
  61.  
  62.     #regulator PID
  63. class PID:
  64.     """
  65.     Discrete PID control
  66.     """
  67.        
  68.     def __init__(self, P=2.0, I=0.0, D=1.0, derivator=0, integrator=0, integrator_max=300, integrator_min=-300):
  69.            
  70.         self.Kp = P
  71.         self.Ki = I
  72.         self.Kd = D
  73.         self.derivator = derivator
  74.         self.integrator = integrator
  75.         self.integrator_max = integrator_max
  76.         self.integrator_min = integrator_min
  77.            
  78.         self.set_point = 0.0
  79.         self.error = 0.0
  80.        
  81.     def update(self, current_value):   
  82.         """
  83.         Caldulate PID output value for given reference input and feedback
  84.         """
  85.            
  86.         self.error = self.set_point - current_value
  87.            
  88.         self.P_value = self.Kp * self.error
  89.         self.D_value = self.Kd * (self.error - self.derivator)
  90.         self.derivator = self.error
  91.            
  92.         self.integrator = self.integrator + self.error
  93.            
  94.         if self.integrator > self.integrator_max:
  95.             self.integrator = self.integrator_max
  96.         elif self.integrator < self.integrator_min:
  97.             self.integrator = self.integrator_min
  98.                
  99.         self.I_value = self.integrator * self.Ki
  100.            
  101.         pid_value = self.P_value + self.I_value + self.D_value
  102.        
  103.        
  104.         return pid_value
  105.        
  106.     def setPoint(self, set_point):
  107.         """
  108.         Initialize the setpoint od PID
  109.         """
  110.            
  111.         self.set_point = set_point
  112.         self.integrator = 0
  113.         self.derivator = 0
  114.            
  115.     def setIntegrator(self, integrator):
  116.         self.integrator = integrator
  117.            
  118.     def setKp(self, P):
  119.         self.Kp = P
  120.            
  121.     def setKi(self, I):
  122.         self.Ki = I
  123.            
  124.     def setKi(self, D):
  125.         self.Kd = D
  126.            
  127.     def getPoint(self):
  128.         return self.set_point
  129.        
  130.     def getError(self):
  131.         error_value = self.error
  132.         return error_value
  133.        
  134.     def getIntegrator(self):
  135.         return self.integrator
  136.            
  137.     def getDerivator(self):
  138.         return self.derivator
  139.    
  140.    
  141.     #InfluxDB send JSON
  142. def grafana():
  143.    
  144.  
  145.     json_body = [
  146.         {
  147.             "measurement": "odleglosc",
  148.             "time": datetime.datetime.now(),
  149.             "fields": {
  150.                 "value": adc_value
  151.             }
  152.  
  153.         },
  154.         {
  155.             "measurement": "wartosc_zadama",
  156.             "time": datetime.datetime.now(),
  157.             "fields": {
  158.                 "value": distance
  159.             }
  160.         },
  161.         {
  162.             "measurement": "pid",
  163.             "time": datetime.datetime.now(),
  164.             "fields": {
  165.                 "value": int(round(pid_value,0))
  166.             }
  167.         },
  168.         {
  169.             "measurement": "P",
  170.             "time": datetime.datetime.now(),
  171.             "fields": {
  172.                 "value": p_value
  173.             }
  174.         },
  175.         {
  176.             "measurement": "I",
  177.             "time": datetime.datetime.now(),
  178.             "fields": {
  179.                 "value": i_value
  180.             }
  181.         },
  182.         {
  183.             "measurement": "D",
  184.             "time": datetime.datetime.now(),
  185.             "fields": {
  186.                 "value": d_value
  187.             }
  188.         },
  189.         {
  190.             "measurement": "PID",
  191.             "time": datetime.datetime.now(),
  192.             "fields": {
  193.                 "value": pid_value
  194.             }
  195.         }]
  196.  
  197.     client.write_points(json_body)     
  198.        
  199.        
  200.        
  201.        
  202.     #petla glowna
  203. distance=600            # 600
  204. p_value=1.0             # 1.0
  205. i_value=0.11            # 0.11
  206. d_value=2.5             # 2.5
  207. p = PID(p_value,i_value,d_value) #nastawy PID
  208. p.setPoint(distance)     #zadana odleglosc od czujnika
  209.    
  210.    
  211. while True:
  212.    
  213.     for x in xrange(1,3):
  214.        
  215.         reszta = x % 2
  216.         adc_value = get_adc_value()
  217.         pid_value = p.update(adc_value)
  218.         servo(int(round(pid_value,0)))
  219.         if reszta == 1:
  220.             grafana()
  221.         time.sleep(0.17)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement