Yazılım özürlüye yardım (boş geçmeyelim)

mehmetaliözdemir

Aktif Üye
Katılım
17 Nisan 2021
Mesajlar
937
öncelikle şunu belirteyim arduino proglamlamaya 2 saat önce başladım ve yazılım konusunda sıfıra yakın bilgim var. kodlardaki saçmalıkları mazur görün.

yapmak istediğim şuydu;
enerji verildiğinde pin 11 high olacak ve öyle kalacak. aynı anda pin 12 ve 13 birer saniye aralıklarla sırayla high-low olacak. 3 saniye sonra servo 80 dereceye gidecek ve 5 saniye bekledikten sonra 0 dereceye geri gelecek. tabi bu arada 11,12 ve 13 işlerini yapmaya devam edecek. servo sıfıra geldikte 1 saniye sonra pin 10 high olacak . döngü tamamlanacak tüm çıkışlar low olacak ve bir daha başlamayacak.

servoyu ve dijital çıkışları kısmen de olsa ayrı ayrı çalıştırdım ama ikisini birleştiremiyorum.

çıkışlar:
void setup()
{
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
 
 
}

void loop()
{
  digitalWrite(11, HIGH);
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
  digitalWrite(12, HIGH);
  delay(1000);
  digitalWrite(12, LOW);
 
 
}

servo:
#include <Servo.h>

int pos = 0;

Servo servo_9;

void setup()
{

  servo_9.attach(9, 500, 2500);
  pinMode(13, OUTPUT);
}

void loop()
{
 
 
  for (pos = 0; pos <= 80; pos += 1) {
 
    servo_9.write(pos);
 
    delay(50);
 
  }
  delay(5000);
  for (pos = 80; pos >= 0; pos -= 1) {
 
    servo_9.write(pos);
 
    delay(30);
  }
  delay(2000);}

1.PNG

2.PNG
 
Son düzenleme:
öncelikle şunu belirteyim arduino proglamlamaya 2 saat önce başladım ve yazılım konusunda sıfıra yakın bilgim var. kodlardaki saçmalıkları mazur görün.

yapmak istediğim şuydu;
enerji verildiğinde pin 11 high olacak ve öyle kalacak. aynı anda pin 12 ve 13 birer saniye aralıklarla sırayla high-low olacak. 3 saniye sonra servo 80 dereceye gidecek ve 5 saniye bekledikten sonra 0 dereceye geri gelecek. tabi bu arada 11,12 ve 13 işlerini yapmaya devam edecek. servo sıfıra geldikte 1 saniye sonra pin 10 high olacak . döngü tamamlanacak tüm çıkışlar low olacak ve bir daha başlamayacak.

servoyu ve dijital çıkışları kısmen de olsa ayrı ayrı çalıştırdım ama ikisini birleştiremiyorum.

çıkışlar:
void setup()
{
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
 
 
}

void loop()
{
  digitalWrite(11, HIGH);
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
  digitalWrite(12, HIGH);
  delay(1000);
  digitalWrite(12, LOW);
 
 
}

servo:
#include <Servo.h>

int pos = 0;

Servo servo_9;

void setup()
{

  servo_9.attach(9, 500, 2500);
  pinMode(13, OUTPUT);
}

void loop()
{
 
 
  for (pos = 0; pos <= 80; pos += 1) {
 
    servo_9.write(pos);
 
    delay(50);
 
  }
  delay(5000);
  for (pos = 80; pos >= 0; pos -= 1) {
 
    servo_9.write(pos);
 
    delay(30);
  }
  delay(2000);}

34565 eklentisine bak
34566 eklentisine bak
Simulatörün adı ne?
 
Bütün işlemi (örneğin) 200ms'lik bir düzen ile tablo halinde oluşturun. İlgili tüm pinlerin durumunu karşılarına yazın. Bunları Arduino'nun kodlarına dönüştürün.
İlk zamanlarda hammaliye kodlar olsun. Sonra tekrar eden kodları toparlarsınız.
 
delay() kullanınca, çoklu görevli işlemlerde kod kolayca yönetilemez hale geliyor.

İki yol tavsiye edebilirim.
- Birincisi zaman kesmesi kullanmak.
- İkincisi ise kodunuzda 12,13 ve 10 numaralı pinler için olayların zamanını ayarlayan bir yapı (pinler için gelecekişlemin zamanını tutan değişkenler) kullanıp loop() içerisinde bu zamanlar geldiyse ilgili işlemi yapacak bir kod yazmak. İkincisi sizin için daha daha basit olacaktır. Uygun olunca sizin senaryoya uygun bir örnek yazıp koyacağım. Şimdilik aşağıdaki örneğe bakabilirsiniz. Bir park sensörü kodu gibi çalışıyor. Sürekli uzaklığı ölçüp bip sesinin aralığını düzenliyor.

park sensörü:
#define BUZZER D1
#define TRIGGER D6
#define ECHO D5


long buzzerBeepDuration = 40;
long buzzerBeepMillis = 0;
long buzzerFrequencyDuration = 0;
long buzzerPreviousBeepMillis = 0;




void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  delay(100);
  pinMode(BUZZER, OUTPUT);
  pinMode(TRIGGER, OUTPUT);
  pinMode(ECHO, INPUT);
 
}

void loop(){
 
  int cm = calculateDistance();

  if(cm>120)
    cm = 10000;
 
  buzzerFrequencyDuration = cm * 10;
 
  if(buzzerPreviousBeepMillis + buzzerFrequencyDuration < millis()){
    buzzerPreviousBeepMillis =  millis();
    buzzerBeepMillis = millis() + buzzerBeepDuration;
    digitalWrite(BUZZER, HIGH);
  }
  if(buzzerBeepMillis < millis()){
    digitalWrite(BUZZER, LOW);
  } 
  delay(5);
}


int calculateDistance(){
  digitalWrite(TRIGGER,LOW);
  delay(2);
  digitalWrite(TRIGGER,HIGH);
  delay(10);
  digitalWrite(TRIGGER,LOW);
  long durat=pulseIn(ECHO,HIGH);  
  int dist= (int) (durat * 0.0342/2);  
  return dist;
}
 
Eğer çabucak toparlayıp halledeceksen bence @Mehmet.b tarif ettiği gibi yaparsın. Bütün pin açılış kapanış anlarını zamana göre çizelgeleyip her olay arasına gerektiği kadar delay koyarsın. Yalnız servo kütüphanesi delay süresince pwmye düzgün devam ediyor mu acaba?
Bütün kodu Arduino setupa yazarsan tek sefer çalışır.
Kodlamayla uğraşmaya devam edeceksen millis fonksiyonunu ve timerları öğrenerek yapmak daha iyi.
 
Yalnız servo kütüphanesi delay süresince pwmye düzgün devam ediyor mu acaba?
servonun içine eklediğim delaylar sorun çıkarmıyor. o kod tek başına çalışıyor. aslında çıkış kodu da çalışıyor ama ikisini birleştirdiğimde servonun çalışması bozuluyor. çıkışlar için eklediğim tüm delaylar sonuç olarak servonun her bir derece adımı arasına eklenmiş gibi olduğu için sorun oluyor bence.

Bütün pin açılış kapanış anlarını zamana göre çizelgeleyip her olay arasına gerektiği kadar delay koyarsın.
siz çizelge ve tablo oluştur derken derken şunu mu kast ediyorsunuz?
 

Ekler

  • Screenshot_20240617-164504_Chrome.jpg
    Screenshot_20240617-164504_Chrome.jpg
    242.9 KB · Görüntüleme: 61
Son düzenleme:
Olayzamandelay
Led1 yakbaşlangıç0
Led2 yak1000. ms1000 ms
Led1 söndür1500. Ms500ms
Servo 90 derece2000. Ms500ms
Led2 söndür. 2200. Ms200ms

Gibi çizelge. servoyu hareketinin yavaş olması için de onu yöneten kodu bir timer kesmesine almak mümkün. Loop içinde de ilgili servo olayı anında hedef konum ve hız tayin edilir. Kesmedeki servo kodu buna göre çalışır.

Bu "quest" benim levelime uygun. Fena da "xp" vermeyecek. Bu akşam müsait olunca yaparım açıklamalarıyla :) .
 
Olayzamandelay
Led1 yakbaşlangıç0
Led2 yak1000. ms1000 ms
Led1 söndür1500. Ms500ms
Servo 90 derece2000. Ms500ms
Led2 söndür.2200. Ms200ms

Gibi çizelge. servoyu hareketinin yavaş olması için de onu yöneten kodu bir timer kesmesine almak mümkün. Loop içinde de ilgili servo olayı anında hedef konum ve hız tayin edilir. Kesmedeki servo kodu buna göre çalışır.

Bu "quest" benim levelime uygun. Fena da "xp" vermeyecek. Bu akşam müsait olunca yaparım açıklamalarıyla :) .
böyle bir şey:tesekkur1:
IMG-20240617-WA0000.jpg
 
Olaya göre değil de süreye göre tablo hazırlayın. Tüm pinlerin durumunu belirtiniz.
0 ms...
500ms...
1000ms...
... gibi.
 
Son düzenleme:
Kodu yazdım. servomu bulamadığımdan denemedim. Kod derliyor umarım çalışır çalışmazsa bakılır. Bazı çöp satırlar var. Kullanılmayan değişkenler var, vaktim kalmadı ayıklamadım. Çok akıllıca da yazılmamıştır, vakti olup eleştiricek varsa başım üstüne :) . Oyalanırız, bir şeyler öğreniriz...
xxx:
#include <Servo.h>

int pos,posHedef,posAdimMs,sureSayac,servoSayac,servoAdimMs;
unsigned long ms0,ms1,ms2,ms3;

Servo servo_9;

void setup()
{
 
  servo_9.attach(9, 500, 2500);// örnek koddaki parametreler
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  // servo 0derecede olmaya bilir mevcut durumu okunamayacağından
  // hız kontrolü yapılamaz doğrudan 0 dereceye doğrudan çekilir
  // önceki döngüde servonun 0 derecede kapandığını varsaydım.
  // servoya ilk güç verildiğinde ne yaptığını da test etmek lazım.
  servo_9.write(0);
  pos=0;
  posHedef=0;
 

  //çizelgeye göre tüm döngü 10 saniye sürüyor.
  //servo hareketinde de hız 50ms ve 30ms adımnlarla kontrol edilmiş.
  //10ms'lik adımlarla çalışan bir döngüyle yapılabilir.
  ms0=millis(); //başlangıç anı.
  ms1=ms0;  // ms1 zaman takip değişkeni
  // çizelgeye göre başlangıç koşulları
  digitalWrite(10,LOW);
  digitalWrite(11,HIGH);
  digitalWrite(12,HIGH);
  digitalWrite(13,LOW);
}

void loop()
{
   if (millis()>=ms1+10)//döngü her 10ms'de 1 çalışır
   {
    ms1=millis();


    // bir sonraki olay anı gelene kadar her 10ms'de bir mevcut olay döngüsü çalışır,
    // ideal değil ama programın amacı için farketmez performans ve sonuç değişmez.
    if((millis()-ms0)>=10000)
    {
      // 10. saniyenin sonunda hiçbir komut çalışmaz,
      //sadece servo hareketini tamamlamamışsa hedef pozisyona devam eder
      // millis() fonksiyonu taşıma gidince bozulmasın diye
      if(millis()>20000)
      {
        while(1);//sonsuz döngü
      }
    }
    else if((millis()-ms0)>=9500) // 10. olay 9500ms sonra
    {
      digitalWrite(10,LOW);
      digitalWrite(11,LOW);
      digitalWrite(12,LOW);
      digitalWrite(13,LOW);
    }
    else if((millis()-ms0)>=9000) // 9. olay da 9000ms sonra
    {
      digitalWrite(10,HIGH);
      digitalWrite(11,HIGH);
      digitalWrite(12,LOW);
      digitalWrite(13,HIGH);;
    }
    else if((millis()-ms0)>=8000) // 8. olay 8000 saniye sonra
    {
      digitalWrite(12,HIGH);
      digitalWrite(13,LOW);
      posHedef=0;
      servoAdimMs=10;
    }
    else if((millis()-ms0)>=7000) // 7. olay 7000 ms sonra
    {
      digitalWrite(12,LOW);
      digitalWrite(13,HIGH);
    }
    else if((millis()-ms0)>=6000) // 6. olay 6000 ms sonra
    {
      digitalWrite(12,HIGH);
      digitalWrite(13,LOW);
    }
    else if((millis()-ms0)>=5000) // 5. olay 5000 ms sonra
    {
      digitalWrite(12,LOW);
      digitalWrite(13,HIGH);
    }
    else if((millis()-ms0)>=4000) // 4. olay 4000 ms sonra
    {
      digitalWrite(12,HIGH);
      digitalWrite(13,LOW);
    }
    else if((millis()-ms0)>=3000)// üçüncü olay 3000 ms sonra
    {
      digitalWrite(12,LOW);
      digitalWrite(13,HIGH);
      posHedef=80;  // servo hedef 80 derece
      // servo adımı örnek kodda 50ms verilmiş ama 80 dereceyi süpürmesi 4 saniye sürer
      // sonraki servo komutuna kadar 80 dereceye gelemez bu yüzden 10ms adimlama yazdım
      servoAdimMs=10;  
    }
    else if((millis()-ms0)>=2000)// ikinci olay 2000 ms sonra
    {
      digitalWrite(12,HIGH);
      digitalWrite(13,LOW);
    }
   
    else if((millis()-ms0)>=1000) // ilk olay ilk saniyenin sonunda
    {
      digitalWrite(12,LOW);
      digitalWrite(13,HIGH);
    }
   
    if(pos>posHedef)// her 10ms'de sorgulanır
    {
      if(servoAdimMs<=(millis()-ms3))// eğer servo adim süresinden daha fazla zaman geçtiyse çalışır
      {
        servo_9.write(pos-1); // pos hedefe 1 derece yaklaştır
        pos-=1;
        ms3=millis(); // servo adimlama süresi için
      }
     
    }
   
   // [S]else if(pos>posHedef)[/S]
    else if(pos<posHedef)
    {
      if(servoAdimMs<=(millis()-ms3))// eğer servo adim süresinden daha fazla zaman geçtiyse çalışır
      {
        servo_9.write(pos+1); // pos hedefe 1 derece yaklaştır
        pos+=1;
        ms3=millis(); // servo adimlama süresi için
      }
    }
   }
 
}
 
Son düzenleme:
Kodu yazdım. servomu bulamadığımdan denemedim. Kod derliyor umarım çalışır çalışmazsa bakılır. Bazı çöp satırlar var. Kullanılmayan değişkenler var, vaktim kalmadı ayıklamadım. Çok akıllıca da yazılmamıştır, vakti olup eleştiricek varsa başım üstüne :) . Oyalanırız, bir şeyler öğreniriz...
tinkercad Simulatörüne göre çıkışlar olması gerektiği gibi ama servo çalışmıyor. biraz da zamanı bükmüşsün galiba yavaş akıyor :D
Simulatör mü yanıltıyor acaba?
 
tinkercad Simulatörüne göre çıkışlar olması gerektiği gibi ama servo çalışmıyor. biraz da zamanı bükmüşsün galiba yavaş akıyor :D
Simulatör mü yanıltıyor acaba?
"else if(pos>posHedef)" yanlış olmuş
"else if(pos<posHedef)" olacak. Mesajı da düzeltiyorum.

Herhalde simülasyon yavaş çalışıyordur, her şeyin 10 saniyede bitmesi lazım.
 
teşekkürler çalıştı. ilk fırsatta arduinoya yükleyip deneyeceğim.
bir de 0 dan 80 e gidiş gecikmesini ayarlayan komut 'servoAdimMs=10;' bu ama 80 den 0 a doğru olanını bulamadım. birazcık yavaşlatmam gerekecek gibi.
 
Son düzenleme:
C-like:
else if((millis()-ms0)>=8000) // 8. olay 8000 saniye sonra
    {
      digitalWrite(12,HIGH);
      digitalWrite(13,LOW);
      posHedef=0;
      servoAdimMs=10;
    }

Her pozisyon komutunda tekrar hız belirlenir. servoAdimMs sadece 10ms katlarıyla çalışabilir. Uygulamada aksak hareket ederse, ufak bir değişiklik daha yapılabilir. Döngü sıklığı 10ms'den 1 ms'ye çekilebilir. Kod biraz düzenlenerek doğrudan hareketin süresi de kontrol edilebilir.
 
Kodu yazdım. servomu bulamadığımdan denemedim. Kod derliyor umarım çalışır çalışmazsa bakılır. Bazı çöp satırlar var. Kullanılmayan değişkenler var, vaktim kalmadı ayıklamadım. Çok akıllıca da yazılmamıştır, vakti olup eleştiricek varsa başım üstüne :) . Oyalanırız, bir şeyler öğreniriz...
xxx:
#include <Servo.h>

int pos,posHedef,posAdimMs,sureSayac,servoSayac,servoAdimMs;
unsigned long ms0,ms1,ms2,ms3;

Servo servo_9;

void setup()
{
 
  servo_9.attach(9, 500, 2500);// örnek koddaki parametreler
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  // servo 0derecede olmaya bilir mevcut durumu okunamayacağından
  // hız kontrolü yapılamaz doğrudan 0 dereceye doğrudan çekilir
  // önceki döngüde servonun 0 derecede kapandığını varsaydım.
  // servoya ilk güç verildiğinde ne yaptığını da test etmek lazım.
  servo_9.write(0);
  pos=0;
  posHedef=0;
 

  //çizelgeye göre tüm döngü 10 saniye sürüyor.
  //servo hareketinde de hız 50ms ve 30ms adımnlarla kontrol edilmiş.
  //10ms'lik adımlarla çalışan bir döngüyle yapılabilir.
  ms0=millis(); //başlangıç anı.
  ms1=ms0;  // ms1 zaman takip değişkeni
  // çizelgeye göre başlangıç koşulları
  digitalWrite(10,LOW);
  digitalWrite(11,HIGH);
  digitalWrite(12,HIGH);
  digitalWrite(13,LOW);
}

void loop()
{
   if (millis()>=ms1+10)//döngü her 10ms'de 1 çalışır
   {
    ms1=millis();


    // bir sonraki olay anı gelene kadar her 10ms'de bir mevcut olay döngüsü çalışır,
    // ideal değil ama programın amacı için farketmez performans ve sonuç değişmez.
    if((millis()-ms0)>=10000)
    {
      // 10. saniyenin sonunda hiçbir komut çalışmaz,
      //sadece servo hareketini tamamlamamışsa hedef pozisyona devam eder
      // millis() fonksiyonu taşıma gidince bozulmasın diye
      if(millis()>20000)
      {
        while(1);//sonsuz döngü
      }
    }
    else if((millis()-ms0)>=9500) // 10. olay 9500ms sonra
    {
      digitalWrite(10,LOW);
      digitalWrite(11,LOW);
      digitalWrite(12,LOW);
      digitalWrite(13,LOW);
    }
    else if((millis()-ms0)>=9000) // 9. olay da 9000ms sonra
    {
      digitalWrite(10,HIGH);
      digitalWrite(11,HIGH);
      digitalWrite(12,LOW);
      digitalWrite(13,HIGH);;
    }
    else if((millis()-ms0)>=8000) // 8. olay 8000 saniye sonra
    {
      digitalWrite(12,HIGH);
      digitalWrite(13,LOW);
      posHedef=0;
      servoAdimMs=10;
    }
    else if((millis()-ms0)>=7000) // 7. olay 7000 ms sonra
    {
      digitalWrite(12,LOW);
      digitalWrite(13,HIGH);
    }
    else if((millis()-ms0)>=6000) // 6. olay 6000 ms sonra
    {
      digitalWrite(12,HIGH);
      digitalWrite(13,LOW);
    }
    else if((millis()-ms0)>=5000) // 5. olay 5000 ms sonra
    {
      digitalWrite(12,LOW);
      digitalWrite(13,HIGH);
    }
    else if((millis()-ms0)>=4000) // 4. olay 4000 ms sonra
    {
      digitalWrite(12,HIGH);
      digitalWrite(13,LOW);
    }
    else if((millis()-ms0)>=3000)// üçüncü olay 3000 ms sonra
    {
      digitalWrite(12,LOW);
      digitalWrite(13,HIGH);
      posHedef=80;  // servo hedef 80 derece
      // servo adımı örnek kodda 50ms verilmiş ama 80 dereceyi süpürmesi 4 saniye sürer
      // sonraki servo komutuna kadar 80 dereceye gelemez bu yüzden 10ms adimlama yazdım
      servoAdimMs=10; 
    }
    else if((millis()-ms0)>=2000)// ikinci olay 2000 ms sonra
    {
      digitalWrite(12,HIGH);
      digitalWrite(13,LOW);
    }
  
    else if((millis()-ms0)>=1000) // ilk olay ilk saniyenin sonunda
    {
      digitalWrite(12,LOW);
      digitalWrite(13,HIGH);
    }
  
    if(pos>posHedef)// her 10ms'de sorgulanır
    {
      if(servoAdimMs<=(millis()-ms3))// eğer servo adim süresinden daha fazla zaman geçtiyse çalışır
      {
        servo_9.write(pos-1); // pos hedefe 1 derece yaklaştır
        pos-=1;
        ms3=millis(); // servo adimlama süresi için
      }
    
    }
  
   // [S]else if(pos>posHedef)[/S]
    else if(pos<posHedef)
    {
      if(servoAdimMs<=(millis()-ms3))// eğer servo adim süresinden daha fazla zaman geçtiyse çalışır
      {
        servo_9.write(pos+1); // pos hedefe 1 derece yaklaştır
        pos+=1;
        ms3=millis(); // servo adimlama süresi için
      }
    }
   }
 
}


 

Çevrimiçi personel

Forum istatistikleri

Konular
6,955
Mesajlar
118,794
Üyeler
2,824
Son üye
selocan32

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top