Edit.
Edit.
Ellerinize sağlık hocam, gayet başarılı bi çalışma olmuş.
Algoritmayı nasıl yaptınız. Biraz bilgi vermeniz mümkün mü?
Sensörler analog olarak okundu. Orta noktada alınan değer referans alındı. Gerisi bildiğimiz PID algoritması;
http://en.wikipedia.org/wiki/PID_controller
en altta kod şeklinde var.
hocam ellerinize sağlık güzel olmuş kod konusunda biraz yardımcı olurmusunuz? nasıl bi yöntem lazım.PId kontrolü bayağı karışık gibi gözüküyor yol gösterirseniz sevinirim
İi çalışmalar
hocam acaba devre şemasını verebilrmisiniz kodları ben yazmaya çalışacağım teşekkür ederim ii çalışmalar
@shark27
Devre şemasını sana kısaca şöyle özetleyeyim. 8 kanal ADC kullanılarak sensörler okunuyor, l293D ile motorlar sürülüyor. Bu kadar basit.
Alıntı yapılan: maytere - 17 Ocak 2011, 14:03:41
Orta noktada alınan değer referans alındı.
derken sadece ortadaki sensörün referans alındığınımı belirttiniz. Yoksa sensörlerden gelen bilgilerin ortadaki değeri mi(median)?
Kaç adet sensör kullanıldı ?
Teşekkürler. Elinize sağlık.
maytere hocam teşşekürler l293 yerinde 298 kullansam olur değilmi?
hocam bişey daha soracağım elinizdeki sensör kitinin bende dijital çıkışlısı qtr-8rc var
katolguna baktğımıda
1. Turn on IR LEDs (optional)
2. Set the I/O line to an output and drive it high
3. Allow at least 10 us for the 10 nF capacitor to charge
4. Make the I/O line an input (high impedance)
5. Measure the time for the capacitor to discharge by waiting for the I/O line to go low
6. Turn off IR LEDs (optional)
şeklinde ölme yapılacağı söyleniyor.
5.maddede kafam karıştı kondansatörün deşrj zamanını ölç diyor nasıl bi kod yazabilirim oraya?
Timer kuaracaksın. Fakat o sensör ile yüksek hızlara ulaşman mümkün değil. Çünkü her sensörden gelen veriyi okuman uzun süre alacaktır. Bu yüzden yüksek hızlarda robotu çizgi üzerinde tutman zor olacaktır. QTR-8A kullanmanızı tavsiye ederim. Veya kendiniz qrd1114/CNY70 kullanarak bir sensör kartı tasarlayabilirsiniz. Ben qtr8A öneririm. QRD114 ise QTR-8A da kullanılan sensörlerin DIP versiyonu.
hocam teşekkür ederim
ilk önce şunu belirtmek isterim emeğe karşı sonsuz saygım var....
biliyorum bişeyleri yapmak kolay iş değil....
üniversitedebu proje benim dönem tezim ve son 1 haftam var...
Teslim etmem lazım yoksa dönem uzayacak
sizin programınızı bir sitede forum sayfasında buldum burdan nerde bulduğumu sölemek istemiyorum emeğinize saygısızlık olmasın diye...
Eğer müsade ederseniz programınızı kullanbilirmiyim??
teşekkür ederim ii çalışmalar
Tabiki kullanabilirsin. Fakat şunu söylemeliyim ki her kod her robotta çalışır diye bir şey yok. Ben kendi tasarımıma göre bir kod yazdım. Ama mantığını kullanabilirsiniz tabiki. Yoksa yüklemezdim sağa sola ;) Onları da bir sileyim bari.. Yarışmalardan sonra paylaşırım burada.
maytere hocam ya şu tasarımını bana bi anlatsana gözünü seveyim kurtar beni şu dertten :D
Alıntı yapılan: shark27 - 24 Ocak 2011, 16:54:48
maytere hocam ya şu tasarımını bana bi anlatsana gözünü seveyim kurtar beni şu dertten :D
Dostum sen hangi lisedesin?
hocam zaten rakip olduğumuza inanıyosan boşver bişey demedim
ii çalışmalar
Yani ;) Gaziantepte falan filan yazmışın 3. robot yarışmasının konusunda da o yüzden sorayım dedim.
hocam onu mezun olduğum okulda hocam yazmıştı bende onun niki ile girdim ...
ç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ı.
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.
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..
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
kodunu gönder bakalım..
yarın göndericem özel iletinize ii akşamlar
Çok başarılı olmuş elinize sağlık..
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
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
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.
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 :))
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.
cevap verdiğiniz için teşekkürler. Analog çıkışı neden dijatele çeviriyoruz. QTR-8RC kullansak hız mı yeterli olmuyor. analog dijatele çeviriken ne kullanacağız. 7414 mü.
Sensörlerin çizgiye sağdan veya soldan yaklaşımına bağlı olarak çıkışlarındaki analog bilgi değişiyor. Çizgiye yaklaştıkça voltaj düşüyor mesela. Bu şekilde konumu daha hassas algılayabiliyoruz. Dijital sensörü denemedim fakat kondansatörün deşarj süresine bağlı olarak ondanda hassas konum bilgisi alınabiliyor yanlış hatırlamıyorsam. Fakat daha yavaş olacağı kanaatindeyim. analog dijital çevirici için ise mikrodenetleyicinin dahili ADC modülünü kullanabilirsiniz.
qtr-8a ile yaptığım devrede sensörlerden gelen bilgilerin ortalaması olan 3500 değerini referans olarak aldım.
yer=3500-sensor;
Şimdi bir tarafta değerler (-)eksi olarak diğer tarafta (+) artı olarak çıkıyor.örneğin -2000 yada +3000 gibi. Bu elde ettiğim yer bilgisini önceki yer bilgisinden çıkarıpta mı pwm olarak kullanacağım . elde ettiğim bu değeri nasıl pwm olarak kullanacağım kafam karıştı birazda :) yardımcı olursanız sevinirim.
pwm değerinin maximum 255 olduğunu düşünelim.
o halde
yer=3500-0;
yer=3500 olur.
255/3500=0.07 gibi bir değer çıkar.
yer1=(yer)*0.07; bu bizim P değerimiz.
yer2=önceki yer - yer*Kd; bu da bizim D değerimiz;
yer1+yer2==bu da bizim PD değerimiz.
yardımlarınızla yapmış olduğum çizgi izleyen stabil değil bir türlü istediğim gibi olmuyor. bir çok araştırma yaptım. kodlarda da farklılıklar var. örneğin sizin verdiğiniz PD kısmında önceki_yer-yer*KD kısmı başka kaynaklarda farklı verilmiş. bazı kaynaklarda örnekleme zamanına bölünmüş.
Kendini Uyurken Cekip Youtubeyemi Atıyor :))
kendini komik mi sanıyorsun.
hocam çizgi izleyen robot yapıyorum fakat pid kısmını yapamadım değerlerimi yanlış giriyorum kodlardamı bi sıkıntı var anlayamadım
Pic basicde yazdım kodları
sensörleri anolog okutup dijitale çevirdim
sensörleri okuduğunu anlamak için birer led bağladım (pic e led bağladım picde işlemleri yapıp ledi yakıyor )
yani sensörlerden bilgi geliyor benim sorunum motor kontrol kısmı o kısmı halledemedim yardımcı olurmusunuz