PID Çizgi izleyen

Başlatan LukeSkywalker, 13 Ocak 2011, 16:24:31

shark27

hocam zaten rakip olduğumuza inanıyosan boşver bişey demedim

ii çalışmalar

LukeSkywalker

#16
Yani ;) Gaziantepte  falan filan yazmışın 3. robot yarışmasının konusunda da o yüzden sorayım dedim.

shark27

hocam onu mezun olduğum okulda hocam yazmıştı bende onun niki ile girdim ...

vastar

çizgi takip ettiren arkadaşlar için bir video ekliyeyim gayet güzel bir robot. 3 yıl önce mi ne izlemiştim videoyu. Alışılageldik robot mekaniğinden farklı bir mekanik tasarımı var bence gayet başarılı.


bbs2006

merhaba
bende pıd kontroluyla cizgi izleyen robot yapmak istiyorum.acaba referans degerle gerçek deger arasında ki abgınıtyı ccs c kullanarak nasıl yazabilirim.ben 8 adet sensör kullanmayı düşünüyorum. yardımcı olursanız sevinirim.

LukeSkywalker

Dostum PID kontrol orada devreye giriyor işte..
Hata değerini hesaplayacaksın ilk başta...

http://en.wikipedia.org/wiki/PID_controller

Yukarıdaki sayfanın altkısmındaörnek kod var..

shark27

maytere hocam hata değerini buluyorum lcd de ekranda yazdırıyorum örneğin referans değerine geldiğinde iki motorada 255 255 değerlerini gönderiyor çizgi sola ve saga kayınca değerler değişiyor diyelimki en sol sensör gördü değer 150 oluyor ama çizginin üstüne koyduğumda saçmalıyor

LukeSkywalker

kodunu gönder bakalım..

shark27

yarın göndericem özel iletinize ii akşamlar

mavikaplan

Çok başarılı olmuş elinize sağlık..

feyzi

#25
Basic kodlarıyla , PID tekniği kullanılarak yazılmış, çizgi izleyen robot programı.Pic ile yapmak için, bazı değerleri ayarlanabilir...

$regfile = "attiny44.dat"
$crystal = 8000000
$framesize = 32
$hwstack = 64
$swstack = 48



Waitms 100

Dim Diff As Long                                            'Difference between target position and measured position
Dim Difflast As Long                                        'Previous Difference value
Dim Prop As Single                                          'Proportional Value
Dim Integral As Single                                      'Integral Value
Dim Deriv As Single                                         'Derivative Value
Dim Rate As Single                                          'Rate calculation used for Derivative
Dim Control As Single                                       'Calculated value used to control steering
Dim Mpos As Long                                            'Measured Position
Dim Sensors As Byte                                         'Byte used to hold sensor values
Dim I As Long , X As Long , Temp As Single , Mystr As String * 16
Dim Tlong As Long , Myint As Integer

'Aliases
Speed Alias Pwm1a
Motor Alias Porta.7
Steeringfront Alias Servo(2)
Steeringrear Alias Servo(1)


'PID Constants
Const Kp = 4.5                                              'Gain factor for proportional
Const Kd = .4                                               'Gain factor for derivitive
Const Ki = .1                                               'Gain Factor for Integral

Const Interval = .01                                        'Not used
Const Tpos = 0                                              'Target position of sensors
Const Upperlimit = 30                                       'Maximum control value
Const Lowerlimit = -30                                      'Minimum control value


'Other Constants                                           '
Const Scenterf = 101
Const Scenterr = 105

Const Fast = 650
Const Medium = 640
Const Slow = 600
Const Nogo = 512

'Configuration Statements
Config Timer1 = Pwm , Prescale = 1 , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Disconnect
Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 8

'Config Ports
Config Porta = Input
Config Porta.6 = Output
Config Porta.7 = Output
Config Portb = Output

'Turn on Internal Pullups
Porta = &B00011111

'Turn off Motor
Set Motor
Speed = Nogo


'Enable everything
Enable Timer1
Enable Interrupts

Steeringfront = Scenterf
Steeringrear = Scenterr

Wait 2

Difflast = 0
Reset Motor
Speed = Medium

Do
      Sensors = Not Pina
      Sensors = Sensors And &B00011111

      Select Case Sensors

         Case &B00001                                       'Right most sensor
         Mpos = 4
         'Speed = Slow

         Case &B00011                                       'Right Sensors
         Mpos = 3

         Case &B00010                                       'Right Mid sensor
         Mpos = 2

         Case &B00111                                       'Center Right
         Mpos = 1

         Case &B00110                                       'Center Right
         Mpos = 1

         Case &B00100                                       'Centered on the line
         Mpos = 0

         Case &B01100                                       'Center Left
         Mpos = -1

         Case &B11100                                       'Center Left
         Mpos = -1

         Case &B01000                                       ' Left Mid Sensor
         Mpos = -2

         Case &B11000                                       ' Left sensors
         Mpos = -3

         Case &B10000                                       'Left most sensor
         Mpos = -4

         Case &B00000                                       'lost line
         If Mpos < 0 Then Mpos = -5 Else Mpos = 5

      End Select

   Diff = Tpos - Mpos
   Prop = Diff * Kp                                         'Calculate Proportional

   Integral = Integral + Diff                               'Calculate Integral
   Integral = Integral * Ki

   Rate = Diff - Difflast                                   'Calculate Differential
   Deriv = Rate * Kd

   Difflast = Diff

   Control = Prop + Deriv                                   'New control value
   Control = Control + Integral


   If Control > Upperlimit Then Control = Upperlimit        'Keep within safe range
   If Control < Lowerlimit Then Control = Lowerlimit

   Temp = Scenterf - Control
   Myint = Temp                                             'Convert Single to Integer
   Steeringfront = Myint
   Temp = Scenterr + Control
   Myint = Temp
   Steeringrear = Myint                                     'Convert Single to Integer

   Waitms 5                                                 'wait 5ms between loops (200 times a second)

Loop

End
"insanların hayırlısı ,onlara faydalı olandır."  (H.Ş.)

cntrller

#26
previous_error = setpoint - actual_position
integral = 0
start:
  error = setpoint - actual_position
  integral = integral + (error*dt)
  derivative = (error - previous_error)/dt
  output = (Kp*error) + (Ki*integral) + (Kd*derivative)
  previous_error = error
  wait(dt)
  goto start


buradaki integraldeki ve türevdeki dt'ler ne işe yarıyor açıklayabilecek varmı arkadaşlar
yani onlar olmasa ne gibi bi sıkıntı olur

ve bir de çıkan sonucu iki tekerleğe pwm olarak nasıl dağıtabiliriz kafam artık çalışmaz oldu bu pid de

LukeSkywalker

Ben dt'yi kullanmamıştım. Zaten Kp, Ki, ve Kd ile gerekli çarpım işlemleri gerçekleştirildiği için ayrıyeten başka bir işleme gerek kalmamıştı. Sabitlerin içerisine katmıştım o değerleri de. sondaki beklemeyi (wait(dt)) yapmanız da robotunuza vakit kaybettirecektir.

ozgurelkt

anladığıma göre    sensör olarak qtr-8a kullanmışsınız analog bilgileri bir çevirme işlemine tabi tutuyor muyuz.. örnekleme yani sensörden okunan bilgileri alma zamanı için timer mi kuracağız.ben işin başındayım da :))

LukeSkywalker

Alıntı yapılan: ozgurelkt - 19 Eylül 2011, 00:02:17
anladığıma göre    sensör olarak qtr-8a kullanmışsınız analog bilgileri bir çevirme işlemine tabi tutuyor muyuz.. örnekleme yani sensörden okunan bilgileri alma zamanı için timer mi kuracağız.ben işin başındayım da :))
Analog dijital konvertreri direk kurup 8 kanaldan okuyorum. Ne kadar hızlı bir çevrim kurarsanız o kadar iyi.