Bu kodu diğerine entegre etmek

Affansen

Katılımcı Üye
Katılım
15 Ocak 2021
Mesajlar
501
Puanları
56
Dün kodlar üzerinde denemiştim ama başaramadım. Paylaşacağım koddaki Bluetooth ile veri gelen yerleri değiştirdim, IR yaptım ama tepki vermemişti. Sonrasında "veri" değişkeni varmış, onu IR sensörden gelen veri olarak tanımladım bu da olmadı. En sonunda yardım almaya karar verdim.

C#:
 #include <IRremote.h>

uint8_t hiz = 0;

char command;
int receiver_pin = 4;   //Connect the output pin of IR receiver at pin 4
int vcc = 5;            //VCC for IR sensor
int gnd = 6;            //GND for IR sensor

int statusled = 13;

IRrecv irrecv(receiver_pin);

decode_results results;


// connect motor controller pins to Arduino digital pins
// motor A
int enA = 6;
int in1 = 12;
int in2 = 11;
// motor B
int enB = 5;
int in3 = 10;
int in4 = 9;


void setup()

{
Serial.begin(9600);

irrecv.enableIRIn();

pinMode(statusled,OUTPUT);

digitalWrite(statusled,LOW);

// set all the motor control pins to outputs
  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(vcc, OUTPUT);
  pinMode(gnd, OUTPUT);

// Initializing vcc pin high
  digitalWrite(vcc, HIGH);



}

void loop() {

if (irrecv.decode(&results)) {

digitalWrite(statusled,LOW);

irrecv.resume();

switch(results.value){
  case 0x40BFF807:
    if(hiz<255)
      hiz +=51;
    analogWrite(enA,hiz);
    analogWrite(enB,hiz);
    break;
  case 0x40BF7887:
    if(hiz>0)
      hiz -=51;
    analogWrite(enA,hiz);
    analogWrite(enB,hiz);
    break;
  default:
    break;
}

if (results.value == 0x40BF609F){ // type button 2 forward robot control

// this function will run the motors in both directions at a fixed speed
Serial.println("Button 2");
  // turn on motor A
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  // set speed to 200 out of possible range 0~255
  // turn on motor B
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  // set speed to 200 out of possible range 0~255




}else if(results.value == 0x40BF906F){ // type button 4 turn left robot control

// this function will run motor A in forward directions  motor B stop
  Serial.println("Button 4");
  // turn on motor A
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  // set speed to 200 out of possible range 0~255
  // turn on motor B
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  // set speed to 200 out of possible range 0~255


}else if(results.value == 0x40BF48B7){ // type button 1 rotate left robot control

// this function will run motor A in forward directions  motor B in backward directions
  Serial.println("Button Turn Right");
  // turn on motor A
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  // set speed to 200 out of possible range 0~255  analogWrite(enA, 130);
  // turn on motor B
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  // set speed to 200 out of possible range 0~255


}else if(results.value == 0x40BFD02F){ // type button 6 turn right robot control

// this function will  stop motor A  run motor B in forward directions
Serial.println("Button Turn Left");
  // turn on motor A
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  // set speed to 200 out of possible range 0~255
  // turn on motor B
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  // set speed to 200 out of possible range 0~255

}else if(results.value == 0x40BFC837){ // type button 3 rotate right robot control

// this function will run motor A  in backward directions  motor B in forward directions
  // turn on motor A
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  // set speed to 200 out of possible range 0~255
  // turn on motor B
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  // set speed to 200 out of possible range 0~255

} else if(results.value == 0x40BF708F){ // type button 8 backward robot control

// this function will run motor A and motor B in backward directions
  // turn on motor A
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  // set speed to 200 out of possible range 0~255
  // turn on motor B
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  // set speed to 200 out of possible range 0~255



}else if(results.value == 0x40BF50AF){ // type button 5 stop robot control


// this function will stop both motor A and motor B
  // turn on motor A
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  // set speed to 200 out of possible range 0~255
  // turn on motor B
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  // set speed to 200 out of possible range 0~255



}

}

}

C#:
int pwmA = 10;  // sag motor

int pwmB = 11;  // sol motor

int pwmsol = 100;  // hiz sol

int pwmsag = 100;  // hiz sag

int in1 = 4; //sag ileri

int in2 = 5; //sag geri

int in3 = 6; //sol ileri

int in4 = 7; //sol geri

int temmotoru = 12; // temizlik motoru pini

int otomod=0; //otomotik mod

char veri;

int triggerPin = 9; //mesafe sensoru tetikleme ucu

int echoPin = 8; //mesafe sensoru geri donus

long sure, uzaklik;



void setup() {

pinMode(pwmA,OUTPUT);

pinMode(pwmB,OUTPUT);

pinMode(in1,OUTPUT);

pinMode(in2,OUTPUT);

pinMode(in3,OUTPUT);

pinMode(in4, OUTPUT);

pinMode(temmotoru,OUTPUT);

pinMode(echoPin, INPUT);

pinMode(triggerPin, OUTPUT);

Serial.begin(9600);

}

void loop() {

  while(Serial.available()){

    veri = Serial.read();

    if (veri=='X')

      otomod=1;

    if  (veri=='x')

      otomod=0;

    if(otomod==1)

      otomatikmod();

    else{

    switch (veri){

      Serial.print(veri);

      pwmsol=100;

      pwmsag=100;

      case 'F': //ileri

      {

        ileri();

        break;

      }

      case 'I': //ileri sag

      {

        pwmsol=150;

        ileri();

      }

       case 'R': //sag

      {

        sag();

        break;

      }

      case 'J': //Geri sag

      {

        pwmsol=150;

        sag();

        break;

      }

      case 'B': //Geri

      {

        geri();

        break;

      }

       case 'H': //Geri sol

      {

        pwmsag=150;

        geri();

        break;

      }

      case 'L': //sol

      {

        sol();

        break;

      }

      case 'G': //ileri sol

      {

        pwmsag=150;

        ileri();

        break;

      }

      case 'S': //durma

      {

        digitalWrite(in1, 0);

        digitalWrite(in2, 0);

        digitalWrite(in3, 0);

        digitalWrite(in4, 0);

        break;

      }

      case 'V': //Temizlik Motoru Acma

      {

        digitalWrite(temmotoru, 1);

        break;

      }

      case 'v': //Temizlik Motoru Kapatma

      {

        digitalWrite(temmotoru, 0);

        break;

      }

       case 'X': //otomotik mod calistirma

      {

        otomod=1;

        break;

      }

       case 'x': //durma

      {

        otomod=0;

        break;

      }

    }

Serial.println(veri);

    }

  }

}

    void ileri(){

        digitalWrite(in1, 1); //sag ileri

        digitalWrite(in2, 0); //sag geri

        digitalWrite(in3, 1); //sol ileri

        digitalWrite(in4, 0); //sol geri

        analogWrite(pwmA,pwmsag);

        analogWrite(pwmB,pwmsol);

      }

    void sag(){

        digitalWrite(in1, 0);

        digitalWrite(in2, 0);

        digitalWrite(in3, 1);

        digitalWrite(in4, 0);

        analogWrite(pwmA,pwmsag);

        analogWrite(pwmB,pwmsol);

    }

    void geri(){

        digitalWrite(in1, 0);

        digitalWrite(in2, 1);

        digitalWrite(in3, 0);

        digitalWrite(in4, 1);

        analogWrite(pwmA,pwmsag);

        analogWrite(pwmB,pwmsol);

    }

    void sol(){

        digitalWrite(in1, 1);

        digitalWrite(in2, 0);

        digitalWrite(in3, 0);

        digitalWrite(in4, 0);

        analogWrite(pwmA,pwmsag);

        analogWrite(pwmB,pwmsol);

    }

   void otomatikmod(){

        digitalWrite(triggerPin, LOW);

        delayMicroseconds(5);

        digitalWrite(triggerPin, HIGH);

        delayMicroseconds(10);

        digitalWrite(triggerPin, LOW);

        sure = pulseIn(echoPin, HIGH);

        uzaklik = sure / 29.1 / 2;

        Serial.println(uzaklik);

        if (uzaklik < 25) // Uzaklık 25'den kucuk ise,

        {

          geri();  // 150 ms geri git

          delay(200);

          sag();  // 250 ms saga donn

          delay(300);

        }

        else {  // degil ise,

          ileri(); // ileri git

        }

    }
İkinci koddaki son kısım var, otomatik mod yazan. Bu robotun asıl amacı yerleri temizlemek. Ben de böyle olunca hazır koddan algoritmayı alıp diğer koda yerleştirmenin daha kolay olacağını düşündüm. Yani otomatik modu ve temmotoru (Temizlik robotunun tetik pini) ana koda eklemek gerekiyor. Tuşların kodlarını paylaşacağım. Bir de merak ettiğim bir husus otomatik moddayken kendisi otomatikman temizlik motorunu çalıştırıyor mu, yoksa tekrardan komut verilerek mi? Eğer otomatik başlıyorsa yolu varsa ayrı tuş olarak atanabilir mi? Teşekkürler.
Projenin son kalan kısmı sanırsam. Gerisi hazır olacak. Bu arada @FakirMaker Emeği geçenler şeklinde Serial porta kullanıcı isminizi yazdırsam sorun olur mu? En azından kodu paylaştığınızda kimin tarafından yapıldığı da belli olur başkaları için. İsteyen siler sonuçta.

Motor için ON/OFF: 40BF00FF
Oto mod-manuel mod: 40BF807F


@FakirMaker @cengover_ekin
 
Ne yapmaya çalıştığını anlamadım ki? Hem bt hem ir mi istiyorsun robotunda yoksa bt olan yazılımı ir li hale getirmeye mi çalışıyorsun?
 
Ne yapmaya çalıştığını anlamadım ki? Hem bt hem ir mi istiyorsun robotunda yoksa bt olan yazılımı ir li hale getirmeye mi çalışıyorsun?
BT olan kodu IR yapmaya çalışıyorum. Yani ilk başta BT ile denemiştim geçen sene olmamıştı. Sizin verdiğiniz kod ile IR dün çalıştı. Tam da istediğim gibi oldu hız ayarı. Bu verdiğim 2. kodu kendim denemiştim bu case'lerin içine koyarak. Ama çalıştıramadım. Ben de şöyle düşündüm, 2. kodun otomatik modunu 1. koda yerleştirsem sorunum çözülecek. İstediğim oto modu ve temizlik motorunu bizim 1. koda eklemek.
 
Sanırım yeni motor açma kapama ve otomatik fonksiyonlarını transfer etmek istiyorsun. Aynı şekilde switch döngüsüne ilave edebilirsin.
C++:
switch(results.value){
  case 0x40BFF807:
    if(hiz<255)
      hiz +=51;
    analogWrite(enA,hiz);
    analogWrite(enB,hiz);
    break;
  case 0x40BF7887:
    if(hiz>0)
      hiz -=51;
    analogWrite(enA,hiz);
    analogWrite(enB,hiz);
    break;
  case MOTORAC_KAPA_KODU:
    motor_ac_kapa();
    break;
  case OTOMATIK_MOD:
       otomatik_mod()
    break;   
  default:
    break;
}
 
Teşekkür ederim, yani önceki hız değişkenini silip bunu mu eklemeliyim?

Yukarıda o bildirim işaretini görünce çok heyecanlanıyorum aynı zamanda çok mutlu oluyorum.

Bu arada bir sorum var, burada HC-SR04'ün pinleri tanımlanmamış, bir de otomatik modun tanımı yok galiba. Onları nasıl eklemeliyim? Direkt olarak void setup kısmına mı koyacağım?


Bu arada bunlar ödev değil, hobi amaçlı yapıyorum yanlış anlaşılmasın yani. Evde annemin yanında yerleri silse ne güzel olur.
 
Hayır senin zaten çalışan bir ir uygulaman var hiçbirşeyi değiştirmeden bunları eklersen kumandanın yeni tuşlarına tepki verecektir. sadece en aşağıya otomatikmod() ve motor_ac_kapa() isimli iki fonksiyon ekleyeceksin yoksa derlemez zaten hata verir.
 
Anlayamadım kusura bakmayın.

Şimdi ben bu kodu dün yazdığınız kodu eklediğim koda ekleyeceğim. Yani yukarıda belirttiğim ana koda. Ana kodda otomatik kodun tanımı yok. Yani bunu bir void içerisinde olması gerekmiyor mu?
C#:
void otomatikmod(){

        digitalWrite(triggerPin, LOW);

        delayMicroseconds(5);

        digitalWrite(triggerPin, HIGH);

        delayMicroseconds(10);

        digitalWrite(triggerPin, LOW);

        sure = pulseIn(echoPin, HIGH);

        uzaklik = sure / 29.1 / 2;

        Serial.println(uzaklik);

        if (uzaklik < 25) // Uzaklık 25'den kucuk ise,

        {

          geri();  // 150 ms geri git

          delay(200);

          sag();  // 250 ms saga donn

          delay(300);

        }

        else {  // degil ise,

          ileri(); // ileri git

        }

    }
Yani bu kodu da eklemem gerekmez mi?
 
Evet dedim ya zaten en sona eklemen gerekir yoksa çalışmaz diye. Aynı şekilde motor aç kapa için de bi fonksiyon lazım onu da eklemen lazım.
 
Evet dedim ya zaten en sona eklemen gerekir yoksa çalışmaz diye. Aynı şekilde motor aç kapa için de bi fonksiyon lazım onu da eklemen lazım.
O zaman ben cümleyi anlayamadım. Tamam ekliyorum hemen. Teşekkürler bu arada.

Bir de Süper Mario melodisi vardı, ama 2 taneydi. Bir tanesi belleğin çok az bir kısmını kullanırken diğeri bellekte yer bırakmıyordu nedense. Ama hep merak etmiştim. Sadece hata varsa söyler misiniz?


C#:
/* This example uses a piezo speaker to play melodies.  It sends
* a square wave of the appropriate frequency to the piezo, generating
* the corresponding tone.
*
* The calculation of the tones is made following the mathematical
* operation:
*
*       timeHigh = period / 2 = 1 / (2 * toneFrequency)
*
* where the different tones are described as in the table:
*
* note  frequency  period  timeHigh
* c          261 Hz          3830  1915 
* d          294 Hz          3400  1700 
* e          329 Hz          3038  1519 
* f          349 Hz          2864  1432 
* g          392 Hz          2550  1275 
* a          440 Hz          2272  1136 
* b          493 Hz          2028 1014 
* C         523 Hz         1912  956
*
* https://www.arduino.cc/en/Tutorial/Melody
*/

int speakerPin =11;


int length = 295; // the number of notes
char notes[] = "EE E CE G  g  C  g e  a b ia gEGA FG E CDb C  g e  a b ia gEGA FG E CDb  GNFR E uaC aCD GNFR E 1 11   GNFR E uaC aCD L  D C   CC C CD EC ag  CC C CDE  CC C CD EC ag  EE E CE G  g  C  g e  a b ia gEGA FG E CDb C  g e  a b ia gEGA FG E CDb EC g u aF Fa  bAAAGFEC ag  EC g u aF Fa  bF FFEDCe ec  "; // a space represents a rest
float beats[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2,                 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, //Page 1
                2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 2, 4, //Page 2
                1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, //Page4
                1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, //Page 5
                1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1.3, 1.3, 1.3, 1.3, 1.3, 1.3, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1.3, 1.3, 1.3, 1, 1, 1, 1, 1, 1, 2 }; //Page 6

int tempo = 95;

void playTone(int ton1, int duration) {
  for (long i = 0; i < duration * 1000L; i += ton1) {
    tone(speakerPin, ton1);
    delayMicroseconds(ton1);
  }
  noTone(speakerPin);
}

void playNote(char note, int duration) {
//                        c    c#   d    d#   e    f    f#   g    g#   a    a#   b
  char names[] = { ' ',  '!', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C', 'D', 'E', 'F', 'G', 'A', 'B', 'i', 'N', 'R', 'u',  '1', 'L', 'k'}; // [i = b flat] [N = G flat] [R = D#] [u = g#] [1 = C oct. 5] [L = E flat]
  int tones[] =  {   0, 1046, 138, 146, 155, 164, 174, 184, 195, 207, 220, 233, 246, 261, 293, 329, 349, 391, 440, 493, 523, 587, 659, 698, 783, 880, 987, 466, 740, 622, 415, 1046, 622u, 227};

  // play the tone corresponding to the note name
  for (int i = 0; i < 34; i++) {
    if (names[i] == note) {
      playTone(tones[i], duration);
    }
  }
}

void setup() {
  pinMode(speakerPin, OUTPUT);
}

void loop() {
  for (int i = 0; i < length; i++)
  {
    if (notes[i] == ' ')
    {
      delay(beats[i] * tempo); // rest
    }
    else
    {
      playNote(notes[i], beats[i] * tempo);
    }
    // pause between notes
    delay(tempo / 2); 
  }
}

Bu arada kodda kafama takılan bir yer var. Müsaitseniz bakabilir misiniz?

Burada hız arttırma veya azaltmak için kod tanımladık ama otomatik modda falan kumanda kodu bulunmuyor. Yine de tepki verecek mi?

Ayriyetten, burada diğer şeyleri de tanımlamam gerekiyor galiba. Veya kendim bir otomod ayarlamam gerekiyor doğru mu?
 
Son düzenleme:
Kod:
char notes[]
float beats[]
şeklinde yazarsan ramde yer kaplar. Ram sınırlı olduğu için dolar onun yerine değişmeyecek sabit dataların flash memory e kaydolması lazım.
Şöyle:
Kod:
const char notes[] PROGMEM= "EE....
const float beats[] PROGMEM= { 1,....
Abicim oraları uğraşmamak için sana bıraktım sen kumanda kodunu yazacaksın oraya.
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için onları kabul etmelisiniz. Daha fazla bilgi edin…