Sterowanie - nadajnik

Jak zaprogramować sterowanie dla swojego jachtu?

5/11/20262 min lesen

W RC sailing postawiliśmy na dobrze wszystkim znane Arduino w wersji Nano. Zarówno po stronie pilota-nadajnika jak i jachtu-odbiornika.

Nic nie stoi jednak na przeszkodzie aby zastosować inne mikrokontrolery takie jak ESP32, Raspberry Pico, STM32 i wiele innych.

Aby rozpocząć przygodę z programowaniem zdalnie sterowanych modeli potrzebne nam jest środowisko programistyczne. W naszym przypadku Arduino IDE dostępne do pobrania za darmo ze strony producenta: arduino.cc/en/software

Po otworzeniu programu należy utworzyć nowy szkic, który powinien wyglądać tak jak na zdjęciu tytułowym. Zgodnie z opisami ze zdjęcia w odpowiednie miejsca wpisujemy kod, który chcemy żeby mikroprocesor wykonał raz lub który ma wykonywać się w pętli.

Ponadto, przed "void setup" należy załączyć biblioteki, które chcemy wykorzystać, w naszym przypadku na pewno będzie to biblioteka NRF24L01.h i RF24.h. Zawierają one predefiniowane funkcje i ustawienia związane z wybranym przez nas modułem radiowym.

Na początku trzeba również zdefiniować, które piny mikrokontrolera odpowiadają za jakie sygnały.
W przypadku niżej zamieszczonego kodu definiujemy pin D9 i D10 jako CE i CSN co jest kluczowe w kwestii działania modułu radiowego, dokładniejsze omówienie na blogu poświęconym NRF24L01.

Definiujemy również adres komunikacji między nadajnikiem i odbiornikiem, dowolny ciąg, byleby taki sam po stronie nadajnika i odbiornika. 

Definiujemy również dwa wejścia analogowe dzięki którym przetworzymy sygnał z joysticka/potencjometru na użyteczną wartość liczbową aby sterować jachtem. 

Podany niżej kod odpowiada za stronę nadajnika, odbiornik został omówiony w następnym artykule. 


#include <SPI.h>

#include <nRF24L01.h>

#include <RF24.h>

#define CE_PIN 9

#define CSN_PIN 10

const byte slaveAddress[5] = "00001";

const byte JoyX = A1;

const byte JoyY = A2;

RF24 radio(CE_PIN, CSN_PIN); // Create a Radio

struct Data

{

int16_t x;

int16_t y;

};

Data dataToSend;

void setup() {

Serial.begin(9600);

Serial.println("SimpleTx Starting");

radio.begin();

radio.setDataRate( RF24_250KBPS );

radio.setRetries(3,5); // delay, count //radio.setRetries(3,5); // delay, count

radio.openWritingPipe(slaveAddress);

radio.stopListening();

}

void loop() {

send();

}

void send()

{

bool rslt;

int16_t Val1=map(analogRead(JoyX),0, 1023, 0, 120);

int16_t Val2=map(analogRead(JoyY),0, 1023, 0, 180);

dataToSend.x = Val1;

dataToSend.y = Val2;

rslt = radio.write( &dataToSend, sizeof(dataToSend) );

Serial.print("Joy X : ");

Serial.println(dataToSend.x);

Serial.print("Joy Y : ");

Serial.println(dataToSend.y);

if (rslt)

{

Serial.println(" Acknowledge received");

}

else

{

Serial.println(" Tx failed");

}

}