Advertisement
Guest User

Untitled

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