Non mi permetterei mai di pretendere qualcosa, tantomeno, una rapidissima risposta (magari celere ma non pretesa).
Come dicevo in apertura, il tutto funziona discretamente, considerando che non è farina del mio sacco, ma io mi limito solo a mettere assieme i vari listati che trovo (provandoli prima separatamente) in rete.
Parto con la parte trasmittente :
/*
* Modulo TX con due Joysticks
* 433Mhz Joy1 Joy2
* D12 A0 A4
* A1 A5
* 5V 5V 5V
*/
#include <VirtualWire.h>
#include <stdio.h>//libreria necessaria per la funzione dtostrf
int JoyStick_X = 0; //x
int JoyStick_Y = 1; //y
int JoyStick_SX = 4; //sx
int JoyStick_SY = 5; //sy
char moto[9];
String motore;
String joy;
char serv[9];
String servo;
String sjoy;
void setup()
{
// pinMode(JoyStick_Z, INPUT);
Serial.begin(9600); // Debugging only
Serial.println("setup");
vw_set_tx_pin(12);
// Initialise the IO and ISR
vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(2000); // Bits per sec
}
void loop()
{
//..............istruzioni per il motore joystick n. 1
char xris[5]; //definisco il buffer che conterra' il valore del float convertito in stringa
int x,y,z;
x=analogRead(JoyStick_X);
y=analogRead(JoyStick_Y);
// z=digitalRead(JoyStick_Z);
x=map(x,0,1023,255,-255);
y=map(y,0,1023,255,-255);
dtostrf(x, 5, 2, xris);//converto da voltage (float) a risultato (char)
joy= String(xris);
motore = String("AV");
motore += joy;
motore.toCharArray(moto, 9);
//send(moto);//trasmetto via rf il contenuto di risultato (char)
//..............istruzioni per il SERVO joystick n. 2
char sxris[5]; //definisco il buffer che conterra' il valore del float convertito in stringa
int sx,sy,sz;
sx=analogRead(JoyStick_SX);
sy=analogRead(JoyStick_SY);
sx=map(sx,0,1023,180,0);
sy=map(sy,0,1023,180,0);
dtostrf(sx, 5, 2, sxris);//converto da voltage (float) a risultato (char)
sjoy= String(sxris);
servo = String("SV");
servo += sjoy;
servo.toCharArray(serv, 9);
send(moto);//trasmetto via rf il contenuto di risultato (char)
send(serv);//trasmetto via rf il contenuto di risultato (char)
Serial.print (serv); Serial.print ("---"); Serial.println(moto);
}
void send (char *xris)
{
digitalWrite(13, true); // Flash a light to show transmitting
vw_send((uint8_t *)moto, strlen(moto));
vw_wait_tx(); // Wait until the whole message is gone
vw_send((uint8_t *)serv, strlen(serv));
vw_wait_tx();
digitalWrite(13, false);
delay(2);
}
Tengo a precisare che tutti e due i listati vanno puliti ulteriormente soprattutto da variabili inutili che sono rimaste appese dopo le varie prove.
Quella che mi sta facendo impazzire è la parte ricevente:
/*
* Modulo RX 433Mhz
* D11
* Modulo L298N
* D6 - D7 - D10
* Mini servo
* D2
*/
#include <VirtualWire.h>
#include <SoftwareServo.h>
SoftwareServo servo1;
char moto[11];
String motor;
String vm; //variabile indicante i primi due caratteri della stringa ricevuta (AV = motore SV = Servo)
String pa; //variabile indicante gli ultimi caratteri valori
//Motore ---> pin ai quali va collegato il modulo del motore
int dir1PinA = 7;
int dir2PinA = 6;
int speedPinA = 10;
unsigned long time;
int speed;
int dir;
void setup ()
{
Serial.begin(9600);
servo1.attach(2);
servo1.setMaximumPulse(2200); // attaccare il servo al pin D2
pinMode (dir1PinA, OUTPUT);
pinMode (dir2PinA, OUTPUT);
pinMode (speedPinA, OUTPUT);
//pinMode(JoyStick_Z, INPUT);
vw_set_rx_pin(11); // Initialise the IO and ISR
vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(2000); // Bits per sec
vw_rx_start(); // Start the receiver PLL running
time = millis ();
speed = 0;
dir = 1;
}
void loop ()
{
static int value = 0;
float t;
float f;
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Non-blocking
{
int i;
digitalWrite(13, true); // Flash a light to show received good message
// Message with a good checksum received, dump it.
Serial.print("Ricevo: ");
for (i = 0; i < buflen; i++)
{
moto[i] = char(buf[i]);
}
motor = String (moto);
digitalWrite(13, false);
vm =(motor.substring(0,2));
pa =(motor.substring(2,11));
int value = pa.toInt();
if ((vm == "AV") && (value >0))
{
digitalWrite (dir1PinA , LOW);
digitalWrite (dir2PinA, HIGH);
analogWrite (speedPinA, value);
Serial.print(" AVANTI --> ");
Serial.println(value);
delay (25);
}
if ((vm == "AV") && (value <0))
{
value = -value;
digitalWrite (dir1PinA , HIGH);
digitalWrite (dir2PinA, LOW);
analogWrite (speedPinA, value);
Serial.print(" INDIETRO --> ");
Serial.println(value);
delay(25);
}
if (vm == "SV")
{
int value = motor.substring(2,11).toInt(); //converte in intero la sottostringa
servo1.write(value);// invia i valori al servo
Serial.print(" SERVO --> ");
Serial.println(value);
}
}
memset(moto, 0, sizeof(moto));// Resetta la stringa ricevuta
SoftwareServo::refresh();
Ripeto il problema risiede nel fatto che il motorino dovrebbe girare alla velocità da 0 a 255 (secondo i valori del Joystick, ma gira solo quando il valore è 255. Facendo un'altra prova con questo listato
// connect motor controller pins to Arduino digital pins
// motor one
int enA = 10;
int in1 = 9;
int in2 = 8;
// motor two
int enB = 5;
int in3 = 7;
int in4 = 6;
void setup()
{
// 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);
}
void demoOne()
{
// this function will run the motors in both directions at a fixed speed
// turn on motor A
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
// set speed to 200 out of possible range 0~255
analogWrite(enA, 200);
// turn on motor B
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
// set speed to 200 out of possible range 0~255
analogWrite(enB, 200);
delay(2000);
// now change motor directions
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
delay(2000);
// now turn off motors
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
void demoTwo()
{
// this function will run the motors across the range of possible speeds
// note that maximum speed is determined by the motor itself and the operating voltage
// the PWM values sent by analogWrite() are fractions of the maximum speed possible
// by your hardware
// turn on motors
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
// accelerate from zero to maximum speed
for (int i = 0; i < 256; i++)
{
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}
// decelerate from maximum speed to zero
for (int i = 255; i >= 0; --i)
{
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}
// now turn off motors
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
void loop()
{
demoOne();
delay(1000);
demoTwo();
delay(1000);
}
funziona egregiamente.