433Mhz ,Radio comando per motorino

Salve, rieccomi di nuovo a riproporvi un problema che avevo già sottoposto alla vostra cortese attenzione, ma che malauguratamente, data la mia inesperienZA, ho inavvertitamente cancellato. Passo al dunque senza tanti fronzoli inutili.

  1. ho assemblato un telecomando con un trasmettitore a 433 Mhz e due joystick.
  2. la parte ricevente ha oltre al suo ricevitore 433Mhz ha anche un motorino DC (due fili) gestito da un modulo L298N, ed un servo.
    il tutto funziona bene (o quasi), i valori dei due joy arrivano alla parte ricevente, e il servo funziona, ma il motorino, invece, gira solo ad alta velocità (ovvero quando il valore è 255)
    Da considerare che creando un ciclo "for" da 0 a 255, il motorino gira a velocità relativa alla variabile imposta nell'"analogWrite (speedPinA, value)".
    portata (copiata) nella sua e cioè questa:
if ((vm == "AV") && (value >0))
{
        digitalWrite (dir1PinA , LOW); 
        digitalWrite (dir2PinA, HIGH); 
        analogWrite (speedPinA, value);
                            delay (25);
}

non funziona.
Se qualcuno interessato a darmi una mano, posso postare il listato completo. Grazie Francesco

Non vi affollate a rispondere! uno la volta, grazie!

Non e' che si possa pretendere un aiuto in 24h :wink:

In ogni caso il codice magari tu postalo in ogni caso (sia lato tx che rx, il bug puo' essere ovunque) e anche lo schema del circuito...

Vedrai che qualcuno ti aiuta, aiutano tutti qui

Come pretendi una risposta se non vediamo né schema, né sketch?

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.

:o purtroppo con fritzing non riesco a trovare i componenti e non riesco a fare un disegno delle connessioni, altrimenti sarebbe stato più semplice farmi capire.

Se non trovi i componenti su fritzing. fai alle vecchia maniera:

Carta e penna fai lo schema poi fai una foto e la posti!!!!!

quindi mi vuoi dire che non è chiaro il problema?Intanto ti ringrazio per avermi risposto.

i due schemi di collegamento se possono servire

RxTx433.zip (15.6 KB)

Serve altro?

Probabilmente si tratta di aver posposto qualche routine, ma non riesco a capire

:frowning:

:confused: qualcuno in privato mi ha detto che per controllare bisogna "rifare" tutto ex novo. Ed io gli ho risposto che su questo forum ci sono delle persone preparatissime che non hanno bisogno di fare questo in quanto "leggono" i listati. Ditemi che non è vero!

Ci sono due cose che nessun uomo ammetterà mai di non saper fare bene: guidare e fare l'amore. :grin:

TOC TOC chi c'è? :o

NON sono entrato nel merito del "funzionamento" del tuo programma, ma guardandolo ho visto un uso (... ed abuso) della classe String ...

... ora vorrei rammentarti che sei su una piccola MCU che ha in tutto 2KB di SRAM, dove non c'è un sistema operativo e dove non esiste un "garbage collector".

La classe String usa l'allocazione dinamica e un continuo cambiare dimensioni alle stringhe, modificarle ecc. ... porta facilmente alla frammentazione della memoria e ... all' "impazzimento" del programma ... e del programmatore (... che non riesce a capire perché il programma non va).

Noi qui sconsigliamo sempre l'uso di detta classe a favore delle stringhe classiche del C (... array di char), facilmente manipolabili con le funzioni che trovi in <string.h> che fa parte di AVR libc (... sempre inclusa dal IDE).

Quindi ... io ricomincerai da capo scrivendo in modo ... più consono ad una piccola MCU, come è l'ATmega328p e poi farei un attento debug di cosa si trasmette e di cosa in realtà si riceve ... :wink:

Buon lavoro,

Guglielmo

Immensamente grazie per la risposta.
Ne sono soddisfatto pur non avendo risolto il problema. :roll_eyes:

Se ti va di riscrivere il programma come suggerito, e se hai ancora problemi, poi postalo qui che proviamo a darci un'occhiata :wink:

Guglielmo

proverò di farle dal "basso" della mia esperienza... grazie, ci sentiamo!
:frowning:

... fai un passo alla volta ... non cercare di scrivere tutto il programma tutto assieme ... prima una funzione, la collaudi bene e se va, passi alla successiva e così via.

Vedrai che arrivi alla fine con un bel programma funzionate e senza grossi problemi :wink:

Buon lavoro ! :slight_smile:

Guglielmo

Guglielmo, i passaggi che mi hai elencato , sono stati fatti minuziosamente e dato che non sono un genio della programmazione come precisato nella mia presentazione e vengo dal basic(altro mondo) e oltremodo da un decennio non programmo in VB, ho faticato non poco per mettere assieme i vari listati o sketch che dir si voglia, per questo avevo chiesto aiuto, ma capisco la difficoltà da parte di terzi a mettere mano su uno sgarbugliamento come quello che ho combinato io dovuto principalmente alle varie prove effettuate, difatti ho pure detto precedentemente che ha bisogno di una pulizia in quanto c'è un uso di variabili non utilizzate ecc. ecc.. Però la rabbia più grande è che teoricamente funziona perfettamente (visionando i dati dalla finestra seriale) ma il motorìino della macchinina riconosce solo l'ultimo valore ignorando gli altri. Farò un altro tentativo e vedrò di sistemare la cosa. Ti continuo a ringraziare per il tuo intervento, almeno tu mi hai risposto, calorosamente a rileggerci

Francesco