Step Motor Pozisyon Belirleme...
  • Merhaba Arkadaşlar...
    Yapmam gereken döner platform projesi var... Platformun üzerinde oyuncak bir araba ya da kutu gibi nesene olacak...
    Üzerine görsel projeksiyon yapıp video mapping yapacağım.
    Midi ile yönlendireceğimiz Step motoru. Midi mesajı , başlat, durdur gibi komutlarda problem yok. Ama benden istenen öyle birşey varki valla kafam çok karıştı. RPM , adım , zaman hesaplmaktan bir türlü konuyu toparlayamadım. İstenen ise benden motor durduğunda bir tuş ile geri 0 noktasına almam gerek.. Yani nereden başladıysa o pozisyona geri döndürmem lazım step motoru.. Step motor olarak 200 adım nema17 ve sürücü olarakda A4988 kullanıyorum... Kartım ise Arduino Mega.. Ramps 1.4 kartta var elimde.
    Kimisi sensörler yapabilirsin diyor optik sensörle yani. Ben kodlada olabileceğini düşündüm birde sizlere sorayım dedim.

    Teşekkürler.
  • kaç defa step verdiğini sayarsın. sıfır noktasına her geldiğinde sayacı da sıfırlarsın. sıfır noktasına gelmek istediğin zaman. ters yönde sayaç kadar step verirsin.
  • @fatihaslamaci bey teşekkür ederim yanıtınız için..
    Bu sayacı nasıl kurabilirim... Bir sensör olarakmı koysa delayMillis gibi fonksiyon ilemi...
    Ardunio motora pulse veriyor ve motorda bu pulse bağlı olarak adım atıyor... Esasında dediğinizi çok denedim ama bir türlü başaramadım... Daha doğrusu pulse nasıl saydıracağımı bulamadım... Acaba sürücüye giden pulse kablosunu tekrar arudino ya inputmu yapsam diye düşünüyorum arık :)...
    Eğer zahmet olmazsa örnek bir kod yazarsanız sevirim...
  • encoder kullanarak daha sağlıklı işlem yaptırabilirsiniz.
  • bir değişken tanımlayıp her stepte bunu arttırmak ne kadar zor olabilirki. elinizdeki koda bakıp neler oldugunu anlayamıyorsunuz sanırım. copy past de bı yere kadar tabi
  • Selam okaman ... Zor ya da kolay orası beni ilgilendire bir konu. Neden böyle bir saldıraya girdin... Ve bilip bilmeden kafana göre konuşma haddini nereden alıyorsun...Artislik yapacağına insacıl yaklaş anlatmaya çalış belki kaçırdığımız bir yer vardır... Belkide çok basittir ben göremiyorumdur olayı... Görebilmek zorunda olduğumuda sanmıyorum zaten...
    Ben elektronik mühendisi değilim yazılımcı değilim... Video Mapping yapan 3D artistim.
    Kafamızda bir proje var ve bende yardımcı olmamı isteyen insanlara kafamın bastığı kadar yardımcı olmaya çalışıyorum...
    Elimdeki koda bakıp ne olduğunu anlıyorum... Stepper.h dan accelstepper.h gibi kütüp hanelerin içine girip kodları inceleyerek ne tür bir denklen ile step motoru sürdüklerini anlamaya çalıştım... Eline hayatında step motor almamış biri olarak...
    Hepside millis funksiyonu üzerinden yürümüş..
    A4988 motor sürücüsünü 555 timer ile hız ayarlıda sürerim orada bir sıkıntı yok zaten...
    Sürücünün bir pini yön bir pini pulse ... diğer pinleride ıvır zıvır... şimdi bana öyle bir kod verinki... o kod içerisindeki RPM değişkenine RPM girdiğimde motorun tur/dakika hızını ayarlasın aynı zamanda PULSE diye bir değişkende bu RPM göre PULSE sayıp her 200 de birde 0 olsun. Dur komutu verince dursun. Başa dön dediğimdede 0 konumuna gelsin...

    Birde hazıra kon armut piş ağzıma düş kafasında bir adam değilim... Günlerdir nasıl çözerim diye uğraşıyorum.. Sensörsüz olarak başarmayı istedim olmadı yardımcı olursunuz sandım ama yardımdan önce artislik yapmak bu elektronik camiyasında gelenek herhalde...


    Yapmak istediğim konuya bir örnek olsun size...
  • EmbeddedSystem teşekkürler sanırım öyle yapacağım...
  • vay anasını
  • bak yavrucugum (insancıl mod on)
    stepher.h gibi kutuphanaelerde işin yok
    sen mididen gelen mesajları decode etmişin anlaşılan, motoru ılerı ve stop hareketı arasında yaptığın her adımı sayacaksın bunu da serial monıtorden ızlemeye calıs buton okumayı da cozdugunu dusunuyoruz butona basıldıgında da step kontrolcune o kadar adım gerı adımları vereceksın. bu yontem yazılımla olabılır bir kaç adım hata olabılır bu gıdıs gelıslerde. bu arada sahnenin başlangıcı yada stepın ılk durması gereken yeri anlaman ıcınde bır mekanık swıcı platform altından yakalaman lazımkı otomatık durasın.
    diğer ağır ve grantılı ve pahalı yontem ıse bır encoder koyup her pozısyonu her an okumak.

    diğer rpm hesaplama için step motorun adımları hep sabıt hızla gıdıyorsa dakıkada kaç derece gitmen gerektiğin belli (360/200)*adımhız ve bu adımın veya adımların dakıkadakı sayısına oranlı olarak basacaksın.
    kolay gelsin 3d artıst.

    şu ajanslarda iş veren kafalara bayılıyorum youtube da buldukları vıdeo ve projeleri genç diğmalara verıp hadi yapta görelim bir tutarsa şöyle boyle kazanırsınla ıyı gaz verıp bayagı projeler kaktırırlar da bu yaşıma geldim ne bundan kalkınan ajans nede çalışanının iş yapanı gördum. herkesın hayatında bır ajans deneyımı olmuştur iyi kötü bir tecrube olur ınsanın çalışma hayatında.

    hala ajansların salonunda playstation oluyor mu ?
  • Canım okamancım biz bayadır tanışıyoruz bu platformadan ama sen hatırlamadın sanırım... 36 yaşında biri olarak genç diyorsan bana valla hoşuma da gitti.. Bendeki genç anlayışı daha çok 22,25 yaş arası...
    Benim çalıştığım yer arkadaşımın... Kimse bunu yapta sana şöyle bir para verelim demiyor... Ülke piyasasındaki video mappinglere biraz daha hareket katalım istiyorlar bende yardımcı olmaya çalışıyorum...
    Videosunu gönderdiğim projeyi baya önce görmüştüm hoşumada gitti... Bizim cocuklarda döner bir platformda güzel bir araç döndürüp ona mapping yapalım dediler.
    Yani biz bu oyuncağı yaptıktan sonra birde bu işin saha kısmı olacak... Gerçek bir aracı platformda döndürmemiz gerekecek... Gerçi orada ileri sar geri sar olmaz.. Başlat ve bitir şovu olur...




    int x;
    int steps = 54;
    void setup() {

    Serial.begin(9600);
    pinMode(38, OUTPUT);
    pinMode(55, OUTPUT);
    pinMode(54, OUTPUT);
    }

    void loop() {


    if (x < 2000){
    x++;

    //delay(1);
    digitalWrite(steps, HIGH);
    delayMicroseconds(x);
    digitalWrite(steps, LOW);
    delayMicroseconds(x);
    Serial.println(x);
    }

    }

    Şöyle bir kodla güzel bir tanjant yavaşlama yakaladım
    Serial.println dediğimde sanki serial printin kendine bir 500 ms geçikme var gibi calısıyor. Serial.printi kapatınca normale dönüyor anlamadım nedendir... Ramps üzerinde kullanıyorum acaba serial bacağı rampsta x motorunun bir pininemi denk geliyor ? diye kendime sorup hemen bakayım...
  • serialprint her adımda yaklaşık bir kaç adımlık zaman harcıyor yavaşlama o nedenle oluyor. daha sonra gerçek kodunda kullanmayacaksın nasılse bu neler oluyor analamak için

    tekrar başa alacağımıza göre platform hep aynı yone gidiyor sanırım turun bitmesi için 200 adıma ıhtıyaç var degılmı. x değişkenınde zaten adımları topluyorsun. butona basınca kalan xx değerlerini 200 olana kadar devam et ve sonra xx i sıfırla.

    bu arada
    x++;
    if ((x>=200){x=0;}

    yaparsan turlarda da sıfırlamış olursun
    proje bitince çağır yada video çek yayınla nasıl oluyor görelim.
  • Evet 200 adım kafi... Dediğin gibi serial kullanmak zorunda değilim merak ettim sadece neden oluyordu...
    Oh be oldu sanırım...
  • #define Y_STEP_PIN 60
    #define Y_DIR_PIN 61
    #define Y_ENABLE_PIN 56
    int z = 25;
    int x;
    void setup() {


    Serial.begin(9600);
    pinMode(Y_ENABLE_PIN , OUTPUT);
    pinMode(Y_DIR_PIN , OUTPUT);
    pinMode(Y_STEP_PIN , OUTPUT);
    }

    void loop() {




    if ( x < 400)
    {
    x++;
    digitalWrite(Y_STEP_PIN , HIGH);
    delay(z);
    digitalWrite(Y_STEP_PIN , LOW);
    delay(z);
    Serial.println(x);
    }
    else

    {
    x=0;
    pinMode(Y_ENABLE_PIN , LOW);

    }


    }

    Olmadı yahu... Serialda x 0 oluyor ve basa donup sayıyor fakat digitalWrite devam etmiyor yazmaya...400 de yazma duruyor... Bir yanlışlık var acaba nedir nedir :D
  • for var while var :D ama kafa yok abi...
  • bu kod olmaz yahu.
    else ve altındakileri kaldır

    if ( x < 400)
    {
    x++;
    digitalWrite(Y_STEP_PIN , HIGH);
    delay(z);
    digitalWrite(Y_STEP_PIN , LOW);
    delay(z);
    Serial.println(x);
    if (x>=400){x=0;
    pinMode(Y_ENABLE_PIN , LOW);}
    }

    bu kod tabla 2 tur attıktan sonra duracak ama stepler saymaya devam edecek.
    kodunu fazla kurcalamadım mantıgından uzaklaşma dıye
  • #define Y_STEP_PIN 60
    #define Y_DIR_PIN 61
    #define Y_ENABLE_PIN 56
    float gecikme = 75/16;
    int x;
    int a;
    void setup() {

    Serial.begin(9600);
    pinMode(Y_ENABLE_PIN , LOW);
    pinMode(Y_DIR_PIN , OUTPUT);
    pinMode(Y_STEP_PIN , OUTPUT);
    }
    ----------------------------------------
    void loop() {
    char c;
    if (Serial.available() > 0 ) {
    c = Serial.read();
    if (c == 'f') { // forward
    pinMode(38, OUTPUT);
    ileri();
    }

    }


    }

    ------------------------------------
    int geri(){
    a = 400-x;
    Serial.println(a);

    if (x < 400 )
    {

    a--;

    pinMode(Y_ENABLE_PIN , LOW);
    pinMode(Y_DIR_PIN , LOW);
    digitalWrite(Y_STEP_PIN , HIGH);
    delay(gecikme);
    digitalWrite(Y_STEP_PIN , LOW);
    delay(gecikme);
    return a;


    }
    }

    ----------------------------------------
    void dur(){

    pinMode(Y_ENABLE_PIN , LOW);

    }
    ----------------------------------------
    int ileri(){
    while ( x < 400)
    {
    x++;
    pinMode(Y_ENABLE_PIN , HIGH);
    digitalWrite(Y_STEP_PIN , HIGH);
    delay(gecikme);
    digitalWrite(Y_STEP_PIN , LOW);
    delay(gecikme);
    return x;


    }

    }


    Sıkıntı şu ' f ' tuşuna bastığımda ileri fonksiyonunun sadece pinMode(Y_ENABLE_PIN , HIGH); komutunu calıstırıyor sanki. Bununda sebebi sanırım if (Serial.available() > 0 ) komudu.. f gönderince devam eder zannediyodum ama ... Serial 0 dan büyük oluncamı kod devam ediyor... Az kaldı sanki yaklaştım birazdaha...
  • if (Serial.available() > 0 ) {
    c = Serial.read();
    if (c == 'f') { // forward
    bu satır nedir ======> pinMode(38, OUTPUT);

  • Karıştı bir anlamı yok normalde x eksenin enable pini ramps 1.4 de...
  • abi bu kodu çözeyim optik enkoderda alıcam ama inad ettim sensorsüz
    çözmem lazım...
  • play station varmı demişsin var abicim... iki yıldır bu ajansta çalışıyorum açıp bir kere oynayacak vakit olmadı :)... Artnpars ismimiz merak edersen bak abi işlerimize...
  • bu satır ======> pinMode(38, OUTPUT);
    pinMode(38 , HIGH); veya LOW olması gerekir
  • son verdiğin kod f tuşuna basımca ileri 2 tur atar o kadar
  • Atmıyor abi kalıyor olduğu yerde açık konumda
  • sadece ileri kodunu tek çalıştır devamlı tur atması lazım o kısmı bi hallet f tuşunu filan boşver
  • Anladığım kadarıyla dönen bir platform var ve dönüyor. üzerine projektörle bir video yansıtılıyor. Açıya göre de video nun pozisyonu değişiyor..

    eğer yanlış anlamadıysam...
    Step motorla uğraşaçağınıza herhangi bir hızı ayarlanabilir motor kullanın. örneğin DC motor..

    anlık gerçek açıyı arduino ile okuyun ve seri olarak gönderin, video yu yönetin (sanırım PC yede program yazmalısınız)

    yapmanız gereken dönen platformun merkezine minik bir mıknatıs yerleştirip altınada şu entegreyi yanaştırmanız.[ AS5145H/AS5145A/AS5145B]

    360 derece için 12 bit absolute data veriyor

    Steple adım saydırarak da yaptırabilirsiniz. fakat örnek videonun 01:05 saniyesindeki gözlüklü arkadaş platformu eliyle döndürüyor o zaman step adım sayma olayı cortlar..

    saygılarımla...


  • Videodaki arkadaşta step motor kullanmış... O videoda bir yerde mekanizmayı gösteriyor ... Bence onlarda encoder kullanmış... Zaten benim elimle çevirmek gibi bir derdim yok.. Sadece videoyu herhangi bir anda stop yapıp başa sarınca platformda 0 noktasına dönmeli... Bunuda yapmak için motora gönderdiği pulse sayısını stop ettiğim anda çıkarmak...
  • Selamlar... İleri doğru gitmede bir problem yok şimdilik... Z değişkeni ile tur sayısını alıyorum. X = 0 ile de değişkeni 0 yapıyorumki başa dönsün sürekli tur atsın diye...
    Ama stop kodu çalıştıramadım.. Herhalde sonsuz döngüye girdiği için... Nereye yazarsam yazayım

    if (char == 's'){

    pinMode(X_ENABLE_PIN, LOW);


    }
    olmadı. Bir türlü durmuyor...

    Yazdığım kod

    //Test_Step.ino
    #define X_STEP_PIN 54
    #define X_DIR_PIN 55
    #define X_ENABLE_PIN 38
    int x;
    int z;
    long int gecikme = 75;
    void setup() {
    Serial.begin(9600);
    pinMode(X_STEP_PIN, OUTPUT);
    pinMode(X_DIR_PIN, OUTPUT);
    pinMode(X_ENABLE_PIN, LOW);

    }

    void loop() {


    char c;

    if (Serial.available())
    {
    c = Serial.read();


    if (c == 'f')
    {

    for (x =0; x < 400;x++ ){
    pinMode(X_ENABLE_PIN, OUTPUT);
    digitalWrite(X_STEP_PIN, HIGH);
    delay(gecikme);
    digitalWrite(X_STEP_PIN, LOW);
    delay(gecikme);

    if ( x == 399 ){
    pinMode(X_ENABLE_PIN, LOW);
    x = 0;
    z++;

    //Serial.println(z);


    }


    }
    }
    }
    }
    Copy paste değildir tamemiyle akıl yürütme.. Zaten bende bir yandan öğrenmek istiyorum böyle problemlerin çıkması iyi oluyor gibi geliyor banada...
  • switch case kullanarakmı yapmak lazım acaba ?
  • else if kullanmayı öğren, eğer s ise dur değilse hareket et şeklinde bir algoritma olacak
  • Else if kullansamda farketmiyor... Ben for ile bir döngü oluşturuyorum... int x e 0 değeri verip bu değeri her dörtcüze ulaştığında z değişkenine +1 değer veriyorum... Ve bu döngünün ben dur diyene kadar bitmesini istemiyorum... Ancak döngüye girdiğinde ne yaparsam yapayım dur komutunu işletemedim...

    for (x =0; x < 400;x++ ){
    pinMode(X_ENABLE_PIN, OUTPUT);
    digitalWrite(X_STEP_PIN, HIGH);
    delay(gecikme);
    digitalWrite(X_STEP_PIN, LOW);
    delay(gecikme);

    if ( x == 399 ){
    pinMode(X_ENABLE_PIN, LOW);
    x = 0;
    z++;

    bu kod sonsuz döngüye sokuyor... x = 0 ile sonsuz döndü oluşturdum. x = 0 kullanmayıp yaptığımda ise 400 adım gittikden sonra duruyor. Ben istiyorumki istediğim yerde 400 adıma varmadanda dur durabileyim. Yani döngüyü herhangi bir yerde kırabileyim.
  • for döngüsünden dan çıkmak için break komutu kullanılır, kurduğun döngü x=400 olana kadar devam eder. sen x=0 diyerek döngünün durmasına engel oluyorsun.
    bu şekilde bir kod yazdığında x==120 olduğunda enable pini ni low yapıp
    break konutu ile döngüden çıkar


    for (x =0; x < 400;x++ ){
    if (x==120){
    pinMode(X_ENABLE_PIN, LOW);
    break;
    }
    }
  • Peki motor dönmeye nasıl devam edecek ? Döngüden çıkınca 400 değeri kadar atım attırmış oluyor ve duruyor motor ... Döngü devam ederken sanırım serialden gelen komutu algılamıyor.. Döngü satırı içerisinde işlem devam ettiği için seriale bağlı olarak if ( c == 's') { pinMode(X_ENABLE_PIN, LOW); } komutunu nerede dallandırırsam dallandırayım hiç etki etmiyor... Benim hem motoru sürekli olarak sayılı adımlar ile döndürüp dur dediğimde ise sayılmış olan adımı 400 değerinden çıkartarak kalanıda tekrar geri vermem lazım ki eski pozisyonuna dönsün. Az buçuk bir kod bilgim var ama algoritma bilgim 0 olduğu için yazamıyorum kodu...
  • c = Serial.read(); komutunu döngünün içine al
  • c = Serial.read(); komutunu döngünün içine al demişsiniz.. Ozaman f girişini nasıl tanımlamış olacağım... Çünki döngü f girdisinden sonra başlıyor...
  • iki defa kullanacaksınız bir döngünün içinde, birde dışında
  • İçinde dışında birşey olmuyor valla.... her türlü konbini yaptım sanırım...
  • if (Serial.available())
    {
    c = Serial.read();
    }//parantezi buraya taşı

    bu şekilde yapmayı denedin mi, hem döngünün içinde hemde dışında, kapama parantezini hemen read den sonra koy
  • AccelStepper kütüphanesi sağolsun yardım etti :D
    Ama yinede hiç kütüphane kullanmadan yapmanında bir yolunu bulmam lazım.
    Teşekkürler...

    #include < AccelStepper.h>

    AccelStepper stepper(1, 54, 55);
    const int stepsPerRevolution = 200;
    int spd ;
    int sign;
    int x;
    void setup()
    {
    Serial.begin(9600);
    stepper.setMaxSpeed(100.0);
    stepper.setAcceleration(10.0);
    }

    void loop()
    {
    stepper.runSpeed();

    char c;
    if (Serial.available()) {
    c = Serial.read();

    }

    if (c == 'f') {
    pinMode(38, OUTPUT);
    sign = 1;
    spd = 100;
    c = Serial.read();
    x = abs(stepper.distanceToGo()%400);


    }


    if (c == 'r')
    {


    pinMode(38, OUTPUT);
    stepper.runToNewPosition('x');
    pinMode(38, LOW);

    }


    if (c == 's') {
    x = abs(stepper.distanceToGo()%400);
    pinMode(38, LOW);
    sign = 0;
    c = Serial.read();

    }
    stepper.setSpeed(spd * sign);

    }

  • Break; Komutunu kullanmayı yanlış anladığım için yapamıyormuşum... Kodu şöyle yazınca tam olarak oldu istediğim.

    //Test_Step.ino
    #define X_STEP_PIN 54
    #define X_DIR_PIN 55
    #define X_ENABLE_PIN 38
    int x;
    int z;
    long int gecikme = 75/12;
    void setup() {
    Serial.begin(9600);
    pinMode(X_STEP_PIN, OUTPUT);
    pinMode(X_DIR_PIN, OUTPUT);
    pinMode(X_ENABLE_PIN, LOW);

    }

    void loop() {


    char c;

    if (Serial.available()>0)
    {
    c = Serial.read();
    }

    if (c == 'f')
    {

    for (x =0; x < 400;x++ ){

    pinMode(X_ENABLE_PIN, OUTPUT);
    digitalWrite(X_STEP_PIN, HIGH);
    delay(gecikme);
    digitalWrite(X_STEP_PIN, LOW);
    delay(gecikme);
    c = Serial.read();
    if(c == 'd'){break;} // Eğer d ye basarsam kod duruyor... ve istersem d ya bastıktan sonra istediğim kod bloğunu işlete bilirim...
    Serial.println(x);
    if ( x == 399)
    {
    Serial.println(x);
    x = 0;
    z++;

    }


    }
    }
    }
  • Buradada kodun tamamlanmış hali var... Mutluyum öz güven tavan yaptı :P


    //Test_Step.ino
    #define X_STEP_PIN 54
    #define X_DIR_PIN 55
    #define X_ENABLE_PIN 38
    int x;
    int z;
    long int gecikme = 75/12;
    void setup() {
    Serial.begin(9600);
    pinMode(X_STEP_PIN, OUTPUT);
    pinMode(X_DIR_PIN, OUTPUT);
    pinMode(X_ENABLE_PIN, OUTPUT);
    }

    void loop() {
    char c;
    if (Serial.available()>0)
    {
    c = Serial.read();
    }

    if (c == 'f') // İleri Gitme
    {


    for (x =1; x < 401;x++ ){

    pinMode(X_ENABLE_PIN, HIGH);
    digitalWrite(X_DIR_PIN , HIGH);
    digitalWrite(X_STEP_PIN, HIGH);
    delay(gecikme);
    digitalWrite(X_STEP_PIN, LOW);
    delay(gecikme);
    c = Serial.read();
    if(c == 'd'){ // Duruyor
    z = x+1;
    // Serial.print("Kalan : ");
    // Serial.println(z);
    c = Serial.read();
    pinMode(X_ENABLE_PIN, LOW);
    break;
    }
    // Serial.println(x);
    if ( x == 400)
    {
    c = Serial.read();
    x = 0;
    }
    }
    }
    if ( c == 'r')
    { //Geri Sarma

    while (z >=1){

    pinMode(X_ENABLE_PIN, HIGH);
    digitalWrite(X_DIR_PIN , LOW);
    digitalWrite(X_STEP_PIN, HIGH);
    delay(gecikme);
    digitalWrite(X_STEP_PIN, LOW);
    delay(gecikme);


    // Serial.print("Geriye Sariyor :");
    // Serial.println(z);
    z--;

    }
    //Serial.print("Z:");
    // Serial.println(z);
    }
    }


    Kodu sadeleştirmek ve daha akıcı olmasını sağlayacak arkadaşların desteklerinide beklerim ... Hem konuya daha vakıf olurum düşüncesindeyim...
  • Herkese merhaba...

    Daha önce belirtmiştim... Ben bu motoru midi ile kullancağım diye... Midi kütüphanesi ile uğraşmak yerine aklıma şöyle birşey geldi... Elimdeki midi cihaz Launch Pad.... Cihazın midi mesajını terminal ile bit olarak okuyabiliyorum...

    Örnek olarak bir tuşa bastığımda ;
    Binary 101100000011110001111111 , Decimal 11549823 bir veri aldım.
    Daha önce hiç binary ile çalışmadım ama bende şöyle bir kod denedim.


    unsigned long a;


    void setup() {
    Serial.begin(115200);
    pinMode(LED_BUILTIN, OUTPUT);


    }

    void loop() {

    if (Serial.available())
    {
    a = Serial.read();
    }
    if (a == 11549823 )
    {
    digitalWrite(LED_BUILTIN, HIGH);
    delay(1000);
    digitalWrite(LED_BUILTIN, LOW);
    delay(1000);
    }
    }

    Tabi led yanıp sönmedi... Nasıl bir çevirim yapmam gerektiğini pek anlayamadım... B harfi ile baslattığımda ise 8 bit veri yazabiliyorum.. Tek bir seferde bu 24 bit veriyi nasıl karşılaştırma yapabilirim ?

    Teşekkürler..
  • Veriler serialden 1 byte olarak geliyormuş... Yani ben hatalı düşünmüşüm... Midi mesajıda 24 bit değil üç ayrı byte olarak geliyormuş... Bu üç ayrı byte veriyi üç ayrı değişkene atayarak problemi çözmüş oldum...
  • Selamlar Midi kodlarıda ekledim.. Ch Note Velocity olarak gelen veriyi karşılaştırarak motorun belir bir Rpm de dönmesini durmasını ve eski pozisyona geri dönmesini sağladım...
    Kodları kendi kendime bilgim dahilinde yazdım . Baya araştırma sonucunda istediğim oldu.. Ancak yazdığım kodları bu konuda daha iyi birisi sadeleştire bilir belki ben gereksiz ya da çok dolaylı bir yolla yapmış olabilirim... Yardımcı olursanız sevinirim...
    Teşekkürler...


    #define X_STEP_PIN 54
    #define X_DIR_PIN 55
    #define X_ENABLE_PIN 38
    float x;
    float z;

    float gecikme = 75/16;
    byte commandByte;
    byte noteByte;
    byte velocityByte;
    byte noteOn = 144;


    void setup() {
    Serial.begin(38400);
    pinMode(X_STEP_PIN, OUTPUT);
    pinMode(X_DIR_PIN, OUTPUT);
    pinMode(X_ENABLE_PIN, OUTPUT);
    pinMode(X_ENABLE_PIN, LOW);

    }

    void checkMIDI(){
    do{
    if (Serial.available()){
    commandByte = Serial.read();//read first byte
    noteByte = Serial.read();//read next byte
    velocityByte = Serial.read();
    }
    }
    while (Serial.available() > 2);
    }


    void loop() {

    if (Serial.available()>2)
    {
    commandByte = Serial.read();//read first byte
    noteByte = Serial.read();//read next byte
    velocityByte = Serial.read();
    }

    if (commandByte == 144 && noteByte == 41 && velocityByte > 0) // Ch1 Note 41 Velocity 0'dan Yüksek
    {

    digitalWrite(X_DIR_PIN , HIGH);
    delayMicroseconds(10);
    pinMode(X_ENABLE_PIN, HIGH);
    delayMicroseconds(5);

    for (x =1; x < 400;x++ ){

    digitalWrite(X_STEP_PIN, HIGH);
    delay(gecikme);
    digitalWrite(X_STEP_PIN, LOW);
    delay(gecikme);
    checkMIDI();
    if(commandByte == 144 && noteByte == 73 && velocityByte > 0){
    delay(5);
    z = x;

    checkMIDI();
    pinMode(X_ENABLE_PIN, LOW);
    delayMicroseconds(5);
    break;
    }

    if ( x == 399)
    {
    // c = Serial.read();
    x = 0;
    Serial.flush();
    }
    }
    }
    if ( commandByte == 144 && noteByte == 42 && velocityByte > 0)

    { //Geri Sarma

    digitalWrite(X_DIR_PIN , LOW);
    delayMicroseconds(10);
    pinMode(X_ENABLE_PIN, HIGH);
    delayMicroseconds(5);
    while (z >=0){
    int tanj = z/2;
    checkMIDI();

    if ( commandByte == 144 && noteByte == 73 && velocityByte > 0)
    {
    pinMode(X_ENABLE_PIN, LOW);
    delayMicroseconds(10);
    break;
    }

    digitalWrite(X_STEP_PIN, HIGH);
    delay(800/(tanj*2)+1);
    digitalWrite(X_STEP_PIN, LOW);
    delay(800/(tanj*2)+1);

    z--;



    if (z == 0){
    delay(100);
    pinMode(X_ENABLE_PIN, LOW);
    delayMicroseconds(10);
    }
    }

    }
    }


Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Login with Facebook
Açık kaynak kültürü gereği, çözdüğünüz problemlerin çözümlerini paylaşmayı lütfen unutmayın.