SPİ L293D MOTOR SÜRÜCÜ +NRF24L01

karavela

Aktif Üye
Katılım
7 Temmuz 2022
Mesajlar
110
Elimde aşağıdaki motor sürücü shield var. 4 motorlu bir rc arac yapacağım. Nrf24l01 ile kumanda yapıyordum ama shield takınca Arduino nun miso mosi sck pinlerini shift register a bağlı olduğu için kullanamıyorum. Eski projelerimden bildigim kadarıyla paralel olarak bağlasam ikisi aynı anda çalışmaz. Miso yu serbest birakmak için spitransfer(0) yaparak çalıştırmistim eskiden böyle yapınca da bir biri sonra digeri çalışıyor. Stabil çalışmıyor. Araç için bunu kullanımıyorum yani. Spi pinlerini değiştirme yöntemi var mı(shiel üzerinde rx tx 0,1 ve 2 pinleri boş bir de analog pinleri boş varsa da bunları tanimlarsam Arduino sorun çıkarır mı)?
 
Son düzenleme:
Spi bit-bang, software spi diye bahsediliyor bundan. Max hız düşer, işlemciyi de daha fazla meşgul eder.
Biri kütüphane haline getirip paylaşmış: softwarespi
 
IMG_20230701_151804-min.jpg

aşağıdaki motor sürücü shield
 
Spi bit-bang, software spi diye bahsediliyor bundan. Max hız düşer, işlemciyi de daha fazla meşgul eder.
Biri kütüphane haline getirip paylaşmış: softwarespi
kütüphaneyi güzel yazmış adam sade anlaşılır olmuş ama sadece 8bit spi çalışır bu anladığım kadarıyla öyle yani

ama nrf24'ler 16bit spi kullanıyor.
 
kütüphaneyi güzel yazmış adam sade anlaşılır olmuş ama sadece 8bit spi çalışır bu anladığım kadarıyla öyle yani

ama nrf24'ler 16bit spi kullanıyor.
Atmegadaki spi birimi de 8bit çalışıyor ama değil mi? O zaman zaten nrf24'ü software ile 16 bit mi sürmek gerekir? Bunun için bu hazır kütüphane düzenlenebilir belki.
 
Atmegadaki spi birimi de 8bit çalışıyor ama değil mi? O zaman zaten nrf24'ü software ile 16 bit mi sürmek gerekir? Bunun için bu hazır kütüphane düzenlenebilir belki.
C++:
#define bit_len 16
byte rec = 0;
    for (int i = 0; i < bit_len; i++) {
        digitalWrite(_pin_mosi, bitRead(b, 15-i)); //MSB first
        digitalWrite(_pin_sck, HIGH);
        bitWrite(rec, 15-i, digitalRead(_pin_miso));
        digitalWrite(_pin_sck, LOW);
    }
oldu galiba denemek lazım
 
Kütüphane hoşuma gitmedi değiştirdim biraz fazladan 2 komut var neden var onuda analamadım gayet rahat yerleştirilebilir aslında.
C:
#include "SoftwareSPI.h"
#define bit_len 16

SoftwareSPI::SoftwareSPI(byte pin_sck, byte pin_mosi, byte pin_miso, byte pin_cs) {
    _pin_sck = pin_sck;
    _pin_mosi = pin_mosi;
    _pin_miso = pin_miso;
    _pin_cs = pin_cs;
}

void SoftwareSPI::begin() {
    pinMode(_pin_cs, OUTPUT);

    pinMode(_pin_sck, OUTPUT);
    pinMode(_pin_mosi, OUTPUT);
    pinMode(_pin_miso, INPUT);
}

byte SoftwareSPI::transfer(byte b) {
    digitalWrite(_pin_cs,LOW);//CHIP SELECT ON
    byte rec = 0;

    for (int i = 0; i < bit_len ; i++) {
        digitalWrite(_pin_mosi, bitRead(b, 15-i)); //MSB first
        digitalWrite(_pin_sck, HIGH);
        bitWrite(rec, 15-i, digitalRead(_pin_miso));
        digitalWrite(_pin_sck, LOW);
    }
   
    digitalWrite(_pin_cs,HIGH);//CHIP SELECT OFF
    return rec;
}

/*
void SoftwareSPI::select() {
    digitalWrite(_pin_cs,LOW);
}
*/
/*
void SoftwareSPI::deselect() {
    digitalWrite(_pin_cs,HIGH);
}
*/
bu düzenleme ile "select()" ve "deselect()" komutlarından kurtulmuş olmamız lazım.
sadece "transfer(x)" komutuyla oldu.

hem 8 bit hemde 16 bit 2 farklı hale büründürebiliriz elimde spi ile çalışan birşey bulunca yaparım
 
Kütüphane hoşuma gitmedi değiştirdim biraz fazladan 2 komut var neden var onuda analamadım gayet rahat yerleştirilebilir aslında.
C:
#include "SoftwareSPI.h"


byte SoftwareSPI::transfer(byte b) {
bu düzenleme ile "select()" ve "deselect()" komutlarından kurtulmuş olmamız lazım.
sadece "transfer(x)" komutuyla oldu.

hem 8 bit hemde 16 bit 2 farklı hale büründürebiliriz elimde spi ile çalışan birşey bulunca yaparım
fonksiyon başlığını da "byte"tan "unsigned int" ile çalışacak şekilde değiştirmek lazım hem de fonsiyonun kabul ettiği değişken de unsigned int olmalı. "byte rec" diye geçen değişken de "unsigned int" olmalı. select deselecti isteğe bağlı kullanılsın diye ayrı yazmış. Ama nrf24'ün software spi ile kullanıldığı bu module özgü kütüphaneler de varmış.

Aşağıdaki bağlantıda örnekleri var. kullanılan kütüphaneye bağlantı da var. Ben hiç kullanmadığımdan tecrübe paylaşamayacağım. Hevesle aldığım nrf24 zaman darlığından kutuda bekliyor ne zamandır.
 
fonksiyon başlığını da "byte"tan "unsigned int" ile çalışacak şekilde değiştirmek lazım hem de fonsiyonun kabul ettiği değişken de unsigned int olmalı. "byte rec" diye geçen değişken de "unsigned int" olmalı. select deselecti isteğe bağlı kullanılsın diye ayrı yazmış. Ama nrf24'ün software spi ile kullanıldığı bu module özgü kütüphaneler de varmış.

Aşağıdaki bağlantıda örnekleri var. kullanılan kütüphaneye bağlantı da var. Ben hiç kullanmadığımdan tecrübe paylaşamayacağım. Hevesle aldığım nrf24 zaman darlığından kutuda bekliyor ne zamandır.
nrf24 dile gelse "yemin ederim çalışacağım" dese yine de kullanmam.
berbat bir modül asla kararlı çalışmıyor.
 
Teşekkürler. Bu motor sürücü modülünün spi ile bir ilgisi var mıdır yoksa pin olarak mı seçmişler. Alakası yok ise bunun kütüphanesinden 11 ve 12 ile bağlantısını kesip başka bir yere ayarlasam pinlerini kesip kullansam mantıklı olur mu
 
nrf24 dile gelse "yemin ederim çalışacağım" dese yine de kullanmam.
berbat bir modül asla kararlı çalışmıyor.
Ben de bu motor sürücü elime geçince rc arac yapayım dedim Bluetooth kısa mesafe olduğu için ucuza uzun mesafe olduğu için nrf satın aldım:) ucuz olmasının etkisi haberleşme modüllerinde kendini çok belli ediyormuş.
 
Teşekkürler. Bu motor sürücü modülünün spi ile bir ilgisi var mıdır yoksa pin olarak mı seçmişler. Alakası yok ise bunun kütüphanesinden 11 ve 12 ile bağlantısını kesip başka bir yere ayarlasam pinlerini kesip kullansam mantıklı olur mu
Ya da bu dip soketinden l293d yi zarar vermeden sökmemin bir yolu var mı tamamen sıkışmış. Çıkarıp ayrı bir devre kurarım öyle kullanırım.
 
çok daha yararlı olacak 433mhz tx rx modüller ile kumanda yapabilirsin daha kararlı daha ucuz ve sadece 1 pin kullanıyor alıcı da verici de.
 
çok daha yararlı olacak 433mhz tx rx modüller ile kumanda yapabilirsin daha kararlı daha ucuz ve sadece 1 pin kullanıyor alıcı da verici de.
Keşke sorup alsaydım yapacak birşey yok. Bakıp onlardan alırım. Sökmem için bildiğiniz yol var mı ben denedim çok zorlamak istemedim kırılır diye.
 
Keşke sorup alsaydım yapacak birşey yok. Bakıp onlardan alırım. Sökmem için bildiğiniz yol var mı ben denedim çok zorlamak istemedim kırılır diye.
kenarından azcık cımbız sok yukarı kaldır diğer kenarından da aynı şeyi sıra sıra kaldıra kaldıra git.
ama nrf ile uğraşmanı ben tavsiye etmem yine de kolay gelsin
 
h file:
/*file:SoftwareSPI.h
 * author:julianh2o
 * edited:ahmet
 * edit? add 8-16 bit function and automatic chip select(remove select and deseclt command)
 */

#ifndef SoftwareSPI_h
#define SoftwareSPI_h

#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif

class SoftwareSPI {
public:
    SoftwareSPI(byte, byte, byte);
    void begin();
    byte transfer8(byte);
    byte transfer16(byte);//edit add
//edit remove    void select();
//edit remove    void deselect();

private:
    byte _pin_sck;
    byte _pin_mosi;
    byte _pin_miso;
    byte _pin_cs;
};

#endif


cpp:
/*file:SoftwareSPI.cpp
 * author:julianh2o
 * edited:ahmet
 * edit? add 8-16 bit function and automatic chip select(remove select and deseclt command)
 */

#include "SoftwareSPI.h"
#define bit_len8 8
#define bit_len16 16

SoftwareSPI::SoftwareSPI(byte pin_sck, byte pin_mosi, byte pin_miso, byte pin_cs) {
    _pin_sck = pin_sck;
    _pin_mosi = pin_mosi;
    _pin_miso = pin_miso;
    _pin_cs = pin_cs;
}

void SoftwareSPI::begin() {
    pinMode(_pin_cs, OUTPUT);

    pinMode(_pin_sck, OUTPUT);
    pinMode(_pin_mosi, OUTPUT);
    pinMode(_pin_miso, INPUT);
}

//==================8 BIT TRANSFER===========================
byte SoftwareSPI::transfer8(byte b) {
    byte rec8 = 0;
    digitalWrite(_pin_cs,LOW);
   
    for (int i = 0; i < bit_len8; i++) {
        digitalWrite(_pin_mosi, bitRead(b, 7-i)); //MSB first
        digitalWrite(_pin_sck, HIGH);
        bitWrite(rec8, 7-i, digitalRead(_pin_miso));
        digitalWrite(_pin_sck, LOW);
    }
    digitalWrite(_pin_cs,HIGH);
    return rec8;
}
//==================8 BIT TRANSFER===========================


//==================16 BIT TRANSFER===========================
byte SoftwareSPI::transfer16(byte b) {
    byte rec16 = 0;
    digitalWrite(_pin_cs,LOW);
   
    for (int i = 0; i < bit_len16; i++) {
        digitalWrite(_pin_mosi, bitRead(b, 15-i)); //MSB first
        digitalWrite(_pin_sck, HIGH);
        bitWrite(rec16, 15-i, digitalRead(_pin_miso));
        digitalWrite(_pin_sck, LOW);
    }
    digitalWrite(_pin_cs,HIGH);
    return rec16;
}
//==================16 BIT TRANSFER===========================

/*
void SoftwareSPI::select() {  //REMOVE
    digitalWrite(_pin_cs,LOW);
}
*/

/*
void SoftwareSPI::deselect() {  //REMOVE
    digitalWrite(_pin_cs,HIGH);
}
*/

kütüphaneyi hem 8 hem 16 bit spi çalışacak şekilde düzenledim;
@taydin @semih_s @ozkarah olabildiğince düşünüp düzenlemeyi denedim ama var mı bir hatam?
 
X:
byte SoftwareSPI::transfer16(byte b) {
    byte rec16 = 0;

byte değişken 8bit olduğundan taşma yapar sonra ne olur kimbilir.

X:
unsigned int SoftwareSPI::transfer16(unsigned int b) {
    unsigned int rec16 = 0;

Olmalı 16 bit için header dosyasında da gerekli düzenleme yapmalı . 16 bit değişkeni 8 bitlik iki posta göndermek çalışmaz mı?
 
@semih_s nin dediğine ilave olarak, select ve deselect'i kaldırmaman lazım. Kaldırınca auto increment ile birçok word'ün peş peşe yazılmasını imkansız hale getiriyorsun.

Bir de şunu belirteyim. Burada yaptığın değişiklikler kapsamlı değil, ama ola ki bir projede sayı olarak fazlaca değişiklik yapacaksan, en iyisi github'da o projeyi "fork" etmek (https://github.com/Flickerstrip/SoftwareSPI). Sonra kendi forkun üzerinde çalışmaya devam edersin. Yaptığın değişiklikleri de orijinal projeye teklif edebilirsin (pull request) veya yaptığın değişiklikleri çok etkili bir şekilde gösterebilirsin.

Mesela ben FreeRTOS-Plus-TCP yi kullanıyorum şu anda üzerinde çalıştığım projede. Ama derlerken sinir bozucu birçok warning var. Ben de ne yaptım. Bu depoyu "fork" ladım. Warning'leri düzelttim. Sonra da değişiklikleri adamlara pull request ile önerdim. İsterlerse alırlar isterlerse almazlar.

 
Eğer github'da bir commit açık iken, URL sonuna .diff ilave edilirse, linux diff formatında tek bir dosya olarak farklar alınabiliyor.

Diff:
diff --git a/source/FreeRTOS_IP.c b/source/FreeRTOS_IP.c
index 0b174b031..0b541b326 100644
--- a/source/FreeRTOS_IP.c
+++ b/source/FreeRTOS_IP.c
@@ -1651,8 +1651,8 @@ static eFrameProcessingResult_t prvProcessIPPacket( IPPacket_t * pxIPPacket,
                         pxIPHeader->usLength = FreeRTOS_htons( FreeRTOS_ntohs( pxIPHeader->usLength ) - optlen );
 
                         /* Rewrite the Version/IHL byte to indicate that this packet has no IP options. */
-                        pxIPHeader->ucVersionHeaderLength = ( pxIPHeader->ucVersionHeaderLength & 0xF0U ) | /* High nibble is the version. */
-                                                            ( ( ipSIZE_OF_IPv4_HEADER >> 2 ) & 0x0FU );
+                        pxIPHeader->ucVersionHeaderLength = ( uint8_t )( ( pxIPHeader->ucVersionHeaderLength & 0xF0U ) | /* High nibble is the version. */
+                                                            ( ( ipSIZE_OF_IPv4_HEADER >> 2 ) & 0x0FU ) );
                     }
                 #else /* if ( ipconfigIP_PASS_PACKETS_WITH_IP_OPTIONS != 0 ) */
                     {
diff --git a/source/FreeRTOS_Sockets.c b/source/FreeRTOS_Sockets.c
index 3b50f71c7..eece12eba 100644
--- a/source/FreeRTOS_Sockets.c
+++ b/source/FreeRTOS_Sockets.c
@@ -1878,7 +1878,7 @@ BaseType_t FreeRTOS_setsockopt( Socket_t xSocket,
 
                 if( pvOptionValue == NULL )
                 {
-                    pxSocket->ucSocketOptions &= ~( ( uint8_t ) FREERTOS_SO_UDPCKSUM_OUT );
+                    pxSocket->ucSocketOptions &= ( uint8_t )(~FREERTOS_SO_UDPCKSUM_OUT);
                 }
                 else
                 {
diff --git a/source/FreeRTOS_TCP_Reception.c b/source/FreeRTOS_TCP_Reception.c
index 9ce1c08c4..07e0dba6c 100644
--- a/source/FreeRTOS_TCP_Reception.c
+++ b/source/FreeRTOS_TCP_Reception.c
@@ -331,14 +331,14 @@
                          */
                         if( pucPtr[ 0U ] == tcpTCP_OPT_SACK_A )
                         {
-                            ucLen -= 2U;
+                            ucLen -= 2;
                             lIndex += 2;
 
                             while( ucLen >= ( uint8_t ) 8U )
                             {
                                 prvReadSackOption( pucPtr, ( size_t ) lIndex, pxSocket );
                                 lIndex += 8;
-                                ucLen -= 8U;
+                                ucLen -= 8;
                             }
 
                             /* ucLen should be 0 by now. */
 

Çevrimiçi üyeler

Forum istatistikleri

Konular
5,844
Mesajlar
99,713
Üyeler
2,481
Son üye
rfdog12

Son kaynaklar

Son profil mesajları

gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Back
Top